Suomi24 Keskustelussa on viikonlopun aikana ollut poikkeuksellisen paljon bottien automaattiseti luomia kommentteja. Pahoittelemme tästä aiheutunutta harmia. Olemme kiristäneet Keskustelujen suojausasetuksia ja kommentointi on toistaiseksi estetty ulkomailta.

Taulukon käsittelyä

C-treenaaja

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?

7

444

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • 8+20=?

      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.

      • Ohjelmalohko

        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.


      • 5+10=?
        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;
        }


      • 9+6=?
        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


      • Ei toimi
        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


      • öaööaöa
        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);
        )


    • öaööaöa

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

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Voitasko leikkiä jotain tunnisteleikkiä?

      Tietäisi ketä täällä käy kaipaamassa.. kerro jotain mikä liittyy sinuun ja häneen eikä muut tiedä. Vastaan itsekin kohta
      Ikävä
      87
      2305
    2. Millä voin

      Hyvittää kaiken?
      Ikävä
      51
      1997
    3. Tietysti jokainen ansaitsee

      Hän varmasti ansaitsee vain parasta ja sopivinta tietenkin, suon sen onnen hänelle enemmän kuin mielelläni. Aika on nyt
      Ikävä
      23
      1848
    4. Jotain puuttuu

      Kun en sinua näe. Et ehkä arvaisi, mutta olen arka kuin alaston koivu lehtiä vailla, talven jäljiltä, kun ajattelen sinu
      Ikävä
      89
      1837
    5. 50+ naiset kyl

      Lemottaa sillille mut myös niitte kaka lemottaa pahlle ku kävin naiste veskis nuuhiin
      Ikävä
      10
      1628
    6. Haluan sut

      Haluatko sinä vielä mut?
      Ikävä
      77
      1562
    7. hieman diabetes...

      Kävin eilen kaverin kanssa keskusapteekissa kun on muutama kuukausi sitten tullut suomesta ja oli diabetes insuliinit lo
      Pattaya
      25
      1432
    8. Välitän sinusta mies

      Kaikki mitä yritin kertoa tänään ei mennyt ihan putkeen..Joka jäi jälkeenpäin ajateltuna suoraan sanottuna harmittaa aiv
      Työpaikkaromanssit
      6
      1392
    9. Hei A, osaatko

      sanoa, miksi olet ihan yhtäkkiä ilmestynyt kaveriehdotuksiini Facebookissa? Mitähän kaikkea Facebook tietää mitä minä en
      Ikävä
      41
      1390
    10. Haluaisin aidosti jo luovuttaa ja unohtaa

      Ei tästä mitään tule koskaan.
      Ikävä
      72
      1351
    Aihe