Seite 1 von 1

Logikfehler in Arraysystem?

Verfasst: 08.08.2005 14:08
von Norbie
Hi!

Da das Arraysystem von PureBasic jediglich Globale Arrays kennt, musste ich mir selber ein System erstellen, das zumindest so etwas ähnliches wie Lokale Arrays erzeugt:

Code: Alles auswählen

#xsize=10
#ysize=7

Procedure get(adresse.l,x.l,y.l)
  If x>=1 And x<= #xsize And y>=1 And y<= #ysize
  x-1
  y-1
  position=x*(#xsize)+y 
  ProcedureReturn PeekL(   adresse + position*4   );Manchmal stürtzt es in dieser Zeile ab
  Else
  PrintN("fehler bei aufruf von get x="+Str(x)+" y="+Str(y))
  EndIf
EndProcedure



Procedure set(adresse.l,x.l,y.l,wert.l)
If x>=1 And x<= #xsize And y>=1 And y<= #ysize
  x-1
  y-1
  position=x*(#xsize)+y 
  PokeL(   adresse + position*4   ,wert)
Else
  PrintN("fehler bei aufruf von set")  
EndIf
EndProcedure


Procedure new_feld()
  ProcedureReturn AllocateMemory((#xsize+1)*(#ysize+1)*4) ;manchmal stürtzt es in der zeile ab
EndProcedure


Procedure del_feld(adresse)
  ProcedureReturn FreeMemory(adresse)
EndProcedure

Procedure mov_feld(adresse1, adresse2)
  CopyMemory(adresse2, adresse1, (#xsize+1)*(#ysize+1)*4)
EndProcedure

Leider stürtzt das Programm manchmal mitten in new_feld() oder get() ab obwohl die Funktionen vorher 100 mal ohne Fehler durchlaufen wurden.

Der Arbeitsspeicher ist nicht voll, und get hat eigentlich einen Schutz, damit man nicht über die Arraygrenzen hinaus greift.
Ich kann die Abstürtze leider nicht direkt Reproduzieren.


Seht ihr irgendwelche Logikfehler?

Danke!

Verfasst: 08.08.2005 14:32
von Christi
Hallo,

Dieses "+1" hinter einigen Konstanten ist unnötig.
Es ist besser, wenn du das erste Element mit (0, 0) bezeichnest, solche Sachen beginnen eigendlich immer bei Null.

Vieleicht hatte sich dadurch was eingeschlichen, ansonsten seh ich nichts was falsch sein könnte.

Code: Alles auswählen

#xsize=2 
#ysize=2 

Procedure get(adresse.l,x.l,y.l) 
  If x >= 0 And x < #xsize And y >= 0 And y < #ysize 
    position= x * (#xsize) + y 
    ProcedureReturn PeekL(   adresse + position * 4   );Manchmal stürtzt es in dieser Zeile ab 
  Else 
    PrintN("fehler bei aufruf von get x="+Str(x)+" y="+Str(y)) 
  EndIf 
EndProcedure 

Procedure set(adresse.l,x.l,y.l,wert.l) 
  If x >= 0 And x < #xsize And y >= 0 And y <= #ysize 
    position = x * (#xsize) + y 
    PokeL(   adresse + position * 4   ,wert) 
  Else 
    PrintN("fehler bei aufruf von set")  
  EndIf 
EndProcedure 

Procedure new_feld() 
  ProcedureReturn AllocateMemory((#xsize)*(#ysize)*4) ;manchmal stürtzt es in der zeile ab 
EndProcedure 

Procedure del_feld(adresse) 
  ProcedureReturn FreeMemory(adresse) 
EndProcedure 

Procedure mov_feld(adresse1, adresse2) 
  CopyMemory(adresse2, adresse1, (#xsize)*(#ysize)*4) 
EndProcedure 



feld.l = new_feld()
Debug "Neues Feld: " + Str(feld.l)

For x.l = 0 To #xsize - 1
  For y.l = 0 To #ysize - 1
    x_l.l = Random(99)
    set(feld.l, x.l, y.l, x_l.l)
    Debug "Set: " + Str(x.l) + " / " + Str(y) + " : " + Str(x_l.l)
  Next
Next

For x.l = 0 To #xsize - 1
  For y.l = 0 To #ysize - 1
    x_l.l = get(feld.l, x.l, y.l)
    Debug "Get: " + Str(x.l) + " / " + Str(y) + " : " + Str(x_l.l)
  Next
Next

Debug "Feld gelöscht: " + Str(del_feld(feld.l))

Gruß,
Chris

Verfasst: 08.08.2005 16:54
von Batze

Code: Alles auswählen

position= x * (#xsize) + y
    ProcedureReturn PeekL(   adresse + position * 4   );Manchmal stürtzt es in dieser Zeile ab 
So geht das ja auch nicht, da #xsize in Long angegeben werden muss:

Code: Alles auswählen

position= x * (#xsize) * 4 + y * 4
    ProcedureReturn PeekL(   adresse + position )

Verfasst: 08.08.2005 17:48
von Norbie
:mrgreen: :mrgreen: :mrgreen:

Danke. Das scheind zu funktionieren!

Großes Thx! :allright:

Verfasst: 08.08.2005 18:49
von Christi
@Batze
Das is genau das selbe, nur das du ausmultipliziert hast.