ViKo 1 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба Что-то путаюсь, как написать. Создаю свой шрифт (тема есть). Каждый символ - массив char элементов (индексов в таблице строк пикселей). У каждого символа свой массив, они разного размера. Хочу обращаться к этим массивам по указателям. Для этого хочу создать массив - таблицу указателей на массивы. В этой таблицу указатели будут размещаться согласно кодам (пока достаточно 0x20 - 0x3F символов). Так как эту таблицу записать, массив указателей на массивы? char ((* BigSymbPtr)[])[] так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 74 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба char * ptr[]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба 3 минуты назад, _pv сказал: char * ptr[]; То есть, массива указателей на char достаточно? А то, что там не один char, а много, не имеет значения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 74 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба да указателю как-то всё равно, сколько там элементов после первого, на который он указывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба Ну, по-хорошему, надо массив структур типа { ptr, len} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба Чтобы потом не сломать мозг, пытаясь понять, что здесь напрограммировано, удобно использовать 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) }, }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба Не, мне не надо структур. У меня каждый массив заканчивается нулём. Там еще повторения строк пикселей кодируются, всё равно проверять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба 2 минуты назад, ViKo сказал: Не, мне не надо. У меня каждый массив заканчивается нулём. А в массиве нуля быть не может? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба 4 минуты назад, AHTOXA сказал: А в массиве нуля быть не может? Нет. Я выбрал коды для строк 48-255, количество повторений строк 1-47 и 0 как признак конца массива. Или по 64-м пройдёт граница. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 мая, 2020 Опубликовано 29 мая, 2020 · Жалоба 8 часов назад, ViKo сказал: Так как эту таблицу записать, массив указателей на массивы? char ((* BigSymbPtr)[])[] так? Ну вот - экономили, экономили на пуговицах, а в итоге всё просто слили на пустом месте.... 32-битные указатели то зачем? У вас массив он что - размером больше 2^16? Если меньше 2^16, то достаточно 16-битных индексов. PS: А если ещё немножко включить голову && если разброс размеров символов небольшой, то может получится и в 8-разрядные индексы упихнуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 мая, 2020 Опубликовано 29 мая, 2020 · Жалоба 32 указателя, 128 байтов. Можно и меньше использовать, у мне только цифры да точка нужны. Массивы строк пикселей цифр - разные по размеру. Как мне посоветуете поступить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 мая, 2020 Опубликовано 29 мая, 2020 · Жалоба 15 минут назад, ViKo сказал: 32 указателя, 128 байтов. Можно и меньше использовать, у мне только цифры да точка нужны. Массивы строк пикселей цифр - разные по размеру. Как мне посоветуете поступить? Я же написал уже: Использовать 16-битные индексы (смещения от начала массива к началам описателей символов). Или как обычно - чукча не читатель, чукча писатель? PS: А если ещё подключить голову и если выполняется условие: N*Rmin <256, где: N - количество символов без одного последнего; Rmin - минимальный размер описателя символа из всех N; то можно вообще хранить только 8-разрядную таблицу (T). И вычислять смещение к началу описателя символа как: S = Rmin * T[zero_based_номер_символа]; а в таблице T хранить поправки смещения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 мая, 2020 Опубликовано 29 мая, 2020 · Жалоба Это надо в одну структуру собрать массив смещений и массивы индексов строк символов. Символ будет иметь индексов порядка 30 байтов. Смещение, значит, двумя байтами можно задать. Некая экономия, пожалуй, получится. Буду думать эту мысль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 мая, 2020 Опубликовано 29 мая, 2020 · Жалоба 38 минут назад, ViKo сказал: Это надо в одну структуру собрать массив смещений и массивы индексов строк символов. Символ будет иметь индексов порядка 30 байтов. Смещение, значит, двумя байтами можно задать. Некая экономия, пожалуй, получится. Буду думать эту мысль. думайте. Хотя ничего не понял про "в одну структуру собрать массив смещений и массивы индексов строк символов" ну да ладно - вам виднее. 9 часов назад, ViKo сказал: Не, мне не надо структур. У меня каждый массив заканчивается нулём. Это тоже не нужно. Раз есть массив смещений к началам символов, то этот 0 тоже можно выкинуть. Вообще - раз всего 32 символа, то (скорей всего) достаточно таблицы 8-разрядных поправок смещений (как я писал выше). Размером 32+1 байтов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 мая, 2020 Опубликовано 29 мая, 2020 · Жалоба 2 минуты назад, jcxz сказал: 1. Хотя ничего не понял про "в одну структуру собрать массив смещений и массивы индексов строк символов" ну да ладно - вам виднее. 2. Это тоже не нужно. Раз есть массив смещений к началам символов, то этот 0 тоже можно выкинуть. 3. Вообще - раз всего 32 символа, то достаточно таблицы 8-разрядных поправок смещений (как я писал выше). Размером 32 байта. 1. У меня сейчас каждый символ представлен отдельным массивом (индексов строк). Собрать все символы в один массив? 2. Смещения, допустим, определим. Но длину тоже нужно вычислить. Как разницу между смещениями соседей? Пожалуй. 3. Поправки смещений - это, типа, к некоему усреднённому (или минимальному?) размеру задавать ± (+) смещение? Муторно выглядит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться