previous next Up Title Contents Index

22.3.1 qsort

Seuraavassa on eräs esimerkki qsort - aliohjelman käytöstä. Ohjelma arpoo (rand) satunnaisen kokonaislukutaulukon ja tämän jälkeen järjestää sen. qsort kutsuu vertailualiohjelmaa kahdella osoitintyyppisellä muuttujalla, jotka osoittavat verrattaviin alkioihin. Osoittimet on määritelty void * - tyyppisiksi. Koska esimerkissämme alkiot ovat kokonaislukuja, pitää osoittimet käytön yhteydessä muuttaa int * - tyyppisiksi.

Vertailualiohjelman pitää palauttaa negatiivinen luku, mikäli 1. alkio on pienempi kuin toinen, 0 mikäli ne ovat samoja ja positiivinen luku, mikäli 1. on suurempi ("erotuksen etumerkki"). Siis tässä tapauksessa lukujen vähennyslasku tuottaa valmiiksi halutunlaisen tuloksen.

	...
	/* Alkioiden vertailufunktio.                          */
	int sort_function(const void *a, const void *b)
	{
	  return *(int *)a -  *(int *)b;
	}
	
	int main(void)
	{
	  int i,x[KOKO];
	
	  for (i=0; i<KOKO; i++)  x[i] = rand();
	  tulosta(x);
	
	  qsort((void *)x,KOKO,sizeof(x[0]),sort_function);
	
	  tulosta(x);
	  return 0;
	}

qsort - aliohjelman kutsussa pitää kertoa lajiteltavan taulukon (osaa lajitella vain taulukoita) alkuosoite, koko alkioina sekä kunkin alkion koko, sekä vertailufunktion osoite.

Huomattakoon, ettei kutsun viimeinen parametri sort_function aiheuta kutsua aliohjelmaan sort_function, vaan välittää qsort aliohjelmalle lajittelufunktion osoitteen. Kääntäjä tietää tämän eron siitä, ettei funktion nimen perässä ole sulkuja!


previous next Up Title Contents Index