Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 27.09.2005, 00:17 Titel: SUBs in QuickBasic |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 27.09.2005, 00:25 Titel: |
|
|
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  _________________ "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 |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 27.09.2005, 00:56 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 27.09.2005, 01:03 Titel: |
|
|
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 27.09.2005, 12:24 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 27.09.2005, 12:34 Titel: |
|
|
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 |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 27.09.2005, 13:07 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 27.09.2005, 13:19 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 27.09.2005, 15:32 Titel: |
|
|
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 |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 27.09.2005, 16:27 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 27.09.2005, 21:47 Titel: |
|
|
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 |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 28.09.2005, 13:18 Titel: |
|
|
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!).  |
|
Nach oben |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 28.09.2005, 14:38 Titel: |
|
|
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 |
|
 |
OdinX

Anmeldungsdatum: 29.07.2005 Beiträge: 253 Wohnort: SG Schweiz
|
Verfasst am: 28.09.2005, 16:28 Titel: |
|
|
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 |
|
 |
Lutz Ifer Grillmeister

Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 28.09.2005, 18:23 Titel: |
|
|
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 Ifer |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 28.09.2005, 19:36 Titel: |
|
|
SUBs kann man sehr wohl ohne CALL aufrufen.
jb |
|
Nach oben |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 28.09.2005, 20:15 Titel: |
|
|
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 |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 29.09.2005, 13:22 Titel: |
|
|
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!
Greets,
Mao |
|
Nach oben |
|
 |
QB42
Anmeldungsdatum: 20.09.2005 Beiträge: 25
|
Verfasst am: 30.09.2005, 11:36 Titel: |
|
|
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 |
|
 |
|