![]() |
EAccessViolation wegen dyn. Arrays
Hallo Leute :hi:
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:
Zitat:
die Länge der Arrays vor dem Beenden auf 0 zu setzen, hat aber keine Änderung herbeigeführt...
Delphi-Quellcode:
Ich hoffe irgendjemand kann mir da ein wenig unter die Arme greifen, war bis jetzt eigentlich
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. ein begeisterter Benutzer von dynamischen Arrays :wink: |
Re: EAccessViolation wegen dyn. Arrays
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:
Gruß Hawkeye
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz