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:

Subproblem

 
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
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 12.07.2008, 22:39    Titel: Subproblem Antworten mit Zitat

irgenwie stimmt was an meim code nicht schaut euch das bitte mal an. Tschuldigung, dass ich euch mal wieder mit etwas, das vermutlich die einfachste Lösung der Welt findet belästige. achso ja, der fehler liegt bei dem Sub main der fehler lautet main seie nicht definiert.
Code:
Dim shared as integer a,x,y,s

CLS
SUB Bild
   
end sub
'___________________________________________________________________________________
Sub Text
   
end SUB
'__________________________________________________________________________________
Sub sckl
    screen 20
    goto main
end sub
'___________________________________________________________________________________
sub scgr
    screen 21
    goto main
end sub
'_______________________________________________________________________________
Sub main
    Print "main"
end sub
'____________________________________________________________________________

screen 14
Do
    getmouse(x,y, ,a)
    locate 1,1
    print using "#####:#####"; x,y
    locate 13,15
    print "1280X1024"
    locate 14,16
    print "800X600"
    if a and 1 and x >= 112 and x <= 185 and y >= 92 and y <= 103 then scgr
    if a and 1 and x >= 118 and x <= 175 and y >= 103 and y <= 111 then sckl
loop until inkey = CHR(27)
end
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 12.07.2008, 22:49    Titel: Antworten mit Zitat

xD Schön zu sehen, wie du versuchst mittels GOTO eine Prozedur aufzurufen.

Mach mal aus allen GOTO main einfach nur main. Und ganz oben würde ich noch das Sub deklarieren:

Declare SUB main()
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 12.07.2008, 22:51    Titel: Antworten mit Zitat

naja GOTO klang logisch^^ danke für die schnelle antwort xD

aber irgendwie ists wies nicht sein soll denn nuun geht er vom 1. sub zurück zum anfang Der Code sieht nun so aus:
Code:
Dim shared as integer a,x,y,s
declare Sub main()

CLS
SUB Bild
   
end sub
'___________________________________________________________________________________
Sub Text
   
end SUB
'__________________________________________________________________________________
Sub sckl
    cls
    screen 20
    main
end sub
'___________________________________________________________________________________
sub scgr
    cls
    screen 21
    main
end sub
'_______________________________________________________________________________
Sub main
    Print "main"
end sub
'____________________________________________________________________________

screen 14
Do
    getmouse(x,y, ,a)
    locate 1,1
    print using "#####:#####"; x,y
    locate 13,15
    print "1280X1024"
    locate 14,16
    print "800X600"
    if a and 1 and x >= 112 and x <= 185 and y >= 92 and y <= 103 then scgr
    if a and 1 and x >= 118 and x <= 175 and y >= 103 and y <= 111 then sckl
loop until inkey = CHR(27)
end
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 12.07.2008, 23:14    Titel: Antworten mit Zitat

Ja, der springt in dieser Zeile

Code:
if a and 1 and x >= 112 and x <= 185 and y >= 92 and y <= 103 then scgr


in das Sub scgr. Von scgr geht es zum Sub main. Dort wird nur dieses eine PRINT verarbeitet. main wird verlassen. scgr wird nun auch verlassen. Jetzt befindest du dich wieder in der Hauptschleife und das Spiel beginnt von vorne.

Was du bestimmt erreichen willst, ist dass man von main nicht wieder zurückkommen kann.

Du könntest ja einfach in main wieder eine do-schleife einbauen und dann END schreiben, damit garantiert ist, dass der nicht wieder zurückspringt.
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 12.07.2008, 23:33    Titel: Antworten mit Zitat

stimmt danke mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 13.07.2008, 00:42    Titel: Antworten mit Zitat

Mein Tipp: vergiss das es den Befehl "goto" überhaupt gibt... ich hab ihn heute auch zum erstenmal gelesen zwinkern Goto führt in 99% der fälle zu Bugs oder gar zu völligem ausfall eines programms (vorallem bei Anfängern...) Lern lieber die vorzüge der scheifen zu kennen, immerhin gibts 3 davon.

mfg
The_Muh aka Mark Aroni
_________________
// nicht mehr aktiv //
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 13.07.2008, 15:00    Titel: Antworten mit Zitat

Jo ma schaun danke danke für den Tipp.
Achso und noch was, nun kommt ein fehler, wenn ich das Programm starte nach der ladesequenz.

Code:
Dim shared as integer a,x,y
    declare sub main()
    declare sub Maus()
    declare sub Text()
    declare sub Bild()



sub laden
    dim satznr as integer
    dim satz as string
    Dim aktion(1 to 4000) as string

    cls
    satznr = 0
    OPEN "liste.txt" FOR INPUT AS #1

    DO
      satznr = satznr + 1
      INPUT #1, satz
      aktion(satznr) = satz
      locate satznr,1
      Print aktion(satznr); satznr
      sleep 20
    LOOP UNTIL EOF(1)
    main
end sub

sub main
    Dim aktion(1 to 4000) as string
    dim as integer schritt
    if  aktion(schritt) = "Bild" then Bild
    if  aktion(schritt) = "Text" then Text
    if  aktion(schritt) = "Maus" then Maus
end sub

sub Bild
    print "Bild"
    sleep
end sub
sub Text
    Print "text"
    sleep
end sub
sub Maus
    print "maus"
    sleep
end sub


screen 20
do
    getmouse(x,y,,a)
    locate 1,1
    print using "####:####"; x,y
    if a and 1 and x >= 0 and x <= 1024 and y >= 0 and y <= 768 then laden
loop until inkey = CHR(27)
end


Und was auch seltsam ist die Dims muss ich in die Subs schreiben traurig traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 13.07.2008, 17:19    Titel: Antworten mit Zitat

Da ist nichts seltsames dran. Eine Variable ist da gültig, wo sie definiert ist - soll sie in der SUB verwendet werden, muss dort auch das DIM stehen.

Wenn du eine Variable für Hauptprogramm UND Unterprogramm zugänglich machen willst, musst du sie im Hauptprogramm mit
Code:
DIM SHARED variablenname AS datentyp

deklarieren (variablenname und datentyp natürlich anpassen ...). Oder du übergibst sie als Parameter.

Der Fehler kommt wahrscheinlich daher, dass in main das Array aktion von 1 bis 4000 definiert ist, du aber aktion(0) abrufst.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 13.07.2008, 17:29    Titel: Antworten mit Zitat

Oh mist schon wider ein neues Porblem traurig Aber so lerne ich immerhin dazu:)
Und zwar ist es nun so, dass das programm zwar in maus springt aber nach dem sleep 2000 nicht mehr in main zurück. (2000 sind doch 2 sek oder?) habe auch schon wieder einfach main in die nächste zeile geschrieben aber es ging nicht.
Code:
    Dim shared as integer a,x,y
    declare sub main()
    declare sub Maus()
    declare sub Text()
    declare sub Bild()
    dim shared as string aktion(0 to 4000)
    dim shared as integer satznr, schritt
    dim shared as string satz


sub laden
    cls
    satznr = 0
    OPEN "game.txt" FOR INPUT AS #1

    DO
     
      INPUT #1, satz
      aktion(satznr) = satz
      locate satznr,1
      Print aktion(satznr); satznr
      satznr = satznr + 1
      sleep 10
    LOOP UNTIL EOF(1)
    main
end sub

sub main
    if  aktion(schritt) = "Bild" then Bild
    if  aktion(schritt) = "Text" then Text
    if  aktion(schritt) = "Maus" then Maus
end sub

sub Bild
    cls
    locate 1,1
    print "Bild"
    sleep 2000
end sub
sub Text
    cls
    locate 1,1
    Print "text"
    sleep 2000
end sub
sub Maus
    cls
    locate 1,1
    print "maus"
    sleep 2000
end sub


screen 20
cls
schritt = 1

do
    getmouse(x,y,,a)
    if a and 1 and x >= 0 and x <= 1024 and y >= 0 and y <= 768 then laden
loop until inkey = CHR(27)
end
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 13.07.2008, 19:48    Titel: Antworten mit Zitat

Diese ganze Diskussion wurde bereits in ähnlicher Form unter

http://forum.qbasic.at/viewtopic.php?t=5515

durchdiskutiert, deshalb kann ich nur das Wichtigste wiederholen: Aufruf von Main() aus einer SUB heraus besser vermeiden, sonst entsteht die klassische Situation vom überlaufenden Stack...

Übrigens gilt mein berühmter "Kurs" unter

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

in den Grundzügen auch für FreeBasic, so dass ein Durcharbeiten 1:1 grundsätzlich möglich ist. Der Unterschied liegt lediglich beim Kapitel "Möglichkeitsgrenzen im Unterprogrammkonzept von QuickBASIC", weil in FreeBasic diverse dort diskutierte Konstrukte sprachlich ergänzt wurden, d.h. stehen dort voll zur Verfügung.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
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