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? Zwischen Setup() und Loop() oder kann ich zuerst Setup() dann in Loop() mein Hauptprogramm schreiben und meine ganzen Funktionsblöcke dann nach Loop anhängen? Danke für Eure Antworten!
Heißen jetzt einfache Funktionen in Arduino-Deppensprech schon "Funktionsblöcke", oder ist das nur in deiner Welt so? Und gibts da keine lib um eigene Funktionen zu schreiben? Wie soll das ein Arduino-Nutzer selber können? Leg mal die Arduino Tutorials und das ganze andere hirnentleerte Zeug weg und lies ein C Buch.
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ß.
:
Bearbeitet durch User
Hallo Arduino! Ich habe erst vor kurzem eine Steuerung mit Arduino programmiert, und habe die Arduino-IDE mit Processing verwendet. Diese eigenen Funktionen können ganz einfach nach der loop-Funktion (nach der letzten geschweiften Klammer } ) plaziert werden. Wenn die Funktion im loop aufgerufen wird, können die Parameter übergeben werden und es kommt auch ein Wert zurück. Ich hatte nur zwei kleine Funktionen und wollte nicht extra eine Header-Datei schreiben. mfg Chris
Chris schrieb: > Ich habe erst vor kurzem eine Steuerung mit Arduino programmiert Das glaube ich nicht. Arduino und programmieren schließt sich aus. Am besten wartet ihr. Es dauert bestimmt nicht lange bis man sich in der Arduino-"IDE" alles zusammenklicken kann. Die Tastatur für euren PC könnt ihr dann auch verkaufen und in einen weiteren Arduino investieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.