previous next Up Title Contents Index

14.5.1 Syöttö- ja tulosparametrit


Eräs tilanne voisi olla vaikka seuraava. Jostakin on saatu (esim. päätteeltä luettu) merkkijono, jossa on päivämäärä. Toisaalta ohjelmassa on esitelty päivämäärätyyppi
	typedef struct {
	  int pv,kk,vv;
	} Pvm_tyyppi; 
Merkkijonossa oleva päivämäärä pitäisi saada muutetuksi Pvm_tyyppiseksi. Millainen aliohjelma kirjoitetaan? Helpointa on ehkä miettiä kutsun kautta:

Aliohjelmalle täytyy välittää parametrina muutettava merkkijono. Aliohjelman tulee palauttaa muutettu päivämäärä. Siis kutsu voisi olla muotoa:

	char jono[40]="13.3.1992";
	Pvm_tyyppi pvm;
	...
	muuta_jono_pvmksi(jono,pvm);   /* ??? */
Tämä ei tietenkään voi toimia C- kielessä, koska aliohjelma ei pystyisi muuttamaan pvm- muuttujaa! Siis kutsu täytyy olla muotoa:
	muuta_jono_pvmksi(jono,&pvm); 
Tästä seuraa että aliohjelma täytyy vastaavasti esitellä muodossa:
	void muuta_jono_pvmksi(const char *jono, Pvm_tyyppi *pvm)
	{
	...
	}
Toisaalta C++:ssa myös muoto
	muuta_jono_pvmksi(jono,pvm);   /* ??? */
voisi toimia, mikäli aliohjelma esiteltäisiin viitemuuttujaa käyttäväksi
	void muuta_jono_pvmksi(const char *jono, Pvm_tyyppi &pvm)
Aliohjelman tyyppi voisi olla myöskin int, jolloin aliohjelman nimessä palautetaan tieto siitä, onnistuiko muutos vai ei (miksi ei onnistuisi?).

Joskus tällainen aliohjelma voidaan esitellä jopa char * - tyyppiseksi, jotta nimessä voidaan palauttaa osoitin virhettä kuvaavaan viestiin:

	const char *viesti,...
	...
	viesti = muuta_jono_pvmksi(jono,&pvm);
	if ( viesti ) {
	  printf("%s\n",viesti);
	  return 1;
	}
Koko ohjelma testiohjelmineen voisi olla esimerkiksi seuraava:

param\pvmjono.c - esimerkki tietueesta parametrina

	#include <stdio.h>
	#include <string.h>
	
	typedef struct {
	  int pv,kk,vv;
	} Pvm_tyyppi;
	
	static char *VAARA_MUOTO="Väärä muoto!";
	
	const char *muuta_jono_pvmksi(const char *jono, Pvm_tyyppi *pvm)
	{
	  if ( sscanf(jono,"%d%.%d.%d",&pvm- >pv,&pvm- >kk,&pvm- >vv) != 3 )
	    return VAARA_MUOTO;
	  return NULL;
	}
	
	int tulosta_pvm_jono(const char *jono)
	{
	  const char *viesti;
	  Pvm_tyyppi pvm;
	  viesti = muuta_jono_pvmksi(jono,&pvm);
	  if ( viesti ) {
	    printf("%s\n",viesti);
	    return 1;
	  }
	  printf("%02d.%02d.%d",pvm.pv,pvm.kk,pvm.vv);
	  return 0;
	}
	
	int main(void)
	{
	  tulosta_pvm_jono("18.5.1992");  printf("\n");
	  tulosta_pvm_jono("12.3");  printf("\n");
	
	  return 0;
	}

Tehtävä 14.134 pvmjono.cpp

Kirjoita pvmjono.c:stä C++ - versio. Ensimmäinen versio pelkästään muuttamalla osoitteet referensseiksi ja toinen muuttamalla koko Pvm_tyyppi luokaksi cPvm ja kaikki mahdolliset funktiot tietysti luokan metodeiksi.


previous next Up Title Contents Index