Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Doch Goto?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
harpas



Anmeldungsdatum: 11.08.2009
Beiträge: 14

BeitragVerfasst am: 16.07.2014, 17:32    Titel: Doch Goto? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 16.07.2014, 17:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
harpas



Anmeldungsdatum: 11.08.2009
Beiträge: 14

BeitragVerfasst am: 16.07.2014, 18:28    Titel: Doch Goto? Antworten mit Zitat

Hallo ALWIM,
vielen Dank für deine schnelle Antwort!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 16.07.2014, 18:47    Titel: Antworten mit Zitat

anfang:
Input "U(1) =";U(1)
IF U(1) = 0 Goto anfang
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 16.07.2014, 19:34    Titel: Funktionalität in FUNCTION-Unterprogramm auslagern Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
harpas



Anmeldungsdatum: 11.08.2009
Beiträge: 14

BeitragVerfasst am: 17.07.2014, 20:31    Titel: Doch Goto? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 17.07.2014, 22:44    Titel: Antworten mit Zitat

--------------------------
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
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 19.07.2014, 02:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
creepi



Anmeldungsdatum: 13.06.2010
Beiträge: 59

BeitragVerfasst am: 21.07.2014, 01:48    Titel: Antworten mit Zitat

...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 grinsen


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 grinsen
( http://www.freebasic-portal.de/befehlsreferenz/ubound-184.html )
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 03.08.2014, 02:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz