Инициализация массива структур в C

Доброе время суток.
Подскажите пожалуйста концепцию. Допустим есть структура:

	typedef struct
	{
		uint32_t id;
		const char* name;
	} spisok_frame;

Нужно инициализировать массив таких структур нулями, кроме тех, что подписаны изначально. Что то вроде:

spisok_frame sf[0x800];

Или любая друга концепция, под условия - весь код должен просто пиинклюден в проект(stm32). поле ID “живое” , а name будет статично в момент сборки и указывать на строки которые должны лежать в .rodata.
name объявлены не все и не идут по порядку( отсутствующие указатели указывают на 0). строки с name должны быть в заголовочном файле а не в теле программы. Как инициализировать массив в теле программы или через extern пофигу.

не совсем понятно чего вы хотите добиться. у вас изначально часть массива spisok_frame sf[0x800]; уже чем то проинциализирована(на стадии компиляции?) и вы хотите остальное “залить” нулями ?

можете как то графически нарисовать что у вас в массиве есть , и чего хотите добиться ?

нет, мне нужно объявить этот массив, где некоторые name из него будут указывать на строки в .rodata остальные будут нулями, по ходу программы name манятся не будут. а id будут активно эксплуатироваться.

хочется в теле программы что то типа

#include "myheader.h"
...
extern spisok_frame sf[0x800];
...

что бы в этом месте все указатели на строки уже были собраны

У меня есть некоторые сомнения…
Простите, если напишу ерунду - но понимаете ли Вы, что запись

spisok_frame sf[0x800];

это не инициализация структуры, а создание массива 2048 таких структур?

На какой плате Вы все это планируете использовать, хватит ли там паямти для такого массива?

Именно так мне и надо, памяти хватает. К этому ещё прибавятся довольно длинные текстовые строки(но вот их хранить в оперативке мне не надо)

что касается до этого

то что мешает взять указатель на массив и просто заполнить его нулями функцией memset ?

spisok_frame sf[0x800];
memset((void *) sf, 0, sizeof(spisok_frame) * 0x800);

Какой-то лютый бред. Если используется слово extern, то значит переменная уже где-то объявлена и никакая инициализация не допускается. Она уже инициализирована (или нет) там, где объявлена.

А поточнее. Некоторые - это какие? Они все будут собраны в начале или где попало разбросаны?

Пока Вы внятно не расскажете о чём речь, ничего Вам сказать нельзя.

Мешает то, что некоторые должны иметь предопределённые на этапе компиляции значения, а не нули.

Да, и раз уж на то пошло, что правильнее добавить в структуру constexpr-конструктор, который всё проинициализирует во время компиляции, чем делать такую жестокую операцию во время исполнения.

А что в ней жестокого?

Я скорее другого опасаюсь - что из-за выравнивания размер массива структур не будет в точности равен размеру единичной структуры, умноженной на число элементов…

согласен.
Но как указать создать подобную запись на момент компиляции в Си?
Допустим мне нужно ,чтобы

sf[10].name = "мой текст";

и “мой текст” был во флеше;

А заголовочный файл теперь в тело программы не надо включать, чтобы он работал?

spisok_frame sf[0x800] = {0,0,0,0,…};
В в чем проблема?

В СТМ32 нет концепции ПРОГМЕМ, там все константы и так лежат во флеше.
Поэтому например так

const char* s10 = "мой текст";
sf[10].name = s10;

то есть перед главным циклом, просто бежать и заполнять массив? или можно както это сделать на момент компиляции?

Вот и я ж про то же. Это очень опасная (ни разу не data-safe) операция.

В ООП есть сильная концепция “инкапсуляции”: всё, что связано с экземплярами класса, должно делаться внутри класса, методами, которые “знают за устройство класса”, а не внешними процедурами.

1 лайк

Можно, но я смогу подсказать только если Вы перестанете игнорировать мои вопросы и смилостивитесь ответить.

из тогочто я понял ТС хочет так :

myheader.h:

#define VASYA   "Vasya"
#define PETYA   "Petya"
#define KOLYA   "Kolya"

mycode.c:

#include "myheader.h"

spisok_frame sf[0x800];

sf[10].name = VASYA   ;
sf[33].name = KOLYA   ;
sf[54].name = PETYA   ;

остальные поля массива - “0”
но не писать это все руками вроде или хрен знает

можно и в момент… только тогда придется все разом инициализировать, по частям нельзя

spisok_frame sf[0x800] = {
 { 1, "text1" },
 { 1, "text1" },
 { 1, "text1" },
 { 1, "text1" },
 { 1, "text1" },
// и так 2048 раз
.....
};

так и хочу, пропустить элементы не получится?

Вы когда отвечаете, цитируйте часть сообщения - чтобы было понятно, на какой пост вы ответили

1 лайк