Jump to content

    
ViKo

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites
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]

 

Share this post


Link to post
Share on other sites

 

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

Вот Visual Studio

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
3 hours ago, dimka76 said:

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

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

Share this post


Link to post
Share on other sites
7 часов назад, jcxz сказал:

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

(char *)&p[1]

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

Share this post


Link to post
Share on other sites

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

};

 

Share this post


Link to post
Share on other sites
22 минуты назад, Сергей Борщ сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
11 часов назад, ViKo сказал:

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

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

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

Share this post


Link to post
Share on other sites
Только что, Darth Vader сказал:

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

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

Share this post


Link to post
Share on other sites
12 часов назад, ViKo сказал:

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

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

Share this post


Link to post
Share on other sites
13 часов назад, ViKo сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, AHTOXA сказал:

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

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

Share this post


Link to post
Share on other sites
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;
        }
    }
}

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.