Ritorno a voi con un programma modificato penso al più abb correttamente anche se alcune funzioni sono ancora in sviluppo . Come consigliatomi ho cercato di risolvere il problema dell'allocazione di memoria. ora vi posto il programma e vi spiego l'inghippo in cui sono caduto
// Questo Programma Calcola il Consumo di vari dispositivi , esporta il file in un file di testo
// visualizza la lista di dispositivi presenti nel file o elimina dati dal file.
#include <stdio.h>
#include <malloc.h>
struct Dispositivo{ // typedef struct dispositivo Disp;
int ID;
char nome[10];
int watt;
float TotaleNetto;
float Totale;
struct Dispositivo *nextPtr;
};
typedef struct Dispositivo TipoDispositivo; //viene ridefinito "struct Dispositivo" come TipoDispositivo
typedef TipoDispositivo *DispPtr; //viene definito un tipo puntatore "TipoDispositivo *"
void menu (void);
void salvalista (TipoDispositivo *);
//void stampadispositivi (void);
//void eliminadato (void);
void calcolaconsumo(TipoDispositivo *);
void nuovodispositivo(TipoDispositivo *);
int main(){
TipoDispositivo *DispoPtr= NULL;
int scelta;
while (scelta =!0) {
menu();
scelta = getchar();
switch (scelta){
case '1' :
nuovodispositivo(DispoPtr);
printf("Caratteristiche DispoPtr:\n ID : %d\n Nome : %s\n Totale Netto : %f\n Totale : %f\n",(*DispoPtr).ID,(*DispoPtr).nome,(*DispoPtr).TotaleNetto,(*DispoPtr).Totale );
break;
case '4' :
salvalista(DispoPtr); //&Device
break;
case '2' :
//stampadispositivi();
break;
case '3' :
//eliminadato();
break;
default : printf("Scelta non corretta");
break;
}
}
return 0;
}
//------------------------------------------------------//
void menu (void) {
printf("-----Menù-----\nInserire un numero per determinare l'azione da intraprendere\n");
printf("1)Aggiungi un dispositivo alla lista\n2)Stampa lista dei dispositivi \n3)Elimina registro\n4)Salva la lista in un file\n");}
//------------------------------------------------------//
void nuovodispositivo (TipoDispositivo *DevicePtr) {
TipoDispositivo *newDevicePtr;
TipoDispositivo *previousDevicePtr;
TipoDispositivo *currentDevicePtr;
newDevicePtr = malloc(sizeof(TipoDispositivo));
if( newDevicePtr !=NULL) {
calcolaconsumo(newDevicePtr);
printf("Caratteristiche newDevicePtr:\n ID : %d\n Nome : %s\n Totale Netto : %f\n Totale : %f\n",(*newDevicePtr).ID,(*newDevicePtr).nome,(*newDevicePtr).TotaleNetto,newDevicePtr->Totale );
(*newDevicePtr).nextPtr= NULL;
previousDevicePtr = NULL;
currentDevicePtr= DevicePtr;
printf("cucu\n");
while (currentDevicePtr!=NULL && (*currentDevicePtr).ID >(*newDevicePtr).ID){
previousDevicePtr=currentDevicePtr;
currentDevicePtr=(*currentDevicePtr).nextPtr;
printf("cucu2\n");}
if(previousDevicePtr == NULL){
(*newDevicePtr).nextPtr=DevicePtr;
DevicePtr=newDevicePtr;
printf("Caratteristiche DevicePtr:\n ID : %d\n Nome : %s\n Totale Netto : %f\n Totale : %f\n",(*DevicePtr).ID,(*DevicePtr).nome,(*DevicePtr).TotaleNetto,newDevicePtr->Totale );
}
else{
(*newDevicePtr).nextPtr=currentDevicePtr;
(*previousDevicePtr).nextPtr=newDevicePtr;
printf("cucu3\n");
}
printf("cucu4\n");
}
else { printf("Errore, Memoria non disponibile"); }
}
//------------------------------------------------------//
void salvalista (TipoDispositivo *Dispo) { //*&Device
FILE *ListDevPtr;
TipoDispositivo *currentPtr;
if (( ListDevPtr = fopen("ListaDispositivi.txt", "wb+")) == NULL){
printf("Il file non può essere aperto");
}
else{
if (Dispo !=NULL){
currentPtr=Dispo;
while((*currentPtr).nextPtr!=NULL){
fwrite(¤tPtr,sizeof(TipoDispositivo),1,ListDevPtr); //&*Dispo=&Device
currentPtr=(*currentPtr).nextPtr;
}
}
else{
printf("Lista Dispositivi vuota, impossibile salvare l'elenco dei dispositivi\n");
return;
}
fclose(ListDevPtr);
}
}
//------------------------------------------------------//
void calcolaconsumo (TipoDispositivo *DevicePtr){ //*&Device
float QFV = 0.0819672131;
float QFD = -0.0369603825;
float QEF1 = 0.09702;
float QEF2 = 0.08631;
float DF1 = 0.01154;
float DF2 = 0.01154;
float DV = 0;
float pereq = -0.00065 ;
float QPOT = 0.0154090164 * 3;
float QFR = 0.0163934426;
float QVR = 0;
float IEC = 0.0227;
int wattaggio;
float kwh;
int anno = 365;
int oref1;
int oref2;
int ore;
float Totale;
float TotQFV;
float TotQF;
float TotQE;
float TotQEF1;
float TotQEF2;
float TotRete;
float TotImposte;
printf("Inserisci l'ID del Dispositivo, 0 per tornare al menu\n");
scanf("%d", &(*DevicePtr).ID);
printf ("ID Dispositivo: %d\n", (*DevicePtr).ID);
printf("Inserisci Il Nome del Dispositivo, 0 per tornare al menu\n");
scanf("%s", (*DevicePtr).nome);
printf ("Nome Dispositivo: %s\n", (*DevicePtr).nome);
printf("Inserire in Watt il consumo del dispositivo da misurare -1 per uscire \n>");
scanf("%d", &wattaggio );
printf("Inserire il monte ore in fascia F1 di attività del dispositivo\n>");
scanf("%d", &oref1);
printf("Inserire il monte ore in fascia F2 di attività del dispositivo\n>");
scanf("%d", &oref2);
ore = oref1 + oref2;
kwh = (float) wattaggio / 1000;
TotQFV= (QFV + QFD) * anno;
TotQEF1 = (QEF1+DF1)* kwh * anno * oref1;
TotQEF2 = (QEF2+DF2)* kwh * anno * oref2;
TotQE= ((DV + pereq) * kwh * anno * ore) + TotQEF1 + TotQEF2;
TotRete= (QFR + QVR + QPOT) * anno;
TotImposte = IEC * anno;
TotQF= TotQFV + TotRete ;
Totale = TotQF + TotQE + TotImposte;
printf( "Ecco quanto consuma il dispositivo annualmente\n\n");
printf ("Totale Consumo : %f kwh/anno\n", kwh * anno * ore);
printf("Totale Quota Energia :%f euro/anno\n", TotQE);
printf("Totale Quota Fissa :%f euro/anno\n", TotQF);
printf("Totale Imposte :%f euro/anno\n", TotImposte);
printf("Totale Imposte Rete :%f euro/anno\n", TotRete);
printf ("Totale imposte comprese : %f euro/anno \n\n" ,Totale);
(*DevicePtr).watt = wattaggio; //Device.watt ecc
DevicePtr->Totale = Totale; //Device.Totale con operatore freccia
(*DevicePtr).TotaleNetto = Totale - TotImposte;
printf("Caratteristiche Dispositivo:\n ID : %d\n Nome : %s\n Totale Netto : %f\n Totale : %f\n",(*DevicePtr).ID,(*DevicePtr).nome,(*DevicePtr).TotaleNetto,DevicePtr->Totale );
}
Dunque intanto i vari printf ("cucu"), o printf("Caratteristiche Dispositivo") servono per rendermi conto del percorso del flusso di esecuzione e del valore dei dati nella struct che devono rimanere uguali ad ogni ritorno.
Il Problema è il seguente in main nel case 1 dello switch chiedo ancora una volta a printf di farmi vedere cosa contiene la struct e il programma compila ma mi restituisce un segmentation fault