Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Seite 1 von 2  1 2      

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