#c #mbed
#c #mbed
Вопрос:
Я пытаюсь прочитать два введенных пользователем числа с клавиатуры на панель обнаружения. У меня есть код, работающий для чтения первого числа, но по какой-то причине, когда он попадает на ту же клавиатуру (); функция во второй раз, похоже, не вызывает функцию, чтобы разрешить ввод, вместо этого она пропускает сканирование и печатает строки под ним, и если вы нажмете кнопку, чтобы начать все сначала, это случайное место, где программа выбирает, есть идеи, что может быть причиной этого. Я компилирую на mbeds online Ide. ниже также приведен код.
#include <iostream>
#include "mbed.h"
DigitalIn columns[3] = {PB_6, PB_7, PD_0}; // Columns for digital input
DigitalOut rows[4] = {PA_5, PA_1, PA_2, PA_3}; // rows for digital output
DigitalIn startButton(USER_BUTTON);
DigitalOut led1(LED1); // reference LED
int numpad[4][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {-2, 0, -1}}; // keypad
int Total();
int Keypad();
int c = 0;
int Read;
int Num1 = 0;
int SelectOp();
int Oper;
int main() {
while (1) {
if (startButton == 1) {
printf("%snrInput First Numbernr");
wait(.5);
Keypad();
int First = Num1;
Num1 = 0;
printf("%snr Your first number is ");
printf("%i", First);
printf("%snr Input your second numbernr");
wait(.5);
Keypad(); // this seems to be getting skipped
int Second = Num1;
Num1 = 0;
printf("%snr Your Second number is ");
printf("%i", Second);
printf("%snrSelect Operator: 1( ), 2(-), 3(*), 4(/)");
Keypad();
Oper = Num1;
}
}
}
int Keypad() {
columns[0].mode(PullUp);
columns[1].mode(PullUp);
columns[2].mode(PullUp);
while (1) {
if (Read == -1) {
return Num1;
}
for (int i = 0; i < 4; i ) {
rows[0] = 1;
rows[1] = 1;
rows[2] = 1;
rows[3] = 1;
rows[i] = 0;
wait(0.01);
for (int j = 0; j < 3; j ) {
if (columns[j] == 0) {
Read = numpad[i][j];
Total();
c ;
if (c == 5) {
c = 0;
}
wait(0.005);
while (columns[j] == 0)
;
}
}
}
}
}
int Total() {
if (Read >= 0) {
Num1 *= 10;
Num1 = Read;
printf("%inr", Num1);
} else {
return Num1;
}
return Num1;
}
Комментарии:
1. Мое предположение (после отладки на глаз): при вызове
Keypad()
во 2-й раз это вступает в силу немедленно:if (Read == -1) { return Num1; }
. Это должно научить вас, что глобальные переменные — это зло. (часто). Вместо этогоwhile (1) {
вы могли бы сделатьfor (int Read = 0; Read >= 0;) {
(т. Е. Использовать локальную переменную) и переместитьreturn Num;
после цикла. (И подумайте, какую другую глобальную переменную можно было бы легко устранить.)
Ответ №1:
Когда Read
установлено значение -1 во время первого цикла с помощью Keypad(), оно все равно равно -1 при повторном вводе Keypad()
, что приводит к мгновенному возврату.
Используя некоторое пространство, чтобы повторить @Scheff о важности определения области видимости переменных в соответствии с их ожидаемым временем жизни и, таким образом, минимизировать глобальные переменные, где это возможно.