James D. 0 6 сентября, 2023 Опубликовано 6 сентября, 2023 · Жалоба Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 6 сентября, 2023 Опубликовано 6 сентября, 2023 · Жалоба 51 minutes ago, James D. said: unsigned long Обычно == uint64_t Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
James D. 0 6 сентября, 2023 Опубликовано 6 сентября, 2023 (изменено) · Жалоба Я только начал Си изучать, так что мне unsigned long привычнее (понятнее), чем uint64_t. Изменено 6 сентября, 2023 пользователем James D. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 6 сентября, 2023 Опубликовано 6 сентября, 2023 · Жалоба 3 hours ago, James D. said: Я только начал Си изучать, так что мне unsigned long привычнее (понятнее), чем uint64_t. ну как наступите несколько раз на грабли что размеры int и long могут произвольно меняться в зависимости от архитектуры процессора и даже от компилятора. так сразу stdint.h станет понятнее и привычнее. стандарт вроде гарантирует только что размер char <= short <= int <= long, поэтому иногда встречаются и 16-ти битные char и 16-ти битные int. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
James D. 0 6 сентября, 2023 Опубликовано 6 сентября, 2023 · Жалоба Понятно, спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
James D. 0 21 сентября, 2023 Опубликовано 21 сентября, 2023 · Жалоба Подскажите еще, как подправить этот код, чтобы вывести число в 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 21 сентября, 2023 Опубликовано 21 сентября, 2023 · Жалоба On 9/21/2023 at 2:16 PM, James D. said: Подскажите еще, как подправить этот код, чтобы вывести число в 16-ричном виде? void IntToStr(unsigned long val, char str[])//Перевод числа в строку ASCII символов В это функции никак. Или писать под это дело отдельную функцию, либо пользоваться универсальной библиотечной sprintf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 21 сентября, 2023 Опубликовано 21 сентября, 2023 · Жалоба const char hex[] = "0123456789ABCDEF"; str[0] = hex[(TWSR>>4) & 0x0F]; str[1] = hex[(TWSR ) & 0x0F]; 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 21 сентября, 2023 Опубликовано 21 сентября, 2023 · Жалоба while(end > begin) aux=*end, *end--=*begin, *begin++=aux; Повбывав бы.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 сентября, 2023 Опубликовано 21 сентября, 2023 · Жалоба 42 минуты назад, _pv сказал: const char hex[] = "0123456789ABCDEF"; str[0] = hex[(TWSR>>4) & 0x0F]; str[1] = hex[(TWSR ) & 0x0F]; Вообще-то: static const char hex[] = "0123456789ABCDEF"; Ведь надеюсь - догадываетесь, что вопрошающий так и вставит это в функцию как есть, не задумавшись? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 21 сентября, 2023 Опубликовано 21 сентября, 2023 · Жалоба 1 минуту назад, jcxz сказал: Вообще-то: static const char hex[] = "0123456789ABCDEF"; Ведь надеюсь - догадываетесь, что вопрошающий так и вставит это в функцию как есть, не задумавшись? Учитывая особенности архитектуры AVR, это не сэкономит ОЗУ и строка окажется в ней все равно... Надо еще добавить квалификатор progmem добавить, ну и чтение через специальную функцию-макрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 21 сентября, 2023 Опубликовано 21 сентября, 2023 · Жалоба On 9/21/2023 at 5:04 PM, Arlleex said: Учитывая особенности архитектуры AVR, это не сэкономит ОЗУ и строка окажется в ней все равно... Надо еще добавить квалификатор progmem добавить, ну и чтение через специальную функцию-макрос. Свежие IAR для AVR сами кажется умеют const во flash складывать и все особенности обращения скрывать под капотом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 сентября, 2023 Опубликовано 21 сентября, 2023 · Жалоба 7 минут назад, Arlleex сказал: Учитывая особенности архитектуры AVR, это не сэкономит ОЗУ и строка окажется в ней все равно... Надо еще добавить квалификатор progmem добавить, ну и чтение через специальную функцию-макрос. Может быть. С AVR не работал никогда - особенностей их компиляторов не знаю. Впрочем и вопрошающий не указал про какой компилятор идёт речь. А ваш progmem рассчитан видимо на определённый компилятор. Я имел в виду, что static нужен, чтобы не было инициализации массива hex при каждом входе в функцию с таким кодом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 22 сентября, 2023 Опубликовано 22 сентября, 2023 · Жалоба 13 часов назад, dimka76 сказал: Свежие IAR для AVR сами кажется умеют const во flash складывать и все особенности обращения скрывать под капотом. Сомнительно. Объекты const должны обеспечивать взятие адреса и находиться в том же адресном пространстве, что и остальные объекты памяти. А flash (progmem) в AVR -- это другое, отдельное адресное пространство. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
James D. 0 22 сентября, 2023 Опубликовано 22 сентября, 2023 · Жалоба 15 часов назад, _pv сказал: const char hex[] = "0123456789ABCDEF"; str[0] = hex[(TWSR>>4) & 0x0F]; str[1] = hex[(TWSR ) & 0x0F]; Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться