I = atoi(Mass);
CodeVision AVR в вопросах и ответах
- Сообщения: 25
- Зарегистрирован: Чт авг 27, 2020 13:15:49
- Реклама
Кошмарная проблема! Отнять от значения '0', чтобы из кода цифры получить число, это ведь так сложно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3884874#p3884874"]у[х]=а; загружает в массив ровно то, что прилетело в УАРТ
у[х]=а-'0'; перед загрузкой вычтет порядковый номер символа "0", а т.к. цифры идут по порядку - то останется только значение принятого числа... т.е. произойдет преобразование "0"->0, "1"->1, "2"->2... и.т.д.[/uquote] писал уже... разовью мысль
чтоб принять число нужно:
1) выделить под него переменную соответственного размера (вместо массива)
2) обнулить её до начала приёма посылки у=0;
3) складывать в неё полученные числа: у+=а-'0';
4) не забывать "сдвигать" разряды умножением на 10: у*=10;
(сдвигать лучше сразу перед внесением новой цифры, пусть начальный 0 лишний раз умножится, зато на финише получаем ровно нужное число без лишних условий).
Добавлено after 2 minutes 29 seconds:
П.С. это я продолжил начатую тему... но и тут она в тему .....
у[х]=а-'0'; перед загрузкой вычтет порядковый номер символа "0", а т.к. цифры идут по порядку - то останется только значение принятого числа... т.е. произойдет преобразование "0"->0, "1"->1, "2"->2... и.т.д.[/uquote] писал уже... разовью мысль
чтоб принять число нужно:
1) выделить под него переменную соответственного размера (вместо массива)
2) обнулить её до начала приёма посылки у=0;
3) складывать в неё полученные числа: у+=а-'0';
4) не забывать "сдвигать" разряды умножением на 10: у*=10;
(сдвигать лучше сразу перед внесением новой цифры, пусть начальный 0 лишний раз умножится, зато на финише получаем ровно нужное число без лишних условий).
Добавлено after 2 minutes 29 seconds:
П.С. это я продолжил начатую тему... но и тут она в тему .....
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3886086#p3886086"]П.С. это я продолжил начатую тему... но и тут она в тему .....
[/uquote]
Что то не доходит. Смотрите у меня числу знаку '0' соответствует 48. Мне что бы получить из '0'- 0. с умножением что то не зашло. Можно подробнее. То что отдельную временную переменную под это преобразование это мне понятно. Не понятно с умножением
Что то не доходит. Смотрите у меня числу знаку '0' соответствует 48. Мне что бы получить из '0'- 0. с умножением что то не зашло. Можно подробнее. То что отдельную временную переменную под это преобразование это мне понятно. Не понятно с умножением
чтобы получить 0, вам надо из '0' вычесть '0'.mixon46 писал(а): Мне что бы получить из '0'- 0
int x = y - '0'; // если y='9', то x будет 9
и не забивайте голову кодами символов - берите символ и им манипулируйте
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
это преобразование очень простое и возможно оно блвагодаря тому, что символы цифр в кодировке идут по порядку
почитайте несколько постов назад я это объяснял
почитайте несколько постов назад я это объяснял
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3886191#p3886191"]это преобразование очень простое и возможно оно блвагодаря тому, что символы цифр в кодировке идут по порядку
почитайте несколько постов назад я это объяснял[/uquote]
Да теперь это понятно. Теперь дошел смысл. Спасибо
почитайте несколько постов назад я это объяснял[/uquote]
Да теперь это понятно. Теперь дошел смысл. Спасибо
небольшой лайвхак для пользователей КВАВР (а может и не только, на других не проверял):
раньше я дербанил числа на разряды так: (отдельно делил и отдельно находил остаток)
но, сегодня меня окончательно догнала мысль, о том, что деление и остаток от деления - близнецы братья, а так-же подозрение о том, что квавр нерационально использует ресурсы...
Открываю ассемблеровский листинг программы и вижу, что функция деления (одна и та-же) вызывается дважды, но в качестве результата забирается информация из разных регистров... решил, почему, раз информация всёравно лежит, не забрать её вручную?
т.к. остаток от деления лежит в регистровой паре R26,27, написал функцию: и применил её в коде... скорость преобразования ожидаемо выросла в 2 раза.
___________________
Уважаемые коты, прошу комментариев: можно ли, и правильно ли так делать? не вылезут, ли какие нибудь подводные грабли?
Добавлено after 21 minute 8 seconds:
сделать в обратной последовательности (сначала остаток, потом вытащить результат деления) не получится, т.к. штатная функция получения остатка затирает результат деления
раньше я дербанил числа на разряды так:
Код: Выделить всё
while (out>0){
putchar(out%10+'0');
out/=10;};но, сегодня меня окончательно догнала мысль, о том, что деление и остаток от деления - близнецы братья, а так-же подозрение о том, что квавр нерационально использует ресурсы...
Открываю ассемблеровский листинг программы и вижу, что функция деления (одна и та-же) вызывается дважды, но в качестве результата забирается информация из разных регистров... решил, почему, раз информация всёравно лежит, не забрать её вручную?
т.к. остаток от деления лежит в регистровой паре R26,27, написал функцию:
Код: Выделить всё
unsigned int ostatok (void){#asm("MOVW R30,R26")}Код: Выделить всё
while (out>0){
out/=10;
putchar(ostatok()+'0');}___________________
Уважаемые коты, прошу комментариев: можно ли, и правильно ли так делать? не вылезут, ли какие нибудь подводные грабли?
Добавлено after 21 minute 8 seconds:
сделать в обратной последовательности (сначала остаток, потом вытащить результат деления) не получится, т.к. штатная функция получения остатка затирает результат деления
Нет гарантии, что нужными регистрами будут всегда именно эти R26 и R30.
т.к. деление, это функция и для её выполнения организуется требуемое ей свободное адресное пространство, то я не вижу причин для изменения назначенных регистров... кроме того эта функция одна на всю программу (все деления и остатки вызывают именно её) этот факт ещё больше ограничивает возможность компилятора чтото изменить в функции.
Добавлено after 33 minutes 25 seconds:
П.С. регистры с остатком R26, R27, а регистры R30, R31 это ретурн.
Добавлено after 33 minutes 25 seconds:
П.С. регистры с остатком R26, R27, а регистры R30, R31 это ретурн.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
из недостатков - квавр не понимает какого типа переменная возвращается и выдает предупреждение.
пока отключил предупреждерия для этой функции:не знаю правильно ли так делать или есть способ лучше?
пока отключил предупреждерия для этой функции:
Код: Выделить всё
#pragma warn-
unsigned int ostatok (void){#asm("MOVW R30,R26")}
#pragma warn+Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
правильнее и лучше применять стандартную функцию libc: div
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Лишний повод не использовать нестандартную фигню.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Приветствую. Подскажите есть такая запись
return mode > 0.5f;
Возвращает значение mode если больше чем 0.5f?
return mode > 0.5f;
Возвращает значение mode если больше чем 0.5f?
Не значение mode, а true/false
Понял. Это как условие. Если больше то true если меньше то false
- Сообщения: 1412
- Зарегистрирован: Вт июн 07, 2011 08:03:18
Равно куда то затерялось. Вот они характерные ошибки начинающих.)
- Сообщения: 349
- Зарегистрирован: Сб окт 20, 2007 14:12:03
Вот такой прикол, проект под 2560 и я не могу использовать конструкции типа PINH.2 то есть выше порта G выдает ошибку компиляции.
Никто не сталкивался?
Никто не сталкивался?
- Сообщения: 1412
- Зарегистрирован: Вт июн 07, 2011 08:03:18


