AGB  ·  Datenschutz  ·  Impressum  







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

Dynamische Arrays ... kleines Problem!

Ein Thema von sonicfire · begonnen am 2. Aug 2006 · letzter Beitrag vom 4. Aug 2006
Antwort Antwort
Seite 5 von 7   « Erste     345 67      
sonicfire

Registriert seit: 17. Jan 2006
Ort: Berlin
58 Beiträge
 
#41

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 21:55
Zitat von Der_Unwissende:
Zitat von sonicfire:
Delphi-Quellcode:
Procedure TForm1.LoadTheWave(FileName: String; out Value: TSmallIntArray;Start: Integer = 0);
begin
  with TFilestream.Create(Filename, fmOpenRead) do
    try
      Position := Size;
      setlength(Value, Size-Position);
      ReadBuffer(Value,length(Value));
    finally
      Free;
    end;
end;
Schau dir mal an was du hier tust! Du setzt Position := Size und dann die Länge von Value auf Size - Position, anders gesagt, du setzt die Länge von Value auf 0.
Wenn du 0 Byte zu schreiben hast, nun ja, dann wird natürlich auch nie irgendwas geschrieben...

Gruß Der Unwissende
Okay, leuchtet ein ... aber warum bekomme ich Stream-Errors wenn ich Position einfach weglasse? Oder Position := 0 (was logisch wäre)? ... genauso - müsste setlength(Value, Size) nicht funktionieren? (Aber nein, tut es nicht)...ARGH! Ich könnte echt nur auskeksen....seufz
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#42

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 22:07
@Der_Unwissende:

Macht man das nicht seit neuestem so:

TFileStream.Create(FileName, fmOpenRead, fmShareExclusive); //man beachte das Komma @sonicfire: Du hast den falschen Code von mir kopiert - NEIN verdammt, ich habe den falschen geschrieben! Sorry! das sollte position := Start heissen!
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
sonicfire

Registriert seit: 17. Jan 2006
Ort: Berlin
58 Beiträge
 
#43

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 22:11
Danke, Luke!

Quasi so
Delphi-Quellcode:
Procedure TForm1.LoadTheWave(FileName: String; out Value: TSmallIntArray; Start: Integer = 0);
begin
  with TFilestream.Create(Filename, fmOpenRead) do
    try
      Position := Start;
      setlength(Value, Size-Position);
      ReadBuffer(Value,length(Value));
    finally
      Free;
    end;
end;
Aber das gibt wieder einen Stream- RuntimeError!
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#44

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 22:22
Hmm... eventuell kommst du über den rand hinaus mit dem readbuffer... versuchs mal mit read ohne buffer, evtl. hilft das was.

ich muss mal überlegen... angenommen, wir haben einen header, der 5 bytes lang ist. dann wird als start 6 übergeben, und position = 6.

Angenommen Größe 10, wird ...aaaahhh....

weiter im text. größe der datei 10, dann haben wir noch 4 bytes zu lesen. also setzen wir die größe des arrays - natürlcih - auf 4 bytes geteilt durch (!) größe unseres datentyps. das ham wir (hab ich) hier schon mal falsch gemacht. also, angenommen

Delphi-Quellcode:
Procedure TForm1.LoadTheWave(FileName: String; out Value: TSmallIntArray; Start: Integer = 0);
begin
  with TFilestream.Create(Filename, fmOpenRead) do
    try
      Position := Start;
      setlength(Value, (Size-Position) div sizeof(SmallInt));
      ReadBuffer(Value,length(Value));
    finally
      Free;
    end;
end;

wenn ein smallint 2 byte groß ist (hypothetisch), ist value jetzt 4 / 2 = 2 Smallints groß. Also haben wir vier bytes zu lesen und müssen im readbuffer die Länge wieder auf 4 bringen - also wieder *sizeof(SmallInt):

Delphi-Quellcode:
Procedure TForm1.LoadTheWave(FileName: String; out Value: TSmallIntArray; Start: Integer = 0);
begin
  with TFilestream.Create(Filename, fmOpenRead) do
    try
      Position := Start;
      setlength(Value, (Size-Position) div sizeof(SmallInt));
      ReadBuffer(Value,length(Value) * sizeof(SmallInt));
    finally
      Free;
    end;
end;
Das hat uns aber noch nicht weitergebracht als bis dahin, dass das Ergebnis nicht mehr viel zu groß ist - sollte also die Fehler nicht nicht beheben.

EDIT: Wo genau tritt denn der runtime-error auf? Du kannst im Quelltext breakpoints setzen, indem du im editor links neben die zeile klickst (im grauen), wenn der programmcode da vorbeikommt, hält der debugger die ausführung an. damit kannst du genau sehen, wanns knallt.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
sonicfire

Registriert seit: 17. Jan 2006
Ort: Berlin
58 Beiträge
 
#45

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 22:30
So wie es aussieht crasht es bei ReadBuffer(Value,length(Value) * sizeof(SmallInt));
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#46

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 22:33
Ok, benutze einfach mal Read anstelle von ReadBuffer.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
sonicfire

Registriert seit: 17. Jan 2006
Ort: Berlin
58 Beiträge
 
#47

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 22:36
Jepp, das funzt soweit ..
Nur zerstört er dann am Ende das WAV-File ...hmm...

EDIT: Achso! Muss ja noch das Offset für den Header setzen!
  Mit Zitat antworten Zitat
sonicfire

Registriert seit: 17. Jan 2006
Ort: Berlin
58 Beiträge
 
#48

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 22:38
seufz... jetzt sind im Audio-Teil des WAV´s daten die da nicht hingehören *G*

Genauso verwunderlich ist immernoch, das ich den Inhalt vom WavBuffer komplett auf 0 setze, das heisst es müsste totale Stille im WAV sein - aber da ist nichts verändert
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#49

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 22:56
Rufst du es auch mit Start = sizeof(Header)+1 auf? sonst liest du das letzte byte vom header noch mit aus.

Wo genau setzt du den Inhalt auf 0? Vielleicht irgendwo, wo danach gleich wieder drüber geschrieben wird bzw. in einer lokalen Variable, wo es gar keine Wirkung hat?

SaveToFileAppend() ist übrigens dafür gedacht, zuerst den header in die Datei zu schreiben und dann die Daten. Allerdings hat das einiges an Overhead, denn nachdem du den Header geschrieben hast, musst du erst mal die Datei schließen und sie dann (durch aufruf meiner funktion) wieder öffnen und beschreiben. Ist nicht optimal, du solltest beides in einem Aufwasch machen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
sonicfire

Registriert seit: 17. Jan 2006
Ort: Berlin
58 Beiträge
 
#50

Re: Dynamische Arrays ... kleines Problem!

  Alt 3. Aug 2006, 22:59
Eigentlich schon!

Momentan versuche ich es so, aber werds jetzt mal innerhalb einer Prozedur versuchen!

Delphi-Quellcode:
Procedure TForm1.ProcessWave(FileName: String);
var
    Wavbuffer: TSmallIntArray;
    Header: TWaveHeader;
    i: Integer;

begin
  LoadTheWave(Outputfile.Text, Wavbuffer, sizeOf(Header)+1); // reine audio daten laden
  for i := Low(Wavbuffer) to High(Wavbuffer) do // testweise stille einfügen
  begin
// Wavbuffer[i] := Wavbuffer[i];
    Wavbuffer[i] := 0;
  end;
  SaveTheWave(Outputfile.Text, Wavbuffer, sizeOf(Header)+1);
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 7   « Erste     345 67      


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 13:32 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