Saubere Programmierung


Saubere Programmierung

von hansolo_forever » Do 24. Mai 2018, 16:30
Hallo, ich bin der Roman aus Augsburg und komplett neu hier !
Neulich habe ich von euch noch ein Exemplar des 'Turbo-Basic XL 1.5'-Handbuchs bekommen und entdecke gerade die tollen Eigenschaften dieser genialen Sprache (allein der DUMP ist schon eine Offenbarung ,sozusagen :D )...
Danke für das tolle Buch !!! Schade, das alles hätte ich vor 30 Jahren gebraucht... :?

Nun eine Frage, die ich nicht selbst zufriedenstellend lösen konnte - es geht um das erweiterte IF:

1000 DO: EXEC 'mach_mal'
1010 IF (bedingung1):PRINT "Roger, mate !":EXEC 'screenzeugs':EXIT
1020 ELSE: IF (bedingung2) THEN PRINT 'Vergiß es !":EXEC 'screenzeugs':EXIT
1030 ENDIF
1040 LOOP

Wenn jetzt 'bedingung1' schon beim ersten Durchlauf erfüllt ist, und das ELSE gar nicht erst relevant wird - ist der IF-Block dann trotzdem 'sauber' abgeschlossen, oder ist das so, wie eine Schleife ohne POP zu verlassen ?
Vulgo: Hinterlasse ich eine offene Baustelle auf dem Stack ?
Laufen tut's anstandslos, aber was da für potientielle Fallgruben im Speicher lauern, kann ich alles nicht recht einschätzen - und ich bin grade im 'Optimierungswahn'... :D

Für sachdienliche Hinweise schon mal vielen Dank
und liebe Grüße
da han (der heute wohl noch in's Kino muß, wenn er sich von seinem ATARI trennen kann... ^^)

Re: Saubere Programmierung

von Sleepy » Do 24. Mai 2018, 17:04
Basierend auf der originalen Aleitung des Programmierers (ohne jetzt den internen Ablauf von Turbo-Basic auf Assemblerebene zu kennen) aus der Happy Computer, würde ich sagen, daß das If-THEN-ELSE, bei Verwendung von "EXIT", sauber verlassen wird:
exit.jpg
exit.jpg (59.49 KiB) 2380-mal betrachtet


Hier steht zwar das EXIT bei Schleifen Anwendung findet, aber grundsätzlich würde ich sagen daß es dann auch zum Ende einer IF-THEN-ELSE-Schleife springen sollte (und dies offenbar ja auch tut) und diese somit sauber beendet.

Mann (oder Frau) korrigiere mich bitte falls meine Annahme inkorrekt ist!

Sleepy

Re: Saubere Programmierung

von hansolo_forever » Do 24. Mai 2018, 18:19
Danke für die schnelle Antwort, Sleepy - klar, ich hatte das 'stets ans ENDE DER SCHLEIFE' nicht so recht verinnerlicht.
Das ENDIF signalisiert ja nur, dass alles Nachfolgende nicht mehr von der voranstehenden Bedingung abhängig ist. Die Sache sollte also immer sauber beendet werden.
Merci dir und 'klonk' :beer:

Ich space gerade so durch das Forum (ein Faß ohne Boden ^^), und bin da gleich auf noch eine Frage gestossen:
(zitiert aus einem uralten Beitrag von FlorianD, Thread 'Action!wie geht das?'):
'
Standard-BASIC:
100 ? "HALLO ";
110 GOSUB 1000
120 END
1000 ? "ABBUC-USER!"
1010 RETURN
ist nicht schön, weil keiner weiss, was "GOSUB 1000" bedeutet.

Turbobasic
100 ? "HALLO ";
110 EXEC DRUCKEUSERGRUSS
120 END
1000 PROC DRUCKUSERGRUSS
1005 ? "ABBUC-USER!"
1010 RETURN
ist schon besser
'

Da hat er ja Recht (bis auf den Feheler in 1010, soll wohl ENDPROC heißen... ^^), aber für mich ergibt sich da gleich ein neues Problem:
Angenommen, nach dem Aufruf in 110 hakt etwas (also muß das Ergebnis der Subroutine spinnen), dann kann ich mit LIST 1000,1xxx geziehlt nachguggn. Aber bei der Suche nach PROC DRUCKUSERGRUSS muß ich das ganze Listing abgrasen, da meine handschriftliche Doku 'Was steht wo ?' natürlich im Eifer des Gefechts völlig unbrauchbar geworden ist...
Aber eine elegantere Lösung als 'pen-and-paper' gibt es wohl nicht ? Andererseits - gerade dieses Programmieren 'zu Fuß' macht für mich den großen Reiz an den Oldtimern aus, mit ECLIPSE & Co. kann schließlich jeder... :)

Noch ein Wort in eigener Sache: Als (Wieder-)Einsteiger nach 25 Jahren habe ich zahllose Fragen auf Lager und versuche mich auch tunlichst zu bremsen - wenn's jemanden nervt, bitte einfach Bescheid sagen ! :oops:

LG
der han

Re: Saubere Programmierung

von Sleepy » Do 24. Mai 2018, 19:31
hansolo_forever hat geschrieben:Da hat er ja Recht (bis auf den Feheler in 1010, soll wohl ENDPROC heißen... ^^)


Würde ich auch sagen. ;-)

hansolo_forever hat geschrieben:Aber bei der Suche nach PROC DRUCKUSERGRUSS muß ich das ganze Listing abgrasen,


Hier hilft DUMP: Es listet nicht nur alle benutzten Variablen auf, sondern auch alle Prozeduren samt Startadresse.

BTW: DUMP listet auch Variablen auf, die Du mal in dem Programm benutzt, aber wieder rausgenommen(!) hast. Solche "Altlasten" wirst Du bei Bedarf (zu viele Variablen definiert) los indem Du das Listing mal nicht mit SAVE "D:xxx.TUR, sondern mit LIST "D:xxx.LST speicherst, dann mit NEW den Speicher (inkl. aller Variablendefinitionen) löschst, und dann das Programm mit ENTER "D:xxx.LST wieder in den Speicher holst. Achtung: Das LISTen bzw. ENTERn dauert deutlich länger als SAVE / LOAD!

Dann stehen nur noch die aktuell benutzten Variablen in der Variableliste. Jetzt kannst Du es natürlich wieder mit SAVE bzw. LOAD arbeiten.

Sleepy

Re: Saubere Programmierung

von hansolo_forever » Do 24. Mai 2018, 21:57
Dank erneut - so 'sleepy' scheins'd garnicht zu sein... ^^
Mei, ich frei - dass mir DUMP auch die Zeilennummern der PROCs und LABAELs ausgibt, daran hab ich garnicht gedacht - ich hab echt das genaue Hinschauen verlernt.
Das mit dem LIST/ENTER-Trick hatte ich zwar in eurem super Buch gelesen, aber zuerst garnicht kapiert, wozu das gut sein soll...
Bis ich Version prog.005 mal gedumpt habe, und Variablen vorfand, die längst im Nirvana von prog.004 verschwinden hätten müssen. :idea:...
Kann mich nicht erinnern, das mal in einem Atari-Magazin oder c'k gelesen zu haben - da muß man echt erst mal draufkommen ! Wirklich fuxxiger Trick, und ich seh' schon, hier kann man echt was lernen... (irgendwann will mit Action! anfangen, aber jetzt erst mal TB, das ist spaßig genug für's Erste)

LG Roman

Re: Saubere Programmierung

von Sleepy » Do 24. Mai 2018, 22:52
hansolo_forever hat geschrieben:- ich hab echt das genaue Hinschauen verlernt.


Ach, das kenn´ ich: Der aktuellen "RETURN" liegt das Poster eines Marble-Madness-Automaten bei; darunter steht u.a. "For Amusement Only e.V." - das ist mir erst nach einer kurzen Diskussion über den Automaten wirklich aufgefallen... :mrgreen:

Sleepy

Re: Saubere Programmierung

von atarixle » Sa 26. Mai 2018, 00:18
hansolo_forever hat geschrieben:1000 DO: EXEC 'mach_mal'
1010 IF (bedingung1):PRINT "Roger, mate !":EXEC 'screenzeugs':EXIT
1020 ELSE: IF (bedingung2) THEN PRINT 'Vergiß es !":EXEC 'screenzeugs':EXIT
1030 ENDIF
1040 LOOP


Also, wenn ich
10 DIM X$(32767)
1000 DO
1010 IF 1:EXIT
1020 ELSE :IF 1 THEN ? "Vergiss es!":EXIT
1030 ENDIF
1040 LOOP
1990 GOTO 1000
dauerhaft laufen lasse, kommt es zu keinem Überlauf. Trage ich in Zeile 1010 eine 0 (Null) ein, dann auch nicht. IF legt offensichtlich keine Rücksprungadresse auf den Stapel.