Kuinka onnistuu (moniulotteisen) taulukon välittäminen funktiolle? Olen aivan hukassa tämän c++:n taulukoiden käsittelyn kanssa, kun basicissa asiat vähän toisin. Olen kokeillut kaiken maailman osoitin- ja viittausvirittelyjä, mutta aina tulee joku virhe (esim. taulukko-osoittimesta tulee osoitintaulukko?).
Olisi mukava tietää miten olet tuota kokeillut ratkaista tähän mennessä.
Homma toimii kuitenkin jotensakin tähän tapaan:
// parametrin ensimmäisen ulottuvuuden dimensioita // ei tarvitse määritellä, loput pitää void baz(int param[][25]); int main() { int foo[10][25]; baz(foo); return 0; } void baz(int param[][25]) { param[0][15] = 69; // muokataan taulukkoa }
edit: unohtu return 0 mainista
Jaa, minkä takia taulukon voi välittää suoraan, ja muokata funktiossa? Jos normaalin muuttuja sisältöä haluaa muuttaa, niin sittenhän se täytyy välittää osoittimena tai viittauksena. Johtuuko siitä että taulukko on jo valmiiksi osoitin? Entä miten se sitten välitetään niin, että siitä muodostuu kopio, niinkuin muuttujasta normaalisti?
Kaikkea muuta kyllä olin kokeillut, mutta jotenkin ajattelin automaattisesti ettei tuo toimisi.
Tästä tulikin mieleen, että kun kerran muiden ulottuvuuksien alkioiden määrä täytyy välittää, niin entä jos niiden määrä vaihtelee? Voiko senkin välittää funktiolle?
lainaus:
Jaa, minkä takia taulukon voi välittää suoraan, ja muokata funktiossa? Johtuuko siitä että taulukko on jo valmiiksi osoitin?
Taulukko - myös moniulotteinen - on tietokoneen näkökulmasta osoitin sen ensimmäiseen soluun. Taulukon sisältö on aina yksiulotteinen rivi tietyn tyyppisiä soluja. Kääntäjä pyrkii hoitamaan tarvittavan aritmetiikan, jotta ohjelmoija voisi visualisoida taulukon helpommin.
lainaus:
Entä miten se sitten välitetään niin, että siitä muodostuu kopio, niinkuin muuttujasta normaalisti?
Ei sellaisenaan mitenkään. Kuten sanottu, taulukko on pelkkä osoitin soluriviin. Voit määritellä moniulotteisen taulukon struktuuriin ja välittää funktioon tuosta struktuurista luodun olion, jolloin sen sisällöstä tehdään funktiolle kopio. Tai sitten kopioit taulukon ronskisti ennen funktiokutsua.
lainaus:
Tästä tulikin mieleen, että kun kerran muiden ulottuvuuksien alkioiden määrä täytyy välittää, niin entä jos niiden määrä vaihtelee? Voiko senkin välittää funktiolle?
Joo, mutta kääntäjä ei voi sitten hoitaa aritmetiikkaa, koska se ei voi käännösvaiheessa tietää kuinka rajat ajon aikana muuttuvat. Sinun pitää siis itse hoitaa aritmetiikka. Esimerkki 2d-taulukolla:
void funktio(int *taulu2d, int leveys) { int x = 10, y = 20; taulu2d[y * leveys + x] = 123; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.