Hankalia bugeja ohjelmassa

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);
         
   }
6468
Äänestä

Muut lukivat myös

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. :)

Äänestä

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.

Äänestä

#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

Äänestä
  • Miksi laittaa muuttjat

    static tapaus taulu1[MAXIM];
    int valinta;

    aivan turhaan globaaleiksi?

    Äänestä

  • muuttujat kirjoitti:

    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ä.

    Äänestä

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..

Äänestä

Kommentoi aloitusta


Bugijahti kirjoitti:

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);
         
   }

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