![]() |
Dynamisches Array oder Klasse als Array auslegen
Hallo
Habe ein kleines Problem bei der übersetzung eines C++ QuellTextes
Code:
Diese zeile erzeugt ein dynamisches array welches ich in Delphi übersetzen muss.
WINAMPPLUGINPROPDSP **winampDSP = NULL;
Es ist ein Speicherbereich, in dem hintereinander Pointer auf Insanzen vom Typ: WINAMPPLUGINPROPDSP Gespeichert werden. Die Instanz ist von folgenden Typ!
Code:
Meine Frage!
typedef struct WINAMPPLUGINPROP_TAG_DSP
{ ... } WINAMPPLUGINPROPDSP; Ist es möglich ein Klasse von vornherein als array auszulegen? welche beide variationen aktzeptieren muss.. Beispiel:
Delphi-Quellcode:
Oder sollte diese dynamisch ausgelegt werden.
winampDsp := winampDSP[a];
winampDSP[a] := winampDsp; Wenn ja wie geht das in Delphi ? Noch eine Frage zu den Thema. auch hier habe ich ein Problem.
Delphi-Quellcode:
Var
winampDsp: PWinampDSPInfo; a: integer; i, s: Short; begin // 16-bit already, just need to copy i := Trunc(buffer); s := (short(AllocMem(length *2 ))); // alloc twice as much as needed, since modify might return more for a := 0 to (Trunc(length /2)) do begin; // s[a]=i[a]; end; i,s ist nicht als array ausgelegt. Wie bekomme ich es dennoch zum laufen ? Gruß |
Re: Dynamisches Array oder Klasse als Array auslegen
Hallo,
Zitat:
Zitat:
Der Zugriff kann über Zeiger-Arithmetik erfolgen oder durch Überlagerung des Speicherbereiches mit einem Array. Vielleicht verhilft dir ein wenig Code zur Erkenntnis?
Delphi-Quellcode:
Getippt und nicht getestet.
type
WINAMPPLUGINPROPDSP = record // ... end; PWinAmpPluginPropDSP = ^WINAMPPLUGINPROPDSP; PPWinAmpPluginPropDSP = ^PWinAmpPluginPropDSP; var WinAmpDSP = PPWinAmpPluginPropDSP; // access using pointer arithmetic and nil indicating end of list var p: PWinAmpPluginPropDSP; begin p := WinAmpDSP^; while Assigned(p) do begin // ShowMessage(p^.anyStringMember) Inc(p); end; end; // access using array overlay and count indicating end of list type TA: array [0..0] of PWinAmpPluginPropDSP; var pa: ^TA; count: Integer; begin // ... pa := WinAmpDSP; for i := 0 to Pred(dspCount) do // ShowMessage(pa[i]^.anyStringMember) ; end; Grüße vom marabu |
Re: Dynamisches Array oder Klasse als Array auslegen
Danke marabu.
Werde mir das mal zu gemüte führen.. Anbei nochmal die ganze klasse (Delphi style angepasst)
Delphi-Quellcode:
Type
//WinampDSPInfo Klasse PWinampDSPInfo = ^TWinampDSPInfo; TWinampDSPInfo = record csH : TRTLCriticalSection; // CRITICAL_SECTION handle : DWORD; // DSP handle NumberOfModules : UINT; // number of modules in the dsp hDll : HWND; // the dll instance pModule : PWinampDSPHeader; // module header pDSP : PWinampDSPModule; // current selected dsp module hchannel : DWORD; // channel associated to dsp module : DWORD; // curent selected dsp module hdsp : HDSP; // optional dsp handle DSP_Window_Emu : HWND; // related fake window handle DSP_Atom_Emu : ATOM; // related fake window atom songTitle : array[0..MAX_PATH-1] of char; // the playing song title fileName : array[0..MAX_PATH-1] of char; // the playing file name info : BASS_CHANNELINFO; // channel info end;
Delphi-Quellcode:
Der sinn des arrays liegt darin das bei jeden aufruf eines neuen DSP Plugins
implementation
var winampDSP : PWinampDSPInfo = nil; eine neue Instanz von winampDSP gebildet werden soll das geschieht hier. Original
Code:
Übersetzt
void AddDSP(WINAMPPLUGINPROPDSP *winampDsp)
{ DWORD a; for (a=0;a<winampDSPcounter;a++) if (!winampDSP[a]) break; if (a==winampDSPcounter) { // no empty slot, so add a new one winampDSP = (WINAMPPLUGINPROPDSP**)realloc(winampDSP, (winampDSPcounter+1)*sizeof(WINAMPPLUGINPROPDSP*)); winampDSPcounter++; } winampDsp->handle = ++winampDSPhandle; // insert the new Winamp DSP winampDSP[a] = winampDsp; }
Delphi-Quellcode:
Hier sind meine beiden Probleme.
procedure AddDSP(winampDsp: PWinampDSPInfo);
var a: DWORD; begin for a := 0 to winampDSPcounter do if (not winampDSP[a]) then break; if a = winampDSPcounter then Begin // no empty slot, so add a new one // winampDSP := ReallocMem(winampDSP, (winampDSPcounter + 1) SizeOf(PWinampDSPInfo); winampDSPcounter; end; winampDsp^.handle := winampDSPhandle; // insert the new Winamp DSP // winampDSP[a] := winampDsp; end; ReallocMem ärger bei 'SizeOf' und halt das berüchtigte array winampDSP[a] := winampDsp; Vielleicht kannst ja mal drüberfliegen was da nicht in Ordnung ist. gruß |
Re: Dynamisches Array oder Klasse als Array auslegen
Deine Umsetzung ist nicht korrekt. Insbesondere sind winampDsp und winampDSP nicht das gleiche. Hoffentlich bist du nicht schon an anderen Stellen in diese Falle getappt.
Delphi-Quellcode:
Wieder ohne Garantie.
procedure AddDSP(dsp: PWinampDSPInfo);
type TDspPtrArray = array [0..0] of PWinampPluginPropDSP; PDspPtrArray = ^TDspPtrArray; var i: DWORD; winampDSP: PDspPtrArray; begin for i := 0 to winampDSPcounter do if not Assigned(winampDSP^[i]) then Break; if i = winampDSPcounter then begin // no empty slot, so add a new one winampDSP := ReallocMem(winampDSP, i * SizeOf(PWinampDSPInfo)); Inc(winampDSPcounter); end; dsp^.handle := winampDSPhandle; // insert the new Winamp DSP winampDSP^[i] := dsp; end; marabu |
Re: Dynamisches Array oder Klasse als Array auslegen
Zitat:
beim auskommentieren der kritischen stellen habe ich die DLL erstellen können bekomme allerdings in der ersten LOAD-Funktion schon einen fatal crash wird wohl alles damit zusammen hängen. Ich werde deine Funktion mal testen und mit anderen vergleichen. Danke!. Ein kleines problem tritt in deiner Funktion noch auf.
Delphi-Quellcode:
[Pascal Error] BassWaDSP.pas(119): E2010 Incompatible types: 'PDspPtrArray' and 'procedure, untyped pointer or untyped parameter'
winampDSP := ReallocMem(winampDSP, i * SizeOf(PWinampDSPInfo));
Gruß |
Re: Dynamisches Array oder Klasse als Array auslegen
Habe mich nun stundenlang mit der einen zeile beschäftigt
Delphi-Quellcode:
bekomme immer noch den Fehler!
winampDSP := ReallocMem(winampDSP, i * SizeOf(PWinampDSPInfo));
Zitat:
|
Re: Dynamisches Array oder Klasse als Array auslegen
Zitat:
Gruß Der Unwissende |
Re: Dynamisches Array oder Klasse als Array auslegen
Zitat:
Super das wars ;) Ich hätte noch viele fragen aber erst mal die eine. Wenn ich in VB eine Variable Deklariere dann gilt diese solange wie der Thread besteht. Hier in Delphi stelle ich fest das obwohl sie Deklariert ist immer ein Hinweis kommt sie wäre nicht initialisiert. Reicht es nicht wenn sich diese als Public Decariert im Header befindet?
Delphi-Quellcode:
procedure AddDSP(winampDSP: PWinampDSPInfo);
var a: DWORD; DspPtrArray : PDspPtrArray; begin for a := 0 to winampDSPcounter do if not Assigned(DspPtrArray^[a]) then Break; if a = winampDSPcounter then begin // no empty slot, so add a new one ReallocMem(winampDSP, a * SizeOf(PWinampDSPInfo)); Inc(winampDSPcounter); end; winampDSP^.handle := winampDSPhandle; // insert the new Winamp DSP DspPtrArray^[a] := winampDSP; end; Zitat:
Was müßte ich übergeben damit sie intitalisiert wird?
Delphi-Quellcode:
würde ja die Daten die sich im Array befinden löschen.
DspPtrArray^[a] := nil;
gruss |
Re: Dynamisches Array oder Klasse als Array auslegen
Du musst diesen Zeiger tatsächlich vor seiner ersten Verwendung initialisieren, indem du ihm den Wert des Zeigers winampDSP (so war der Name der globalen Variablen im C++ Code) zuweist. Nur so wird schließlich die Redefinition des Speicherbereichs erreicht, damit du über array[index] zugreifen kannst.
marabu |
Re: Dynamisches Array oder Klasse als Array auslegen
Zitat:
Delphi-Quellcode:
wäre es so richtig?
procedure AddDSP(winampDSP: PWinampDSPInfo);
var a: DWORD; begin a := 0; DspPtrArray^[a] := winampDSP; for a := 0 to winampDSPcounter do if not Assigned(DspPtrArray^[a]) then Break; if a = winampDSPcounter then begin // Array nicht leer, füge ein neues hinzu ReallocMem(winampDSP, a * SizeOf(PWinampDSPInfo)); Inc(winampDSPcounter); end; winampDSP^.handle := winampDSPhandle; // addiere ein Winamp DSP Plugin zum Array DspPtrArray^[a] := winampDSP; end; Zumindest kommt kein fehler mehr. Eine Frage nebenbei. Kann ich hier im Thread weiter machen oder muss ich für jede Frage einen neuen aufmachen? gruß .. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 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 by Thomas Breitkreuz