Ich sehe Spagetticode (GOTOaus einem UP das mit RETURN Verlassen werden soll)
Code:
void Justierung() {
if (M1_fertig == true) {
goto M2_Sprung; // M1 wird übersprungen
}
if (JustPin == HIGH) {
return;
} // *********** ENDE if (JustPin == HIGH)
return; // Sprung aus UP Justierung
}
M2_Sprung:
Was sagt denn Dein Stack und dein Heap zu dem Konstrukt? läuft da nicht was auf Dauer über oder hast Du es noch nicht lang genug laufen lasse?
Du rufst ja Justierung() auf und jedesmal wenn Du mit einem GOTO rausspringst verlässt DU es nicht mehr (zumindest nicht für den Prozessor).
Wenn schon GOTO dann definitiv nur innerhalb der Funktion. Verlassen solltest Du die Funktion aber mit einer korrekten Abbruchbedingung und einem Rückgabewert, der in der Hauptschleife verarbeitet wird und zum Aufruf von dem was nach M2_Sprung kommt, führt.
Um zu verstehen wann man GOTO einsetzen kann und wann es gfährlich ist, müsste jeder eigentlich erst mal Assembler lernen. Da gibt es nämlich nur GOTO (Jump / Farjump) Allerdings muß man sich da auch selbst darum kümmern Register zu retten, Stackpointer und den Heap zu verwalten.
Hochsprachen nehmen einem das ales ab, haben aber oft noch das GOTO (JUMP) drin.
Ohne das verständniss davon was im Hintergrund läuft, kann GOTO an der falschen Stelle und falsch eingesetzt zu einem (für das Programm) tödlichen Bumerang werden.
Nicht umsonst ist die Fraktion entstanden die GOTO generell verteufelt.
Als Anfänger sollte man GOTO meiden bis man verstanden hat was wann wo geschieht und man in der Lage ist zu erkennen wo ein GOTO schlanken Code erzeugt und wo es Chaos und Abstürze verursacht.
Lesezeichen