Forum: Mikrocontroller und Digitale Elektronik eigene Funktion sblöcke


von Arduino (Gast)


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!

von Cyblord -. (cyblord)


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.

von Karl H. (kbuchegg)


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ß.

: Bearbeitet durch User
von Chris (Gast)


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

von Larry (Gast)


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.

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
Noch kein Account? Hier anmelden.