POINTERMATH (Delphi)
Remonter à Liste des directives de compilation Delphi - Index
Type |
Commutateur |
Syntaxe |
{$POINTERMATH ON} ou {$POINTERMATH OFF} |
Par défaut |
{$POINTERMATH OFF} |
Portée |
Locale |
Remarques
La directive Pointermath traite simplement tout pointeur typé donné dans certaines instances réduites où vous pouvez effectuer de simples opérations arithmétiques directement sur la variable pointeur. Elle vous permet aussi de traiter une telle variable pointeur comme un tableau non borné en utilisant l'opérateur tableau []. Notez que dans l'exemple ci-dessus, l'incrémentation de l'indice d'un tableau d'un type est équivalent à l'incrémentation d'un pointeur sur ce type. Un incrément de un augmente le pointeur de la taille d'un élément de tableau en octets, et non d'un octet.
La directive POINTERMATH a une portée locale. Ainsi, si vous définissez cette directive sur ON et ne la définissez pas sur OFF dans le module, elle ne restera ON que jusqu'à la fin du module. En outre, si vous déclarez un pointeur typé avec cette directive définie sur ON, toute variable de ce type autorise l'indexation de tableau et l'arithmétique de pointeur, même après que cette directive ait été définie sur OFF. De même, tout bloc de code encadré par cette directive autorise les opérations arithmétiques pour les pointeurs typés ANY dans le bloc, indifféremment de la déclaration initiale du pointeur typé avec POINTERMATH ON.
Cette directive affecte seulement les pointeurs typés. Les variables de type Pointeur ne permettent pas les fonctionnalités mathématiques de pointeur, puisque le type Pointeur pointe en réalité sur un élément void, dont la taille est égale à 0 octet. Les paramètres const ou var non typés ne sont pas affectés car ils ne sont pas réellement des pointeurs.
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Memo1: TMemo; CheckBox1: TCheckBox; ListBox1: TListBox; ComboBox1: TComboBox; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } end; type Rects = ^TRect; RectList = array[0..10] of TRect; var Form1: TForm1; myRects: Rects; myRectList : RectList; procedure ListRect(Rect: TRect); procedure ListRects(PRects: Rects; Count: Integer); procedure ReadRects; procedure WriteRects; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin ListRects(myRects, Form1.ComponentCount); end; procedure ListRect(Rect: TRect); begin Form1.ListBox1.Items.Add( 'BoundsRect: Left: ' + IntToStr(Rect.Left) + ' Right: ' + IntToStr(Rect.Right) + ' Top: ' + IntToStr(Rect.Top) + ' Bottom: ' + IntToStr(Rect.Bottom)); end; {$POINTERMATH ON} procedure ListRects(PRects: Rects; Count: Integer); begin while Count > 0 do begin ListRect(PRects[Count - 1]); // Cette ligne ne compilera pas sans Tiburon. // ListRect((PRects + Count - 1)^); // Ni cette ligne. Dec(Count); end; end; procedure ReadRects; var I, index : Integer; Temp: TWinControl; begin {$T-} index := 0; for I := Form1.ComponentCount - 1 downto 0 do begin if (Form1.Components[I] is TWinControl) then begin Temp := TWinControl(Form1.Components[I]); myRectList[index] := Temp.BoundsRect; index := index + 1; end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin myRects := Addr(myRectList); ReadRects; end;