Свежие обсуждения
Микроконтроллеры

Поясните по Си

1 4 8

В каком смысле "крутился на месте" ? В этих блоках циклы? Если без циклов, то там дальше должен код выполняться.

 

Циклов нет - по условиям меняются значения переменный и ппосле выполнения указатель стова встает на первый IF ...

 

Wladimir_TS: IF A=B {

Там действительно так написано ?
Как это удалось откомпилировать ?
По правилам Си должно быть: IF (A==B) {....

 

Tadas: По правилам Си должно быть: IF (A==B) {....

Если уж вообще по правилам, то так: if (A==B) {.... } else {....}

 

Кстати, да, я думал вы это образно написали A=B . Не может такое компилироваться( без макросов если).
Хотя в данном конкретном случае кто его знает, си он такой... Чего только стоит вот это - i=++i+ ++i; Многим шаблон сломало.
А на счет зацикленности - может там безусловные переходы есть? Других вариантов не вижу, ну или рекурсия еще(если if-ы в функции находятся).

 

Tadas: IF A=B {

Там действительно так написано ?
Как это удалось откомпилировать ?

if (A=B)

Это законная операция, но не то что вы хотели. Компилятор понимяет это так: то что было в B присваивается в A. Если это не ноль, то результат проверки TRUE.

int А;
А = 1;
if(А=4){
printf("%d", А);
}

напечатает 4, потому как в А присвоится 4 и результат проверки будет положительный.

Такой "С" загадочный зверек.

Что касается размера кода, то конечно для 8 битного контроллера трудно соревноваться с машинным кодом. В России принято говорить а "ассемблером", но ассемблер это программа переводящая символическую запись типа
MOV R20, R0
в двоичное число означающее эту операцию. Но из простой программы 34К получится только если прилинкуются библиотеки.

Для AVR поучительно смотреть на сгенерированный код после компилятора. Никаких сюрпризов обычно нет, но сразу видно что не так.

 

Tadas: Там действительно так написано ?

На самом деле там логическая операция - я образно писал.

Завтра с работы кусок выложу.

Задача собственно - исправить программу на СИ

 

alexf58: Это законная операция, но не то что вы хотели.

Я, собственно, ничего не хотел, только обратил внимание, что выражение после if не заключено в скобки.

 

Нельзя тут образно, ибо = и == разные вещи.

 

Tadas: Я, собственно, ничего не хотел

У меня "вы" с маленькой буквы, собирательное. Не конкретно Вы.

Просто это наверное самая частая ошибка людей привыкших к другим языкам: Паскалю, Бейсику и т.д. Плохо что такая конструкция не иомечается как ошибка, но так уж устроен язык. И достаточно часто используют специально.

Например

if(flag = UART_STATUS)
data = UART_DATA;

тут UART_STATUS читается в переменную flag, и если она отлична от нуля, то читаются данные из регистра. Более наглядно, но длиннее:

flag = UART_STATUS;
if(flag != 0)
data = UART_DATA;

Я стараюсь избежать таких сокращений с потерей наглядности, т.к. легко пропустить опечатку.