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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> IAR 4.41A & C++
mungo
сообщение Sep 21 2007, 08:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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() работает.
help.gif


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 21 2007, 09:28
Сообщение #2


Бывалый
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
mungo
сообщение Sep 21 2007, 09:52
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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. Интересно, что Вы делаете наладонник ?


Нет, всего лишь кассовик...


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 21 2007, 10:03
Сообщение #4


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(alexander55 @ Sep 21 2007, 13:28) *
М.б.
TMenu *m=new Menu();
или
TMenu *m=new Menu;

или м.б.
TMenu Menu;
TMenu *m=&Menu;

Крутые советы lol.gif lol.gif


mungo Сделайте пошагам. Код вроде нормальный.

А просто динамически какой нибудь массив int[] выделить удается?
Go to the top of the page
 
+Quote Post
mungo
сообщение Sep 21 2007, 10:12
Сообщение #5


Участник
*

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



Цитата(jorikdima @ Sep 21 2007, 13:03) *
Крутые советы lol.gif lol.gif
mungo Сделайте пошагам. Код вроде нормальный.

А просто динамически какой нибудь массив int[] выделить удается?


Да, проверил, и точно - при любых раскладах не работает new.
Код
char *s;
s=new char[10];
delete [] s;

Ситуация та же. Доходит до new и тут же умирает.


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
zhevak
сообщение Sep 21 2007, 10:37
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 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.

Отпишите здесь обязательно, как удалось побороть/не побороть проблемку.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 21 2007, 10:41
Сообщение #7


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(mungo @ Sep 21 2007, 14:12) *
Да, проверил, и точно - при любых раскладах не работает new.
Код
char *s;
s=new char[10];
delete [] s;

Ситуация та же. Доходит до new и тут же умирает.

Может Heap как-то не так настроен.
И все-таки не пойму, зачем в кассовом аппарате завязываться с динамической памятью (просветите, серьезно, очень интересно).
Go to the top of the page
 
+Quote Post
mungo
сообщение Sep 21 2007, 10:58
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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... 07.gif
Начёт HEAP... Думал тоже, но, как я сказал, malloc() работает. Тоже использует. Грешу чисто на системные библиотеки, даже триальный IAR-5 скачал, не помогло... Дур дом какой-то!
Динамическая память нужна везде - если ЖК графический вкинуть, то меню рисовать без объектов очень тоскливо. Кассовые тоже нужны людям, чтоб пользоваться, и когда он достаточно сложен, как у меня, то лучше все-же через меню работать, а не кодами, как по старинке принято.


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
deadman
сообщение Sep 21 2007, 11:13
Сообщение #9


Участник
*

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



А в конструкторе что?
Go to the top of the page
 
+Quote Post
mungo
сообщение Sep 21 2007, 11:18
Сообщение #10


Участник
*

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



Цитата(deadman @ Sep 21 2007, 14:13) *
А в конструкторе что?


Ничего. Были действия, которые по идее должны экран обновлять, но они не выполнялись. Удалил. Не заработало никак.


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
Alexey Bishletov
сообщение Sep 21 2007, 11:38
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 121
Регистрация: 15-08-06
Пользователь №: 19 557



Видимо new и malloc все же различаются в части выделения памяти. Наверное надо искать исходники RT библиотеки и смотреть там. У меня их нет sad.gif, но где-то они есть. Еще один вариант: пошагово зайти внутрь ??operator new и пытаться понять что же там происходит.
Go to the top of the page
 
+Quote Post
mungo
сообщение Sep 21 2007, 11:43
Сообщение #12


Участник
*

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



У меня тоже нету исходников. А пошагово зайти не могу - симулятор не работает, стопорится на запуске кварца, через j-tag тож не фурычит, да и асм я армовый не очень. Я до этого на 51-м семействе сидел.


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
Alechek
сообщение Sep 21 2007, 11:57
Сообщение #13


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Чтобы не стопорился, вызвать функцию до SysInit() или как там еще... Короче в начало main(), для отладки.
Go to the top of the page
 
+Quote Post
mungo
сообщение Sep 21 2007, 12:07
Сообщение #14


Участник
*

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



J-Link запустил с горем пополам. Короче нашел где ступор - когда вызывает new, заходит в malloc, после чего в abort где и находит бесконечный branch сам на себя.


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 21 2007, 12:28
Сообщение #15


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(mungo @ Sep 21 2007, 16:07) *
J-Link запустил с горем пополам. Короче нашел где ступор - когда вызывает new, заходит в malloc, после чего в abort где и находит бесконечный branch сам на себя.

Ну теперь дело за малым прошагать malloc, а затем понять, что надо что-то поменять в icf файле.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:31
Рейтинг@Mail.ru


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