|
IAR 4.41A & C++ |
|
|
|
Sep 21 2007, 08:13
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
Имеем простой классический код: Код class TMenu { public: TMenu(); ~TMenu(); int Show(int); private: char menu[7][17]; int x,width,len,ptr; };
TMenu *m=new TMenu(); m->Show(1); delete m; Компилируется отлично, без ошибок. Пишем в камень (AT91SAM7XC256), радуемся красивому зависанию. До оператора new все работает, затем просто виснет проц. Объявление в статике все решает, но держать в памяти много объектов не очень здорово. Писать для каждого нового меню отдельную процедуру, чтобы держать все в стеке тоже не очень - тогда с классами нет необходимости возиться. Думал, что там с heap проблема - никаких. malloc() работает.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
Sep 21 2007, 09:28
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(mungo @ Sep 21 2007, 12:13)  TMenu *m=new TMenu(); М.б. TMenu *m=new Menu(); или TMenu *m=new Menu; или м.б. TMenu Menu; TMenu *m=&Menu; PS. Интересно, что Вы делаете наладонник ?
Сообщение отредактировал alexander55 - Sep 21 2007, 09:36
|
|
|
|
|
Sep 21 2007, 09:52
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
Цитата(alexander55 @ Sep 21 2007, 12:28)  М.б. TMenu *m=new Menu(); или TMenu *m=new Menu;
или м.б. TMenu Menu; TMenu *m=&Menu;
PS. Интересно, что Вы делаете наладонник ? Нет, всего лишь кассовик...
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
Sep 21 2007, 10:12
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
Цитата(jorikdima @ Sep 21 2007, 13:03)  Крутые советы mungo Сделайте пошагам. Код вроде нормальный. А просто динамически какой нибудь массив int[] выделить удается? Да, проверил, и точно - при любых раскладах не работает new. Код char *s; s=new char[10]; delete [] s; Ситуация та же. Доходит до new и тут же умирает.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
Sep 21 2007, 10:37
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(mungo @ Sep 21 2007, 16:12)  Да, проверил, и точно - при любых раскладах не работает new. Код char *s; s=new char[10]; delete [] s; Ситуация та же. Доходит до new и тут же умирает. У меня тоже нет готового ответа, но... как вариант: new -- ведь оператор. А что если его преопределить, т.е. написать реализацияю своего через sizeof и malloc. Отпишите здесь обязательно, как удалось побороть/не побороть проблемку.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Sep 21 2007, 10:41
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(mungo @ Sep 21 2007, 14:12)  Да, проверил, и точно - при любых раскладах не работает new. Код char *s; s=new char[10]; delete [] s; Ситуация та же. Доходит до new и тут же умирает. Может Heap как-то не так настроен. И все-таки не пойму, зачем в кассовом аппарате завязываться с динамической памятью (просветите, серьезно, очень интересно).
|
|
|
|
|
Sep 21 2007, 10:58
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
Код 693 void xxx() 694 { \ ??xxx: \ 00000000 10B5 PUSH {R4,LR} 695 TMenu *m; 696 m=new TMenu(); \ 00000002 8820 MOVS R0,#+136 \ 00000004 ........ _BLF `??operator new`,`??operator new??rT` \ 00000008 0400 MOVS R4,R0 \ 0000000A 02D0 BEQ ??xxx_1 \ 0000000C ........ _BLF ??TMenu,??TMenu??rT \ 00000010 00E0 B ??xxx_2 \ ??xxx_1: \ 00000012 0024 MOVS R4,#+0 697 m->Show(2); \ ??xxx_2: \ 00000014 0221 MOVS R1,#+2 \ 00000016 2000 MOVS R0,R4 \ 00000018 ........ _BLF ??Show,??Show??rT 698 delete m; \ 0000001C 2000 MOVS R0,R4 \ 0000001E ........ _BLF `??delete ~TMenu`,`??delete ~TMenu??rT` 699 /*char *s; 700 s=new char[10]; 701 delete [] s;*/ 702 } \ 00000022 10BC POP {R4} \ 00000024 01BC POP {R0} \ 00000026 0047 BX R0 ;; return Возможно, кому-нибудь листинг скажет, что не так... Как-то побороть невозможно. Куда уходит вызов - абсолютно непонятно. В конструкторе класса только одна инструкция (в листинге) - BX LR... Начёт HEAP... Думал тоже, но, как я сказал, malloc() работает. Тоже использует. Грешу чисто на системные библиотеки, даже триальный IAR-5 скачал, не помогло... Дур дом какой-то! Динамическая память нужна везде - если ЖК графический вкинуть, то меню рисовать без объектов очень тоскливо. Кассовые тоже нужны людям, чтоб пользоваться, и когда он достаточно сложен, как у меня, то лучше все-же через меню работать, а не кодами, как по старинке принято.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
Sep 21 2007, 11:13
|
Участник

Группа: Новичок
Сообщений: 21
Регистрация: 13-09-07
Пользователь №: 30 506

|
А в конструкторе что?
|
|
|
|
|
Sep 21 2007, 11:18
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
Цитата(deadman @ Sep 21 2007, 14:13)  А в конструкторе что? Ничего. Были действия, которые по идее должны экран обновлять, но они не выполнялись. Удалил. Не заработало никак.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
Sep 21 2007, 11:43
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
У меня тоже нету исходников. А пошагово зайти не могу - симулятор не работает, стопорится на запуске кварца, через j-tag тож не фурычит, да и асм я армовый не очень. Я до этого на 51-м семействе сидел.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
Sep 21 2007, 12:07
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
J-Link запустил с горем пополам. Короче нашел где ступор - когда вызывает new, заходит в malloc, после чего в abort где и находит бесконечный branch сам на себя.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|