Kirjoittaja: Metabolix (2004).
Osoitin vie neljä tavua muistia, siis yhtä paljon kuin tavallinen Integer-tyypin muuttuja. Se nimensä mukaisesti osoittaa johonkin muuttujaan. Osoitintyypit pitää määritellä ohjelman alkuun. Yleensä osoitintyypin nimi alkaa P-kirjaimella (Pointer), mutta on muuten sama kuin sen tyypin nimi, johon se osoittaa. Useita tyyppejä on määritelty jo valmiiksi; esimerkiksi PInteger on osoitin Integer-tyyppiseen muuttujaan. Osoittimen merkkinä toimii ^, joka muuttujatyypin eteen sijoitettuna tarkoittaa osoitinta kyseisen tyyppiseen muuttujaan ja osoitinmuuttujan perässä puolestaan antaa mahdollisuuden käyttää arvoa, johon osoitin osoittaa. Uudet muuttujat luodaan yleensä funktiolla New ja tuhotaan funktiolla Dispose. Nämä on esitelty lyhyesti seuraavassa esimerkissä. Poikkeuksellisia osoittimia ovat tavalliset luokka-muuttujat ja dynaamiset taulukot, jotka toimivat osoittimina vaikkei niissä ole osoitinmerkkiä. Moniulotteinen dynaaminen taulukko on itse asiassa osoitin osoittimiin, jotka osoittavat taulukon riveihin.
Osoittimen arvo on muuttujan osoite muistissa. Muuttujan osoitteen saa @-merkillä. @A on siis muuttujan A osoite, jonka voi antaa osoittimen arvoksi.
program Osoittimet;
{$APPTYPE CONSOLE}
type
(* Määritellään tietue TPossu *)
TPossu = record
Paino, Laskiprosentti: Integer;
end;
(* Määritellään osoitintyyppi PPossu, joka osoittaa TPossu *)
PPossu = ^TPossu;
(* Määritellään taulukko, jossa on PPossuja, TPossutaulu *)
TPossutaulu = Array [0 .. 19] of PPossu;
(* Määritellään osoitintyyppi PPossutaulu, joka osoittaa TPossutauluun *)
PPossutaulu = ^TPossutaulu;
(* Määritellään tietue TIhminen *)
TIhminen = record
Rahat: Single;
Possut: PPossutaulu;
end;
(* Määritellään osoitintyyppi PIhminen, joka osoittaa TIhminen *)
PIhminen = ^TIhminen;
procedure OstaPossuja(Ostaja: PIhminen; Maara: Integer; Hinta: Single);
var
X: Integer;
begin
X := 0;
(* Ostetaan enintään Määrä, mutta ei saa mennä taulukon yli *)
while (X < 20) and (Maara > 0) do
begin
(* Jos on jo possu, ei laiteta sen päälle uutta.
* ^-merkki päästää käsittelemään sitä, minne osoitin osoittaa *)
if (Ostaja^.Possut[X] = nil) then
begin
Ostaja^.Possut[X] := New(PPossu);
Ostaja^.Possut[X]^.Paino := Random(50) + 40;
Ostaja^.Possut[X]^.Laskiprosentti := Random(50) + 25;
Ostaja^.Rahat := Ostaja^.Rahat - Hinta;
(* Vähennetään yksi tarvittavasta määrästä *)
Dec(Maara);
end;
(* Siirrytään seuraavaan kohtaan taulukossa *)
Inc(X);
end;
end;
var
Metabolix: TIhminen;
X: Integer;
begin
(* Luodaan Metabolixin Possutaulu *)
Metabolix.Possut := New(PPossutaulu);
(* Nollataan Possut. *)
for X := 0 to 19 do
Metabolix.Possut[X] := nil;
(* Annetaan Metabolixille paljon rahaa *)
Metabolix.Rahat := 3.4e+38;
(* Ostetaan possuja halvalla.
* @-merkki antaa osoitteen, jolloin TIhminen muuttuu PIhmiseksi *)
OstaPossuja(@Metabolix, 12, 0.95);
(* Lopuksi kerrotaan possujen tiedot ja tuhotaan possut *)
for X := 0 to 19 do
if Metabolix.Possut[X] <> nil then
begin
Writeln('Possu ', X, ': ', Metabolix.Possut[X]^.Paino, 'kg, ',
Metabolix.Possut[X]^.Laskiprosentti, '% läskiä.');
Dispose(Metabolix.Possut[X]);
end;
(* Tuhotaan koko possutaulu *)
if Metabolix.Possut <> nil then
Dispose(Metabolix.Possut);
end.Lauri Kenttä, 19.9.2004
Metabolix.possu :D
Hyvä opassarja vaikka en itse tästä mitään uutta oppinut :D
Ja millon tulee uusia oppaita, mm. grafiikka opas puuttuu jne.
Grafiikka ei kuulu Pascalin perustoimintoihin, kuten ei muidenkaan alustasta riippumattomien kielten. Grafiikkaa varten pitää opetella jonkin grafiikkakirjaston käyttöä.
Voin selvittää porttautuvien grafiikka- ja muiden kirjastojen saatavuutta, kunhan aikaa löytyy. SDL on tiettävästi saatavilla myös Pascalille, ja ainakin WinAPI ja OpenGL ovat käytettävissä ja löytyvät Windows-moduulista.
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.