Logikfehler in Arraysystem?

Anfängerfragen zum Programmieren mit PureBasic.
Norbie
Beiträge: 134
Registriert: 29.08.2004 12:45
Wohnort: Chemnitz
Kontaktdaten:

Logikfehler in Arraysystem?

Beitrag 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!
http://www.nevu.de/ Künstliche Intelligenz, die letzte Herausforderung!
Christi
Beiträge: 154
Registriert: 31.08.2004 14:17
Kontaktdaten:

Beitrag 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
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag 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 )
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Norbie
Beiträge: 134
Registriert: 29.08.2004 12:45
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von Norbie »

:mrgreen: :mrgreen: :mrgreen:

Danke. Das scheind zu funktionieren!

Großes Thx! :allright:
http://www.nevu.de/ Künstliche Intelligenz, die letzte Herausforderung!
Christi
Beiträge: 154
Registriert: 31.08.2004 14:17
Kontaktdaten:

Beitrag von Christi »

@Batze
Das is genau das selbe, nur das du ausmultipliziert hast.
Antworten