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