C++ funktioista

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.
8674
Äänestä

Muut lukivat myös

Vastaukset 8

Vanhimmat

voi :)

Äänestä

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

Äänestä
  • hyötyä?
    esim.
    void funktio(void)
    {
    int koko = 10;
    int * taulukko;
    taulukko = new int [koko];
    }

    Pitäisikö dynaamisesti luodun taulukon näkyä muille funktioille?

    Äänestä

  • Aloittelija kirjoitti:

    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.

    Äänestä

  • Aloittelija kirjoitti:

    hyötyä?
    esim.
    void funktio(void)
    {
    int koko = 10;
    int * taulukko;
    taulukko = new int [koko];
    }

    Pitäisikö dynaamisesti luodun taulukon näkyä muille funktioille?

    Jos palautat osoittimen ja käytät sitä muissa funktioissa.

    int *varaa_taulukko(void)
    {
    ....
    }

    Äänestä

  • jepuli kirjoitti:

    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 :)

    Äänestä

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.

Äänestä

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.

Äänestä

Kommentoi aloitusta


Aloittelija kirjoitti:

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.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu