конечно. Сами подумайте. запись типа char aa[] имеет смысл только с одновременнойй инициализацией, вот так: char aa[] = "Hello"; а без инициализации как компилятор поймет. какого размера строку создать?
В Arduino IDE С++11 стоит из коробки (а себе, так я сразу ставлю С++17, там много вкусняшек). Вы же компилируете под старые стандарты С++ в которых такого не было. Не знаю зачем Вы пользуетесь старым стандартом и почему боитесь современных, но да, до 11-го это как следует не работает. Хотя, один хрен, такие фокусы - говнокод.
Судя по сообщению, он всё понимает, просто поставьте ему опцию -std=c++11 (а лучше -std=c++17 или -std=c++1z). Там же много чего реально полезного.
а зачем мне массив указателей? Речь про SizeOf() и невозможности его применений к объекту через указатель на него.
Не понял. Ты чего написал? Т.е. ты считаешь, что нельзя сделать структуры с массивом переменной длины или что? Ну, я показал тебе как это делается. Что-то не так? Там был массив переменной длинны. Ну, да указателей. Ты хочешь, чтобы я для тебя char* на uint8_t заменил в примере? А сам? Никак? Массив переменной длинны он и есть массив переменной длинны, хоть указателей, хоть чисел. И то и другое можно делать. Или я что-то не так понял?
вот так работает Код (C++): #include <stdio.h> #include <stdlib.h> #include <string.h> struct TMenu { char arrsize; char arr[12]; }; TMenu Menu1 = { sizeof(Menu1.arr),"DZIGURDA" }; int main() { printf("%s\n",Menu1.arr); printf("%d\n",Menu1.arrsize); }
кстати заметил прикольную хрень - если в структуре эта первая переменная будет не чар, а инт - то sizeof(Menu1) становится кратным 4. а если чар - то какой угодно может быть
А в том посте по "нельзя сделать" ты про sizeof ничего не писал. Давай ты приведёшь более развёрнутый пример чего хочешь, а то я не понимаю, что тут за переменные и опять тебе чёнить не то покажу. Опиши целиком, а я посмотрю.
есть такие данные: Код (C++): static const uint8_t image_data_Cyrillic_Pixel_0xff[] = { 0xe0, 0xe0, 0x00, 0xe0, 0xe0, 0xe0, 0x00, 0x1c, 0x1f, 0x02, 0x1f, 0x1f, 0x1f, 0x00 }; static const ImageChar_t Cyrillic_Pixel_0xff = { image_data_Cyrillic_Pixel_0xff, 7, 14}; Доступ к ним через поля структуры: Код (C++): typedef struct { const uint8_t* data; uint8_t width; uint8_t count; } ImageChar_t; Здесь пелись дифирамбы о sizeof(). Так вот вопрос: как через sizeof() получить количество элементов в массиве, чтобы ими не занимать память. В принципе, можно обойтись и вообще одним массивом данных: Код (C++): static const uint8_t image_data_Cyrillic_Pixel_0xff[] = { 0x07, // <- данные о ширине 0xe0, 0xe0, 0x00, 0xe0, 0xe0, 0xe0, 0x00, 0x1c, 0x1f, 0x02, 0x1f, 0x1f, 0x1f, 0x00 }; Но что тогда делать, если эти данные упаковать в ещё один массив с целью доступа к ним по индексу? Код (C++): typedef struct { uint8_t code; const ImageChar_t* image; } Char_t; static const Char_t Cyrillic_Pixel_array[] = { #if (0x0 == 0x0) // character: 'я' {0xff, &image_data_Cyrillic_Pixel_0xff}, #else // character: 'я' == '' {0xff, &image_data_Cyrillic_Pixel_0x}, #endif /* {...} */
Ну, дорогой, ты хочешь странного - понаставил указателей (ImageChar_t* image, берёшь от них sizeof и хочешь, чтобы он тебе размер массива выдал? sizeof выдаёт размер того, что ты ему подсунул. Подсунул указатель, значит размер указателя. А уж на что он у тебя указывает - это sizeof'a не касается.
а я вот не согласен! не должно быть такого, что стоящий в конце структуры массив может быть неопределенного размера. Поэтому мой компилятор прав когда на это ругается, а если какой-то не ругается - то мне кажется что это какой-то баг, который может привести к проблемам.
Так Вы правы. Я же говорил = говнокод. Основан он на небольшой дыре в стандарте, которая появилась не так давно и скоро её закроют Так-то, на самом деле, Вы правы, в стандарте прямо сказано: "Non-static data members shall not have incomplete types". А маиссив без размера - это incomplete type и есть.
Хотел тут для attiny841 (лежит парочка - выкинуть просто жалко) написать код, который тупо читает данные из флеш по адресу ячейки. Вылез огромный хе... Почему? Почему оно работатет только через pgm_read_word() ПОЧЕМУ? На attiny 0-ой и 1-ой серии с доступом по адресу всё без проблем. На MSP430 тоже.