Programma gestione

di il
25 risposte

Programma gestione

Ciao a tutti ragazzi! Avrei bisogno di un aiuto urgente con il seguente codice. La consegna del progetto è dopodomani e sono disperato!

Ho creato questa classe base:
#ifndef PERSONA_H
#define PERSONA_H

class persona //Classe astratta
{
protected:
char nome_utente[20];
char cognome_utente[20];
int eta;
public:
virtual void carica(){}; //Funzione virtuale pura.
virtual void visualizza(){}; //Funzione virtuale pura.
char* get_name();
char* get_surname();
};

#endif

#ifndef UTENTE_H
#define UTENTE_H
#include "persona.h"
#include <iostream>
using namespace std;

class utente:public persona
{
protected:
int codice_utente;
long long recapito_telefonico;
char citta_residenza[30];
public:
int get_code();
long long get_recapito();
char* get_city();
void carica() //Definizioni funzioni virtuali carica e visualizza.
{
cout<<"Inserire dati utente: "<<endl;
cout<<"Nome: ";
cin>>nome_utente;
cout<<"Cognome: ";
cin>>cognome_utente;
cout<<"Eta': ";
cin>>eta;
cout<<"Codice utente: ";
cin>>codice_utente;
cout<<"Recapito telefonico: ";
cin>>recapito_telefonico;
cout<<"Citta' di residenza: ";
cin>>citta_residenza;
}
void visualizza()
{
cout<<"Nome: "<<nome_utente<<endl;
cout<<"Cognome: "<<cognome_utente<<endl;
cout<<"Eta': "<<eta<<endl;
cout<<"Codice utente: "<<codice_utente<<endl;
cout<<"Recapito telefonico: "<<recapito_telefonico<<endl;
cout<<"Citta' di residenza: "<<citta_residenza;
cout<<endl;
}
};

#endif


#include "utente.h"
#include<iostream>
using namespace std;

int utente::get_code()
{
return codice_utente;
}

long long utente::get_recapito()
{
return recapito_telefonico;
}

char* utente::get_city()
{
return citta_residenza;
}


Dunque queste sono la mia classe base e la mia classe derivata!

Nel main ho diversi case.. in particolar modo l'errore viene riscontrato nel case 6 che ora vi riporto (Per completezza riporto anche il case 5).

case 5:
persona *pers; //Puntatore ad oggetto di tipo persona(classe base)!
int num1;
utente *ut;
ute=individua_utenti(); //numero di utenti presenti sul file
num1=controllo_posti(ute); //numero di utenti da inserire
ut=new utente[num1]; //Vado ad allocare un vettore di oggetti in memoria heap!
for(int i=0;i<num1;i++)
{
pers=&ut;
pers->carica();
uten[ute]=ut; //uten sarebbe un vettore di oggetti in memoria stack
}
carica_dati_su_file(ut,num1);
delete ut;
break;
case 6:
persona *p;
int utenti_individuati;
utenti_individuati=individua_utenti();
if(utenti_individuati==0)
cout<<"In archivio non sono presenti utenti!"<<endl;
else
{
for(int j=0;j<utenti_individuati;j++)
{
p=&uten[j];
p->visualizza();
}
}
break;


L'errore che mi dà il compilatore e': Eccezione non gestita a 0x00c6803a in revisione progetto.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x0024cbbc.

25 Risposte

  • Re: Programma gestione

    Per favore utilizza i tag code ed una corretta indentazione quando posti codice sul forum, così è difficilmente leggibile.
    Controlla se il puntatore p, nel momento in cui chiami la funzione visualizza(), sia valido.. prova a fare un po' di debug qua e là, probabilmente è un errore nell'uso dei puntatori, forse array di dimensione sbagliata, qualcosa di questo genere.
  • Re: Programma gestione

    Sto da stamane a provare debug ecc non ne vengo proprio a capo! Il compilatore a volte me lo fa partire correttamente, altre volte me lo blocca! potresti darmi una mano?
  • Re: Programma gestione

    E' impossibile aiutarti così, manca il codice di gran parte del programma.. sicuro che il puntatore p e l'array uten siano correttamente dichiarati, inizializzati ed utilizzati?
  • Re: Programma gestione

    Sisi sono certo! non mi spiego perchè a volte me lo faccia partire e a volte no!se un codice è errato non lo dovrebbe far partire mai no?
    Posso passarti il progetto in modo da dare uno sguardo veloce? il problema è solo in quel case! gli altri sono tutti testati e funzionanti!..
    Oppure se può essere d'aiuto faccio lo screen dell'errore esatto che dà..
    Il programma inoltre crea e/o scrive in modalità append su un file chiamato "utenti.txt", se elimino questo file e faccio partire il programma, il file viene creato e funziona tutto alla grande! se invece faccio partire l'eseguibile con il file già presente nella cartella a volte si blocca e altre volte funziona regolarmente!
  • Re: Programma gestione

    Domanda veloce.. Usi il Dev-C++?
    Che lo stesso codice a volte compili e a volte no non è normale
    Prova a postare l'intero errore e magari metti il sorgente da qualche parte, appena posso provo a compilarlo.
  • Re: Programma gestione

    Allora ci sono news...Utilizzando visual c++ 2010 mi dà l'errore : Eccezione non gestita a 0x01388961 in prv1.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x00e2dc70.

    Naturalmente prv1 è il mio progetto.

    Se uso il dev c++ funziona tutto correttamente! o.o
    Stando a ciò, il problema non dovrebbe essere il codice no? altrimenti anche il dev mi darebbe errore..
    Con il dev c++ funziona SEMPRE! sia quando creo da 0 il file utenti.txt sia quando il file è già stato creato e il programma agisce in modalità "rb" ! Tra l'altro in visual a volte funziona e altre volte no! Credo uscirò pazzo

    Qualcuno ha idea di come poter risolvere questo problema per visual c++? noto che quando si va a creare un progetto con quest'ultimo programma si creano un sacco di file e cartelle! ho provato a mettere anche il file "Utenti.txt" nella cartella dov'è presente il "prv1.exe" ma nada
  • Re: Programma gestione

    Non fidarti mai del dev, cestinalo definitivamente.. il buon vbextreme lo ha ripetuto più e più volte
    Per la questione del progetto in visual studio, ti basta spuntare la voce "Progetto vuoto".
    Senza tutto il codice mi è difficile aiutarti più di così.
  • Re: Programma gestione

    Perfavore è urgentissimo!!!

    MAIN
    #define _CRT_SECURE_NO_WARNINGS
    #include "menu.h"
    #include "persona.h"
    #include "utente.h"
    #include<stdio.h>
    #include<iostream>
    using namespace std;
    #define COSTANTE 5
    
    
    int individua_utenti();                                 //La seguente funzione serve per individuare il numero di utenti!
    int controllo_posti(int);
    
    void carica_dati_su_file(utente *,int);                 //overload funzione. Questa funzione carica su file i dati degli utenti.
    
    
    
    
    void main()
    {
    	utente uten[COSTANTE];
    	menu ogg;
    	int ute;                                              //ele=elementi presenti in biblioteca, ut=utenti.
    	ute=individua_utenti();      // Utenti presenti sul file!
    	FILE *fp;
    
    	fp=fopen("Utenti.txt","rb");
    	if(fp!=NULL)
    	{
    		fread(uten,sizeof(class utente),ute,fp);
    		fclose(fp);
    	}
    	else
    		fclose(fp);
    	int sc;
    	do
    	{
    		sc=ogg.richiama_menu();
    		switch(sc)
    		{
    		case 1:
    			persona *pers[COSTANTE];             //Vettore di puntatori ad oggetto di tipo persona(classe base)!
    			int num1;
    			utente *ut;
    			ute=individua_utenti();
    			num1=controllo_posti(ute);
    			ut=new utente[num1];              //Vado ad allocare un vettore di oggetti in memoria heap!
    			for(int i=0;i<num1;i++)
    			{
    				pers[i]=&ut[i];
    				pers[i]->carica();
    				uten[ute+i]=ut[i];
    			}
    			carica_dati_su_file(ut,num1);
    			delete ut;
    			break;
    		case 2:
    			persona *p[COSTANTE];
    			ute=individua_utenti();
    			if(ute==0)
    				cout<<"In archivio non sono presenti utenti!"<<endl;
    			else
    			{
    				for(int i=0;i<ute;i++)
    				{
    					p[i]=&uten[i];
    					p[i]->visualizza();
    				}
    			}
    			break;
    		}
    	}
    	while(sc!=0);
    }
    
    int individua_utenti()
    {
    	int dim,p;
    	FILE *fp;
    	if((fp=fopen("Utenti.txt","rb"))!=NULL)
    	{
    		fseek(fp,0,2);
    		dim=ftell(fp);
    		p=(int)(dim/sizeof(class utente));
    		fclose(fp);
    		return p;
    	}
    	else
    		return 0;
    }
    
    int controllo_posti(int a)
    {
    	int posti;
    	posti=COSTANTE-a;
    	cout<<"Resoconto: "<<endl;
    	cout<<"Posti totali: "<<COSTANTE<<endl;
    	cout<<"Posti disponibili: "<<posti<<endl;
    	int num;
    	if(posti==0)
    	{
    		cout<<"Tutto esaurito!"<<endl;
    		return 0;
    	}
    	else
    	{
    		do
    		{
    			do
    			{
    			cout<<"Digitare numero di elementi da inserire in base ai posti disponibili e\nmassimo 3 per volta: ";
    			cin>>num;
    			}
    			while(num>3);
    			if((posti-num)<0)
    				cout<<"Controllare il numero di posti disponibili!"<<endl;
    		}
    		while((posti-num)<0);
    		return num;
    	}
    }
    
    
    void carica_dati_su_file(utente *a,int b)
    {
    	FILE *fp;
    	fp=fopen("Utenti.txt","ab");
    	fwrite(a,sizeof(class utente),b,fp);
    	fclose(fp);
    }
    
    #ifndef PERSONA_H
    #define PERSONA_H
    
    class persona                                  //Classe astratta
    {
    protected:
    	char nome_utente[20];
    	char cognome_utente[20];
    	int eta;
    public:
    	virtual void carica()=0;                  //Funzione virtuale pura.
    	virtual void visualizza()=0;
    };
    
    #endif
    #ifndef UTENTE_H
    #define UTENTE_H
    #include "persona.h"
    #include <iostream>
    using namespace std;
    
    class utente:public persona
    {
    protected:
    	int codice_utente;
    	long long recapito_telefonico;
    	char citta_residenza[30];
    public:
    	char* get_name();
    	char* get_surname();
    	int get_code();
    	long long get_recapito();
    	char* get_city();
    	void carica()                                             //Definizioni funzioni virtuali carica e visualizza.
    	{
    		cout<<"Inserire dati utente: "<<endl;
    		cout<<"Nome: ";
    		cin>>nome_utente;
    		cout<<"Cognome: ";
    		cin>>cognome_utente;
    		cout<<"Eta': ";
    		cin>>eta;
    		cout<<"Codice utente: ";
    		cin>>codice_utente;
    		cout<<"Recapito telefonico: ";
    		cin>>recapito_telefonico;
    		cout<<"Citta' di residenza: ";
    		cin>>citta_residenza;
    	}
    	void visualizza()
    	{
    		cout<<"Nome: "<<nome_utente<<endl;
    		cout<<"Cognome: "<<cognome_utente<<endl;
    		cout<<"Eta': "<<eta<<endl;
    		cout<<"Codice utente: "<<codice_utente<<endl;
    		cout<<"Recapito telefonico: "<<recapito_telefonico<<endl;
    		cout<<"Citta' di residenza: "<<citta_residenza;
    		cout<<endl;
    	}
    };
    
    #endif
    #include "utente.h"
    #include<iostream>
    using namespace std;
    
    int utente::get_code()
    {
    	return codice_utente;
    }
    
    char* utente::get_name()
    {
    	return nome_utente;
    }
    
    char* utente::get_surname()
    {
    	return cognome_utente;
    }
    
    long long utente::get_recapito()
    {
    	return recapito_telefonico;
    }
    
    char* utente::get_city()
    {
    	return citta_residenza;
    }
    
    #ifndef MENU_H
    #define MENU_H
    
    class menu
    {
    	int scelta;
    public:
    	menu();
    	int richiama_menu();
    	~menu();
    };
    
    #endif
    #include "menu.h"
    #include<iostream>
    using namespace std;
    
    menu::menu()    //Costruttore
    {
    	scelta=-1;
    	cout<<"               *****************************"<<endl;
    	cout<<"               **********BENVENUTI**********"<<endl;
    	cout<<"               *****************************"<<endl<<endl;
    }
    
    int menu::richiama_menu()
    {
    	cout<<"  MENU': "<<endl;
    	cout<<"1)Caricare utenti."<<endl;
    	cout<<"2)Visualizzare dati utenti."<<endl;
    	cout<<"0)Esci."<<endl;
    	cout<<"Scelta: ";
    	cin>>scelta;
    	return scelta;
    }
    
    menu::~menu()
    {
    	cout<<"Grazie per aver utilizzato il nostro programma!\nArrivederci!"<<endl;
    	system("PAUSE");
    }
  • Re: Programma gestione

    Quando dico che usando il dev si impara il "c/c++ for dev" e non lo standard c/c++ un motivo ci sarà no?
    Tirando le somme il tuo codice funziona sul dev per miracolo e per cause sconosciute.
    Inizia col mettere un po di cout in qua e la per vedere in che punto si scatena l errore.
    Molto probabilmente dereferenzi un area della memoria non allocata ma al. telefono non riesco a trovarla
  • Re: Programma gestione

    Sicuro di caricare/salvate i dati correttamente?
    hai verificato?
    PU basta perché c'è chi dice che non conosco il linguaggio
  • Re: Programma gestione

    Si ho provato..sarà sicuramente un problema di dereferenziamento
  • Re: Programma gestione

    Diciamo che da profano del linguaggio non penso si possa salvare e leggere con le rispettive funzioni fread/fwrite uno o piu oggetti, ma bensi bisogna creare l oggetto e leggere/scrivere ogni sua proprieta'
    insomma non penso sia possibile salvare e leggere un oggetto in un colpo solo.

    Sono un profano...
  • Re: Programma gestione

    ??? fread(vect,dim,ele,fp) non svolge proprio questa funzione? vect è il vettore in cui sono memorizzate le informazioni lette dal file, ele indica il numero di elementi da leggere, dim la dimensione in byte di un singolo elemento da leggere e fp è il file da leggere?
  • Re: Programma gestione

      fread(uten,sizeof(class utente),ute,fp);
    tu leggi da un file N ute di dimensioni classe utente e le memorizzi in uten.
    Bene ma il tuo oggetto non ha solo proprietà, ha metodi, e tante altre cosucce quando tu scrivi sul file con la fwrite non scrivi solo le proprietà ma anche gli indirizzi dei metodi, quando torni a leggere cambi tali indirizzi causandone il crash.
    devi dunque scrivere una proprietà alla volta e leggere una proprietà alla volta.

    Teoricamente tu hai detto che con dev funziona giusto? bene, apri un prompt dei comandi, CD fino al path dell exe e poi lo lanci, ad esempio:
    CD c:\con\dev\va\bin\
    mioprog.exe

    lancialo un paio di volte, sono curioso di sapere se va ancora.
Devi accedere o registrarti per scrivere nel forum
25 risposte