Пытался изучить нюансы 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».
Просто догадываюсь, но sq_pass_action
, скорее всего, это структура, содержащая элемент с именем colors
, который представляет собой массив структур. Почему бы просто не проверить исходные файлы и файлы заголовков?
Синтаксис инициализирует определенные члены.
Синтаксис инициализирует определенные члены определенными значениями, а все остальные члены - 0
, при необходимости рекурсивно.
Всем спасибо :) Я сам проверил заголовки, но еще не был уверен, так как только учусь этому. Это сильно отличается от того, к чему я привык. Я думаю, что это подтверждено, хотя кто-то (на Reddit) указал на соответствующий фрагмент в sokol_gfx.h, где «цвета» объявлены как массив другого типа, который является структурой. (Я думаю). Я мог бы обновить вопрос позже.
Я посмотрел на проект sokol и обнаружил, что это кроссплатформенная оболочка OpenGL, DirectX и нескольких других графических фреймворков. См. github.com/floooh/sokol/blob/master/sokol_gfx.h, начиная со строки 544. После того, как я просмотрел некоторую документацию, связанную с sg_pass_action, мне напомнили, что необходимо настроить для прохода рендеринга в Вулкан.
Безымянный 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_action
colors
— это массив 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
должен быть массивом — вы не можете инициализировать указатель с помощью списка в фигурных скобках
@MM Отредактировано, как было предложено. Спасибо.
Я думаю, что ваш окончательный анализ в предпоследнем абзаце в целом верен. Конечно, структуры в массиве
colors[]
могут иметь более двух полей, но вы инициализируете только два из них.