Неконтролируемый цикл и пропуск функций в C ?

#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 о важности определения области видимости переменных в соответствии с их ожидаемым временем жизни и, таким образом, минимизировать глобальные переменные, где это возможно.