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

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

Что-то путаюсь, как написать. Создаю свой шрифт (тема есть). Каждый символ - массив char элементов (индексов в таблице строк пикселей). У каждого символа свой массив, они разного размера. Хочу обращаться к этим массивам по указателям. Для этого хочу создать массив - таблицу указателей на массивы. В этой таблицу указатели будут размещаться согласно кодам (пока достаточно 0x20 - 0x3F символов). Так как эту таблицу записать, массив указателей на массивы?

char ((* BigSymbPtr)[])[]

так? 

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


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

3 минуты назад, _pv сказал:

char * ptr[];

То есть, массива указателей на char достаточно? А то, что там не один char, а много, не имеет значения?

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


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

да указателю как-то всё равно, сколько там элементов после первого, на который он указывает.

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


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

Чтобы потом не сломать мозг, пытаясь понять, что здесь напрограммировано, удобно использовать typedef (или using, если по-новому):

using BigSymbPtr = uint8_t*;  // или typedef uint8_t* BigSymbPtr;

uint8_t symA[] = { 0, 1, 2, 3, 4 };
uint8_t symB[] = { 0, 1, 2, 3, 4 };

BigSymbPtr bitSymbols[] = {symA, symB};

Но если размеры могут быть разными, то лучше использовать структуру:

uint8_t symA[] = { 0, 1, 2, 3, 4, 5, 11 };
uint8_t symB[] = { 0, 1, 2, 3, 4 };

struct BigSymbolData
{
    uint8_t* data;
    size_t size;
};

BigSymbolData symbols[] = {
    { symA, sizeof(symA) },
    { symB, sizeof(symB) },
};

 

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


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

Не, мне не надо структур. У меня каждый массив заканчивается нулём. Там еще повторения строк пикселей кодируются, всё равно проверять. 

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


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

2 минуты назад, ViKo сказал:

Не, мне не надо. У меня каждый массив заканчивается нулём.  

А в массиве нуля быть не может?

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


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

4 минуты назад, AHTOXA сказал:

А в массиве нуля быть не может?

Нет. Я выбрал коды для строк 48-255, количество повторений строк 1-47 и 0 как признак конца массива. 

Или по 64-м пройдёт граница. 

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


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

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

Так как эту таблицу записать, массив указателей на массивы?

char ((* BigSymbPtr)[])[]

так? 

Ну вот - экономили, экономили на пуговицах, а в итоге всё просто слили на пустом месте.... :unknw:

32-битные указатели то зачем? У вас массив он что - размером больше 2^16?

Если меньше 2^16, то достаточно 16-битных индексов.

 

PS: А если ещё немножко включить голову && если разброс размеров символов небольшой, то может получится и в 8-разрядные индексы упихнуть.

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


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

32 указателя, 128 байтов. Можно и меньше использовать, у мне только цифры да точка нужны. 

Массивы строк пикселей цифр - разные по размеру. Как мне посоветуете поступить? 

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


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

15 минут назад, ViKo сказал:

32 указателя, 128 байтов. Можно и меньше использовать, у мне только цифры да точка нужны. 

Массивы строк пикселей цифр - разные по размеру. Как мне посоветуете поступить? 

Я же написал уже: Использовать 16-битные индексы (смещения от начала массива к началам описателей символов).

Или как обычно - чукча не читатель, чукча писатель?  :biggrin:

 

PS: А если ещё подключить голову и если выполняется условие:

N*Rmin <256, где:

N - количество символов без одного последнего;

Rmin - минимальный размер описателя символа из всех N;

то можно вообще хранить только 8-разрядную таблицу (T). И вычислять смещение к началу описателя символа как:

S = Rmin * T[zero_based_номер_символа];

а в таблице T хранить поправки смещения.

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


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

Это надо в одну структуру собрать массив смещений и массивы индексов строк символов. Символ будет иметь индексов порядка 30 байтов. Смещение, значит, двумя байтами можно задать. Некая экономия, пожалуй, получится. Буду думать эту мысль. 

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


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

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

Это надо в одну структуру собрать массив смещений и массивы индексов строк символов. Символ будет иметь индексов порядка 30 байтов. Смещение, значит, двумя байтами можно задать. Некая экономия, пожалуй, получится. Буду думать эту мысль. 

думайте. Хотя ничего не понял про "в одну структуру собрать массив смещений и массивы индексов строк символов" ну да ладно - вам виднее.

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

Не, мне не надо структур. У меня каждый массив заканчивается нулём.

Это тоже не нужно. Раз есть массив смещений к началам символов, то этот 0 тоже можно выкинуть.

 

Вообще - раз всего 32 символа, то (скорей всего) достаточно таблицы 8-разрядных поправок смещений (как я писал выше). Размером 32+1 байтов.

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


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

2 минуты назад, jcxz сказал:

1. Хотя ничего не понял про "в одну структуру собрать массив смещений и массивы индексов строк символов" ну да ладно - вам виднее.

2. Это тоже не нужно. Раз есть массив смещений к началам символов, то этот 0 тоже можно выкинуть.

3. Вообще - раз всего 32 символа, то достаточно таблицы 8-разрядных поправок смещений (как я писал выше). Размером 32 байта.

1. У меня сейчас каждый символ представлен отдельным массивом (индексов строк). Собрать все символы в один массив? 

2. Смещения, допустим, определим. Но длину тоже нужно вычислить. Как разницу между смещениями соседей? Пожалуй.

3. Поправки смещений - это, типа, к некоему усреднённому (или минимальному?) размеру задавать ± (+) смещение? Муторно выглядит.  

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


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

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

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

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

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

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

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

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

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

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