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

213

    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. Kaipaamasi miehen nimi?

      Ja maakunta tai kaupunki?
      Ikävä
      31
      6092
    2. Olit ihan

      Kiihkona silloin. Sen näki ja lähes tunsi. Ei tainnut olla kaukana et olisit vetänyt lähellesi jos siihen olisi hetki tu
      Ikävä
      33
      3633
    3. Oletko keskustellut kaivatustasi muiden

      Kanssa lähiaikoina? Jos, onko keskustelu ollut positiivista tai negatiivista? Vaikuttaako keskustelut mielipiteeseesi ka
      Ikävä
      53
      3562
    4. Ennen ei ollut persuja ja työttömyyttä, lääkäriinkin pääsi

      Ennen oli kaikilla töitä Kauppiaille kelpasi kun saivat voittoa Yritystukia ei ollut Lääkäriin pääsi kaikki haluklaat Nu
      Maailman menoa
      26
      3427
    5. Trump huonommassa kunnossa kuin Usasta virallisesti sanotaan?

      "Terveys on vakaa mutta ei normaali".Uskallan melkein sanoa,että Trumpin terveydentilaa kaunistellaan.Myös se että se nu
      Maailman menoa
      124
      3036
    6. Kyllä on Vasemmistoliitosta Koskelan johdolla tullut todellinen ääripuolue

      se on niin tulipunainen kuin olla voi, ja selvästi haluaa jatkuvasti eripuraa, ja repiä kansaa kahtia. Siinä on jo vuod
      Maailman menoa
      32
      2737
    7. Millaista läheisyyttä

      Toivoisit ikävästi kohteesi kanssa?
      Ikävä
      48
      2598
    8. Antifasismi - mitä se on?

      Se on äärivasemmistolaista anarkistista toimintaa joka käyttää fasisminvastaisuutta keppihevosena oikeuttaakseen toimint
      Maailman menoa
      22
      2419
    9. Suomen veroaste 5 %-yks liian matala

      Palauttamalla kokonaisveroaste 1990-luvun tasolle saadaan hyvinvointivaltion palvelut rahoitettua ilman velan ottoa.
      Maailman menoa
      121
      2392
    10. MTV: Harvinainen haastattelu! Vappu Pimiä kommentoi vihdoinkin uutta TTK-juontajaa

      TTK-juontajaspekuloinnit käyvät edelleen kuumana. Kenet sinä haluaisit uudeksi TTK-juontajaksi? Kommentoi alle! Lue,
      Suomalaiset julkkikset
      14
      2215
    Aihe