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

463

    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. Aivosyöpää sairastava Olga Temonen TV:ssä - Viimeinen Perjantai-keskusteluohjelma ulos

      Näyttelijä-yrittäjä Olga Temonen sairastaa neljännen asteen glioomaa eli aivosyöpää, jota ei ole mahdollista leikata. Hä
      Maailman menoa
      91
      2920
    2. Pelotelkaa niin paljon kuin sielu sietää.

      Mutta ei mene perille asti. Miksi Venäjä hyökkäisi Suomeen? No, tottahan se tietenkin on jos Suomi joka ei ole edes soda
      Maailman menoa
      299
      1686
    3. Mikä saa ihmisen tekemään tällaista?

      Onko se huomatuksi tulemisen tarve tosiaan niin iso tarve, että nuoruuttaan ja tietämättömyyttään pilataan loppuelämä?
      Sinkut
      246
      1567
    4. Minkä merkkisellä

      Autolla kaivattusi ajaa? Mies jota kaipaan ajaa Mersulla.
      Ikävä
      87
      1391
    5. IL - VARUSMIEHIÄ lähetetään jatkossa NATO-tehtäviin ulkomaille!

      Suomen puolustuksen uudet linjaukset: Varusmiehiä suunnitellaan Nato-tehtäviin Puolustusministeri Antti Häkkänen esittel
      Maailman menoa
      402
      1384
    6. Nyt kun Pride on ohi 3.0

      Edelliset kaksi ketjua tuli täyteen. Pidetään siis edelleen tämä asia esillä. Raamattu opettaa johdonmukaisesti, että
      Luterilaisuus
      402
      1308
    7. Kiitos nainen

      Kuitenkin. Olet sitten ajanmerkkinä. Tuskin enää sinua näen ja huomasitko, että olit siinä viimeisen kerran samassa paik
      Tunteet
      2
      1089
    8. Esko Eerikäinen tatuoi kasvoihinsa rakkaan nimen - Kärkäs kommentti "Ritvasta" lävähti somessa

      Ohhoh! Esko Eerikäinen on ottanut uuden tatuoinnin. Kyseessä ei ole mikä tahansa kuva minne tahansa, vaan Eerikäisen tat
      Suomalaiset julkkikset
      38
      1047
    9. Hyväksytkö sinä sen että päättäjämme ei rakenna rauhaa Venäjän kanssa?

      Vielä kun sota ehkäpä voitaisiin välttää rauhanponnisteluilla niin millä verukkeella voidaan sanoa että on hyvä asia kun
      Maailman menoa
      329
      874
    10. Miksi Purra-graffiti ei nyt olekkaan naisvihaa?

      "Pohtikaapa reaktiota, jos vastaava graffiti olisi tehty Sanna Marinista", kysyy Tere Sammallahti. Helsingin Suvilahden
      Maailman menoa
      257
      855
    Aihe