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

 
 
> IAR. Динамический размер структуры. Micro Menu. IAR
demiurg1978
сообщение Dec 14 2014, 07:45
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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 размер структуры зависел от размера текстовой строки?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Dec 14 2014, 07:58
Сообщение #2


Гуру
******

Группа: Модератор 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. В системах меню имена айтемов - обычно всегда константные стринги, а потому никогда не бывает необходимости их куда-то копировать, в том числе и в структуры.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 14 2014, 08:22
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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;"
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Dec 14 2014, 08:31
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 14 2014, 09:59
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(demiurg1978 @ Dec 14 2014, 11:31) *
Error[Pa004]: illegal declaration G:\Work\Projects\ATMEL\IAR\C\MENU_TEMPLATE\menu.h 32

А на нормальных процах, где не __flash, а const, отлично работает.
Получается, строки будут сидеть в ОЗУ. М-да, кривой этот яр для авр. Что простительно, так как авр сам кривой (раздельные адресные пространства для ПЗУ и ОЗУ).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- demiurg1978   IAR. Динамический размер структуры. Micro Menu. IAR   Dec 14 2014, 07:45
|- - demiurg1978   Ксения, благодарю за подсказку! Сделал так: К...   Dec 14 2014, 08:15
|- - Xenia   Цитата(scifi @ Dec 14 2014, 12:59) А на н...   Dec 14 2014, 10:30
|- - 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


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:51
Рейтинг@Mail.ru


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