Структурный массив новичка C / C ++, указывающий на другие элементы массива структуры

Я наткнулся на хитрый трюк, который я начал использовать для записи двоичных файлов в (flash) память на arduino / esp8266, используя библиотеку, опубликованную на одном из форумов esp8266. Я пробовал несколько способов расширить это. Совсем недавно я уменьшал и сжимал свои файлы веб-контента и собирал их с эскизами на моем ESP.
Скрипт, который он выложил первым, использует вывод команды unix xxd -i записать двоичный файл в массив hex. Во второй части используется структура для объединения сведений о файле с указателем на массив, на который можно ссылаться из кода всякий раз, когда сервер получает запрос URI, соответствующий записи в массиве.

То, что я хотел бы сделать, это создать второй массив этих вещей с уже предварительно сжатыми инструментами «по умолчанию», поэтому мне не нужно каждый раз проходить через него и / или изменять мой скрипт, который создает файл заголовка каждый раз, когда я создаю новый эскиз сервера. В основном сжимают и xxd такие вещи, как jquery.js, bootstrap.css и bootstrap.js (или чаще их меньшие аналоги, такие как магистраль или barekit)

В настоящее время, когда файл выгружается в гекс, например:

FLASH_ARRAY(uint8_t, __js__simple_js,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4b, 0x2b,
0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0x53, 0xc8, 0xad, 0xf4, 0xcf, 0xf3,
0xc9, 0x4f, 0x4c, 0xd1, 0xd0, 0xac, 0x4e, 0xcc, 0x49, 0x2d, 0x2a, 0xd1,
0x50, 0x0a, 0xc9, 0xc8, 0x2c, 0x56, 0x00, 0xa2, 0xc4, 0x3c, 0x85, 0xfc,
0xbc, 0x1c, 0xa0, 0x94, 0x42, 0x6e, 0x6a, 0x71, 0x71, 0x62, 0x7a, 0xaa,
0x92, 0xa6, 0x75, 0x51, 0x6a, 0x49, 0x69, 0x51, 0x9e, 0x42, 0x49, 0x51,
0x69, 0x6a, 0x2d, 0x00, 0x16, 0xa6, 0x25, 0xe5, 0x43, 0x00, 0x00, 0x00);

Существующий код добавил их все вместе с определением структуры:

struct t_websitefiles {
const char* path;
const char* mime;
const unsigned int len;
const char* enc;
const _FLASH_ARRAY<uint8_t>* content;
} files[] = {
{
.path = "/js/simple.js",
.mime = "application/javascript",
.len = 84,
.enc = "gzip",
.content = &__js__simple_js,
},
{
/* details for file2 ...*/
},
{
/* details for file3 ...*/
}
};

Построение массива структур, представляющих различные файлы.

Мои вопросы равносильны вопросам о синтаксисе языка. Можно ли предположить, что я могу использовать идентичную заполненную структуру вместо того, что находится внутри фигурных скобок? Например, если у меня был второй заголовочный файл с моими регулярно используемыми библиотеками, а jquery был сжат в массиве с именем default_files в позиции 3, я мог бы использовать что-то вроде &default_files [3] вместо {/ * определений материалов * /}. Такие как:

struct t_websitefiles {
const char* path;
const char* mime;
const unsigned int len;
const char* enc;
const _FLASH_ARRAY<uint8_t>* content;
} files[] = {
{
.path = "/js/simple.js",
.mime = "application/javascript",
.len = 84,
.enc = "gzip",
.content = &__js__simple_js,
},
&default_files[1],
&default_files[3],
{
.path = "/text/readme.txt",
.mime = "text/text",
.len = 112,
.enc = "",
.content = &__text__readme_txt,
}
};

(Я предполагаю, исходя из того, что я узнал до сих пор & перед ней?)

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

t_websitefiles files[] = { {/*definitions*/},{ /*stuffs*/ } };

Это верно? Любая помощь приветствуется. Иногда трудно найти подробности о синтаксисе для конкретных случаев использования в документации, охватывающей основы. (Я бы просто попробовал, но сейчас мне неудобно перед компилятором, и при этом у меня нет прямого доступа к моей базе кода, но я хочу поработать над этим позже, когда у меня может не быть прямого доступа к сети)

0

Решение

Из того, что я понимаю, вы хотите создать массив структур, который содержит как составные литералы, так и элементы из другого массива, все они определены в информации заголовка.
Я не думаю, что это возможно — или, по крайней мере, не так, как вы предлагаете. Я постараюсь предоставить альтернативу, хотя.

Можно ли предположить, что я могу использовать идентичную заполненную структуру вместо того, что находится внутри фигурных скобок?

Нет — вы смешиваете свои типы. ‘files’ определяется как массив ‘struct t_website’.
Код

struct t_websitefiles files[] = {
...
&default_files[1],
...
}

не будет компилироваться, когда вы смешиваете типы. файлы определяется как массив struct t_websitefile, но &default_files [1] это указатель C делает различие между указателями и не указателями. Они являются отдельными типами.

Очевидный вариант, который я вижу, чтобы делать то, что вы хотите, это использовать указатели. Это позволит вам определить все в информации заголовка.

struct t_websitefiles default_files[] = {
....
}
struct t_websitefiles files[] = {
....
}

// An array of pointers
struct t_websitefiles *files_combined[] = {
&files[0],
&files[1],
&default_files[0],
// Or whatever values you want here
...
}

// Example main, just iterates through the combined list
//  of files
int main(int argc, char* argv[]) {
int i;
int files_combined_len = sizeof(files_combined)/sizeof(struct t_websitefiles);

for (i=0; i<files_combined_len; i++) {
printf("File %s\r\n", files_combined[i]->path);
}

return 0;
}

Надеюсь это поможет.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector