[Linux] Problème de pointeur qui plante tout le Bureau
Bonjour,
en essayant de porter des programmes Bass écrit en Delphi pour Windows vers Lazarus pour Linux, je n'arrive pas à migrer cette procédure :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
var
a: DWORD;
d: PSingle;
begin
d := buffer;
a := 0;
while (a < (length div 4)) do
begin
d^ := d^ * Abs(Sin(rotpos));
Inc(d);
d^ := d^ * Abs(Cos(rotpos));
rotpos := fmod(rotpos + 0.00003, Pi);
Inc(d);
a := a + 2;
end;
end; |
rotpos c'est un Single, la fonction fmod la voilà :
Code:
1 2 3 4
| function fmod(a, b: Single): Single;
begin
Result := a - (b * Trunc(a / b));
end; |
et si ça peut vous inspirer, voilà une procédure un peu similaire :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| procedure Echo(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); stdcall;
var
a: DWORD;
d: PSingle;
l, r: Single;
begin
d := buffer;
a := 0;
while (a < (length div 4)) do
begin
l := d^ + (echbuf[echpos,1] / 2);
Inc(d);
r := d^ + (echbuf[echpos,0] / 2);
Dec(d);
{ Basic "bathroom" reverb }
d^ := l;
echbuf[echpos,0] := l;
Inc(d);
d^ := r;
echbuf[echpos,1] := r;
echpos := echpos + 1;
if (echpos = ECHBUFLEN) then
echpos := 0;
Inc(d);
a := a + 2;
end;
end; |
Tout ce que je gagne à l'exécution, c'est un plantage tellement fort que ça me fige tout le Bureau, je suis sauvé par Linux et son système de multi-écrans multi-consoles multi-users, ce qui me permet de me logger autrement pour aller tuer le process récalcitrant, ouf !
Je sais que je suis mauvais sur les pointeurs mais là, je touche le fond.
Alors grand merci à la bonne âme charitable qui me sortira de ce mauvais pas.