Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [C++] problema con polimorfismo "Violazione di accesso nella lettura del percorso"

    Salve ragazzi è un pò che vado in giro per la rete in cerca di una soluzione al mio problema, ma siccome non ho trovato una soluzione ho deciso di postare su questo ottimo forum. Ho un problema con un programma che ho scritto che fa parte di un progetto da portare ad un esame. In questo progetto ci ho messo un pò di tutto quello che ho imparato sul C++, dalla gestione dei file al polimorfismo. Ho creato più funzioni ed ognuna gestisce un problema diverso, l'unico problema che ho è con la funzione che tratta il polimorfismo che posto di seguito. Mi da un errore di questo tipo "Violazione di accesso nella lettura del percorso" ma non capisco proprio dove possa essere l'errore!!il codice l'ho ricontrollato 1000 volte!

    codice:
    void stampatutto(void)
    {
    	FILE *fileAmministratore = NULL;
    	FILE *fileIscritti = NULL;
    	int contatore = 0; //contatore per contare quanti record ci sono nel file degli iscritti
    	Iscritto i1;
    	Amministratore a1;
    	size_t i = 0;
    	string flag;
    
    	if ((fileAmministratore = fopen("amministratore.bin","rb")) == NULL)
    		cout << "\nimpossibile aprire il file dell'amministratore\n";
    	else
    	{
    		rewind(fileAmministratore);
    		fread(&a1, sizeof(Amministratore), 1, fileAmministratore);
    		fclose(fileAmministratore);
    	}
    	
    	if ((fileIscritti = fopen("iscritti.bin","rb")) == NULL)
    		cout << "\nimpossibile aprire il file degli iscritti\n";
    	else
    	{
    		rewind(fileIscritti);
    		while (!feof(fileIscritti))
    		{
    			fread(&i1, sizeof(Iscritto), 1, fileIscritti);
    			if (!feof(fileIscritti))
    				contatore++;
    		}
    //creo un vettore che contiene tanti elementi della classe iscritto quanti sono gli iscritti
    		vector <Iscritto> iscritti(contatore);
    //creo un vettore per contenere tanti puntatori alla classe base quanti sono gli iscritti 
    //+ 1(amministratore)
    		vector <Persona *> persone(contatore+1);
    		//inizializzo il vettore riempiendolo con tutti i record degli iscritti
    		rewind(fileIscritti);
    		contatore = 0;
    		while (!feof(fileIscritti))
    		{
    			fread(&i1, sizeof(Iscritto), 1, fileIscritti);
    			if (!feof(fileIscritti))
    			{
    				iscritti[contatore] = i1;
    				contatore++;
    			}
    		}
    
    //inizializzo il primo elemento del vettore persone con l'indirizzo dell'oggetto 
    //amministratore
    		persone[0] = &a1;
    //inizializzo tutti gli altri elementi del vettore persone con gli indirizzi degli oggetti 
    		//iscritto memorizzati nell'altro vettore
    		for (i = 1;i < persone.size(); i++)
    			persone[i] = &iscritti[i-1];
    		
    		for (i = 0;i < persone.size(); i++)
    		{
    			(*persone[i]).stampa(); //L'ERRORE LO SEGNALA QUI
    			cout << "\n";
    		}
    		
    		cout << "\n\n...premere un tasto per tornare al menu dell'amministratore...\n";
    		cin >> flag; //serve solo per far stoppare l'esecuzione del programma 
    	        //dare il tempo di leggere tutto e poi tornare al menu dell'amministratore
    		fclose(fileIscritti);
    	}
    	//una volta terminato il processo di torna al menu dell'amministratore
    	amministratore();
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se l'errore è nel metodo

    stampa()

    è quel codice che ci dovresti far vedere ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Grazie della risposta!!!posto il codice della classe Amministratore e della classe Iscritto è un pò lunghetto spero che non ci siano problemi per questo!

    codice:
    #ifndef AMMINISTRATORE_H
    #define AMMINISTRATORE_H
    
    #include <string>
    using std::string;
    
    #include "persona.h"
    
    class Amministratore : public Persona
    {
    	public: //nome, cognome, età, ID, username, password
    		Amministratore(string = "", string = "", int = 18, int = 0, string = "", string = "");
    
    		void setUser(string);
    		void setPass(string);
    		string getUser();
    		string getPass();
    		int getID();
    
    		virtual void stampa();
    		//funzione virtuale pura ridefinita per rendere la classe concreta
    		//in questo caso l'amministratore non ha mensile da pagare quindi viene semplicemente visualizzato un messaggio!
    		virtual void setPagamentoMensile(int);
    
    	private:
    		//dati membro ereditati
    		//char nome[21];
    		//char cognome[31];
    		//int età;
    
    		//dati membro specifici della classe
    		int ID; //(per l'amministratore e' sempre 0)
    		char user[21];
    		char pass[11];
    };
    #endif
    
    CLASSE ISCRITTO
    
    #ifndef ISCRITTO_H
    #define ISCRITTO_H
    
    #include <iostream>
    #include <string>
    #include "data.h"
    #include "persona.h"
    
    class Iscritto : public Persona
    {              
        public: //nome, cognome, età, ID, giorno,mese,anno, corso, pagamento mensile, username, password
    		Iscritto(string = "", string = "", int = 18, int = 1, int = 0, int = 0, int = 0, int = 1, float = 0, string = "", string = "");
    		//viene impostato tutto a zero per default
    
    		//le funzioni set e get per impostare e restituire i dati membro ereditati, sono state ereditate
            Data getDataIscrizione();
            int getCorso();
            float getPagamentoMensile();
    		int getID();
    		string getUser();
    		string getPass();
    		void setDataIscrizione(int, int, int);
    		void setCorso(int);
    		void setUser(string);
    		void setPass(string);
    		void setID(int);
    		//funzione virtuale non pura che verrà riscritta
    		virtual void stampa();
    		//funzione virtuale pura che DEVE essere ridefinita per rendere la classe concreta
    		virtual void setPagamentoMensile(int);
    
    	private:
    		//dati membro ereditati
    		//char nome[21];
    		//char cognome[31];
    		//int età;
    
    		//dati membro specifici della classe
            Data dataIscrizione;
            int corso;
    		int ID;
            float pagamentoMensile;
    		char user[21];
    		char pass[11];
    };
    #endif
    
    //funzione virtuale stampa riscritta di Amministratore
    void Amministratore::stampa()
    {
    	cout << "\n";
    	cout << "** riepilogo dati dell'amministratore: \n";
    	Persona::stampa(); //riutilizzo della funzione stampa della classe base
    	cout << "\n** la tua username e': " << getUser();
    	cout << "\n** la tua password e': " << getPass();
    	cout << "\n";
    }
    
    //funzione virtuale stampa riscritta di Iscritto
    void Iscritto::stampa()
    {
    	cout << "\n";
    	cout << "** riepilogo dati iscritto numero: " << getID();
    	Persona::stampa(); //riutilizzo della funzione stampa della classe base
    	cout << "\n** data iscrizione: " << getDataIscrizione();
    	cout << "\n** sei iscritto al corso con ID: " << getCorso();
    	cout << "\n** pagamento mensile: " << getPagamentoMensile();
    	cout << "\n** username: " << getUser();
    	cout << "\n** password: " << getPass();
    	cout << "\n";
    }
    
    //funzione virtuale non pura nella classe base
    void Persona::stampa()
    {
    	cout << "\n** nome e cognome: " << getNome() << ' ' << getCognome()
    		<< "\n** eta': " << getEtà();
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma tutte quelle getXXX come sono implementate?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    con una semplice return del dato che devono far ritornare..se vuoi posto tutto il codice anche se è un pò lunghetto ...per la data di iscrizione ho fatto una classe a parte ridefinendo l'operatore << per comodità in modo da poterlo utilizzare direttamente con cout...ma l'errore non è lì perchè se visualizzo solo gli iscritti funziona...è qualcosa dovuto all'amministratore che non riesco a capire...trall'altro a volte ha funzionato e a volte no...non è nemmeno dovuto all'attivazione delle opzioni di RTTI sul progetto (uso visual studio come compilatore)

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Puoi postare il codice completo dell'errore (intendo quello originale mostrato a runtime)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Allora posta tutto su pastebin ( http://pastebin.com/ ).

  8. #8
    Originariamente inviato da ramy89
    Allora posta tutto su pastebin ( http://pastebin.com/ ).
    grazie anche a te per la risposta..posto tutto il codice di tutte le classi e di tutto il main???

    Originariamente inviato da oregon
    Puoi postare il codice completo dell'errore (intendo quello originale mostrato a runtime)
    siccome il programma è un menu in cui l'utente può scegliere varie opzioni, funziona tutto bene, tranne quando scelgo l'opzione che avvia la funzione che ho postato prima e mi esce questo messaggio:

    "Eccezione non gestita a 0x011cb44e in centro sportivo.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x00c8ca48."

    e poi nell'output: "Eccezione first-chance a 0x011cb44e in centro sportivo.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x00c8ca48.
    Eccezione non gestita a 0x011cb44e in centro sportivo.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x00c8ca48."

    (il progetto si chiama centro sportivo)

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Originariamente inviato da marcucc_20
    grazie anche a te per la risposta..posto tutto il codice di tutte le classi e di tutto il main???
    Si



    Intanto prova a cambiare questo pezzo di codice così:

    codice:
    for (i = 0;i < persone.size(); i++)
    		{
    			(*(persone[i])).stampa(); //L'ERRORE LO SEGNALA QUI
    			cout << "\n";
    		}

  10. #10
    allora ci sono novità...ho provato a modificare il codice come dicevi...premetto che all'inizio ho messo un menu introduttivo in cui se è il primo accesso si può inizializzare il file dell'amministratore con username e password (l'amministratore può fare praticamente tutto), premendo quella funzione modifico il file dell'amministratore immettendo tutti i suoi dati, li ho inseriti e dopo entrando con le credenziali dell'amministratore ha funzionato. Chiudendo il programma ed entrando poi direttamente con file dell'amministratore già inizializzato non funziona!Assurdo!!!comunque ora posto tutto il codice su pastebin come hai detto tu!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.