Absolute/fr

From Lazarus wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Deutsch (de) English (en) español (es) suomi (fi) français (fr) русский (ru)

Ce modificateur de déclaration indique la variable déclarée est à la même adresse que la variable qui suit absolute. Toutefois, aucune cohérence entre les valeurs des deux variables n'est assurée.

Var
  sintI: ShortInt;
  lintI: LongInt absolute sintI;

begin
  // Affichage correct
  lintI := 20;
  ShowMessage(inttostr(lintI) + '  ' + inttostr(sintI)); // Anzeige: 20  20

  // Affichage absurde
  lintI := 2000;
  ShowMessage(inttostr(lintI) + '  ' + inttostr(sintI)); // Anzeige: 2000 -45
end;
// Example on little endian x64 processor
Uses SysUtils;

Var
    anInt      : Integer;
    anotherInt : Integer absolute anInt;
    firstByte  : Byte    absolute anInt;
 
begin
    // with both Integer variables at the same memory location, a change to one is reflected
    // in the other
    anInt := 20;

    WriteLn(IntToStr(anInt) + '  ' + IntToStr(anotherInt)); // Outputs: 20  20

    // a value of 20 fits in the first byte:

    WriteLn('firstByte: ' + IntToStr(firstByte));           // Outputs: firstByte: 20
   
    anotherInt := 333;

    WriteLn(IntToStr(anInt) + '  ' + IntToStr(anotherInt)); // Outputs: 333 333

    // 333 is too large a value to fit in one byte
    // little-endian x64 - least significant byte is first in memory:
    // 333 = 101001101 =  01001101 00000001 in memory = 0x4D 0x01 = decimal: 77 1

    WriteLn('firstByte: ' + IntToStr(firstByte));           // Outputs: firstByte: 77
end.