Taulukon käsittelyä

Kuulin, että C:ssä funktiot eivät voi palauttaa taulukoita. Tarvitsisin kuitenkin erään ohjelman, jossa minun pitäisi tallettaa ASCII-merkkejö neliötaulukkoon ja välillä taulukosta pitää etsiä sopivia merkkejä. Tallennusta tapahtuu useassa kohdassa, joten miten ohjelman rakenne tulee suunnitella?
7537
Äänestä

Muut lukivat myös

Vastaukset 7

Vanhimmat

Voit antaa funktiolle taulukon osoitteen parametrina (viite tai osoitin), jolloin funktio voi lukea ja/tai muokata taulukon arvoja.

Voit myös palauttaa taulukon osoittimen funktiosta. Jos luot taulukon dynaamisesti funktiossa, sinun täytyy huolehtia muistin vapautuksesta kun et enää sitä tarvitse.

Äänestä
  • Taulukkoa ei voi käyttää tai viitata siihen sen ohjelmalohkon, jossa se on määritelty, ulkopuolella. Jos taulukko esitellään esim pääohjelmassa, silloin on mahdollista luoda (tilanvaraus ja jonkun/kaikkien alkioitten alustus ja luku) funktiossa taulukko, jota aiotaan funktion ulkopuolella käyttää tai johon aiotaan viitata. Jos taulukko esitellään funktiossa, sitä ei voi käyttää funktion ulkopuolella.

    Äänestä

  • Ohjelmalohko kirjoitti:

    Taulukkoa ei voi käyttää tai viitata siihen sen ohjelmalohkon, jossa se on määritelty, ulkopuolella. Jos taulukko esitellään esim pääohjelmassa, silloin on mahdollista luoda (tilanvaraus ja jonkun/kaikkien alkioitten alustus ja luku) funktiossa taulukko, jota aiotaan funktion ulkopuolella käyttää tai johon aiotaan viitata. Jos taulukko esitellään funktiossa, sitä ei voi käyttää funktion ulkopuolella.

    Tuo koskee vain staattisesti luotua taulukkoa joka määritellään jo ohjelmointivaiheessa.

    Voit luoda taulukon dynaamisesti malloc() avulla funktiossa ja palauttaa sen osoitteen. Kunhan sitten kanssa muistat vapauttaa muistin asianmukaisesti kun et enää tarvitse sitä.

    Heitin yksinkertaisen esimerkin. Tuo luo vain merkkijonotaulukon, mutta tyyppi voi olla mitä. Osoittimien kanssa kannattaa sitten olla tarkkana.. muistin vapauttamisenkin kanssa voi joutua olemaan tarkkana monimutkaisempien rakenteiden kanssa. Tästä löytyy varmasti kirjallisuutta ja netistäkin parempaa infoa.

    ps. en ole värkännyt c/c moneen moneen vuoteen joten tämä ei välttämättä ole "hyvä" esimerkki. Tarkoitus onkin vain osoittaa idea.

    #include
    #include

    char *get_message();

    int main(int argc, char* argv[])
    {
    char *msg = get_message();
    printf(msg);

    /* muista vapauttaa muisti kun et tarvitse sitä */
    free(msg);

    return 0;
    }

    char *get_message()
    {
    char *p = (char *)malloc(500);
    if (p == 0)
    {
    /* tarkista aina onnistuiko muistin varaaminen, jos osoittimen arvo on 0
    muistin varaaminen ei onnistunut */
    printf("Virrrhe!: muistia ei saatu varattua!");
    exit(1);
    }

    /* laita varattuun muistiin jokin viesti.. */
    sprintf(p, "Hello, World!");

    return p;
    }

    Äänestä

  • 5+10=? kirjoitti:

    Tuo koskee vain staattisesti luotua taulukkoa joka määritellään jo ohjelmointivaiheessa.

    Voit luoda taulukon dynaamisesti malloc() avulla funktiossa ja palauttaa sen osoitteen. Kunhan sitten kanssa muistat vapauttaa muistin asianmukaisesti kun et enää tarvitse sitä.

    Heitin yksinkertaisen esimerkin. Tuo luo vain merkkijonotaulukon, mutta tyyppi voi olla mitä. Osoittimien kanssa kannattaa sitten olla tarkkana.. muistin vapauttamisenkin kanssa voi joutua olemaan tarkkana monimutkaisempien rakenteiden kanssa. Tästä löytyy varmasti kirjallisuutta ja netistäkin parempaa infoa.

    ps. en ole värkännyt c/c moneen moneen vuoteen joten tämä ei välttämättä ole "hyvä" esimerkki. Tarkoitus onkin vain osoittaa idea.

    #include
    #include

    char *get_message();

    int main(int argc, char* argv[])
    {
    char *msg = get_message();
    printf(msg);

    /* muista vapauttaa muisti kun et tarvitse sitä */
    free(msg);

    return 0;
    }

    char *get_message()
    {
    char *p = (char *)malloc(500);
    if (p == 0)
    {
    /* tarkista aina onnistuiko muistin varaaminen, jos osoittimen arvo on 0
    muistin varaaminen ei onnistunut */
    printf("Virrrhe!: muistia ei saatu varattua!");
    exit(1);
    }

    /* laita varattuun muistiin jokin viesti.. */
    sprintf(p, "Hello, World!");

    return p;
    }

    pah, söi include tagit stdio.h ja stdlib.h

    Äänestä

  • 5+10=? kirjoitti:

    Tuo koskee vain staattisesti luotua taulukkoa joka määritellään jo ohjelmointivaiheessa.

    Voit luoda taulukon dynaamisesti malloc() avulla funktiossa ja palauttaa sen osoitteen. Kunhan sitten kanssa muistat vapauttaa muistin asianmukaisesti kun et enää tarvitse sitä.

    Heitin yksinkertaisen esimerkin. Tuo luo vain merkkijonotaulukon, mutta tyyppi voi olla mitä. Osoittimien kanssa kannattaa sitten olla tarkkana.. muistin vapauttamisenkin kanssa voi joutua olemaan tarkkana monimutkaisempien rakenteiden kanssa. Tästä löytyy varmasti kirjallisuutta ja netistäkin parempaa infoa.

    ps. en ole värkännyt c/c moneen moneen vuoteen joten tämä ei välttämättä ole "hyvä" esimerkki. Tarkoitus onkin vain osoittaa idea.

    #include
    #include

    char *get_message();

    int main(int argc, char* argv[])
    {
    char *msg = get_message();
    printf(msg);

    /* muista vapauttaa muisti kun et tarvitse sitä */
    free(msg);

    return 0;
    }

    char *get_message()
    {
    char *p = (char *)malloc(500);
    if (p == 0)
    {
    /* tarkista aina onnistuiko muistin varaaminen, jos osoittimen arvo on 0
    muistin varaaminen ei onnistunut */
    printf("Virrrhe!: muistia ei saatu varattua!");
    exit(1);
    }

    /* laita varattuun muistiin jokin viesti.. */
    sprintf(p, "Hello, World!");

    return p;
    }

    Tulee ylivuoto! Pitää varata tila taulukolle, joka funktiosta palautetaan, funktion ulkopuolella

    Äänestä

  • Ei toimi kirjoitti:

    Tulee ylivuoto! Pitää varata tila taulukolle, joka funktiosta palautetaan, funktion ulkopuolella

    Ei pidä, kyllä se toimii.

    (Toi voisi olla olisi:
    printf(msg);
    paremmin näin:
    printf("%s\n", msg);
    )

    Äänestä

Laita taulukko globaaliksi, niin voit tallettaa/etsiä ym. mistä vain kohtaa koodia.

Äänestä

Kommentoi aloitusta


C-treenaaja kirjoitti:

Kuulin, että C:ssä funktiot eivät voi palauttaa taulukoita. Tarvitsisin kuitenkin erään ohjelman, jossa minun pitäisi tallettaa ASCII-merkkejö neliötaulukkoon ja välillä taulukosta pitää etsiä sopivia merkkejä. Tallennusta tapahtuu useassa kohdassa, joten miten ohjelman rakenne tulee suunnitella?

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