Remkomplekty.ru

IT Новости из мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Else without if ошибка

C Урок 8. Условные операторы if, else, else if

На данном уроке мы познакомимся с условными операторами. Иногда их называют «операторами ветвлений».

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

У нас было что-то похожее при применении цикла, но в случае использования условных операторов при соблюдении условия код будет выполняться только один раз.

Рассмотрим самый простой вариант условия, когда применяется только один оператор if, который с английского переводится как если.

В данном случае, если условие, находящееся в скобках будет выполняться, то мы попадаем в тело данной конструкции и выполняем находящийся в нём код. А в противном случае мы этот код пропускаем и проваливаемся ниже закрывающей фигурной скобки.

Теперь конструкция немного усложнится. Мы применим два оператора — if и else. Else с английского переводится иначе.

Образно мы можем данную конструкцию разделить на две части. Первая часть — это оператор if с условием и телом, а вторая — оператор else только с телом.

В данном случае код в теле первой части выполняется, если выполняется условие в скобках, а тело второй части, наоборот, — если данное условие не выполняется.

То есть если условие в скобках выполняется, мы попадаем в тело первого оператора if и выполняем код внутри него. Как только код в этом теле выполнился, то мы уже не попадаем в тело оператора else и пропускаем его.

А если условие в скобках ложное, то есть оно не выполняется, то мы перепрыгиваем тело первой части, а в тело второй части с оператором else мы попадаем и выполняем код, находящийся в нём.

Переходим к изучению ещё одного оператора — else if. Поэтому наша конструкция ещё немного усложняется

Здесь у нас получилось три части. Во второй части мы видим оператор else if. Сейчас постараюсь объяснить его значение.

Начнём с того, что условие в первой части с оператором if у нас выполнилось. Тогда мы, как и прежде, попадаем в его тело, выполняем там весь код и уже больше ни в какие тела нашей конструкции не попадаем и проваливаемся вниз.

Следующий вариант будет таким, что условие в первой части с оператором if у нас не выполнилось. Тогда мы, конечно же, в тело этой части не попадаем. Провалившись ниже, мы уже проверяем условие во второй части с оператором else if. Если это условие выполняется, то мы попадаем в его тело и выполняем там код, а в тело третьей части с оператором else мы уже не попадем. То есть получается что выполнится код только второй части.

Третий вариант будет такой, что ни первое, не второе условие у нас не выполняется. Тогда мы пропускаем тела первой и второй части и попадаем в тело третьей части с оператором else и выполняем его код.

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

Операторов else if с телом может быть несколько

В этом случае выполняется код тела того оператора, условие которого выполняется. Причем если выполняются условия нескольких операторов, то попадаем мы только в тело того оператора, который встретится интерпретатору первым, а интерпретатор, как известно просматривает код сверху вниз. Никакие другие тела не выполняются. Причем если выполняются условия нескольких операторов, то попадаем мы только в тело того оператора, который встретится интерпретатору первым, а интерпретатор, как известно просматривает код сверху вниз. Если не выполняется ни одно условие, то выполняется тело оператора else.

То есть во всех этих конструкциях, рассмотренных нами, выполняется всегда код только одного тела.

Также могут быть вложенные условия. Когда в теле одного из операторов будут ещё подобные конструкции. Но не будем пока этим забивать себе голову, там будет приблизительно всё так же, и увидим мы это в дальнейших уроках, когда будем писать наши коды. Также все данные конструкции могут быть и в телах циклов и в любых других телах, не обязательно в корне тела функции.

Читать еще:  Ошибка dxgi error device hung

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

Проект сделан из проекта MYPROG07 прошлого занятия и имя ему было присвоено MYPROG08.

Откроем файл main.c и в функции main(), как обычно, удалим весь код тела кроме возврата нуля, останется от него вот это

int main()

return 0 ; //Return an integer from a function

Объявим для начала целочисленную переменную

Else without a previous if error

My compiler is giving else without previous if error in the else if part.

The if part can be clearly seen. Is it due to the declaration in between. But why should a declaration cause problem? How to get around it?

Don’t use…silly?…language-bending macros like ‘#define FOR(a, b, c) for(a; b; c)’ without providing the definition. Actually, don’t use such macros, period. I’m puzzled what the ‘INCR(a, b, c)’ macro provides — is that ‘#define INCR(a, b, c) ((a) = ((b) + (c)))’? Or is the assignment to ‘c’ (or, perish the thought, ‘b’)? – Jonathan Leffler 28 ноя. 13 2013-11-28 12:36:09

That part in between is like a black hole, you can’t put anything there and get it back. – Raxvan 28 ноя. 13 2013-11-28 12:36:50

@JonathanLeffler INCR is not a macro it is a function. int INCR(int (&m_no)[9], int (&stock)[9],int d2incr) < int q=1; stock_clear(m_no,stock,d2incr+1); m_no[d2incr]=small_in_stock(stock,1); int temp=m_no[d2incr]; ++stock[temp-1]; >and Raxvan Thanks. «problem» solved – Soumadeep Saha 28 ноя. 13 2013-11-28 13:15:16

Do not use all caps for functions: it is an ancient tradition that ALL_CAPS means «here there be macros». – Yakk 28 ноя. 13 2013-11-28 13:32:45

@Yakk it is a macro. 😛 – Soumadeep Saha 03 дек. 13 2013-12-03 18:23:09

8 ответов

The definition int temp = number[i]; follows after the previous if and prevents the else from belonging to it, or anything else. Hence the error. You’d have to move the definition before the if statement, or otherwise rethink the logic.

int temp=number[i]; is set at an invalid postition. Move in front of the if or inside else .

Создан 28 ноя. 13 2013-11-28 12:36:20 JeffRSon

// int temp=number[i]; ->>>> Place this statement in another appropriate position. //else block shold follow the if block

So the code should be

place int temp=number[i]; according to your logic

Создан 28 ноя. 13 2013-11-28 12:37:40 Damodaran

Let’s look at the code where the error occurs:

You can only use else if it is the statement that immediately follows the if . And it is not. You have declared a new variable, temp .

This breaks the syntax of the if-else statement. You should move the declaration outside the if-else statement.

Which ‘this’ breaks the syntax? – Jonathan Leffler 28 ноя. 13 2013-11-28 12:42:05

is at the wrong position.

Now there must immediately an:

If there is any other statement, you are outside your if -block and else is not allowed.

or an ‘else if’ – Lightness Races in Orbit 28 ноя. 13 2013-11-28 14:47:30

Place this line somewhere else.

Secondly, else HAS TO BE immediately after the closing bracket of if . In your case, it is a declaration after if ‘s closing bracket.

The reason this is causing a problem is simply because it breaks the syntax rules for the language. The compiler assumes there is no else block if it doesn’t follow immediately after the if block. You can put whitespace in between, but absolutely nothing else.

You’ve got 4 possibilities for where you could put that declaration line:

  1. Before the whole if/else structure.
  2. After the whole if/else structure.
  3. Within the if block.
  4. Within the else block.

I’d recommend the 1st one, or possibly the 4th (depending on whether you’re using the temp variable later).

If you think about it logically, trying to put the declaration between the if and else blocks doesn’t make sense. It makes it unclear if and when it actually gets executed in relation to the rest of the control structure.

Читать еще:  Отчет об ошибке

Arduino.ru

Помогите с кодом, пожалуйста.

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

Подскажите с ошибками в коде.

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

Убрать из строки 41 левый символ

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

А какой именно из них?

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

убрал. просто очистил строку.

но вылезло следующее. ISO C++ forbids comparison between pointer and integer

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

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

Спасибо. Ошибок больше нет. Но и желаемого результата тоже=(

В данный момент, отрезок кода, имеет такой вид:

Но Переменная всё равно не выводится. Символы с клавиатуры идут. Затем я нажимаю «В». и ничего не происходит.

Я ожидал увидеть так.

я нажимаю символы. После чего Проверяется условие, есть ли в буфере В. Если оно есть, то Печатаются все символы, набранные до В и само В.

Я изначально не так наваял код?

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

Если B латинская, то всё должно работать.

Одно непонятно, зачем вводить с матричной клавиатуры и из Serial.

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

То, что символы введённые с клавиатуры, печатаюся, это временное явление — потом оно уберётся. что бы меньше шелухи поступало в процессинг.

По поводу В. Да, она была латинской. Заменил на другой символ. Ничего не вышло.

Даже более того, такое ощущение, что он не сравнивает.

После этого добавил в действия при совпавшем условии println. Но не тут-то было. не пишет.

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

Проблема не решена. Всё зависло в воздухе. помогите, кто знает. светч выглядит сейчас так.

у меня просто прям чутьё, что именно в этом месте загводка. — while (Serial.available())

Но понять почему, я не могу.

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

Исключите из лексикона слово процессинг, потому что ArduinoIDE — это не процессинг.

Вы нигде не написали, что и на какой клавиатуре нажимаете. Какой используете монитор для связи с ардуиной. Без этого сложно что либо сказать, потому что скетч вполне нормально выглядит.

Лично я закомментарил бы строки 35-40 (включительно и именно так). Потом добавил бы строку очистки входного буфера после строки 45. Типа:

Затем загрузил бы скетч и вводил в мониторе «123B», кнопка send. Если не получил в ответ ничего, то закомментарил бы строки 43, 48-51.

Программирование ладно, но с логикой надо дружить.

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

Используется матричная клавиатура. Нажимаю на ней символы и затем В. — по условию, должны печататься все ранее нажатые символы(если я правильно понимаю).

По поводу закомментировать строчки — попробовал, не вышло. очистка переменной — да, забыл)

Какой монитор для связи с ардуино — это как трактовать? — запустил скетч — нажал монитор порта. проверяю. ничего военного) — или я не понял суть вопроса?

кнопка send — тоже не понял.

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

Стоит отметить, что символы с клавиатуры, в мониотр порта выводятся исправно. Если написать просто условие, что-то на подобие:

То сравнение проходит. следовательно Морока, в строке — while ( Serial .available()), ну или на крайний случай if (inputchar == ‘B’ ). потому что идёт сравнение составляющей массива со строкой — (как-то запутанно). в любом случае, что бы наступил мир и покой для моего головного мозга, мне просто необходимо сравнить символы с клавиатуры со строкой (просто ввести код -больше 3х символов и если он равен, то запустить процедуру) . Мои товарищи подсказать не смогли — разводят руками — мол, должно работать.

Если вы видите простое решение проблемы, будте добры — напишите его пожалуйста (просто кусок скетча, что бы я ег овставить и оно заработало) — я отблагодарю(материально, если потребуется).

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

Вы внимательно посмотрите что куда вы сохраняете, и что куда выводите.

Читать еще:  C2131 ошибка мерседес

Выводите вы переменную inp. Внее данные попадают из переменной inputchar, которая, в свою очередь получает что-то из Serial.

То есть имеем цепочку Serial->inputchar->inp

Вопрос: где в ней ваша клавиатура и почему вы ждете что введенные с нее символы будут выводится?

Вот этот кусок кода:

Таки может и будет выводить все что прочитало с внешней клавиатуры (коды клавиш). Но СРАЗУ. Без всяких «B» и проч запоминаний. Работа с Serial и работа с клавиатурой — у вас живут отдельной жизнью.

P.S. Кстати «B» и «b» — это разрные символы. Так что смотрите еще и за тем какую b вы шлете в мониторе.

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

Клавиатура в этьой цепочке здесь — char inputchar = Serial.read();

считывание сигнала из монитора порта -поправьте, если я не прав.

В у меня одна и та же — для проверки взял её из массива символов для клавиатуры

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

Клавиатура в этьой цепочке здесь — char inputchar = Serial.read();

Я тут не вижу никакой работы с клавиатурой. Я вижу считывание символа из Serial порта.

Или, если вы настаиваите что это чтение клавиатуры, то устаканьте терминологию. Давайте уберем неоднозначность. Предлагаю «клавиатурой» называй, ту клавиатуру которая подключен к компьютеру, которой вы пользуетесь когда пишите тут на форуме, а ту которая подключена напрямаю к ардуине называть «кейпадом».

Итак, используя эти два понятия «клавиатура» и «кейпад». Попробуйте еще раз описать где и что вы нажимаете, и что ожидаете.

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

Все эти левые символы — ад копипастеров. Пишите код сами.

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

Хорошо. будь по вашему)

Символы с кейпада поступают в сериал порт.

С помощью кейпада нажимаю цифры(любые — допустим 123) — и затем нажимаю (на кейпаде) В.

Цифры выводятся в монитор порта. Они считываются этой командой — char inputchar = Serial.read();

И после нажатия В (на кейпаде) — должна вывестись переменная inp. С ‘B’, или без енё это уже не важно.

Но этого не происходит.

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

Символы с кейпада поступают в сериал порт.

То есть, вы утверждаете, что:

1. Кейпад имеет Serial интерфейс
2. К арудине он подключен двумя проводками на Rx (D0) /Tx (D1) пины (плюс земля, и, возможно питание).

Эти утверждения соотвествуют реальности?

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

Хорошо. будь по вашему)

Да мне вообще-то это не очень-то и нужно 😉 Я просто пытаюсь помочь вам.

В первую очередь все эти вопросы нацелены на то, что-бы вы сами над ними задумались. Почему они возникают.

Потому что они могут:
1. Содержать в себе ответы на вашу проблему
2. Быть маркерами того, что на форуме вы тоже делаете «что-то нето». Обязанность за то что бы ОДНОЗНАЧНО и ПОЛНО передать картину — лежит целиком на вас.

А «неоднозначность в описании» может свидетельстововать о «неоднозначности в голове». А это может находить отражение и в коде. Так как на форуме может кто-то и «догадается», то сама ардуина — что ей сказали, то и будет делать 🙂

Пока же, вы сделали основные ошибок новичка:
1. Назвали тему черти-как. Как вы думете, в форуме «программирование» много тем, которые по сути не являются просьбой о помощи с кодом? так что, вообще все темы так называть? Как потом ориентироваться? Зачем тогда вообще придумали название тем? Я, обычно, вообще темы типа «помогите новичку», «помогите с кодом», «не работает скетч» — игнорирую.
2. Ни фига не описали какое у вас железо (какая плата, что за кейпад, что за либы используете, что и куда подключаете. ): в резульатате нужно либо догадываться/предполагать, либо вытягивать из вас как из партизана на допоросе.

Не сделали ошибок «новичка» (в плохом смысле):
1. Нормально вставили код 🙂
2. Явно пытаетесь сами что-то делать, а не просто «а. помогите».
3. Пытаетесь выполнять советы, а не спорить и указывать другим что нужно делать (бывают и такие персонажи 😉

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×