previous next Up Title Contents Index

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 parametrinaan 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ä.


previous next Up Title Contents Index