Problem ist nur, daß QuadMatrix nicht vollständig gefüllt wird.
Habe dann per Hand ein paar Werte ausprobiert und bin bei 72*72 sprich 5184 Byte fündig geworden.
Ich frage mich nun wo diese 7 Byte pro Dimension herkommen. Irgendwo kommen mir da 959 Byte abhanden.
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Bei mir führt dieser Code mit "array of array of Byte" zu einer Access Violation. Ich würde behaupten, hier wird zunächst ein Array voller Pointer auf Arrays abgelegt und diese Arrays zeigen dann erst auf Speicherbereiche. Eine Bestätigung dafür wäre, dass
Code:
for i :=0to QuadTreeLength-1do
FillChar(QuadMatrix[i,0], QuadTreeLength,0);
problemlos tut. Aber vielleicht kann mich da jemand noch korrigieren, denn es ist definitiv zu spät für genauere Nachforschungen.
Zumindest in der ersten Dimension stehen Zeiger drin, die dann jeweils auf ein Array zeigen. die Arrays der zweiten Dimension sollten dann ordentliche Bytes sein. Das liegt daran, dass man ja jedes Element der zweiten Dimension getrennt dimensionieren kann. Dadurch kann das 2D Array nicht komplett an eine Stelle des Speichers geschrieben werden.
Das ist für alle dynarrays n-ter Dimension so. in den Arrays der Dimensionen x e (0..n-2) stehen nur Zeiger auf die Elemente der Dimension x+1.[/pascal]
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wie Sidorin ja schon sagte befinden sich in der ersten Dimension Pointer auf die einzelnen Arrays. Und mit QuadMatrix[0,0] hast du die Adressen der Unterarrays überschrieben. Sprich der Speicher den du dann gesehen hast muss nichts mit den wirklichen Unterarrays zu tun haben. Bzw kann es auch sein, dass du damit komplett andere Sachen überschrieben hast. Also wenn sich wichtige Daten hinter dem Dimensionsarray befinden. Also das was bei solchen Speicherüberschreitungen passieren kann ist alles sehr unberechenbar.
Aber eigentlich wäre das gar nicht nötig, denn SetLength initialisiert den Speicher von dynamischen Arrays bereits mit 0. Also so gesehen kannst du dir das manuelle Füllen auch sparen. Das Initialisieren wäre nur nötig, wenn das Array ein statisches Array wäre und es eine lokale Variable der Methode wäre.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Das Array QuadTree wird aber bei jedem Frame neu mit Werten belegt und muss vorher 'genullt' werden. Sonst gibts murks Es speichert die Unterteilungen an denen das Terrain verfeinert wird. Wenn man es nicht wieder auf 0 zurücksetzt geht das Detail nicht mehr zurück und nach einer Weile ist es überall auf maximaler Detailstufe. Wird dann etwas langsam
Intern is es ein array of pointer. Außerdem gibt es noch referenzzählung, also ist da fillchar schlecht. In diesem fall kannst du nur zeilenweise fillchar anwenden
Code:
for y=0 to heigh-1 do
fillchar(myarray[y,0],sizeof(element)*width,0);
oder einfach in einer doppelten for-schleife 0 setzen, was sauber wäre.
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
OT: Ich will euch ja nicht den Spaß verderben... aber...
WhiteHunter hat geschrieben:
[...] hier wird zunächst ein Array voller Pointer auf Arrays abgelegt [...]
Sidorion hat geschrieben:
[...] in der ersten Dimension stehen Zeiger drin, die dann jeweils auf ein Array zeigen.
Lossy eX hat geschrieben:
[...] befinden sich in der ersten Dimension Pointer auf die einzelnen Arrays.
The-Winner hat geschrieben:
Intern is es ein array of pointer.
WhiteHunter hat geschrieben:
Code:
for i :=0to QuadTreeLength-1do
FillChar(QuadMatrix[i,0], QuadTreeLength,0);
[tut] problemlos [...]
damadmax hat geschrieben:
Dann sollte es ja so funktionieren:
Code:
[...]
for i := 0 to QuadTreeLength-1 do
FillChar(QuadMatrix[i,0], QuadTreeLength, 0);
The-Winner hat geschrieben:
In diesem fall kannst du [...] anwenden
Code:
for y=0 to heigh-1 do
fillchar(myarray[y,0],sizeof(element)*width,0);
Ich meine... WTF?! Wie oft wollen wir die Sache noch wiederholen? Liest man nur den ersten Beitrag und drückt auf "Antworten"? Sind die anderen Posts manchmal unsichtbar? Wird es richtiger, wenn man es öfters sagt?! Sorry, nicht böse gemeint, aber das musste irgendwie mal raus.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ja dieser Fakt wurde wohl recht häufig erwähnt. Aber ich muss gestehen das kommt wohl teilweise auf den Betrachtungwinkel an. Bzw finde ich, dass die Zitate etwas aus dem Zusammenhang gerissen wurden.
WhiteHunter hat geschrieben:
Ich würde behaupten, hier wird zunächst ein Array voller Pointer auf Arrays abgelegt
Eine Behauptung.
Sidorion hat geschrieben:
Zumindest in der ersten Dimension stehen Zeiger drin, die dann jeweils auf ein Array zeigen. [...]
Die Bestätigung für deine Behauptung und tiefergehende Hintergrundinfos.
Lossy eX hat geschrieben:
Wie Sidorin ja schon sagte befinden sich in der ersten Dimension Pointer auf die einzelnen Arrays. [...]
Wiederholen eines Faktes zum Erklären warum es sich verhalten hat wie es das getan hat.
Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.