Muistinvaraus muuttujan arvolla

Ohjelmoijan poikanen

Osaisiko joku kokenut C-ohjelmoija kertoa, meneekö tämä näin?

Tarkoitukseni olisi toteuttaa juoksevan tekstin näyttö, johon käyttäjä voi syöttää oman tekstin ja sille ohjelma, jossa käyttäjä ensiksi valitsee, kuinka pitkän tekstin hän haluaa kirjoittaa.

Tätä varten hän antaa ohjelmalle luvun, joka ilmaisee käyttäjälle tekstissä olevien merkkien määrää. Samalla se tarkoittaa alkioiden määrää yksiulotteisessa taulukossa, joka luodaan tämän jälkeen.

Koodina tämä menisi seuraavalla tavalla: (esimerkissä kokonaisluku 10 tarkoittaa käyttäjän antamaa arvoa)


funktio(10); // Kutsutaan funktiota, johon viedään käyttäjän antama luku

unsigned char luku;

luku = 10;

funktio(luku);

void funktio(char arvo)
{
char taulukko[arvo];
}

Onko tämän jälkeen käytössä taulukko-niminen taulukko, josta löytyy määrätty lukumäärä alkioita?
Tämä meni kääntäjästäni läpi, joskin varoituksen sain, ettei taulukkoa vielä käytetä, mutta ymmärtääkö kääntäjä tuon noin, että taulukkoon luodaan funktion vastaanottaman luvun verran alkioita?

4

224

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Ohjelmoijan poikanen

      Pieni kömmähdys: Ensimmäisen koodirivin, eli funktion kutsun tuossa vaiheessa, voi jättää huomiotta.

    • Mika++

      Kiva pitkästä aikaa fiilistellä C :lla. Yhtään en tiedä toimiiko. Kai sulla on C käytössä?

      void funktio (int iPituus)
      {
      char *cTeksti;

      cTeksti = new char[iPituus 1];
      ...
      delete [] cTeksti;
      }

    • koodimies++

      Tuo Mika :n vastaus on C :aa, ei toimi C-kääntäjällä.

      Muutenkin muutamia ongelmia tuossa alkuperäisessä koodissa:
      1. taulukko on määriteltynä vain funktion sisällä, muuttuja tuhotaan kun funktio päättyy, eikä sitä voi käyttää sen ulkopuolella. Tämä siksi, että muuttuja määritellään funktion sisällä.
      2. Ajonaikana muistia varataan malloc-kutsulla. Tämä siksi, koska muuttujan koko ei ole tiedossa etukäteen, joten kääntäjä ei voi sitä tehdä.
      3. Char on merkki, int sopii paremmin lukuarvon tallentamiseen.
      4. C:ssä merkkijono loppuu aina \0 -merkkiin, siksi tilaa on varattava yksi tavu (char) enemmän kuin merkkejä on tarkoitus antaa.

      Alla pieni esimerkki:


      #include
      #include

      void luoTaulukko(int); //funktion esittely

      char* taulukko; //globaali taulukkomuuttuja,
      // käytössä sekä main-funktiossa että luoTaulukko-funktiossa

      int main(void){

      int merkit;
      printf("Anna merkkien lkm: \n");
      scanf("%d", &merkit); //lukee käyttäjältä merkkien määrän

      luoTaulukko(merkit);

      printf("Anna %d merkkiä: \n", merkit);
      while(getc(stdin) != '\n'); //tyhjentää puskurin
      fgets(taulukko, merkit 1, stdin);
      //luetaan merkkijono, max käyttäjän antama merkkien määrä

      puts(taulukko); //tulostetaan taulukko, puts tulostaa merkkijonon

      free(taulukko); //vapautetaan varattu muisti

      }

      void luoTaulukko(int lkm){

      taulukko = malloc((lkm 1));
      //varataan muistia merkkien määrä nollamerkillekin tilaa

      }

      • koodimies++

        Esimerkin ensimmäiset rivit pitäisi olla:

        #include
        #include


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

    Luetuimmat keskustelut

    1. S-kauppa nosti hintoja, K-kauppa laski

      Elintarvikkeiden arvonlisävero laski vuodenvaihteessa 13,5 prosenttiin. S-kauppa siirsi alennuksen suoraan katteisiin pi
      Maailman menoa
      161
      7553
    2. Hiihtäjä Vilma Nissisen kommentit aiheutti paniikkia

      ja hernettä vedettiin nenään. Nissinen kertoi torstaina haastattelussa, kun häneltä kysyttiin, että tykkääkö hän hiihtä
      Maailman menoa
      130
      5189
    3. Huuto yltyy persujen piirissä Venezuelan johdosta.

      Kohta kakofonia yltyy kun persut tajuavat mitä Venezuelassa tapahtui. Von den Leydenki jo kipuilee kuten persut EU:ssa y
      Maailman menoa
      43
      2680
    4. Koska mennään retkeilemään?

      pusi pusi 😗
      Ikävä
      269
      2305
    5. Nyt ottaa persua pattiin: sähköauto joulukuun myydyin

      🤣 prööt prööt pakoputkellaan pörisevää persua ottaa nyt saamaristi pattiin, kun paristoilla kulkeva sähköauto on noussu
      Maailman menoa
      81
      2218
    6. Ovatko Perussuomalaiset kommunisteja?

      Toiset sanovat että ovat, toiset sanovat että eivät. Ainakin heillä on paljon sen aatteen piirteitä, koska haluavat kont
      Maailman menoa
      67
      2078
    7. Yhdysvaltain hyökkäys Venezuelaan on YK:n peruskirjan mukaan laiton hyökkäyssota

      Oman sävynsä tähän tuo vielä se, että hyökkäys kohdistettiin nimenomaan valtiojohtoa vastaan. Toki, kun tavoitteena on v
      Maailman menoa
      567
      2065
    8. Ei tule uni

      Kuten epäilin. Onneksi viime yön sain ihan hyvin nukutuksi. Tiesin kyllä, ettei tästä mitään tänään tule.
      Ikävä
      57
      1116
    9. Miksi juuri Venezuela?

      Kaikista maailman valtioista Trump otti silmätikukseen Venezuelan. Mutta minkä ihmeen takia? Kyseessä on kuitenkin vähäp
      Maailman menoa
      291
      1077
    10. Laittaisin whatsuppissa viestin

      Jos olisin täysin varma että se on toivottua vielä kun aikaa on mennyt ja että toivot sitä edelleen.
      Ikävä
      66
      1065
    Aihe