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

492

    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. Hengenvaaralliset kiihdytysajot päättyivät karmealla tavalla, kilpailija kuoli

      Onnettomuudesta on aloitettu selvitys. Tapahtuma keskeytettiin onnettomuuteen. Tapahtumaa tutkitaan paikan päällä yhtei
      Kauhava
      165
      6084
    2. Ootko rakastunut?

      Kerro pois nyt
      Ikävä
      147
      1684
    3. Onhan sulla nainen parempi mieli

      Nyt? Ainakin toivon niin.
      Ikävä
      113
      1478
    4. Ujosteletko tosissaan vai mitä oikeen

      Himmailet???? Mitä pelkäät?????
      Ikävä
      51
      1240
    5. Suureksi onneksesi on myönnettävä

      Että olen nyt sitten mennyt rakastumaan sinuun. Ei tässä mitään, olen kärsivällinen ❤️
      Ikävä
      43
      849
    6. Möykkähulluus vaati kuolonuhrin

      Nuori elämä menettiin täysin turhaan tällä järjettömyydellä! Toivottavasti näitä ei enää koskaan nähdä Kauhavalla! 😢
      Kauhava
      28
      824
    7. Älä mies pidä mua pettäjänä

      En petä ketään. Älä mies ajattele niin. Anteeksi että ihastuin suhun varattuna. Pettänyt en ole koskaan ketään vaikka hu
      Ikävä
      91
      785
    8. Reeniähororeeniä

      Helvetillisen vaikeaa työskennellä hoitajana,kun ei kestä silmissään yhtään läskiä. Saati hoitaa sellaista. Mitä tehdä?
      Kouvola
      5
      759
    9. Kävit nainen näemmä mun

      Facessa katsomassa....
      Ikävä
      41
      709
    10. Tarvitsemme lisää maahanmuuttoa.

      Väestö eläköityy, eli tarvitsemme lisää tekeviä käsiä ja veronmaksajia. Ainut ratkaisu löytyy maahanmuutosta. Nimenomaan
      Maailman menoa
      218
      692
    Aihe