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:

SUBs in QuickBasic
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 27.09.2005, 00:17    Titel: SUBs in QuickBasic Antworten mit Zitat

Hallo, da alles, was ich über SUBs gelesen habe, so schlecht erklärt ist, daß ich das schlichtweg nicht verstehen kann, bitte ich hiermit mal um ein kleines Beispiel, damit ich dann wenigstens mal im Groben weiß, wie's gemacht wird. Folgendes Programm erzeugt Quadratzahlen:

CLS
For i = 1 to 10
PRINT i * i
Next i

OK, und nun möchte ich mal spaßeshalber und als Übung ein SUB einbauen, um die Zeile "PRINT i * i" als SUB ausführen zu lassen. Wie geht das? Tut mir leid, wenn ich vielleicht etwas nerve mit meinen Fragen, aber dafür sind selbige auch eher einfacher Art für diejenigen, die gut Bescheid wissen. Vielen Dank!

QB42
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 27.09.2005, 00:25    Titel: Antworten mit Zitat

einfach schreiben

[code]SUB printQuadrat (i AS INTEGER)
PRINT i*i
END SUB 'steht von QB dann schon automatisch da[code]
der DECLARE SUB-Header (der erklärt deinem Programm das es die Sub gibt und wie sie aufgerufen wird) wird von QB beim speichern von alleine erstellt, der steht dann ganz am Anfang der Datei.

Aufrufen tust du das ganze dann einfach so:[code]printQuadrat 10 'Ausgabe: 100[/code]

Fertig zwinkern
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 27.09.2005, 00:56    Titel: Antworten mit Zitat

Hallo MisterD, ist gut gemeint, aber auch das bringt mich leider kein Stück weiter, denn ich weiß ja nichtmal, wie ein Bezeichner für SUB überhaupt aussehen muß. Daher bitte ich höflich darum, daß mir mal ein kurzes Beispiel aufgeschrieben wird, wie von einem Hauptprogramm ein SUB-Programm aufgerufen wird. Das SUB-Programm springt dann ja anscheinend von selber zurück ins Hauptprogramm. Vielen Dank!

QB42
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 27.09.2005, 01:03    Titel: Antworten mit Zitat

Hallo

Sieh dir doch mal die Monster-FAQ und das QB-Kochbuch auf www.qbasic.de an. Dort werden praktisch alle Anfängerfragen beantwortet.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 27.09.2005, 09:33    Titel: Antworten mit Zitat

Hatte früher einmal einen riesigen Artikel zum Thema geschrieben:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/SUB-Unterprogramme.html

Am besten einmal von A bis Z durcharbeiten!
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 27.09.2005, 12:24    Titel: Antworten mit Zitat

Es ist völlig hoffnungslos, sich zum Thema SUB-Routinen die Erlärungen in den Monster-Faqs oder aus anderen Quellen durchzulesen, weil die Erklärungen nur diejenigen verstehen, die ohnehin schon wissen, wie es geht. Auch abtippen von egal welchen Beispielen hat keinen Zweck: Entweder gibt es Fehlermeldungen oder es funktioniert nicht. Also bin ich auf Gedeih und Verderb darauf angewiesen, herumprobieren zu müssen! Folgendes Übungs-Beispiel funktioniert nicht und ich möchte bitte wissen, wieso nicht:

CLS
FOR i = 1 TO 10
GOSUB Marke
Next i

Marke:
PRINT i * i
RETURN

Fehlermeldung: "Return ohne GOSUB" ?!?

Wie kommt das? Danke für die Erklärung.

QB42
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 27.09.2005, 12:34    Titel: Antworten mit Zitat

Hallo

Wenn die FOR...NEXT-Schleife 10x durchlaufen wurde, läuft da Programm einfach weiter, bis es zum RETURN kommt, also ohne GOSUB-Aufruf. Deshalb der Fehler. Ein END nach dem NEXT beendte das Programm bevor es in diese "Falle" läuft.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 27.09.2005, 13:07    Titel: Antworten mit Zitat

Alles klar, Danke! Das war jetzt ein Meilenstein, denn nun weiß ich erstmal, wie man mit GOSUB umgeht und warum nach dem NEXT i ein END gehört (F8 verschaffte mir endgültige Klarheit), allerdings wundere ich mich, warum das Programm ohne das END nicht trotzdem die Quadratzahlen bis 121 ausdruckt, denn erst dann kommt ja die Falle.

QB42
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 27.09.2005, 13:19    Titel: Antworten mit Zitat

Hallo

Die Variable i läuft ja nur bis zehn. 10² ist 100. Wenn du die Quadratzahlen bis 121 willst, muss i von 1 bis 11 gehen. Bei so übersichtlichen Programmen kannst du dich ja auch einfach mal in die Rolle des Interpreters versetzen. Arbeite die Befehle Schritt für Schritt ganz stur ab, wie es der Rechner auch tut - vielleicht sogar mit dem Zeigefinger auf der jeweils aktuellen Programmzeile.. Mit dieser Methode wäre dir evtl. auch das mit dem fehlenden END selbst aufgefallen. Hört sich vielleicht doof an, ist aber für Einsteiger eine ganz gute Methode finde ich.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 27.09.2005, 15:32    Titel: Antworten mit Zitat

die quadratzahlen von 1 bis 100 spuckt er übrigens aus, die sind nur so schnell wieder weg das du sie nicht gesehen hast..

wenn dein Programm mal mit so nem Fehler hängengeblieben ist drück mal F4, dann siehst du, was zuletzt auf dem Bildschirm war.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 27.09.2005, 16:27    Titel: Antworten mit Zitat

Man lernt immmer mehr! Tatsächlich liefert das Programm die Werte bis 121, wenn das END fehlt, denn das zeigt der Test mit F4 nach der Fehlermeldung. F4 muß ich mir also unbedingt merken. Nochmals Danke an alle.

QB42
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 27.09.2005, 21:47    Titel: Antworten mit Zitat

Hallo

Das kommt so. Wenn nichts anderes angegeben wird, wird zu i in der Schleife immer eins dazuaddiert und beim NEXT wird dann nachgesehen, ob i noch nicht über der Obergranze (in deinem Fall 10) ist. Ist dies nicht der Fall, läuft das Programm weiter. Die Schleifenvariable ist nach beenden der Schleife immer einen Zählschritt grösser als die Obergrenze. Hier eben 11. F4 schaltet ja einfach nur in den Ausgabebildschirm. Ein

DO: LOOP WHILE INKEY$ = ""

zwischen NEXT und END, lässt die Ausgabe stehen, bis eine beliebige Taste gedrückt wird.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 28.09.2005, 13:18    Titel: Antworten mit Zitat

Hallo!

Ich weiß nicht, ob das Problem immer noch besteht aber ich schreib' dir einfach mal eine einfache SUB!

Hauptprogramm:
Code:
call deine.sub  'ruft die SUB aus dem Hauptprogramm auf


Die SUB Namens "deine.sub":
Code:
SUB deine.sub 'wird automatisch erzeugt, wenn du auf "Bearbeiten->Neue SUB" gehst
PRINT "Hallo!"
PRINT "Hier kannst du wie im Hauptprogramm alle möglichen Befehle unterbringen!"
BEEP
SLEEP 2
END SUB


Tschüß!
Ich hoffe das war verständlich (falls das Problem noch bestand!). happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 28.09.2005, 14:38    Titel: Antworten mit Zitat

Hallo Mao, jetzt, wo mir mal jemand ein Beispiel geschrieben hat, verstehe ich endlich die Spielregeln, wie man überhaupt einen SUB-Namen anlegt, also nicht etwa SUB(xyz), sondern xyz.SUB. Das muß man ja erstmal wissen. Und auch, daß die SUBs dann mit CALL aufgerufen werden. So funktioniert das. Schöne restliche Woche und vielen Dank!

QB42
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OdinX



Anmeldungsdatum: 29.07.2005
Beiträge: 253
Wohnort: SG Schweiz

BeitragVerfasst am: 28.09.2005, 16:28    Titel: Antworten mit Zitat

du kannst der sub dann noch werte übergeben, die er zB für berechnungen oder so braucht.

im Hauptprogramm:
Code:
DECLARE SUB Primbestimmung(Zahl AS INTEGER)

CALL deine_Sub(13)


in der Sub:
Code:
FUNCTION PrimBestimmung(Zahl AS INTEGER)
    DIM Prim AS INTEGER
    Prim = 0
    DIM A AS INTEGER
    FOR A = INT(Zahl/2) TO 2 STEP -1
        IF (Zahl MOD A) = 0 THEN Prim = Prim+1
    NEXT A
    IF Prim = 0 THEN
        PRINT "Primzahl!"
    ELSE
        PRINT "keine Primzahl!"
    END IF
    SLEEP
END FUNCTION



Die Zeile "DECLARE SUB..." ist der Prototyp.
Er macht, dass das Prog weiss, dass es diese Sub gibt und sagt wieviele Parameter welchen typs übergeben werden.
mehrere parameter werden durch kommata getrennt:
Code:
DECLARE SUB IrgendEineSub(INTEGER,STRING)

Im Prototyp werden keine Variablennamen benötigt, es ist aber möglich und sinnvoll sie trotzdem hinzuschreiben, da sie aufschluss über den inhalt der sub geben können.

zu schluss noch der zweck einer sub:
wenn du zB eine 10 zeilen lange routine zum anzeigen von bmp-bildern gemacht hast, dann verpackst du das am besten in eine sub.
anstatt jedesmal 10 zeilen hinzuschreiben, hast du dann die möglichkeit zB mit der zeile "CALL BildAnzeigen(X,Y,Pfad$)" das bild anzuzeigen.
ist doch ne komfotable sache mit diesen sub's.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 28.09.2005, 18:23    Titel: Antworten mit Zitat

QB42 hat Folgendes geschrieben:
Hallo Mao, jetzt, wo mir mal jemand ein Beispiel geschrieben hat, verstehe ich endlich die Spielregeln, wie man überhaupt einen SUB-Namen anlegt, also nicht etwa SUB(xyz), sondern xyz.SUB. Das muß man ja erstmal wissen. Und auch, daß die SUBs dann mit CALL aufgerufen werden. So funktioniert das. Schöne restliche Woche und vielen Dank!

QB42



Man möge mir verzeihen, wenn er's wirklich nicht kapiert hat, aber sonst:

FAKE?

Gruß
Lutz böse Ifer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 28.09.2005, 19:36    Titel: Antworten mit Zitat

SUBs kann man sehr wohl ohne CALL aufrufen.

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 28.09.2005, 20:15    Titel: Antworten mit Zitat

Hallo OdinX, ich bin ja Einsteiger und das mit dem DIM weiß ich noch nicht, aber trotzdem Danke. Der Sinn der SUBs ist mir schon klar und ein Primzahlen-Programm habe ich sogar auch schon selber gemacht, allerdings ist das Programm halt mit den Mittlen entstanden, die ich bisher weiß.

@ L.: Das war natürlich kein Fake von mir, denn es ist ja so, daß man eine Sache immer erst dann verstehen kann, wenn einem vorher auch eine verständliche Erklärung angeboten wurde und da war der Mao der erste, der das gemacht hat.

QB42
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 29.09.2005, 13:22    Titel: Antworten mit Zitat

jb hat Folgendes geschrieben:
SUBs kann man sehr wohl ohne CALL aufrufen.

jb


Ich dachte, dass ich es der Vollständigkeit halber mit dazu schreibe. Außerdem muss der SUB-Name nicht mit .SUB enden. Das war nur ein Beispiel. Er kann genausogut "qb_sub" oder "sub_in_qb" oder "hallo_qb42" heißen. Ein Unterstrich muss nicht dabei sein. Kann er aber! zwinkern

Greets,
Mao
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
QB42



Anmeldungsdatum: 20.09.2005
Beiträge: 25

BeitragVerfasst am: 30.09.2005, 11:36    Titel: Antworten mit Zitat

Werd's mal ausprobieren, Danke. Im Moment finde ich GOSUB praktischer als SUB, weil mit GOSUB Haupt- und Unterprogramm auf ein und derselben Seite bleiben.

QB42
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 QBasic. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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