AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rückgabe von SpectrumDaten als PChar

Ein Thema von EWeiss · begonnen am 15. Mär 2007 · letzter Beitrag vom 16. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 02:23
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 09:29
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!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 09:35
Hallo,

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


Heiko
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 09:36
In C endet ein string aber auch auf einem Null-Byte.
Markus Kinzler
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 09:40
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...
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#6

Re: Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 10:51
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
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

Re: Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 14:17
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 14:54
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;
specdata : PByte; 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! 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
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#9

Re: Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 16:46
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 ) also ein Char-Array. Gibt es nicht in Delphi sogar für sowas einen Typ PByteArray? Mir war da so...
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

Re: Rückgabe von SpectrumDaten als PChar

  Alt 15. Mär 2007, 19:03
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 ) 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;
h := (h + specdata[i * 8 + j + c * 576]); wird aktzeptiert ohne konvertierung

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.

So sieht es aus aber leider ohne Funktion zur zeit.

gruss Emil
Miniaturansicht angehängter Grafiken
test_156.jpg  
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 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