![]() |
Rückgabe von SpectrumDaten als PChar
Ich begreifs irgendwo nicht.
Code:
im header GL_klasse definiert.
unsigned char *specdata;
anschließend nochmal in der Render Methode Main_klasse
Code:
dann werden (funktioniert in C) die Daten von
extern unsigned char *specdata;
Code:
als Char ausgegeben.. wäre in Delphi PChar
specdata = &this_mod->spectrumData[0][0];
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 |
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!
|
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 |
Re: Rückgabe von SpectrumDaten als PChar
In C endet ein string aber auch auf einem Null-Byte.
|
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...
|
Re: Rückgabe von SpectrumDaten als PChar
Zitat:
Also nicht durcheinanderbringen :) |
Re: Rückgabe von SpectrumDaten als PChar
Zitat:
Werde es mal versuchen und berichten wie es ausschaut. gruss Emil |
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:
Jetzt verlangt er einen Array Typ für specdata.
specdata := This_Mod.spectrumData[0][0];
ist aber in c nicht als array ausgelegt... Hmmmm .......... Jetzt die frage!
Delphi-Quellcode:
sollte dann richtig sein
specdata: array [1..576] of PByte
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 |
Re: Rückgabe von SpectrumDaten als PChar
Zitat:
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... |
Re: Rückgabe von SpectrumDaten als PChar
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
Var
specdata : PByteArray;
Delphi-Quellcode:
wird aktzeptiert ohne konvertierung
h := (h + specdata[i * 8 + j + c * 576]);
Delphi-Quellcode:
Wie muss ich nun den Speicher reservieren damit specdata nicht gleich 'NIL' ist ?
specdata := PByteArray(This_Mod^.spectrumData[0][0]);
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 20:21 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