Fehler beim komprimierten speichern/laden eines Arrays.

  • GM 8

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

  • Fehler beim komprimierten speichern/laden eines Arrays.

    Hab mal wieder ein Problem beim Speichern. Es geht darum 3 Arrays zu speichern mit der größe von 600x600. Der Array beinhaltet pro Einheit ein byte also eine Zahl zwischen 0 und 255.
    Aber die endgröße ist ziemlich Groß und dauert sehr lange zum speichern/laden. Deswegen wollte ich eine Funktion schreiben die die Datein komprimiert Abspeichert und Ladet. Das funktionierte halbwegs ich konnte die Datei um 1/8 Kompriemieren also von 1080 kb auf 135 kb. Das geht auch um einiges schneller. Jetzt bekomme ich aber ein Problem die komprimierte Datei wieder zu Laden. Ich bekomme dann den Fehler: Error reading byte.

    Jetzt verrate ich euch wie ich die Datei kompriemiere. Es geht den Array durch und wenn es eine Annreihung von gleichen Bytes findet so schreibt er in die Datei die Reihen länge und die Zahl.

    Zum Speichern:
    Spoiler anzeigen

    GML-Quellcode

    1. for(iy=0;iy<=600;iy+=1)
    2. {
    3. ix = 0
    4. while(ix<600)
    5. {
    6. lenght = 0
    7. ArtO = weltA[ix,iy]
    8. for(lenght = 0; lenght <= 255; lenght += 1)
    9. {
    10. ArtN = weltA[ix+lenght,iy]
    11. if(ArtN != ArtO or ix+lenght >= 600)
    12. break;
    13. ArtO = ArtN
    14. }
    15. file_bin_write_byte(file,weltA[ix,iy])
    16. file_bin_write_byte(file,lenght)
    17. ix += lenght
    18. }
    19. ix = 0
    20. while(ix<600)
    21. {
    22. lenght = 0
    23. ArtO = weltB[ix,iy]
    24. for(lenght = 0; lenght <= 255; lenght += 1)
    25. {
    26. ArtN = weltB[ix+lenght,iy]
    27. if(ArtN != ArtO or ix+lenght >= 600)
    28. break;
    29. ArtO = ArtN
    30. }
    31. file_bin_write_byte(file,weltB[ix,iy])
    32. file_bin_write_byte(file,lenght)
    33. ix += lenght
    34. }
    35. ix = 0
    36. while(ix<600)
    37. {
    38. lenght = 0
    39. ArtO = weltC[ix,iy]
    40. for(lenght = 0; lenght <= 255; lenght += 1)
    41. {
    42. ArtN = weltC[ix+lenght,iy]
    43. if(ArtN != ArtO or ix+lenght >= 600)
    44. break;
    45. ArtO = ArtN
    46. }
    47. file_bin_write_byte(file,weltC[ix,iy])
    48. file_bin_write_byte(file,lenght)
    49. ix += lenght
    50. }
    51. }
    Alles anzeigen


    Zum Laden:
    Spoiler anzeigen

    GML-Quellcode

    1. for(iy=0;iy<=600;iy+=1)
    2. {
    3. ix=0
    4. while(ix<600)
    5. {
    6. Art = file_bin_read_byte(file)
    7. Laenge = file_bin_read_byte(file)
    8. for(pos=ix;pos<=ix+Laenge;pos+=1)
    9. {
    10. weltA[pos,iy] = Art
    11. }
    12. ix+=Laenge
    13. }
    14. ix=0
    15. while(ix<600)
    16. {
    17. Art = file_bin_read_byte(file)
    18. Laenge = file_bin_read_byte(file)
    19. for(pos=ix;pos<=ix+Laenge;pos+=1)
    20. {
    21. weltB[pos,iy] = Art
    22. }
    23. ix+=Laenge
    24. }
    25. ix=0
    26. while(ix<600)
    27. {
    28. Art = file_bin_read_byte(file)
    29. Laenge = file_bin_read_byte(file)
    30. for(pos=ix;pos<=ix+Laenge;pos+=1)
    31. {
    32. weltC[pos,iy] = Art
    33. }
    34. ix+=Laenge
    35. }
    36. }
    Alles anzeigen


    Nach dem Fehler zu beurteilen, liest er beim Laden mehr Bytes als er sollte, aber einen richtigen Fehler kann ich nicht finden.

    Wenn jemand sogar noch eine bessere Methode zum komprimierten Speichern hat der kann es mir ruhig sagen.
  • Benutzer online 1

    1 Besucher