Спойлер
Код: Выделить всё
//file "HeadersOfHttpResponse.h"
typedef uint16_t HttpStatusCode;//0, 100, 200, 404, 500, ect.
struct HeadersOfHttpResponse {
HttpStatusCode statusCode;
uint8_t amountItemOfHeaders; //количество элементов в массиве
const char * const* headersOfHttpResponse;
};
extern HeadersOfHttpResponse availableHeadersOfHttpResponse[];
Спойлер
Код: Выделить всё
/file "HeadersOfHttpResponse.cpp"
const char HTTP_1_1_200_OK_rn_pstr[] PROGMEM = "HTTP/1.1 200 OK\r\n";
const char HTTP_1_1_500_Internal_Server_Error_rn_pstr[] PROGMEM = "HTTP/1.1 500 Internal Server Error\r\n";
const char ContentType_text_html_rn_pstr[] PROGMEM = "Content-Type: text/html\r\n";
static const char * const headersOfHttpResponse_200_ok[] PROGMEM = {//массив указателей на строки, расположенные в памяти программ
HTTP_1_1_200_OK_rn_pstr,
ContentType_text_html_rn_pstr,
CRLFCRLF_pstr
};
//Массив структур инициализируем сразу!
HeadersOfHttpResponse availableHeadersOfHttpResponse[] = {//доступные HTTP-ответы
//индекс массива 0 (приведён для примера)
{//HTTP-код 200
200, //HTTP-код (StatusCode)
3, //количество строк в массиве
headersOfHttpResponse_200_ok //именованный массив указателей на строки, расположенные в памяти программ
},
//индекс массива 1. Ничем не отличается от нулевого, кроме способа инициализации указателя на массив указателей
{//HTTP-код 200
200, //HTTP-код (StatusCode)
3, //количество строк в массиве
(const char * const[]) {//анонимный массив указателей на строки, расположенные в памяти программ
HTTP_1_1_200_OK_rn_pstr,
ContentType_text_html_rn_pstr,
CRLFCRLF_pstr
}
},
//индекс массива 2
{//HTTP-код 500
500, //HTTP-код (StatusCode)
3, //количество строк в массиве
(const char * const[]){//анонимный массив указателей на строки, расположенные в памяти программ
HTTP_1_1_500_Internal_Server_Error_rn_pstr,
ContentType_text_html_rn_pstr,
CRLFCRLF_pstr
}
},
};
Кратко опишу весь этот "зоопарк".
"availableHeadersOfHttpResponse[]" — глобальный массив доступных в программе HTTP-ответов. Когда сервер решает ответить на запрос, например,
кодом "200", то он ищет соответствие среди элементов данного массива. И отправляет соответствующие строки заголовков, а потом уже запрошенный файл. Строки распологаются в памяти программ.
Собственно, код компилируется без варнингов. Компилятор (AVR Studio v4.19) молчит как партизан.
Чтение строк массива "availableHeadersOfHttpResponse[0].headersOfHttpResponse" происходит корректно.
А вот чтение строк из массивов "availableHeadersOfHttpResponse[1].headersOfHttpResponse" и "availableHeadersOfHttpResponse[2].headersOfHttpResponse" выдаёт
всё что угодно, но только не то что надо! Я так понимаю указатель ".headersOfHttpResponse" указывает куда-то не туда.
Так вот вопрос.
Как обойтись только анонимными массивами, без массивов типа "static const char * const headersOfHttpResponse_200_ok[] PROGMEM"?
Методом научного тыка, перепробовал массу разных комбинаций.


