Einzelnen Beitrag anzeigen

kill -9
(Gast)

n/a Beiträge
 
#1

EAccessViolation wegen dyn. Arrays

  Alt 28. Jan 2007, 13:37
Hallo Leute

Ich schreibe gerade an einer Klasse zum auslesen von WAVE-Dateien,
allerdings habe ich schon nach wenigen Zeilen Probleme die ich nicht
alleine bewältigen kann

Kurz was zur Struktur: Waves sind in Datenabschnitte gegliedert, bestehend aus
einer 4-Byte id (bei mir chunkname), einer Längenangabe des Abschnittes (wieder 4 Byte, bei mir length)
und den eigentlichen Daten die enthalten sind.

Die angehängte Klasse wird in ein Programm eingebunden, dann ein TWaveParser-Objekt
erstellt und "OpenWAV" ausgeführt. Dadurch werden die Datenabschnitte in das Array "AttachedChunks"
geladen und das Programm wird anschliessend beendet. Bis zum Beenden klappt das ganze fast
einwandfrei (noch ein Problem beim auslesen des content, ist aber ne andere Sache),
wenn ich das Programm beende kommt allerdings eine EAccessViolation. Die Debug-DCUs
schleudern mich in die "System"-Unit zu Zeile 16410
Zitat:
{ Decrement ref count. Nothing to do if not zero now. }
LOCK DEC dword ptr [ECX-8]
in der Prozedur
Zitat:
procedure _DynArrayClear;
daher weiss ich dass es was mit den dyn. Arrays zu tun hat. Habe schon versucht
die Länge der Arrays vor dem Beenden auf 0 zu setzen, hat aber keine Änderung
herbeigeführt...

Delphi-Quellcode:
unit WaveParser;

interface

uses
 SysUtils, Classes, StrUtils, Windows, Dialogs;

type

 TWaveChunk= Record
  chunkname: Array[0..3] of Char;
  length: DWORD;
  content: Array of Char;
 end;

 TWaveParser= class (TObject)
 public
  procedure OpenWAV(Filename: String);
 private
  procedure ReadChunks();
 end;

var
 FileStream: TFileStream;
 AttachedChunks: Array of TWaveChunk;

implementation

procedure TWaveParser.ReadChunks(); //Chunks auslesen und in das Array "AttachedChunks" schreiben
begin
 SetLength(AttachedChunks, 0);
 while FileStream.Position < WavFile.Size do
  begin
   SetLength(AttachedChunks, length(AttachedChunks)+1);
   FileStream.Read(AttachedChunks[length(AttachedChunks)-1].chunkname, 4);
   FileStream.Read(AttachedChunks[length(AttachedChunks)-1].length, 4);
   SetLength(AttachedChunks[length(AttachedChunks)-1].content, AttachedChunks[length(AttachedChunks)-1].length);
   FileStream.Read(AttachedChunks[length(AttachedChunks)-1].content, length(AttachedChunks[length(AttachedChunks)-1].content));
  end;
end;

procedure TWaveParser.OpenWAV(Filename: String); //Eine Wave-Datei öffnen
begin
 if FileExists(Filename) then
  begin
   FileStream:=TFileStream.Create(Filename, fmOpenRead);
   ReadChunks;
   FileStream.Free;
  end;
end;

end.
Ich hoffe irgendjemand kann mir da ein wenig unter die Arme greifen, war bis jetzt eigentlich
ein begeisterter Benutzer von dynamischen Arrays
  Mit Zitat antworten Zitat