James D. 0 September 6 Posted September 6 · Report post Спасибо. Quote Share this post Link to post Share on other sites More sharing options...
x893 19 September 6 Posted September 6 · Report post 51 minutes ago, James D. said: unsigned long Обычно == uint64_t Quote Share this post Link to post Share on other sites More sharing options...
James D. 0 September 6 Posted September 6 (edited) · Report post Я только начал Си изучать, так что мне unsigned long привычнее (понятнее), чем uint64_t. Edited September 6 by James D. Quote Share this post Link to post Share on other sites More sharing options...
_pv 30 September 6 Posted September 6 · Report post 3 hours ago, James D. said: Я только начал Си изучать, так что мне unsigned long привычнее (понятнее), чем uint64_t. ну как наступите несколько раз на грабли что размеры int и long могут произвольно меняться в зависимости от архитектуры процессора и даже от компилятора. так сразу stdint.h станет понятнее и привычнее. стандарт вроде гарантирует только что размер char <= short <= int <= long, поэтому иногда встречаются и 16-ти битные char и 16-ти битные int. 1 Quote Share this post Link to post Share on other sites More sharing options...
James D. 0 September 6 Posted September 6 · Report post Понятно, спасибо. Quote Share this post Link to post Share on other sites More sharing options...
James D. 0 Thursday at 11:16 AM Posted Thursday at 11:16 AM · Report post Подскажите еще, как подправить этот код, чтобы вывести число в 16-ричном виде? Я хочу вывести на LCD1602 значение регистра TWSR. Если в TWSR 0xA0, то нужно вывести A0, а сейчас у меня на экране 160. Неудобно вручную переводить. void IntToStr(unsigned long val, char str[])//Перевод числа в строку ASCII символов { //~~~~~~~~~~~~~~~~~~~~~~~ signed char i = 0, j = 0; unsigned int digits[11]; //~~~~~~~~~~~~~~~~~~~~~~ while (val) { digits[i] = val % 10; i++; val = val / 10; }; i--; while ( i >= 0 ) { str[j] = (digits[i]+ 0x30); j++; i--; }; str[j] = 0x00; Quote Share this post Link to post Share on other sites More sharing options...
dimka76 30 Thursday at 11:24 AM Posted Thursday at 11:24 AM · Report post On 9/21/2023 at 2:16 PM, James D. said: Подскажите еще, как подправить этот код, чтобы вывести число в 16-ричном виде? void IntToStr(unsigned long val, char str[])//Перевод числа в строку ASCII символов В это функции никак. Или писать под это дело отдельную функцию, либо пользоваться универсальной библиотечной sprintf Quote Share this post Link to post Share on other sites More sharing options...
_pv 30 Thursday at 01:16 PM Posted Thursday at 01:16 PM · Report post const char hex[] = "0123456789ABCDEF"; str[0] = hex[(TWSR>>4) & 0x0F]; str[1] = hex[(TWSR ) & 0x0F]; 1 Quote Share this post Link to post Share on other sites More sharing options...
MrYuran 1 Thursday at 01:29 PM Posted Thursday at 01:29 PM · Report post while(end > begin) aux=*end, *end--=*begin, *begin++=aux; Повбывав бы.. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 122 Thursday at 02:01 PM Posted Thursday at 02:01 PM · Report post 42 минуты назад, _pv сказал: const char hex[] = "0123456789ABCDEF"; str[0] = hex[(TWSR>>4) & 0x0F]; str[1] = hex[(TWSR ) & 0x0F]; Вообще-то: static const char hex[] = "0123456789ABCDEF"; Ведь надеюсь - догадываетесь, что вопрошающий так и вставит это в функцию как есть, не задумавшись? 1 Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 83 Thursday at 02:04 PM Posted Thursday at 02:04 PM · Report post 1 минуту назад, jcxz сказал: Вообще-то: static const char hex[] = "0123456789ABCDEF"; Ведь надеюсь - догадываетесь, что вопрошающий так и вставит это в функцию как есть, не задумавшись? Учитывая особенности архитектуры AVR, это не сэкономит ОЗУ и строка окажется в ней все равно... Надо еще добавить квалификатор progmem добавить, ну и чтение через специальную функцию-макрос. Quote Share this post Link to post Share on other sites More sharing options...
dimka76 30 Thursday at 02:07 PM Posted Thursday at 02:07 PM · Report post On 9/21/2023 at 5:04 PM, Arlleex said: Учитывая особенности архитектуры AVR, это не сэкономит ОЗУ и строка окажется в ней все равно... Надо еще добавить квалификатор progmem добавить, ну и чтение через специальную функцию-макрос. Свежие IAR для AVR сами кажется умеют const во flash складывать и все особенности обращения скрывать под капотом. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 122 Thursday at 02:11 PM Posted Thursday at 02:11 PM · Report post 7 минут назад, Arlleex сказал: Учитывая особенности архитектуры AVR, это не сэкономит ОЗУ и строка окажется в ней все равно... Надо еще добавить квалификатор progmem добавить, ну и чтение через специальную функцию-макрос. Может быть. С AVR не работал никогда - особенностей их компиляторов не знаю. Впрочем и вопрошающий не указал про какой компилятор идёт речь. А ваш progmem рассчитан видимо на определённый компилятор. Я имел в виду, что static нужен, чтобы не было инициализации массива hex при каждом входе в функцию с таким кодом. Quote Share this post Link to post Share on other sites More sharing options...
dxp 18 Yesterday at 03:09 AM Posted yesterday at 03:09 AM · Report post 13 часов назад, dimka76 сказал: Свежие IAR для AVR сами кажется умеют const во flash складывать и все особенности обращения скрывать под капотом. Сомнительно. Объекты const должны обеспечивать взятие адреса и находиться в том же адресном пространстве, что и остальные объекты памяти. А flash (progmem) в AVR -- это другое, отдельное адресное пространство. Quote Share this post Link to post Share on other sites More sharing options...
James D. 0 Yesterday at 05:12 AM Posted yesterday at 05:12 AM · Report post 15 часов назад, _pv сказал: const char hex[] = "0123456789ABCDEF"; str[0] = hex[(TWSR>>4) & 0x0F]; str[1] = hex[(TWSR ) & 0x0F]; Спасибо! Quote Share this post Link to post Share on other sites More sharing options...