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ää parametrinä 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:
#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;
}