Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi overload-Fehlermeldung beim Kompilieren (falsche Argumente) (https://www.delphipraxis.net/103635-overload-fehlermeldung-beim-kompilieren-falsche-argumente.html)

benst 18. Nov 2007 23:26


overload-Fehlermeldung beim Kompilieren (falsche Argumente)
 
Moin,

ich möchte etwas mit der FastFourierTransformation machen und bin auf FFT in der Code-Library gestoßen. Jetzt wollte ich diesen Code mal ausprobieren, aber leider bekomme ich ihn nicht kompiliert.
Der Debugger meint immer, es gäbe keine überladene Version von 'DFT', die mit dem Argument aufgerufen werden kann ("Es gibt keine überladene Version von 'DFT', die man mit diesen Argumenten aufrufen kann") - ich bin da aber anderer Meinung :? .
Ich habe zunächst nur versucht den Code mit Beispiel zu testen.
Ich kann den Fehler nicht finden... und wäre für einen Tipp dankbar. Stehe irgendwie gerade auf dem Schlauch.

Gruß
Ben
P.S.: Win XP, Delphi 5 Standard
P.P.S.: Mir ist klar, dass der Code so noch nichts macht! (Ich möchte ihn ja in meinen Code einbinden, aber ich bekomme ihn noch nicht einmal so kompiliert.)

complex.pas genau wie hier: FFT (obere Teil)

main.pas (genau wie im Beispiel)


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, complex;

type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function GetFrequency(Data: array of Single; SampleRate, SampleIndex,
    Samples: Integer): Integer;
var I, n, max: Integer;
    a: array of Single;
begin
  max := 0;
  if length(Data) - SampleIndex < Samples then
    raise EAccessViolation.Create('Sound index or length out of bounds.');
  setlength(a, Samples);
  for I := 0 to Samples - 1 do
    a[I] := Data[SampleIndex + I];
  dft(a);
  for I := 0 to (n shr 1) - 1 do if a[I] > a[max] then
  begin
    max := I;
  end;
  Result := trunc(SampleRate / Samples * max);
end;

end.

Muetze1 18. Nov 2007 23:38

Re: overload-Fehlermeldung beim Kompilieren (falsche Argumen
 
1. Der Debugger kann dir schlecht sowas sagen, weil der kommt erst zur Arbeit, wenn das Programm läuft. Es war der Compiler...
2. Für den Compiler ist ein "Array of Single" was anderes als ein "Array of Single". Klingt komisch, ist aber so. Von daher folgendes zur Abhilfe:

Deklariere dir in der Unit complex im Interface Teil einen neuen Typ:

Delphi-Quellcode:
type
  TComplexList = array of single;
Diesen setzt du dann in der DFT Funktion ein, anstatt dem "array of single" zuvor. Gleiches dann bei der lokalen Variablendeklaration in deiner main.pas. Und dann sollte es klappen. Klingt komisch, sollte aber...

Oder wie Jürgen von der Lippe es sagen würde: "müsste aber"

benst 18. Nov 2007 23:54

Re: overload-Fehlermeldung beim Kompilieren (falsche Argumen
 
Klingt wirklich komisch, aber funktioniert. :o
Vielen Dank!

Gruß
Ben

Muetze1 19. Nov 2007 00:13

Re: overload-Fehlermeldung beim Kompilieren (falsche Argumen
 
Kurze Erklärungen dazu vllt. noch:

1. Der Doppelpost war unbeabsichtigt und ist gemeldet. Die DP hatte ein kleines Problem gehabt...
2. Wenn du in der Parameterliste ein "array of single" schreibst, dann definierst du hier den Typ des Parameters, aber keinen Namen für diesen Typ. Man kann es sich so vorstellen, dass sich der Compiler das intern als TArrayOfSingle1 vermerkt. Wenn du nun in main.pas auch einen solchen Typ bei der Variable deklarierst, dann weiß der Compiler nicht, dass dies auch der gleiche Typ sein soll, weil du diesen auch hier direkt bei der Variablendeklaration mit deklarierst. Dadurch ist es für ihn ein neuer Typ (da hier ja neu definiert), also (beispielhaft), interner Name TArrayOfSingle2. Damit sind es für ihn unterschiedliche Typen und somit nicht gleich und somit nicht aufrufbar.

Abhilfe schafft hier diese Deklaration. Damit deklarierst du den Typ und gibst ihm einen eindeutigen Namen. Dadurch das du diesen nun bei beiden Dingen verwendest, ist es für den Delphi Compiler auch eindeutig der gleiche Typ.

Dieses Verhalten legt der Delphi Compiler grundsätzlich bei solchen "inline" Deklarationen mit dynamischen Arrays zu Tage. Klingt komisch, ist aber so... :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 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