Разбираюсь с адафрутовскими шрифтами. Хочу записывать шрифт на флеш память, и при необходимости им пользоваться. Шрифт записываю на флеш память двумя частями, структура и сами глифы. Структура адафрутовского шрифта такая
Первое число это индекс позиция начала глифа в массиве. 662 и 671 никак целиком не запихнуть во флеш память. Приходится разбивать на два байта 6 62 и 6 71. Задача теперь собрать из двух байт целое число, чтобы прибавить его к адресу начала массива глифов.
662 и 671 никак целиком не запихнуть во флеш память. Приходится разбивать на два байта 6 62 и 6 71.
Вы полный идиот. Никто не разбивает числа таким образом. Возьмите переменную типа uint16_t и разложите ее на два байта путем битового сдвига, как в примерах выше в этой ветке. Сборка, как говорится, в обратном порядке.
Нахрена вообще с такими знаниями разбираться со шрифтами? вы никогда ничего хорошего не напишете, а помойного кода в инете и так навалом
еще добавлю, что чтобы записать число 671 в прогмем - его вообще не нужно разбивать. Компилятор это делает сам, если вы описали переменную с ключевым словом PROGMEM
Я записываю шрифты HexFrame прямо из перекодированного fontconvertorом файла. Обычным копипастом. HexFrame я никак не перепишу и знаний нет, хочется максимально упростить все. Картинки я уже сделал. Шрифт кое как работает.
еще добавлю, что чтобы записать число 671 в прогмем - его вообще не нужно разбивать. Компилятор это делает сам, если вы описали переменную с ключевым словом PROGMEM
Короче, то что вы придумали - дурость и работать не будет. Число 672 во флеше это совсем не "6" и "72", это (672 >>8) в старшем байте (672 & 0xFF) в младшем.
Короче, то что вы придумали - дурость и работать не будет. Число 672 во флеше это совсем не "6" и "72", это (672 >>8) в старшем байте (672 & 0xFF) в младшем.
uint8_t Hi = 2;
uint8_t Lo = 20;
void setup() {
Serial.begin(115200);
String hibyte = String(Hi, DEC);
String lobyte = String(Lo, DEC);
String var = hibyte + lobyte;
uint16_t Index = var.toInt();
Serial.print("Index =");
Serial.println(Index);
}
void loop() {
}
uint8_t Hi = 2;
uint8_t Lo = 20;
void setup() {
Serial.begin(115200);
String hibyte = String(Hi, DEC);
String lobyte = String(Lo, DEC);
String var = hibyte + lobyte;
uint16_t Index = var.toInt();
Serial.print("Index =");
Serial.println(Index);
}
void loop() {
}
Я вижу только такое решение.
Ну что ж, такое решение тоже имеет право на существование.
Только обратите внимание, что "склеиваете" Вы не числа а строки.
Хотя бы потому, что числа можно складывать, вычитать, умножать, делить, извлекать корень, но нельзя склеивать. Соответственно, Ваше желание "склеивать числа" - невыполнимо. По крайней мере до тех пор, пока Вы точно не определите, что такое "склеивание".
uint8_t Hi = 2;
uint8_t Lo = 20;
void setup() {
Serial.begin(115200);
String hibyte = String(Hi, DEC);
String lobyte = String(Lo, DEC);
String var = hibyte + lobyte;
uint16_t Index = var.toInt();
Serial.print("Index =");
Serial.println(Index);
}
void loop() {
}
Я вижу только такое решение.
Ну что ж, такое решение тоже имеет право на существование.
Только обратите внимание, что "склеиваете" Вы не числа а строки.
Хотя бы потому, что числа можно складывать, вычитать, умножать, делить, извлекать корень, но нельзя склеивать. Соответственно, Ваше желание "склеивать числа" - невыполнимо. По крайней мере до тех пор, пока Вы точно не определите, что такое "склеивание".
«Склеивать» действительно только строки можно. А вот числа (байты) только складывать.
ЗЫ: По примеру деда со всякими флоатами сейчас, останавливаясь на точности в два знака после запятой, жестко поступаю: умножаю на 100 и в int16_t. Огромнейшее спасибо за совет (хоть он и о температуре тогда писал).
ЗЫ: По примеру деда со всякими флоатами сейчас, останавливаясь на точности в два знака после запятой,
В общем случае это весьма сомнительное занятие: одно дело 123456.78 и совсем другое - 0.02.
Цитата:
жестко поступаю: умножаю на 100 и в int16_t.
По науке это называется fixed point в отличие от floating point.
Соответственно "фиксируется" эта десятичная точка не обязательно на втором знаке, а в любом месте удобном для конкретной задачи.
Но более разумный подход - фиксировать количество не десятичных знаков, а двоичных. Т.е. разделитель целой и дробной части помещается после определенного разряда двоичного числа. Например байт b00111111 с двумя знаками после запятой соответствует b001111.11 или десятичному 15.75 (единица младшего разряда 0.25).
Но более разумный подход - фиксировать количество не десятичных знаков, а двоичных. Т.е. разделитель целой и дробной части помещается после определенного разряда двоичного числа. Например байт b00111111 с двумя знаками после запятой соответствует b001111.11 или десятичному 15.75 (единица младшего разряда 0.25).
здесь как раз указывается формат fixed для каждого из входящих в формулу чисел, чтобы гарантировать, что слагаемые имеют один и тот же формат. В данном случае промежуточный вариант в 64-разрядном числе формата 24.40, т.е. 40 двоичных знаков после запятой.
Разбираюсь с адафрутовскими шрифтами. Хочу записывать шрифт на флеш память, и при необходимости им пользоваться. Шрифт записываю на флеш память двумя частями, структура и сами глифы. Структура адафрутовского шрифта такая
{ 662, 6, 12, 9, 1, -11 },
{ 671, 8, 17, 9, 0, -11 },
Первое число это индекс позиция начала глифа в массиве. 662 и 671 никак целиком не запихнуть во флеш память. Приходится разбивать на два байта 6 62 и 6 71. Задача теперь собрать из двух байт целое число, чтобы прибавить его к адресу начала массива глифов.
3.14ЗДЕЦ!
я пас.
662 и 671 никак целиком не запихнуть во флеш память. Приходится разбивать на два байта 6 62 и 6 71.
Вы полный идиот. Никто не разбивает числа таким образом. Возьмите переменную типа uint16_t и разложите ее на два байта путем битового сдвига, как в примерах выше в этой ветке. Сборка, как говорится, в обратном порядке.
Нахрена вообще с такими знаниями разбираться со шрифтами? вы никогда ничего хорошего не напишете, а помойного кода в инете и так навалом
еще добавлю, что чтобы записать число 671 в прогмем - его вообще не нужно разбивать. Компилятор это делает сам, если вы описали переменную с ключевым словом PROGMEM
Я записываю шрифты HexFrame прямо из перекодированного fontconvertorом файла. Обычным копипастом. HexFrame я никак не перепишу и знаний нет, хочется максимально упростить все. Картинки я уже сделал. Шрифт кое как работает.
еще добавлю, что чтобы записать число 671 в прогмем - его вообще не нужно разбивать. Компилятор это делает сам, если вы описали переменную с ключевым словом PROGMEM
Я на внешнюю флеш пишу.
Шрифт кое как работает.
именно что кое-как. Зачем такое "кое-как" нужно?
Короче, то что вы придумали - дурость и работать не будет. Число 672 во флеше это совсем не "6" и "72", это (672 >>8) в старшем байте (672 & 0xFF) в младшем.
Шрифт кое как работает.
именно что кое-как. Зачем такое "кое-как" нужно?
Короче, то что вы придумали - дурость и работать не будет. Число 672 во флеше это совсем не "6" и "72", это (672 >>8) в старшем байте (672 & 0xFF) в младшем.
Я вижу только такое решение.
Я вижу только такое решение.
потому что ваши знания на нуле
Я вижу только такое решение.
да, а что получится при
да, а что получится при
66200 !
да, а что получится при
66200 !
ну пусть попробует.
да, а что получится при
66200 !
ну пусть попробует.
А как оно получится? Для этого нужен очень огромный шрифт.
А как оно получится? Для этого нужен очень огромный шрифт.
b707 сделает мне огромную светодиодную панель и он, очень большой шрифт, мне понадобится.
пробуй!
b707 сделает мне огромную светодиодную панель и он, очень большой шрифт, мне понадобится.
это заказ? :)
А как оно получится? Для этого нужен очень огромный шрифт.
b707 сделает мне огромную светодиодную панель и он, очень большой шрифт, мне понадобится.
пробуй!
Дело не в размере панели, а в разрешении экрана. Да и делаю чисто для своего пользования.
Дело не в размере панели, а в разрешении экрана. Да и делаю чисто для своего пользования.
ты погляди на него, ты пробовать будешь или нет, просто хочу чтоб у тебя наступило еще одно разочарование.
Я вижу только такое решение.
Только обратите внимание, что "склеиваете" Вы не числа а строки.
Хотя бы потому, что числа можно складывать, вычитать, умножать, делить, извлекать корень, но нельзя склеивать. Соответственно, Ваше желание "склеивать числа" - невыполнимо. По крайней мере до тех пор, пока Вы точно не определите, что такое "склеивание".
b707 сделает мне огромную светодиодную панель и он, очень большой шрифт, мне понадобится.
это заказ? :)
:)
Я вижу только такое решение.
Только обратите внимание, что "склеиваете" Вы не числа а строки.
Хотя бы потому, что числа можно складывать, вычитать, умножать, делить, извлекать корень, но нельзя склеивать. Соответственно, Ваше желание "склеивать числа" - невыполнимо. По крайней мере до тех пор, пока Вы точно не определите, что такое "склеивание".
Спасибо. Учту. Хоть кто то без оскорблений. ;)
Хоть кто то без оскорблений. ;)
заслужил
А как тут без оскорблений, если нервов не хватает. Иной раз если матом не покроешь - не дойдёт.( И это печально.
Иной раз если матом не покроешь - не дойдёт.( И это печально.
"Волшебный пендель"
Но в данном случае даже он не поможет
b707, хорошо что потер, а то я думал ты от него заразился :)
я - пас.
так праздник жеж сёдня
Чо за праздник?
«Склеивать» действительно только строки можно. А вот числа (байты) только складывать.
ЗЫ: По примеру деда со всякими флоатами сейчас, останавливаясь на точности в два знака после запятой, жестко поступаю: умножаю на 100 и в int16_t. Огромнейшее спасибо за совет (хоть он и о температуре тогда писал).
ЗЫ: По примеру деда со всякими флоатами сейчас, останавливаясь на точности в два знака после запятой,
жестко поступаю: умножаю на 100 и в int16_t.
Соответственно "фиксируется" эта десятичная точка не обязательно на втором знаке, а в любом месте удобном для конкретной задачи.
Но более разумный подход - фиксировать количество не десятичных знаков, а двоичных. Т.е. разделитель целой и дробной части помещается после определенного разряда двоичного числа. Например байт b00111111 с двумя знаками после запятой соответствует b001111.11 или десятичному 15.75 (единица младшего разряда 0.25).
Но более разумный подход - фиксировать количество не десятичных знаков, а двоичных. Т.е. разделитель целой и дробной части помещается после определенного разряда двоичного числа. Например байт b00111111 с двумя знаками после запятой соответствует b001111.11 или десятичному 15.75 (единица младшего разряда 0.25).
красиво
Ну раз так, приведу пример из конкретного проекта (сам проест здесь: http://arduino.ru/forum/proekty/razrabotka-protsessora-zvukovykh-effektov-na-stm32f407vet6 , но описан весьма фрагментарно).
здесь как раз указывается формат fixed для каждого из входящих в формулу чисел, чтобы гарантировать, что слагаемые имеют один и тот же формат. В данном случае промежуточный вариант в 64-разрядном числе формата 24.40, т.е. 40 двоичных знаков после запятой.