Errore inasepttato [puntatori]

di il
3 risposte

Errore inasepttato [puntatori]

Stavo lavorando a questo softwerino che mi è stato assegnato come homework all'uni quando sono incappato in un errore proprio sul finire.
header
/*
 * head.h
 *
 *  Created on: 20/giu/2013
 *      Author: olivi_000
 */

#ifndef HEAD_H_
#define HEAD_H_
#include <iostream>
#include <string>
using namespace std;
//la classe elemento individua il singolo prodotto presente in magazzino
class elemento{
public:
	//le funzioni di set permettono di MODIFICARE i parametri (membri privati) di ogni prodotto
	void setName(const string &n){this->nome=n;};
	void setId(int i){this->id=i;};
	void setQuanti(int q){this->quanti=q;};
	void setCosto(float c){this->costo=c;};
	void setNota(const string &no){this->nota=no;};
	//le funzioni di get permettono di CONOSCERE i parametri (membri privati) di ogni prodotto
	string getName(){return nome;}
	int getId(){return id;}
	int getQuanti(){return quanti;}
	float getCosto(){return costo;}
	string getNota(){return nota;}
	void print();
private:
  int id;
  string nome;
  int quanti;
  float costo;
  string nota;


};

//carica il file .dat in un array di oggetti restituendone il puntatore al primo e la dimenzione dell'array
elemento* loading(int &dim);

//prende come parametri il puntatore all'array di oggetti e la dimenzione
void ricerca(elemento * lista,int);


void stampaInventario(elemento*lista);


//la funzione di salvataggio viene invocata alla fine di ogni modifica
void salva (elemento * lista,int);


//Apre in append il file .dat ed aggiunge un prodotto
void aggiungiProdotto();

#endif /* HEAD_H_ */
func.cpp
#include <iostream>
using namespace std;
#include "head.h"
#include <fstream>
#include <string>


//stampa un elemento
void elemento::print(){
cout<<"ID: "<<id<<endl;
cout<<"NOME: "<<nome<<endl;
cout<<"QUANTITA': "<<quanti<<endl;
cout<<"COSTO: "<<id<<endl;
cout<<"NOTA: "<<nota<<endl;
}





elemento* loading(int& dim) {
	elemento *x;
	x=new elemento[100];
	dim=0;
	int id;
	string nome;
	string dummy;
	int quanti;
	float costo;
	string nota;
	fstream f;
	f.open("file.dat",ios::in);

	while(!f.eof()){
		f>>id;
		getline(f, dummy);
		getline(f, nome);
		f>>quanti;
		f>>costo;
		getline(f, dummy);
		getline(f, nota);
		x[dim].setId(id);
		x[dim].setName(nome);
		x[dim].setQuanti(quanti);
		x[dim].setCosto(costo);
		x[dim].setNota(nota);
		dim++;
	}
	f.close();
	return x;


}

void ricerca(elemento * lista,int dim){
	cout<<"Inserire l'ID dell prodotto da cercare: ";
				int num;
				cin>>num;
				for(int i=0;i<dim;i++)
					if (lista[i].getId()==num){
						lista[i].print();
						cout<<"Digitare \n\n1 per modificare\n2 per eliminare :";
						int scelta;
						cin>>scelta;
						if(scelta==1){
								cout<<"Digitare:"<<endl;
								cout<<"\n1- per cambiare l'Id";
								cout<<"\n2- per cambiare il nome";
								cout<<"\n3- per cambiare la quantità";
								cout<<"\n4- per cambiare il costo";
								cout<<"\n5- per cambiare il commento";
								int subscelta;
								cin>>subscelta;
									switch(subscelta){
										case 1:
											{cout<<"Inserire il nuovo Id: ";
											int id;
											cin>>id;
											lista->setId(id);}
										break;

										case 2:
											{cout<<"Inserire il nuovo Nome:";
											string nNome;
											getline(cin, nNome);
											getline(cin, nNome);
											lista->setName(nNome);
											cout<<"Ok";}
										break;

										case 3:
											{cout<<"Inserire la nuova quantità: ";
											int quantit;
											cin>>quantit;
											lista->setQuanti(quantit);
										break;}
										case 4:
											{cout<<"Inserire il nuovo costo: ";
											int costo;
											cin>>costo;
											lista->setCosto(costo);
										break;}
										case 5:
											{cout<<"Inserire il nuovo commento: ";
											string commento;
											getline(cin,commento);
											getline(cin,commento);
											lista->setNota(commento);
											cout<<commento;
										break;}

									}
									cout<<"\nModifica eseguita ...";
								}

						else if(scelta==2)
							cout<<"Elemento cancellato";
				}
					else cout<<"Elemento non trovato";

}



void salva(elemento * lista,int dim){
	ofstream out;
	out.open("file.dat",ios::out);
		for (int i=0;i<dim;i++){
			out<<lista[i].getId()<<endl;
			out<<lista[i].getName()<<endl;
			out<<lista[i].getQuanti()<<endl;
			out<<lista[i].getCosto()<<endl;
			out<<lista[i].getNota()<<endl;
		}
	out.close();

}

void aggiungiProdotto(){
	fstream f;
	f.open("file.dat",ios::app);
	int id;
	string nome;
	int quanti;
	float costo;
	string nota;
	cout<<"Inserire il nuovo Id: ";
	cin>>id;
	cout<<"Inserire il nuovo Nome:";
	getline(cin, nome);
	getline(cin, nome);
	cout<<"Inserire la nuova quantità: ";
	cin>>quanti;
	cout<<"Inserire il nuovo costo: ";
	cin>>costo;
	cout<<"Inserire il nuovo commento: ";
	getline(cin,nota);
	getline(cin,nota);
	f<<id<<endl;
	f<<nome<<endl;
	f<<quanti<<endl;
	f<<costo<<endl;
	f<<nota<<endl;
	f.close();

}

 
main
//============================================================================
// Name        : Labcode.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;
#include "head.h"
#include <fstream>
#include <string>

int main() {
	elemento * lista;
	int dim;
	lista=loading(dim);
	bool fine=false;
	while (!fine){
	cout<<"\nSelezionare l'opzione desiderata:	\n";
	cout<<"1- stampa la lista dei prodotti\n";
	cout<<"2- ricerca prodotto\n";
	cout<<"3- aggiungi prodotto\n";
	cout<<"4- esci\n";
	int scelta;
	cin>>scelta;
	switch(scelta){
		case 1: cout<<"\nLista prodotti:\n";
			for(int i=0;i<dim;i++)
				lista[i].print();
			cout<<"|----------|"<<endl;
		break;

		case 2: cout<<"\nRicerca  prodotti:\n";
		ricerca(lista,dim);
		break;

		case 3:aggiungiProdotto();
		break;

		case 4: fine=true;
		break;
	}

salva(lista,dim);

	}


	return 0;
}
l'errore si ha quando nella scelta del menu seleziono 1 e mi dovrebbe stampare tutti gli elementi presenti nel file .dat che nel mio caso dobrebbe essere una cosa del genere
1
martello
12
5.80
nessun commento
2
cacciavite
5
5.50
in esaurimento
la funzione andava bene, stampava correttamente, ma poi ho fatto qualche modifica (non mi pare proprio in quella parte di codice ma cmq...) ed ora mi stampa indirizzi di memoria, come se ci fosse qualche errore sui puntatori. non riesco proprio a trovare quest'errore, non ho mai usato il debugger forse potrebbe aiutarmi? io uso eclipse

3 Risposte

  • Re: Errore inasepttato [puntatori]

    Controlla che alla fine del loading la variabile dim abbia valore corretto.
  • Re: Errore inasepttato [puntatori]

    oregon ha scritto:


    Controlla che alla fine del loading la variabile dim abbia valore corretto.
    si, effettivamente la dim era sempre più grande di 1, ho corretto
  • Re: Errore inasepttato [puntatori]

    Ho ancora dei problemi su dim
    quando carico il file con loading tt ok, ma quando uso altre funzioni che fanno uso di dim spesso mi creano altri oggetti (tipo l'ultimo me lo inseriscono 2 volte )

    non riesco a capire dov'è che ho sbagliato, riposto il codice fin dove sono arrivato:ù
    main
    //============================================================================
    // Name        : Labcode.cpp
    // Author      :
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    #include <iostream>
    using namespace std;
    #include "func.h"
    #include <fstream>
    #include <string>
    int main() {
    	elemento * lista;
    		int dim;
    
    		lista=loading(dim);
    		cout<<"Sono presenti "<<dim<<" prodotti in catalogo ;";
    		bool esci=false;
    		int scelta; //per scegliere la voce del menu
    		while(!esci){
    			cout<<"\nScegliere l'opzione desiderata:\n";
    			cout<<"\n1- stampa la lista di oggetti:\n";
    			cout<<"\n2- cerca oggetto per ID\n";
    			cout<<"\n3- aggiungi oggetto\n";
    			cin>>scelta;
    			switch(scelta){
    			case 1:		cout<<"  ID  NOME       QUANTITA'  PREZZO  NOTA"<<endl;
    						for(int i=0;i<dim-1;i++){
    						lista[i].print();
    						cout<<"------------------------------------------------------"<<endl;}
    						break;
    			case 2:		ricerca(lista,dim);
    						break;
    			case 3:    aggiungi(lista,dim);
    
    
    						break;
    			}
    		}
    
    
    func.cpp:
    /*
     * func.cpp
     *
     *  Created on: 23/giu/2013
     *      Author: olivi_000
     */
    #include "func.h"
    
    #include <iostream>
    using namespace std;
    
    #include <fstream>
    #include <string>
    
    
    
    elemento* loading(int& dim) {
    	elemento *x;
    	x=new elemento[100];
    	dim=0;
    	int id;
    	string nome;
    	string dummy;
    	int quanti;
    	float costo;
    	string nota;
    	fstream f;
    	f.open("file.dat",ios::in);
    
    	while(!f.eof()){
    		f>>id;
    		getline(f, dummy);
    		getline(f, nome);
    		f>>quanti;
    		f>>costo;
    		getline(f, dummy);
    		getline(f, nota);
    		x[dim].setId(id);
    		x[dim].setName(nome);
    		x[dim].setQuanti(quanti);
    		x[dim].setCosto(costo);
    		x[dim].setNota(nota);
    		dim++;
    	}
    
    	f.close();
    	return x;
    }
    
    
    
    //funzione membro di elemento volta a stampare l'elemento
    void elemento::print(){
    cout<<"  "<<id;
    cout<<"   "<<nome;
    cout<<"  "<<quanti;
    cout<<"     "<<costo;
    cout<<"   "<<nota<<endl;
    }
    
    void ricerca(elemento * lista,int dim){
    cout<<"Inserire l'ID dell prodotto da cercare: ";
    				int num;
    				cin>>num;
    				elemento *listaPtr;
    
    				for(int i=0;i<dim;i++)
    					if (lista[i].getId()==num){
    						lista[i].print();
    						listaPtr=&lista[i];
    					}
    				cout<<"Digitare 1 per modificare | 2 per eliminare:";
    				int scelta;
    				cin>>scelta;
    				if (scelta==1)
    					modifica(listaPtr,dim);
    				else if(scelta==2)
    					elimina(listaPtr,dim);
    				salva (lista,dim);
    				cout<<"\nModifica eseguita ...";
    }
    
    void modifica (elemento * lista,int dim){
    	cout<<"Digitare:"<<endl;
    				cout<<"\n1- per cambiare l'Id";
    				cout<<"\n2- per cambiare il nome";
    				cout<<"\n3- per cambiare la quantità";
    				cout<<"\n4- per cambiare il costo";
    				cout<<"\n5- per cambiare il commento";
    				int subscelta;
    				cin>>subscelta;
    				switch(subscelta){
    						case 1:
    							{cout<<"Inserire il nuovo Id: ";
    							int id;
    							cin>>id;
    							lista->setId(id);}
    							break;
    
    						case 2:
    							{cout<<"Inserire il nuovo Nome:";
    							string nNome;
    							getline(cin, nNome);
    							getline(cin, nNome);
    							lista->setName(nNome);
    							cout<<"Ok";}
    							break;
    
    						case 3:
    							{cout<<"Inserire la nuova quantità: ";
    							int quantit;
    							cin>>quantit;
    							lista->setQuanti(quantit);
    							break;}
    
    						case 4:
    							{cout<<"Inserire il nuovo costo: ";
    							int costo;
    							cin>>costo;
    							lista->setCosto(costo);
    							break;}
    						case 5:
    							{cout<<"Inserire il nuovo commento: ";
    							string commento;
    							getline(cin,commento);
    							getline(cin,commento);
    							lista->setNota(commento);
    							cout<<commento;
    							break;}
    					}
    
    }
    
    void elimina  (elemento * lista,int dim){
    delete [] lista;
    }
    
    
    
    void salva(elemento * lista,int dim){
    	ofstream out;
    	out.open("file.dat",ios::out);
    		for (int i=0;i<dim;i++){
    			out<<lista[i].getId()<<endl;
    			out<<lista[i].getName()<<endl;
    			out<<lista[i].getQuanti()<<endl;
    			out<<lista[i].getCosto()<<endl;
    			out<<lista[i].getNota()<<endl;
    		}
    	out.close();
    }
    
    
    
    void aggiungi (elemento * lista,int& dim){
    
    		cout<<"Inserire il nuovo Id: ";
    		int id;
    		cin>>id;
    		cout<<"Inserire il nuovo Nome:";
    		string nNome;
    		getline(cin, nNome);
    		getline(cin, nNome);
    		cout<<"Inserire la nuova quantità: ";
    		int quantit;
    		cin>>quantit;
    		cout<<"Inserire il nuovo costo: ";
    		int costo;
    	    cin>>costo;
    	    cout<<"Inserire il nuovo commento: ";
    		string commento;
    		getline(cin,commento);
    		getline(cin,commento);
    		lista[dim].setId(id);
    		lista[dim].setName(nNome);
    		lista[dim].setQuanti(quantit);
    		lista[dim].setCosto(costo);
    		lista[dim].setNota(commento);
    
    }
    func.h:
    * func.h
     *
     *  Created on: 23/giu/2013
     *      Author: olivi_000
     */
    
    #ifndef FUNC_H_
    #define FUNC_H_
    
    #include <iostream>
    #include <string>
    using namespace std;
    //la classe elemento individua il singolo prodotto presente in magazzino
    class elemento{
    public:
    	//le funzioni di set permettono di MODIFICARE i parametri (membri privati) di ogni prodotto
    	void setName(const string &n){this->nome=n;};
    	void setId(int i){this->id=i;};
    	void setQuanti(int q){this->quanti=q;};
    	void setCosto(float c){this->costo=c;};
    	void setNota(const string &no){this->nota=no;};
    	//le funzioni di get permettono di CONOSCERE i parametri (membri privati) di ogni prodotto
    	string getName(){return nome;}
    	int getId(){return id;}
    	int getQuanti(){return quanti;}
    	float getCosto(){return costo;}
    	string getNota(){return nota;}
    	void print();
    private:
      int id;
      string nome;
      int quanti;
      float costo;
      string nota;
    };
    
    //carica il file .dat in un array di oggetti restituendone il puntatore al primo e la dimenzione dell'array
    elemento* loading(int &dim);
    
    //cerca un elemento nella lista
    void ricerca(elemento * lista, int dim);
    
    void modifica (elemento * lista,int dim);
    
    void elimina  (elemento * lista,int dim);
    
    void aggiungi (elemento * lista,int& dim);
    
    //la funzione di salvataggio viene invocata alla fine di ogni modifica dell'array di elementi
    void salva (elemento * lista,int dim);
    
    #endif /* FUNC_H_ */
    
Devi accedere o registrarti per scrivere nel forum
3 risposte