Bonjour,
Le mot clé absolute permet de faire pointer 2 variables sur le même emplacement mémoire.
Est-ce possible en utilisant directement les pointeurs sur les valeurs ?
Papy !
Bonjour,
Le mot clé absolute permet de faire pointer 2 variables sur le même emplacement mémoire.
Est-ce possible en utilisant directement les pointeurs sur les valeurs ?
Papy !
Tu as tout à fait compris l'absolute
j'avais plusieurs fois utilisé absolute, le plus souvent avec LParam et WParam mais Dr.Who m'a définitivement vacciné
tu peux donc écrire ceci
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 var I: Integer; S: Single absolute I; begin S := 1.01; ShowMessage(IntToStr(i));
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 var I: Integer; begin PSingle(@I)^ := 1.01; ShowMessage(IntToStr(i));
Je comptais m'en servir justement pour "exploser" certaines valeurs comme tu le faisais. Mais dans ton second exemple, ça ne colle pas.
Je vais lire ce qui t'a vacciné
après lecture ...
Le coup du test sur le RGB est effectivement très parlant.
Maintenant, le test vaut quelque chose sur un très trsè très grand nombre d'appels ... Au delà d'une certaine utilisation, il faut savoir effectivement optimiser en passant par du code plus pointu (mRGB en assembler).
Mais c'est intéressant tout de même :-)
Exploser, tu voulais dire décomposer
Partie variable des enregistrements
Comme dans le sujet résultat binarisation d'image
Pour séparer les canaux Rouge, Vert, Bleu d'un TColor, au lieu des shl\shr\and, un petite union est le tour est joué
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
16
17
18 typedef struct { union { struct { TColor Color; }; struct { Byte R; Byte V; Byte B; Byte A; }; }; } TRGBColor;
En Delphi
Si tu modifie R, V, B, A cela va modifier l'un des octets de Color qui partage le même espace mémoire, et vice-versa évidemment !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 type TRGBColor = record case boolean of True: ( Color: TColor ); False: ( R, V, B, A: Byte; ); end;
On peut aussi utiliser parfois les record à partie variable :
[EDIT : trop tard...]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 type TMyRecord = case { Format : } Word of // Data Format : champ du record si on enlève les parenthèses tf_Byte : ( Octet : Byte ); tf_Word : ( Mot : Word ); tf_DWord : ( Long : Cardinal ); tf_DWRatio : ( Numer, Denom : Cardinal ); // Rationnel end;
Je crois n'avoir jamais utilisé les record comme ça.
Et surtout, je n'avais jamais imaginé m'en servir dans ce but.
Pas mal du tout ! Merci !
Partager