Oheisessa ohjelmassa on jokin vika, jota en ole löytänyt. Ohjelmassa syötetään tietuetaulukkoon tietoja, kunnes MAXIM -vakion osoittama määrä tapahtumia tulee täyteen.
Ensimmäisen kierroksen aikana kaikki näyttää menevän mukavasti, mutta toisen kierroksen alussa viat alkavat näkyä. Vikoja on kaksi kappaletta:
1. Ensimmäisen kierroksen lopussa ohjelma kysyy rahasummaa, minkä jälkeen se enterin painalluksella hyppää seuraavalla kierroksella päivämäärän kysymisen yli suoraan kuukautta kysymään. Se tosin tulostaa kyselyrivin näytölle, mutta sille ei voi syöttää mitään.
2. Toisen kierroksen jälkeen, riippumatta mikä on maksimivakion arvo, ohjelma yksinkertaisesti lopettaa ja tulostaa valikon kaksi kertaa.
Mistä tuollaiset bugit voivat johtua? Menee itseltä yli hilseen.
#include
#define MAXIM 3
typedef struct tapaus
{
int pv;
int kk;
int vuosi;
char tapahtuma[20];
double summa;
}tapaus;
static struct tapaus taulu1[MAXIM];
int valinta; /*Käynnistää valikon*/
void (tapaus taulu1[MAXIM]);
void main(void)
{
while(valinta != -999)
{
printf("Valitse vaihtoehto\n");
printf("1. Tiedonkeruu 2.Tallennus -999 lopeta\n");
scanf("%d", & valinta);
switch(valinta)
{
case 1:
tiedonkeruu(taulu1);
break;
case -999:
break;
default:
printf("Valitse listasta");
}
}
}
void
tiedonkeruu(tapaht taulu1[])
{
int i;
for(i = 1; i < MAXIM; i )
{
printf("Viikonpaiva? : \n\n");
scanf("%d", & taulu1[i].pv);
printf("Kuukausi? :\n\n");
scanf("%d", & taulu1[i].kk);
printf("Vuosi? :\n\n");
scanf("%d", & taulu1[i].vuosi);
printf("Tapahtuma? :\n\n");
scanf("%s", taulu1[i].tapahtuma);
printf("Kulutettu raha?\n\n");
scanf("%.lf", & taulu1[i].summa);
}
Ensimmäisen kierroksen aikana kaikki näyttää menevän mukavasti, mutta toisen kierroksen alussa viat alkavat näkyä. Vikoja on kaksi kappaletta:
1. Ensimmäisen kierroksen lopussa ohjelma kysyy rahasummaa, minkä jälkeen se enterin painalluksella hyppää seuraavalla kierroksella päivämäärän kysymisen yli suoraan kuukautta kysymään. Se tosin tulostaa kyselyrivin näytölle, mutta sille ei voi syöttää mitään.
2. Toisen kierroksen jälkeen, riippumatta mikä on maksimivakion arvo, ohjelma yksinkertaisesti lopettaa ja tulostaa valikon kaksi kertaa.
Mistä tuollaiset bugit voivat johtua? Menee itseltä yli hilseen.
#include
#define MAXIM 3
typedef struct tapaus
{
int pv;
int kk;
int vuosi;
char tapahtuma[20];
double summa;
}tapaus;
static struct tapaus taulu1[MAXIM];
int valinta; /*Käynnistää valikon*/
void (tapaus taulu1[MAXIM]);
void main(void)
{
while(valinta != -999)
{
printf("Valitse vaihtoehto\n");
printf("1. Tiedonkeruu 2.Tallennus -999 lopeta\n");
scanf("%d", & valinta);
switch(valinta)
{
case 1:
tiedonkeruu(taulu1);
break;
case -999:
break;
default:
printf("Valitse listasta");
}
}
}
void
tiedonkeruu(tapaht taulu1[])
{
int i;
for(i = 1; i < MAXIM; i )
{
printf("Viikonpaiva? : \n\n");
scanf("%d", & taulu1[i].pv);
printf("Kuukausi? :\n\n");
scanf("%d", & taulu1[i].kk);
printf("Vuosi? :\n\n");
scanf("%d", & taulu1[i].vuosi);
printf("Tapahtuma? :\n\n");
scanf("%s", taulu1[i].tapahtuma);
printf("Kulutettu raha?\n\n");
scanf("%.lf", & taulu1[i].summa);
}
Vastaukset 6
Vanhimmat
Vielä sellainen havainto, että tämän kulutettua rahaa kysyvän lauseen:
printf("Kulutettu raha?\n\n");
scanf("%.lf", & taulu1[i].summa);
siirtäminen mihin tahansa toiseen kohtaan aiheuttaa siitä seuraavaksi tulevan kohdan ylihypyn. Haluaisin luonnollisesti saada koko aiotun syöttökierroksen tulokset tuonne tiedostotaulukkoon. Jos tuon jättää pois, silmukka näyttää toimivan normaalisti.
Tosi hienoa jos joku osaa auttaa tuon korjaamisessa. :)
static struct tapaus taulu1[MAXIM];
tarkoitatko
static tapaus taulu1[MAXIM];
void (tapaus taulu1[MAXIM]);
tarkoitatko
void tiedonkeruu(tapaus x);
tapaht muuttujatyyppi määrittelemätön. ym.
Kääntäjä kyllä antaa kaikista noista virheilmoituksia.
#include
#include
#define MAXIM 3
typedef struct deftapaus {
int pv;
int kk;
int vuosi;
char tapahtuma[20];
double summa;
} tapaus;
static tapaus taulu1[MAXIM];
int valinta; //Käynnistää valikon
void tiedonkeruu(tapaus taulu1[]);
int main(void)
{
while(valinta != -999) {
printf("Valitse vaihtoehto\n");
printf("1. Tiedonkeruu 2.Tallennus -999 lopeta\n");
scanf("%d", &valinta);
switch(valinta) {
case 1:
tiedonkeruu(taulu1);
break;
case -999:
break;
default:
printf("Valitse listasta");
}
}
return 0;
}
void tiedonkeruu(tapaus taulu1[])
{
int i,j;
char arvo[16],c,*pc;
for(i = 0; i < MAXIM; ++i) {
printf("Viikonpaiva? :\t");
scanf("%d", &taulu1[i].pv);
printf("Kuukausi? :\t");
scanf("%d", &taulu1[i].kk);
printf("Vuosi? :\t");
scanf("%d", &taulu1[i].vuosi);
printf("Tapahtuma? :\t");
scanf("%s", taulu1[i].tapahtuma);
while((c=getchar())!=EOF&&c!='\n');
printf("Kulutettu raha? :\t");
for(pc=arvo,j=0;(c=getchar())!=EOF&&c!='\n'&&j
Miksi laittaa muuttjat
static tapaus taulu1[MAXIM];
int valinta;
aivan turhaan globaaleiksi?
laitttanut mitään globaliksi, mutta noin pienessä "ohjelmassa" on aika yhdentekevää baikka laittaisi kaikki muuttujat globaleiksi.
Virheensietokyky ei parane, debyuggaus ei helpotu...
Todennäköisesti on vain korjattu alkuperäistä koodia, jonka perusrakenne muutenkin on aika perseestä.
for(i = 1; i < MAXIM; i++)
pitäisi kai olla
for(i = 0; i < MAXIM; i++)
int valinta on alustamaton muuttuja
kikkailua
scanf("%d\r",...
voi auttaa..