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

511

    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. SDP jo 100 % suositumpi kuin persut

      Kertoo Hesarin uusin kannatuskysely. Demareiden kannatus on miltei tuplat verrattuna persuihinl. Suomen kansa ei selväst
      Maailman menoa
      23
      5262
    2. Voiko normaali ihminen ryhtyä vasemmistolaiseksi?

      Tätä jäin pohdiskelemaan.
      Maailman menoa
      214
      4368
    3. SDP haluaa 40 000 nettomaahanmuuttajaa

      SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah
      Maailman menoa
      147
      3837
    4. Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen

      No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat
      Maailman menoa
      141
      3308
    5. Mikä tämä henkilö mahtaa touhuta Parkanossa

      Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58
      Parkano
      36
      1868
    6. Ikävä sinua mies

      Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i
      Ikävä
      19
      1678
    7. Hienoa! Eduskunta luopui käteisen käytöstä

      Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.
      Maailman menoa
      57
      1668
    8. Sulla on avaimet ja keinot

      Jos haluat jatkaa tutustumista. Itse olen niin jäässä etten pysty tekemään enää mitään. Pidempi keppi johon on helpompi
      Ikävä
      25
      1415
    9. Orpo loukkaantui fasismiin viittaavasta sanavalinnasta

      Mutta miksi loukkaantui? Orpohan on tehnyt yhteistyötä fasistien kanssa jo vuonna 2019, siis jo neljä vuotta ennen loukk
      Maailman menoa
      27
      1368
    10. Kiinnostaa - ei kiinnosta - kiinnostaapas

      Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt
      Sinkut
      127
      1248
    Aihe