Olen kamppaillut pitkän aikaa seuraavan ongelman kanssa. Ohjelman pitäisi tulostaa 23 ja 59, mutta se tulostaa -1208036992 ja -1208307724. Ongelmanratkasua vaikeuttaa se ettei tota mainin koodia näytetä. Mikä tässä menee pieleen?
void checkTime(int *h, int *m) { int hours, minutes; h = &hours; m = &minutes; scanf("%d ", &hours); scanf("%d", &minutes); while((hours < 0) || (hours > 23) || (minutes < 0) || (minutes > 59)){ printf("Error, not a correct time."); printf("\nEnter the time: "); scanf("%d ", &hours); scanf("%d", &minutes); } }
Kun koodin suoritus palaa checkTime()-funktiosta sinne mistä sitä kutsuttiin, paikalliset muuttujat hours
ja minutes
lakkaavat olemasta. Älä aseta muuttujia h
ja m
osoittamaan niihin, vaan tallenna arvot suoraan muistipaikkoihin *h
ja *m
. Voit tehdä sen funktion lopussa näin:
*h = hours; *m = minutes;
Kiitos! Pienien korjailujen jälkeen järkevimmältä vaikutti tämä.
void checkTime(int *h, int *m) { int hours, minutes; while((hours < 0) || (hours > 23) || (minutes < 0) || (minutes > 59)){ scanf("%d %d", &hours, &minutes); printf("Error, not a correct time."); printf("\nEnter the time: "); *h = hours; *m = minutes; } }
Esimerkkivastauksesa oli vähän eroa.
while (!(((0<=*h)&&(*h<24))&&((0<=*m)&&(*m<60)))) { while(getchar()!='\n'); printf("Error, not a correct time.\n"); printf("Enter the time: "); scanf("%d %d",h,m); }
Testaatko koodeja ollenkaan itse, vai syötätkö niitä sokeasti Viopeen? Nykyinen koodisi toimii aivan väärin: se tulosta virheilmoituksen aina, myös oikean kellonajan jälkeen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.