Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rückgabe von SpectrumDaten als PChar (https://www.delphipraxis.net/88419-rueckgabe-von-spectrumdaten-als-pchar.html)

EWeiss 15. Mär 2007 02:23


Rückgabe von SpectrumDaten als PChar
 
Ich begreifs irgendwo nicht.

Code:
unsigned char   *specdata;
im header GL_klasse definiert.

anschließend nochmal in der Render Methode Main_klasse
Code:
extern unsigned char *specdata;
dann werden (funktioniert in C) die Daten von
Code:
specdata = &this_mod->spectrumData[0][0];
als Char ausgegeben.. wäre in Delphi PChar

Ich bekomme das nicht gebacken das mir in Delphi die Daten
auch in specdata ausgegeben werden.

specdata ist entweder nil oder besitzt nur ein zeichen.
Aber nicht die ganzen Spectrum Daten..

gruss Emil

Muetze1 15. Mär 2007 09:29

Re: Rückgabe von SpectrumDaten als PChar
 
In C wird der Pointer einfach so genommen. In Delphi ist das Problem, dass Automatismen beim PChar diesen öfters mal verkürzt nur ausgeben oder an sich kürzen bei einem Nullbyte in den Daten. Von daher ist es besser, statt dessen ein PByte zu nutzen als einen PChar. Auch solltest du beachten, dass die Debugger-Hints sowie alle programmtechnischen PChar Ausgaben die Ausgabe mit auffinden eines Nullbytes abbrechen - obwohl noch mehr Daten folgen!

hoika 15. Mär 2007 09:35

Re: Rückgabe von SpectrumDaten als PChar
 
Hallo,

wie seht der Delhi-Code bei der Übergabe aus ?
Hast du auch Speicher in Delphi reserviert ?


Heiko

mkinzler 15. Mär 2007 09:36

Re: Rückgabe von SpectrumDaten als PChar
 
In C endet ein string aber auch auf einem Null-Byte.

Muetze1 15. Mär 2007 09:40

Re: Rückgabe von SpectrumDaten als PChar
 
Das habe ich nicht anders behauptet (behaupten wollen), aber in C geschieht eine Kürzung des Strings nicht schon bei einem reinem TypeCast wie bei Delphi...

OregonGhost 15. Mär 2007 10:51

Re: Rückgabe von SpectrumDaten als PChar
 
Zitat:

unsigned char *specdata;
Hierbei nicht vergessen: In C gibt es keinen Byte-Typ. unsigned char ist ein Byte. Eine Zeichenkette ist normalerweise char* oder const char* - unsigned char* ist ein Byte-Array. In Delphi ist PChar ein Datentyp für nullterminierte Zeichenketten, nicht für Daten. Das bereits erwähnte PByte wäre hier daher das richtige.
Also nicht durcheinanderbringen :)

EWeiss 15. Mär 2007 14:17

Re: Rückgabe von SpectrumDaten als PChar
 
Zitat:

Zitat von OregonGhost
Zitat:

unsigned char *specdata;
Hierbei nicht vergessen: In C gibt es keinen Byte-Typ. unsigned char ist ein Byte. Eine Zeichenkette ist normalerweise char* oder const char* - unsigned char* ist ein Byte-Array. In Delphi ist PChar ein Datentyp für nullterminierte Zeichenketten, nicht für Daten. Das bereits erwähnte PByte wäre hier daher das richtige.
Also nicht durcheinanderbringen :)

Danke an alle.
Werde es mal versuchen und berichten wie es ausschaut.

gruss Emil

EWeiss 15. Mär 2007 14:54

Re: Rückgabe von SpectrumDaten als PChar
 
Hier ist nochmal die Schleife!

Delphi-Quellcode:
  // Spektrum Analyser Daten glaetten
  for c := 0 to 1 do
  begin
    for i := 0 to 72 do
    begin
      h := 0.0;
      for j := 0 to 8 do
      begin
        h := (h + specdata[i * 8 + j + c * 576]);
        h := h / (1.0 * 255.0);

        h := Ln(h + 1.0) * 10.0;

        delta := (currenttime - lastcurrenttime) * 10.0;
        delta2 := (currenttime - lastcurrenttime) * 2.0;
        if (h > heights[c][i] - delta) then
          h := heights[c][i]
        else
          heights[c][i] := heights[c][i] - delta;

        if (h > heights2[c][i] - delta2) then
          h := heights2[c][i]
        else
          heights2[c][i] := heights2[c][i] - delta2;
      end;
    end;
  end;
Delphi-Quellcode:
specdata      : PByte;
Delphi-Quellcode:
specdata := This_Mod.spectrumData[0][0];
Jetzt verlangt er einen Array Typ für specdata.
ist aber in c nicht als array ausgelegt... Hmmmm ..........

Jetzt die frage!
Delphi-Quellcode:
specdata: array [1..576] of PByte
sollte dann richtig sein

Nur : Jetzt meldet er wieder
h := (h + specdata[i * 8 + j + c * 576]);
[Pascal Error] VisCDRom.pas(566): E2008 Incompatible types
Das nervt mit den konvertierungen


Nein Speicher habe ich nicht reserviert
Wie muss ich da vorgehen.. will verstehen nicht kopieren.

gruss Emil

OregonGhost 15. Mär 2007 16:46

Re: Rückgabe von SpectrumDaten als PChar
 
Zitat:

ist aber in c nicht als array ausgelegt... Hmmmm ..........
In C ist jeder Zeiger ein Array und umgekehrt.
unsigned char* ist potenziell (man weiß es nicht genau :D) also ein Char-Array. Gibt es nicht in Delphi sogar für sowas einen Typ PByteArray? Mir war da so...

EWeiss 15. Mär 2007 19:03

Re: Rückgabe von SpectrumDaten als PChar
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von OregonGhost
Zitat:

ist aber in c nicht als array ausgelegt... Hmmmm ..........
In C ist jeder Zeiger ein Array und umgekehrt.
unsigned char* ist potenziell (man weiß es nicht genau :D) also ein Char-Array. Gibt es nicht in Delphi sogar für sowas einen Typ PByteArray? Mir war da so...

Delphi-Quellcode:
Var
  specdata      : PByteArray;
Delphi-Quellcode:
h := (h + specdata[i * 8 + j + c * 576]);
wird aktzeptiert ohne konvertierung

Delphi-Quellcode:
specdata := PByteArray(This_Mod^.spectrumData[0][0]);
Wie muss ich nun den Speicher reservieren damit specdata nicht gleich 'NIL' ist ?

SetLength will nicht.
EDIT:
Auch mit der methode geht es nicht.
Bekomme wenn dann nur den zeiger auf die spectrum Daten
specdata := @This_Mod^.spectrumData;

Aber das bringt nichts da die Daten so nicht von der schleife ausgewertet werden können.
Noch jemand eine Idee ? Das es doch noch ans laufen kommt. :zwinker:

So sieht es aus aber leider ohne Funktion zur zeit.

gruss Emil

EWeiss 16. Mär 2007 07:11

Re: Rückgabe von SpectrumDaten als PChar
 
Hallo
Niemand eine andere Idee wie ich an die Daten herankommen kann?
im Spectrum array sind sie ja vorhanden das ist nicht das problem.

kann sie nur nicht der im thread angezeigten Schleife zuweisen.
Würd mich aber wundern das dies in Delphi nicht gehen soll.

gruss Emil

Muetze1 16. Mär 2007 08:13

Re: Rückgabe von SpectrumDaten als PChar
 
1. Speicher alloziieren/freigeben: AllocMem(), FreeMem()
2. Typ definieren:
Delphi-Quellcode:
Type
  TSpectrumData = Array[0..576] Of Byte;
  PSpectrumData = ^TSpectrumData;
Diesen Typ kannst du dann leicht für den Typecast nutzen und wenn du ihn alloziieren willst, reicht ein einfaches New() aus (bzw. Dispose() zum freigeben).

EWeiss 16. Mär 2007 08:19

Re: Rückgabe von SpectrumDaten als PChar
 
Zitat:

Zitat von Muetze1
1. Speicher alloziieren/freigeben: AllocMem(), FreeMem()
2. Typ definieren:
Delphi-Quellcode:
Type
  TSpectrumData = Array[0..576] Of Byte;
  PSpectrumData = ^TSpectrumData;
Diesen Typ kannst du dann leicht für den Typecast nutzen und wenn du ihn alloziieren willst, reicht ein einfaches New() aus (bzw. Dispose() zum freigeben).

ahh danke ... Kein schleimen ;) Du bist einer der besten
werd es mal versuchen umzusetzen ob die Schleife damit die Daten berechnen kann.

gruss Emil

EWeiss 16. Mär 2007 09:18

Re: Rückgabe von SpectrumDaten als PChar
 
Gibt mir auch keine Daten zurück :(
Ich denke das es auch das gleiche wie die Daten in Spectrum selber sind.

Delphi-Quellcode:
  // Spektrum Analyser Daten glaetten
  for c := 0 to 1 do
  begin
    for i := 0 to 72 do
    begin
      h := 0.0;
      for j := 0 to 8 do
      begin
        //h := (h + specdata[i * 8 + j + c * 576]);
        h := (h + ord(this_mod^.spectrumData[0][i * 8]) +
                  ord(this_mod^.spectrumData[0][j]) +
                  ord(this_mod^.spectrumData[0][c * 576]));
        h := h / (1.0 * 255.0);

        h := Ln(h + 1.0) * 10.0;

        delta := (currenttime - lastcurrenttime) * 10.0;
        delta2 := (currenttime - lastcurrenttime) * 2.0;
        if (h > heights[c][i] - delta) then
          h := heights[c][i]
        else
          heights[c][i] := heights[c][i] - delta;

        if (h > heights2[c][i] - delta2) then
          h := heights2[c][i]
        else
          heights2[c][i] := heights2[c][i] - delta2;
      end;
    end;
  end;
Die beiden zeilen verglichen müßte eigentlich den gleichen wert ergeben!
Delphi-Quellcode:
        //h := (h + specdata[i * 8 + j + c * 576]);
        h := (h + ord(this_mod^.spectrumData[0][i * 8]) +
                  ord(this_mod^.spectrumData[0][j]) +
                  ord(this_mod^.spectrumData[0][c * 576]));
Delphi-Quellcode:
heights[c][i] := heights[c][i] - delta;
Ist aber immer 0

Hänge mal ein Bild an wie specdata in C# ausschaut.
Anfangen kann ich damit nix aber es funktioniert... wie auch immer.

gruss Emil

EWeiss 16. Mär 2007 18:16

Re: Rückgabe von SpectrumDaten als PChar
 
Ich versuchs nochmal

Delphi-Quellcode:
TSpectrumData = Array[0..576] Of Byte;
 PSpectrumData = ^TSpectrumData;

specdata      : PSpectrumData;

specdata := @This_Mod^.spectrumData[0][0];
Delphi-Quellcode:
lastcurrenttime := currenttime;
currenttime := GetTickCount();

DrawSpectrum(This_mod);
Delphi-Quellcode:
procedure DrawSpectrum(This_Mod: PWinAMPVisModule);
var
  i, j, c          : integer;
  h, delta, delta2  : single;
  x1, x2, z1, z2, y : GLfloat;
  h2, h3, d12d     : GLfloat;
  hd               : GLfloat;

const
  overdraw : GLfloat = 0.01;
  d1       : GLfloat = 0.05;
   d2       : GLfloat = 0.01;

begin

  // Spektrum Analyser Daten glaetten
  for c := 0 to 1 do
  begin
    for i := 0 to 72 do
    begin
      h := 0.0;
      for j := 0 to 8 do h := (h + specData[i * 8 + j + c * 576]);
        h := h / (1.0 * 255.0);
        h := Ln(h + 1.0) * 10.0;

        delta := (currenttime - lastcurrenttime) * 10.0;
        delta2 := (currenttime - lastcurrenttime) * 2.0;
        if (h > heights[c][i] - delta) then
          heights[c][i] := h
        else
          heights[c][i] := heights[c][i] - delta;

        if (h > heights2[c][i] - delta2) then
          heights2[c][i] := h
        else
       >>>>>>> heights2[c][i] := heights2[c][i] - delta2;
    end;
  end;
  .............
end;
Soweit funktioniert jetzt alles zumindest werden die Daten richtig erkannt und
das Spectrum ausgegeben.

Nun zu meinen letzten problem!
Die Zeile '>>>>>>>' in der schleife wird nie ausgeführt da die bedingung aus irgendeinen grund nicht erfüllt wird.
Die auswirkung davon ist das die Peaks sich nicht von den Spectrumbalken lösen.

Jetzt weiss ich nicht liegt es am Timing ?
Habe es schon mit timeGetTime versucht oder wie oben mit GetTickCount!

Denke das die Schleife ansicht richtig übersetzt ist.
Code:
   for (c=0;c<=1;c++)
   {
      for ( i = 0; i < 72; i++ )
      {
         h=0.0f;
         for (j=0;j<8;j++) h+=specdata[i*8+j+c*576];
         h/=(1.0f*255.0f);

         h=(float)(log(h+1.0f))*10.0f;

         delta=(currenttime-lastcurrenttime)*10.0f;
         delta2=(currenttime-lastcurrenttime)*2.0f;
         //if (h>heights[c][i]-delta)
         //   heights[c][i]=h;
         //else
         //   heights[c][i]=heights[c][i]-delta;
                 
         if (h>heights2[c][i]-delta2)
            heights2[c][i]=h;
         else
            heights2[c][i]=heights2[c][i]-delta2;
               
      }
   }
Gruss Emil


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