![]() |
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 |
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 |
Re: Rückgabe von SpectrumDaten als PChar
1. Speicher alloziieren/freigeben: AllocMem(), FreeMem()
2. Typ definieren:
Delphi-Quellcode:
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).
Type
TSpectrumData = Array[0..576] Of Byte; PSpectrumData = ^TSpectrumData; |
Re: Rückgabe von SpectrumDaten als PChar
Zitat:
werd es mal versuchen umzusetzen ob die Schleife damit die Daten berechnen kann. gruss Emil |
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:
Die beiden zeilen verglichen müßte eigentlich den gleichen wert ergeben!
// 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;
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:
Ist aber immer 0
heights[c][i] := heights[c][i] - delta;
Hänge mal ein Bild an wie specdata in C# ausschaut. Anfangen kann ich damit nix aber es funktioniert... wie auch immer. gruss Emil |
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:
Soweit funktioniert jetzt alles zumindest werden die Daten richtig erkannt und
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; 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:
Gruss Emil
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; } } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 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-2025 by Thomas Breitkreuz