Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#54

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 28. Sep 2006, 01:34
Delphi-Quellcode:
Werde es mir genau ansehen und vergleichen im Quelltext-
Dann ein gutes Nächtele man schreibt sich.
Ich denke das Problem lokalisiert zu haben.
Wie angenommen liegt es immer noch an AddDSP

Der Lokale Zähler welcher die Plugins incrementiert? wird nicht hochgerechnet.
Ist der grund das mir überall falsche werte angezeigt werden.

Original
Code:
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;
}
Dieser zähler winampDSPcounter++; wird nie angeprochen

Übersetzt

Delphi-Quellcode:
Procedure AddDSP(winampDsp: WINAMPPLUGINPROPDSP); stdcall;

var
  a: DWORD;

begin

  // Habe ich addiert weil bei 'if not Assigned(Winamp_DSP[a])' immer ein AV auftrat
  // Kann aber nicht stimmen da im C++ auch nicht enthalten.
  Winamp_DSP := DspPtrArray(winampDsp);

  for a := 0 to winampDSPcounter do
    // Wenn oben auskommentiert gibts hier einen AV
    if not Assigned(Winamp_DSP[a]) then
      Break;

  if a = winampDSPcounter then
  begin
    // Kein leerer Speicherbereich, einen neuen hinzufügen
    ReallocMem(Winamp_DSP, (winampDSPcounter + 1) * SizeOf(WINAMPPLUGINPROPDSP));
    // Bin nicht sicher ob DEC oder INC da dies ein Postfix-Operator in c++ ist:
    // Denke aber da hier nur ein Wert steht, er hochzählen soll.
    // Wird der zähler nicht verwendet funktioniert der ganze Code nicht
    // In fast jeder Function wird dieser mit a verglichen.
    Inc(winampDSPcounter);
  end;
  Inc(winampDSPhandle);
  winampDsp^.handle := winampDSPhandle;
  // addiere ein Winamp DSP Plugin zum Array (im neuangelegten leeren Speicherbereich)
  Winamp_DSP[a] := winampDsp;

end;
Im grunde geht es jetzt nur um diese eine Zeile.

Code:
if (!winampDSP[a]) break;
Delphi-Quellcode:
    if not Assigned(Winamp_DSP[a]) then
      Break;
Kann irgendwie nicht stimmen, weil so, wenn ich in Break hineinspringe, 'a' um eins hochgezählt wird.
'a = winampDSPcounter' kann also niemals eintreten. a wird immer um einen zähler höher sein.

Das Resultat ist das winampDSPcounter immer 0 ist.
Dies hat wiederum zur folge das ich keine richtigen werte im Speicher finde da sie nicht
an der richtigen position stehen und kein Speicherbereich dafür bereitgestellt wurde.
Auch die FakeWindows welche von dem Zähler abhängig sind werden nicht korrekt erstellt.

AppClass := PChar(Format(Pchar('Winamp v1.x : %d'), [winampDSPcounter + 1])); Der KlassenName wird ja um den wert '%d' mit dem winampDSPcounter hochgezählt.

Grüße Emil
  Mit Zitat antworten Zitat