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. #21
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 745
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 745
    Points : 12 453
    Points
    12 453
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    [...] 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
    Et c'est bien pour vous inspirer que dans mon post d'origine j'ai inclus le code "echo", qui s'appuie sur l et r et qui fonctionne très bien. Anapurna a su en tirer des leçons, moi j'avais tenté mais me suis fourvoyé dans les SIGSEGV…

    Quant à en causer aux anglois, je leur prends suffisamment la tête avec la découverte des périphériques de son sous Linux qui fonctionne un peu à la one again que ça va comme ça, je vais pas leur en remettre une couche,

    Merci pour les explications sur absolute, qui me terrorisent : pouvoir changer le type d'une variable est bien la chose qui me fait trembler, sans compter ce que décrivait Yves (
    Citation Envoyé par tourlourou Voir le message
    absolute indique qu'une variable pointe sur le même espace mémoire qu'une autre
    ) et que je traduis par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A := 5;
    B := 10;
    ShowMessage(IntToStr(A)); // va afficher 10
    car A en mode absolute pointera sur le même espace mémoire que celui pointé par B… Au secours ! Heureusement pour moi que je ne sais pas l'écrire,
    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
      0  0

  2. #22
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 331
    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 331
    Points : 3 308
    Points
    3 308
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par anapurna Voir le message
    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
    Salut, comment ça dans les 3 exemples, l'original, celui de tourlourou et le tien se sont tous des Single donc "un trans-typage qui ne correspond pas au type voulue lors du calcul " c'est "sioux" tu aurais mis des "double" dans ton exemple, là je pourrais comprendre. "ce qui résulte à un débordement " ??? avec les single. Mais ce n'est pas le cas, si il y avait débordement cela ce produirait dans les 3 méthodes et puis l'original fonctionne avec Delphi donc si il y a un débordement cela serait comment dire, désespérant qu'il ne se produise pas sous Delphi et qu'il se produise sous Lazarus. De plus un débordement devrait-être intercepter par le débogueur. non ?
    Faudrait vérifier en compilant avec les options de débogage "Débordement" et "Pile".

    Le fait que tu as utilisé des variables intermédiaires, me fais plus penser à un non alignement des données en mémoire ou simplement que l'allocation soit fragmenté une partie en pile, et une dans les registres ou un truc dans le genre. Ce qui pourrais engendrer ce genre d'erreur surtout si la fonction interne de Bass utilise les SIMD, mais vu que l'on n'a pas le code, difficile de vraiment l'affirmer. Dans tous les cas c'est vraiment bizarre et incompréhensible.
    J'ai eu justement ce genre de plantage lorsque j'ai développé ma bibliothèque sur les vecteurs avec les instructions SSE, un mauvais alignement des données et tout se plantait sans aucun message d'erreur, comme Jipete. Bref le principal c'est que vos 2 méthodes fonctionnent

    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
      1  0

  3. #23
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 969
    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 969
    Points : 4 908
    Points
    4 908
    Par défaut
    salut

    effectivement nos trois demonstration fonctionne correctement
    mais on ne fait pas la multiplication direct avec les pointeur genre

    on fait

    dans ton cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    d := single((Buffer + offset)^);
     
     ....
    single((Buffer + offset)^) := d;
    tu réaffecte la valeur au pointeur à la position voulue tout comme moi
    le buffer est bien une sorte de tableau contenant une adresse mémoire pointant sur une valeur
    le fait de multiplier la valeur pointer engendre je suppose un débordement ou une erreur d’interprétation

    Peut etre qu'en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d^ := Single(d^)*z
    cela marcherais tout aussi bien
    j’avoue que j'utilise très peut les pointeur de cette manière là et encore moins depuis que je fait de l'objet
    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
      0  0

  4. #24
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 331
    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 331
    Points : 3 308
    Points
    3 308
    Billets dans le blog
    2
    Par défaut
    Oui effectivement, mais cela reste bien chelou dans ton 3ème exemple je ne vois pas l’intérêt de transtyper un "PSingle" mais bon on ne sait jamais. Tourlourou dans son exemple, fait directement la multiplication et cela fonctionne

    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));
    Bon à cause de l'"Absolute" ?

    Bref, vraiment bizarre et contraignant de ne pas comprendre de quoi cela vient
    • "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
      0  0

  5. #25
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    3 416
    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 416
    Points : 10 041
    Points
    10 041
    Billets dans le blog
    6
    Par défaut
    il faudrait comparer les codes assembleur générés : qqch doit partir en vrille dans un cas...
    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 !
      0  0

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 745
    Points : 12 453
    Points
    12 453
    Par défaut
    Yep !

    Citation Envoyé par tourlourou Voir le message
    il faudrait comparer les codes assembleur générés : qqch doit partir en vrille dans un cas...
    J'avoue humblement que ça me dépasse, et que je ne saurai pas les lire.

    Ce que je peux envisager, c'est de modifier un peu le prog en lui mettant 3 checkboxes au lieu d'une seule, et d'écrire 3 procs de callback :
    1. l'une serait strictement le code d'origine ;
    2. une autre serait la tienne, Yves ;
    3. et une troisième celle d'Anapurna, puisque le code de Jérôme ne fait rien.

    Ça vous intéresse, un binaire Linux ?

    Ou bien je peux générer 3 binaires, chacun avec une version du code. Vous n'avez qu'à me dire ce qui serait le mieux.
    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
      1  0

  7. #27
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 331
    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 331
    Points : 3 308
    Points
    3 308
    Billets dans le blog
    2
    Par défaut
    Hello

    pour générer les informations en assembleur, il faut te diriger vers les options personnalisées du projet et ajouter :
    -al
    -ar
    -at


    Tu devrais voir un nouveau fichier dans ton dossier de sortie avec l'extension ".s" c'est un fichier texte avec le code asm généré par le compilo + quelques informations

    Donnes nous ce fichier pour les 3 cas cela devrait suffire

    Une autre chose dans débogage faudrait cocher les 6 checkbox de "vérification et assertions"
    • "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
      1  0

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 745
    Points : 12 453
    Points
    12 453
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Tu devrais voir un nouveau fichier dans ton dossier de sortie avec l'extension ".s"
    3 ! Un pour la librairie Bass, un pour le projet et un pour la fiche, donc 9 fichiers dans le zip joint : points_s.zip

    Et une récapitulation de la proc de callback :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
    var
      a: DWORD;
      dj: Single;
      d: PSingle;
      l,r:single;
      aos: array of Single absolute buffer; // ou array[0..MaxWord] pour peu que Length < MaxWord !
      i: integer;
      idx, offset : DWord;
    begin
    //yves
    {  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;
    }
     
    //jérome
    {  offset := 0;
      idx := 0;
      while (a < (length div 4)) do
      begin
        dj := single((Buffer + offset)^);
        dj := dj * Abs(Sin(rotpos));
        single((Buffer + offset)^) := dj;
        inc(idx);
        offset := idx * Sizeof(Single); // * 4
        dj := single((Buffer + offset)^);
        dj := dj * Abs(Cos(rotpos));
        single((Buffer + offset)^) := dj;
        rotpos := fmod(rotpos + 0.00003, Pi);
        inc(idx);
        offset := idx * Sizeof(Single); // * 4
        a := a + 2;
      end;
    }
     
    {// anapurna
      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;
    }
     
    // original
      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;
    Bon courage (j'ai jeté un œil aux points "s", j'ai strictement rien capté.)
    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
      0  0

  9. #29
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 331
    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 331
    Points : 3 308
    Points
    3 308
    Billets dans le blog
    2
    Par défaut
    Yop je viens de jeter un oeil à ces fameux fichier .S J'ai comparé l'original et avec celui d'anapurna qui est le plus proche niveau code

    respectivement pour l'original et anapurna, aux lignes (j'ai mis en gras ce qu'il faut regarder) : 1034 et 1036 nous avons


    # Var d located at ebp-12 == Adresse de la variable d = Buffer;

    .stabn 68,0,124,.Ll5 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER
    et
    .stabn 68,0,109,.Ll5 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER

    puis aux ligne 1036 et 1038 nous avons

    # [124] d := buffer;
    movl 16(%ebp),%eax
    movl %eax,-12(%ebp)
    # Register eax released
    .stabn 68,0,126,.Ll6 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER


    et

    # [109] d := buffer;
    movl 16(%ebp),%eax
    movl %eax,-12(%ebp)
    # Register eax released
    .stabn 68,0,110,.Ll6 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER


    Déja des le départ il y a un décalage de 16 bits ????, octets ??? (je ne sais plus à quoi cela correspond en vrai, faut que j'aille fouiller dans une de mes discussions chez les anglois). Pourquoi cette différences ? l'ajout des variables L et R, je ne penses pas le décalage est de 16 les single sont des 32 bits
    Ce décalage de 16 me laisse sous entendre mauvais alignement, mais pourquoi le compilo fait ça ??????

    A partir de la ligne 1052 et 1055 nous avons

    # [129] d^ := d^ * Abs(Sin(rotpos)); // en pas-..-pas plante tout le Bureau
    flds U_DTMAIN_ROTPOS
    fsin
    fabs
    # Register eax allocated
    movl -12(%ebp),%eax
    fmuls (%eax)
    # Register eax released
    # Register eax allocated
    movl -12(%ebp),%eax
    fstps (%eax)

    # Register eax released
    .stabn 68,0,130,.Ll9 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER


    et

    # [113] r:=d^;
    movl -12(%ebp),%eax
    movl (%eax),%eax
    movl %eax,-20(%ebp)
    # Register eax released
    .stabn 68,0,114,.Ll9 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER
    .Ll9:
    # [114] d^:=r* Abs(sin(rotpos));
    flds U_DTMAIN_ROTPOS
    fsin
    fabs
    fmuls -20(%ebp)
    # Register eax allocated
    movl -12(%ebp),%eax
    fstps (%eax)

    # Register eax released
    .stabn 68,0,115,.Ll10 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER


    Dans l'original le registre EAX est libéré puis ré-allouer il correspond à "D ebp-12 donc au Buffer", ce qui pourrais expliquer un plantage

    Ensuite c'est kif kif.

    Jipete dans le code original peux tu tester, juste en faisant ça au début du code :

    // original
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      d := buffer;
      inc(d);
      a := 0;
      While  (a < ((length div 4) - 1)) do
      etc.....
    et si cela ne fonctionne pas juste avec While (a < ((length div 4) - 1)) do

    Anapurna, Tourlourou, vous en pensez quoi ?

    Bonne fin de soirée

    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
      0  0

  10. #30
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    3 416
    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 416
    Points : 10 041
    Points
    10 041
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Dans le code d'anapurna, le fait de passer par les variables intermédiaires r et l conduit le compilo à les stocker sur la pile :
    Code asm : 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
    .Ll8:
    # [113] r:=d^;
    	movl	-12(%ebp),%eax  ;// place EBP-12 (= d = buffer) dans EAX
    	movl	(%eax),%eax     ;// le remplace par ce qu'il pointe (place d^ dans EAX)
    	movl	%eax,-20(%ebp)  ;// le stocke à EBP-20 (= emplacement de r) 
    	# Register eax released
    	.stabn 68,0,114,.Ll9 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER
    .Ll9:
    # [114] d^:=r* Abs(sin(rotpos));
    	flds	U_DTMAIN_ROTPOS  ;// charge rotpos dans le registre ST du coprocesseur mathématique
    	fsin                     ;// le remplace par son sinus
    	fabs                     ;// le remplace par sa valeur absolue
    	fmuls	-20(%ebp)        ;// le multiplie par EBP-20 (= emplacement de r)
    	# Register eax allocated
    	movl	-12(%ebp),%eax   ;// place EBP-12 (= d = buffer) dans EAX
    	fstps	(%eax)           ;// enregistre le résultat dans d^
    	# Register eax released
    	.stabn 68,0,115,.Ll10 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER
    .Ll10:
    # [115] inc(d);
    	addl	$4,-12(%ebp)     ;// avance le pointeur d de la longueur d'un Single
    	# Register eax allocated
    	.stabn 68,0,116,.Ll11 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER

    Dans le code de Jipété, ce stockage est shunté :
    Code asm : 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
    # [129] d^ := d^ * Abs(Sin(rotpos)); // en pas-..-pas plante tout le Bureau
    	flds	U_DTMAIN_ROTPOS  ;// charge rotpos dans le registre ST du coprocesseur mathématique
    	fsin                     ;// le remplace par son sinus
    	fabs                    ; // le remplace par sa valeur absolue
    	# Register eax allocated
    	movl	-12(%ebp),%eax   ;// place EBP-12 (= d = buffer) dans EAX
    	fmuls	(%eax)           ;// le multiplie par EBP-20 (= emplacement de r)
    	# Register eax released
    	# Register eax allocated
    	movl	-12(%ebp),%eax   ;// place EBP-12 (= d = buffer) dans EAX
    	fstps	(%eax)           ;// enregistre le résultat dans d^
    	# Register eax released
    	.stabn 68,0,130,.Ll9 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER
    .Ll9:
    # [130] Inc(d);                            // en pas-..-pas plante tout le Bureau sur a := avec d^ := 0               
    	addl	$4,-12(%ebp)     ;// avance le pointeur d de la longueur d'un Single
    	.stabn 68,0,131,.Ll10 - DTMAIN_ROTATE$LONGWORD$LONGWORD$POINTER$LONGWORD$POINTER
    Je ne vois pas de différence significative, ni de justification à ce que ça parte en live !
    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 !
      1  0

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 745
    Points : 12 453
    Points
    12 453
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    et si cela ne fonctionne pas juste avec While (a < ((length div 4) - 1)) do
    Ah toi, tu es le cador des cadors !

    Ça fonctionne tip-top !

    La grande question serait de savoir pourquoi ça passe sans le -1 dans Delphi/Windows mais bon, pour ça y a pas d'urgence.

    Toutes mes félicitations, Jérôme.
    Et merci aux autres participants.
    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
      1  0

  12. #32
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    3 416
    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 416
    Points : 10 041
    Points
    10 041
    Billets dans le blog
    6
    Par défaut
    Bien vu !
    Comme chaque tour de boucle lit 2 Single, il faut s'assurer de ne pas lire au-delà du dernier...
    Mais si les fichiers tests sont les mêmes sous Delphi/Windows et Lazarus/Ubuntu, il faudra finalement incriminer une implémentation différente des librairies Bass respectives, non ?

    [EDIT] si le buffer contient un tableau de Single représentant en succession les valeurs des voies droite et gauche, sa taille est fatalement paire et le -1 ne devrait rien résoudre...
    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 !
      1  0

  13. #33
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 331
    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 331
    Points : 3 308
    Points
    3 308
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Ah toi, tu es le cador des cadors !

    Ça fonctionne tip-top !

    La grande question serait de savoir pourquoi ça passe sans le -1 dans Delphi/Windows mais bon, pour ça y a pas d'urgence.

    Toutes mes félicitations, Jérôme.
    Et merci aux autres participants.
    Hello, je me doutais bien que le 1er choix n'allait pas fonctionner, c'était juste pour vérifier, mon histoire d'alignement des données.

    Citation Envoyé par tourlourou Voir le message
    Bien vu !
    Comme chaque tour de boucle lit 2 Single, il faut s'assurer de ne pas lire au-delà du dernier...
    Mais si les fichiers tests sont les mêmes sous Delphi/Windows et Lazarus/Ubuntu, il faudra finalement incriminer une implémentation différente des librairies Bass respectives, non ?
    Je ne pense pas que cela vienne de Bass (mais sait-on jamais)

    Je pense que c'est au niveau de l'ABI qui est différent entre Windows et Linux. C'est ce décalage qui me le fait penser. Surtout qu'il est de 16 alors qu'un single est en 32 bit et prend 4 octets et donc c'est un mauvais alignement ou une mauvaise assignation de l'adresse du tampon.

    De plus dans l'exemple d'Anapurna, ce qui est surprenant, c'est le fait d'avoir rajouté ces 2 variables "l" et "r" et que juste cette modification corrige le problème.

    Faudrait voir sur le forum Delphi si quelqu'un peux compiler cette exemple sous Linux et voir si le problème apparaît. Si c'est le cas, cela indiquerai bien un problème d'alignement des données par rapport à l'ABI. Si non cela signifierait un problème génération du binaire avec FPC. Mais ce genre de bug (aussi gros) aurait surement déja été notifié à mon humble avis.

    Concernant l'ABI, en fait cela me fait penser a mes codes en assembleur (SIMD) de ma bibliothèque exemple (cf dernière ligne) . Mais je doute que le problème vienne de là :

    Sous Windows, c'est simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class operator TBZVector4f.+(constref A, B: TBZVector4f): TBZVector4f; assembler; nostackframe; register;
    asm
      movaps xmm0, XMMWORD PTR [A]
      addps  xmm0, XMMWORD PTR [B]
      movaps [RESULT], xmm0
    end;
    Sous Linux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class operator TBZVector4f.+(constref A, B: TBZVector4f): TBZVector4f; assembler; nostackframe; register;
    asm
      movaps  xmm0, XMMWORD PTR [A]
      addps   xmm0, XMMWORD PTR [B] 
      movhlps xmm1, xmm0  //====> On doit aller chercher la valeur dans les bits de poids fort et la placer directement dans les bits de poids faible dans registre de retour qui est xmm1 sous linux. 
     //si on fait comme pour Windows, "movaps [RESULT], xmm0" la valeur de retour est erronée, car se sont les bits de poids faible qui sont affectés et "movhlps  [RESULT], xmm0" bien sûre ne fonctionne pas car les données ne seraient plus alignées
    end;
    Citation Envoyé par tourlourou Voir le message
    [EDIT] si le buffer contient un tableau de Single représentant en succession les valeurs des voies droite et gauche, sa taille est fatalement paire et le -1 ne devrait rien résoudre...
    Oui tu as tout à fait raison, avec -1 cela fonctionne ( car il y a un décalage des données) mais on perds 2 données la première et la dernière et en plus par déduction on peux dire que les données lues "devraient être" (sont) erronées du fait de ce maudit déclage.

    Le traitement fonctionne, mais est à mon avis le résultat du traitement est tout simplement imperceptible à l'oreille.

    Si, non Jipete peux tu essayer en rajoutant une variable (puis une deuxième) de type single dans le "Var " (qui serviront à rien) et remettre le "While" comme à l'origine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure Rotate(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
    var
      a: DWORD;
      v1 : Single;
      //v2 : Single;
      d: PSingle;       
    begin
      d := single(buffer^);
     
      a := 0;
      while (a < (length div 4)) do
      begin
       // ....
    Juste histoire de.....

    Question bête Jipete (pas envie de relire tous les messages) mais as tu compilé cette exemple aussi sous Windows ? est-ce que tu pourrais nous donner les fichiers "DSPMain.s" généré sous Windows si c'est possible.


    Bon dimanche

    [EDIT] As tu essayé de compilé en mode release (sans débogage) ?
    • "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
      0  0

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 745
    Points : 12 453
    Points
    12 453
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Si, non Jipete peux tu essayer en rajoutant une variable (puis une deuxième) de type single dans le "Var " (qui serviront à rien) et remettre le "While" comme à l'origine
    it works.
    Truc de ouf…

    Citation Envoyé par BeanzMaster Voir le message
    Question bête Jipete (pas envie de relire tous les messages) mais as tu compilé cette exemple aussi sous Windows ? est-ce que tu pourrais nous donner les fichiers "DSPMain.s" généré sous Windows si c'est possible.
    Non, désolé.
    Et je n'ai pas envie de passer par une machine virtuelle, qui risque d'être source d'ennuis supplémentaires.
    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
      0  0

  15. #35
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 331
    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 331
    Points : 3 308
    Points
    3 308
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    it works.
    Truc de ouf…
    Avec 1 seule ou 2 variables ?

    Citation Envoyé par Jipété Voir le message
    Non, désolé.
    Et je n'ai pas envie de passer par une machine virtuelle, qui risque d'être source d'ennuis supplémentaires.
    Pas de problème, ta réponse, suffit à confirmer que c'est un problème d'alignement et/ou d'adressage par le compilo. Et en plus d'en une VM cela aurait fausser le résultat

    As tu essayé de compiler en mode release (sans débogage), avec le code originel ?
    • "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
      0  0

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 745
    Points : 12 453
    Points
    12 453
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Avec 1 seule ou 2 variables ?
    Une seule ou deux, ça fonctionne tout aussi bien.
    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
      0  0

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 745
    Points : 12 453
    Points
    12 453
    Par défaut
    Ah, je viens de jeter un œil au prog en C (qui fonctionne bien) et le callback "rotate" est écrit "à la Yves" :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // "rotate"
    HDSP rotdsp = 0;	// DSP handle
    float rotpos;	// cur.pos
    void CALLBACK Rotate(HDSP handle, DWORD channel, void *buffer, DWORD length, void *user)
    {
    	float *d = (float*)buffer;
    	DWORD a;
     
    	for (a = 0; a < length / 4; a += 2) {
    		d[a] *= fabs(sin(rotpos));
    		d[a + 1] *= fabs(cos(rotpos));
    		rotpos += 0.00003;
    	}
    	rotpos = fmod(rotpos, 2 * M_PI);
    }

    Pas plus, si ce n'est (rien à voir) qu'il semblerait que quelqu'un a détecté un gros bug dans la dll de la 2.4.15, bug absent dans la 2.4.14.
    Je surveille...
    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
      0  0

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 745
    Points : 12 453
    Points
    12 453
    Par défaut
    Citation Envoyé par Jipété Voir le message
    [...] il semblerait que quelqu'un a détecté un gros bug dans la dll de la 2.4.15, bug absent dans la 2.4.14.
    Je surveille...
    Fausse alerte, le posteur a re-downloadé le .zip de la distrib et tout fonctionne bien.


    Ah, je n'avais pas vu ce petit bout (arrivé après ma réponse ?) :
    Citation Envoyé par BeanzMaster Voir le message
    As-tu essayé de compiler en mode release (sans débogage), avec le code originel ?
    Avec le code originel ? Ben on sait que ça plante.

    Par contre, avec le code aux deux variables rajoutées, curieusement ça ne plante pas.

    Curieusement, car il me semblait qu'un compilateur intelligent aurait supprimé les variables non utilisées (et qu'il me signale), or l'exécution est bonne. Je ne comprends pas.

    Alors j'ai re-commenté l'une des deux variables, et toujours pas de plantage, du coup en désespoir de cause j'ai commenté l'autre et… ça ne plante plus !

    Quand je dis à Gilles que l'info c'est parfois magique et chamanique il ne me croit pas, et pourtant...
    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
      0  0

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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