PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : if then else Schleife möglich mit goto zu verlassen?



mat-sche
03.02.2009, 19:25
Hallo und nen netten Abend!

Ich habe ein Problem im meinem Code, mal wieder :)

Ich benutze in meiner Schaltung ein LCD welches über TWI angesprochen wird. Dieses zeigt mir bis zu einem Punkt immer alles folge richtig an, nur wenn ein bestimmter Codeteil angesprungen wird entsteht wirres Zeug auf dem Display. Aber nicht gleich.... es vergehen einige Minuten Stunden?...

Ich lasse in dem Programmteil ein Case-Anweisung durchspielen und in der steht folgendes:


Case 1 : If Rel_bad_zu = 0 And Fenster_bad_offen = 0 Then 'Tastenverrieglung
Toggle Rel_bad_auf 'umschalten von Port zwischen 0&1
Fenster_bad_zu = 0 ' nach fenster vollständig runter, erst wieder möglich runter zu fahren nach dem es wieder rauffuhr
Else
Twi_daten = 0
Goto Ende
End If
Locate 2 , 3
Lcd Rel_bad_auf

If Rel_bad_auf = 1 And Flag_bad_auf_2 = 0 And Flag_bad_zu_2 = 0 Then 'if Abfrage jedesmal wenn case1 ist und somit der Port getoggle wird
Flag_bad_auf_1 = Rolltime + Timecount ' flag mit der Laufzeit für Fenster kompl. auf plus Sekundenzähler
Elseif Rel_bad_auf = 1 And Flag_bad_zu_2 > 0 Then
Flag_bad_auf_2 = Rolltime - Flag_bad_zu_2 'nach dem das Fenster runtergefahren wurde, wurde der Laufzeitwert im Flag_bad_zu_2 gespeichert, jetzt wird bei
Flag_bad_auf_1 = Timecount + Flag_bad_auf_2 ' erneutem auffahren die restliche Zeit, für komplett auf, neu in Flag_bad_auf_1 geschrieben
Flag_bad_zu_2 = 0 ' löschen der der Zeit die schon zugefahren ist
End If

If Rel_bad_auf = 0 And Flag_bad_auf_2 > 0 Then 'if Abfrage jedesmal wenn case1 ist und somit der Port getoggle wird
Elseif Rel_bad_auf = 1 And Flag_bad_auf_2 > 0 Then '
Flag_bad_auf_1 = Timecount + Flag_bad_auf_2
Flag_bad_auf_2 = 0
End If

If Rel_bad_auf = 0 And Flag_bad_auf_1 > 0 Then
Flag_bad_auf_2 = Timecount
Flag_bad_auf_2 = Flag_bad_auf_1 - Flag_bad_auf_2
End If

Twi_daten = 0

Nun meine Frage:
=> kann ich in einer If/Then/Elseschleife diese nach der else-Anweisung mit goto verlassen?
like this:


Case 1 : If Rel_bad_zu = 0 And Fenster_bad_offen = 0 Then 'Tastenverrieglung
Toggle Rel_bad_auf 'umschalten von Port zwischen 0&1
Fenster_bad_zu = 0 ' nach fenster vollständig runter, erst wieder möglich runter zu fahren nach dem es wieder rauf fuhr

Else
Twi_daten = 0
Goto Ende
End If

Locate 2 , 3
Lcd Rel_bad_auf


Ich denke das mein Problem sein kann.... oder doch nicht?

Danke und Gruß MAT

for_ro
03.02.2009, 20:10
Hallo Mat,
man kann deinem Code nicht entnehmen, wohin Goto Ende springt.
Solange du nicht aus einem Unterprogramm/Funktion/ISR rausspringst, ist das kein Problem.
Wenn du das nicht machst, sollte das wirre Zeugs auf deinem LCD einen anderen Grund haben.

Gruß

Rolf

Vitis
03.02.2009, 20:45
GOTO .... brrrrrrrrrr

schlechter Programmierstil, kann
mächtig nach hinten los gehen von
wegen Stack Überlauf und andere Phänomene

außerdem, if then ist keine Schleife, sondern ne Programmverzweigung

Schleifen sind

do loop, for next, while wend ...

Gento
03.02.2009, 22:16
Codekrampf was ich oben lese.



Sub Rs232_datenuebertragung()
Code
code
code
if ergebniss=Blöde then Exit Sub
code
code
code
End Sub


Schont Nerven ,Augen and Stack.

lg gento

for_ro
03.02.2009, 23:07
GOTO .... brrrrrrrrrr

schlechter Programmierstil, kann
mächtig nach hinten los gehen von
wegen Stack Überlauf und andere Phänomene

außerdem, if then ist keine Schleife, sondern ne Programmverzweigung

Schleifen sind

do loop, for next, while wend ...

Hallo Vitis,
wieso ist ein einzelnes Goto schlechter Programmierstil? Du weißt doch gar nicht, ob sein Programm aus Spaghetti-Code besteht, oder dies eine Notbremse zum Verlassen eines Programmteils ist. Und den besserwisserischen Hinweis auf die Schleife habe ich auch schon zig-mal gelesen.
Erklär ihm doch lieber, wie er es anders machen könnte. Oder wieso der Stacküberlauf sehrwohl einen Einfluss auf seine wirren Zeichen haben kann.



Codekrampf was ich oben lese.



Sub Rs232_datenuebertragung()
Code
code
code
if ergebniss=Blöde then Exit Sub
code
code
code
End Sub


Schont Nerven ,Augen and Stack.

lg gento

Hallo gento,
was willst du denn damit sagen? Dass Exit Sub sauberer ist als Goto Ende?
Und wo bitteschön ist der Codekrampf in seinem Schnipsel? Weil jede Zeile so lang ist wegen des ausführlichen Kommentars, den er gegeben hat?

Leute, Leute seid ihr wirklich solche Überflieger?

Musste ich mal loswerden.

Gruß

Rolf

Vitis
04.02.2009, 09:11
weil ein einzelnes Goto irgendwo tief im
Code versteckt einen Stunden von
Debugging kosten kann.
Man nehme eine Subroutine, die mit Goto
irgendwo zwischendrin verlassen wird,
lagere sie aus und include sie wieder
und baue 2000 Programmzeilen drumherum.
Dann lasse man die Anwendung
2 Stunden laufen und wundere sich,
warum nicht nachvollziehbar Variablen
überschrieben werden und seltsame
Zeichen an UART oder LCd ankommen.
Viel Spaß beim Suchen solcher Fehler.
Daher ist schon ein Goto schlechter Stil
und wird auch nicht wirklich gebraucht.

Und dass Du die "If-Then-Schleife"
schon zigmal gelesen hast macht sie dennoch
nicht richtiger. Es bleibt eine Verzweigung.
Wenn man im Forum die richtigen Termini
verwendet hilft das den Lesern die Fragen
auch zu verstehen und die Chance auf qualitative
Hinweise erhöht sich.

Bin kein Überflieger, mache auch Fehler und
wenn die mir einer sagt hilft dieser mir aktiv.
Auch konstruktive Kritik ist konstruktiv.

Ent19
04.02.2009, 18:03
Ich bin auch der meinung GOTOs sollte man im allgemein vermeiden, es gibt einfach viele situationen wo man keine GOTOs verwenden sollte.

Um 'Schleifen' zu unterbrechen gibt es genug befehle im Bascom um dieses zu tun, wenn man auch Schleifen benutzt.

For I = 1 to 10
#Code
If #Bedingung = TRUE Then Exit For
Next I

While #Bedingung = TRUE
#Code
If #Bedingung2 = TRUE Then Exit While
Wend

diese tolle Funktionen benutzen interne GOTOs mit den man nichts zu tun hat und so auch kaum probleme verursachen
Die IF variante würde so aussehen



Dim Counter as Byte
Dim Countfrom as Byte
Dim Countto as Byte
Dim Breakbedingung as Bit

'Alias For I = 1 To 10
Countfrom = 1
Countto = 10
Counter = Countfrom
Pseudofor_start:
#Code
If Breakbedingung = 1 Then Goto Pseudofor_end
If Countto > Counter Then
Incr Counter
Goto Pseudofor_start
End If
Pseudofor_end:


Man sollte kein GOTO benutzten bei einem CALL, wo es ein RETI gibt beim rücksprung. Das ist ein Return befehl der die Register wieder herstellt.

Also mit einem Call Befehl werden vorher die Register gespeichert, bei den Return befehl werden die wieder hergestellt, man sollte nicht in ein solchen Bereich rein oder raus springen.

SUB FUNCTION
<-- Hier nicht reinspringen
---> Hier nicht rausspringen mit Goto, Gosub ist ok.
END SUB FUNCTION

On Urxc Onrxd <-- Interruptaufruf wenn 1 Zeichen emfangen wurde(COM).


Hier werden die Register gesichert und nacher zurück geschrieben.
Onrxd:
<-- Mit einem Sprung hier rein überschreibst du die Register mit unbekannte werte
--> Mit einem Sprung hier raus werden die werte nicht wieder hergestellt beim nächsten RETURN
Return <-- Ist ein RETI

Mit GOTOs kann man auch schnell wieder in ein Programmteil landen der dir die Display variablen ändert während du sie gerade übertragst, oder einfach eine Variable ändert die was mit dem Display zu tun hat.
Wenn du z.b. Ein String hast das die erste Zeile deines Displays entspricht, kann es passieren das wenn du vorher noch mit einem Index point ein Byte im String änderst, das dieses zu Fehlern kommen kann. Das kann es passieren, sollte man gerne Variablen doppelt benutzen, das diese in einem anderen Teil des Programs geändert wird, aber beim Display benutzt wird um das Index zu steuern. So kann es passieren das da dann Mühl steht.

Natürlich gibts noch andere möglichkeiten, dafür müsste man aber mehr über das Programm wissen, und auch welche Bascom version du mit welchen Prozessor benutzt.

Vielleicht habe ich dir ja schon so geholfen, sonst kannst dich ja nochmal melden.



Ich benutze GOTOs manchmal um platz zu sparen und die 'AND' und 'OR' funktion zu ersetzen



Dummerweise sparrt das Platz :(
Statt:

If Var1 = 1 And Var2 = 1 Then
#Code
Else
#Code
End If

If Var1 = 1 Then
If Var2 = 1 Then
#Code
Else
Goto Now_do_else
End If
Else
Now_do_else:
#Code
End If

oder:-

If Var1 = 1 Or Var2 = 1 Then
#Code
Else
#Code
End If

If Var1 = 1 Then
Goto Now_do_if
End If

If Var2 = 1 Then
Now_do_if:
#Code
Else
#Code
End If

mat-sche
05.02.2009, 17:48
Hallo Jungs!

Danke für die vielen konstruktiven :) Anregungen!

@vitis


"Es bleibt eine Verzweigung.
Wenn man im Forum die richtigen Termini
verwendet hilft das den Lesern die Fragen
auch zu verstehen und die Chance auf qualitative
Hinweise erhöht sich. "

=> da gebe ich Dir Recht und das war mein Fehler!

in welchen Teilen siehst Du bei mir einen schlechten "Programmierstil"? => Bsp's. bitte

Hier noch einmal ein etwas bessere Form meines Codes:



Case 2 : If Rel_kue_auf = 0 And Fenster_kue_zu = 0 Then
Toggle Rel_kue_zu
Fenster_kue_auf = 0
Else
Twi_daten = 0
Goto Ende
End If

If Rel_kue_zu = 1 And Flag_kue_zu_2 = 0 And Flag_kue_auf_2 = 0 Then
Flag_kue_zu_1 = Rolltime + Timecount
Elseif Rel_kue_zu = 1 And Flag_kue_auf_2 > 0 Then
Flag_kue_zu_2 = Rolltime - Flag_kue_auf_2
Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
Flag_kue_auf_2 = 0
End If

If Rel_kue_zu = 0 And Flag_kue_zu_2 > 0 Then
Elseif Rel_kue_zu = 1 And Flag_kue_zu_2 > 0 Then
Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
Flag_kue_zu_2 = 0
End If
If Rel_kue_zu = 0 And Flag_kue_zu_1 > 0 Then
Flag_kue_zu_2 = Timecount
Flag_kue_zu_2 = Flag_kue_zu_1 - Flag_kue_zu_2
End If
Twi_daten = 0

Case 22 : If Rel_kue_auf = 0 And Fenster_kue_zu = 0 Then
Toggle Rel_kue_zu
Fenster_kue_auf = 0
Else
Twi_daten = 0
Goto Ende
End If

If Rel_kue_zu = 1 And Flag_kue_zu_2 = 0 And Flag_kue_auf_2 = 0 Then
Flag_kue_zu_1 = Rolltime + Timecount
Elseif Rel_kue_zu = 1 And Flag_kue_auf_2 > 0 Then
Flag_kue_zu_2 = Rolltime - Flag_kue_auf_2
Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
Flag_kue_auf_2 = 0
End If

If Rel_kue_zu = 0 And Flag_kue_zu_2 > 0 Then
Elseif Rel_kue_zu = 1 And Flag_kue_zu_2 > 0 Then
Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
Flag_kue_zu_2 = 0
End If
If Rel_kue_zu = 0 And Flag_kue_zu_1 > 0 Then
Flag_kue_zu_2 = Timecount
Flag_kue_zu_2 = Flag_kue_zu_1 - Flag_kue_zu_2
End If
Twi_daten = 0
Ende: <<<==== hier ist das ende

end select


Was wollte ich damit bezwecken?:

tritt eine Case-Fall ein:
case 22: If Rel_kue_auf = 0 And Fenster_kue_zu = 0 Then
Toggle Rel_kue_zu
Fenster_kue_auf = 0
Else
Twi_daten = 0
Goto Ende
End If

und die If-Anweisung ist nicht wahr dann sollen Daten in "Twi_daten " gelöscht werden und es soll aus der Case-Verzweigung gesprungen werden. Somit müssen die weiteren Cases nicht durch gegangen werden.

Wie kann ich nun das besser programmieren, besser wie komme ich aus der Case-Verzweigung heraus?

Vielleicht habe ich die Struktur und/oder den Ablauf eines Programms noch nicht verstanden!
Laut Simulation werden alle Schritte, die man proggt, doch hintereinander abgearbeitet. Was passiert nun in einer Case-Verzweigung?

@ for_ro
Danke für die tröstenden Worte :)



wieso ist ein einzelnes Goto schlechter Programmierstil? Du weißt doch gar nicht, ob sein Programm aus Spaghetti-Code besteht, oder dies eine Notbremse zum Verlassen eines Programmteils ist.

und genau darum geht es!!!!

Wenn die Case-Verzweigung angesprungen wird und die Bedingungen darin nicht erfüllt werden, soll einfach aus der Verzweigung gesprungen werden und die weiteren Programmteile abgearbeitet werden!

Ich hänge noch das gesamte Prog an und bitte!!!! sagt was ich am Stil ändern sollte!

Danke für Eure Hilfen, denn nur so lerne ich es besser und schneller!!!

PicNick
05.02.2009, 19:10
Immer locker. Besser ein Programm mit "goto", das funzt, als ein durchgestyltes, das abstürzt.

Ist oft nur eine Frage der Optik: Ich hab' da z.B. den "Case 1:" Part OHNE goto umgebaut, in dem ich den "Else" mit dem GOTO einfach nach hinten geschoben habe, worauf sich gezeigt hat, dass davon garnix überbleibt.



Case 1 : If Rel_bad_zu = 0 And Fenster_bad_offen = 0 Then
Toggle Rel_bad_auf
Fenster_bad_zu = 0

Locate 2 , 3
Lcd Rel_bad_auf

If Rel_bad_auf = 1 And Flag_bad_auf_2 = 0 And Flag_bad_zu_2 = 0 Then
Flag_bad_auf_1 = Rolltime + Timecount
Elseif Rel_bad_auf = 1 And Flag_bad_zu_2 > 0 Then
Flag_bad_auf_2 = Rolltime - Flag_bad_zu_2
Flag_bad_zu_2 = 0
End If

If Rel_bad_auf = 0 And Flag_bad_auf_2 > 0 Then
Elseif Rel_bad_auf = 1 And Flag_bad_auf_2 > 0 Then
Flag_bad_auf_1 = Timecount + Flag_bad_auf_2
Flag_bad_auf_2 = 0
End If

If Rel_bad_auf = 0 And Flag_bad_auf_1 > 0 Then
Flag_bad_auf_2 = Timecount
Flag_bad_auf_2 = Flag_bad_auf_1 - Flag_bad_auf_2
End If
End If
Twi_daten = 0
' hier springt er ja automatisch ans Ende der "CASE" Anweisung, auch ohne goto.
Case 11:



Das war jetzt nur geschönt, damit Ruhe im Karton ist.

Ich werd' noch versuchen, die Logik zu begreifen, dann gibt's noch mehr Vorschläge.

Vitis
05.02.2009, 19:26
das Programm sonst schaut gut aus,
ist auch prima kommentiert , wie Du bei
PicNick siehst brauchste das Goto garnicht ;)

mat-sche
05.02.2009, 19:58
nun ja...
das ist richtig! Ich dachte mir, dass ich mir damit ein Paar Programmschritte beim Ablauf sparen könnte....

Die Funktion in der Case Verzweigung soll die sein, dass ich ein Rolladen nur auffahren kann:
* wenn er nicht gerade runter fährt
* wenn er auch unten ist

Dann soll er nur eine bestimmte Zeit zum Hochfahren haben. Weiter gibt es die Möglichkeit ihn zwischenzeitlich stoppen zu können und dann soll er die restliche Zeit hochfahren oder wieder runter. Dabei gibt es eine Konstante die eine bestimmte Fahrzeit beinhaltet.
Soviel zu dem Programmteil.

holzi
06.02.2009, 05:38
Guten orgen,
seit 45 Jahren gibt es die Sprache Basic. Seit 45 Jahren wird über den Befehl GoTo diskutiert. Es gibt immer wieder "Programmierer bzw. Entwickler" (mit Absicht in " gesetzt) die auf diesen Befehl anspringen wie eine Rakete. Es ist einfach sehr amüsant diesen Leuten zuzuhören. Ich muss jedenfalls jedesmal bei deren Agumentationen grinsen.
Diese GoTo-Diskutierer sollten besser einmal vernünftig gerade den Anfängern die Vor- und Nachteile des GoTo sinvoll erklären, aber das passiert auch nicht.
Mich würde einmal interessieren, wie die GoTo-Diskutierer folgendes erklären: Warum gibt es überhaupt den GoTo-Befehl? (Den gibt es ja nicht nur in Basic)

Peter

MeckPommER
06.02.2009, 09:22
Der GoTo-Befehl ist einer der elementarten Befehle und ich könnte mir Assemblerprogrammierung schlecht ohne Jumps vorstellen ;-)
Auch Basic verfügt über GoTo. Er stammt aber aus einer Zeit, in der Basic noch nicht so fit war, was Do..Loop, While...Wend und andere schöne Konstrukte angeht.

Für mich ist ein Programm ein Weg, den der Computer zu gehen hat. Dieser führt von oben nach unten und auf diesem Wege manchmal in netten Schleifen.
Schön optimiert verzweigt das Programm gelegentlich in wohlforme Unterprogramme oder ruft Funktionen auf, die auch von oben nach unten und/oder in allerschönsten Schleifen abgearbeitet werden.

In diese Art kann auch ein GoTo wunderbar hineinpassen. Kann ... muss aber nicht. Es gibt Codes, da wird ein einem Programmteil von oben in die Mitte gesprungen, geprüft ob "Äpfel=Birnen" und ggf. in obere Drittel des Blocks gesprungen oder zum Ende, dann kommen weitere Bedingungen und Sprünge ... kurz und gut: man kann nichts mehr sauber lesen.

Der GoTo-Befehl ist meiner Meinung nach ein guter Kumpel, der sich zum Wischiwaschi-Monster entwickelt, wenn man ihn unstrukturiert einsetzt.

Sehr oft kann man auch auf viele GoTos verzichten, wenn man die Logik des umzusetzenden Problems genauer studiert.

Gruß MeckPommER

P.S.: Hurra ... das war im web genau der 100milliardste Beitrag zum Thema Basic und Goto ;-)

PicNick
06.02.2009, 09:40
GOTO gibt's, weil jedesmal, wenn einer den Befehl abschaffen wollte, die o.a. Diskussion ausgebrochen ist.
Ein anständiges "confuse-the-russian" Flussdiagramm läßt sich ohne dem auch schwer umsetzen.

Richtig Pfui-gack ist GOTO auch erst geworden, als die Ideen der strukurierten Programmierung (nassi-shneiderman, haa-haa) versuchten, gegen nicht mehr wartbare Softeware vorzugehen.
Aber auch die kommt ohne goto nicht aus, es hat bestenfalls nur andere Namen.

However, "GOTO" ist eine gute Möglichkeit, aneinader vorbeizuargumentieren, sowas sollte man sich nie entgehen lassen

Vitis
06.02.2009, 10:43
GOTO ist nicht das personifizierte Übel, so ists nicht,
es kann aber zu mächtig fies zu debuggenden Fehlern
führen, daher rate ich von der Verwendung absolut ab.
In dem vorliegenden Fall hat sich nach Durchsicht des
kompletten Codes ergeben, dass es hier durchaus sinnvoll
verwendet werden kann, aber auch nicht zwingend
gebraucht wird.
Ich für meinen Teil bin mir auch nicht sicher
was der Compiler produziert wenn man mit Goto
aus ner IF-THEN innerhalb Select-Case raus springt ... daher würd ich eher die
Version von Dir, PicNick, favorisieren.

PicNick
06.02.2009, 12:11
Vielleicht mag wer gucken, was Bascom aus so einem "Select + GOTO" macht


Do
Select Case Varia1
Case 23:
If Varia2 <> 5 Then
Result = 44
Else
Goto Ende
End If
Case 24:
If Varia2 = 66 Then
Result = 22
Else
Goto Ende
End If
Case Else
Result = 0
End Select
Ende:
Loop
End

Was macht der Bascom draus ?


//-----------------------------
DO:
// Case 23:
LDS r16,0x0060 // load varia1
CPI r16,0x17 // <> 23 ?
BREQ L_0x0092 // next
JMP L_0x00B0 // --> goto next case
L_0x0092: //
LDS r16,0x0061 // load varia1
CPI r16,0x05 // <> 5 ?
BRNE L_0x009E
JMP L_0x00A8
L_0x009E:
LDI r24,0x2C // load '44'
STS 0x0062,r24 // store Result
JMP L_0x00AC
L_0x00A8:
JMP ENDE
L_0x00AC:
JMP ENDE
//-----------------------------
L_0x00B0:
// Case 24
CPI r16,0x18 // load varia1
BREQ L_0x00B8 // <> 24 ?
JMP L_0x00D6
L_0x00B8:
LDS r16,0x0061
CPI r16,0x42
BREQ L_0x00C4
JMP L_0x00CE
L_0x00C4:
LDI r24,0x16
STS 0x0062,r24
JMP L_0x00D2
L_0x00CE:
JMP ENDE
L_0x00D2:
JMP ENDE
L_0x00D6: // Case ELSE
LDI r24,0x00
STS 0x0062,r24 // result = 0

ENDE: //
JMP DO // "LOOP"

.DB 0xF8, 0x94 ;..

L_0x00E2: // "END"
RJMP L_0x00E2 // forever




Da hüpft er rum wie Rumpelstilzchen.

In "C" hätte man statt GOTO eben "break;" geschrieben.

Vitis
13.04.2009, 07:21
Sorry, dass ich die Leiche nochmal aus dem Keller hole,
aber ich hab hier gerade n Programm in der Mache,
bei dem der Programmierer fast wahllos Goto und Gosub
gemischt hat ... natürlich hängt sich die Geschichte
weg.
Ich würde die Gotobeführworter gern zwangsverpflichten
das Debuggen zu müssen ... brrrrrrrrrrrr
Naja, jeder fängt mal an

so gehts schon los:
If xy = 10 Then
Goto Start
Else
If xy = 20 Then
Goto Start
Else
Goto Sensor
End If
End If
Start:

<-- viele Programmschritte später -->

Sensor:
...
Do
Debounce Pinc.2 , 0 , Key1 , Sub 'Taster unten 1 (links)
Debounce Pinc.3 , 0 , Key2 , Sub 'Taster unten 2
Loop

<-- viele Programmschritte später -->

Key1:
Portc.0 = 1
If Man = 1 Then
Else
Goto Menue
End If
Return

<-- viele Programmschritte später -->
Menue:
Do
Debounce Pinc.2 , 0 , Key1a , Sub 'Taster unten 1 (links)
Debounce Pinc.3 , 0 , Key2a , Sub 'Taster unten 2
Debounce Pinc.4 , 0 , Key3a , Sub 'Taster unten 3
Debounce Pinc.5 , 0 , Key4a , Sub 'Taster unten 4
Lcd " Programm Menue "
Loop

Key1a:
Goto Schwellwert

](*,) ](*,) ](*,) ](*,)

Um nicht falsch verstanden zu werden, ich will mich nicht lustig
machen über den Urheber, den auch nicht verteufeln, aber
das Programm ist lausig zu debuggen

PicNick
13.04.2009, 08:57
.....ich will mich nicht lustig machen über den Urheber, den auch nicht verteufeln,.....

Ich wette, du hast dich im ersten Überschwang weniger moderat ausgedrückt :mrgreen:

oberallgeier
13.04.2009, 09:31
... Da hüpft er rum wie Rumpelstilzchen ...
... nicht lustig machen über den Urheber, den auch nicht verteufeln ...Ach wie gut, dass niemand weiß, dass er Rumpelstilzchen heißt.


... im ersten Überschwang weniger moderat ausgedrückt ...Was sagte Rumpelstilzchen zum Schluss ?

sechsrad
13.04.2009, 18:56
Wenn es ein "Goto" gibt in "Bascom", dann hat man sich darüber auch gedanken gemacht, das es auch funktioniert wenn es eingesetzt wird und es der Anwender einsetzen kann.

Wenn sich die Hersteller von "Bascom" darüber keine Gedanken gemacht haben und es nur reingenommen haben weil es so etwas in "Basic" gibt, dann sind die Bascom-Hersteller für mich alle "Idioten", ich wiederhole "Idioten".

Nehme aber an, das der erste Absatz zutrifft.

mfg

thewulf00
13.04.2009, 20:54
... Da hüpft er rum wie Rumpelstilzchen ...
... nicht lustig machen über den Urheber, den auch nicht verteufeln ...Ach wie gut, dass niemand weiß, dass er Rumpelstilzchen heißt.


... im ersten Überschwang weniger moderat ausgedrückt ...Was sagte Rumpelstilzchen zum Schluss ?
Das ist der erste interessante Beitrag dieser Diskussion. Zudem ist es auch das erste Mal, dass es aus dieser Perspektive beleuchtet wird.

oberallgeier
13.04.2009, 22:48
... das erste Mal, dass es aus dieser Perspektive ...Es ist das erste Mal, dass ich etwas über diese Art zu Programmieren gehört hatte. Spaghetticode kenn ich ja, aber jetzt eben auch Rumpelstilzchencode. Immerhin kann ich so mal meine eigenen Oevres prüfen, aber ob die danach besser sind, wage ich doch zu bezweifeln. Ich gehöre (auch) leider zu denen, die glücklich sind, wenn ein Code mal läuft. Egal ob Rumpeletti oder Spaghstilzchen. Egal wie lang und krumm die Ghettis sind oder wie rumpelig das Stilzchen. Aber ich versuche mich zu bessern. Und ich reisse mich nie selbst mitten entzwei - auch wenn mir manchen fehlerhaften Code eher der T... gesagt hat.

....................................http://www.gs-volmarstein.de/eltern/bilder/stilz.jpg

holzi
14.04.2009, 05:46
Guten morgen,
der goto-Sprungbefehl gilt heute bei vielen Programmierern als verpönt, da es keinen einzigen Grund gibt, diesen Befehl zu benutzen. Mit der goto-Labelanweisung kann ein genaues Sprungziel festlegt werden. Es ist dabei egal, ob das Sprungziel vor oder nach dem goto-Statement im Programm aufgeführt wird. Einzige Bedingung ist dabei, dass die Sprunganweisungen und Marken in derselben Funktion liegen müssen.
Warum also ist goto so verpönt? Aus Performancegründen! Durch goto wird der normale Ablauf des Programms einfach unterbrochen. Ein weiterer Grund, goto nicht zu verwenden: Wenn mit goto in einen Anweisungsblock gesprungen wird, der lokale Variablen beinhaltet, ist das Verhalten systemabhängig. Es gibt wohl kaum ein Problem, das sich nicht auch ohne goto lösen lässt. Man kann sagen, dass ein goto mit einem Sprung nach vorne nichts ausmacht. Von einem goto, das aber zurückspringt, kann nur abgeraten werden. In solch einem Fall (zurückspringen) kann z.B. die do-while-Schleife als bessere Alternative verwendet weden.
Ich persöhnlich benutze auf keinen Fall ein goto, egal in welcher Sprache. Es gibt einfach keinen Grund, diesen Befehl einzusetzen.
Oh, ich merke gerade, dass das nicht richtig ist. Ich benutze ihn doch. Wenn in Bascom ein Reset des Programms durchgeführt werden soll/muss, wird das mit goto 0 gemacht. Dabei werden aber auch alle Vatiablen zurück gesetzt und ist somit meiner Meinung nach ein Ausnahmefall.
Durch goto wird ein Code unstrukturiert und unleserlich.
Peter

thewulf00
14.04.2009, 09:16
Hehe, dieser Beitrag gefällt mir sehr. Ich glaube, ich klaue mir das mal eben. (siehe unten)

PicNick
14.04.2009, 09:49
Was die Sache mit den GOTO's noch etwas aufmischt ist ja die Tatsache, dass der Prozessor bei jedem JMP seinen ganzen Pre-fetch Buffer in den Kübel schmeissen muss, so er denn einen hat. Bei den alten x86 Intel's war das durchaus noch ein Thema.

thewulf00
14.04.2009, 09:56
Was die Sache mit den GOTO's noch etwas aufmischt ist ja die Tatsache, dass der Prozessor bei jedem JMP seinen ganzen Pre-fetch Buffer in den Kübel schmeissen muss, so er denn einen hat. Bei den alten x86 Intel's war das durchaus noch ein Thema.
Das wäre das einzige gewesen, was ich auch hätte sagen wollen. Dennoch habe ich es nicht getan, weil das nicht nur bei GOTO der Fall ist, sondern auch bei Verzweigungen, Schleifen, Funktionssprüngen, usw. Also allem, was auch in ASM mit goto gemacht würde.

PicNick
14.04.2009, 10:07
Nun, schon, aber es gilt nur für JMP's, die auch gemacht werden. D.h. Man versucht die Verzweigung nur in den weniger häufigen Fällen zu machen.

Ist aber abgeschweift, denn logo gibt es immer den Spagat zwischen prozessorfreundlich und wartungsfreundlich strukturiert.
Im Idealfall schreibt man ja letzteres und hofft, dass der Optimizer ersteres daraus macht.

thewulf00
14.04.2009, 10:17
Bei einer IF-ELSE-Anweisung oder jeder Schleife mit mehr als einem Durchlauf ist automatisch der Prefetch-Buffer überflüssig.