Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

[Linux] Problème de pointeur qui plante tout le Bureau [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 757
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 757
    Points : 12 456
    Points
    12 456
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 340
    Points : 3 334
    Points
    3 334
    Billets dans le blog
    2
    Par défaut
    Salut à mon avis, il suffit juste transtyper ton "buffer : pointer" à mon avis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      d := PSingle(buffer);
    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 757
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 757
    Points : 12 456
    Points
    12 456
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      d := PSingle(buffer);
    Citation Envoyé par Lazaus compilo
    DTMain.pas(71,21) Error: Error in type definition
    Désolé,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 340
    Points : 3 334
    Points
    3 334
    Billets dans le blog
    2
    Par défaut
    Peux tu donner les liens qui mènent vers ces exemples Delphi ?

    Comment est appelée cette procédure ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 340
    Points : 3 334
    Points
    3 334
    Billets dans le blog
    2
    Par défaut
    Un truc que je pige pas c'est {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};

    qui normalement si je ne dis pas de bêtises, lorsque tu exportes et importes vers et depuis une "DLL/so"
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 627
    Points : 4 069
    Points
    4 069
    Par défaut
    hello Jipété,
    Va faire un tour dans cette discussion de 2009 où fredvs a semble-t-il réussi à faire ce que tu veux faire :

    Hi folks, i get it

    Of course i work now on Linux then....

    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user:Pointer); stdcall;

    must become

    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user:Pointer); cdecl;

    And then all the DSP effect works more than charms.
    fredvs vient parfois sur le forum principal de Lazarus. C'est le créateur de uos.
    Ami calmant, J.P (sans T)
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 757
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 757
    Points : 12 456
    Points
    12 456
    Par défaut
    Salut les aminches,

    Citation Envoyé par BeanzMaster Voir le message
    Peux-tu donner les liens qui mènent vers ces exemples Delphi ?
    Ben c'est le projet DSPtest dans le dossier Delphi de Bass (si tu l'as encore -- sinon demande et je posterai)

    Citation Envoyé par BeanzMaster Voir le message
    Comment est appelée cette procédure ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.CheckBox1Click(Sender: TObject);
    begin
      if (CheckBox1.Checked) then
      begin
        rotpos := 0.7853981;
        rotdsp := BASS_ChannelSetDSP(chan, @Rotate, nil, 2);
      end
      else
        BASS_ChannelRemoveDSP(chan, rotdsp);
    end;
    Citation Envoyé par BeanzMaster Voir le message
    Un truc que je pige pas c'est {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};

    qui normalement si je ne dis pas de bêtises, lorsque tu exportes et importes vers et depuis une "DLL/so"
    C'est ce que j'utilise partout pour essayer de conserver le plus possible les sources proches de l'origine, et dans l'immense majorité des cas, ça fonctionne tip-top.


    Citation Envoyé par jurassic pork Voir le message
    hello Jipété,
    Va faire un tour dans cette discussion de 2009 où fredvs a semble-t-il réussi à faire ce que tu veux faire :
    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; userointer); stdcall;

    must become

    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; userointer); cdecl;

    And then all the DSP effect works more than charms.
    Sauf que c'est bien ce que j'ai mis en place et qui ne fonctionne pas...
    Par contre les deux autres options du son de ce projet (echo et flanger) fonctionnent parfaitement bien, donc le problème est bien dans la proc rotate...

    Citation Envoyé par jurassic pork Voir le message
    fredvs vient parfois sur le forum principal de Lazarus. C'est le créateur de uos.
    Ami calmant, J.P (sans T)
    Ah, uos, j'avais commencé à regarder, j'y ai passé un temps dément et ma collection de SIGSEGV et autres AV a considérablement augmenté,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 340
    Points : 3 334
    Points
    3 334
    Billets dans le blog
    2
    Par défaut
    Salut j'ai téléchargé c'est bon

    pour ma part je blinderai le code

    au lieu d'appeler la méthode comme tu le fais essayes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     if (CheckBox1.Checked) then
      begin
        rotpos := 0.7853981;
        rotdsp := BASS_ChannelSetDSP(chan, @Rotate, nil, 2);
        if RotoDsp = 0 then ShowMessage('Code d''errreur : ' + Inttostr(BASS_ErrorCOde));
      end
      else
        if RotDsp <> 0 then BASS_ChannelRemoveDSP(chan, rotdsp);
    end;
    ensuite est ce que le plantage intervient uniquement juste quand tu as ce seul effet d'activé ? est-ce qu'un ou les autres étaient activés en même temps ?
    Autre question bête mais le fichier son que tu veux jouer est-il stéréo ou mono, 8 ou 16 bits ?, si il est mono, ou en 8bits, cet effet cause peut-être des problèmes en dehors des sons stéréo 16 bits. bref

    Si non essaye de forcer la configuration du DSP avec cette commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BASS_SetConfig( BASS_CONFIG_FLOATDSP, True);
    A part ça je ne vois pas ce qui clocherai, car la procedure Rotate est correcte

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 757
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 757
    Points : 12 456
    Points
    12 456
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    au lieu d'appeler la méthode comme tu le fais essayes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     if (CheckBox1.Checked) then
      begin
        rotpos := 0.7853981;
        rotdsp := BASS_ChannelSetDSP(chan, @Rotate, nil, 2);
        if RotoDsp = 0 then ShowMessage('Code d''errreur : ' + Inttostr(BASS_ErrorCOde));
      end
      else
        if RotDsp <> 0 then BASS_ChannelRemoveDSP(chan, rotdsp);
    end;
    Après corrections des petites erreurs de saisie (if rotdsp = 0 then ShowMessage('Code d''erreur : ' + Inttostr(BASS_ErrorGetCode));), je ne vois pas ce message.

    Citation Envoyé par BeanzMaster Voir le message
    ensuite est ce que le plantage intervient uniquement juste quand tu as ce seul effet d'activé ? est-ce qu'un ou les autres étaient activés en même temps ?
    Autre question bête mais le fichier son que tu veux jouer est-il stéréo ou mono, 8 ou 16 bits ?
    Non, il intervient également si avant de l'activer j'ai l'echo (pas testé l'autre) coché.
    Non, pas nécessairement.
    Stéréo 32 bits flottant dixit Audacity, sans perdre de vue que les effets Echo et Flanger fonctionnent, et que le Rotate doit fonctionner aussi sous Windows, sinon ça ne serait pas publié, non ?

    Citation Envoyé par BeanzMaster Voir le message
    Si non essaye de forcer la configuration du DSP avec cette commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BASS_SetConfig( BASS_CONFIG_FLOATDSP, True);
    Bien tenté mais déjà présente dans FormCreate.

    D'autres idées ?

    Moi j'en avais une, ça serait de récrire la procédure sans pointeur PSingle mais plutôt avec une variable Single (jamais compris à quoi servaient ces cochonneries de pointeurs, si ce n'est à générer des SIGSEGV).
    Donc je tente ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
    var
      a: DWORD;
    //  d: PSingle;
      d: Single;       
    begin
      d := single(buffer^);
     
      a := 0;
      while (a < (length div 4)) do
      begin
    ////    d^ := d^ * Abs(Sin(rotpos)); 
        d := d * Abs(Sin(rotpos)); 
    ////    Inc(d);                
        d := d + 1;
    ////    d^ := d^ * Abs(Cos(rotpos));
        d := d * Abs(Cos(rotpos));
     
        rotpos := fmod(rotpos + 0.00003, Pi);
     
    ////    Inc(d);
        d := d + 1;
        a := a + 2;
      end;
    end;
    et ça plante tout autant avec un SIGABRT dès le clic sur la case à cocher "Rotate", plus le fait réjouissant qu'il est impossible de faire du pas-à-pas, dès l'instruction a := 0; hop !, tout le Bureau planté...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    3 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 3 417
    Points : 10 049
    Points
    10 049
    Billets dans le blog
    6
    Par défaut
    Pour éviter l'arithmétique des pointeurs (Dec/Inc), on peut pê tenter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
    var
      a: DWORD;
      aos: array of Single absolute buffer; // ou array[0..MaxWord] pour peu que Length < MaxWord !
      i: integer;
     
    begin
      i:=0;
      while i < Pred(Length) do
      begin
        s := aos[i];
        //...
        Inc(i);
      end;
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  11. #11
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 340
    Points : 3 334
    Points
    3 334
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    par contre ton dernier code ne pourras pas fonctionner,i il faut que tu incrémente ton pointer et non ta variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var
       idx, offset : DWord;
     
    begin
      offset : = 0;
      idx := 0;
      d := single((Buffer + offset)^); 
     
      while (a < (length div 4)) do
      begin
        d := d * Abs(Sin(rotpos)); 
        inc(idx); // par contre j'ai un doute si il faut multiplier par sizeof(single). Je ne me souviens plus, mais il me semble que oui
        // Inc(offset);
        offset := idx * Sizeof(Single); // * 4
        single((Buffer + offset)^) := d;


    C'est quand même assez bizarre que Echo et flanger fonctionne et pas rotate As tu essayé dans un VM avec Windows ??? Si non a part une limitation de ta carte son ou du driver audio de Linux, je ne vois pas

    EDIT : Bien vue Tourlourou
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 757
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 757
    Points : 12 456
    Points
    12 456
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Pour éviter l'arithmétique des pointeurs (Dec/Inc), on peut pê tenter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        s := aos[i];
        //...
        Inc(i);
    Sans doute, sans doute, mais je ne sais absolument pas par quoi remplacer ton énigmatique //..., hélas…

    Citation Envoyé par BeanzMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var
       idx, offset : DWord;
     
    begin
      offset : = 0;
      idx := 0;
      d := single((Buffer + offset)^); 
     
      while (a < (length div 4)) do
      begin
        d := d * Abs(Sin(rotpos)); 
        inc(idx); // par contre j'ai un doute si il faut multiplier par sizeof(single). Je ne me souviens plus, mais il me semble que oui
        // Inc(offset);
        offset := idx * Sizeof(Single); // * 4
        single((Buffer + offset)^) := d;
    Je verrai ton code demain, là j'en ai archi-marre !

    Citation Envoyé par BeanzMaster Voir le message
    As-tu essayé dans un VM avec Windows ??? Si non à part une limitation de ta carte son ou du driver audio de Linux, je ne vois pas
    Nan, je voudrais juste que ça fonctionne sous Linux (et j'ai déjà eu des déboires avec le son dans les VM, pas aussi simple que ça).
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    3 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 3 417
    Points : 10 049
    Points
    10 049
    Billets dans le blog
    6
    Par défaut
    à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
    var
      a: DWORD;
      aos: array of Single absolute buffer; // ou array[0..MaxWord] pour peu que Length < MaxWord !
      i: integer;
     
    begin
     
      i:=0;
     
      while i < Pred( Length div SizeOf( Single) ) do
      begin
     
        aos[i] := aos[i] * Abs(Sin(rotpos)); 
     
        aos[i+1] := aos[i+1] * Abs(Cos(rotpos));
     
        rotpos := fmod(rotpos + 0.00003, Pi);
     
        Inc(i, 2);
     
      end;
     
    end;
    Mais je ne comprends ni où ni pourquoi ton code original plante !
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 757
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 757
    Points : 12 456
    Points
    12 456
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    à tester :
    Absolutly perfect !
    you're a king,

    Citation Envoyé par tourlourou Voir le message
    Mais je ne comprends ni où ni pourquoi ton code original plante !
    Ben moi non plus, et c'est notre grand drame,
    D'autant plus qu'une proc de callback ça a l'air impossible à exécuter en pas-à-pas.

    En tout cas, ton petit bout de code est parfaitement lisible et compréhensible, totalement à l'opposé de ces prises de tête avec les pointeurs,


    @Jérôme :
    Citation Envoyé par Jipété Voir le message
    Je verrai ton code demain, là j'en ai archi-marre !
    Le tien aussi fonctionne ! Mais j'ai l'impression qu'il en manque un bout. Regarde ces deux lignes d'Yves :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        aos[i]   := aos[i]   * Abs(Sin(rotpos));
        aos[i+1] := aos[i+1] * Abs(Cos(rotpos));
    Toi, tu as zappé le Cos(rotpos), et à l'oreille c'est très difficile d'entendre la différence entre les deux progs…


    Grand merci pour le coup de pouce, je clique mais je reste ouvert à toute proposition pour tester des adaptations de la version d'origine.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  15. #15
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 340
    Points : 3 334
    Points
    3 334
    Billets dans le blog
    2
    Par défaut
    Salut les amis

    Citation Envoyé par tourlourou Voir le message
    Mais je ne comprends ni où ni pourquoi ton code original plante !
    Idem je ne comprend pas.

    Citation Envoyé par Jipété Voir le message
    Absolutly perfect !
    you're a king,

    Ben moi non plus, et c'est notre grand drame,
    D'autant plus qu'une proc de callback ça a l'air impossible à exécuter en pas-à-pas.

    En tout cas, ton petit bout de code est parfaitement lisible et compréhensible, totalement à l'opposé de ces prises de tête avec les pointeurs,
    Bien vrai l'astuce avec ABSOLUTE de tourlourou est à garder dans un coin de sa tête, surtout lorsque l'on a affaire à des variables de type Pointer et qu'il faut transtyper

    Citation Envoyé par Jipété Voir le message
    @Jérôme :
    Le tien aussi fonctionne ! Mais j'ai l'impression qu'il en manque un bout. Regarde ces deux lignes d'Yves :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        aos[i]   := aos[i]   * Abs(Sin(rotpos));
        aos[i+1] := aos[i+1] * Abs(Cos(rotpos));
    Toi, tu as zappé le Cos(rotpos), et à l'oreille c'est très difficile d'entendre la différence entre les deux progs…

    Grand merci pour le coup de pouce, je clique mais je reste ouvert à toute proposition pour tester des adaptations de la version d'origine.
    Oui effectivement je n'ai mis que le début du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
    var
       a, idx, offset : DWord;
     
    begin
      offset : = 0;
      idx := 0;
      while (a < (length div 4)) do
      begin
        d := single((Buffer + offset)^); 
        d := d * Abs(Sin(rotpos)); 
        single((Buffer + offset)^) := d;
        inc(idx); 
        offset := idx * Sizeof(Single); // * 4
        d := single((Buffer + offset)^);
        d := d *   * Abs(Cos(rotpos));
        single((Buffer + offset)^) := d;
        rotpos := fmod(rotpos + 0.00003, Pi); 
        inc(idx); 
        offset := idx * Sizeof(Single); // * 4    
        a := a + 2;
      end;
    end;
    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  16. #16
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 971
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 971
    Points : 4 914
    Points
    4 914
    Par défaut
    salut

    et si tu fait comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
    var
      a: DWORD;
      d: PSingle;
      l,r:single;
    begin
      d := buffer;
      a := 0;
      while (a < (length div 4)) do
      begin
        r:=d^;
        d^:=r* Abs(sin(rotpos));
        inc(d);
        l:=d^;
        d^ := l * Abs(Cos(rotpos));
        rotpos := fmod(rotpos + 0.00003, Pi);
        Inc(d);
        a := a + 2;
      end;
    end;
    est que cela plante ?
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 757
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 757
    Points : 12 456
    Points
    12 456
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Bien vrai l'astuce avec ABSOLUTE de tourlourou est à garder dans un coin de sa tête, surtout lorsque l'on a affaire à des variables de type Pointer et qu'il faut transtyper
    Et ça sert à quoi ? Concrètement, ça fait quoi ?

    Citation Envoyé par BeanzMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        d := d *   * Abs(Cos(rotpos));
    T'as dû oublier un truc sur cette ligne, car en l'état elle ne compile pas, et si je la ramène à d := d * Abs(Cos(rotpos));, ça compile mais ton snippet n'a pas d'action sur le son joué.

    Citation Envoyé par anapurna Voir le message
    est-ce que cela plante ?
    Non, ça fonctionne aussi bien que le code d'Yves.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  18. #18
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    3 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 3 417
    Points : 10 049
    Points
    10 049
    Billets dans le blog
    6
    Par défaut
    Et ça sert à quoi ? Concrètement, ça fait quoi ?
    absolute indique qu'une variable pointe sur le même espace mémoire qu'une autre, un peu comme la partie variable d'un record qui peut être vue de plusieurs manières, ce qui revient à un transtypage permanent et réciproque.
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  19. #19
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 340
    Points : 3 334
    Points
    3 334
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Et ça sert à quoi ? Concrètement, ça fait quoi ?
    Définition de absolute

    En gros, dans le cas présent cela prend l'adresse du pointer et le "force" à être de type Array of Single

    Autre exemple dans mes méthodes de trie j'utilise une fonction (un peu comme la méthode de "Callback" ici ) elle se présente sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function CompareValue(Const elem1, elem2) : Integer; virtual;
    Comme tu le vois elem1 et elem2 non pas de type définie

    voila maintenant comment cette fonction est codée dans mes sous-classes en fonction du type que je veux comparer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    {%region%=====[ TBZDoubleList ]================================================}
     
    function TBZDoubleList.CompareValue(Const elem1, elem2) : Integer;
    var
      i1 : Double absolute elem1;
      i2 : Double absolute elem2;
    begin
     
      if i1 = i2 then Result:=0
      else if i1 < i2 then Result:=-1
      else Result:=1;
    end;
     
    {%endregion%}
     
    {%region%=====[ TBZSingleList ]================================================}
     
    function TBZSingleList.CompareValue(Const elem1, elem2) : Integer;
    var
      i1 : Single absolute elem1;
      i2 : Single absolute elem2;
    begin
     
      if i1 = i2 then Result:=0
      else if i1 < i2 then Result:=-1
      else Result:=1;
    end;
     
    {%endregion%}
     
    {%region%=====[ TBZByteList ]==================================================}
     
    function TBZByteList.CompareValue(Const elem1, elem2) : Integer;
    var
      i1 : Byte absolute elem1;
      i2 : Byte absolute elem2;
    begin
     
      if i1 = i2 then Result:=0
      else if i1 < i2 then Result:=-1
      else Result:=1;
    end;
     
    {%endregion%}
     
    {%region%=====[ TBZIntegerList ]===============================================}
     
    function TBZIntegerList.CompareValue(Const elem1, elem2) : Integer;
    var
      i1 : integer absolute elem1;
      i2 : integer absolute elem2;
    begin
     
      if i1 = i2 then Result:=0
      else if i1 < i2 then Result:=-1
      else Result:=1;
    end;
     
    {%endregion%}
    Comme tu le vois elles sont toute similaire, sauf la déclaration des variables.

    Absolute peut-être très pratique dans certain cas. Autre exemple convertir des Double en Int64 et vice-versa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function CastDoubleToInt64(value : double) : int64;
    var
      i : int64 absolute Value;
    begin
      result := i;
    end;
     
    function CastInt64ToDouble(value : Int64) : Double;
    var
      d : double absolute Value;
    begin
      result := d;
    end;
    Bref, faut faire attention quand tu utilises Absolute, mais cela peut-être très pratique

    Citation Envoyé par Jipété Voir le message
    T'as dû oublier un truc sur cette ligne, car en l'état elle ne compile pas, et si je la ramène à d := d * Abs(Cos(rotpos));, ça compile mais ton snippet n'a pas d'action sur le son joué.
    Oups un * en trop et oui c'est possible que j'ai oublié quelques chose, mais je ne crois pas.

    Le code d'Anapurna fonctionne, il semblerai que ce soit une erreur dans la lecture du "pointer", plus de place dans la pile (Stack) pour gérer cette fonction ou dans la tas (heap) ??? Serait-ce un mauvais alignement des données ? bizarre car Anapurna utilise 2 variables locales l et r en plus juste pour lire les données Vu que l'on ne peut pas déboguer ce genre de méthode dur de donner une explication.
    Si AndNotOr passe par là, il aura peut-être une réponse à proposer sur ce dysfonctionnement. Ou sinon faudrait poser la question chez les anglois, histoire de voir ce qu'ils en pensent.

    Bonne fin de soirée
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  20. #20
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 971
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 971
    Points : 4 914
    Points
    4 914
    Par défaut
    salut

    met avis que c'est un trans-typage qui ne correspond pas au type voulue lors du calcul ... ce qui résulte à un débordement
    il suffit de voir mon code qui passe par une variable intermédiaire et qui fonctionne correctement
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Problème de fonction qui plante
    Par Airox- dans le forum C
    Réponses: 3
    Dernier message: 18/12/2016, 13h21
  2. Réponses: 2
    Dernier message: 01/06/2016, 15h07
  3. Flash qui plante tout le temps !
    Par ossmoz dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 05/04/2013, 20h42
  4. [Problème] Requête ping qui plante !
    Par magicbisous-nours dans le forum VB.NET
    Réponses: 1
    Dernier message: 14/12/2007, 18h04
  5. [Novice] Problème avec Eclipse 3.0.x qui plante
    Par esolarc dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2005, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo