procedure Pekarexempel is -- Olika typer av pekare type Integer_Access is access Integer; type Arr_Type is array (1..3) of integer; type Arr_Access is access Arr_Type; type Complex_Type is record Re, Im : Integer; end record; type Complex_Access is access Complex_Type; I : Integer; Int_Ptr : Integer_access; C : Complex_Type; Complex_Ptr : Complex_Access; A : Arr_Type; Array_Ptr : Arr_Access; begin -- Vanliga siffror är faktiskt konstanter (brukar ibland kallas -- literaler). Vi kan tilldela variabler sådana konstanter: I := 5; -- Konstanta poster skrivs ju såhär (parenteser obligatoriska): C := (Re => 1, Im => 2); -- Man kan även skriva såhär, C := (1, 2); -- Men detta kanske inte jättbra då det inte är så tydligt vad man -- menar. Dessutom ser man inte huruvida C är ett fält eller en -- post.. -- Konstanta fält kan man skriva såhär (även här måste vi ha -- parenteser): A := (6, 7, 8); -- Man kan även skriva såhär... A := (1 => 6, 2 => 7, 3 => 8); -- Alltså, plats 1 får värde 6, plats 2 får värde 7 och plats 3 -- får värde 8. Detta kanske är lite övertydligt, med så mycket -- siffror blir det nästan förvirrande. Variant 1 är kanske bättre -- här alltså. -- För att kunna göra något vettigt med pekare måste man allokera -- minne. Pekaren i sig är bara en referens. Man kan tänka sig att -- det är som addressen i minnet som pekare innehåller. Att -- allokera minne gör man med det reservared ordet new: Int_Ptr := new Integer; -- Då har man vips fått ett minnesutrymme som man kan leka med. För -- att komma åt utrymmet måste man avreferera minnet, det gör man -- genom att använda ordet "all". Anta att jag nu vill stoppa in -- en 4 i det allokerade minnesutrymmet: Int_Ptr.all := 4; -- Självklart kan man ta detta värde från en variabel om man vill: Int_Ptr.all := I; -- För de övriga pekartyperna (post och fält) fungerar detta på -- exakt samma sätt. -- När man allokerar nytt minne åt en pekare kan man direkt sätta -- värdet som detta minnesutrymme skall få inom parantes efter -- typnamnet (med en ' emellan, brukar kallas för "tick"). -- T.ex. såhär. Int_Ptr := new Integer'( 4 ); -- eller såhär: Int_Ptr := new Integer'( I ); -- Detta går att göra även med poster och arrayer: Complex_Ptr := new Complex_Type( (Re => 1, Im => 2) ); Array_Ptr := new Array_Ptr( (6, 7, 8) ); -- Självklart kan man ju också göra såhär: Complex_Ptr := new Complex_Type( C ); Array_Ptr := new Array_Ptr( A ); -- Som tidigare nämnts går det alltså att skriva såhär också: Complex_Ptr := new Complex_Type'( (1, 2) ); Array_Ptr := new Arr_Type'( (1 => 6, 2 => 7, 3 => 8) ); -- Dessa är som sagt inte riktigt lika snygga... -- Varför dubbla parenteser? Det yttre paret kommer ju från just -- hur man skickar ett värde ett direkt till det minnesutrymme man -- allokerar (som ovan). Och det inre paret är ju det som markerar -- att detta är en konstant post/fält. -- Nu är det faktiskt så att man i Ada har sagt att det är OK att -- ta bort ett av dessa parentespar, eftersom det kan tyckas lite -- överflödigt i dessa fall. Man kan alltså skriva såhär: Complex_Ptr := new Complex_Type( Re => 1, Im => 2 ); Array_Ptr := new Array_Ptr( 6, 7, 8 ); -- Men detta är egentligen inte "rätt" om man skall vara -- konsekvent, och kan leda till att man tror att man kan göra -- t.ex. såhär: C := Re => 1, Im => 2; -- Vilket självklart inte går, detta ger kompileringsfel. end Pekarexempel;