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

 
 
> 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

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


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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 11:41
Рейтинг@Mail.ru


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