C-ohjelmointi apua

Tein yksikertaisen C-kielisen ohjelman. Voisiko joku hieman auttaa, kun ohjelma ei toimi aivan niin kuin pitäisi? Ohjelmassa on funktio, jossa käyttäjältä kysytään kaksi lukua. Miten nuo luvut saa tuolta funktiosta palautettua pääohjelmaan siten, että ohjelma tulostaa luvut oikein?

Joo tiedän, voisin toteuttaa noin lyhyen ohjelman kokonaan pääohjelmana, mutta haluan oppia funktioidenkin käyttöä, joten siksi tein noin.

Voisiko joku korjata tuota minun virheellistä koodiani? Tai no, ohjelmahan kyllä periaatteessa toimii, mutta kun se ei toimi oikein. Kiitos avusta.

Ohjelman tulostus näyttää tältä (virheellinen tulostus).

Anna ensimmäinen luku
1
Anna toinen luku
2
Ensimmainen luku on 25
Toinen luku on 2147348480

Ohjelmani lähdekoodi

#include


int syotaLuvut(void);

int main(void)
{

int luku1;
int luku2;

syotaLuvut();

printf("Ensimmäinen luku on %d \n", luku1);
printf("Toinen luku on %d \n", luku2);

return 0;

}

int syotaLuvut(void)
{

int luku1;
int luku2;
printf("Anna ensimmäinen luku \n");
scanf("%d", &luku1);
printf("Anna toinen luku \n");
scanf("%d", &luku2);
}
695
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

Parametrien välitys puuttuu.

Äänestä
  • Sitä epäilinkin. Mutta miten se toteutetaan käytännössä? Tarvitsisin siihen hieman esimerkkiä.

    Äänestä

  • C-aloittelija kirjoitti:

    Sitä epäilinkin. Mutta miten se toteutetaan käytännössä? Tarvitsisin siihen hieman esimerkkiä.

    int syotaLuvut (int*luku1, int*luku2)
    {
    ...
    }

    Äänestä

  • 09s0f9j kirjoitti:

    int syotaLuvut (int*luku1, int*luku2)
    {
    ...
    }

    Muokkasin ohjelmakoodia seuraavanlaiseksi:

    #include

    int syotaLuvut(int luku1, int luku2);

    int main(void)
    {

    int luku1;
    int luku2;

    syotaLuvut(luku1, luku2);

    printf("Ensimmäinen luku on %d \n", luku1);
    printf("Toinen luku on %d \n", luku2);

    return 0;

    }

    int syotaLuvut(int luku1, int luku2)
    {

    printf("Anna ensimmäinen luku \n");
    scanf("%d", &luku1);
    printf("Anna toinen luku \n");
    scanf("%d", &luku2);
    }

    Mutta vieläkin tulostaa ihmeellisiä lopputuloksia? Mikä on pielessä?

    Äänestä

  • C-aloittelija kirjoitti:

    Muokkasin ohjelmakoodia seuraavanlaiseksi:

    #include

    int syotaLuvut(int luku1, int luku2);

    int main(void)
    {

    int luku1;
    int luku2;

    syotaLuvut(luku1, luku2);

    printf("Ensimmäinen luku on %d \n", luku1);
    printf("Toinen luku on %d \n", luku2);

    return 0;

    }

    int syotaLuvut(int luku1, int luku2)
    {

    printf("Anna ensimmäinen luku \n");
    scanf("%d", &luku1);
    printf("Anna toinen luku \n");
    scanf("%d", &luku2);
    }

    Mutta vieläkin tulostaa ihmeellisiä lopputuloksia? Mikä on pielessä?

    1. Kun pääohjelmassa on luku1 ja luku2, aliohjelmalle pitää antaa niiden osoite (pointteri), että aliohjelma voi kirjoittaa tiedon niihin. Nyt tieto ei siirry aliohjelmasta pääohjelmaan, aliohjelman parametrit näkyy vain aliohjelmassa (no, yhden luvun voisit palauttaa käyttämällä return luku1).

    Eli pääohjelmaan..

    syotaLuvut(&luku1, &luku2);

    2. Aliohjelman scanfia pitää muuttaa, parametri on nyt pointteri eli & siitä pois:
    -aliohjelman parametrinimet voisi myös olla erinimisiä kuin luku1 ja luku2 että ei sekoita ajatusta, mitä käsitellään: Esim luku1ptr tai luku1osoite

    Eli aliohjelmaan

    int syotaLuvut (int *luku1ptr, int *luku2ptr){

    scanf("%d", luku1ptr);
    ..
    }

    näin tieto menee luku1-muistipaikkaan eikä luku1-pinoparametriin mistä pääohjelma ei sitä näe, kuten yllä

    Äänestä

  • c-ccp kirjoitti:

    1. Kun pääohjelmassa on luku1 ja luku2, aliohjelmalle pitää antaa niiden osoite (pointteri), että aliohjelma voi kirjoittaa tiedon niihin. Nyt tieto ei siirry aliohjelmasta pääohjelmaan, aliohjelman parametrit näkyy vain aliohjelmassa (no, yhden luvun voisit palauttaa käyttämällä return luku1).

    Eli pääohjelmaan..

    syotaLuvut(&luku1, &luku2);

    2. Aliohjelman scanfia pitää muuttaa, parametri on nyt pointteri eli & siitä pois:
    -aliohjelman parametrinimet voisi myös olla erinimisiä kuin luku1 ja luku2 että ei sekoita ajatusta, mitä käsitellään: Esim luku1ptr tai luku1osoite

    Eli aliohjelmaan

    int syotaLuvut (int *luku1ptr, int *luku2ptr){

    scanf("%d", luku1ptr);
    ..
    }

    näin tieto menee luku1-muistipaikkaan eikä luku1-pinoparametriin mistä pääohjelma ei sitä näe, kuten yllä

    Tattis. Kiitos. Nyt toimii.

    Äänestä

Kommentoi aloitusta


C-aloittelija kirjoitti:

Tein yksikertaisen C-kielisen ohjelman. Voisiko joku hieman auttaa, kun ohjelma ei toimi aivan niin kuin pitäisi? Ohjelmassa on funktio, jossa käyttäjältä kysytään kaksi lukua. Miten nuo luvut saa tuolta funktiosta palautettua pääohjelmaan siten, että ohjelma tulostaa luvut oikein?

Joo tiedän, voisin toteuttaa noin lyhyen ohjelman kokonaan pääohjelmana, mutta haluan oppia funktioidenkin käyttöä, joten siksi tein noin.

Voisiko joku korjata tuota minun virheellistä koodiani? Tai no, ohjelmahan kyllä periaatteessa toimii, mutta kun se ei toimi oikein. Kiitos avusta.

Ohjelman tulostus näyttää tältä (virheellinen tulostus).

Anna ensimmäinen luku
1
Anna toinen luku
2
Ensimmainen luku on 25
Toinen luku on 2147348480

Ohjelmani lähdekoodi

#include


int syotaLuvut(void);

int main(void)
{

int luku1;
int luku2;

syotaLuvut();

printf("Ensimmäinen luku on %d \n", luku1);
printf("Toinen luku on %d \n", luku2);

return 0;

}

int syotaLuvut(void)
{

int luku1;
int luku2;
printf("Anna ensimmäinen luku \n");
scanf("%d", &luku1);
printf("Anna toinen luku \n");
scanf("%d", &luku2);
}

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu