Daten aus Datei in array speichern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Preiset Kaeru Gaman.BildBildBild

Danke auch an alle anderen, die mir geholfen haben.^^

Nur eine Frage hätte ich noch, Kaeru: Was bedeutet eigentlich das Procedure.i ?
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

dass der Rückgabewert ein Integer sein soll, also ein standard-registerwert,
d.h. 32bit auf nem 32bit system und 64bit auf nem 64bit system.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Ok, eine kleine Frage hätte ich doch noch, da ich mich mit diesem Thema leider überhaupt nicht auskenne... :(

Kann man davor auch noch irgendwie die arraygröße speichern, damit man beim laden automatisch die arraygröße ausliest und dann damit den (zweidimensionalen) array mit "ReDim" neu setzen kann?
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja klar, dann musst du halt statt der beiden konstanten zwei globale variablen nehmen.
und eben vorne weg speichern mit 2x WriteLong, und beim Laden zuerst laden mit 2x ReadLong...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Ok der Debugger sagt mir jetzt jedes mal : Only the last Dimension of an array can be changed with ReDim.

Beim Neu-Fenster klappt das "ReDim" aber immer...

Meine Speicher-Routine sieht jetzt so aus:

Code: Alles auswählen

If CreateFile(#file, datei$ )
    WriteLong(#file,levelwidth)
    WriteLong(#file,levelheight)
    WriteData(#file, Map(), kgx * kgy * SizeOf( Long ) )
    CloseFile(#file)   
   EndIf 
Und meine Lade-Routine:

Code: Alles auswählen

If OpenFile(#file,datei$)
    levelwidth = ReadLong(#file)
    levelheight = ReadLong(#file)
    ReadFile(#file, datei$)
    ReadData(#file, Map(), kgx * kgy * SizeOf( Long ) )
    StatusBarText(#statusbar,1,datei$) 
        
    kgx = levelwidth/32
    kgy = levelheight/32
        
    ReDim map(kgx,kgy)

        
    ;StatusBarText(#statusbar,2,Str(kgx)+"x"+Str(kgy)) Ist gerade nicht relevant
         
EndIf 
Und beim öffnen verursacht das ReDim immer einen Error.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

achso, ja.

ReDim brauchst du nur, wenn du die Daten drinbehalten willst.
also schreib ganz einfach Dim mit beiden neuen Dimensionen und es funzt.


> Meine Speicher-Routine sieht jetzt so aus:

warum benutzt du einmal beim dimensionen speichern levelwidth und levelheight,
und für die platzberechnung kgx und kgy?
sollte beides identisch sein, also besser auch die selben variablen verwenden.

> Und meine Lade-Routine

achso, jetzt seh ich das....

ich würde aber in den Map-relevanten routinen mit den Map-dimensionen arbeiten.
deine Levelwidth/height brauchst du nur in bezug auf spritekoordinaten, also besser auch nur dort verwenden.
natürlich ist es vorteilhaft sie nur einmal auszurechnen, aber das kann man eben nach dem laden machen.
also, kgx und kgy in die datei schreiben, levelwidth und levelheight nur genau einmal, direkt nach dem laden berechnen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

OK, gibt doch nochmal ein Problem...

Speichern und Laden klappt bis auf die Tatsache, dass jedesmal, wenn ihc speicher und dann neu lade die letzte y-Dimension meines zweidimensionalen Arrays weg ist.
In meinem Leveleditor, den ich gerade schreibe, macht sich das nicht so gut...

Da fehlt dann immer jeweils die unterste Tile-reihe.

Speichern-Routine

Code: Alles auswählen

datei$ = SaveFileRequester("Speichern","Unbenannt.wrl","Warter's Revenge Level(*.wrl) | *.wrl;",0)
   If CreateFile(#file, datei$ )
    WriteLong(#file,kgx)
    WriteLong(#file,kgy)
    WriteData(#file, Map(), kgx * kgy * SizeOf( Long ) )
    CloseFile(#file)   
   EndIf 

Öffnen-routine

Code: Alles auswählen

datei$ = OpenFileRequester("Öffnen","C:\","Wrater's Revenge Level(*.wrl) | *.wrl;",0)
     If OpenFile(#file,datei$)
        kgx = ReadLong(#file)
        kgy = ReadLong(#file)
        
        Dim map(kgx,kgy)
        
        ReadFile(#file, datei$)
        ReadData(#file, Map(), kgx * kgy + 1 * SizeOf( Long ) )
        StatusBarText(#statusbar,1,datei$) 
        
     EndIf 
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

WriteData(#file, Map(), kgx * kgy * SizeOf( Long ) )
ReadData(#file, Map(), kgx * kgy + 1 * SizeOf( Long ) )
:?:

sei kgx = 10 und kgy = 10:
a) 10 * 10 * 4 = 400
b) 10 * 10 + 1*4 = 104
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Hab ich schon probiert, dann bekomm ich aber keine Map mehr raus, sondern irgendwelche sinnlos positionierten tiles, die andere sind, als sie im Array gespeichert waren.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

oh, jetzt seh ichs...

warum öffnest du die datei ein zweites mal?

probier mal

Code: Alles auswählen

datei$ = OpenFileRequester("Öffnen","C:\","Wrater's Revenge Level(*.wrl) | *.wrl;",0)
     If ReadFile(#file, datei$)
        kgx = ReadLong(#file)
        kgy = ReadLong(#file)
       
        Dim map(kgx,kgy)
       
        ReadData(#file, Map(), kgx * kgy * SizeOf( Long ) )
        CloseFile(#file)  
        StatusBarText(#statusbar,1,datei$)
       
     EndIf 
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten