@venice2:
Ich glaube da machst du einen Denkfehler.
In "TBassPlayer.DrawData" sind TRA und TIA zwar als Array[1..512] of Single, also statische Arrays deklariert.
Aber an
procedure TBassPlayer.XFFT(FR, FI: array of single; Sign, Sample, SampleCount: Integer);
.
werden die TRA und TIA als dynamische Arrays übergeben und haben dort die Indizes 0..511, SampleCount jedoch hat den Wert 512.
Wenn du in "TBassPlayer.XFFT" das
while Q <= (SampleCount + 1) do
abarbeitest kommt es 2 mal zu Bereichsüberschreitungen.
Das erste mal wenn Q = 512 ist.
Das zweite mal wenn Q = 513 ist, denn die while Schleife arbeitet ja nicht nur bis SampleCount sondern sogar bis SampleCount+1.
In beiden Fällen wird nicht auf Inhalte der Arrays zugegriffen, sondern auf irgendwelche Daten, die zufälligerweise an den Adressen stehen,
auf die zugegriffen wird
Die Fehlermeldung FLOAT_INVALID_OPERATION deutet darauf hin, dass mit einer ungültigen Fließkommazahl, z.B. einer NaN irgendetwas
gerechnet wird.
Die Fehlermeldung FLOAT_OVERFLOW sagt, dass das Rechenergebnis außerhalb des für Singles gültigen Bereiches ist.
Richtig wäre also, wie bereits in #7 gesagt:
while Q < SampleCount
.
Zitat:
Wenn die Schleifen nicht korrekt wären dürfte es auch unter 32Bit nicht laufen.
Vielleicht stehen unter 32 Bit an den Adressen außerhalb der Arrays 0 Werte und unter 64 Bit z.B. NaNs.
Dann hättest du unter 32 Bit zwar fehlerhafte Ergebnisse aber keine Exeptions, unter 64 Bit dagegen würden dann Exceptions ausgelöst.