Aliohjelmien väliseen tiedonvälitykseen tehdään tietue, johon kasataan kaikki yhteisesti tarvittavat muuttujat. Ongelmassamme niitä on kentan_nro ja osoitin käyttämämme kerhon jasenet - taulukon alkuun. Siis ne tietueeseen. Seuraavasta esimerkistä puuttuvat saantimetodit, joten se on vain hahmotelma:
typedef struct { /* Lajittelussa apuna käytettävä tietue. */ int kentan_nro; /* Kenttä jonka mukaan lajitellaan. */ cKerho *kerho; /* Lajiteltava kerho */ } tVertaa; /* */ static tVertaa VERTAA; /* Tiedonvälitys lajittele - > vertaile */ int vertaile(const void *a, const void *b) { string s1,s2; s1 = VERTAA.kerho->anna(*(int *)a).kentta_jonoksi(VERTAA.kentan_nro,); s2 = VERTAA.kerho->anna(*(int *)b).kentta_jonoksi(VERTAA.kentan_nro,); return (strcmp(s1.c_str(),s2.c_str()); } void cKerho::lajittele(cJarjestys *jarj,int kentan_nro) { int j,ind,max_ind; if ( (kentan_nro < 0) || !jarj- >jarjesta ) return; if ( jarj- >Indekseja() == 0 ) { /* Alustetaan perm. taulukko */ for (j=0; j<jasenia; j++) jarj- >lisaa(j); } VERTAA.kentan_nro = kentan_nro; VERTAA.kerho = this; qsort( (void *)(jarj- >Indeksit()), /* Lajiteltava taulukko */ jarj- >Indekseja(), /* Taulukon alkioiden lukumäärä */ sizeof(jarj- >anna(0)), /* Yksittäisen alkion koko */ vertaile); /* Vertailualiohjelman nimi */ }
lajittele - aliohjelma tekee tarvittavat alustukset, mm. laittaa permutaatiotaulukon johonkin järjestykseen (tässä tapauksessa ehdollisesti, eli jos taulukolla jo on järjestys, ei sitä sotketa), laittaa arvot yhteisille muuttujille ja kutsuu qsort - aliohjelmaa tarvittavilla parametreilla.
int vertaile(const void *a, const void *b) { string s1,s2; s1 = VERTAA.kerho->anna(*(int *)a).kentta_jonoksi(VERTAA.kentan_nro,); s2 = VERTAA.kerho->anna(*(int *)b).kentta_jonoksi(VERTAA.kentan_nro,); jono_isoksi(s1); jono_isoksi(s2); return (strcmp(s1.c_str(),s2.c_str()); }