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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> WinAVR(Ну или C) + Массивы в структуре, Массивы в структуре.
singlskv
сообщение Jul 30 2007, 19:38
Сообщение #16


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jul 30 2007, 21:04) *
И не может работать в принципе. Все правильно.
Такие структуры используются для наложения на уже сущестующую память.

Эээ...
Ну вобще-то в последних стандартах С, массив 0 длинны в структуре весчь вполне законная
насколько я помню...
Хотя если ткнете мордой в последний стандарт где будет сказанно что это не так, то соглашусь...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 31 2007, 08:39
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #19


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

Группа: Свой
Сообщений: 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
SasaVitebsk
сообщение Jul 31 2007, 17:25
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А чего Вы расстраиваетесь. Напишите свою инициализацию. В одном из полей (к примеру, естественно можно и по другому) структуры введите её длину. И работайте.

При присвоении - определяете изаносите длину. Выделяете память. При удалении освобождаете память указанной длины.
Go to the top of the page
 
+Quote Post
Maddy
сообщение Jul 31 2007, 20:01
Сообщение #21


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



Цитата(ReAl @ Jul 31 2007, 19:11) *
Мммм....
Да. Жаль. А я почти привык, а оно gcc-шное расширение, наверное, надо глянуть.

Гы wink.gif Далеко не gcc ж) Это пол WIN API на этом построено .... первым элементом структуры размер , а результат - в зависимости от него wink.gif Таки IMHO все законно ... Но вариант с двумя элеметами неизвестного размера(на этапе компиляции) непройдет .... И тож законно ...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 31 2007, 20:24
Сообщение #22


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

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



Цитата(Maddy @ Jul 31 2007, 22:01) *
Это пол WIN API на этом построено .... первым элементом структуры размер , а результат - в зависимости от него ;
Что-то я ни разу не видел статической инициализации incomplete array в конце структуры в WinAPI. Особенно учитывая то, что традиция с размером структуры в первом её поле в винАПИ тянется с тех пор, когда этих incomplete хвостов в структурах в стандарте С ещё не было, они в С99 появились, а в Win3.1 уже давно и в полный рост использовалось хранение размера в самой структуре.
Там просто структуры разрастались, позже дописывались поля и размер структуры в первом слове нужен для определения того, что именно программа (скомпилированная, возможно, для позапрошлой версии виндовс АПИ) понимает под данной структурой.
Т.е. версия1
struct foo {
int size;
int moo, kwa;
};
версия 2
struct foo {
int size;
int moo, kwa;
long ia_ia_ia;
};

Так вот чтобы в винде с версией 2 API программе, которая рассчитана на версию 1 винда, записывая это ia_ia_ia не затёрла какие-то переменные - и введён размер в начале. К неполным массивам и статической их инициализации это не имеет никакого отношения. И даже к наложению таких структур на динамически выделенную память.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Aug 1 2007, 04:55
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
введён размер в начале. К неполным массивам и статической их инициализации это не имеет никакого отношения

Думал, что в винде это натянутая совместимость с базами данных - тип PSTRING в Clarion содержал длину в начале, а потом собственно строку. Да и какие-то сортировки/поиски в винде на это таки заточены были.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Maddy
сообщение Aug 1 2007, 09:18
Сообщение #24


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



Цитата(ReAl @ Aug 1 2007, 00:24) *
Что-то я ни разу не видел статической инициализации incomplete array в конце структуры в WinAPI. Особенно учитывая то, что традиция с размером структуры в первом её поле в винАПИ тянется с тех


Мдя чего-то я погорячился sad.gif "Признаю свою вину ....."© Филатов wink.gif
Методом тыка в мсдн нифига не нашел подобного .... Хотя в мозгах отложилося , что во времена 4 борланда (не билдера) оно было .... ну да фиг с ним - все-равно грабли потенциальные ....


Цитата(sensor_ua @ Aug 1 2007, 08:55) *
Думал, что в винде это натянутая совместимость с базами данных - тип PSTRING в Clarion содержал длину в начале, а потом собственно строку. Да и какие-то сортировки/поиски в винде на это таки заточены были.


А это больше на паскаль похоже wink.gif
Go to the top of the page
 
+Quote Post
Kirill Frolov
сообщение Aug 7 2007, 00:02
Сообщение #25


Частый гость
**

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



Цитата(Quasar @ Jul 30 2007, 15:33) *
При таком определении компилятор ругается:
Код
typedef struct {  
    const char  Engl[];
    const char  Russ[];
} LangStruct PROGMEM;

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


Разумеется. А как он (компилятор) узнает смещение Russ относительно начала структуры, а?
Zero length array МОГУТ (а могут и не) РАЗРЕШАТЬСЯ НЕКОТОРЫМИ КОМПИЛЯТОРАМИ, в число
которых входит и GCC (winavr). При том что C99 требует записи без указания размерности, а некоторые
компиляторы позволяют [0].


--------------------
[ZX]
Go to the top of the page
 
+Quote Post

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

 


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


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