Не могу понять этот синтаксис C. Назначенная инициализация массива структур?

Пытался изучить нюансы C, хотя дела у меня шли хорошо, пока не нашел вот это:

#define SOKOL_IMPL
#define SOKOL_GLES3
#include "sokol_gfx.h"
#include "sokol_log.h"
#include "emsc.h"

static struct {
    sg_pipeline pip;
    sg_bindings bind;
    sg_pass_action pass_action;
} state = {
    .pass_action.colors[0] = { .load_action = SG_LOADACTION_CLEAR, .clear_value = { 0.0f, 0.0f, 0.0f, 1.0f } }
};

Это пример кода из библиотеки Сокол: https://github.com/floooh/sokol-samples/blob/master/html5/triangle-emsc.c

Я понимаю, что первое объявление структуры также объявляет переменную «состояние», тогда я думаю, что эта новая переменная назначается всему, что находится после «=", с использованием «назначенной инициализации». Чего я не понимаю, так это что такое .pass_action.colors[0].

Я думал, что «цвета» — это поле внутри pass_action, которое, в свою очередь, делает действие pass структурой, а цвета должны быть массивом. Но при назначении «цветов» снова используются назначенные идиоматические инициалы для структур.

Итак, возможно, .colors[0] — это поле .pass_action, а также массив структур, которые имеют два поля: «load_action» и «clear_value». Это верно? Мне нужно быть уверенным, прежде чем добиться прогресса.

«Назначенные инициализации»: https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

ОБНОВЛЕНИЕ: здесь объявлено sg_pass_action, а тип «colors» определен несколькими строками выше https://github.com/floooh/sokol/blob/6f8121e6aa523b0c0a3e9d7212073bab9a885e15/sokol_gfx.h#L2542

На это мне указали в другом месте на Reddit, и я думаю, что все проясняется. «colors» — это массив типа «sg_color_attachment_action», который сам по себе является структурой. И размера «SG_MAX_COLOR_ATTACHMENTS».

Я думаю, что ваш окончательный анализ в предпоследнем абзаце в целом верен. Конечно, структуры в массиве colors[] могут иметь более двух полей, но вы инициализируете только два из них.

pmacfarlane 20.07.2024 19:51

Просто догадываюсь, но sq_pass_action, скорее всего, это структура, содержащая элемент с именем colors, который представляет собой массив структур. Почему бы просто не проверить исходные файлы и файлы заголовков?

Some programmer dude 20.07.2024 19:51

Синтаксис инициализирует определенные члены.

Weather Vane 20.07.2024 19:54

Синтаксис инициализирует определенные члены определенными значениями, а все остальные члены - 0, при необходимости рекурсивно.

pmg 20.07.2024 20:09

Всем спасибо :) Я сам проверил заголовки, но еще не был уверен, так как только учусь этому. Это сильно отличается от того, к чему я привык. Я думаю, что это подтверждено, хотя кто-то (на Reddit) указал на соответствующий фрагмент в sokol_gfx.h, где «цвета» объявлены как массив другого типа, который является структурой. (Я думаю). Я мог бы обновить вопрос позже.

Matheus de Moraes Peixoto 20.07.2024 20:26

Я посмотрел на проект sokol и обнаружил, что это кроссплатформенная оболочка OpenGL, DirectX и нескольких других графических фреймворков. См. github.com/floooh/sokol/blob/master/sokol_gfx.h, начиная со строки 544. После того, как я просмотрел некоторую документацию, связанную с sg_pass_action, мне напомнили, что необходимо настроить для прохода рендеринга в Вулкан.

thurizas 20.07.2024 21:07
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
6
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Безымянный struct состоит из трёх членов: pip, bind и pass_action. sg_pipeline и sg_bindings, вероятно, typdef имеют struct, но мы не можем сказать, но мы знаем, что sg_pass_action есть.

Соответствующая переменная state неявно инициализирует pip и bind нулем, а член pass_action члена colors[0] инициализируется составным значением:

{ .load_action = SG_LOADACTION_CLEAR, .clear_value = { 0.0f, 0.0f, 0.0f, 1.0f } }

Члены pass_actioncolors — это массив struct с членами load_action и clear_value.

clear_value — это либо массив, состоящий как минимум из 4 элементов, либо struct как минимум из 4 элементов, возможно, с плавающей запятой.

Что-то вроде этого (где? — необходимая информация, которую мы не можем определить на основе предоставленных данных):

typedef struct {
    struct {
       ? load_action;
       float clear_value[4];
    } colors[?];
} sg_pass_action;

Если вы не пропустили свою программу через препроцессор (например cpp) и не проверили результат.

colors должен быть массивом — вы не можете инициализировать указатель с помощью списка в фигурных скобках
M.M 21.07.2024 02:43

@MM Отредактировано, как было предложено. Спасибо.

Allan Wind 21.07.2024 05:44

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