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

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

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

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

да.

Цитата

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

да. Потому я и написал про 32+1.

Цитата

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

К минимальному (Rmin). Я же приводил формулу выше. Rmin - минимальный размер описания символа. Смещение = код_символа * Rmin + поправка_из_таблицы (в каждом элементе которой хранится сумма всех R-Rmin для символов до текущего).

Цитата

Муторно выглядит.  

Зато - верх экономии!  :wink:

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


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

К минимальному, к максимальному, к среднему - одинаково. Смещение байтом ограничено. Мысль понял, спасибо!

А, нет, не одинаково! При среднем размере не будет набегать ошибка смещения к концу массива. Так что, нет - только вино среднее!

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


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

Если уж совсем крохоборствовать, то можно просто слить все символы в один массив, и каждый раз сканировать начало нужного символа, пропуская предыдущие (по завершающему нулю). Или заменить ноль в конце на байт длины в начале - так будет чуть быстрее.

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


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

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

Если уж совсем крохоборствовать, то можно просто слить все символы в один массив, и каждый раз сканировать начало нужного символа, пропуская предыдущие (по завершающему нулю). Или заменить ноль в конце на байт длины в начале - так будет чуть быстрее.

Сканировать - долго.

Отдельная таблица 16-битовых смещений выглядит неплохим решением. 64 байта.

А как эти смещения вычислять, если массив непрерывный? Метки задавать, что ли?

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


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

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

Отдельная таблица 16-битовых смещений выглядит неплохим решением. 64 байта. 

Лично на мой вкус, геморрой со "склеиванием" символов в один массив не стоит потери 64 байтов. Так что лично я бы сделал раздельные массивы для каждого символа и массив указателей. Так нагляднее.

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


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

А что там насчет массивов переменной длины? Двумерный сделать?

Нет, не годится. Это только для локальных массивов, во время работы можно использовать.

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


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

Ого, сообщение пропало. Как?

Задавал вопрос, как определить смещение в массиве. Не придумал.

Зато придумал - структура из массивов!

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


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

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

Я вот такую заготовочку применял

font.h

Roboto43.c

Спасибо, посмотрел. Вы символы не сжимаете.
А для рисования я использовал программу, что Антон дал. По ней сейчас и набираю строки пикселей.
Вот пара символов (_off_on_off_ ets., extra_number, ... eoc ):

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

uint8_t BigChar0[] = {					// '0'
	bcrx_11_10_11,
	bcrx_9_14_9,
	bcrx_7_18_7,
	bcrx_6_20_6,
	bcrx_5_22_5,
	bcrx_4_8_8_8_4,
	bcrx_3_7_12_7_3,
	bcrx_3_6_14_6_4,
	bcrx_2_6_16_6_2,
	bcrx_2_5_18_5_2,
	bcrx_1_6_18_6_1,
	bcrx_1_5_20_5_1, 25,
	bcrx_1_6_18_6_1,
	bcrx_2_5_18_5_2,
	bcrx_2_6_16_6_2,
	bcrx_3_6_14_6_4,
	bcrx_3_7_12_7_3,
	bcrx_4_8_8_8_4,
	bcrx_5_22_5,
	bcrx_6_20_6,
	bcrx_7_18_7,
	bcrx_9_14_9,
	bcrx_11_10_11, 0
};

uint8_t BigChar1[] = {					// '1'
	bcrx_14_5_13,
	bcrx_13_6_13,
	bcrx_12_7_13,
	bcrx_11_8_13,
	bcrx_10_9_13,
	bcrx_9_10_13,
	bcrx_8_11_13,
	bcrx_7_12_13,
	bcrx_6_7_1_5_13,
	bcrx_6_6_2_5_13,
	bcrx_6_5_3_5_13,
	bcrx_6_4_4_5_13,
	bcrx_14_5_13, 30,
	bcrx_9_15_8, 4, 0
};

 

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


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

2 hours ago, ViKo said:

Спасибо, посмотрел. Вы символы не сжимаете.

Я просто хотел обратить внимание как шрифт и символы описываются.

const FONT_CHAR_INFO Roboto_43ptDescriptors[] =
{
	{5, 73, 0}, 		/* 0 */
	{5, 73, 365}, 		/* 1 */
	{5, 73, 730}, 		/* 2 */
	{5, 73, 1095}, 		/* 3 */
	{5, 73, 1460}, 		/* 4 */
	{5, 73, 1825}, 		/* 5 */
	{5, 73, 2190}, 		/* 6 */
	{5, 73, 2555}, 		/* 7 */
	{5, 73, 2920}, 		/* 8 */
	{5, 73, 3285}, 		/* 9 */

};

/* Font information for MyFont 70pt */
const FONT_INFO Roboto_43ptFontInfo =
{
	73, /*  Character height */
	'0', /*  Start character */
	'9', /*  End character */
	//48, /*  Width, in pixels, of space character */
	Roboto_43ptDescriptors, /*  Character descriptor array */
	Roboto_43ptBitmaps, /*  Character bitmap array */
};       

 

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


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

Я вот как хочу сделать. Структура, в ней массив смещений на массивы индексов строк для каждого символа, и дальше сами массивы.
То есть:

static const struct {
	uint16_t bc_ofs[] = {
    	offsetof(BigChar.BigSpace), ...
    };
    uint8_t BigSpace[] = {
    	bcrx_, 0
    };
    uint8_t BigComma[] = {					// ','
		bcrx_32, 38,
		bcrx_3_4_25,
      ...
    };
} BigChar;

Такая конструкция возможна? Чтобы в структуре внутри самой себя смещения вычислялись. 

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


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

Или лучше массив смещений отдельно сделать?

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


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

Чегой-то не компилируется.

/*!*****************************************************************************
  @brief	Character rows indexes
  @note		First index have the number SAMEROWS_MAX
  */
typedef enum {
	bcrx_32 = SAMEROWS_MAX,
	bcrx_26_5_1,
	bcrx_25_5_2,
...
	bcrx_1_30_1
} BigCharRowIndx_t;

/*!*****************************************************************************
  @brief	Big Characters '...' arrays of rows structure
  @note		in each BigChar: (number_of, ) row_index, ... 0
  */
static const struct {
	uint8_t BigSpace[2] = {				// 'space' (default, dummy)
		bcrx_32, 0
	};
	uint8_t BigComma[11] = {				// ','
	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
	};
...
		bcrx_11_10_11, 0
	};
} BigCharIndx;

Source\BigFont.c(319): error:  #65: expected a ";"
      uint8_t BigSpace[2] = {                // 'space' (default, dummy)
Source\BigFont.c(322): error:  #65: expected a ";"
      uint8_t BigComma[11] = {                // ','

Что за холера?

Прямо после квадратных скобок подчеркивает ошибку. Не нравится ему, Кейлу, инициализация. И размер посчитал, и не помогло.

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


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

Похоже, нужно сначала описать всю структуру, а потом её инициализировать?

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


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

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

Похоже, нужно сначала описать всю структуру, а потом её инициализировать?

Да. По образу и подобию

static const struct
{
  u8 a[2];
  u8 b[3];
}str =
{
  .a = {1, 2},
  .b = {3, 4, 5}
};

 

В целом, это даже удобнее.

Глазами первоначально виден скелет структуры, а уже отдельно можно смотреть чем она заполнена.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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