Bonjour,
Yes, c'est encore moi avec mes misères, et celle-ci est gratinée !
Qu'on en juge : je voulais débugguer une fonction qui me retourne une couleur en fonction de 3 paramètres qui lui sont passés, car elle ne réagit pas correctement : si je lui passe (0, 512, compteur_de_boucle) elle fonctionne et j'ai un joli dégradé, si je lui passe (jpColorToInteger(clBlue), jpColorToInteger(clYellow), compteur_de_boucle) j'ai une couleur unie .
J'ai donc voulu voir ce qui se cachait derrière ces noms, et pour ce faire j'ai rajouté dans ma maquette une ligne de log, avant d'appeler la fonction suspecte :
Cette fonction jpColorToInteger est tout simplement un clone de la fonction ColorToRGB récupérée dans Graphics et renommée par votre serviteur pour avoir un nom plus en rapport avec ce qu'elle fait, et j'en ai profité pour la déclarer inline;, le tout dans un module complémentaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part memo1.Lines.Add(IntToStr(jpColorToInteger(clBlue))+' '+IntToStr(jpColorToInteger(clYellow)));
Les informations de log ayant l'air normales (16711680 65535), j'ai alors rajouté sous la première ligne de log une autre ligne pour en avoir le cœur net :
Code : Sélectionner tout - Visualiser dans une fenêtre à part memo1.Lines.Add(IntToStr(clBlue)+' '+IntToStr(clYellow));
Et c'est là qu'on rigole : si le mémo affiche maintenant deux lignes identiques avec les mêmes valeurs, la couleur unie retournée n'est plus la même !
Je n'en croyais pas mes yeux, j'ai fait 10 fois le test de commenter/décommenter cette seconde ligne de log et je confirme que ça réagit comme décrit.
Alors pour en avoir le cœur net, j'ai basculé le projet dans la machine XP / Laz 1.6rc1 / FPC 3.0 et le canard est toujours vivant, plus le fait que selon l'O.S. les couleurs ne sont pas les mêmes...
On a donc Linux (Laz 1.4 / FPC 2.6.2) à gauche et XP à droite, en haut lorsque les deux lignes de log se suivent et en bas lorsque la seconde est commentée :
Et pour obtenir cette magnifique image, il me suffit donc de commenter ou pas la seconde ligne (ou la première, ça foire tout autant) :
La grande question est donc : comment est-il possible que le rendu de couleurs soit différent alors que les valeurs passées à la fonction sont identiques ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 memo1.Lines.Add(IntToStr(jpColorToInteger(clBlue))+' '+IntToStr(jpColorToInteger(clYellow))); memo1.Lines.Add(IntToStr(clBlue)+' '+IntToStr(clYellow)); // les valeurs logguées sont toujours les mêmes : 16711680 65535 for h := 0 to DisplayLenght-1 do begin aColor := GiveRainbowColor(jpColorToInteger(clBlue),jpColorToInteger(clYellow), h);
Et le plus dément, c'est lorsque je loggue ou pas mais que je passe toujours les mêmes constantes aColor := GiveRainbowColor(16711680, 65535, h); à la fonction : les résultats affichés continuent à être différents !
Sous Linux de gauche à droite, pas de log, une ligne de log, deux lignes de log :
Je suis incapable de débugguer ça puisque d'habitude j'utilise des mémos pour voir où ça coince, mais là,
Ah, la fonction en question vient de là sans avoir rien changé.
Partager