Ага, спасибо. Нашел 5-й IAR 2000-го года. На нем сходу скомпилировалось без ошибок и предупреждений. А со сборкой - облом. Тот паренек ушлый оказался - сделал пару ссылок на внешние модули чтоб без него пересобрать нельзя было
_________________ Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
пока все у меня объявлены как беззнаковые проблем нет. Но мне хочется переменную timezone объявить знаковой, так как она может быть и отрицательной. Так вот стоит это сделать, как получаю предупреждение:
Код:
main.c:421: warning: (373) implicit signed to unsigned conversion
Можно ли сделать, чтобы при отрицательном timezone оно вычиталось бы? Беззнаковость unixtime хотелось бы сохранить - 32 разряда и так еле хватает. Пока я вижу вариант - делать две ветви для положительного и отрицательного. В одном суммировать, а вдругом вычитать абсолютное беззнаковое значение.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Немного достаёт новый XC микрочиповский. Особенно, предупреждениями о неявном преобразовании знаковый-беззнаковый.
Предупреждает и правильно делает, это довольно распространенный тип ошибок. Например, чему равно -10 + 5U? Ответ 4294967291, хотя компилятор такой код с константами и не пропустит, но если речь идет о переменных и это часть более сложного выражения, то можно получить не самую очевидную ошибку.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Всем привет! Требуется в массиве tmp получить строку из четырех символов (цифры).
Код:
uint16_t data = 0012; char tmp [4]; sprintf(tmp, "%u", data );
В массиве, при этом,появляется '1' '2' '\0' '\0'. Как заставить sprintf вывести в массив строку '0012'? Два нуля sprintf интерпретирует как конец строки. А если включить оптимизацию (юзаю IAR), то он еще и символ пробела добавляет.
Зарегистрирован: Ср сен 13, 2017 05:53:24 Сообщений: 31
Рейтинг сообщения:0
Здравствуйте, помогите упростить код если это возможно, есть 2 кейса практически идентичных, в первом кейсе выключает затем включает пин МК, во втором наоборот включает а затем выключает, можно ли это собрать как то в функцию при этом уменьшив объем занимаемого кода :
Код:
case 1: if (flag==0){ PORTB &=~(1<<PB1); if (tic>=Timer1){flag++; tic= 0;}
}
else { PORTB |= (1<<PB1); if (tic>=Timer2){tic = 0; flag=0;}
}
break;
case 2: if (flag==0){ PORTB |= (1<<PB1); if (tic>=Timer1){flag++; tic= 0;}
}
else { PORTB &=~(1<<PB1); if (tic>=Timer2){tic = 0; flag=0;}
char tmp; switch(???){ case 1: tmp = flag; break; case 2: tmp = !flag; break; }
if (tmp==0){ PORTB &=~(1<<PB1); if (tic>=Timer1){flag++; tic= 0;} } else { PORTB |= (1<<PB1); if (tic>=Timer2){tic = 0; flag=0;} }
слабое место - я не знаю, сколько там у вас всего вариантов case было... поэтому в моём варианте переменная tmp будет неопределена для всех ваших вариантов, кроме 1 и 2.
скорее всего оптимизация вашего кода должна быть глубже, чем только этот кусочек
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Как заставить sprintf вывести в массив строку '0012'?
Про %04u вам уже сказали, но при этом нужно либо размер tmp увеличить до 5 - поскольку терминатору место нужно. Или использовать snprintf, контролирующий "берега" приёмного буфера. Ну и написать либо data = 12 либо data = 014.
А если включить оптимизацию (юзаю IAR), то он еще и символ пробела добавляет.
Как уже сказано выше sprintf помещает в буфер три символа - пробел в этой позиции был изначально. Оптимизация просто сменила полжение буфера и там оказался немножко другой "мусор".
_________________ Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR!
Доброго времени суток. Читаю про хорошие манеры программирования на Си. Один из пунктов: "По возможности используйте do { } while(выражение)". Нигде не могу найти объяснение, чем оно лучше while(выражение) { }.
в общем случае "while(){}" использует дополнительную команду перехода
в общем случае - это рядом со сферическим конём в вакууме? в общем случае как раз наоборот, между всеми вариантами циклов while, for и do нет никакой разницы, а вот в частных случаях она может появляться.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Тело цикла do ... while() выполняется по крайней мере один раз. Многие компиляторы код проверки условия и переход на начало тела цикла располагают после тела цикла. Код, генерируемый для циклов for(){} и while() {} отличается тем, что для обеспечения проверки условия перед первой итерацией цикла, генерируется команда перехода на проверку условия. То есть для цикла
Отсюда видно, что наиболее короткий и простой код генерируется для цикла do...while(). Но пользоваться лучше тем, который больше подходит для данного конкретного случая.
Последний раз редактировалось Const14 Пт окт 27, 2017 09:26:15, всего редактировалось 4 раз(а).
Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения