Перейти к содержанию
    

Массив указателей на массив char

38 минут назад, dimka76 сказал:

только компиляторы на них предупреждения выдают

Сказали "а" - говорите "б". Какие именно предупреждения? У меня не выдают. Была какая-то версия гцц недавно, ругалась. Последняя вроде бы успокоилась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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]

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

55 минут назад, dimka76 сказал:

Вот Visual Studio

Как-то паранойей пахнет. Ну не можешь сгенерить конструктор копирования или оператор присваивания - так и ругайся только тогда, когда этот контструктор или оператор понадобится. Но пока я их не использую - работай.

55 минут назад, dimka76 сказал:

GCC, когда работает с CPP, что-то тоже подобное выдает

Выдавал, в какой-то одной недавней версии. Не разбирался глубоко. До этой версии и после нее не выдает. Или я уже что-то путаю на ночь глядя. Во всяком случае версией GNU Tools for Arm Embedded Processors 9-2019-q4-major мои исходники с такими конструкциями собираются без ругани... Но сравнительно недавно я подобную ругань видел, помню точно,.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем все эти сложности с компиляторами? если можно просто написать (для struct T *p):

(char *)&p[1] - аналог массива нулевой длины в конце структуры.

Я называю такое - "запредельный указатель". Использую широко.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, dimka76 said:

Мне тоже такие описания нравятся, только компиляторы на них предупреждения выдают (((

Это зависит от того какие буквы писать. Мне не выдают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, jcxz сказал:

Зачем все эти сложности с компиляторами? если можно просто написать (для struct T *p):

(char *)&p[1]

Зачем эти сложности с явными приведениями типов и взятием адресов, если можно использовать массив неопределнного размера? Сложностей с ним нет никаких, писанины меньше, его поведение четко расписано в Стандарте. Ручные манипуляции с адресами - потенциальный источник ошибок, поэтому во всех книгах призывают не злоупотреблять ими.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Применительно к моей задаче. Я могу создать структуру, не считая вручную размеры массивов, или нет? На 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
	},
...

};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, Сергей Борщ сказал:

Зачем эти сложности с явными приведениями типов и взятием адресов, если можно использовать массив неопределнного размера? Сложностей с ним нет никаких

Я же написал: сложности с компиляторами. Так как не все компиляторы такое переваривают.

А насчёт "манипуляции с адресами - потенциальный источник ошибок"; так любое программирование - потенциальный источник ошибок, от которых спасает только голова манипулятора :wink:

А те языки (типа Явы), в которых их создатели постарались максимально уберечь неразумных программистов от таких ошибок, убрав указатели, сильно потеряли в мощности и гибкости.

Ибо: или стальной молоток, которым по неосторожности можно и пальцы отбить или пластмассовый, которым и гвоздь не вобьёшь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, ViKo сказал:

Я могу создать структуру, не считая вручную размеры массивов, или нет?

Т.е. вы привели пример, где сами вручную посчитали размеры всех массивов - членов структуры.

А хотите сделать все эти массивы безразмерными в описании структуры? Не выйдет. Ранее уже сказали, что массив неопределенной длины допистим лишь в случае, когда он последний член структуры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Darth Vader сказал:

А хотите сделать все эти массивы безразмерными в описании структуры?

Нет, я хочу не этого. Я не хочу считать вручную размеры массивов. Я пока считал, два-три раза ошибся. Когда размер оказывался меньше требуемого, компилятор сообщал, что данные не помещаются в массив. Но обратную ситуацию он же допустит? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, ViKo сказал:

Применительно к моей задаче. Я могу создать структуру, не считая вручную размеры массивов, или нет? На C.

А какой смысл в такой структуре? Как выбирать нужный член по коду символа? Куча if-ов? Зачем тогда объединять все эти массивчики в структуры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, ViKo сказал:

Я могу создать структуру, не считая вручную размеры массивов, или нет? На C.

Нужно как-то поменять подход.
Например можно, как вы уже делали, определить массивы символов.

uint8_t BigCharSpace[] = {				// 'space' (default, dummy)
	bcrx_32, 0
}

А дальше определить массив указателей на символы. И получать доступ к символам по указателям.

А если есть время, и шрифтов будет много, то лучше написать генератор кода шрифтов. Я так делал. Взял старенький IconEdit.4.3.90 который сохраняет фонт в бинарный файл и этот формат расписан. И написал генератор файлов фонтов прямо в текст на ассемблере со всеми шапками фонта, таблицей длин символов и графическими комментариями символов. Плюс в конце файла, после END, уже все необходимые структуры и описания по работе с фонтом на Си для своей библиотеки. Теперь любая коррекция фонта делается в пару кликов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, AHTOXA сказал:

А какой смысл в такой структуре? Как выбирать нужный член по коду символа? Куча if-ов? Зачем тогда объединять все эти массивчики в структуры?

Отдельно имеется массив смещений для каждого массива строк символов из структуры. К адресу структуры прибавляется смещение, так попадаем в массив. А массив смещений упорядочен по коду символов (цифр и др). 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;
        }
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...