|
WinAVR(Ну или C) + Массивы в структуре, Массивы в структуре. |
|
|
|
Jul 30 2007, 11:33
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
При таком определении компилятор ругается: Код typedef struct { const char Engl[]; const char Russ[]; } LangStruct PROGMEM; Мол переменной длинны, массив не в конце. Собственно вопрос, а возможно ли вообще в С размещать таким образом два массива?
|
|
|
|
|
 |
Ответов
|
Jul 30 2007, 12:19
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Цитата ИМХО это очччень не хорошо, если это на самом деле работает. Ни когда не известно, какого размера структура Ну почему не известно, длинна всех типов в структуре, плюс длинна массива, полученная при инициализации, так получается. Кстати именно поэтому видимо и требование такое, что бы массив был в конце структуры, вот два и не получится разместить  . Код В определении типа не нужно указывать атрибутов (PROGMEM), они указываются при обьявлении переменных этого типа : Ну почему же не нужно, смотря для чего, в данном случае надо что бы всё было во флеш, зачем же тогда по сто раз PROGMEM писать.
Сообщение отредактировал Quasar - Jul 30 2007, 12:20
|
|
|
|
|
Jul 30 2007, 12:51
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(Quasar @ Jul 30 2007, 20:19)  Ну почему не известно, длинна всех типов в структуре, плюс длинна массива, полученная при инициализации, так получается. Кстати именно поэтому видимо и требование такое, что бы массив был в конце структуры, вот два и не получится разместить  . Хм... Я, конечно, не знаю, как Вы там в программе работаете с этими структурами, но как, допустим, определить массив Ваших структур??? И как, допустим, в цикле их перебирать если все структуры разной длины??? Кстати, можете показать код инициализации члена Text[] структуры Menu_Item? Что то у меня не получилось
--------------------
|
|
|
|
|
Jul 30 2007, 14:21
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(prottoss @ Jul 30 2007, 14:51)  Хм... Я, конечно, не знаю, как Вы там в программе работаете с этими структурами, но Обычно в таких случаях либо концевой массив содержит нечто "самоограниченное" (null-terminated string, массив указателей с NULL как ограничителем), либо его размер находится в самой структуре. Например, эта структура - заготовка для кольцевого буфера, делаем malloc( sizeof(этой_структуры) + buffer_len) и присваиваем нужному полю buffer_len. Цитата как, допустим, определить массив Ваших структур??? И как, допустим, в цикле их перебирать если все структуры разной длины??? А никак. Массив [] - это incomplete array, структура с ним в конце - incomplete type, по стандарту из них массивы не собираются. Естественно, массивы из указателей на них - запросто и в цикле перебирается :-) Цитата Кстати, можете показать код инициализации члена Text[] структуры Menu_Item? Что то у меня не получилось  Без проблем. Код typedef struct { int i; char c[]; } s;
s s1 = { 1, "abc" }; s s2 = { 1, "qwerty" };
struct { int i; int ii[]; } ss = { 1, {1, 2, 3} }; avr-gcc -S CODE .file "f.c" .arch avr2 __SREG__ = 0x3f __SP_H__ = 0x3e __SP_L__ = 0x3d __tmp_reg__ = 0 __zero_reg__ = 1 .global __do_copy_data .global __do_clear_bss .global s1 .data .type s1, @object .size s1, 2 s1: .word 1 .string "abc" .global s2 .type s2, @object .size s2, 2 s2: .word 1 .string "qwerty" .global ss .type ss, @object .size ss, 2 ss: .word 1 .word 1 .word 2 .word 3 /* File "f.c": code 0 = 0x0000 ( 0), prologues 0, epilogues 0 */
Кстати, до введения этого в стандарт выкручивались, задавая размер 1. В некоторых компиляторах можно было задать 0, чтобы sizeof от типа не включал сам массив, т.е. чтобы в malloc можно было писать не неестественное malloc( sizeof(ring_buf_t) + buf_size - 1); // один элемент есть в структуре а нормальное malloc( sizeof(ring_buf_t) + buf_size); Но проблемой этих выкрутасов было в том числе то, что компилятор не запрещал создать массив таких структур. А теперь может выдать ошибку.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
Quasar WinAVR(Ну или C) + Массивы в структуре Jul 30 2007, 11:33 prottoss Цитата(Quasar @ Jul 30 2007, 19:33) При т... Jul 30 2007, 11:43 Quasar Цитата(prottoss @ Jul 30 2007, 15:43) Нет... Jul 30 2007, 11:48 prottoss Можно сделать немного по другому, если Вы не знает... Jul 30 2007, 11:53 Quasar Цитата(prottoss @ Jul 30 2007, 15:53) Мож... Jul 30 2007, 12:00  prottoss Цитата(Quasar @ Jul 30 2007, 20:00) А ни ... Jul 30 2007, 12:04 umup В определении типа не нужно указывать атрибутов (P... Jul 30 2007, 12:06  Quasar Цитата(prottoss @ Jul 30 2007, 16:51) И к... Jul 30 2007, 13:03     Quasar Цитата(zltigo @ Jul 30 2007, 21:04) И не... Jul 30 2007, 18:53     singlskv Цитата(zltigo @ Jul 30 2007, 21:04) И не... Jul 30 2007, 19:38     Сергей Борщ Цитата(zltigo @ Jul 30 2007, 20:04) И не... Jul 31 2007, 08:39      zltigo Цитата(Сергей Борщ @ Jul 31 2007, 11:39) ... Jul 31 2007, 13:52       ReAl Цитата(zltigo @ Jul 31 2007, 15:52) Речь ... Jul 31 2007, 15:11        Maddy Цитата(ReAl @ Jul 31 2007, 19:11) Мммм...... Jul 31 2007, 20:01         ReAl Цитата(Maddy @ Jul 31 2007, 22:01) Это по... Jul 31 2007, 20:24          Maddy Цитата(ReAl @ Aug 1 2007, 00:24) Что-то я... Aug 1 2007, 09:18  SasaVitebsk Цитата(prottoss @ Jul 30 2007, 15:51) Хм.... Jul 30 2007, 19:01 SasaVitebsk А чего Вы расстраиваетесь. Напишите свою инициализ... Jul 31 2007, 17:25 sensor_ua Цитатавведён размер в начале. К неполным массивам ... Aug 1 2007, 04:55 Kirill Frolov Цитата(Quasar @ Jul 30 2007, 15:33) При т... Aug 7 2007, 00:02
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|