У меня есть следующие типы:
typedef float vec4[4]; // from cglm
typedef struct Node Node;
struct Node {
float expand;
vec4 color;
Node *children;
}
По какой-то причине тип color
поля float[4]
... переполнен? в поля после него. Например, при использовании следующего литерала:
Node test1 = (Node) {
.expand = 1.0f,
.color = (vec4) { 0, 0, 1, 1 },
.children = NULL
};
Компилятор считает, что поля color
и children
должны быть одинарными float
?:
error: initializing 'float' with an expression of incompatible type 'vec4' (aka 'float[4]')
error: initializing 'float' with an expression of incompatible type 'void *'
Как правильно указать значение float[4]
внутри этого структурного литерала, не нарушая последующие поля?
Задавая подобный вопрос, представьте одну последовательность кода C, которую можно скомпилировать для воспроизведения проблемы без каких-либо изменений или вставок. В данном случае это означает, что не прерывайте код дополнительным текстом («По какой-то причине…»), вставьте именно тот код, который воспроизводит проблему (у вас отсутствует ;
после определения struct Node
), и включите необходимые директивы включения ( вам нужен #include <stddef.h>
или другой заголовок, чтобы получить определение NULL
). Это облегчит другим людям возможность проверить проблему и убедиться, что они пишут правильный ответ.
Вам не нужен (Node)
в инициализаторе — удалите и его.
(vec4) { 0, 0, 1, 1 }
— составной литерал, который на самом деле является массивом. Однако вы не можете инициализировать массив с помощью массива (за исключением строковых литералов), так же как вы не можете присвоить массив массиву. Массивы никогда не были первоклассными объектами в C, с которыми можно было бы работать как с чем-то единым; они всегда были совокупностью множества вещей. Кроме того, составные литералы были добавлены в язык поздно.
Грамматика инициализации массива заключается в перечислении начальных значений его элементов в фигурных скобках. Поэтому просто измените .color = (vec4) { 0, 0, 1, 1 },
на .color = { 0, 0, 1, 1 },
.
Вам также не хватает точки с запятой в конце определения
struct Node
.