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

 
 
> WinAVR(Ну или C) + Массивы в структуре, Массивы в структуре.
Quasar
сообщение Jul 30 2007, 11:33
Сообщение #1


Местный
***

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



При таком определении компилятор ругается:
Код
typedef struct {  
    const char  Engl[];
    const char  Russ[];
} LangStruct PROGMEM;


Мол переменной длинны, массив не в конце.

Собственно вопрос, а возможно ли вообще в С размещать таким образом два массива?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Quasar
сообщение Jul 30 2007, 12:19
Сообщение #2


Местный
***

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



Цитата
ИМХО это очччень не хорошо, если это на самом деле работает. Ни когда не известно, какого размера структура


Ну почему не известно, длинна всех типов в структуре, плюс длинна массива, полученная при инициализации, так получается. Кстати именно поэтому видимо и требование такое, что бы массив был в конце структуры, вот два и не получится разместить crying.gif .

Код
В определении типа не нужно указывать атрибутов (PROGMEM), они указываются при обьявлении переменных этого типа :


Ну почему же не нужно, смотря для чего, в данном случае надо что бы всё было во флеш, зачем же тогда по сто раз PROGMEM писать. smile.gif

Сообщение отредактировал Quasar - Jul 30 2007, 12:20
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 30 2007, 12:51
Сообщение #3


Гуру
******

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



Цитата(Quasar @ Jul 30 2007, 20:19) *
Ну почему не известно, длинна всех типов в структуре, плюс длинна массива, полученная при инициализации, так получается. Кстати именно поэтому видимо и требование такое, что бы массив был в конце структуры, вот два и не получится разместить crying.gif .
Хм... Я, конечно, не знаю, как Вы там в программе работаете с этими структурами, но как, допустим, определить массив Ваших структур??? И как, допустим, в цикле их перебирать если все структуры разной длины???

Кстати, можете показать код инициализации члена Text[] структуры Menu_Item? Что то у меня не получилось smile.gif


--------------------
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 30 2007, 14:21
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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? Что то у меня не получилось smile.gif

Без проблем.
Код
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);



Но проблемой этих выкрутасов было в том числе то, что компилятор не запрещал создать массив таких структур. А теперь может выдать ошибку.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 30 2007, 14:24
Сообщение #5


Гуру
******

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



Цитата(ReAl @ Jul 30 2007, 22:20) *
[code]typedef struct {
int i;
char c[];
} s;

s s1 = { 1, "abc" };
s s2 = { 1, "qwerty" };
В IAR (по крайней мере в версии 4.10, что у меня) это не работает.



И ИМХО - это правильно (что не работает smile.gif ).


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 30 2007, 17:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(prottoss @ Jul 30 2007, 17:24) *
И ИМХО - это правильно (что не работает smile.gif ).

И не может работать в принципе. Все правильно.
Такие структуры используются для наложения на уже сущестующую память.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 31 2007, 08:39
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zltigo @ Jul 30 2007, 20:04) *
И не может работать в принципе. Все правильно.
Может работать и работает. С позволяет.
Цитата
A structure or union shall not contain a member with incomplete or function type (...), except that the last member of a structure with more than one named member may have incomplete array type; such a structure (and any union containing, possibly recursively, a member that is such a structure) shall not be a member of a structure or an element of an array.
Размер такой структуры определяется как размер всех элементов без массива:
Цитата
As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. With two exceptions, the flexible array member is ignored. First, the size of the structure shall be equal to the offset of the last element of an otherwise identical structure that replaces the flexible array member with an array of unspecified length
А вот в С++ - не работает и не должно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 31 2007, 13:52
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Jul 31 2007, 11:39) *
Может работать и работает. С позволяет. Размер такой структуры определяется как размер всех элементов без массива:А вот в С++ - не работает и не должно.

Речь шла не о получении размера а об ИНИЦИАЛИЗАЦИИ последнего элемента такой структуры. Смотри внимательнее.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 31 2007, 15:11
Сообщение #9


Нечётный пользователь.
******

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



Цитата(zltigo @ Jul 31 2007, 15:52) *
Речь шла не о получении размера а об ИНИЦИАЛИЗАЦИИ последнего элемента такой структуры. Смотри внимательнее.
Мммм....
Да. Жаль. А я почти привык, а оно gcc-шное расширение, наверное, надо глянуть.
Цитата
17 EXAMPLE Assuming that all array members are aligned the same, after the declarations:
struct s { int n; double d[]; };
struct ss { int n; double d[1]; };
the three expressions:
sizeof (struct s)
offsetof(struct s, d)
offsetof(struct ss, d)
have the same value. The structure struct s has a flexible array member d.
...
18 If sizeof (double) is 8, then after the following code is executed:
struct s *s1;
struct s *s2;
s1 = malloc(sizeof (struct s) + 64);
s2 = malloc(sizeof (struct s) + 46);
and assuming that the calls to malloc succeed, the objects pointed to by s1 and s2 behave as if the
identifiers had been declared as:
struct { int n; double d[8]; } *s1;
struct { int n; double d[5]; } *s2;
...
20 The assignment:
*s1 = *s2;
only copies the member n and not any of the array elements. Similarly:
struct s t1 = { 0 }; // valid
struct s t2 = { 2 }; // valid
struct ss tt = { 1, { 4.2 }}; // valid
struct s t3 = { 1, { 4.2 }}; // invalid: there is nothing for the 4.2 to initialize
...

Так что законно только наложение на память. Посыпаю голову пеплом.

Хотя странно и, на мой взгляд - нелогично, почему-то
int ii[] = { 1, 2, 3};
char *tbl[] = { "Hello, ", "world!", 0 };
т.е. "уточнение" размера массива при инициализации для этих incomplete array было возможно всегда, хотя тут тоже не указано выделение памяти числом в скобках и тоже можно сказать "there is nothing to initialize".
А помещение их в хвост структуры эту возможность отбило.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
||- - 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


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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 08:23
Рейтинг@Mail.ru


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