Kirjautuminen

Haku

Tehtävät

Oppaat: Pascal-ohjelmointi: Osa 6 - Osoittimet

  1. Osa 6 - Osoittimet
  2. Osa 7 - Objektit ja luokat

Kirjoittaja: Metabolix (2004).

Osoittimet

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


Kommentit

BlueByte [28.09.2004 15:37:29]

#

Metabolix.possu :D

HeadCheese [19.10.2004 17:12:17]

#

Hyvä opassarja vaikka en itse tästä mitään uutta oppinut :D

NanoSoft [31.03.2006 23:21:35]

#

Ja millon tulee uusia oppaita, mm. grafiikka opas puuttuu jne.

Metabolix [01.04.2006 08:57:10]

#

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.

Kirjoita kommentti

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.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta