|
IAR. Динамический размер структуры. Micro Menu. IAR |
|
|
|
Dec 14 2014, 07:45
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
Тут пример Micro Menu. Проект написан для WinAVR (AVR Toolchain). В этом проекте размер структуры зависит от размера текстовой строки. В IAR никак не могу добиться и понять, как мне сделать, чтобы размер структуры зависел от размера текстовой строки. Проект компилируется, только если задать так: Код //======================================================================== typedef struct menu_item { void *Parent; void *Child; void *Next; void *Prev; FuncPtr NumFunc; FuncPtr EnterFunc; FuncPtr MenuFunc; char Text[20]; } menu_item; //======================================================================== Есть ли возможность добиться, чтобы в IAR размер структуры зависел от размера текстовой строки?
|
|
|
|
|
 |
Ответов
|
Dec 14 2014, 07:58
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(demiurg1978 @ Dec 14 2014, 10:45)  char Text[20]; Напишите так: const char* Text; Оригинальный вариант const char Text[]; ей эквивалентен, хотя некоторые компиляторы его не любят. Ваш вариат char Text[20]; в данном случае имеет совершенно иной смысл - это вы засандалили в структуру массив целиком, а в оригинале только указатель на него. P.S. В системах меню имена айтемов - обычно всегда константные стринги, а потому никогда не бывает необходимости их куда-то копировать, в том числе и в структуры.
|
|
|
|
|
Dec 14 2014, 08:22
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Xenia @ Dec 14 2014, 10:58)  Оригинальнй вариант const char Text[]; ей эквивалентен, хотя некоторые компиляторы ее не любят. Нет, совсем не эквивалентен. В стандарте C99 это называется flexible array member. Там не сказано, что будет с таким массивом, если объявить переменную, имеющую тип такой структуры. Поэтому моя версия такова: яр при объявлении переменной игнорирует массив переменной длины и не выделяет для него память, как будто его нет совсем, - то ли поленились реализовать, то ли решили, что стандарт этого не требует (вроде бы так оно и есть). А вот gcc реализовал: выделил память под массив нужной длины и положил туда текст - молодцы, чо. Только в результате получается, что этот код не переносимый. Цитата(demiurg1978 @ Dec 14 2014, 11:15)  Даже программу не пришлось править. С const IAR выдает ошибки. Вот так неправильно: "char __flash *Text;" Вот так правильно: "char *__flash Text;"
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 14 2014, 08:31
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
Цитата(scifi @ Dec 14 2014, 14:22)  Вот так правильно: "char *__flash Text;" Error[Pa004]: illegal declaration G:\Work\Projects\ATMEL\IAR\C\MENU_TEMPLATE\menu.h 32
|
|
|
|
|
Dec 14 2014, 10:30
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(scifi @ Dec 14 2014, 12:59)  А на нормальных процах, где не __flash, а const, отлично работает. Получается, строки будут сидеть в ОЗУ. М-да, кривой этот яр для авр. Что простительно, так как авр сам кривой (раздельные адресные пространства для ПЗУ и ОЗУ). Отчего же кривой.  В данном случае указатель, находящийся внутри структуры, должен указывать на истинный тип стринга. Это не вина указателя в том, что одни програмисты хранят стринги в ОЗУ, а другие в ПЗУ. А если у тех стрингов есть еще какие-то дополнительные атрибуты типа far или huge, то, стало быть, и их придется добавить в тип указателя, иначе его не присвоить. IAR же в этом отношении не кривой, т.к. позволяет по требованию программиста помещать строковые константы во flash или держать их в OЗУ (последний способ по умолчанию). Там на этот счет у комилятора специальная опция имеется. Тем не менее, в программе тип указателя приходится определять явно - добровольно заменять const на __flash компилятор не станет. И для этого есть очень серьезные основания. Ну, а в том, что адресные пространства для ПЗУ и ОЗУ раздельные, виноват не IAR, а Гарвардская архитектура.
|
|
|
|
Сообщений в этой теме
demiurg1978 IAR. Динамический размер структуры. Micro Menu. IAR Dec 14 2014, 07:45 demiurg1978 Ксения, благодарю за подсказку! Сделал так:
К... Dec 14 2014, 08:15     demiurg1978 Цитата(Xenia @ Dec 14 2014, 16:30) Тем не... Dec 14 2014, 10:50      Xenia Цитата(demiurg1978 @ Dec 14 2014, 13:50) ... Dec 14 2014, 11:21      scifi Цитата(demiurg1978 @ Dec 14 2014, 13:50) ... Dec 14 2014, 12:20     scifi Цитата(Xenia @ Dec 14 2014, 13:30) Тем не... Dec 14 2014, 10:59      demiurg1978 Цитата(scifi @ Dec 14 2014, 16:59) ...
Не... Dec 14 2014, 11:32 scifi Чтобы не разбираться, можно просто заменить ... Dec 14 2014, 08:09 Сергей Борщ Иар прекрасно работал с массивами переменной длины... Dec 14 2014, 08:47 demiurg1978 Цитата(Сергей Борщ @ Dec 14 2014, 14:47) ... Dec 14 2014, 08:49 psL Структура меню же не меняется в процессе работы? М... Dec 14 2014, 12:47 demiurg1978 Цитата(psL @ Dec 14 2014, 18:47) ...
Что-... Dec 14 2014, 18:30  psL Цитата(demiurg1978 @ Dec 14 2014, 21:30) ... Dec 14 2014, 20:30 Genadi Zawidowski ЦитатаЧего стоят эти pgm_read_byte, pgm_read_word
... Dec 14 2014, 21:41
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|