Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

13.8.5 Taulukko osoittimista

Mikäli halutaan tehdä esimerkiksi 2- ulotteinen taulukko, jonka kumpikin ulottuvuus on muuttuva, mutta silti taulukkoa käytetään kuten 2- ulotteista tavallista taulukkoa, pitää käyttää taulukkoa osoittimista:

	mat-+      mat[0]         +---------- mat[0][2]
	    |      |              |      
	    |      |              v 
	    v      +--->+---------------+
	  +---+   +---->| 1 | 2 | 3 | 4 |  r0
	0 | o-+---+     +---------------+ 
	  +---|         +---------------+
	1 | o-+-------->| 5 | 6 | 7 | 8 |  r1
	  +---|         +---------------+ 
	2 | o-+---+     +---------------+
	  +---+   +---->| 9 | 0 | 1 | 2 |  r2
	                +---------------+ 

c-taul\mat3.c - matriisi osoitintaulukon avulla

	#include <stdio.h>
	
	double alkioiden_summa(double **mat, int riveja, int sarakkeita)
	{
	  int i,j; double summa=0;
	
	  for (i=0; i<riveja; i++)
	    for (j=0; j<sarakkeita; j++)
	      summa +=mat[i][j];
	  return summa;
	}
	
	int main(void)
	{
	  double s1,s2; 
	  double r0[] = {1,2,3,4}, r1[] = {5,6,7,8}, r2[] = {9,0,1,2};
	  double *mat[3];
	  mat[0] = r0; mat[1] = r1; mat[2] = r2;
	
	  s1 = alkioiden_summa(mat,2,3);
	  s2 = alkioiden_summa(mat,3,4);
	
	  printf("Summat on %5.2lf ja %5.2lf\n",s1,s2);
	
	  return 0;
	}

Esimerkissä on sama esitelläänkö aliohjelmassa:

	double alkioiden_summa(double **mat,...
	/* vai */
	double alkioiden_summa(double *mat[],...

Tässä menettelyssä on vielä se etu, ettei kaikkien rivien välttämättä tarvitsisi edes olla yhtä pitkiä. Harvassa matriisissa osa osoittimista voisi olla jopa NULL- osoittimia, mikäli rivillä ei ole alkioita (aliohjelman pitäisi tietysti tarkistaa tämä). Oikeasti rivit usein vielä luotaisiin dynaamisesti ajonaikana tarvittavan pituisina.

Tehtävä 13.132 Transpoosi

Kirjoita taulukko- osoittimia käyttäen aliohjelma, joka saa parametrinään kaksi matriisia ja niiden dimensiot. Aliohjelma tarkistaa voiko toiseen matriisiin tehdä toisen transpoosin (vaihtaa rivit ja sarakkeet keskenään) ja tekee transpoosin jos pystyy. Onnistuminen palautetaan aliohjelman nimessä.

Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys