Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по С++
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
VladimirYU
Вопрос к знатокам. Компилятор IARAVR v4.12. Столкнулся со следующим эффектом,в случае объявления объекта глобальным статическим все нормально работает

Tobj obj;

int main()
{
..........
}

А если объявить его так:

Tobj* obj = new Tobj;

int main()
{
..........
}

не работает. Естественно методы в этом случае вызываются через указатели.
Игра настройками HEAP, CSTACK, RCTACK ни к чему не приводит. Впервые на такое налетел.
Подскажите где я туплю. В map. файлах все практически одинаково, предупреждений нет.
Нужно по структуре программы работать через указатели.
По смыслу примерно так (конструктор вызывается в теле:

Tobj* obj ;

int main()
{
..........
obj = new Tobj;

..........
}


sergeeff
А кто мешает сделать так:

Код
Tobj Obj;
Tobj* obj = &Obj;

int main()
{
..........
}


Всегда будет работать.
neiver
А что именно не работает? Память не выделяется? Конструктор не вызывается? Указатель на неверный адрес указывает?

Что-то типа int *a = new int[10]; работает?
sergeeff
Цитата(neiver @ Jan 12 2011, 14:05) *
Что-то типа int *a = new int[10]; работает?


Автор хочет, чтобы это работало до main(). A это невозможно. Внутри любой функции - пожалуйста.
mdmitry
А поместить в lowlevelinit не спасёт (не проверял)?
segment
Дык static модификатор должен помочь
sergeeff
Цитата(Сега @ Jan 12 2011, 15:07) *
Дык static модификатор должен помочь


static здесь каким боком?
VladimirYU
Цитата(neiver @ Jan 12 2011, 13:05) *
А что именно не работает? Память не выделяется? Конструктор не вызывается? Указатель на неверный адрес указывает?

Что-то типа int *a = new int[10]; работает?


Судя по всему не вызывается коструктор. Так ведь в куче проектах работает именно третий вариант, указатель на объект глобальный а требуемый конструктор, определяемый например по опросу ключа, вызывается в main. Если я правильно понимаю, что если бы были проблемы с недостатком памяти не работал бы и глобальный объект.

Цитата(sergeeff @ Jan 12 2011, 13:17) *
Автор хочет, чтобы это работало до main(). A это невозможно. Внутри любой функции - пожалуйста.

Поясните, почему, хочется глобальным иметь указатель на объект, а конструктор вызывать где надо и удалять объект (по необходимости ) где надо.
sergeeff
Цитата(VladimirYU @ Jan 12 2011, 17:37) *
Поясните, почему, хочется глобальным иметь указатель на объект, а конструктор вызывать где надо и удалять объект (по необходимости ) где надо.


Вы же написали:

Код
Tobj* obj = new Tobj;

int main()
{
..........
}


Именно это в таком виде не может работать.

Вы путаете объявление объекта и его создание.

Код
Tobj* obj;  // объявление указателя на объект, указателя с глобальной вивдимостью

int main()
{
  obj = new Tobj; // создание объекта (вызов конструктора, в данном случае)
                          // и передача адреса созданного обьекта указателю с глобальной видимостью
..........
}
VladimirYU
Цитата(sergeeff @ Jan 12 2011, 18:19) *
Вы же написали:

Код
Tobj* obj = new Tobj;

int main()
{
..........
}


Именно это в таком виде не может работать.

Вы путаете объявление объекта и его создание.

Код
Tobj* obj;  // объявление указателя на объект, указателя с глобальной вивдимостью

int main()
{
  obj = new Tobj; // создание объекта (вызов конструктора, в данном случае)
                          // и передача адреса созданного обьекта указателю с глобальной видимостью
..........
}


Последний вариантом я всегда и пользовался, см. предыдущий мой пост. Не работает он в конкретном случае и я не могу понять почему, игра с "кучей" и стеками результатов не дала. В map файле ничего криминального не увидел, предупреждений ни кампилятор, ни линкер не выдает. Работает только глобальный статически созданный объект. А первое Ваше утверждение весьма спорно.
в глобальной области строка
Tobj* obj = new Tobj;
включает в себя и объявление и создание объекта.
forever failure
Цитата(sergeeff @ Jan 12 2011, 20:19) *
Именно это в таком виде не может работать.

В плоском С не может, в С++ может, должно и работает именно в таком виде.
sergeeff
Цитата(forever failure @ Jan 13 2011, 10:17) *
В плоском С не может, в С++ может, должно и работает именно в таком виде.


Век живи - век учись. Действительно работает, прошу прощения за дезу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.