[uquote="da-nie",url="/forum/viewtopic.php?p=3321797#p3321797"]Иначе фокус может не получиться.

[/uquote]
Зачем паковать байт? Байт он всегда байт - как его ни пакуйте - а sizeof(t_point) в конкретном случае будет 1. Биты 0-2 отводятся под x, а 3-5 - под y. Биты-же 6,7 остаются неиспользуемы при любом раскладе кроме явного их указания в качестве поля(пары полей) размером 2 бита (либо по биту). Поле размером 3 бита займёт уже 0-2 биты
следующего байта.
Код: Выделить всё
struct t_point {
unsigned char x : 3;
unsigned char y : 3;
unsigned char z : 3;
};
unsigned char bb[2] = { 0 };
struct ccc* c = (struct ccc*)bb;
// содержимое bb -> 0х00, 0x00
c->x = 0x07; // содержимое bb -> 0х07, 0x00
c->y = 0x07; // содержимое bb -> 0х3F, 0x00
c->z = 0x07; // содержимое bb -> 0х3F, 0x07
Для того-же, чтобы все биты лежали плотнячком - придется объявлять базовый тип поля пошире - т.е. unsigned short как минимум. Но, любителей накладывать такие "широкие" битовые маски на сырые данные прилетевшие из внешнего мира ждут некоторые сюрпризы - особенно на "остроконечниковых" (low endian) платформах. Да даже уже и в нашем примере пытливый глаз наверняка обнаружил некоторую странность - отчего-то "младшие" x,y лежат перед "старшим" z, не так-ли?
А вот вариант с short -ом:
Код: Выделить всё
struct t_point {
unsigned short x : 3;
unsigned short y : 3;
unsigned short z : 3;
};
union uu {
unsigned char bb[2];
unsigned short s;
} u = { 0 };
struct sss* c = (struct sss*)&u;
// содержимое u.bb -> 0х00, 0x00, содержимое u.s -> 0х0000
c->x = 0x07; // содержимое u.bb -> 0х07, 0x00, содержимое u.s -> 0х0007
c->y = 0x07; // содержимое u.bb -> 0х3F, 0x00, содержимое u.s -> 0х003F
c->z = 0x07; // содержимое u.bb -> 0хFF, 0x01, содержимое u.s -> 0х01FF
Биты уплотнились как надо - но в байтовом массиве по прежнему "бардачат", а вот как unsigned short всё прекрасно - потому как собирал я этот примерчик на LE платформе.
Грустные выводы - не все возможные комбинации можно представить в битовых полях, а для low endian придётся порой ещё и байты в исходных данных переставлять (для кайловских ARM тулчейнов, кстати, есть интриниксы _REV16, _REV32)
Добавлено after 1 hour 11 minutes 1 second:[uquote="Shrike1987",url="/forum/viewtopic.php?p=3322007#p3322007"]Но, мне крайне тяжело и долго нужно будет разбираться в том, как создать тип данных в виде структуры с динамическим массивом и этот тип назначить статическому массиву.[/uquote]
С - это высокоуровневый ассемблер - понимая как компилятор с компоновщиком строят образ программы вы будет знать как работает железяка. Без всякой магии. Дело стоящее - не исключайте для себя такую возможность. :-D
Код: Выделить всё
typedef struct {
unsigned char x : 3; // 0x00 - 0x07
unsigned char brk : 1; // 0x08
unsigned char y : 3; // 0x00 - 0x70
unsigned char eol : 1; // 0x80
} t_point;
#define BRK 0x08
#define EOL 0x80
// [омномномном]
// Font[55].Lines="0004412326"; // 7
const t_point ch55[] = { 0x00, 0x04, 0x41, 0x23, 0x26, EOL } ; // 7
// Font[56].Lines="103041423344453616050413020110|1333"; // 8
const t_point ch56[] = { 0x10, 0x30, 0x41, 0x42, 0x33, 0x44, 0x45, 0x36, 0x16, 0x05, 0x04, 0x13, 0x02, 0x01, 0x10, BRK, 0x13, 0x33, EOL } ; // 8
// Font[57].Lines="0516364541301001021343"; // 9
const t_point ch57[] = { 0x05, 0x16, 0x36, 0x45, 0x41, 0x30, 0x10, 0x01, 0x02, 0x13, 0x43, EOL } ; // 9
// [омномномном]
const struct TFont {
const t_point *Line;
} Font[255] = {
ch00, ch01, ch02, и.т.д, и т.д..... , ch56, ch57,
};
Всё вышеприведенное объявляется в глобальной области (не в функциях!) - и вся работа будет сделана компилятором - функции DrawChar остаётся только воспользоваться уже набитым массивом данных. И не забудьте терминировать все данные символов байтом EOL - иначе оно отрисует вам содержимое всей памяти аж до случайно встреченного символа с установленным верхним битом.

Код: Выделить всё
void DrawChar(uint8_t C, uint16_t X, uint16_t Y, float scale)
{
t_point* p0 = NULL;
t_point* p = NULL;
for (p0 = Font[C].Line, p = Font[C].Line + 1; 0 == p->eol; p0 = p, p++) {
if (0 != p->brk )
continue;
drawLine( X + p0->x * scale - k * scale,
Y + p0->y * scale - k * scale,
X + p->x * scale - k * scale,
Y + p->y * scale - k * scale,
Color565(255, 255, 255));
}
}
[uquote="Shrike1987",url="/forum/viewtopic.php?p=3322007#p3322007"]По поводу видео: могу конечно записать, только что именно?[/uquote]
Не заморачивайтесь - подкалывал я вас. Скорость работы программы оценивается [тупым] юзером по времени отклика системы на его хотелки - и если шрифт рисуется с заметным анимационным эффектом - это медленная система с его [тупой] точки зрения. А если глаз не замечает - то и чёрт с ним - занимается ли там МК парсингом ваших строковых литералов на лету или просто хомячит инструкции в бесконечности главного цикла - всё едино лепота.
[uquote="Shrike1987",url="/forum/viewtopic.php?p=3322007#p3322007"]Решил все же показать код, только рассматривайте его как анекдот, не принимайте близко к сердцу =)[/uquote]
Как по мне так это было правильное решение с вашей стороны.
Да, и ещё по описанию вектора отрисовки символа - идею с размещением х и y
в полубайтах для большей наглядности вы поняли, кстати?