реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос по С++
VladimirYU
сообщение Jan 12 2011, 05:44
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Вопрос к знатокам. Компилятор IARAVR v4.12. Столкнулся со следующим эффектом,в случае объявления объекта глобальным статическим все нормально работает

Tobj obj;

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

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

Tobj* obj = new Tobj;

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

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

Tobj* obj ;

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

..........
}


Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 12 2011, 06:49
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

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

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


Всегда будет работать.
Go to the top of the page
 
+Quote Post
neiver
сообщение Jan 12 2011, 07:05
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



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

Что-то типа int *a = new int[10]; работает?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 12 2011, 07:17
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


Автор хочет, чтобы это работало до main(). A это невозможно. Внутри любой функции - пожалуйста.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 12 2011, 08:05
Сообщение #5


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



А поместить в lowlevelinit не спасёт (не проверял)?


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
segment
сообщение Jan 12 2011, 08:07
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



Дык static модификатор должен помочь
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 12 2011, 09:07
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Сега @ Jan 12 2011, 15:07) *
Дык static модификатор должен помочь


static здесь каким боком?
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Jan 12 2011, 10:37
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



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

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


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

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

Поясните, почему, хочется глобальным иметь указатель на объект, а конструктор вызывать где надо и удалять объект (по необходимости ) где надо.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 12 2011, 12:19
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


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

Код
Tobj* obj = new Tobj;

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


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

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

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

int main()
{
  obj = new Tobj; // создание объекта (вызов конструктора, в данном случае)
                          // и передача адреса созданного обьекта указателю с глобальной видимостью
..........
}
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Jan 13 2011, 02:26
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(sergeeff @ Jan 12 2011, 18:19) *
Вы же написали:

Код
Tobj* obj = new Tobj;

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


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

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

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

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


Последний вариантом я всегда и пользовался, см. предыдущий мой пост. Не работает он в конкретном случае и я не могу понять почему, игра с "кучей" и стеками результатов не дала. В map файле ничего криминального не увидел, предупреждений ни кампилятор, ни линкер не выдает. Работает только глобальный статически созданный объект. А первое Ваше утверждение весьма спорно.
в глобальной области строка
Tobj* obj = new Tobj;
включает в себя и объявление и создание объекта.
Go to the top of the page
 
+Quote Post
forever failure
сообщение Jan 13 2011, 03:17
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Цитата(sergeeff @ Jan 12 2011, 20:19) *
Именно это в таком виде не может работать.

В плоском С не может, в С++ может, должно и работает именно в таком виде.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 13 2011, 04:33
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


Век живи - век учись. Действительно работает, прошу прощения за дезу.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 05:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01457 секунд с 7
ELECTRONIX ©2004-2016