"Бесхозные" строки или работа с несколькими файлами в одном проекте
- Войдите на сайт для отправки комментариев
Простите, что снова я лезу к вам со своими ньюбаевскими вопросами, но гугл ответа не дает...
Пытаюсь разобраться в некоем чужом проекте. В папке с проектом - два .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 данного проекта.
Заранее благодарю всех, кто не сочтет за труд откликнуться.
Нельзя редактировать заглавный пост, поэтому просто дополню свой(-и) вопрос(-ы): разве не потому локальные переменные называются "локальными", что объявляются ВНУТРИ void() {}?
void - это не функция... Посмотреть, что будет в итоге, можно в temp-каталоге - туда ide поместит исходник-франкенштейн перед компиляцией. И да, в общем случае, объявлять сущность достаточно просто до ее использования. Это вам не чертов Паскаль.
И да, в общем случае, объявлять сущность достаточно просто до ее использования. Это вам не чертов Паскаль.
Но тогда что происходит с этими "безхозными" строками? Они ведь не попадают внутрь void() {}? Т.е. они, фактически, оказываются глобальными? Я ничего не путаю?
Да, они глобальны, в сущности.
Да, они глобальны, в сущности.
Т.е. если автор хотел их объявлять в качестве локальных, то это у него не очень получилось.