Arduino schrieb:
> Hallo,
>
> hab eine Frage zu Arduino,
>
> ich möchte mehrere eigene Funktionensblöcke, unter anderem ein kleines
> Menüsystem, erstellen welche dann aus Loop heraus bei Bedarf einzeln
> aufgerufen werden sollen..
>
> Wo müssen diese Funktionsblöcke stehen?
Halte dich an zwei einfache Regel:
1) Der Compiler liest den Code von oben nach unten.
2) Verwendet werden kann nur, was bereits bekannt ist.
Wenn du also eine Funktion xyz() aufrufen willst, und zwar aus einer
Funktion abc() heraus, dann ist es das einfachste die Funktion xyz() im
Code räumlich VOR der Funktion abc() zu definieren
1 | int xyz( int i )
|
2 | {
|
3 | // mach was
|
4 | return 8;
|
5 | }
|
6 |
|
7 | void abc()
|
8 | {
|
9 | // mach auch was
|
10 |
|
11 | xyz( 5 );
|
12 |
|
13 | // irgendwas
|
14 | }
|
liest man den Code von oben nach unten, so wird zuerst die Funktion
xyz() 'eingeführt', so dass der Compiler weiß, das es die Funktion gibt,
welche Parameter-Datentypen sie hat und ob sie einen Returnwert hat oder
nicht.
Wenn dann in der Funktion abc() der Aufruf der Funktion steht, dann
kennt daher der Compiler die Funktion xyz() bereits und kann überprüfen,
ob die Art und Weise, wie du die Funktion benutzt konsistent dazu ist.
rufst du die Funktion abc() wiederrum von irgendeiner anderen Funktion
heraus auf, dann steht die Funktion räumlich wieder vor diesem Aufruf
1 | int xyz( int i )
|
2 | {
|
3 | // mach was
|
4 | return 8;
|
5 | }
|
6 |
|
7 | void abc()
|
8 | {
|
9 | // mach auch was
|
10 |
|
11 | xyz( 5 );
|
12 |
|
13 | // irgendwas
|
14 | }
|
15 |
|
16 | void loop()
|
17 | {
|
18 | abc();
|
19 | }
|
und wieder greift das gleiche Prinzip. Von oben nach unten und verwendet
wird nur das, was bereits bekannt ist.
Kann man die Reihenfolge so nicht machen (oder will man sie aus
irgendeinem Grund nicht so machen), dann muss man spezielle
Deklarationen machen, sog. Funktionsprototypen, mit denen man das
gleiche erreicht: Den Compiler davon informieren, dass es eine derartige
Funktion gibt und wie die Argumente zu dieser Funktion aussehen.
Das sieht dann so aus
1 | // ein Protoyp.
|
2 |
|
3 | int xyz( int i );
|
4 |
|
5 | // Er informiert den Compiler darüber, dass es eine Funktion namens 'xyz'
|
6 | // tatsächlich gibt (könnte beim Aufruf ja auch ein Tippfehler sein),
|
7 | // dass die Funktion 1 Argument übernimmt, welches vom Datentyp int ist
|
8 | // und das die Funktion einen Returnwert liefert, der ebenfalls vom
|
9 | // Datentyp int ist
|
10 |
|
11 |
|
12 | //
|
13 | // Damit kann dann in der folgtenden Funktion der Funktionsaufruf
|
14 | // überprüft und übersetzt werden, weil der Compiler ja die 'Signatur'
|
15 | // der Funktion kennt .....
|
16 | void abc()
|
17 | {
|
18 | // mach auch was
|
19 |
|
20 | xyz( 5 );
|
21 |
|
22 | // irgendwas
|
23 | }
|
24 |
|
25 | ...
|
26 |
|
27 | // ..... auch wenn die eigentliche Funktion dann erst viel später
|
28 | // im Code kommt
|
29 | int xyz( int i )
|
30 | {
|
31 | // mach was
|
32 | return 8;
|
33 | }
|
> oder kann ich zuerst Setup() dann in Loop() mein Hauptprogramm schreiben
> und meine ganzen Funktionsblöcke dann nach Loop anhängen?
setup() und loop() sind nicht irgendwie speziell.
Am einfachsten ist es, wenn du den Code einer Funktion die du irgendwo
benutzt, räumlich VOR der benutzenden Stelle hast. Denn dann musst du
den Prototypen erstens nicht schreiben und zweitens nicht anpassen, wenn
sich die Funktionssignatur verändert.
>
> Danke für Eure Antworten!
Kauf dir ein C++ Buch wenn du vernünftig Arduino programmieren willst.
Die Sprache C++ ist unabhängig von Arduino, was alledings nicht heißt,
dass man zumindest die Grundlagen der Sprache nicht kennen müsste.
Schon traurig, dass man so grundlegend einfache Konzepte einem
sogenannten Programmierer erst noch erklären muss und er das nicht schon
längst aus seiner Literatur weiß.