 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 12.07.2008, 22:39 Titel: Subproblem |
|
|
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 |
|
 |
Stormy

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

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 12.07.2008, 22:51 Titel: |
|
|
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 |
|
 |
Stormy

Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
|
Verfasst am: 12.07.2008, 23:14 Titel: |
|
|
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 |
|
 |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 12.07.2008, 23:33 Titel: |
|
|
stimmt danke  |
|
Nach oben |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 13.07.2008, 00:42 Titel: |
|
|
Mein Tipp: vergiss das es den Befehl "goto" überhaupt gibt... ich hab ihn heute auch zum erstenmal gelesen 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 |
|
 |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 13.07.2008, 15:00 Titel: |
|
|
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  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 13.07.2008, 17:19 Titel: |
|
|
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 |
|
 |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 13.07.2008, 17:29 Titel: |
|
|
Oh mist schon wider ein neues Porblem 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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.07.2008, 19:48 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|