IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 message incompréhensible issu d'un compilateur frappadingue [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut [Linux] Problème de message incompréhensible issu d'un compilateur frappadingue
    Bonsoir,

    Voilà ce que je gagne quand je compile le projet en cours d'étude, ça concerne Scanline et Bitmap :
    Error: Call by var for arg no. 3 has to match exactly: Got "tagRGBQUAD" expected "PRGBQUAD"
    et voilà la ligne qui a généré ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MakecouleurH( col, Pixels[wi], Pixels[wi+colwidth] ); // avec le curseur qui clignote 
    // avant la dernière parenthèse, soulignée d'une vaguelette rouge qui se prolonge sous le point-virgule.
    Cet imbécile de compilateur n'est même pas d'accord avec lui-même puisque plus loin il m'agresse avec :
    Hint: Found declaration: TForm2.MakecouleurH(var TBitmap,var PRGBQUAD,var PRGBQUAD) is nested;
    et moi, je ne sais pas ce qu'il me raconte...
    L'infobulle en dit un peu plus mais il faut faire une copie d'écran pour avoir les infos :

    Nom : infobulle.png
Affichages : 325
Taille : 4,2 Ko

    Indépendamment de la ponctuation aléatoire qui n'aide pas à la compréhension, qu'en conclure ? Qu'il n'a pas trouvé d'overloaded procédure ? C'est normal, il n'y en a pas.
    Bref, incompréhensible, ce qui ne me fait pas avancer dans la résolution du problème.

    Revenons à MakecouleurH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        procedure MakecouleurH(var aCol: TBitmap; var pColDeb, pColFin: pRGBQuad);
        begin
          DrawMultiGradient(aCol.Canvas.Handle, Rect(0,0,aCol.Width,1),
            [RGBAtoColor(pColDeb), RGBAtoColor(pColFin)], False);
        end;
    Je récupère deux TColor avec RGBAtoColor pour fabriquer un dégradé, pas de quoi fouetter un chat, alors si quelqu'un a une idée, je la lirai avec grand plaisir parce que je suis salement coincé, là...
    Bien sûr j'ai tenté des trucs idiots, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure MakecouleurH(var aCol: TBitmap; var pColDeb: pRGBQuad; var pColFin: pRGBQuad);
    mais faut pas rêver, hein.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    Billets dans le blog
    6
    Par défaut
    TForm2.MakecouleurH(var TBitmap,var PRGBQUAD,var PRGBQUAD) m'étonne : Pixels[] est-il un tableau de PRGBQUAD ou de TRGBQUAD ?
    De même le RGBAtoColor(pColDeb) au lieu de RGBAtoColor(pColDeb^), du coup.
    Sinon, essaye de passer par des variables intermédiaires pour les paramètres.
    Delphi 5 Pro - Delphi 11.3 Alexandria 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 !

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    Coucou, Yves
    Citation Envoyé par tourlourou Voir le message
    TForm2.MakecouleurH(var TBitmap,var PRGBQUAD,var PRGBQUAD) m'étonne : Pixels[] est-il un tableau de PRGBQUAD ou de TRGBQUAD ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      var
        Pixels: pRGBQuad;
    Exemple d'utilisation (extrait d'un vieux projet d'étude) :
    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
    procedure TForm1.ComputeArray;
    var
      h, w: integer;
      gray: integer;
    begin
      bmp.BeginUpdate();
      for h := 0 to HSIZE-1 do
      begin
        Pixels := pRGBQuad(bmp.RawImage.GetLineStart(h));
     
        if h = 0 then        // ligne du haut, rouge -- mars 2019 : non, bleue !
          for w := 0 to WSIZE-1 do                   // j'inverse dessous :
            Pixels[w] := RGBAtoBGRA(255,0,0,255) // (0, 0, 255, 255)
        else                                         // et bleue en pf32, dessous cyan ok
        if h = HSIZE-1 then  // ligne du bas,  cyan
          for w := 0 to WSIZE-1 do
            Pixels[w] := RGBAtoBGRA(255,255,0,255)
        else                 // entre les deux
          for w := 0 to WSIZE-1 do begin
            gray := round((h+w) * ratio);   // le dégradé gris
            if gray > 255 then gray := round(gray * ratio);
            Pixels[w] := RGBAtoBGRA(gray, gray, gray, trkTranspar.Position);
          end;
      end;
      bmp.EndUpdate();
    end;
    Nom : program.png
Affichages : 300
Taille : 13,7 Ko

    Ici, ce qui me turlupine le plus, c'est que si on regarde attentivement le début de la procédure appelée, c'est comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure MakecouleurH(var aCol: TBitmap; var pColDeb, pColFin: pRGBQuad);
    Il y a donc 3 objets, les deux derniers du même type.
    Et je l'appelle ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MakecouleurH( col, Pixels[wi], Pixels[wi+colwidth] )
    Et le compilateur m'agresse à propos du troisième
    Pour être bien sûr, stupide d'un point de vue algo, j'ai testé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MakecouleurH( col, Pixels[wi], Pixels[wi] )
    et j'ai le même message désagréable.
    Pourquoi sur le troisième et pas sur le deuxième, ou les deux ?
    À partir de là je suis sec...

    Citation Envoyé par tourlourou Voir le message
    De même le RGBAtoColor(pColDeb) au lieu de RGBAtoColor(pColDeb^), du coup.
    J'ai tout tenté.
    Soit c'est l'insulte soit c'est image noire.

    Citation Envoyé par tourlourou Voir le message
    Sinon, essaye de passer par des variables intermédiaires pour les paramètres.
    À quoi ça sert d'avoir des pointeurs et du scanline si on ne peut pas les utiliser ?
    Sinon, tu verrais ça comment, toi ?


    Pour Roland :

    si j'utilise du var c'est parce que c'est censé aller beaucoup plus vite, c'est l'adresse de l'objet qui est passée, plutôt qu'une recopie de l'objet.
    De toute façon, avec ou sans, c'est le message abscons…

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Jipété Voir le message
    si j'utilise du var c'est parce que c'est censé aller beaucoup plus vite, c'est l'adresse de l'objet qui est passée, plutôt qu'une recopie de l'objet.
    De toute façon, avec ou sans, c'est le message abscons…
    Le pointeur est déjà une adresse.

    Remarque aussi que quand on écrit Pixels[w], on n'obtient pas une adresse (comme on pourrait le croire), mais une valeur. On le voit bien dans l'exemple que tu as donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pixels[w] := RGBAtoBGRA(255,0,0,255) // (0, 0, 255, 255)
    Ou encore dans ce petit exemple que je te propose :

    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
      s: string; 
      p: ^char;
     
    begin
      s := 'abc';
      p := @s[1];    // adresse du premier caractère
      WriteLn(p^);   // premier caractère
      WriteLn(p[1]); // deuxième caractère
    end.
     
    {
      a
      b
    }
    Maintenant, pourquoi le compilateur signale le troisième paramètre et non pas le deuxième, je n'en sais rien mais peu importe : il a raison quand même.
    Probablement que si tu corriges le troisième, il te signalera alors le deuxième.

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Probablement que si tu corriges le troisième, il te signalera alors le deuxième.
    Le tout c'est d'y arriver : j'ai enlevé var, restons simple, et je renomme les variables pour plus de précision à la lecture :
    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 MakecouleurH(var aCol: TBitmap;  pCouleurDeb, pCouleurFin: pRGBQuad);
    // je mets tout dans le même bloc CODE mais c'est juste pour de la lisibilité forumesque 
     
    MakecouleurH( col, Pixels[wi], Pixels^[wi+colwidth] )
    //me donne
    Error: No default property available
     
    MakecouleurH( col, Pixels[wi], Pixels[wi+colwidth]^ ) 
    //me donne
    Error: Illegal qualifier
     
    MakecouleurH( col, Pixels[wi], Pixels[wi+colwidth] ) 
    //me donne 
    Error: Incompatible type for arg no. 3: Got "tagRGBQUAD", expected "PRGBQUAD"
    Si tu vois comment corriger, ça m'intéresse,

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Pas sûr mais j'essaierais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MakecouleurH( col, @Pixels[wi], @Pixels[wi+colwidth] )

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Bonjour Jipété!

    Je n'ai pas la solution mais il y a une ou deux choses que je ne comprends pas bien dans ton code. Premièrement je ne vois pas l'intérêt de passer des pointeurs à ta procédure. Pourquoi pas directement des valeurs plutôt ? Deuxièmement, pourquoi déclarer des paramètres de type var ? Enfin, je ne comprends pas non plus pourquoi tu passes des pointeurs à la fonction RGBAToColor. Mais c'est peut-être moi qui suis à côté de la plaque.

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    De haine, j'ai enlevé le ,

    Regardez :
    C'est toujours la même ligne, suivie par la ligne d'insulte du compilo. Mais quand il dit ce qu'on lit, est-ce vraiment vrai ? On a vu ce matin qu'il y avait à boire et à manger dans ses sorties…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Caption := inttostr((((@Pixels[wi]))));
    Error: Incompatible type for arg no. 1: Got "Pointer", expected "QWord"
    // D'accord, donc je précise mon pointeur :
    Caption := inttostr(((pRGBQuad(@Pixels[wi]))));
    Error: Incompatible type for arg no. 1: Got "PRGBQUAD", expected "QWord"
    // là c'est inttostr qui n'est pas content, arrangeons ça :
    Caption := inttostr((QWord(pRGBQuad(@Pixels[wi]))));
    // ça compile et ça s'exécute en donnant ça : 3056543384
    pas sûr que ça soit un TColor correct, d'autant plus que ça varie d'exécution en exécution alors que wi ne change pas (j'ai cassé les boucles pour essayer de savoir pourquoi je n'ai pas de couleurs)

    on recommence à partir du début en tentant un autre itinéraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Caption := inttostr((((@Pixels[wi]))));
    Error: Incompatible type for arg no. 1: Got "Pointer", expected "QWord"
    // d'où
    Caption := inttostr(((pRGBQuad(@Pixels[wi]))));
    Error: Incompatible type for arg no. 1: Got "PRGBQUAD", expected "QWord"
    // ça tombe bien, RGBAtoColor attend du pRGBquad : function RGBAtoColor(var aPixel: pRGBQuad): TColor;
    // donc :
    Caption := inttostr((RGBAtoColor(pRGBQuad(@Pixels[wi]))));
    Error: Can't assign values to an address
    Ah ! Et sans arrobase ?
    ça compile, mais à l'exécution
    Le projet project1 a levé une exception de class "External: SIGSEGV".
    dans le fichier "unit2.pas" à la ligne 193:
    B := aPixel^.rgbBlue;
    marche arrière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Caption := inttostr((RGBAtoColor((Pixels[wi]))));
    unit2.pas(361,50) Error: Call by var for arg no. 1 has to match exactly: Got "tagRGBQUAD" expected "PRGBQUAD"
    // ah oui, l'arrobase !
    Caption := inttostr((RGBAtoColor((@Pixels[wi]))));
    unit2.pas(361,51) Error: Can't assign values to an address
    D'autant plus curieux que si je passe @Pixels[wi] à MakecouleurH pour qu'elle appelle une procédure de dégradé à qui elle passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RGBAtoColor(le_pRGBquad_passé)
    , ça ne m'insulte pas. Image noire mais pas d'explosion de haine ou de vengeance.

    Bref, ça commence sérieusement à me les briser menu-menu, parce que si un code fonctionne (vous avez vu l'image) et qu'un autre sur le même moule non, c'est pas d'un forum dont j'ai besoin, mais d'un marabout bien fourni en poulets à sacrifier.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    Billets dans le blog
    6
    Par défaut
    Un RGBQUAD ou un TColor ne sont-ils pas des structures de 4 octets et un QWord une donnée de 8 octets, non ? Si les pointeurs sont de 8 octets, c'est sous 64 Bits, non ? Ca passerait pê en 32 bits, par contre.
    Delphi 5 Pro - Delphi 11.3 Alexandria 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 !

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    Billets dans le blog
    6
    Par défaut
    @Jean-Pierre : pour favoriser la lecture du code et lever les soucis de trantypages et avertissements ésotériques, il faudrait pê te simplifier la vie, même si ce n'est pas toujours facile en essayant de faire coller des bouts de code collectés avec les siens...
    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure MakecouleurH(var aCol: TBitmap; var pColDeb, pColFin: pRGBQuad);
        begin
          DrawMultiGradient(aCol.Canvas.Handle, Rect(0,0,aCol.Width,1),
            [RGBAtoColor(pColDeb), RGBAtoColor(pColFin)], False);
        end;
    utilise des noms qui ne parlent que dans ta logique de cette application.
    Si son but est de dessiner un dégradé (horizontal ?) dans un bitmap, pourquoi le bitmap est-il passé en var (pas nécessaire), et pourquoi s'appelle-t-il aCol ?
    S'il doit accepter des RGBQuads à transmettre après transformation en TColor sans les modifier, pourquoi les passer en var ? Et pourquoi sous forme de pointeurs sur des RGBQuads ?

    Je comprends la syntaxe suivante, très proche du C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var Pixels: pRGBQuad;    
    begin
      Pixels := pRGBQuad(bmp.RawImage.GetLineStart(h));
    mais j'aurais plutôt écrit en Pascal (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var Pixels: array of RGBQuad;    
    begin
      Pixels := bmp.RawImage.GetLineStart(h);
    pour être sûr que les Pixels[i] soient des RGBQuads.

    Caption := inttostr((QWord(pRGBQuad(@Pixels[wi]))));
    pas sûr que ça soit un TColor correct, d'autant plus que ça varie d'exécution en exécution alors que wi ne change pas
    Normal, c'est l'adresse d'une valeur, pas la valeur elle-même.

    Caption := inttostr((RGBAtoColor((@Pixels[wi]))));
    unit2.pas(361,51) Error: Can't assign values to an address
    Il faudrait le code de RGBAToColor pour savoir ce qu'il attend. Si le paramètre est en var, ça explique pê l'erreur. En principe, il n'a d'ailleurs pas besoin de l'être, puisqu'il devrait d'après son nom se contenter de convertir une valeur RGBA en TColor.
    Delphi 5 Pro - Delphi 11.3 Alexandria 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
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Un RGBQUAD ou un TColor ne sont-ils pas des structures de 4 octets et un QWord une donnée de 8 octets, non ?
    Si si, mais c'est pour faire plaisir au compilo. Rappel d'une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Caption := inttostr( pRGBQuad(@Pixels[wi]) );
    Error: Incompatible type for arg no. 1: Got "PRGBQUAD", expected "QWord"

    Citation Envoyé par tourlourou Voir le message
    Il faudrait le code de RGBAToColor pour savoir ce qu'il attend.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function RGBAtoColor(var aPixel: pRGBQuad): TColor;//// inline; // empêche le pas-à-pas !
    var
      R,G,B,A: Byte;
    begin
      B := aPixel^.rgbBlue;
      G := aPixel^.rgbGreen;
      R := aPixel^.rgbRed;
      A := 255; // aPixel.rgbReserved;
      Result := (A shl 24) or (B shl 16) or (G shl 8) or R;
    end;
    C'est moi qui l'ai bricolé à la va-vite en m'inspirant de RGBtoColor, dans Graphics, qui est écrit ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function RGBToColor(R, G, B: Byte): TColor;
    begin
      Result := (B shl 16) or (G shl 8) or R;
    end;
    Citation Envoyé par tourlourou Voir le message
    Si le paramètre est en var, ça explique pê l'erreur.
    Je l'enlèverai.

    Citation Envoyé par tourlourou Voir le message
    mais j'aurais plutôt écrit en Pascal (non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var Pixels: array of RGBQuad;    
    begin
      Pixels := bmp.RawImage.GetLineStart(h);
    et à la compil tu aurais gagné Error: Incompatible types: got "PByte" expected "tagRGBQUAD".
    Hé oui... GetLineStart renvoie du pByte, en transtypant en pRGBQuad ça passe, exactement comme dans le code montré au premier post.

    Citation Envoyé par tourlourou Voir le message
    pourquoi les passer en var ?
    Citation Envoyé par tourlourou Voir le message
    pourquoi le bitmap est-il passé en var (pas nécessaire), et pourquoi s'appelle-t-il aCol ?
    var parce qu'on m'a toujours dit que ça allait plus vite,
    aCol parce que l'image finale se compose de 24 colonnes (oui, il y a une légère ambiguïté entre aCol et aColor / aCouleur.

    Normalement, il s'agit de choses qui auraient été revues à la mise au propre, là j'essaye juste de voir si je vais m'en sortir avec les pBytes et autres pMachins, car si j'emprunte la voie paisible (Canvas.Pixels[w, h]) j'arrive au résultat escompté, mais il faut compter 7 secondes pour une image de 504 x 504 (pourquoi 504 ? Parce que c'est divisible par 24 !), alors pas question de redimensionner la fiche à la souris, c'est un coup à planter toute la pile de messages, ça !

    Citation Envoyé par tourlourou Voir le message
    Si son but est de dessiner un dégradé (horizontal ?)
    Tutafait.
    En gros j'ai 24 colonnes côte-à-côte, chacune dégradée de haut en bas en passant pas sa couleur, le but final est d'avoir un dégradé horizontal de col[n] à col[n+1] et donc j'ai à l'heure actuelle deux options :
    - 7 secondes avec le Canvas.Pixels mais je n'ose imaginer le temps qu'il faudrait pour une image 1008x1008
    - la crise de nerfs avec les pBytes et consœurs...

    Bon, ne vous prenez pas la tête, je regarderai tout ça à tête reposée demain matin (suis plus performant le matin).

    Et pour ceux qui aiment les images, à gauche l'étape finale espérée (les couleurs ne sont pas trop bonnes, j'ai pris des images qui traînaient sur le Bureau, mais l'idée est bien rendue), à droite l'étape intermédiaire (où l'on voit bien les 24 colonnes) :
    Nom : finish_source.jpg
Affichages : 297
Taille : 13,4 Ko

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    Billets dans le blog
    6
    Par défaut
    Par curiosité, est-ce bien la procédure DrawMultiGradient que tu utilises ?

    Un essai pour calmer le compilateur sans trimbaler trop de pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      LineStart: PByte;
      Pixels: array of TRGBQuad absolute LineStart; // fait pointer une seconde variable sur une première 
      OnePixel: TRGBQuad;   
    begin
      LineStart := bmp.RawImage.GetLineStart(h);
      OnePixel := pixels[0];
    Delphi 5 Pro - Delphi 11.3 Alexandria 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 !

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    Tout est là : zip, explications.

    Enjoy,

  14. #14
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    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 899
    Billets dans le blog
    2
    Par défaut
    Salut sympa ton application

    Pour Windows suffit juste de passer le pixelformat des TBitmap à pf32bits ou utiliser des TRGBTriple comme tu l'as suggéré.

    Sinon il y a 2 erreurs dans la fonction MakeCircle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     IF w >= 0 THEN Phase:= (-arctan(h/w)) // on est à* droite dans le cercle // ERREUR W=0 DIVISION PAR ZERO
                          ELSE if w< 0 then Phase:= (-arctan(h/w) + Pi)
    a remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     IF w > 0 THEN         Phase:= (-arctan(h/w)) // on est à* droite dans le cercle
     ELSE if w< 0 THEN   Phase:= (-arctan(h/w) + Pi) // on y est à* gauche       
     ELSE                       Phase:= (-arctan(h));  // on est au milieu
    et il faut modifier

    pos_px := (w+rayon); par pos_px := (w+rayon)-1; sinon SIGSEGV --> Index hors limite dans la ligne (on commence a zero. Si la largeur = 100px Index Max = 99px)

    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

  15. #15
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    Merci pour ton retour

    Citation Envoyé par BeanzMaster Voir le message
    Sinon il y a 2 erreurs dans la fonction MakeCircle
    sous Linux ou sous Windows ?
    Et comment se fait-il ne je n'aie jamais eu ces erreurs ?

  16. #16
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    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 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Merci pour ton retour


    sous Linux ou sous Windows ?
    Et comment se fait-il ne je n'aie jamais eu ces erreurs ?
    Sous Windows et oui bizarre surtout la Division par zero qui est inévitable dans ton code. Une option dans le projet ou l'ide de ton coté ?
    Je testerai sous Linux un peu plus tard
    • "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

  17. #17
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Sous Windows et oui bizarre surtout la Division par zero qui est inévitable dans ton code. Une option dans le projet ou l'ide de ton coté ?
    Pas que je sache.
    Bon, c'est déjà publié, de l'autre côté.

    Citation Envoyé par BeanzMaster Voir le message
    Je testerai sous Linux un peu plus tard
    Oui, avec plaisir.

    Ah j'en ai trouvé un tout seul, alors profite :
    Dans ComputeOptimalSizes;, tout en bas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      ...
        memo1.Visible   := False;
    //    Height := pnl4courbes.Top + pnl4courbes.Height + ckbxFirstLine.Height + 10;
      {$ENDIF}
    end;
    à commenter sinon impossible de passer en plein écran.

  18. #18
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    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 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Sous Windows et oui bizarre surtout la Division par zero qui est inévitable dans ton code. Une option dans le projet ou l'ide de ton coté ?
    Je testerai sous Linux un peu plus tard
    Je viens de tester sous Linux aucunes exceptions levées

    du coup après une petite recherche vite fait, voici le pourquoi : http://wiki.lazarus.freepascal.org/M...FPU_exceptions

    Gtk2 and masking FPU exceptions
    Gtk2 library changes the default value of FPU (floating point unit) exception mask. The consequence of this is that some floating point exceptions do not get raised if Gtk2 library is used by the application. That means that, if for example you develop a LCL application on Windows with win32/64 widgetset (which is Windows default) and plan to compile for Linux (where Gtk2 is default widgetset), you should keep this incompatibilities in mind.
    ......
    However, with Gtk2, only exOverflow is not masked.

    The consequence is that EInvalidOp and EZeroDivide exceptions do not get raised if the application links to Gtk2 library]! Normally, dividing non-zero value by zero raises EZeroDivide exception and dividing zero by zero raises EInvalidOp
    Le problème c'est que ce genre de chose peut entrainer des erreurs "en mémoire"

    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

  19. #19
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    Salut salut,

    je me suis amusé à créer un projet minimaliste reprenant la map de 24 couleurs pour tester sous Windows, et les galères commencent.
    Citation Envoyé par BeanzMaster Voir le message
    et il faut modifier

    pos_px := (w+rayon); par pos_px := (w+rayon)-1; sinon SIGSEGV --> Index hors limite dans la ligne (on commence a zero. Si la largeur = 100px Index Max = 99px)
    Obligé de conserver pos_px := (w+rayon); parce que l'ajout du -1 génère des indices négatifs pas bons du tout. M'en suis sorti avec un balayage configuré ainsi : w := -rayon to rayon-1, et si je poste ce soir, c'est parce que j'ai une autre sale blague, que personne n'a relevé et que je suspecte donc d'être attachée au fait que dans ce nouveau projet light j'ai fait sauter tout ce qui avait un rapport avec le redimensionnement du TImage d'affichage (et les TBitmaps sous-jacents) et son adaptation à une division par 24.

    Résultat des courses, cette horreur à droite :
    Nom : sous_XP.png
Affichages : 162
Taille : 190,0 Ko

    Et j'en ai des pires. Tu n'as pas vu ça chez toi ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ovh] message incompréhensible
    Par sami_c dans le forum OVH
    Réponses: 4
    Dernier message: 29/01/2007, 16h15
  2. Entier 64 bits sous linux, problème d'affectation
    Par Steki-kun dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 21h10
  3. [Linux]Problème System.out.println + compiler
    Par Dnx dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 21/09/2004, 22h05
  4. [Linux]probléme d'installation
    Par rahmouni ali dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 27/07/2004, 11h26
  5. messages incompréhensibles
    Par devalender dans le forum Outils
    Réponses: 2
    Dernier message: 06/07/2004, 16h53

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