Forum: Mikrocontroller und Digitale Elektronik Unterprogramme in einem Mikrocontroller


von Anfänger (Gast)


Lesenswert?

Hallo,

ich stehe noch sehr am Anfang mit der Programmierung von 
Mikrocontrollern. Und jetzt stellt sich mir die Frage wie ich bzw. ob 
ich Unterprogramme beenden kann/muss. Und zwar mein Programm sieht so 
aus das ich von Main aus auf ein anderes Programm zugreife/öffne von 
welchem es dann weitergeht. Also so in etwa:
1
void main(void);
2
{
3
erstens();
4
}
5
6
7
void erstens(void);
8
{
9
zweitens();
10
}
11
12
void zweitens(void);
13
{
14
n-tens();
15
}

Nun sind aber die anderen Programme noch geöffnet oder? Gibt es eine 
Möglichkeit diese zu schließen oder ist es generell besser darauf zu 
achten möglichst alles von main aus zu öffnen?
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sind keine Programme, sondern Funktionen, und sie sind nicht 
"geöffnet", und müssen daher auch nicht "geschlossen" werden.

Vor allem: Sie werden sequentiell abgearbeitet; ist also das von 
"zweitens" aufgerufene "n-tens" beendet (achtung: ungültiger Name!), 
dann kehrt "zweitens" zum Aufrufer "erstens" zurück und der wiederum zum 
seinem Aufrufer "main".
von dave_chappelle (Gast)


Lesenswert?

Hm hast du mal Portals gespielt? Falls ja, eine Funktion ist wie ein 
Portal.
Du springst rein und kommst am anderen Ende wieder raus. Nur, dass das 
Programm dazwischen noch was abarbeitet.
von Steel (Gast)


Lesenswert?

Die Funktionen müssen sehr wohl beendet werden, sonst gibt es irgendwann 
einen Stack-Überlauf. Es geht also nicht die immer "im Kreis" 
aufzurufen.
von C-Prog (Gast)


Lesenswert?

Anfänger schrieb:
> Nun sind aber die anderen Programme noch geöffnet oder? Gibt es eine
> Möglichkeit diese zu schließen oder ist es generell besser darauf zu
> achten möglichst alles von main aus zu öffnen?

Wenn du die Unterprogramme einfach sequenziell abarbeiten willst, dann 
schreibe z.B.:
1
void main(void);
2
{
3
erstens();
4
zweitens();
5
n-tens();
6
}

Ist aber nicht auf main beschränkt, das kannst du auch in 
Unterprogrammen so machen.

So wie du es geschachtelt hast (erstens ruft zweitens ruft n-tens) ist 
es nur sinnvoll, wenn zweitens nach der Abarbeitung von n-tens 
weiterarbeiten soll und nach der Abarbeitung von zweitens erstens noch 
weiterarbeiten soll.
von bestucki (Gast)


Lesenswert?

Anfänger schrieb:
> Und jetzt stellt sich mir die Frage wie ich bzw. ob
> ich Unterprogramme beenden kann/muss.

Ja, mit dem Befehl return

Anfänger schrieb:
> oder ist es generell besser darauf zu
> achten möglichst alles von main aus zu öffnen?

Du kannst ohne Probleme in einer Funktion eine Funktion aufrufen, jedoch 
nicht ungebgegrenzt. Sprich, wenn du in einer Funktion eine Funktion 
aufrufst und in dieser wieder eine aufrufts und wieder eine und wieder 
eine usw. gibts irgendwann ein Stack Overflow

Noch was: Lass bitte noch das ; hinter den Funktionen weg, also:

void main(void) // hier kein Semikolon
{
  erstens();
}
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.