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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Инициализация структуры. Что не так?, Обращаюсь к коллективному разуму
SasaVitebsk
сообщение Sep 7 2012, 11:49
Сообщение #16


Гуру
******

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



Переписываю, хотя честно говоря - непонятно. Почему он не может мне в конце просто перечислить указатели как я хочу.
Почему QT это делает без проблем. В смысле MinGW как я понимаю.
Пока только радиобоксы... Причём и сам обработчик придся переписать. Создать некоторые масивы указателей.
Потом чекбоксы, списки и многое другое. В целом прибавил себе 3-4 дня работы ... wacko.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 7 2012, 11:56
Сообщение #17


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



А вы в QT проект с++ или си делали?
Если си, то попробуйте ключики, о которых я говорил.
А так действительно ситуация немного странная с кейлом и видимо с иаром.
Т.к. gcc может это прожевать при определённых условиях.

PS:
На одном из форумов была цитата раздела 6.7.2.1 си-стандарта:
A structure type containing a flexible array member is an incomplete type that cannot be completed

Получается ничего странного нет - это видимо gnu расширение языка си.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 7 2012, 12:16
Сообщение #18


Гуру
******

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



Цитата(demiurg_spb @ Sep 7 2012, 12:09) *
Безотносительно даже стандарта Си...

Кстати, вот что по этому поводу говорит стандарт C99:
Цитата
If an array of unknown size is initialized, its size is determined by the largest indexed element with an explicit initializer. At the end of its initializer list, the array no longer has incomplete type.

Так что по стандарту всё должно работать.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 7 2012, 12:46
Сообщение #19


Гуру
******

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



Цитата(demiurg_spb @ Sep 7 2012, 14:56) *
А вы в QT проект с++ или си делали?

Все файлы, которые я планировал переносить - чистый си.
Перед этим я так делал с цветным дисплеем - всё прокатило и мне понравилось ... Кстати посмотрю как я там делал.
Помню, что где-то я уже такое делал ... Только не помню как. Но точно помню, что не ключами ...
Толи задавал минимальный размер, а инициализировал реальным значением ... Хоть убей не помню. (
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2012, 12:51
Сообщение #20


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(demiurg_spb @ Sep 7 2012, 15:56) *
Получается ничего странного нет - это видимо gnu расширение языка си.

Так и есть.
GCC позволяет включать в структуры открытый массив, если он размещен последним.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 7 2012, 14:03
Сообщение #21


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

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



Цитата(MrYuran @ Sep 7 2012, 15:51) *
GCC позволяет включать в структуры открытый массив, если он размещен последним.

Это (иметь такой массив в структуре) позволяет C99.
Цитата
6.7.2.1 Structure and union specifiers
...
Semantics
...
16 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. Second, when a . (or ->) operator has a left operand that is (a pointer to) a structure with a flexible array member and the right operand names that member, it behaves as if that member were replaced with the longest array (with the same element type) that would not make the structure larger than the object being accessed; the offset of the array shall remain that of the flexible array member, even if this would differ from that of the replacement array. If this array would have no elements, it behaves as if it had one element but the behavior is undefined if any attempt is made to access that element or to generate a pointer one past it.
Просто инициализация такого массива не входит в планы :-)

Зато позволяется такое (можете пробовать с -std=c99 --pedantic):
Код
#include <stdlib.h>

typedef struct {
    int head, tail, size;
    int data[];
} fifo_t;

fifo_t *create_fifo(int size)
{
    fifo_t *pf = (fifo_t*)malloc(sizeof(fifo_t)+size*sizeof(int));
    if (pf) {
        pf->head = pf->tail = 0;
        pf->size = size;
    }
    return pf;
}
...
    // И затем так
    pf->data[head++] = a;
    // Что абсолютно корректно, так как
    // it behaves as if that member were replaced with the longest array
    // that would not make the structure larger than the object being accessed

Думаю, для этого в стандарт и было введено. До C99 извращались так:
Код
typedef struct {
    int head, tail, size;
    int data[1];
} fifo_t;

    fifo_t *pf = (fifo_t*)malloc(sizeof(fifo_t)+(size-1)*sizeof(int));
Некоторые компиляторы в качестве расширения позволяли
Код
typedef struct {
    int head, tail, size;
    int data[0];
} fifo_t;


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2012, 14:10
Сообщение #22


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ReAl @ Sep 7 2012, 18:03) *
Это (иметь такой массив в структуре) позволяет C99.

А в ИАРе какой стандарт по умолчанию?
Может, просто ключик повернуть?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 7 2012, 14:11
Сообщение #23


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

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



Цитата(MrYuran @ Sep 7 2012, 17:10) *
А в ИАРе какой стандарт по умолчанию?
Может, просто ключик повернуть?
Так инициализация такого массива (и, фактически, изменение sizeof структуры, смена типа объекта) не входит в C99.
Это уже gnu99


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

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

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 06:28
Рейтинг@Mail.ru


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