Ввод массива в структуре C «переполняется» в последующие поля?

У меня есть следующие типы:

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] внутри этого структурного литерала, не нарушая последующие поля?

Вам также не хватает точки с запятой в конце определения struct Node.

Tom Karzes 11.08.2024 15:45

Задавая подобный вопрос, представьте одну последовательность кода C, которую можно скомпилировать для воспроизведения проблемы без каких-либо изменений или вставок. В данном случае это означает, что не прерывайте код дополнительным текстом («По какой-то причине…»), вставьте именно тот код, который воспроизводит проблему (у вас отсутствует ; после определения struct Node), и включите необходимые директивы включения ( вам нужен #include <stddef.h> или другой заголовок, чтобы получить определение NULL). Это облегчит другим людям возможность проверить проблему и убедиться, что они пишут правильный ответ.

Eric Postpischil 11.08.2024 15:46

Вам не нужен (Node) в инициализаторе — удалите и его.

Jonathan Leffler 11.08.2024 16:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

(vec4) { 0, 0, 1, 1 } — составной литерал, который на самом деле является массивом. Однако вы не можете инициализировать массив с помощью массива (за исключением строковых литералов), так же как вы не можете присвоить массив массиву. Массивы никогда не были первоклассными объектами в C, с которыми можно было бы работать как с чем-то единым; они всегда были совокупностью множества вещей. Кроме того, составные литералы были добавлены в язык поздно.

Грамматика инициализации массива заключается в перечислении начальных значений его элементов в фигурных скобках. Поэтому просто измените .color = (vec4) { 0, 0, 1, 1 }, на .color = { 0, 0, 1, 1 },.

Другие вопросы по теме

Использование ранее установленных полей при инициализации структуры составными литералами
Может ли оптимизирующий компилятор при встраивании функции C разыменовывать указатель большее количество раз, чем явно написано в исходном коде?
IEEE округление с плавающей запятой в C
Является ли рекурсивный вызов main из его собственных параметров (злоупотребление sizeof с помощью VLA) стандартом C99?
Неопределенное поведение при приведении указателей в C99 и MISRA C:2012
Почему индексация 2D-массива с помощью арифметики указателей не аналогична использованию скобок [j], хотя в спецификации указано, что так и должно быть?
Обязательны ли битовые маски для беззнаковых преобразований?
Почему спецификатор «static» генерирует внешнее определение для встроенной функции?
Совместимость указателей функций между одиночным указателем и пустыми списками параметров
Это использование неопределенного поведения va_copy?