previous next Up Title Contents Index

14.5.3 Tietueet osoitteiden avulla tai viitteiden avulla


Usein tietueet ja oliot välitetään osoitteiden tai viitteiden avulla, vaikkei niitä olisikaan tarkoitus muuttaa aliohjelmassa. Tähän on syynä se, että parametrin välityksessähän kopioidaan kutsumuuttujien arvot aliohjelman lokaaleihin muuttujiin. Tietueiden tapauksessa kopiointi saattaa olla isokin, ja tämän vuoksi osoitteen välityksessä menee pelkkä osoite, ei koko tietueen sisältö.
	int vertaa_pvm(Pvm_tyyppi pv1, Pvm_tyyppi pv2)
	{
	...
	}
	...
	  int ero;
	  Pvm_tyyppi pvm1,pvm2;
	  ero = vertaa_pvm(pvm1,pvm2);  /* Oikein, mutta iso kopiointi */
	  if ( ero < 0 ) printf("Pvm1 on ensin!\n");
Parametrin välitys osoitteiden avulla kopioinnin välttämiseksi:
	int vertaa_pvm(Pvm_tyyppi *pv1, Pvm_tyyppi *pv2)
	{
	...
	}
	...
	  int ero;
	  Pvm_tyyppi pvm1,pvm2;
	  ero = vertaa_pvm(&pvm1,&pvm2);  /* Oikein */
	  if ( ero < 0 ) printf("Pvm1 on ensin!\n");
Tällöin tietysti aliohjelman kirjoittajan on oltava huolellinen, ettei muuta pv1 ja pv2 osoitteiden osoittamia päivämääriä! Usein tätä kommentoidaan const esittelyllä:
	int vertaa_pvm(const Pvm_tyyppi *pv1, const Pvm_tyyppi *pv2)
	{
	...
	}
	... 

Tehtävä 14.136 vertaa_pvm

Kirjoita aliohjelma vertaa_pvm, joka palauttaa - 1, mikäli pv1 on ennen pv2:sta, 0 jos päivämäärät ovat samoja ja 1 muuten.

Tehtävä 14.137 vertaa- metodi

Täydennä pvmjono.cpp:ssä luokkaan cPvm myös metodi vertaa(const cPvm &pv2), joka toimii kuten edellinen vertaa_pvm, mutta verrattavina ovat *this ja pv2.


previous next Up Title Contents Index