Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
harpas
Anmeldungsdatum: 11.08.2009 Beiträge: 14
|
Verfasst am: 16.07.2014, 17:32 Titel: Doch Goto? |
|
|
Einen guten Tag der FB-Gemeinde,
Anfänger bittet um Hilfe bei der Lösung meines Problems.
Wie schreibt man soetwas in FB:
Code: |
310 Input "U(1) =";U(1)
320 IF U(1) = 0 Goto 310 |
|
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 16.07.2014, 17:53 Titel: |
|
|
Qbasic:
Code: | 310 Input "U(1) =";U(1)
320 IF U(1) = 0 Goto 310 |
Freebasic:
Code: | DO
INPUT "U(1) ="; U(1)
LOOP WHILE U(1) = 0 |
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
harpas
Anmeldungsdatum: 11.08.2009 Beiträge: 14
|
Verfasst am: 16.07.2014, 18:28 Titel: Doch Goto? |
|
|
Hallo ALWIM,
vielen Dank für deine schnelle Antwort!! |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 16.07.2014, 18:47 Titel: |
|
|
anfang:
Input "U(1) =";U(1)
IF U(1) = 0 Goto anfang |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 16.07.2014, 19:34 Titel: Funktionalität in FUNCTION-Unterprogramm auslagern |
|
|
Hallo,
ALWIMs zweite Variante ("Freebasic:") ist gut, die anderen sind nicht empfehlenswert.
Ich möchte noch eine weitere Variante vorschlagen, die etwas komfortabler zu verwenden ist. Ganz besonders, wenn nicht nur eine Variable eingegeben werden soll, sondern mehrere.
So sieht das Ergebnis aus:
Der Code dazu - sieht lang aus, ist aber halb so wild, da das ein komplettes Beispiel-Programm ist (fertig ausführbar) und nicht nur ein Ausschnitt:
Code: | 'Deklarationen von Unterprogrammen, quasi eigenen Befehlen:
Declare Function LiesNichtNullGanzzahlEingabe (Eingabeaufforderung As String) As Integer
'Beginn des Hauptprogramms ab hier.
Print "Bitte geben Sie nacheinander die U-Werte ein!"
Print
Dim index As Integer
Dim U(1 To 5) As Integer
Dim Beschriftung As String
' Mach Folgendes fuer alle U-Array-Elemente von der untersten Grenze bis zur oberen:
For index = LBound(U) To UBound(U)
Beschriftung = "Bitte eingeben: U(" & index & ") = "
' Das U-Element mit dem Index "index" wird mit einer Eingabe anders als 0 bestueckt:
U(index) = LiesNichtNullGanzzahlEingabe ( Beschriftung )
Next index
Print
Print "Fertig. Ihre Eingaben waren:"
' Alle U-Array-Elemente von vorne bis hinten in einer Zeile auflisten:
For index = LBound(U) To UBound(U)
Print U(index); " ";
Next index
Print
Print
Print "Beliebige Taste zum Beenden druecken."
GetKey 'Warten auf beliebige Taste.
End
' Ende des Hauptprogramms. Ab hier Unterprogramme ("eigene Befehle"):
Function LiesNichtNullGanzzahlEingabe (Eingabeaufforderung As String) As Integer
Dim Eingabe As Integer
' Mach Folgendes so lange ...
Do
Print Eingabeaufforderung;
Input "", Eingabe
If (Eingabe = 0) Then
Print " --> Die Eingabe war leider ungueltig (0). Bitte wiederholen."
End If
Loop Until Eingabe <> 0 ' ... bis Eingabe einen Wert anders als 0 erhalten hat.
Return Eingabe
End Function |
Das Kernstück des Beispielcodes ist die Funktion LiesNichtNullGanzzahlEingabe. Dabei handelt es sich quasi um einen "eigenen Befehl", der den normalen Input-Befehl von FreeBASIC um die gewünschte Funktionalität erweitert.
Wenn du die FUNCTION in dein Programm einbindest, brauchst du an einer Verwendungsstelle nur noch zu schreiben:
Code: | x = LiesNichtNullGanzzahlEingabe ("Geben Sie die x-Koordinate ein: ") |
Du musst also nicht an vielen verschiedenen Stellen im Programm Schleifen einbauen oder so, sondern es reicht dann 1 Zeile, um einen Wert ungleich 0 eingeben zu lassen. Der "Befehl" wiederholt intern die Eingabe so lange, bis der User das richtige eingibt.
Download des Programms hier: Quelltext (BAS), Compiliert für Windows (EXE)
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
harpas
Anmeldungsdatum: 11.08.2009 Beiträge: 14
|
Verfasst am: 17.07.2014, 20:31 Titel: Doch Goto? |
|
|
Ein Hallo allen antwortenden Usern und meinen Dank!!!!!!
Insbesondere dir Sebastian, kannst du hellsehen ?
In meinem meinem zu erstellenden Prog.(Trafo Berechnung) brauche ich tatsächlich 5 mal U.
Habe das Prog.vor 40 Jahren mit einem Freund in c64 bzw. Atari Basic und vielen goto`s erstellt. Nun habe ich viel Zeit und versuche es unter FB
zu laufen zu bringen.
Mit besten Grüßen
harpas |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 17.07.2014, 22:44 Titel: |
|
|
--------------------------
Habe das Prog.vor 40 Jahren mit einem Freund in c64 bzw. Atari Basic und vielen goto`s erstellt.
--------------------------
Na , dann probier es wieder mit Goto...
Wenn du den ASM-Code von Freebasic anschaust, siehst du das Freebasic-Goto viel effizienter umgesetzt werden wie eine Funktionsaufruf.
Hier hat dieses Goto einen Namen und keine Zahl wie beim C64 oder Ataribasic.
Gruss |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 19.07.2014, 02:09 Titel: |
|
|
arduno hat Folgendes geschrieben: | --------------------------
Habe das Prog.vor 40 Jahren mit einem Freund in c64 bzw. Atari Basic und vielen goto`s erstellt.
--------------------------
Na , dann probier es wieder mit Goto...
Wenn du den ASM-Code von Freebasic anschaust, siehst du das Freebasic-Goto viel effizienter umgesetzt werden wie eine Funktionsaufruf.
Hier hat dieses Goto einen Namen und keine Zahl wie beim C64 oder Ataribasic.
Gruss |
Ja das ist total cool, dann verbraucht dein Programm statt 5 Nanosekunden Prozessorzeit plötzlich nur noch 3 Nanosekunden!!111 Wer braucht schon Wartbarkeit, wenn man dafuer so *immense* Einsparungen hat [/sarcasm]
Nein ehrlich, vermeide die Benutzung von goto.
(IMHO gibt es legitime Einsatzzwecke, aber dieser ist *definitiv* keiner.) _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
creepi
Anmeldungsdatum: 13.06.2010 Beiträge: 59
|
Verfasst am: 21.07.2014, 01:48 Titel: |
|
|
...auch wenn es schon was still wurde.
Ich würde es gerne unterstreichen, verzichte auf goto´s.
Anfangs hatte ich auch mit den gearbeitet, kam super mit zurecht und dacht warum sollte ich denn...... nur die quittung kommt wenn das projekt immer größer wird. Hatte mich dann mal mit den subs beschäftigt, lohnt sich : )
Ohne goto wird es erheblich übersichtiger. Auch wenn zb. innerhalb des programms etwas verändert werden muss... anfangs vielleicht ungewohnt aber wir sind ja menschen und somit lernfähig
Hab gerad auch was dazu gelernt. Hatte mich bei dem Code von Sebastian gefragt wo denn bitte schön UBound und LBound deklariert ist, woher die for schleife weiß welchen wert ubount hat...
Wieder was dazu gelernt und ich hab seit jahren damit gearbeitet nen integer wert zu haben wo ich für die for schleife hinterlege wie groß ein array ist. Soviel dazu, man lernt nie aus
( http://www.freebasic-portal.de/befehlsreferenz/ubound-184.html ) |
|
Nach oben |
|
 |
darkinsanity aka sts

Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 03.08.2014, 02:52 Titel: |
|
|
arduno hat Folgendes geschrieben: | Wenn du den ASM-Code von Freebasic anschaust, siehst du das Freebasic-Goto viel effizienter umgesetzt werden wie eine Funktionsaufruf. |
Junge Junge, erzähl doch bitte nicht so einen Quark...
Zunächst einmal ist goto ein unbedingter Sprung ohne Rücksprung und lässt sich daher am ehesten mit einer Schleife vergleichen.
Los gehts:
goto-Beispiel
do-loop-Beispiel
Man erkennt, dass die goto-Variante vor allem durch ihre dämliche jne-jmp Kombination auffällt die bei do-loop durch je ersetzt wurde. do-loop braucht also sogar einen Opcode weniger. Von der Performance her geben sich die beiden trivialen Beispiele natürlich so ziemlich die Klinke in die Hand.
Wie oben bereits gesagt ist der Vergleich von goto mit Funktionsaufrufen nicht sinnvoll, da bietet sich ein Vergleich von gosub und Funktionsaufrufen schon eher an.
Also der Vollständigkeit halber das auch noch, angefangen mit dem normalen Funktionsaufruf: Beispiel
Ziemlich wenig Kosten, wir haben lediglich ein call, also wird hier die Adresse der Instruktion nach dem call auf den Stack gepusht und dann nach _T@0 gesprungen. Die Funktion verrichtet dann gleich ihre Arbeit d.h. pusht Parameter und ruft _fb_StrAllocTempDescZEx@8 sowie _fb_PrintString@12 auf. Danach kommt ret, d.h. die Rücksprungadresse wird vom Stack geholt und es wird dorthin gesprungen.
Jetzt also gosub: Beispiel
Zunächst kein großer Unterschied, nur hat unsere "Funktion" jetzt keinen Namen mehr sondern wird über ein call an .Lt_0004 aufgerufen. Aber Moment, was hat das .Lt_0007 da zu suchen? Und was ist "call _fb_ErrorSetNum@4" mit dem Parameter "16"? Ganz einfach: Error-handling. 16 ist der Fehlercode für "return without gosub" (ON ERROR, anyone?). Wir haben hier vor unserer Nase eine normale sub mit Overhead.
Gosub ist also nicht nur unflexibel (keine Parameterübergabe möglich) und unleserlich sondern generiert, bedingt durch die Syntax, auch noch schlechten Code.
Abschließend lässt sich sagen: Die Benutzung von gosub/goto statt der dafür vorgesehenen und hier als richtig dargestellten Konstrukte ist weder durch Performance noch sonstiges zu rechtfertigen sondern stellt in der heutigen Zeit einen Fehler dar. In der Vergangenheit war deren Benutzung unumgänglich, heute ist sie das jedoch nicht. Jeder, der heute noch den Einsatz von goto preist, hat nichts aus den Disastern bei Apple und GnuTLS gelernt. _________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak |
|
Nach oben |
|
 |
|