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 :
Nom : demo_600pour100.png
Affichages : 286
Taille : 94,9 Ko
-- 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]) :
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;
à 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.

Le souci, donc, c'est que ça compile bien sauf un
"Warning: Conversion between ordinals and pointers is not portable"
remonté par la ligne qui va planter par un AV à l'exécution...

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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
type
  tScanYX = array of array of integer; // Tableau des adresses des pixels
et je rappelle ce qu'est un PRGBQUAD :
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;
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
function ColorVersClQuad(cl: tColor): tRGBQuad;
begin
  with Result do begin
    rgbRed   := GetRValue(cl);
    rgbGreen := GetGValue(cl);
    rgbBlue  := GetBValue(cl);
    rgbReserved := 255; // jpt
  end;
end;
avec function GetRValue(RGB : DWORD) : BYTE; inline; dans winapih.inc et on ne va pas plus profond. Et pareil pour G et B.
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,