previous next Up Title Contents Index

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 parametrina on helppoa, kun se voidaan välittää vain yhtenä parametrina.

Viittausten puolesta samanalainen 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?


previous next Up Title Contents Index