Вложенный цикл

Не уверен, что я действительно веду себя глупо, но почему это не работает?

void setup() {
  Serial.begin(9600);
}

void loop() {
  for (int x; x < 8; x++) {
    for (int y; y < 8; y++) {
      Serial.print(x);
      Serial.println(y);
      delay(100);
    }
  }
}

Когда это произойдет:

void setup() {
  Serial.begin(9600);
}

void loop() {
  for (int x; x < 8; x++) {
    Serial.println(x);
    delay(100);
  }
}

Первый не выводит данные через Serial, тогда как второй выводит числа от 0 до 7, как и ожидалось. Я использую Teensy 3.1.

, 👍0

Обсуждение

Очень странно... у меня не работает на Mega 2560. Должно быть, я упускаю что-то очевидное :-), @Anonymous Penguin

да, очевидно: int x = 0; внутри операторов for() (кстати, то же самое и для y)..., @jfpoilpret

![введите описание изображения здесь](https://i.stack.imgur.com/uBc1D.jpg) Как решить вопрос 18?, @Shamma


1 ответ


Лучший ответ:

7

Вы не инициализируете x и y.

Когда локальная переменная не инициализирована, она «унаследует» значение, содержащееся в регистре, назначенном переменной компилятором. Тот факт, что ваш пример с одним циклом сработал, является чистой удачей — назначенный регистр в тот момент выполнения содержал 0.

Измените вложенный цикл следующим образом:

for (int x = 0; x < 8; x++) {
  for (int y = 0; y < 8; y++) {
    Serial.print(x);
    Serial.println(y);
    delay(100);
  }
}

И это сработает.

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

,

Я слишком долго писал на Ruby..., @Alfo