Precedente :: Successivo |
Autore |
Messaggio |
Giorgio11 Comune mortale
Registrato: 11/05/19 11:40 Messaggi: 1
|
Inviato: 11 Mag 2019 11:44 Oggetto: Richiesta aiuto |
|
|
Salve sono uno studente universitario alle prime armi con il linguaggio C. Dato che a breve dovrò sostenere un esame stavo cercando di esercitarmi svolgendo un programma in grado di gestire un archivio di un azienda attraverso una lista dinamica che prende i dati dal file. Il programma dovrà avere le funzioni che permettono di inizializzare la lista con i dati del file, stamparla e effettuare qualche ricerca, il mio problema è che quando compilo ed eseguo, provando ad inizializzare la lista il compilatore mi dice "Segmentation falut (core drumped)". Potete aiutarmi? Metto qui sotto i codice
Codice: |
FILE DI HEADER
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LUN 11
#define MAX 10
#define DIM 20
#define CAT 2
typedef struct{
char piva[LUN];
char r_sociale[DIM];
char cognome[DIM];
char nome[DIM];
char tel[MAX];
char fax[MAX];
char email[DIM];
char categoria[CAT];
char acquisti_anno[MAX];
}data;
struct nodo{
data info;
struct nodo *next;
};
typedef struct nodo tlista;
tlista *inizializza (char *, tlista*);
void salva (char *, tlista*);
void stampa_aziende(tlista*);
void stampa_a(tlista*);
tlista *inserisci(tlista*);
void determina_b(tlista*);
|
Codice: |
FILE SORGENTE
#include "data.h"
int main(){
int input;
tlista *p = NULL;
for(;;)
{
printf("----------MENU----------\n");
printf("Scegli qello che vuoi fare.\n");
printf("1) Inizializza la lista.\n");
printf("2) Salva.\n");
printf("3) Visualizzare a schermo RagioneSociale, Cognome, Nome e Tel di tutte le aziende presenti in archivio\n");
printf("4) Visualizzare a schermo RagioneSociale, Cognome, Nome e Tel delle aziendeappartenenti alla categoria 'A'\n");
printf("5) Inserire una nuova azienda\n");
printf("6) Determinare il numero delle aziende che appartengono alla categoria 'B' e che presentano un valore di AcquistiAnno superiore a 100000 €\n");
//printf("7) ");
scanf("%d",&input);
if (input==1){
p=inizializza("archivio.txt",p);
}
else if (input==2){
salva("archivio.txt",p);
}
else if (input==3){
stampa_aziende(p);
}
else if (input==4){
stampa_a(p);
}
else if (input==5){
p=inserisci(p);
}/*
else if (input==6){
determina_b(p);
}*/
else
{
break;
}
}
}
|
Codice: |
FILE SORGENTE IN CUI IMPLEMENTO LE FUNZIONI
#include "data.h"
tlista *inizializza (char *nomefile, tlista *p){
data elem;
tlista *newElem;
FILE *fp;
if((fp=open(nomefile,"r"))!=NULL){
while(fscanf(fp,"%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n\n]\n", elem.piva, &(elem.r_sociale), &(elem.cognome), &(elem.nome), &(elem.tel), &(elem.fax), &(elem.email), &(elem.categoria), &(elem.acquisti_anno))!=EOF){
newElem = (tlista*) malloc (sizeof(tlista));
newElem->info = elem;
newElem->next = p;
p = newElem;
}
}else{
printf("Errore nell'apertura del file.");
}
fclose(fp);
return p;
}
void salva (char *nomefile, tlista *p){
FILE *fp=open(nomefile,"w");
while(p!=NULL){
fprintf(fp,"%s\n,%s\n,%s\n,%s\n,%s\n,%s\n,%s\n,%s\n,%s\n", p->info.piva, p->info.r_sociale, p->info.cognome, p->info.nome, p->info.tel, p->info.fax, p->info.email, p->info.categoria, p->info.acquisti_anno);
p=p->next;
}
fflush(fp);
fclose(fp);
return;
}
void stampa_aziende(tlista *p){
if (p==NULL){
printf("Lista vuota.\n");
}else{
while(p!=NULL){
printf("%s\n,%s\n,%s\n,%s\n",p->info.r_sociale, p->info.cognome, p->info.nome, p->info.tel);
p=p->next;
}
}
}
void stampa_a(tlista *p){
if (p==NULL){
printf("Lista vuota.\n");
}else{
while (p!=NULL){
if (p->info.categoria=="A"){
printf("%s\n,%s\n,%s\n,%s\n", p->info.r_sociale, p->info.cognome, p->info.nome, p->info.tel);
p=p->next;
}
}
}
}
tlista *inserisci(tlista *p){
data agg;
char piva[LUN];
char r_sociale[DIM];
char cognome[DIM];
char nome[DIM];
char tel[MAX];
char fax[MAX];
char email[DIM];
char categoria[CAT];
char acquisti_anno[MAX];
tlista *p2 = NULL;
printf("Inserisci le info del cliente");
printf("Inserisci la piva");
scanf("\n%[^\n]", piva);
strcpy(agg.piva,piva);
printf("Inserisci la ragione sociale");
scanf("\n%[^\n]", r_sociale);
strcpy(agg.r_sociale, r_sociale);
printf("Inserisci il cognome");
scanf("\n%[^\n]", cognome);
strcpy(agg.cognome, cognome);
printf("Inserisci il nome");
scanf("\n%[^\n]", nome);
strcpy(agg.nome, nome);
printf("Inserisci il numero di telefono");
scanf("\n%[^\n]", tel);
strcpy(agg.tel, tel);
printf("Inserisci il fax");
scanf("\n%[^\n]", fax);
strcpy(agg.fax, fax);
printf("Inserisci l'email");
scanf("\n%[^\n]", email);
strcpy(agg.email, email);
printf("Inserisci la categoria");
scanf("\n%[^\n]", categoria);
strcpy(agg.categoria, categoria);
printf("Inserisci gli acquisti annuali");
scanf("\n%[^\n]", acquisti_anno);
strcpy(agg.acquisti_anno, acquisti_anno);
if (p!=NULL){
p2=(tlista*)malloc(sizeof(tlista));
p2->info=agg;
p2->next=p;
}else{
p=(tlista*)malloc(sizeof(tlista));
p->next=NULL;
p2=p;
}
return p2;
}
FILE archivio.txt
12345678901
Running s.n.c.
Russo
Salvatore
0901234567
0901231234
info@running.it
A
8500
12345678901
Happening s.r.l.
Todaro
Mario
021234567
021231234
info@happening.com
B
22750
|
|
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11575 Residenza: Tokelau
|
Inviato: 13 Mag 2019 11:01 Oggetto: |
|
|
il segmentation fault indica che si è tentato di leggere o scrivere in una locazione della memoria che non è stata dedicata al programma - il sistema operativo interviene 'uccidendo' il programma che non si comporta come deve.
dato che a quanto dici l'errore si verifica quando inizializzi la lista, allora l'errore va cercato nel codice della funzione inizializza()
un consiglio che mi sento di darti è di non dare lo stesso nome a variabili locali e globali altrimenti l'errore è dietro l'angolo
in ogni caso probabilmente il tuo problema qui sta solo nel fatto che nella fscanf hai indicato il valore di una variabile [elem.piva] invece che il suo indirizzo, cercando quindi di andare a scrivere invece che *nella* variabile, all'indirizzo puntato dal suo valore |
|
Top |
|
|
|
|
Non puoi inserire nuovi argomenti Non puoi rispondere a nessun argomento Non puoi modificare i tuoi messaggi Non puoi cancellare i tuoi messaggi Non puoi votare nei sondaggi
|
|