AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EAccessViolation wegen dyn. Arrays

Ein Thema von kill -9 · begonnen am 28. Jan 2007 · letzter Beitrag vom 28. Jan 2007
Antwort Antwort
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
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: EAccessViolation wegen dyn. Arrays

  Alt 28. Jan 2007, 14:21
Hallo,

bei TWaveChunk.content handelt es sich auch um ein dynamisches Array, der Record enthält also nur einen Zeiger auf den eigentlichen String. Mit der Read-Methode von TFileStream versuchst du nun, die Zeichen in diesen Zeiger einzuladen - das muß scheitern. Versuche es einmal so:

Delphi-Quellcode:
procedure TWaveParser.ReadChunks(); //Chunks auslesen und in das Array "AttachedChunks" schreiben
var
  Chunk : ^TWaveChunk;
begin
  SetLength (AttachedChunks, 0);
  while (FileStream.Position < WavFile.Size) do
    begin
      SetLength (AttachedChunks, Length(AttachedChunks) + 1);
      Chunk := @AttachedChunks[High(AttachedChunks)];
      FileStream.Read(Chunk.chunkname, 4);
      FileStream.Read(Chunk.length, 4);
      SetLength (Chunk.content, Chunk.length);
      if (Chunk.length > 0) then
        FileStream.Read(Chunk.content[0], Chunk.length);
    end;
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz