Errore di segmentazione

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

Errore di segmentazione

Messaggioda piercy » mercoledì 15 maggio 2019, 15:53

Ciao a tutti, non riesco a capire il problema di questo programma, compila perfettamente ma all'esecuzione dà errore di segmentazione. Grazie mille in anticipo.

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct farmaco{
   char nome[21];
   int data_scadenza;
   int disponibilita;
   float prezzo;
   struct farmaco *next;
} farmaco;

void stampa_farmaci(farmaco*);
void stampa_farmaci_disponibili(farmaco*);
void acquista_farmaco(farmaco*);
farmaco *inserisci_farmaco(farmaco*);
farmaco* elimina_farmaci_indisponibili(farmaco*);

farmaco *inizializza_lista_da_file(farmaco *head){
   farmaco *tmp = head;
   FILE *fp = fopen("farmaci.txt","r");
   if (fp==NULL){
      printf("Errore nell'apertura del file\n");
      return head;
   }
   else{
      while(fscanf(fp,"%s%d%d%f",tmp->nome, &(tmp->data_scadenza), &(tmp->disponibilita), &(tmp->prezzo))!=EOF){
         tmp=tmp->next;
      }
   tmp->next=NULL;
   return head;
   }
}


void main(){
   farmaco *head = NULL;
   int scelta;
   head = inizializza_lista_da_file(head);
   printf("MENU GESTIONE FARMACIA\n\n\n");
   do{
      printf("Digita l'opzione desiderata:\n1. Stampa tutti i farmaci\n2. Stampa tutti i farmaci disponibili\n3. Acquista uno o piu farmaci\n4. Inserisci nuovo farmaco\n5. Elimina farmaci scaduti o terminati\n6. Esci\n\n");
      scanf("%d",&scelta);
      switch (scelta){
         case 1: stampa_farmaci(head);
            break;
         case 2: stampa_farmaci_disponibili(head);
            break;
         case 3: acquista_farmaco(head);
            break;
         case 4: head=inserisci_farmaco(head);
            break;
         case 5: head=elimina_farmaci_indisponibili(head);
            break;
         case 6: printf("Arrivederci\n");
            exit(0);
         default: printf("Scelta non valida\n");
            break;
      }
   }
   while(scelta!=6);
}
      





void stampa_farmaci(farmaco *head){
   farmaco *tmp = head;
   printf("Lista farmaci:\n\n");
   if (tmp==NULL){
      printf("Vuota\n");
   }
   while (tmp!=NULL){
      printf("%s\t%d\t%d\t%f\n",tmp->nome, tmp->data_scadenza, tmp->disponibilita, tmp->prezzo);
      tmp=tmp->next;
   }
}   




void stampa_farmaci_disponibili(farmaco *head){
   farmaco *tmp = head;
   printf("Lista farmaci disponibili:\n\n");
   if (tmp==NULL){
      printf("Vuota\n");
   }
   while (tmp!=NULL){
      if ((tmp->disponibilita)>0){
         printf("%s\t%d\t%d\t%f\n",tmp->nome, tmp->data_scadenza, tmp->disponibilita, tmp->prezzo);
      }
   tmp=tmp->next;
   }
}



void acquista_farmaco(farmaco *head){
   char nome_farmaco[21];
   int quantita;
   float prezzo;
   stampa_farmaci_disponibili(head);
   printf("Quale farmaco vuoi acquistare?\n");
   scanf("%s",nome_farmaco);
   printf("Quante scatole?\n");
   scanf("%d",&quantita);
   farmaco *tmp = head;
   while (tmp!=NULL){
      if (strcmp(nome_farmaco,tmp->nome)==0){
         if (tmp->data_scadenza>20190515){
            if (tmp->disponibilita>=quantita){
               printf("Acquisto confermato!\n");
               tmp->disponibilita=(tmp->disponibilita)-quantita;
               prezzo = quantita*(tmp->prezzo);
               printf("Il prezzo e' di %f euro\n",prezzo);
               return;
            }
            else{
               printf("Non ci sono abbastanza scatole in magazzino\n");
               return;
            }
         }
         else{
            printf("Il farmaco scelto è scaduto\n");
            return;
         }
      }
      else{
         printf("Il farmaco non e' presente in magazzino\n");
         return;
      }
   tmp=tmp->next;
   }
}




farmaco *inserisci_farmaco(farmaco *head){
   char nome_farmaco[21];
   int quantita;
   printf("Che farmaco vuoi inserire?\n");
   scanf("%s",nome_farmaco);
   printf("Quante scatole?\n");
   scanf("%d",&quantita);
   farmaco *tmp = head;
   while (tmp!=NULL){
      if (strcmp(tmp->nome,nome_farmaco)==0){
         printf("Farmaco gia' presente in lista\n");
         printf("Aggiorno la disponibilita'.\n");
         tmp->disponibilita+=quantita;
         return head;
      }
      else{
         farmaco *nuovo = (farmaco*)malloc(sizeof(farmaco));
         strcpy(nuovo->nome, nome_farmaco);
         nuovo->disponibilita=quantita;
         printf("Inserisci la scadenza nel formato aaaammgg\n"),
         scanf("%d",&(nuovo->data_scadenza));
         printf("Inserisci il prezzo\n");
         scanf("%f",&(nuovo->prezzo));
         nuovo->next=head;
         head=nuovo;
         printf("Farmaco inserito correttamente\n");
         return head;
      }
   tmp=tmp->next;
   }
}




farmaco *elimina_farmaci_indisponibili(farmaco *head){
   printf("Eliminazione in corso dei farmaci indisponibili..\n");
   farmaco *tmp = head;
   farmaco *succ =head->next;
   while (succ!=NULL){
      if ((succ->disponibilita)<=0||(succ->data_scadenza)<20190515){
         tmp=succ->next;
         free(succ);
         return head;
      }
   tmp=tmp->next;
   succ=succ->next;
   }
   return head;
}
Ultima modifica di piercy il mercoledì 15 maggio 2019, 16:07, modificato 1 volta in totale.
piercy
Prode Principiante
 
Messaggi: 2
Iscrizione: maggio 2019
Desktop: default
Distribuzione: Zorin OS 12.4 64bit
Sesso: Maschile

Re: Errore di segmentazione

Messaggioda giulux » mercoledì 15 maggio 2019, 16:05

Benvenuto nel forum!

Inseriti come hai fatto i listati rendono il post troppo lungo e di difficile lettura.
In futuro Incollali tra i tag [ code] e [ /code] che si creano cliccando suCodice in alto, sopra la finestra di scrittura (editor completo) così:
    [ code]listato
    da postare
    [ /code]

Correggi il post precedente cliccando su "modifica", poi seleziona il listato, clicca su Codice e salva

Ciao
con l'aiuto della comunità le cose si mettono quasi sempre a posto (e non apposto), a parte (e non apparte) qualche caso ...
Avatar utente
giulux
Amministratore
Amministratore
 
Messaggi: 22577
Iscrizione: gennaio 2010
Località: Roma
Desktop: xubuntu - ubuntu 18.04
Distribuzione: Ubuntu+Xubuntu 18.04.2 LTS x86_64
Sesso: Maschile

Re: Errore di segmentazione

Messaggioda piercy » mercoledì 15 maggio 2019, 16:08

Ok, grazie della dritta

Ciao
piercy
Prode Principiante
 
Messaggi: 2
Iscrizione: maggio 2019
Desktop: default
Distribuzione: Zorin OS 12.4 64bit
Sesso: Maschile


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 7 ospiti