Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

16.4 Dynaamiset taulukot

Kerhon jäsenrekisterissä käytettiin osoitintaulukkoa dynaamisesti. Vastaavan rakenteen tarve tulee usein ohjelmoinnissa. Tällöin tulee aina vastaan ongelma: montako alkiota taulukossa on nyt ja montako sinne mahtuu? Jäsenrekisterissä tämä oli ratkaistu cJasenet- luokassa tekemällä sinne kentät, joista nämä rajat selviävät.

Tavallinen taulukkokin voidaan usein esitellä vastaavasti

dyna\taul_d.c - esimerkki dynaamisesta taulukosta

	typedef struct {    
	  int max_koko;
	  int lkm;                  
	  int *alkiot; 
	} Taulukko_tyyppi;             
	...
	Taulukko_tyyppi luvut;
	luvut.max_koko = 7;
	luvut.alkiot = calloc(7,sizeof(luvut.alkiot[0]));
	luvut.alkiot[0] = 0; luvut.alkiot[1] = 2;
	luvut.lkm = 2;
	
	Taulukko_tyyppi luvut
	           +-----+ 
	  max_koko |  7  |         0  1  2  3  4  5  6 
	  lkm      |  2  |       +--------------------+ 
	 *alkiot   |  o--+------>| 0| 2| ?| ?| ?| ?| ?|
	           +-----+       +--------------------+

Tällaisen taulukon kuljettaminen parametrinä on helppoa, kun se voidaan välittää vain yhtenä parametrinä.

Viittausten puolesta samanlainen vastaava staattinen esittely olisi:

dyna\taul_s.c - staattinen taulukko

	typedef struct {    
	  int max_koko;
	  int lkm;                  
	  int alkiot[7]; 
	} Taulukko_tyyppiS;             
	...
	Taulukko_tyyppiS luvut = { 7, 2, {0,2} };
	
	Taulukko_tyyppiS luvut
	           +-----+ 
	  max_koko |  7  |  
	  lkm      |  2  |  
	           +-----+--------------+ 
	  alkiot   | 0| 2| ?| ?| ?| ?| ?|
	           +--------------------+
	             0  1  2  3  4  5  6 

Staattisessa esittelyssä taulukko tulisi tietueen osaksi. Kuitenkin kummassakin tapauksessa viitataan taulukon yksittäiseen alkioon muodossa luvut.alkiot[3]=5;.

Staattisen esittelyn "hyvä" puoli olisi siinä, että tällainen taulukko voitaisiin sijoittaa toiseen taulukon yhdellä käskyllä:

	Taulukko_tyyppiS apu,luvut = { 7, 2, {0,2} };
	apu = luvut; 

Tietysti sijoitus onnistuu dynaamisessakin tapauksessa, mutta tulos saattaa olla muuta kuin on haluttu! Miksi?

Viimeksi esiteltyä staattistakin esittelyä voidaan käsitellä dynaamisesti luomalla muuttujat luvut dynaamisesti. Koska C- kielessä ei useinkaan ole indeksitarkistusta, niin luomisessa malloc - funktiolle voidaan "valehdella" alkion koko:

	Taulukko_tyyppiS *luvut;
	...
	luvut = malloc( sizeof(Taulukko_tyyppiS) + 4*sizeof(int) );
	luvut- >max_koko = 7 + 4;
	... 

Tosin koko taulukon sijoittaminen yhdellä käskyllä ei enää onnistu tämän tempun jälkeen! Miksi?


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys