Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Pointer verschieben (https://www.delphipraxis.net/201065-pointer-verschieben.html)

EWeiss 19. Jun 2019 19:17


Pointer verschieben
 
Meine Ausgangsposition..

Delphi-Quellcode:
function TBassPlayer.BassChannelGetWavData: PSmallInt;
var
  fft: array [0 .. 511] of single;
begin

  FillChar(fft[0], sizeof(single) * 256, 0);
  if (gnAudioChannel <> 0) then
    BASS_ChannelGetData(gnAudioChannel, @fft[0], 1024);

  result := @fft[0];
end;
Delphi-Quellcode:
var
  pInt: PSmallInt;
begin

  pInt := BassPlayer.BassChannelWaveData;

  for x := 0 to (Width - 1) do
  begin
    if (x mod 8) <> 0 then
      continue;
   
  end;
  inc(pInt, 9);
end;
Ich hole die WaveDaten über BassChannelWaveData
Danach zeichne ich das Bitmap auf dem Screen

Anschließend möchte ich den Pointer um den Faktor 9 verschieben.
Mein Problem! Es wird aber jeweils immer nur der erste Ausschlag visualisiert das verschieben des Pointer funktioniert irgendwie nicht richtig.
Was mach ich falsch?
Es müsste sich eigentlich die Y Position des nächsten Balken verändern abhängig vom verschobenen Pointer und den Inhalt der Wave Daten an dieser Position.

Wie man sehen kann werden alle Bars korrekt gezeichnet Blau unten aber nur die erste wird visualisiert.
PS:
Auch wenn ich den Pointer entferne also den wert von SmallInt verschiebe ändert es nichts.
Delphi-Quellcode:
inc(pInt^, 9);


gruss

HintByError 19. Jun 2019 20:06

AW: Pointer verschieben
 
Zitat:

Zitat von EWeiss (Beitrag 1435051)
Meine Ausgangsposition..

Delphi-Quellcode:
function TBassPlayer.BassChannelGetWavData: PSmallInt;
var
  fft: array [0 .. 511] of single;
begin

  FillChar(fft[0], sizeof(single) * 256, 0);
  if (gnAudioChannel <> 0) then
    BASS_ChannelGetData(gnAudioChannel, @fft[0], 1024);

  result := @fft[0];
end;

Wenn die Methode BassChannelGetWavData beendet wird, dann wird auf dem Stack "fft" freigegeben und das Ergebnis mit der Adresse am Anfang der Variable wird ungültig. Der Ergebniszeiger zeigt auf einen Bereich, der nicht mehr der Variablen zugeordnet ist. Die Prozedur sollte "fft" als Ergebnis zurückgeben. Etwa wie folgt
Delphi-Quellcode:
Tfft = array[0..511] of Single;

function TBassPlayer.BassChannelGetWavData: Tfft;

EWeiss 19. Jun 2019 20:20

AW: Pointer verschieben
 
Danke..

Ja so mache ich das normaler weise auch..
Delphi-Quellcode:
function TBassPlayer.BassChannelGetWaveData: TWaveData;
begin

  if gnAudioPause = FALSE then
  begin
    if gnAudioChannel <> 0 then
      BASS_ChannelGetData(gnAudioChannel, @result[0], 1024);
  end;
end;
bsp.
Wenn ich TWaveData zurückgebe wie soll ich dann den Pointer inkrementieren?

Delphi-Quellcode:
var
  pInt: array [0..511] of TWaveData;
 
begin

  y := Height - ((( pInt[0] div 2) + $7FFF) div YFactor);
end;
EDIT:
Ok ich habs..

Delphi-Quellcode:
  pInt: TWaveData;
  y := Height - ((( pInt[x] div 2) + $7FFF) div YFactor);
Das inkrementieren kann ich mir dann sparen da ich direkt mit x auf die gewünschte Position springe.
Danke für den Tip manchmal hat man nur ein Brett vorm Kopf.

So ist die Lösung!
Delphi-Quellcode:
    pInt := BassPlayer.BassChannelGetWaveData;

    for x := 0 to (Width - 1) do
    begin
      if (x mod 8) <> 0 then
        continue;

      y := Height - ((( pInt[x] div 2) + $7FFF) div YFactor);
Werde pInt noch nach WaveData umbenennen.. ;)
gruss

Zacherl 20. Jun 2019 20:05

AW: Pointer verschieben
 
Hey, konnte auf deine PM btw. nicht antworten, weil dein Postfach voll ist oder du PMs deaktiviert hast :)

EWeiss 20. Jun 2019 20:09

AW: Pointer verschieben
 
Zitat:

Zitat von Zacherl (Beitrag 1435114)
Hey, konnte auf deine PM btw. nicht antworten, weil dein Postfach voll ist oder du PMs deaktiviert hast :)

sorry sollte jetzt gehen habe da letztens rumgepfuscht.

PS:
Auf der anderen Seite kein Problem habe die Zeichnungsroutine verworfen..
Verwende jetzt meine alte neu geschrieben die ein Bitmap entsprechend der Wave Daten weich glättet.. (Faded)
Trotzdem Danke für die Rückmeldung.

Habe zwar hier noch ein kleines Problem (Lösung Gleitkomma Prüfung ausschalten).
Nicht das wahre aber bis ich den Fehler analysiert habe geht das so.

gruss


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