Sortier Fehler

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Hahninator

Betreff: Sortier Fehler

BeitragMi, Mai 14, 2008 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Also ich schreibe zur Zeit an einen RPG-maker klon, scheitere aber schon an dem Sortieren der Bilder, naja die Funktion soll neue Bilder Hintenran stellen und gelöschte Bilder durch eine Leerzeile ersetzen....das hintenran stellen Funktioniert einwandfrei, nur bei löschen treten Probleme auf. Und zwar vollgendes. wenn das letzte Bild, das in der Datei Steht lösche, Funktioniert es so wie es soll, aber umsobald ich ein Bild lösche was weiter Vorn steht, wird es zwar durch eine Leerzeile Ersetzt aber die zwei letzten Bilder wechseln sich immer ab...

so sieht die Datei vorm Start aus
Zitat:

beach tileset.bmp
big wall iso tileset 3.bmp
castle iso tileset.bmp
Neu Bitmap (2).bmp
Neu Bitmap.bmp


Jetzt lösche ich "castle iso tileset.bmp"
1. Start
Zitat:

beach tileset.bmp
big wall iso tileset 3.bmp

Neu Bitmap (2).bmp



2. Start

Zitat:

beach tileset.bmp
big wall iso tileset 3.bmp

Neu Bitmap.bmp


3. Start
Zitat:

beach tileset.bmp
big wall iso tileset 3.bmp

Neu Bitmap (2).bmp



usw... usw...usw


Code: [AUSKLAPPEN]

Function Tileset_sortieren()
; Ersteinmal schauen wie viele Daten in der Datei sind 
 Local Tileset_Datei$[100000]
 Local Tileset_Ordner$[100000]
 Local Tileset_Datei_Vor[100000]
 Local Tileset_Ordner_Vor[100000]
 Local Tileset$[100000]
 Datei = ReadFile("Daten\Tilesets.txt")
 Anzahl_Tileset_Datei = ReadInt(Datei) 
 For I=1 To Anzahl_Tileset_Datei
  Tileset_Datei[I] = ReadLine(Datei)
  Tileset_Ordner_Vor[I] = 1
 Next


; Danach die anzahl der Tatsächlich Vorhandenen Ermitteln

 Ordner = ReadDir("GFX\Tilesets")
 
 Repeat
  Nert$ = NextFile(Ordner)
  If Instr(Upper(Nert),"BMP") > 0 Or Instr(Upper(Nert),"PNG") > 0 Then
   Anzahl_Tilesets_Ordner = Anzahl_Tilesets_Ordner + 1
   Tileset_Ordner[Anzahl_Tilesets_Ordner] = Nert
   Tileset_Ordner_Vor[Anzahl_Tilesets_Ordner] = 1
  EndIf
 Until Nert = ""
 
 CloseFile(Datei)
 CloseDir(Ordner)

; Danach Beides Addieren und ein Dim erstellen
 Anzahl_Tileset = Anzahl_Tilesets_Ordner + Anzahl_tileset_Datei
; Danach schauen welche Daten Bilder Noch Vorhanden sind
 For I=1 To Anzahl_Tileset_Datei
  For J=1 To Anzahl_Tilesets_Ordner
   If Tileset_Datei[I] = Tileset_Ordner[J] Then
    Tileset[I] = Tileset_Ordner[J]
    Tileset_Ordner_Vor[J] = 0
    Tileset_Datei_Vor[I]  = 0
    Anzahl = Anzahl + 1
    Anzahl_Tileset = Anzahl_Tileset - 1
    Exit
   EndIf 
  Next 
  If Tileset_Datei_Vor[I] = 1 Then
   Tileset_Datei[I] = ""
   Tileset[I] = ""
  EndIf
 Next

Dim Tileset_Bilder$(Anzahl_Tileset)


; Danach die neuen Bilder Hinterran stellen
 For I=1 To Anzahl
  Tileset_Bilder(I) = Tileset[I]
 Next

 For I=1 To Anzahl_Tilesets_Ordner
  If Tileset_Ordner_Vor[I] = 1 Then
   Anzahl_2 = Anzahl_2 + 1
   Tileset_Bilder(Anzahl + Anzahl_2) = Tileset_Ordner[I]
  EndIf
 Next


 
; Danach wieder in die Datei schreiben
Datei = WriteFile("Daten\Tilesets.txt")
WriteInt Datei, Anzahl_Tileset

For I=1 To Anzahl_Tileset
 Print Tileset_Bilder(I)
 WriteLine Datei, Tileset_Bilder(I)
Next

End Function

Xeres

Moderator

BeitragMi, Mai 14, 2008 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei unbekannten Datenmengen sollte man auf Types setzten, 50.000 Variablen zu reservieren ist nicht unbedingt das non-plus Ultra. Damit ließe sich die Sortiererei auch recht einfach gestallten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Hahninator

BeitragDo, Mai 15, 2008 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe meinen Fehler gefunden, Ich musste am Anfang der Function die Variable "Anzahl" mit 1 deklarieren... naja kann geclosed werden

Code: [AUSKLAPPEN]

Function Tileset_sortieren()
; Ersteinmal schauen wie viele Daten in der Datei sind 
 Local Tileset_Datei$[100000]
 Local Tileset_Ordner$[100000]
 Local Tileset_Datei_Vor[100000]
 Local Tileset_Ordner_Vor[100000]
 Local Tileset$[100000]
 Local Anzahl = 1   ;<-----------------------------------------hier
 Datei = ReadFile("Daten\Tilesets.txt")
 Anzahl_Tileset_Datei = ReadInt(Datei) 

 For I=1 To Anzahl_Tileset_Datei
  Tileset_Datei[I] = ReadLine(Datei)
  Tileset_Ordner_Vor[I] = 1
 Next

 
; Danach die anzahl der Tatsächlich Vorhandenen Ermitteln

 Ordner = ReadDir("GFX\Tilesets")
 
 Repeat
  Nert$ = NextFile(Ordner)
  If Instr(Upper(Nert),"BMP") > 0 Or Instr(Upper(Nert),"PNG") > 0 Then
   Anzahl_Tilesets_Ordner = Anzahl_Tilesets_Ordner + 1
   Tileset_Ordner[Anzahl_Tilesets_Ordner] = Nert
   Tileset_Ordner_Vor[Anzahl_Tilesets_Ordner] = 1
  EndIf
 Until Nert = ""
 
 CloseFile(Datei)
 CloseDir(Ordner)

; Danach Beides Addieren und ein Dim erstellen
 Anzahl_Tileset = Anzahl_Tilesets_Ordner + Anzahl_tileset_Datei

; Danach schauen welche Daten Bilder Noch Vorhanden sind
 For I=1 To Anzahl_Tileset_Datei
  For J=1 To Anzahl_Tilesets_Ordner
   If Tileset_Datei[I] = Tileset_Ordner[J] Then
    Tileset[I] = Tileset_Ordner[J]
    Tileset_Ordner_Vor[J] = 0
    Tileset_Datei_Vor[I]  = 0
    Anzahl = Anzahl + 1
    Anzahl_Tileset = Anzahl_Tileset - 1
    Exit
   EndIf 
  Next 
  If Tileset_Datei_Vor[I] = 1 Then
   Tileset_Datei[I] = ""
   Tileset[I] = ""
  EndIf
 Next
Dim Tileset_Bilder$(Anzahl_Tileset)
 
; Danach die neuen Bilder Hinterran stellen
 For I=1 To Anzahl
  Tileset_Bilder(I) = Tileset[I]
 Next

 For I=1 To Anzahl_Tilesets_Ordner
  If Tileset_Ordner_Vor[I] = 1 Then
   Anzahl_2 = Anzahl_2 + 1
   Tileset_Bilder(Anzahl + Anzahl_2) = Tileset_Ordner[I]
  EndIf
 Next


 
; Danach wieder in die Datei schreiben
Datei = WriteFile("Daten\Tilesets.txt")
WriteInt Datei, Anzahl_Tileset

For I=1 To Anzahl_Tileset
; Print Tileset_Bilder(I)
 WriteLine Datei, Tileset_Bilder(I)
Next
End Function

Smily

BeitragDo, Mai 15, 2008 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würde trotzdem auf types setzen:

Rechenbeispiel:
Du intialisiert 5 arrays zu je 100.000 Einträgen -> es werden 500.000 Variablen reserviert

Ein INT nimmt 4 bytes. Ein String 4 Bytes + die Länge

macht also mindestens 2.000.000 bytes, also 2 Megabyte, die Sinnlos verpulvert werden.
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

Hahninator

BeitragDo, Mai 15, 2008 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
War das nicht so das Local am ende Der Funktion gelöscht werden? Denn dann ist es im Prinzip egal

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group