"Бесхозные" строки или работа с несколькими файлами в одном проекте

b_calavasov
Offline
Зарегистрирован: 11.01.2019

Простите, что снова я лезу к вам со своими ньюбаевскими вопросами, но гугл ответа не дает...

Пытаюсь разобраться в некоем чужом проекте. В папке с проектом - два .ino файла. ArduinoIDE грузит их оба. Один содержит void setup() & void loop(), второй просто - куски кода. Читаю информацию - везде говорится, что при сборке компилятор просто добавляет один файл к другому. Ну, хорошо, понятно...

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

В первом файле, все как по-уставу, сперва идут #define & #include, потом объявление переменных и массивов, потом void setup() и следом - void loop(). Потом, в самом конце, еще несколько нормально закрытых кавычками void() {}. Открываю второй файл, а там... (привожу фрагмент)

#define TRACK_STEP 40

// ****************************** ОГОНЁК ******************************
int8_t position;
boolean direction;

void lighter() {
  FastLED.clear();
  if (direction) {
    position++;
    if (position > NUM_LEDS - 2) {
      direction = false;
    }
  } else {
    position--;
    if (position < 1) {
      direction = true;
    }
  }
  leds[position] = CRGB::White;
}

// ****************************** СВЕТЛЯЧКИ ******************************
#define MAX_SPEED 30
#define BUGS_AMOUNT 3
int8_t speed[BUGS_AMOUNT];
int8_t pos[BUGS_AMOUNT];
CRGB bugColors[BUGS_AMOUNT];

void lightBugs() {
  if (loadingFlag) {
    loadingFlag = false;
    for (byte i = 0; i < BUGS_AMOUNT; i++) {
      bugColors[i] = CHSV(random(0, 9) * 28, 255, 255);
      pos[i] = random(0, NUM_LEDS);
      speed[i] += random(-5, 6);
    }
  }
  FastLED.clear();
  for (byte i = 0; i < BUGS_AMOUNT; i++) {
    speed[i] += random(-5, 6);
    if (speed[i] == 0) speed[i] += (-5, 6);

    if (abs(speed[i]) > MAX_SPEED) speed[i] = 0;
    pos[i] += speed[i] / 10;
    if (pos[i] < 0) {
      pos[i] = 0;
      speed[i] = -speed[i];
    }
    if (pos[i] > NUM_LEDS - 1) {
      pos[i] = NUM_LEDS - 1;
      speed[i] = -speed[i];
    }
    leds[pos[i]] = bugColors[i];
  }
}

// ****************************** ЦВЕТА ******************************
byte hue;
void colors() {
  hue += 2;
  CRGB thisColor = CHSV(hue, 255, 255);
  fillAll(CHSV(hue, 255, 255));
}

Обратите внимание на "бесхозные" строки между разными void() {}. Там есть и новые #define, и новые объявления переменных.

Если я правильно понимаю, то при вызове функции lighter(), к примеру, программа ведь не подхватит предвосхищающие эту функцию строки объявления переменных

int8_t position;
boolean direction;

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

Главное, что проект вроде бы как рабочий, т.е. код априори работающий. Ссылка на github данного проекта.

Заранее благодарю всех, кто не сочтет за труд откликнуться.

b_calavasov
Offline
Зарегистрирован: 11.01.2019

Нельзя редактировать заглавный пост, поэтому просто дополню свой(-и) вопрос(-ы): разве не потому локальные переменные называются "локальными", что объявляются ВНУТРИ void() {}?

sadman41
Offline
Зарегистрирован: 19.10.2016

void - это не функция... Посмотреть, что будет в итоге, можно в temp-каталоге - туда ide поместит исходник-франкенштейн перед компиляцией. И да, в общем случае, объявлять сущность достаточно просто до ее использования. Это вам не чертов Паскаль.

b_calavasov
Offline
Зарегистрирован: 11.01.2019

sadman41 пишет:

И да, в общем случае, объявлять сущность достаточно просто до ее использования. Это вам не чертов Паскаль.

Но тогда что происходит с этими "безхозными" строками? Они ведь не попадают внутрь void() {}? Т.е. они, фактически, оказываются глобальными? Я ничего не путаю?

sadman41
Offline
Зарегистрирован: 19.10.2016

Да, они глобальны, в сущности. 

b_calavasov
Offline
Зарегистрирован: 11.01.2019

sadman41 пишет:

Да, они глобальны, в сущности. 

Понял. Спасибо.

Т.е. если автор хотел их объявлять в качестве локальных, то это у него не очень получилось.