Eljön az a pillanat, amikor a programot már nem győzi görgetni az írója, és szívesen szét darabolná értelmesen egybe tartozó darabokra. Ekkor biztosan bele fog ütközni a változók láthatóságának problémájába, amit a hatókör módosítókkal kéne tudni megoldani. Amikor a dolog nem úgy működik, mint azt várnám, akkor egyszerűsítés felé fordulva led a villogtatón próbálom a fájlokra darabolást kipróbálni. A példa kedvéért legyen a villogtatónk villogTikkTakk.ino fájlban.
Első lépésben a setup() előtt leírtakat kitereltem egy definiciok.h fájlba, és a .ino fájlban helyette megjelenik az include. Ezzel a globális érvényű definiciók, változók, makrók a továbbiakban a definiciok.h fájlba kell kerüljenek. Megfordítva, amit a definiciok.h tartalmaz az mind globális, bárki láthatja, és használhatja.
A refiniciok.h így néz ki. Ami most éppen ki van kommentezve, az a változó helyének próbálgatása során ki kerülhet a kommnet alól.
Kód: Egész kijelölése
/*
* definiciok.h
*
* Created: 2017.06.09. 14:49:10
* Author: Laci
*/
#ifndef DEFINICIOK_H_
#define DEFINICIOK_H_
/*
D E K L A R Á C I Ó K
*/
#define LEDPIN 13
#define ALAPIDO 1000
#define DEBUG
/*
G L O B Á L I S V Á L T O Z Ó K
*/
unsigned long most = millis();
// char* szoveg;
// String szoveg;
#endif /* DEFINICIOK_H_ */
A metodusok.h ai inkludolódik a villogTikkTakk.ino fájlba, még ez is a setup előttre. A metodusok.h az alábbi tartalommal bír.
Kód: Egész kijelölése
/*
* metodusok.h
*
* Created: 2017.06.09. 15:27:54
* Author: Laci
*/
#ifndef METODUSOK_H_
#define METODUSOK_H_
void tikkTakk(){
// extern char* szoveg;
extern String szoveg;
szoveg = digitalRead(LEDPIN) ? "Tikk" : "Takk";
Serial.println(szoveg);
}
#endif /* METODUSOK_H_ */
Kód: Egész kijelölése
#include "definiciok.h"
#include "metodusok.h"
void setup()
{
pinMode(LEDPIN,OUTPUT);
digitalWrite(LEDPIN,LOW);
#ifdef DEBUG
Serial.begin(57600);
while(!Serial);
#endif
}
void loop()
{
// char* szoveg;
String szoveg;
if (most < (millis() - ALAPIDO))
{
most = millis();
digitalWrite(LEDPIN, !digitalRead(LEDPIN));
#ifdef DEBUG
tikkTakk();
#endif
}
}
Ha a "szoveg" változómat a define-be, vagy a metodusok-ba rakom, akkor értelem szerűen nem kell elé az extern, mert vagy globál, vagy lokál ott ahol használo. Ekkor kommentezve szerepel a loop()-ban a "String szoveg;" sor. Ekkor a dolog le is fordul, és gondolom működne is, nem töltöttem ki.
De ha a loopban szeretném definiálni a "szoveg" változómat, akkor a metodusok között az extern módosítóval fel kell tüntessem a változót, mert itt használni szeretném, de máshol hoztam létre. Elképzelésem szerint azt közlöm a fordítóbal, pontosabban a preprocesszel, hogy amikor kelleni fog, akkor majd lesz "szoveg" változó, higgye el. Viszont fordításnál definiálatlannak találja a szoveg változót, és hibát ad rá.
Kód: Egész kijelölése
Compiling 'VillogTikkTakk' for 'Arduino Nano w/ ATmega328'
ccZo29ed.ltrans0.ltrans.o*: In function main
ccZo29ed.ltrans0.o*: (.text.startup+0x268): undefined reference to szoveg
ccZo29ed.ltrans0.o*: (.text.startup+0x26a): undefined reference to szoveg
ccZo29ed.ltrans0.o*: (.text.startup+0x272): undefined reference to szoveg
ccZo29ed.ltrans0.o*: (.text.startup+0x276): undefined reference to szoveg
ccZo29ed.ltrans0.o*: (.text.startup+0x27a): undefined reference to szoveg
ccZo29ed.ltrans0.ltrans.o*: ccZo29ed.ltrans0.o:(.text.startup+0x27e): more undefined references to szoveg follow
collect2.exe*: error: ld returned 1 exit status
Error compiling for board Arduino Nano w/ ATmega328