AHTOXA 18 5 июня, 2020 Опубликовано 5 июня, 2020 · Жалоба Я бы в таком случае лучше union применил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 5 июня, 2020 Опубликовано 5 июня, 2020 · Жалоба 38 минут назад, dimka76 сказал: только компиляторы на них предупреждения выдают Сказали "а" - говорите "б". Какие именно предупреждения? У меня не выдают. Была какая-то версия гцц недавно, ругалась. Последняя вроде бы успокоилась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 5 июня, 2020 Опубликовано 5 июня, 2020 · Жалоба 13 minutes ago, Сергей Борщ said: Сказали "а" - говорите "б". Какие именно предупреждения? У меня не выдают. Была какая-то версия гцц недавно, ругалась. Последняя вроде бы успокоилась. Вот Visual Studio warning C4200: nonstandard extension used : zero-sized array in struct/union Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array GCC warning: ISO C++ forbids flexible array member 'data' [-Wpedantic] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 5 июня, 2020 Опубликовано 5 июня, 2020 · Жалоба 55 минут назад, dimka76 сказал: Вот Visual Studio Как-то паранойей пахнет. Ну не можешь сгенерить конструктор копирования или оператор присваивания - так и ругайся только тогда, когда этот контструктор или оператор понадобится. Но пока я их не использую - работай. 55 минут назад, dimka76 сказал: GCC, когда работает с CPP, что-то тоже подобное выдает Выдавал, в какой-то одной недавней версии. Не разбирался глубоко. До этой версии и после нее не выдает. Или я уже что-то путаю на ночь глядя. Во всяком случае версией GNU Tools for Arm Embedded Processors 9-2019-q4-major мои исходники с такими конструкциями собираются без ругани... Но сравнительно недавно я подобную ругань видел, помню точно,. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 5 июня, 2020 Опубликовано 5 июня, 2020 · Жалоба Зачем все эти сложности с компиляторами? если можно просто написать (для struct T *p): (char *)&p[1] - аналог массива нулевой длины в конце структуры. Я называю такое - "запредельный указатель". Использую широко. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба 3 hours ago, dimka76 said: Мне тоже такие описания нравятся, только компиляторы на них предупреждения выдают ((( Это зависит от того какие буквы писать. Мне не выдают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба 7 часов назад, jcxz сказал: Зачем все эти сложности с компиляторами? если можно просто написать (для struct T *p): (char *)&p[1] Зачем эти сложности с явными приведениями типов и взятием адресов, если можно использовать массив неопределнного размера? Сложностей с ним нет никаких, писанины меньше, его поведение четко расписано в Стандарте. Ручные манипуляции с адресами - потенциальный источник ошибок, поэтому во всех книгах призывают не злоупотреблять ими. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба Применительно к моей задаче. Я могу создать структуру, не считая вручную размеры массивов, или нет? На C. static const struct bcrx { uint8_t BigSpace[2]; // 'space' (default, dummy) uint8_t BigComma[11]; // ',' uint8_t BigDot[7]; // '.' uint8_t Big0[25]; // '0' uint8_t Big1[17]; // '1' uint8_t Big2[45]; // '2' uint8_t Big3[46]; // '3' uint8_t Big4[32]; // '4' uint8_t Big5[29]; // '5' uint8_t Big6[38]; // '6' uint8_t Big7[46]; // '7' uint8_t Big8[44]; // '8' uint8_t Big9[38]; // '9' } BigCharIndx = { { // 'space' (default, dummy) bcrx_32, 0 }, { // ',' 39, bcrx_32, bcrx_3_4_25, 3, bcrx_2_6_24, bcrx_3_5_24, bcrx_4_4_24, bcrx_3_4_25, bcrx_2_4_26, bcrx_2_3_27, 0 }, ... }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба 22 минуты назад, Сергей Борщ сказал: Зачем эти сложности с явными приведениями типов и взятием адресов, если можно использовать массив неопределнного размера? Сложностей с ним нет никаких Я же написал: сложности с компиляторами. Так как не все компиляторы такое переваривают. А насчёт "манипуляции с адресами - потенциальный источник ошибок"; так любое программирование - потенциальный источник ошибок, от которых спасает только голова манипулятора А те языки (типа Явы), в которых их создатели постарались максимально уберечь неразумных программистов от таких ошибок, убрав указатели, сильно потеряли в мощности и гибкости. Ибо: или стальной молоток, которым по неосторожности можно и пальцы отбить или пластмассовый, которым и гвоздь не вобьёшь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба 11 часов назад, ViKo сказал: Я могу создать структуру, не считая вручную размеры массивов, или нет? Т.е. вы привели пример, где сами вручную посчитали размеры всех массивов - членов структуры. А хотите сделать все эти массивы безразмерными в описании структуры? Не выйдет. Ранее уже сказали, что массив неопределенной длины допистим лишь в случае, когда он последний член структуры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба Только что, Darth Vader сказал: А хотите сделать все эти массивы безразмерными в описании структуры? Нет, я хочу не этого. Я не хочу считать вручную размеры массивов. Я пока считал, два-три раза ошибся. Когда размер оказывался меньше требуемого, компилятор сообщал, что данные не помещаются в массив. Но обратную ситуацию он же допустит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба 12 часов назад, ViKo сказал: Применительно к моей задаче. Я могу создать структуру, не считая вручную размеры массивов, или нет? На C. А какой смысл в такой структуре? Как выбирать нужный член по коду символа? Куча if-ов? Зачем тогда объединять все эти массивчики в структуры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба 13 часов назад, ViKo сказал: Я могу создать структуру, не считая вручную размеры массивов, или нет? На C. Нужно как-то поменять подход. Например можно, как вы уже делали, определить массивы символов. uint8_t BigCharSpace[] = { // 'space' (default, dummy) bcrx_32, 0 } А дальше определить массив указателей на символы. И получать доступ к символам по указателям. А если есть время, и шрифтов будет много, то лучше написать генератор кода шрифтов. Я так делал. Взял старенький IconEdit.4.3.90 который сохраняет фонт в бинарный файл и этот формат расписан. И написал генератор файлов фонтов прямо в текст на ассемблере со всеми шапками фонта, таблицей длин символов и графическими комментариями символов. Плюс в конце файла, после END, уже все необходимые структуры и описания по работе с фонтом на Си для своей библиотеки. Теперь любая коррекция фонта делается в пару кликов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба 1 час назад, AHTOXA сказал: А какой смысл в такой структуре? Как выбирать нужный член по коду символа? Куча if-ов? Зачем тогда объединять все эти массивчики в структуры? Отдельно имеется массив смещений для каждого массива строк символов из структуры. К адресу структуры прибавляется смещение, так попадаем в массив. А массив смещений упорядочен по коду символов (цифр и др). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 6 июня, 2020 Опубликовано 6 июня, 2020 · Жалоба const uint8_t symbol_1[] = { 0, 1, 2, 3, 4, 5, 6 }; const uint8_t symbol_2[] = { 0, 1, 2, 3, 4 }; const uint8_t symbol_3[] = { 0, 1, 2 }; typedef struct { const uint8_t * const bytes; const uint16_t size; const uint16_t symbol; } symbol_def_t; const symbol_def_t symbol_defs[] = { { symbol_1, sizeof( symbol_1 ), ' ' }, { symbol_2, sizeof( symbol_2 ), '2' }, { symbol_3, sizeof( symbol_3 ), '6' }, { NULL, 0 }, }; static void Foo( char ch ) { const symbol_def_t * sd = symbol_defs; while ( sd->bytes != NULL ) { if ( sd->symbol == ch ) { // ... break; } } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться