Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 13, 2025 18:19

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Dynamisches Array ist zu gross
BeitragVerfasst: Mi Aug 22, 2007 02:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Hallo Leute,

ich habe folgendes Array erstellt und geleert:

Code:
  1.  
  2. QuadTreeLength := 65;
  3. SetLength(QuadMatrix, QuadTreeLength, QuadTreeLength);
  4. FillChar(QuadMatrix[0, 0], QuadTreeLength*QuadTreeLength, 0);
  5.  


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. :shock:

Gruß

damadmax


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 03:39 
Offline
DGL Member
Benutzeravatar

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:
  1. for i := 0 to QuadTreeLength-1 do
  2.   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. ;)

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 08:22 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 09:23 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
@Sidorion:

Habs verstanden...

es war dann wohl reiner Zufall, dass er überhaupt etwas in das Array geschrieben hat.

Dann sollte es ja so funktionieren:

Code:
  1.  
  2.   QuadTreeLength := 4;
  3.   SetLength(QuadMatrix, QuadTreeLength, QuadTreeLength);
  4.   for i := 0 to QuadTreeLength-1 do
  5.     FillChar(QuadMatrix[i,0], QuadTreeLength, 0);
  6.  


[edit]
Gut, das funktioniert! Vielen Dank

Hab mal ein paar Versuche gemacht:

Bei
FillChar(QuadMatrix[i,0], QuadTreeLength, 0);
kommt das raus:
((0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0))

Und Bei
FillChar(QuadMatrix[0,0], QuadTreeLength*QuadTreeLength, 0);
kommt das raus:
((0, 0, 0, 0), (), (0, 0, 0, 0), (0, 0, 0, 0))

interessant finde ich, dass nicht am ende was fehlt sondern mitten drin. Hab mir wohl die Pointer überschrieben :oops:

Gruß

damadmax


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 10:39 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 22:46 
Offline
DGL Member
Benutzeravatar

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 :)


Gruß

damadmax


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 23, 2007 07:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
damadmax hat geschrieben:
Das Array QuadTree wird aber bei jedem Frame neu mit Werten belegt und muss vorher 'genullt' werden. Sonst gibts murks :)

Na ja. Gut. Das ist etwas anderes. Ich bin davon ausgegangen, dass es vorher immer leer (lokal) ist und du jedes Mal die Größe setzen musst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 23:35 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
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:
  1. for y=0 to heigh-1 do
  2.  fillchar(myarray[y,0],sizeof(element)*width,0);


oder einfach in einer doppelten for-schleife 0 setzen, was sauber wäre.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 07, 2007 01:03 
Offline
DGL Member
Benutzeravatar

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:
  1. for i := 0 to QuadTreeLength-1 do
  2.   FillChar(QuadMatrix[i, 0], QuadTreeLength, 0);

[tut] problemlos [...]

damadmax hat geschrieben:
Dann sollte es ja so funktionieren:
Code:
  1.  
  2.   [...]
  3.   for i := 0 to QuadTreeLength-1 do
  4.     FillChar(QuadMatrix[i,0], QuadTreeLength, 0);
  5.  



The-Winner hat geschrieben:
In diesem fall kannst du [...] anwenden
Code:
  1. for y=0 to heigh-1 do
  2.  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. :roll:

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 07, 2007 07:58 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 07, 2007 08:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Mir ist da gerade noch etwas aufgefallen:
Code:
  1.  
  2.   FillChar(QuadMatrix[i, 0], QuadTreeLength, 0);
  3.  

ist doch nicht ganz richtig, es sollte doch so aussehen:
Code:
  1.  
  2.   FillChar(QuadMatrix[i, 0], QuadTreeLength * SizeOf(QuadMatrix[i, 0]), 0);
  3.  

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]