Seltsames file_bin Problem

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Seltsames file_bin Problem

      Guten Abend zusammen!

      Ich habe ein äußerst seltsames Problem mit den file_bin Funktionen! (GameMaker 8.0)

      Ich speichere Profildaten in eine Datei, mittels der file_bin Funktionen. Anschließend lese ich dann die Werte wieder ein. Das klappt ja erst ganz wunderbar - die Werte werden schön brav und sauber gespeichert und geladen.

      Wenn ich aber zB aus dem Profilauswahlbildschirm (wo die Profile eingelesen werden) rausgehe und wieder reingehe, dann wird auf einmal (so ab dem 5ten mal) das Profil nicht mehr geladen...?! Öffne ich allerdings die Datei mit einem Hex-Editor, dann stehen dort die richtigen Werte drin..

      Komisch ist einfach diese sporadischen Fehler..

      Ich bin schon langsam so am verzweifeln, dass ich extra einen eigenen Debugger geschrieben hab, hier ein Auszug mit genauen Details zur loadDay - Funktion!


      30.3.2012 21:16 -----------------------------
      30.3.2012 21:16 Profile found 1
      30.3.2012 21:16 Script [loadDay] | Profile [1] :30
      30.3.2012 21:16 Day loaded 30

      30.3.2012 21:16 Script [loadMonth] | Profile [1] :3
      30.3.2012 21:16 Script [loadYear] | Profile [1] :12
      30.3.2012 21:16 Script [loadHour] | Profile [1] :21
      30.3.2012 21:16 Script [loadMinute] | Profile [1] :4
      ...

      hier bin ich dann ein paar mal zwischen den Menüs hin und her gewechselt..

      30.3.2012 21:17 Profile found 1
      30.3.2012 21:17 Error loading.. [loadDay]
      30.3.2012 21:17 Day loaded 0
      ...



      Grün markiert der Normalzustand. Rot dann der Fehler.

      Sind da irgendwelche Probleme bekannt mit den FILE-BIN Funktionen??? Wieso kann er 4 mal laden und beim fünften mal nicht mehr??

      Bin um jede Hilfe echt dankbar!!!

      Patrick
      Retroware.de - Webdesign, Print und Apps aus Regensburg.
    • Der Quellcode wird nicht viel nutzen.. aber hier mal ein Speichern und Laden Skript:


      Laden

      GML-Quellcode

      1. // argument0 = Profile ID
      2. i = argument0;
      3. if(f = file_bin_open("data/save/save"+string(argument0)+".dat",0)){
      4. file_bin_seek(f,0);
      5. v=file_bin_read_byte(f);
      6. file_bin_close(f);
      7. writeDebug("Script [loadDay] | Profile ["+string(argument0)+"] :"+string(v));
      8. return v;
      9. }else{
      10. writeDebug("Error loading.. [loadDay]");
      11. }
      Alles anzeigen



      Speichern

      GML-Quellcode

      1. // argument0 = Profile ID
      2. // argument1 = New Value
      3. i = argument0;
      4. f = file_bin_open("data/save/save"+string(argument0)+".dat",1);
      5. file_bin_seek(f,0);
      6. file_bin_write_byte(f,argument1);
      7. file_bin_close(f);
      8. writeDebug("Script [updateDay] | Profile ["+string(argument0)+"] :"+string(v));
      Alles anzeigen



      Das Objekt, dass die Daten liest und verarbeitet:

      GML-Quellcode

      1. if(profileExists(i)){
      2. day = loadDay(i);
      3. month = loadMonth(i);
      4. year = loadYear(i);
      5. hour = loadHour(i);
      6. minute = loadMinute(i);
      7. ...

      wobei das i in Klammern das jeweilig aktive Profil ist.

      Wie gesagt, funktioniert einwandfrei, bis zum vierten oder fünften mal...
      Retroware.de - Webdesign, Print und Apps aus Regensburg.
    • Das hier

      GML-Quellcode

      1. if(f = file_bin_open("data/save/save"+string(argument0)+".dat",0)){

      mag in der Art in anderen Programmiersprachen funktionieren, in GML jedoch nicht. Ob man nun "=" oder "==" schreibt, es wird im if-Statment auf jeden Fall als Vergleichsoperator behandelt. Sofern die Variable f nicht schon vorher definiert wurde (oder in den "Global Game Settings" nicht "Treat uninitialized variables as value 0" aktiviert ist), sollte daher an dieser Stelle auch eigentlich eine Fehlermeldung erscheinen.

      Wenn man sich mal die GM Hilfe dazu anschaut

      file_bin_open(fname,mod) Opens the file with the indicated name. The mode indicates what can be done with the file: 0 = reading, 1 = writing, 2 = both reading and writing). When the file does not exist it is created. The function returns the id of the file that must be used in the other functions. You can open multiple files at the same time (32 max). Don't forget to close them once you are finished with them.

      gibt diese auch keinen Hinweis darauf, dass die Funktion file_bin_open fehlschlagen könnte bzw. wird dies wohl nicht zurückgegeben.
    • Okay, das mit dem == war nur ein Flüchtigkeitsfehler. Ist aber nur beim loadDay - Script eingebaut die Abfrage. Bei allen anderen Lade- / Speicherskripten ist es normal. Der Fehler bleibt weiterhin...

      Edit:
      Was mich grad beim durchlesen stutzig macht:
      You can open multiple files at the same time (32 max)...

      Irgendwas in diese Richtung muss es ja sein, schließlich passiert es immer beim 5ten mal laden... Aber ich schließe die Dateien nach jeder Verwendung wieder...

      Was mir auffällt ist aber, wenn ich den GM internen Debugmodus verwende, bekomme ich beim 5ten mal den Fehler "File is not opened for reading"..
      Retroware.de - Webdesign, Print und Apps aus Regensburg.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von buzZ ()

    • Okay.. Ich hab die Datei jetzt auf den Fehlerteil reduziert, sprich alles gelöscht was nicht gebraucht wird!

      www.retroware.de/err.zip
      GameMaker 8.0 (gmk)

      Ich habe dir ein Beispielprofil gleich mitgeliefert (habe den Erstellendialog nämlich ausgebaut!).


      Folgender Aufbau:
      Starte das Programm, wähle im Menü "Abenteuer" und gehe dann mit "Zurück" ins Hauptmenü zurück. Dann wieder Abenteuer usw.. Das machst du dann 5 mal und *Schwups* ist der Spieler schwarz und alle Werte auf 0. Die 1 bei der Levelanzeige (1/24) wird automatisch vom Programm geschrieben (falls eben keine Levelinfo vorliegt).

      Die Laden/Speichern-Skripte sind unter "Laden" und "Update".
      Für grundlegende Einstellungen (Datum und Uhrzeit) wird in die save[profilnummer].dat Datei gespeichert, für die Spielereinstellungen (Skin, Farbe ...) wird in player[profilnr].dat gespeichert.

      Das Objekt "objProfile" im Objektordner "Menu" > "MainMenu" lädt die Spielerdaten.


      Vielleicht findest du was, wäre echt mega stark!
      Retroware.de - Webdesign, Print und Apps aus Regensburg.
    • Also zunächst mal: Du machst dir das Debuggen durch das Abschalten von Fehlermeldungen und die schon erwähnte Option "Treat uninitialized variables as value 0" nur unnötig schwer. Nur weil keine Fehler angezeigt werden, sind sie ja dennoch vorhanden. Schaltet man mal die Fehlermeldungen an, so ist auch schon relativ schnell ein Bug gefunden. Im Create Event von objProfilePlayer schlägt das Laden aus der Datei überall fehl, da nämlich die Variable global.activeProfile an dieser Stelle noch nicht definiert ist, daher mit 0 initialisiert wird und somit das Spiel aus der Datei "player0.dat" lesen will, welche aber leer ist. Setzt man die Variable global.activeProfile davor mal testweise auf 1, so tauchen zumindest die entsprechenden Fehlermeldungen nicht mehr auf. Geht man dann im Spiel ein paar mal ins Menü und wieder raus, so erscheint irgendwann die Meldung, dass nicht noch mehr Dateien geöffnet werden können. Der Fehler dafür liegt in den Scripten loadColor1-4, da dort vor dem Schließen der Datei ein return ausgeführt wird.
    • Ohmann, na da weiß ich gar nicht wie ich dir danken soll...!!!
      Ich hab da gar nicht mehr drangedacht, dass ich die Fehler wieder einschalte.. Hab das mal ausgeschalten, weil ich nicht wollte, dass irgendwelche Fehlermeldungen beim Spielen nach oben kommen.. Hab dann aber wohl auch die Fehler.log ausgeschalten --> verdammt!
      Ich finds klasse, wie du dich damit auseinandergesetzt hast, schließlich musste dich ja echt tief in den Code gegraben haben, das du das alles hier verstehst..!

      Das mit den return im Color-Skript ist mir einfach nicht mehr aufgefallen.. Und weißte warum? Ich hatte alle load und update Skripte bis auf das loadDay auskommentiert und trotzdem war der Fehler. Daher hab ich die anderen Skripte gar nicht mehr so hundertprozentig genau durchsucht.. Aber jetzt funktioniert es einwandfrei! :)

      Echt ein riesen Dankeschön an dich!!
      Retroware.de - Webdesign, Print und Apps aus Regensburg.