Edellisen esimerkin aliohjelmat on kirjoitettu omaan tiedostoonsa, joka C++:ssa pitää muistaa linkittää mukaan. Otsikkotiedostossahan on tiedot vain kääntämistä varten. Pascalin unitissa on sekä otsikkotiedot päämodulin kääntämiseksi, että varsinainen toteutus. Tarvittaessa voidaan tietysti jakaa käännettyä modulia (ali.dcu, Delphi Compiled Unit).
#ifndef ALI_HPP #define ALI_HPP double average(int a, int b); int bigger(int a, int b); void swap(int &a,int &b); #endif
#include "ali.hpp" double average(int a, int b) { return (a+b)/2.0; } int bigger(int a, int b) { if ( a > b ) return a; return b; } // Vaihdetaan luvut keskenään void swap(int &a,int &b) { int t; t = a; a = b; b = t; }
ali.pas - Pascal aliohjelmat
unit Ali; interface function average(a,b:integer):real; function bigger(a,b:integer):integer; procedure swap(var a,b:integer); implementation function average(a,b:integer):real; begin average := (a+b)/2.0; end; function bigger(a,b:integer):integer; begin bigger := b; if ( a > b ) then bigger := a; end; { Vaihdetaan luvut keskenään } procedure swap(var a,b:integer); var t:integer; begin t := a; a := b; b := t; end; end. { Unitin lopetus }end.
- aliohjelmamodulissa (unit) on interface - osa, jonka alla on lueteltu modulin ulkopuolelle näkyvät määritykset
- implementation - osassa on varsinainen toteutus
- moduli lopetetaan end. (huom. piste)
- modulissa voi olla alustusosa initialization alustus; end., joka suoritetaan kun moduli ladataan muistiin
- Delphi 2.0:ssa voi lisäksi olla finalization - osa, joka suoritetaan kun moduli poistuu muistista
- aliohjelman otsikkorivi loppuu AINA puolipisteeseen ;
- sijoitusoperaattorina on :=
- yhtäsuuruusvertailu tehdään operaattorilla =
- kommenttisulkuina on {} tai vaihtoehtoisesti (* ... *)
- Delphi 2.0:ssa rivikommenttina toimii myös //, käyttöä kannattaa ehkä välttää, koska tämä ei toimi Delphi 1.0:ssa
- aliohjelmia on kaksi tyyppiä: procedure ja function.
- procedure vastaa C:n void - funktioita
- parametrilistan erotin on puolipiste ;
- parametrilistoissa voidaan kirjoittaa useita muuttujia pilkulla erotettuna ennen parametrin tyypin ilmaisemista
- reaalilukutyyppi on real, voidaan käyttää myös double.
- funktion paluuarvo sijoitetaan funktion nimeen. Sijoituksia voi olla useita, joista viimeisenä tehty jää voimaan.
- paluuarvolle on myös lokaali muuttuja Result, jolle voidaan sijoittaa ja jota voidaan käyttää lausekkeen oikeallakin puolella
function bigger(a,b:integer):integer; begin Result := b; if ( a > Result ) then Result := a; end;Malliohjelma saadaan toimimaan muuttamattomana myös Delphi 2.0:ssa seuraavasti:
- funktio ja aliohjelma voidaan lopettaa exit- lauseella, jolloin funktion arvoksi jää viimeisen sijoituksen arvo
- aliohjelmilla on kahta eri parametrityyppiä: arvoparametrit (C:ssä on vain näitä, call by value) ja muuttujaparametrit (call by reference). Muuttujaparametrit ovat samoja kuin C:ssä parametrin välitys osoittimien avulla. C++:ssa vastine on referenssi (&). Muuttujaparametrit ilmaistaan parametrilistassa var - sanalla.
- parametritonta aliohjelmaa kutsutaan ilman sulkuja, esim: writeln;
- aliohjelmien sisään voidaan kirjoittaa omia "apu"aliohjelmia, jotka voivat käyttää "isäntänsä" muuttujia ilman parametrin välitystä
- 1.
- Kirjoitetaan tiedosto WinCRT.pas Delphin lib - hakemistoon:
unit WinCRT; interface implementation initialization finalization readln; { Tämä jos halutaan pysähtyvän ennen ohjelman loppua } end.
- 2.
- Laitetaan päälle optio: Project|Options|Linker|Generate console application. Tämä voitaisiin korvata myös lisäämällä ohjelman alkuun kääntäjän optiorivi {$APPTYPE CONSOLE}, mutta tällöin ohjelma ei kääntyisi Delphi 1.0:ssa ilman virheitä. unittiin laitettuna tämä koodissa oleva optio ei hyödytä kuin niillä kerroille, jolloin koko ohjelma rakennetaan uudelleen (build all).
- 3.
- valitettavasti konsoliohjelman pääohjelmaa ei jostakin syystä voi debugata Delphi 2.0:ssa, aliohjelmia voi kyllä, mikäli niihin laittaa keskeytyskohdan
- 4.
- kun ohjelma ajetaan, avautuu konsoli- ikkuna, joka sulkeutuu ohjelman lopuksi. Jos ikkuna halutaan jäävän näkyväksi, voidaan WinCRT:n lopettamisosaan tai ohjelman loppuun tilapäisesti laittaa kutsu readln.