eigene Funktion sblöcke

Gast #3848540
Lesenswert?

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!
#3848560
Lesenswert?

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.
#3848565
Lesenswert?

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ß.
Gast #3917197
Lesenswert?

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
Gast #3917962
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren