Repeat - Until : Komme nicht raus!

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

1. Frage ab ob eine Datei überhaupt gelesen werden kann :

Code: Alles auswählen

If ReadFile()
2. Schließe alles was du öffnest wenn du es nciht mehr brauchst:

Code: Alles auswählen

CloseFile()
3. Öffne nicht eine Datei wenn du sie erst später brauchst.

4. Rücke geschickter ein !, sonst sieht man nicht durch

Code: Alles auswählen

Global line.w
Global a_a.w
Global b_b.w
Global file$

file$ = OpenFileRequester("Öffne...","C:\","Map-Datei (*.map)|*.map|Textdatei (*.txt)|*.txt",0)

Procedure SearchOnFile(text$)
 If ReadFile(1,file$)
  
  If text$ = ""
   MessageRequester("Error","An SearchOnFile() wurde ein leerer String überreicht. Das Programm muss daher beendet werden.",0)
   End
  EndIf
  
  Repeat
   zeile$ = ReadString()
   aaa = FindString(zeile$,text$,0)
   
   If aaa
    gefunden = 1
   EndIf
   
  Until Eof(1)
  
  CloseFile(1)
 EndIf
 
 If gefunden
  ProcedureReturn 1
 Else
  MessageRequester("Error",text$+" wurde in der aktuellen Datei nicht gefunden!",0)
  ProcedureReturn 0
  End
 EndIf
 
EndProcedure

Procedure BeginEndCheck(a$,b$)
 If ReadFile(1,file$)
  
  If a$ = "" Or b$ = ""
   MessageRequester("Error","An BeginEndCheck() wurden ein oder mehrere leere Strings überreicht. Das Programm muss daher beendet werden.",0)
   End
  EndIf
  
  a_a = 0
  b_b = 0
  
  Repeat
   zeile$ = ReadString()
   
   X = FindString(zeile$,a$,0)
   If X
    a_a + 1
   EndIf
  Until Eof(1)
  
  CloseFile(1)
 EndIf
 
 If ReadFile(1,file$)
  
  Repeat
   zeile$ = ReadString()
   
   X = FindString(zeile$,b$,0)
   If X
    b_b + 1
   EndIf
  Until Eof(1)
  
  CloseFile(1)
 EndIf
 
 If b_b > a_a
  MessageRequester("Error","Es existieren mehr "+b$+" Schließungen als geöffnet werden.",0)
  ProcedureReturn 0
  End
 ElseIf a_a > b_b
  MessageRequester("Error","Es existieren mehr "+a$+" Öffnungen als geschlossen werden.",0)
  ProcedureReturn 0
  End
 Else
  ProcedureReturn 1
 EndIf
 
EndProcedure


SearchOnFile("<game>") : SearchOnFile("</game>")

BeginEndCheck("<data>","</data>")


If ReadFile(0,file$)
 
 Repeat
  line + 1
  zeile$ = ReadString()
  
  X = FindString(zeile$,"<area",0)
  If X
   Y = FindString(zeile$,"<area",X+1)
   Z = FindString(zeile$,">",X+1)
   If Y < Z
    MessageRequester("Error","Line "+Str(line)+": Im Area-Element wurde vor dessen Schließung ein "+search$+"-Element entdeckt. Möglicherweiße könnte es auch sein, dass das Area-Element nicht geschlossen wird.",0)
    End
   EndIf
  EndIf
  
 Until Eof(0)
 
 CloseFile(0)
 
EndIf

End
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich löse dann mal auf:

Tombi, du öffnest erst eine Datei mit der ID 0.
Dann rufst du deine 2 Proceudres auf, die jeweils eine Datei mit der ID 1 öffnen.
Aber wenn die Procedures fertig sind, und es ab in die Repeat-Schleife geht, dann denkt PureBasic, der ReadString() Befehl beziehe sich immernoch auf eine Datei mit der ID 1.
Du hast die erste Datei, die auf lesen willst, aber mit der ID 0 geöffnet.

STARGATE hat es unbewusst richtig gemacht und den sonst nötigen Aufruf von UseFile() vermieden, indem er die Dateien erst dann öffnet, wenn sie wirklich gebraucht werden. Mit anderen Worten: Durch seine Änderung der Reihenfolge, in der die Dateien geöffnet werden, braucht er mit UseFile() nicht die Datei zu wechseln.

Tu dir den Gefallen und hol die PB 4.00 oder höher; dann hast du solche Probleme nicht mehr.
P.S.: Nimm dir SGs Tipps zu herzen und öffne Dateien z. B. immer mit If und auch nur für die möglichst kurze Zeit, in der du sie brauchst!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten