Bonjour,
je retrouve un vieux programme qui fonctionne bien (sous Linux) dans une machine 32 bits et qui me fait un Access Violation avec le même code dans une machine 64 bits,
Le problème se situe sur la ligne 5 du bout de code ci-dessous (qui fait partie d'une usine à gaz servant à redimensionner une image .bmp, GG en a parlé là https://www.developpez.net/forums/d1...e/#post7298397 (zip dispo en suivant le lien) et j'avoue qu'à l'époque j'ai été bluffé par les résultats, regardez :
-- attention, le code ne fonctionne qu'avec des images-sources en bmp, en ce qui me concerne [peut-être lié à des histoires de 24 <> 32 bits, je ne sais pas encore]) :
à gauche l'image de départ, à droite le résultat d'un zoom à 600 % où les curieux attentifs remarqueront une différence de rendu au niveau de la pointe bleue de la mine du crayon entre l'image de Gilbert et la mienne, différence que je n'ai pas eu le temps de creuser.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SetLength(pixR, HR, WR); // HR,WR: 2 integer for y := 0 to HR - 1 do begin for x := 0 to WR - 1 do begin pixR[y, x] := Scan0 + y * MLS + x * Bpp; PRGBQuad(pixR[y, x])^ := ColorVersClQuad(clWhite); end; end;
Le souci, donc, c'est que ça compile bien sauf unremonté par la ligne qui va planter par un AV à l'exécution..."Warning: Conversion between ordinals and pointers is not portable"
Qu'en dire de plus ? Je peux apporter des précisions, genre à la ligne précédant le bout de code, on trouve un pixR qui est en fait un
et je rappelle ce qu'est un PRGBQUAD :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 type tScanYX = array of array of integer; // Tableau des adresses des pixels
Quant au ColorVersClQuad, il est bricolé ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 PRGBQuad = ^TRGBQUAD et tagRGBQUAD = record rgbBlue : BYTE; rgbGreen : BYTE; rgbRed : BYTE; rgbReserved : BYTE; end; TRGBQuad = tagRGBQUAD; RGBQUAD = tagRGBQUAD;
avec function GetRValue(RGB : DWORD) : BYTE; inline; dans winapih.inc et on ne va pas plus profond. Et pareil pour G et B.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function ColorVersClQuad(cl: tColor): tRGBQuad; begin with Result do begin rgbRed := GetRValue(cl); rgbGreen := GetGValue(cl); rgbBlue := GetBValue(cl); rgbReserved := 255; // jpt end; end;
De mémoire, je crois bien que c'est moi qui ai rajouté dans le code 32 bits la ligne rgbReserved.
Enfin, plus loin dans le code, on trouve Rouge := ColorVersClQuad(clRed); et 5 autres lignes pour les 5 autres couleurs basiques.
La souris sur Rouge montre var Rouge: tRGBQuad = tagRGBQUAD = record alors par mimétisme, j'invente Blanc := ColorVersClQuad(clWhite); mais ça ne change rien à l'AV...
À vos claviers, pour les bonnes idées et les pistes lumineuses,![]()
Partager