Salve a tutti, sono nuovo quindi chiedo scusa se ho sbagliato qualcosa nel postare questa richiesta.
il programma allegato non ha errori in compilazione ma ritorna -1073741510 e non crea il file, i problemi nascono dalla funzione cerca e da quella inserisci_coda.
Questo e il testo della prova:
Leggere dal file centraline.txt i dati relativi a centraline di rilevamento di dati ambientali e costruire una lista di centraline. I dati sono: identificativo della centralina, luogo in cui si trova, ente responsabile della gestione e relativo numero di telefono.
Leggere dal file dati.txt i dati rilevati dalle centraline di cui sopra (data, temperatura, umidita' relativa, CO2, PM10) ed associarli alle centraline stesse. Nella struttura dati relativa a ogni centralina e' previsto anche un puntatore alla lista dei dati rilevati dalla centralina stessa. Se, ad esempio per un guasto al sensore, un dato e' mancante, nel file compare il numero -100 al suo posto.
Scrivere una funzione, da chiamare nel main, in cui vengono salvati sul file MIL011.txt tutti i dati relativi alla centralina MIL011 nel novembre 2019 in cui siano presenti tutti e quattro i dati normalmente rilevabili.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {char id_centralina[7];
char luogo [20];
char ente [5];
char telefono[10];
} centralina_t;
typedef struct {int giorno;
int mese;
int anno;} data_t;
typedef struct {char id_centralina[7];
data_t data;
float temperatura;
int PM10;
int CO2;} dati_t;
typedef struct lista_dati {
dati_t info;
struct lista_dati * next;
} lista_dati_t;
typedef struct lista_centraline {
centralina_t val;
lista_dati_t *head;
struct lista_centraline * next;
} lista_centraline_t;
void inserisci_testa(lista_centraline_t ** head, centralina_t val) {
lista_centraline_t * new_node;
new_node = malloc(sizeof(lista_centraline_t));
if (new_node==NULL)
{
printf("errore inserisci testa");
}
new_node->val = val;
new_node->next = *head;
*head = new_node;
}
void stampa_lista(lista_centraline_t * head) {
lista_centraline_t * current = head;
while (current != NULL) {
printf("[%s %s %s %s]", current->val.id_centralina, current->val.luogo, current->val.ente, current->val.telefono);
printf(" -> ");
current = current->next;}
}
void inserisci_coda(lista_dati_t *head, dati_t val) {
lista_dati_t* current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = malloc(sizeof(lista_dati_t));
current->next->info = val;
current->next->next = NULL;
}
void cerca(lista_centraline_t *head,dati_t dato)
{
while(head != NULL)
{
if (strcmp(head->val.id_centralina, dato.id_centralina)==0)
{
inserisci_coda(head->head, dato);
}
head = head->next;
}
}
void function(lista_centraline_t *head)
{ int trovato=0;
char stringa[]= "MIL011";
FILE *fp;
fp=fopen("MIL011.txt","w");
if (fp==NULL)
{printf("errore file function");}
while(trovato==0)
{
if (strcmp(head->val.id_centralina, stringa)==0)
{ while(head->head != NULL)
{ if (head->head->info.data.mese==11 && head->head->info.data.anno==2019)
{fprintf(fp, "%d %d %d %f %d %d\n", head->head->info.data.giorno, head->head->info.data.mese, head->head->info.data.anno, head->head->info.temperatura, head->head->info.CO2, head->head->info.PM10);}
head->head=head->head->next;
} trovato=1;
} fclose(fp);
head=head->next;
}
}
int main()
{ centralina_t centralina;
dati_t dato;
lista_centraline_t *head= NULL;
FILE *fp;
fp=fopen("centraline.txt","r");
if (fp==NULL)
{printf("errore file centraline");}
while (!feof(fp))
{fscanf(fp,"%s", centralina.id_centralina);
fscanf(fp,"%s", centralina.luogo);
fscanf(fp,"%s", centralina.ente);
fscanf(fp,"%s", centralina.telefono);
if (!feof(fp)){
inserisci_testa(&head, centralina);}
}
fclose(fp);
fp=fopen("dati.txt","r");
if (fp==NULL)
{printf("errore file dati");}
while (!feof(fp))
{fscanf(fp,"%s", dato.id_centralina);
fscanf(fp,"%d", &dato.data.giorno);
fscanf(fp,"%d", &dato.data.mese);
fscanf(fp,"%d", &dato.data.anno);
fscanf(fp,"%f", &dato.temperatura);
fscanf(fp,"%d", &dato.CO2);
fscanf(fp,"%d", &dato.PM10);
cerca(head, dato);
fclose(fp);
}
function(head);
return 0;
}