It’s just what your error say!!break
statement has to be within the body of a loop
, if
or switch-case
and takes the control out of that block.This is what you should use here instead of break if you want to end the program at that point:
exit(0); //0 means successful termination, non-zero value means otherwise.
I am afraid your program needs an overhaul if you want the whole thing to repeat again.The logic is faulty.Let me check…
Edit Well,here’s your full working program.I am sure you will understand the changes made.Else tell your confusions (if any) in a comment.Here’s a brief explanation of the changes:
Th return
statements in your prompt_contineu()
function needed a little change,the getchar()
there was not needed at all, there was no condition in the while
loop in the main()
function and its body was not well defined within {}
, and last but not the least, the prompt_continue()
function needed to be invoked within the while
loop to get the job done.I hope you can see what the continue
statement does. By the way this evil program said I am FRIGGIN OLD
#include <stdio.h>
#include <string.h>
static int prompt_continue (const char *prompt)
{
printf("%s", prompt);
char answer[5];
if (scanf("%1s", answer) != 1)
return 0;
if (answer[0] == 'y' || answer[0] == 'Y')
{
return 2;
if (answer[0] == 'n' || answer[0] == 'N')
return 3;
}
return 0;
}
int main(void)
{
/*Creates a simple program using if else example. */
int age;
while (1)
{
printf("Welcome, this program is designed for if else statements.n");
printf("Please enter your age.n");
scanf (" %d", &age); /*Enters age.*/
if (age < 18)
printf("You are young!n");
else if (age > 18)
printf("Ah you're old!n");
printf(" Woot.n");
if(prompt_continue("Do you want to try again? Y/N")==3)
break;
else
continue;
}
return 0;
}
Компилятор G ++ выдает следующую ошибку:
error: break statement not within loop or switch
Пока мой код выглядит следующим образом:
#include <iostream>
using namespace std;
int number;
int main() {
cout << "Let's check whether an integer is even or odd." << endl;
cout << "Input new for checking a new number." << endl;
cout << "Input 0 when done." << endl;
cout << "Enter a number to check whether it's even or odd." << endl << endl;
cin >> number;
if (number == 0) {
cout << "Aborted." << endl;
break;
} else if (number % 2 == 0) {
cout << "Number is even." << endl;
} else {
cout << "Number is odd." << endl;
}
return (0);
}
Как видите, break
заявление является в цикле, if
петля, чтобы быть точным. Так почему же он дает эту ошибку?
-2
Решение
Сообщение об ошибке достаточно ясно
ошибка: оператор разрыва не в пределах петля или же переключатель
Где в вашем коде есть цикл или оператор swictch, с которым вы используете оператор break?
Просто удалите оператор прерывания отсюда
if (number==0) {
cout<<"Aborted."<<endl;
break;
}
и пиши просто
if (number==0) {
cout<<"Aborted."<<endl;
}
Там же написано, что в вашей программе используется цикл. Так что программа может выглядеть
#include <iostream>
int main()
{
std::cout << "Let's check whether an integer is even or odd." << std::endl;
std::cout << "Input new for checking a new number." << std::endl;
std::cout << "Input 0 when done."<< std::endl;
while ( true )
{
std::cout << "nEnter a number to check whether it's even or odd (0-exit): ";
int number = 0;
std::cin >> number;
if ( number == 0 ) break;
if ( number % 2 == 0 )
{
std::cout<< "Number is even." << std::endl;
}
else
{
std::cout << "Number is odd." << std::endl;
}
}
return 0;
}
1
Другие решения
«break» предназначен для выхода из циклов switch / do / while / for (не для операторов if). В вашем примере нет необходимости в разрыве, поток программы просто продолжит выполнение оператора return (0), когда он достигнет того места, где сейчас находится оператор break.
0
Оператор break работает, только если он находится в цикле. Под циклом в C ++ это означает цикл, цикл while и цикл do … while. if
это проверить условие, когда отрываться от петли.
Если вы хотите, чтобы ваша программа работала (без перезапуска), поместите тестируемые операторы if в цикл (например, в цикл for).
0
Простейший цикл, который я использую:
do
{
if (number==0)
{
cout<<"Aborted."<<endl;
break;
}
else if( ... )
...}while(0);
Это будет цикл ровно один раз.
0
I am getting this error in my C code. I don’t know what I am doing wrong. If I comment this code my program works. This piece of code is inside int main().
if(argc!=2 && strcmp(argv[0],"selection-sort")==0 && strcmp(argv[1],"input.txt")==0 && strcmp(argv[2],"output.txt")==0)
{
printf("The command line arguments are correct.n");
}
else
{
printf("The command line arguments are wrong.I am exiting.n");
break;
}
paldepind
4,5603 gold badges30 silver badges35 bronze badges
asked Aug 22, 2012 at 19:37
4
The way it looks I think you’re not in a loop but just checking args in main. You probably want something like return 1
or exit(1)
instead of the break.
answered Aug 22, 2012 at 19:38
cnicutarcnicutar
176k25 gold badges358 silver badges389 bronze badges
5
First of all make sure you are including the needed header files:
#include <stdio.h>
#include <stdlib.h>
The break command is used for exiting loops, you are not in a loop you are just in an else statement, you have nothing to break from. The code flow executes normally after passing that else statement. If you want to exit the program in that else statement you could do something like this:
else
{
printf("The command line arguments are wrong.I am exiting.n");
return 1; //exit program with status 1 to indicate a non normal exit
}
Or if you want to continue the program after displaying that message you could just do this:
else printf("The command line arguments are wrong.I am exiting.n");
//more code here
You only use break in loops like so:
while(foo) //while foo is true
{
break; //exit the loop
}
answered Aug 22, 2012 at 19:42
Keith MillerKeith Miller
1,3371 gold badge16 silver badges32 bronze badges
The error message in the title says it all: break
can only be used to exit a loop or prevent a case from falling through. MSDN quote:
The break statement terminates the execution of the nearest enclosing
do, for, switch, or while statement in which it appears.
To leave a function use return
.
answered Aug 22, 2012 at 19:40
TudorTudor
61.2k12 gold badges99 silver badges142 bronze badges
Break is supposed to be used in loops.
Use a return statement, which causes execution to leave the current subroutine and resume at the point in the code immediately after where the subroutine was called (return address).
answered Aug 22, 2012 at 19:42
fabiorochafabiorocha
1401 silver badge14 bronze badges
The other answers are correct, this is just a slight addition.
To return probably in this specific case you should include errno.h
like this:
#include <errno.h>
And furthermore return like this:
return EINVAL;
Then you are signaling that the program is terminating due to an error and the return value specifically states that the error is invalid arguments.
answered Aug 22, 2012 at 19:57
paldepindpaldepind
4,5603 gold badges30 silver badges35 bronze badges
‘break’ will only get you out of the innermost loop or switch. You can use ‘return’ to exit out of a function at any time.
«A break statement may appear only in an iteration statement or a switch statement, and terminates execution of the smallest enclosing such statement».
And it makes sense too — you can «escape» from a method with «return» , and you can skip code in other situations with an if/else. I don’t know what a «break» outside a case would be expected to do.
‘break’ is really only a restricted form of ‘goto’ anyway. Ideally, you want a single point of exit from any block of code. You should really only use ‘break’ in a switch statement because that is the only way to make it work. In any other context, there are better ways to accomplish the same thing. The same applies to ‘continue’.
answered Feb 26, 2014 at 5:26
Suraj K ThomasSuraj K Thomas
5,6854 gold badges51 silver badges64 bronze badges
pusherlove 0 / 0 / 0 Регистрация: 01.02.2017 Сообщений: 18 |
||||
1 |
||||
10.01.2020, 15:10. Показов 8675. Ответов 3 Метки нет (Все метки)
__________________
0 |
Диссидент 27209 / 16962 / 3749 Регистрация: 24.12.2010 Сообщений: 38,147 |
|
10.01.2020, 15:20 |
2 |
while (i!=1); Точку с запятой убери.
0 |
3985 / 3255 / 909 Регистрация: 25.03.2012 Сообщений: 12,102 Записей в блоге: 1 |
|
10.01.2020, 15:22 |
3 |
ну и зачем тут break? какой в нём смысл? Что такое while(i!=1) если у тебя i нигде не задаётся?
0 |
Байт |
10.01.2020, 15:25
|
Не по теме: Kuzia domovenok, на общую бредовость кода внимания не обратил.:D
0 |
0
1
Вопрос касается использования ({})-расширения.
for(int i=0;i<3;({break;}));
-> error: break statement not within loop or switch
for(int i=0;i<3;i++)
for(int j=0;j<3;({break;}))
printf("%d - %dn",i,j);
-> 0 - 0
1 - 0
2 - 0
То есть в первом случае компилятор не дает использовать ({break;}) внутри «шапки» (не знаю, как правильно назвать) цикла, а во втором преспокойно обрывает цикл, в шапке которого он указан. Получается, на этапе обработки семантических ошибок он рассматривает брэйк внутри внешнего цикла, а на этапе трансляции перемещает его во внутренний.
Гцц-4.4.4, сейчас собираю 4.5.2. Раньше, емнип, такого безобразия я не наблюдал, и компилятор на обоих этапах вел себя будто брэйк относится к тому циклу, в шапке которого указан. Мне кажется это логичным: третья часть (step) шапки for-а должна выполняться после каждой итерации, таким образом вырубать цикл после первого прохода.
ПС. Изврашаться с языком приходится, чтобы соорудить макрос.
-
Имеется у меня Iskra Neo, мембранная клавиатура 4х4 и дисплей на ST7920. Захотелось мне сделать простенький калькулятор. Насмотревшись всякого разного, понял, что стоит использовать для сего чудного дисплея использовать библиотеку U8glib. Вооружившись своим стандартным набором (паяльник, слабоумие и отвага) все подключил. Осталось дело, как казалось, за малым — скетчем. Изучив всемирную паутину, я понял, что так и не смог найти примера калькулятора с использованием библиотеки u8glib. Найдя пример обычного калькулятора с дисплеем 16х2, попытался переиначить его под свои нужды:
#include <U8glib.h>
#include <Keypad.h>
U8GLIB_ST7920_128X64 u8g(10, 11, 12, U8G_PIN_NONE); // настройка пинов
long num1,num2 ;
double total;
char operation,button;const byte ROWS = 4;
const byte COLS = 4;char keys[ROWS][COLS] = {
{‘1’,‘2’,‘3’,‘+’},
{‘4’,‘5’,‘6’,‘-‘},
{‘7’,‘8’,‘9’,‘*’},
{‘C’,‘0’,‘=’,‘/’}
};
byte rowPins[ROWS] = {0,1,2,3}; // подключение к строкам клавиатуры
byte colPins[COLS] = {4,5,6,7}; // подключение к столбцам клавиатуры
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);// Этот код выполняется только один раз: при включении платы
void setup()
{
u8g.setFont(u8g_font_6x10); // Выбор шрифта}
void loop()
{
sprintf(num1, «%d»,num2); // функция sprintf переведёт число в строковый массив
// Циклы удобны для чтения нажатых кнопок клавиатуры
while(1)
{
// Первый цикл. Здесь мы читаем клавиатуру и составляем наше первое число.
// Он выполняется, пока мы не нажмем кнопку оператора, и цикл прервется,
// или, если будет нажата кнопка ‘C’, всё начнется с начала.
button = customKeypad.getKey(); // Чтение кнопки
if (button==‘C’) // Если пользователь хочет сбросить набор первого числа
{
num1=0;
num2=0;
total=0;
operation=0;
}
if (button >=‘0’ && button <=‘9’) // Если пользователь нажал на числовое значение, один символ за раз
{
num1 = num1*10 + (button —‘0’);
// Наши числовые значения лежат в диапазоне от 0 до 9, что означает, что это единицы.
// Когда мы умножаем на 10, мы, по сути, добавляем 0 после числа.
// Затем мы добавляем новое введенное число на место нуля.
// Что касается (button -‘0’), это простой трюк с таблице ASCII. Цифры 0…9 в таблице ASCII
// это 48…57 (в десятичном виде), поэтому, вычитание ‘0’ из любого из этих символов дает
// соответствующее значение в десятичном виде. Например, символ ‘5’ = 53 в десятичной системе
// минус 48 (символ нуля) дает нам значение 5.
// Если наше предыдущее число было, например, 25, мы получили 250 умножением его на 10,
// а затем добавили 5, и получили 255, что и будет выведено на U8G.
do
{
u8g.setPrintPos(0,10); // Выбор первой строки на U8G
u8g.print(num1); // Печать текущего значения числа num1
}
while(u8g.nextPage());
}
if (num1 !=0 && (button==‘-‘ || button==‘+’ || button==‘*’ || button==‘/’))
{
// Если пользователь завершил ввод цифр
operation = button; // запоминаем, какое математическое действие пользователь хочет выполнить
do {
u8g.setPrintPos(0,20); // установить курсор на строку 2
u8g.print(operation); // напечатать наш оператор
}
while(u8g.nextPage());
break;
}}
while(1)
{
// Второй цикл, он выполняется пока пользователь не нажмет ‘=’ или ‘C’.
// И тогда будет выведен результат или сброшена программа.
if (button ==‘C’)
break; // Это обрабатывает случай, когда пользователь нажал кнопку оператора и захотел сбросить
button = customKeypad.getKey();
if (button==‘C’) // Еще раз проверяем, не хочет ли пользователь сбросить
{
num1=0;
num2=0;
total=0;
operation=0;
break;
}
if (button >=‘0’ && button <=‘9’) // Получение символов от клавиатуры для числа 2
{
num2 = num2*10 + (button —‘0’);
do {
u8g.setPrintPos(10,10);
u8g.print(num2);
}
while(u8g.nextPage());
}
}
if (button == ‘=’ && num2 !=0)
{ // Если нажата кнопка ‘=’, то это конец пути. Вызываем функцию domath(), выполняющую расчет
// и выводим результат.
domath();
break;
}
}
while(1)
{
// Когда всё выполнено, этот цикл ждет нажатия кнопки ‘C’, чтобы сбросить программу и начать с начала.
// Это побочный эффект от предыдущего цикла, когда пользователь нажал ‘C’, предыдущий цикл прерывается
// и переходит сюда. Поэтому мы должны также прервать и текущий цикл, иначе пользователю придется
// нажимать ‘C’ дважды.
if (button ==‘C’)
break;button = customKeypad.getKey();
if (button ==‘C’)
{
u8g.setPrintPos(0,0);
num1=0;
num2=0;
total=0;
operation=0;
break;
}
}}
void domath()
{
switch(operation)
{
case ‘+’: // Сложение
total = num1+num2;
break;
case ‘-‘: // Вычитание
total = num1—num2;
break;
case ‘/’: // Деление
// Может добавить ошибку деления на ноль, или измените строку во втором цикле,
// где тот ожидает символа ‘=’ на if (button == ‘=’ && num2 != 0), это остановит программу
// от дальнейших действий, пока num2 не будет отличаться от нуля.
total = (float)num1/(float)num2;
break;
case ‘*’: // Умножение
total = num1*num2;
break;
}
do {
u8g.setPrintPos(0,10);
u8g.print(‘=’);
u8g.setPrintPos(10,10);
u8g.print(total);
}
while(u8g.nextPage());
}Прошу помочь и палками не бить!
-
В вопросе нет главного — собственно вопроса. Если скетч работает неправильно — ПОДРОБНО опишите ошибки
-
Согласен, как-то о самом вопросе я ничего толком не разъяснил. Вышеизложенный скетч не проходит компиляцию. Выходит ошибка: «C:UsersCD86~1AppDataLocalTempuntitled1662855145.tmpsketch_dec24asketch_dec24a.ino: In function ‘void loop()’:
sketch_dec24a:115: error: ‘domath’ was not declared in this scope
domath();
^
sketch_dec24a:116: error: break statement not within loop or switch
break;
^
C:UsersCD86~1AppDataLocalTempuntitled1662855145.tmpsketch_dec24asketch_dec24a.ino: At global scope:
sketch_dec24a:120: error: expected unqualified-id before ‘while’
while(1)
^
exit status 1
‘domath’ was not declared in this scope»
До того, как я добавилdo {
}
while(u8g.nextPage());В местах, где что-либо должно выводиться на дисплей, скетч проходил компиляцию, загружался в плату, но дисплей ничего не выводил. До изменений скетч выглядел так:
#include <U8glib.h>
#include <Keypad.h>
U8GLIB_ST7920_128X64 u8g(10, 11, 12, U8G_PIN_NONE); // настройка пиновlong num1,num2 ;
double total;
char operation,button;const byte ROWS = 4;
const byte COLS = 4;char keys[ROWS][COLS] = {
{‘1’,‘2’,‘3’,‘+’},
{‘4’,‘5’,‘6’,‘-‘},
{‘7’,‘8’,‘9’,‘*’},
{‘C’,‘0’,‘=’,‘/’}
};
byte rowPins[ROWS] = {A2,A3,A4,A5}; // подключение к строкам клавиатуры
byte colPins[COLS] = {2,3,4,5}; // подключение к столбцам клавиатуры
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);// Этот код выполняется только один раз: при включении платы
void setup()
{
u8g.setFont(u8g_font_6x10); // Выбор шрифта
}void loop()
{
// Циклы удобны для чтения нажатых кнопок клавиатуры
while(1)
{
// Первый цикл. Здесь мы читаем клавиатуру и составляем наше первое число.
// Он выполняется, пока мы не нажмем кнопку оператора, и цикл прервется,
// или, если будет нажата кнопка ‘C’, всё начнется с начала.
button = customKeypad.getKey(); // Чтение кнопки
if (button==‘C’) // Если пользователь хочет сбросить набор первого числа
{
num1=0;
num2=0;
total=0;
operation=0;
}
if (button >=‘0’ && button <=‘9’) // Если пользователь нажал на числовое значение, один символ за раз
{
num1 = num1*10 + (button —‘0’);
// Наши числовые значения лежат в диапазоне от 0 до 9, что означает, что это единицы.
// Когда мы умножаем на 10, мы, по сути, добавляем 0 после числа.
// Затем мы добавляем новое введенное число на место нуля.
// Что касается (button -‘0’), это простой трюк с таблице ASCII. Цифры 0…9 в таблице ASCII
// это 48…57 (в десятичном виде), поэтому, вычитание ‘0’ из любого из этих символов дает
// соответствующее значение в десятичном виде. Например, символ ‘5’ = 53 в десятичной системе
// минус 48 (символ нуля) дает нам значение 5.
// Если наше предыдущее число было, например, 25, мы получили 250 умножением его на 10,
// а затем добавили 5, и получили 255, что и будет выведено на U8G.
u8g.setPrintPos(0,0); // Выбор первой строки на U8G
u8g.print(num1); // Печать текущего значения числа num1
}
if (num1 !=0 && (button==‘-‘ || button==‘+’ || button==‘*’ || button==‘/’))
{
// Если пользователь завершил ввод цифр
operation = button; // запоминаем, какое математическое действие пользователь хочет выполнить
u8g.setPrintPos(0,1); // установить курсор на строку 2
u8g.print(operation); // напечатать наш оператор
break;
}}
while(1)
{
// Второй цикл, он выполняется пока пользователь не нажмет ‘=’ или ‘C’.
// И тогда будет выведен результат или сброшена программа.
if (button ==‘C’)
break; // Это обрабатывает случай, когда пользователь нажал кнопку оператора и захотел сбросить
button = customKeypad.getKey();
if (button==‘C’) // Еще раз проверяем, не хочет ли пользователь сбросить
{
num1=0;
num2=0;
total=0;
operation=0;break;
}
if (button >=‘0’ && button <=‘9’) // Получение символов от клавиатуры для числа 2
{
num2 = num2*10 + (button —‘0’);
u8g.setPrintPos(1,1);
u8g.print(num2);
}
if (button == ‘=’ && num2 !=0)
{ // Если нажата кнопка ‘=’, то это конец пути. Вызываем функцию domath(), выполняющую расчет
// и выводим результат.
domath();
break;
}
}
while(1)
{
// Когда всё выполнено, этот цикл ждет нажатия кнопки ‘C’, чтобы сбросить программу и начать с начала.
// Это побочный эффект от предыдущего цикла, когда пользователь нажал ‘C’, предыдущий цикл прерывается
// и переходит сюда. Поэтому мы должны также прервать и текущий цикл, иначе пользователю придется
// нажимать ‘C’ дважды.
if (button ==‘C’)
break;button = customKeypad.getKey();
if (button ==‘C’)
{
u8g.setPrintPos(0,0);
num1=0;
num2=0;
total=0;
operation=0;
break;
}
}}
void domath()
{
switch(operation)
{
case ‘+’: // Сложение
total = num1+num2;
break;
case ‘-‘: // Вычитание
total = num1—num2;
break;
case ‘/’: // Деление
// Может добавить ошибку деления на ноль, или измените строку во втором цикле,
// где тот ожидает символа ‘=’ на if (button == ‘=’ && num2 != 0), это остановит программу
// от дальнейших действий, пока num2 не будет отличаться от нуля.
total = (float)num1/(float)num2;
break;
case ‘*’: // Умножение
total = num1*num2;
break;
}
u8g.setPrintPos(0,1);
u8g.print(‘=’);
u8g.setPrintPos(1,1);
u8g.print(total);
} -
первым делом переставьте код функции domath() выше — между setup и loop. Возможно, что после этого и две другие ошибки исчезнут, потому как я не вижу, почему они возникают.
Но вообще код, конечно, кривоватый. Автор похоже не понимает, зачем нужна функция loop и как она работает… -
функция должна быть объявлена раньше чем использована — надо где-нибудь в начале (до лупа и сетапа) написать строчку
void domath(void); -
Переместил. Ругается компилятор.
C:UsersCD86~1AppDataLocalTempuntitled1662855145.tmpsketch_dec24asketch_dec24a.ino: In function ‘void loop()’:
sketch_dec24a:150: error: break statement not within loop or switch
break;
^
C:UsersCD86~1AppDataLocalTempuntitled1662855145.tmpsketch_dec24asketch_dec24a.ino: At global scope:
sketch_dec24a:154: error: expected unqualified-id before ‘while’
while(1)
^
exit status 1
break statement not within loop or switch -
эта ошибка чаще всего возникает, если у вас в программе непарное число открывающих и закрывающих скобок. По коду в форуме довольно трудно это проверить, так что попробуйте найти сами.
-
вот тут скобка лишняя
while(1)
{
// Второй цикл, он выполняется пока пользователь не нажмет ‘=’ или ‘C’.
// И тогда будет выведен результат или сброшена программа.
if (button ==‘C’)
break; // Это обрабатывает случай, когда пользователь нажал кнопку оператора и захотел сбросить
button = customKeypad.getKey();
if (button==‘C’) // Еще раз проверяем, не хочет ли пользователь сбросить
{
num1=0;
num2=0;
total=0;
operation=0;
break;
}
if (button >=‘0’ && button <=‘9’) // Получение символов от клавиатуры для числа 2
{
num2 = num2*10 + (button —‘0’);
do {
u8g.setPrintPos(10,10);
u8g.print(num2);
}
while(u8g.nextPage());
}
}
if (button == ‘=’ && num2 !=0)
{ // Если нажата кнопка ‘=’, то это конец пути. Вызываем функцию domath(), выполняющую расчет
// и выводим результат.
domath();
break;
}
}после while(u8g.nextPage());
-
if (button ==‘C’)
break; // Это обрабатывает случай, когда пользователь нажал кнопку оператора и захотел сброситьЧисто из интереса, каким образом может случиться такой случай???
-
Люди здорово, значит я решил заняться ардуинкой на ноутбуке с Windows XP, вобщем устанавливаю IDE для нее и сталкиваюсь во всех версиях что не запускается программа ну никак, работает только 1.6.3 но она выдает ошибки типо после собки ожидается «;» когда она там стоит что делать??
-
что-то неправильно устанавливается. У меня ардуино 1.8.2 и 1.8.3 работают на ХП и на компе и на ноуте.
-
а можете подсказать я вот с грехом по полам все установил но после загрузки 2 скечей стала показываться такая ошибка что делать ?
Arduino: 1.8.5 (Windows XP), Плата:»Arduino/Genuino Uno»Скетч использует 2090 байт (6%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 50 байт (2%) динамической памяти, оставляя 1998 байт для локальных переменных. Максимум: 2048 байт.
avrdude: ser_open(): can’t set com-state for «\.COM25»
Произошла ошибка при загрузке скетча -
Спасибо за столь детальное объяснение, но, к сожалению, не все проблемы разрешились. Совсем. Но скетч уже спокойно проходит компиляцию, но после загрузки ничего толком не происходит. При нажатии 6, 7, 8 загораются два пикселя. При нажатии 5 загорается только 1 пиксель. С чем это связано? Чувствую себя каким-то гуманитарием…
на всякий случай прилагаю финальную версию кода#include <U8glib.h>
#include <Keypad.h>
U8GLIB_ST7920_128X64 u8g(10, 11, 12, U8G_PIN_NONE); // настройка пинов
long num1,num2 ;
double total;
char operation,button;const byte ROWS = 4;
const byte COLS = 4;char keys[ROWS][COLS] = {
{‘1’,‘2’,‘3’,‘+’},
{‘4’,‘5’,‘6’,‘-‘},
{‘7’,‘8’,‘9’,‘*’},
{‘C’,‘0’,‘=’,‘/’}
};
byte rowPins[ROWS] = {0,1,2,3}; // подключение к строкам клавиатуры
byte colPins[COLS] = {4,5,6,7}; // подключение к столбцам клавиатуры
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void domath(void);
// Этот код выполняется только один раз: при включении платы
void setup()
{
u8g.setFont(u8g_font_6x12); // Выбор шрифта}
void loop()
{
//sprintf(num1, «%d»,num2); // функция sprintf переведёт число в строковый массив
// Циклы удобны для чтения нажатых кнопок клавиатуры
while(1)
{
// Первый цикл. Здесь мы читаем клавиатуру и составляем наше первое число.
// Он выполняется, пока мы не нажмем кнопку оператора, и цикл прервется,
// или, если будет нажата кнопка ‘C’, всё начнется с начала.
button = customKeypad.getKey(); // Чтение кнопки
if (button==‘C’) // Если пользователь хочет сбросить набор первого числа
{
num1=0;
num2=0;
total=0;
operation=0;
}
if (button >=‘0’ && button <=‘9’) // Если пользователь нажал на числовое значение, один символ за раз
{
num1 = num1*10 + (button —‘0’);
// Наши числовые значения лежат в диапазоне от 0 до 9, что означает, что это единицы.
// Когда мы умножаем на 10, мы, по сути, добавляем 0 после числа.
// Затем мы добавляем новое введенное число на место нуля.
// Что касается (button -‘0’), это простой трюк с таблице ASCII. Цифры 0…9 в таблице ASCII
// это 48…57 (в десятичном виде), поэтому, вычитание ‘0’ из любого из этих символов дает
// соответствующее значение в десятичном виде. Например, символ ‘5’ = 53 в десятичной системе
// минус 48 (символ нуля) дает нам значение 5.
// Если наше предыдущее число было, например, 25, мы получили 250 умножением его на 10,
// а затем добавили 5, и получили 255, что и будет выведено на U8G.
do
{
u8g.setPrintPos(0,10); // Выбор первой строки на U8G
u8g.print(num1); // Печать текущего значения числа num1
}
while(u8g.nextPage());
}
if (num1 !=0 && (button==‘-‘ || button==‘+’ || button==‘*’ || button==‘/’))
{
// Если пользователь завершил ввод цифр
operation = button; // запоминаем, какое математическое действие пользователь хочет выполнить
do {
u8g.setPrintPos(0,20); // установить курсор на строку 2
u8g.print(operation); // напечатать наш оператор
}
while(u8g.nextPage());
break;
}}
while(1)
{
// Второй цикл, он выполняется пока пользователь не нажмет ‘=’ или ‘C’.
// И тогда будет выведен результат или сброшена программа.
if (button ==‘C’)
break; // Это обрабатывает случай, когда пользователь нажал кнопку оператора и захотел сбросить
button = customKeypad.getKey();
if (button==‘C’) // Еще раз проверяем, не хочет ли пользователь сбросить
{
num1=0;
num2=0;
total=0;
operation=0;
break;
}
if (button >=‘0’ && button <=‘9’) // Получение символов от клавиатуры для числа 2
{
num2 = num2*10 + (button —‘0’);
do {
u8g.setPrintPos(10,10);
u8g.print(num2);
}
while(u8g.nextPage());
}
if (button == ‘=’ && num2 !=0)
{ // Если нажата кнопка ‘=’, то это конец пути. Вызываем функцию domath(), выполняющую расчет
// и выводим результат.
domath();
break;
}
}
while(1)
{
// Когда всё выполнено, этот цикл ждет нажатия кнопки ‘C’, чтобы сбросить программу и начать с начала.
// Это побочный эффект от предыдущего цикла, когда пользователь нажал ‘C’, предыдущий цикл прерывается
// и переходит сюда. Поэтому мы должны также прервать и текущий цикл, иначе пользователю придется
// нажимать ‘C’ дважды.
if (button ==‘C’)
break;button = customKeypad.getKey();
if (button ==‘C’)
{
u8g.setPrintPos(0,0);
num1=0;
num2=0;
total=0;
operation=0;
break;
}
}}
void domath()
{
switch(operation)
{
case ‘+’: // Сложение
total = num1+num2;
break;
case ‘-‘: // Вычитание
total = num1—num2;
break;
case ‘/’: // Деление
// Может добавить ошибку деления на ноль, или измените строку во втором цикле,
// где тот ожидает символа ‘=’ на if (button == ‘=’ && num2 != 0), это остановит программу
// от дальнейших действий, пока num2 не будет отличаться от нуля.
total = (float)num1/(float)num2;
break;
case ‘*’: // Умножение
total = num1*num2;
break;
}
do {
u8g.setPrintPos(0,10);
u8g.print(‘=’);
u8g.setPrintPos(10,10);
u8g.print(total);
}
while(u8g.nextPage());
} -
Может вы перепутали операцию
-
Выбран некорректный COM-порт.
Switch Statement Error
I keep getting the error: break not inside of loop or switch statement. Other errors include case «2» is not within a switch or a loop. What is wrong?!?
#include <iostream>
using namespace std;
int main(int nNumberofArgs, char* pszArgs[])
{
int nSexy;
cout << «On a scale of one to ten, how sexy are you? 10 = sexiest 1 = oh lord no.»;
cout << endl;
cout << «Please type the number as a digit.»;
cout << endl;
cin >> nSexy;
{
{switch (nSexy)
case ‘1’:
cout << «You’re so ugly, the computer purposely lowers the graphics when you use a webcam.»;
break;
case ‘2’:
cout << «I’d rather not look at you, but if I must, wretching in disgust might be a side effect.»;
break;
case ‘3’:
cout << «Please, don’t take any pictures of yourself.»;
break;
case ‘4’:
cout << «eh.»;
break;
case ‘5’:
cout << «Not good, but alright.»;
break;
case ‘6’:
cout << «You’d be extremely hot if I were drunk.»;
break;
case ‘7’:
cout << «Baby, I could look at you all night.»;
break;
case ‘8’:
cout << «My word eleanor, who is that alluring person?»;
break;
case ‘9’:
cout << «You’re a very beautiful person.»;
break;
case ’10’:
cout << «Not even jesus is good enough for you.»;
break;
default:
cout << «say what’s that sound? I THINK ITS STUPIDITY! only stupid people don’t put a correct number. although, it might be idiocy.»;
break;
}
}
return 0;
}
READABILITY FIX
I keep getting the error: break not inside of loop or switch statement. Other errors include case «2» is not within a switch or a loop. What is wrong?!?
|
|
Last edited on
Wow, for the readability fix, i have the indentations, its just that when i copied and pasted it, the formatting disappeared. Thanks for the article though, all I was missing was one «{«.
iceadmiral wrote: |
---|
…. all I was missing was one «{«. |
You have a couple more problems than that:
You have too many braces. Delete lines 15,16,58. Add opening brace on line 17, so that the switch is now enclosed in braces.
Too many braces is a problem because it means scope, consider this:
|
|
So it is generally a bad idea to introduce gratuitous scope.
The nSexy
variable is of type int
, but you have the cases specified as char, so change it like this (remove the single quotes):
|
|
Especially here:
|
|
Wow, for the readability fix, i have the indentations, its just that when i copied and pasted it, the formatting disappeared.
Hope all is well :+)
Last edited on
Thanks, I’m a beginner so when I don’t know what’s wrong, I tend to just add things here and there and so I have a lot of extra stuff. I should have just posted on here right away…
Topic archived. No new replies allowed.