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);
}
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);
}
Vastaukset 6
Vanhimmat
Parametrien välitys puuttuu.
Sitä epäilinkin. Mutta miten se toteutetaan käytännössä? Tarvitsisin siihen hieman esimerkkiä.
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ä?
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.