Voidaanko C :ssa luoda funktiossa taulukko, jota muut funktiot pystyvät käsittelemään (esim. syöttämään arvot). Taulukon tyyppi voi olla esim. int.
C++ funktioista
Aloittelija
8674
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 8
Vanhimmat
voi :)
Periaatteessa funktion sisällä luotu taulukko on käytössä ainoastaan funktion sisällä. Eli jos sulla on vaikka:
int funktio1 ()
{
.
.
int funktion_taulukko[10];
.
.
return 0;
}
niin sitä ei voi ulkopuolelta kutsua. Eräs ratkaisu on luoda taulukko globaaliksi:
int globaali_taulukko[10];
int funktio2()
{
.
.
globaali_taulukko[0] = 0;
.
.
return 0;
}
Globaaleja muuttujia ja taulukoita pidetään kuitenkin yleisesti hyvien ohjelmointitapojen vastaisina, koska se kielii huonosta suunnittelusta. Näin siis ainakin koulukirjoissa. Tosimaailmassa näitä käytetään edelleen kovasti.
Toinen vaihtoehto on välittää taulukko parametrina. Muistelisin jossain sanotun, että taulukot välittyvät aina viitteinä. Eli:
// Ennakkoesittely. Ei '&' -merkkiä, koska
// taulukko välittyy viitteenä.
void alustaTaulukko(int alustettava);
const int MAX_ALKIOITA = 10;
int funktio3 ()
{
int taulukko[MAX_ALKIOITA];
alustaTaulukko(taulukko);
// jos nyt tulostettaisiin kaikki taulukon
// alkiot. Niin tulostuisi "0123456789"
return 0;
}
void alustaTaulukko(int alustettava)
{
for (int i=0; i
hyötyä?
esim.
void funktio(void)
{
int koko = 10;
int * taulukko;
taulukko = new int [koko];
}
Pitäisikö dynaamisesti luodun taulukon näkyä muille funktioille?
Ei ole hyötyä. Ei tuo osoitinkaan näy funktion ulkopuolelle. Minkä lisäksi jos noin teet, niin ohjelmasi vuotaa muistia koska new:llä varattua muistia ei automaattisesti vapauteta etkä pääse tuohon taulukko -osoittimeen enää kiinni.
Jos palautat osoittimen ja käytät sitä muissa funktioissa.
int *varaa_taulukko(void)
{
....
}
no helkkari. pitääpä muuttaa kantaa niin, että tätä minä käyttäisin :)
Yksi vaihto ehto muiden joukkoon olisi, että luot taulukon esim. Main() functiossa (taikka muussa ohjelman "pää osassa") ja tämän jälkeen lähetät aina functiolle, jonka tarvitsee käsitellä kyseistä taulukkoa, tämän taulukon osoitteen ja mikäli kutsuttu functio kutsuu uutta functiota jonka tarvii käsitellä taulukkoa, lähetät osoitteen vain eteenpäin...
Juu.. tais olla tämä asia kerrottu jo kertaalleen tuossa ennemminkin, mutta hieman erillalailla.
Miksi se pitää luoda funktiossa? Miksei kutsuvassa (main?) funktiossa. Mutta voihan sen luoda funktiossa esim. määrittelemällä funktion tyypin pointteriksi ja palauttamalla sitten pointterin taulukkoon.