
Zitat von
Grillmeister Markus
Auch wenn die sache mit GOTO angeblich ein unsaubererprogrammierstiel ist, so erscheint es mir doch deutlich einfacher und überlichtlicher.
Hallo
Einfacher schon, aber nicht übersichtlicher. Und einfacher auch nur bei sehr kleinen Programme und weil du den Stack nicht überflutest.
Du hast zum Beispiel einen (On Timer0 Ontimer) in deinem Programme, wenn du jetzt in der Ontimer Routine einen GOTO rein setzt wirst du wieder einen Stacküberlauf haben, weil bei einem Interrupt Automatisch die Rücksprungadresse auf den Stack abgelegt wird, und sie so nie gelöscht wird.
Im Grund ist es so. du sollst ein Hauptprogramm haben was in einer Schleife läuft, in dem Hauptprogramme reagierst du auf verschiedene Ereignisse wie zum Beispiel Tassendruck, dann rufst eine Unterroutine auf die diese Arbeit erledigt dann springst du wieder in die Hauptroutine zurück. So das dein Programm aus einem Mainprogramm besteht, und viele kleinen Unterprogramme.
Du kannst auch aus einem Unterprogramm ein andres Unterprogramm aufrufen, aber immer wieder dahin zurück springen wo du herkommst.
Was du auch vermeiden sollst ist, aus einem aufgerufenen Unterprogramm das aufrufende Unterprogramm aufrufen. Weil du dich dann in eine Endlosschleife begeben kannst die nie endet.
So kannst du dein Programm Ablauf sehr einfach verfolgen und schnell Fehler entdecken. Mit GOTO Ist das nicht so einfach. Wenn du zum Beispiel eine Variable hast die an einer bestimmten Stelle einen falschen Wehrt hat, und du dann feststellen sollst wo der her kommt ist das nicht mehr so einfach, weil du eben hin und her springst.
Ich habe dir mal dein Programm so umgeändert wie es aussehen sollte. Du kannst es nicht so einsetzen, es soll lediglich das Prinzip verdeutlichen.
Code:
$regfile = "2313def.dat"
$crystal = 3686400
$baud = 9600
Dim Zaehler As Byte
Ddrd.2 = 1 'motor links vorwärts
Ddrd.3 = 1 'motor links rückwärts
Ddrd.4 = 1 'motor rechts vorwärts
Ddrd.5 = 1 'motor rechts rückwärts
Ddrb.0 = 0 'taster links vorne
Ddrb.1 = 0 'taster mitte vorne
Ddrb.2 = 0 'taster rechts vorne
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Mlinksvor Alias Portd.2
Mlinksrueck Alias Portd.3
Mrechtsvor Alias Portd.4
Mrechtsrueck Alias Portd.5
Schalterlinks Alias Pinb.0
Schaltermitte Alias Pinb.1
Schalterrechts Alias Pinb.2
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
Start Timer0
Enable Interrupts
On Timer0 Ontimer
''Main:
Do
Mlinksvor = 1
Mlinksrueck = 0
Mrechtsvor = 1
Mrechtsrueck = 0
If Schalterlinks = 0 Then
Zaehler = 0
Gosub Links
End If
If Schaltermitte = 0 Then
Zaehler = 0
Gosub Mitte
End If
If Schalterrechts = 0 Then
Zaehler = 0
Gosub Rechts
End If
Loop
Links:
Do
If Zaehler => 33 Then
Mlinksvor = 1
Mlinksrueck = 0
Mrechtsvor = 0
Mrechtsrueck = 1
Else
Mlinksvor = 0
Mlinksrueck = 1
Mrechtsvor = 0
Mrechtsrueck = 1
End If
If Zaehler = 83 Then
Return
End If
Loop
Mitte:
Do
If Zaehler => 33 Then
Mlinksvor = 1
Mlinksrueck = 0
Mrechtsvor = 0
Mrechtsrueck = 1
Else
Mlinksvor = 0
Mlinksrueck = 1
Mrechtsvor = 0
Mrechtsrueck = 1
End If
If Zaehler = 101 Then
Return
End If
Loop
Rechts:
Do
If Zaehler => 33 Then
Mlinksvor = 0
Mlinksrueck = 1
Mrechtsvor = 1
Mrechtsrueck = 0
Else
Mlinksvor = 0
Mlinksrueck = 1
Mrechtsvor = 0
Mrechtsrueck = 1
End If
If Zaehler = 83 Then
Return
End If
Loop
Ontimer:
Incr Zaehler
Print Zaehler
Return
Schau dir auch mal an wie ich aus deinen Zwei (If Zaehler > 33 Or Zaehler = 33 Then If Zaehler < 33 Then ) eine mit ELSE gemacht habe. Die ist viel übersichtlicher, und zudem im Prinzip auch noch schneller.
Ein andrer Grund ist, dass es in andren Sprachen keinen GOTO gibt. Wenn du dir den GOTO zu sehr angewöhnst wirst du beim umsteigen auf eine andere Sprache viel Schwierigkeiten haben.
Für den Anfang würde ich dir raten mit einem Flußdiagramme zuarbeiten Googel mal nach Flußdiagramme. Eine andre und bessere Möglichkeit ist mit einem Struktogramme, aber das ist ein wenig schwieriger. Und erst wenn dein Programm im Flußdiagramme funktioniert solltest du anfangen den Code zuschreiben.
So ich hoffe ich konnte dir ein wenig weiter helfen, und noch viel Spaß beim Progen.
mfg
Guy
Lesezeichen