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?
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.)
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.
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.