Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dynamisches Array oder Klasse als Array auslegen (https://www.delphipraxis.net/77666-dynamisches-array-oder-klasse-als-array-auslegen.html)

EWeiss 24. Sep 2006 10:34

Re: Dynamisches Array oder Klasse als Array auslegen
 
Zitat:

Zitat von marabu
Um dem Compiler Entwarnung zu geben: Nimm die Zuweisung von 0 an Result aus dem äußeren ELSE-Zweig weg und stelle sie ohne Bedingung vor das IF Statement.

marabu

Sorry verstehe ich jetzt nicht!

free(winampDsp);
return 0;

müßten ja eigentlich in einen verbund bleiben.
Damit bei einen Fehler Das Mem auch wieder freigegeben wird.

Weiß jetzt nicht welche IF anweisung du meinst. :oops:

grüße

marabu 24. Sep 2006 10:39

Re: Dynamisches Array oder Klasse als Array auslegen
 
Schau mal:

Delphi-Quellcode:
begin
  // ...

  // Exceptions zurück auf Defaultwert
  Set8087CW(Saved8087CW);

  Result := 0; // spätestens hier initialisieren

  if winampDsp^.hDll <> 0 then
  begin
    // ...
    FreeMem(winampDsp);
  end; // else Result := 0; // wird hier nicht mehr gebraucht
end;
Verständlicher so?

marabu

EWeiss 24. Sep 2006 10:45

Re: Dynamisches Array oder Klasse als Array auslegen
 
Zitat:

Zitat von marabu
Schau mal:

Delphi-Quellcode:
begin
  // ...

  // Exceptions zurück auf Defaultwert
  Set8087CW(Saved8087CW);

  Result := 0; // spätestens hier initialisieren

  if winampDsp^.hDll <> 0 then
  begin
    // ...
    FreeMem(winampDsp);
  end; // else Result := 0; // wird hier nicht mehr gebraucht
end;
Verständlicher so?

marabu

Verstanden ja ;)
Aber wo springe ich dann hin wenn das FakeWindow nicht erstellt werden konnte.
Dann muss ich ja auch den Speicher freigeben und das Result := 0; an die Anwendung übergeben.

An die erste Zeile kann ich ja dann nicht springen.



Grüße ..

marabu 24. Sep 2006 10:52

Re: Dynamisches Array oder Klasse als Array auslegen
 
Das von dir ausgemachte Problem existiert nicht. Wenn ich nichts übersehen habe, dann müsstest du bei einem code-walk-through feststellen, dass beim Scheitern von Create_Winamp_Window() die Routine Destroy_Winamp_Window() aufgerufen wird, wie vorher auch schon.

marabu

EWeiss 24. Sep 2006 10:56

Re: Dynamisches Array oder Klasse als Array auslegen
 
Zitat:

Zitat von marabu
Das von dir ausgemachte Problem existiert nicht. Wenn ich nichts übersehen habe, dann müsstest du bei einem code-walk-through feststellen, dass beim Scheitern von Create_Winamp_Window() die Routine Destroy_Winamp_Window() aufgerufen wird, wie vorher auch schon.

marabu

Ja das stimmt ;) Sorry

gruß

EWeiss 25. Sep 2006 10:13

Re: Dynamisches Array oder Klasse als Array auslegen
 
Irgendwie bekomme ich das nicht gebacken.

Delphi-Quellcode:
// Returns the name of a loaded Winamp DSP plugin
function BASS_WADSP_GetName(plugin: HDSP): LPTSTR; stdcall;
Var
  strRet: PChar;
  winampDSP: WINAMPPLUGINPROPDSP;

begin
  strRet := nil;
  winampDsp := GetDSP(plugin);
   if winampDsp <> nil then
   begin
      strRet := winampDsp^.pModule^.description;
   end;
   Result := strRet;
end;
In BASS_WADSP_Load und AddDSP klappt jetzt alles bis in der obigen GetName funktion
wenn ich von dort aus in winampDsp := GetDSP(plugin); springe

Delphi-Quellcode:
function GetDSP(handle: DWORD): WINAMPPLUGINPROPDSP; stdcall;
var
  a: DWORD;
  winampDSP: WINAMPPLUGINPROPDSP;

begin
  if not handle <> 0 then
    Result := nil;

  for a := 0 to winampDSPcounter do
    winampDsp := Winamp_DSP^[a];
  if (winampDSP <> nil) and (winampDSP^.handle = handle) then
  begin
    Result := winampDsp;
  end else

    Result := nil;

end;
werden mir bei der ausgabe Result := winampDsp; komplett andere Werte angegeben
so als wenn die letzen aufrufe nicht mehr existieren würden.


gruß

EWeiss 25. Sep 2006 13:45

Re: Dynamisches Array oder Klasse als Array auslegen
 
Niemand ne Idee ?
Schade...

gruß

marabu 25. Sep 2006 14:08

Re: Dynamisches Array oder Klasse als Array auslegen
 
Hallo Emil,

kann es nicht sein, dass der Rückgabewert von GetDSP ein Zeiger PWinampPluginPropDsp ist? Außerdem bist du eventuell in eine weitere Falle getappt: während in C++ die function mit der Rückgabe eines Wertes verlassen wurde, verbleibt Object Pascal im code block, auch wenn du der Pseudo Variable Result etwas zugewiesen hast.

Grüße vom marabu

EWeiss 25. Sep 2006 17:44

Re: Dynamisches Array oder Klasse als Array auslegen
 
Zitat:

Zitat von marabu
Hallo Emil,

kann es nicht sein, dass der Rückgabewert von GetDSP ein Zeiger PWinampPluginPropDsp ist? Außerdem bist du eventuell in eine weitere Falle getappt: während in C++ die function mit der Rückgabe eines Wertes verlassen wurde, verbleibt Object Pascal im code block, auch wenn du der Pseudo Variable Result etwas zugewiesen hast.

Grüße vom marabu

In BASS_WADSP_Load nach AddDSP wenn das Result übergeben wurde habe
ich noch 100% Werte danach wird ein Handle von 1 übergeben
was auch stimmt (habe es mit der originalen DLL verglichen)
Das Modul mit Version und Description sind auch in Ordnung.

Zum schluß kommt
FreeLibrary(winampDsp^.hDll);

Habe erst gedacht das diese zeile alle werte löscht.
Müßte sie theoretisch auch, habe sie deshalb mal auskommentiert.
Aber gleiche fehler.

Alle Werte gehen unterwegs verloren.

Eine Pseudo Variable kannst eigentlich nicht sein ist ja alles an daten vorhanden
die ich zur übergabe benötige.

Gruß

marabu 25. Sep 2006 17:59

Re: Dynamisches Array oder Klasse als Array auslegen
 
Result ist eine Pseudo-Variable, sie steht für den Funktionsrückgabewert. Du könntest genausogut den Rückgabewert an den Funktionsnamen übergeben, was aber nicht so wartungsfreundlich ist. Die Funktion wird dabei aber nicht beendet, wie z.B. bei der Anweisung return in C. Soweit die Begriffsklärung. Näheres findest du in der Delphi Online-Hilfe. Hier mein Versuch einer Umsetzung - ohne doppelte Negation:

Delphi-Quellcode:
function GetDSP(handle: DWORD): WINAMPPLUGINPROPDSP;
var
  i: DWORD;
begin
  if handle <> 0 then
    for i := 0 to Pred(winampDSPcounter) do
    begin
      Result := Winamp_DSP^[i];
      if Assigned(Result) and (Result^.handle = handle)
        then Exit;
    end;
  Result := nil;
  // GetDSP := nil // gleichwertig
end;
Gruß

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 Uhr.
Seite 3 von 6     123 45     Letzte »    

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