Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ ja taulukon osoitin funktioon

Ihme_kala [07.02.2009 22:25:44]

#

Voiko taulukkoa jotenkin laittaa funktion parametriksi? Ja nimenomaan niin, että kyseessä olisi viittaus taulukon muistipaikkaan, että sitä voidaan muokata suoraan funktiossa. Esim

void funktio(int& taulukko[][]) {
    *taulukko[5][1] = 3;
}

Noin, että siis funktion sisällä muokataan taulukkoa itseään.

Onko mahdollista mitenkään?

Metabolix [07.02.2009 23:59:38]

#

Taulukko on jo itsessään osoitin, joten mitään kikkailuja ei sen suhteen tarvita. Esimerkiksi seuraavassa koodissa sijoitus kyllä menee perille:

void funktio(int t[]) {
  t[1] = 10;
}

Moniulotteinen taulukko on osoitin taulukkoihin. Aivan kuten yksiulotteisen taulukon kanssa funktion pitää tietää alkion koko (int), moniulotteisesta taulukosta täytyy tietää alkion koko, kaksiulotteisessa tapauksessa siis rivin koko. Tätä varten funktion esittelyssä täytyy olla mukana kaikki dimensiot paitsi ensimmäinen:

void funktio(int t[][4][3]) {
  t[1][1][1] = 10;
}
// int t[123][4][3]; funktio(t);

Ongelman voi kiertää käyttämällä yksiulotteista taulukkoa:

if (2) {
  int taulu[4][5];
  taulu[2][3] = 10;
} else if (1) {
  int taulu[4 * 5];
  taulu[2 * 5 + 3] = 10;
}

Asiaa tietenkin helpottaa jonkinlaisen apuluokan käyttö. Vedin juuri hatusta tällaisen apuluokan.

(Edit. Iso koodi meni koodivinkiksi ja sai vähän lisää kommentteja.)

Ihme_kala [08.02.2009 00:40:55]

#

Kiitos kattavasta vastauksesta. Vaikka tuo isoin esimerkkikoodi ei juuri aukene minulle (olen vielä sen verran noviisi), tärkein selvisi eli sain moniulotteisen taulukon funktion parametriksi toimivasti, ja projekti pääsee taas etenemään.

Metabolix [08.02.2009 00:50:34]

#

Ai niin, unohtui vielä se helpoin. :)

Eli yksinkertainen kaavainfunktio.

template <int N, int M>
int summa(int (&taulu)[N][M]) {
	int s = 0;
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < M; ++j) {
			s += taulu[i][j];
		}
	}
	return s;
}
int main() {
	int t[5][7] = {{1, 2, 3, 0}};
	summa(t);
	return 0;
}

Tämän tavan huono puoli on, että kyseisen funktion (summa) pitää olla käännösvaiheessa näkyvillä eli esimerkiksi samassa kooditiedostossa, mikä tietenkin on hieman vaivalloista, jos funktio on iso ja sitä käytetään eri puolilla laajaa projektia. Kääntäjä nimittäin generoi siitä version oikealle taulukoolle vasta kutsun löytäessään. Luultavasti tämä on kuitenkin sinun tapauksessasi järkevin vaihtoehto.

Kikka esitellään eräässä koodivinkissä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta