Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    69

    [c++] problema con map (stl) e classe

    allora ho questa classe:
    codice:
    class KnowledgeBase
    {
    public:
    	KnowledgeBase();
    	KnowledgeBase(const char* kbFileName);
    	~KnowledgeBase();
    
    	void setFileName(const char* kbFileName);
    	void addObjectDescription(string utterance);
    	void showUserDescription();
    
    private:
    	//< mela, <[rossa, ruvida], [verde]> >
    	map <string, vector< vector<string> > > userDescription;
    
    	char* kbFilename;
    
    	void tokenize_string(string utt, vector<string>& words);
    	void showStringVector(vector <string> strVec);
    };
    per aggiungere oggetti a userDescription chiamo:
    codice:
    void KnowledgeBase::addObjectDescription(string utterance)
    {
    	vector<string> words;
    	tokenize_string(utterance, words);
    	string itemIndex;
    	itemIndex = *(words.end()-1);
    	words.pop_back();
    	userDescription[itemIndex].push_back(words);
    
    	//showUserDescription();
    }
    Notare la riga commentata sopra


    codice:
    void KnowledgeBase::showUserDescription()
    {
    	if (userDescription.empty())
    	{
    		cout<<"doh!"<<endl;
    	}
    	for (map <string, vector< vector<string> > > :: iterator walkerMap = userDescription.begin(); walkerMap != userDescription.end(); walkerMap++)
    	{
    		cout<<"object <"<<walkerMap->first<<">   :   ( ";
    		for (vector< vector<string> > :: iterator walkerVec = walkerMap->second.begin(); walkerVec != walkerMap->second.end()-1; ++walkerVec )
    		{
    			showStringVector(*walkerVec);
    			cout<<", ";
    		}
    		showStringVector(*(walkerMap->second.end()-1));
    		cout<<" )"<<endl;
    	}
    	cout<<endl;
    
    }

    il problema è che se decommento la linea sopracitata e chiamo showUserDescription dalla funzione addObjectDescription, funziona perfettamente.
    KnowledgeBase kbase("KnowledgeBase.txt");
    kbase.addObjectDescription(string().assign(t_utt)) ;

    e ad ogni chiamata di addObjectDescription viene visualizzata correttamente tutta la struttura creata.

    Mentre se invece la chiamo dall'esterno con:
    kbase.showUserDescription();
    la struttura userDescription risulta vuota (e viene visualizzato "doh" ç_ç) e la visualizzazione non avviene essendo vuota.


    Perchè accade ciò e userDescription risulta vuota? Quando invece dovrebbe essere piena, dato che ad ogni chiamada di addObj... la struttura ha sia gli elementi precedenti che quelli appena aggiunti? Dove sbaglio?

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    69

    Re: [c++] problema con map (stl) e classe

    Originariamente inviato da mogre
    dato che ad ogni chiamada di addObj... la struttura ha sia gli elementi precedenti che quelli appena aggiunti
    infatti ad ogni chiamata di addObj... se decommento showUserDescription viene visualizzata correttamente tutta la struttura (anche con gli elementi precedentemente inseriti).

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    A prima vista sembra corretto. Posta un esempio compilabile.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    69
    ti posto il codice (c'è un po' di roba commentata che devo pulire usata per fare qualche prova):

    il .h
    codice:
    /*
     * KnowledgeBase.h
     *
     *  Created on: Dec 24, 2009
     *      Author: ivan
     */
    
    #ifndef KNOWLEDGEBASE_H_
    #define KNOWLEDGEBASE_H_
    
    #include <vector>
    #include <map>
    #include <set>
    #include <string>
    
    
    using namespace std;
    
    
    class KnowledgeBase
    {
    public:
    	KnowledgeBase();
    	KnowledgeBase(const char* kbFileName);
    	~KnowledgeBase();
    
    	void setFileName(const char* kbFileName);
    	void addObjectDescription(string utterance);
    	void showUserDescription();
    
    private:
    	//< mela, <[rossa, ruvida], [verde]> >
    	map <string, vector< vector<string> > > userDescription;
    
    	char* kbFilename;
    
    	void tokenize_string(string utt, vector<string>& words);
    	void showStringVector(vector <string> strVec);
    };
    
    
    
    
    #endif /* KNOWLEDGEBASE_H_ */
    il .cpp
    codice:
    #include "KnowledgeBase.h"
    
    #include <string.h>
    
    
    KnowledgeBase::KnowledgeBase()
    {
    
    }
    
    KnowledgeBase::KnowledgeBase(const char* kbFileName)
    {
    	strcpy(kbFilename, kbFileName);
    /*
    	ofstream f2;
    	f2.open("KnowledgeBase.txt", ios::trunc);
    	if (!f2)
    	{
    		return 0;
    	}
    	for (int k=0; k<10; k++)
    	{
    		f2<<names[k]<<endl;
    		f2<<points[k]<<endl;
    	}
    	f2.close();
    */
    
    }
    
    KnowledgeBase::~KnowledgeBase()
    {
    
    }
    
    void KnowledgeBase::setFileName(const char* kbFileName)
    {
    	strcpy(kbFilename, kbFileName);
    }
    
    void KnowledgeBase::tokenize_string(string utt, vector<string>& words)
    {
    	char *a = new char[utt.size()+1];
    
    	strcpy (a, utt.c_str());
    
    	char* toka = strtok(a," ");
    	while(toka != NULL)
    	{
    		words.push_back(string().assign(toka));
    		toka = strtok(NULL," ");
    	}
    }
    
    void KnowledgeBase::showStringVector(vector <string> strVec)
    {
    	cout<<"( ";
    	for(vector<string>::iterator i = strVec.begin(); i != strVec.end()-1; i++)
    	{
    		cout<<*i<<", ";
    	}
    	cout<<*(strVec.end()-1)<<" )";
    }
    
    void KnowledgeBase::showUserDescription()
    {
    //	cout<<((userDescription.begin())->first)<<endl;
    	if (userDescription.empty())
    	{
    		cout<<"doh!"<<endl;
    	}
    	cout<<"aaaaaaaaaaa "<<endl;
    	//userDescription.
    	for (map <string, vector< vector<string> > > :: iterator walkerMap = userDescription.begin(); walkerMap != userDescription.end(); walkerMap++)
    	{
    		cout<<"object <"<<walkerMap->first<<">   :   ( ";
    		for (vector< vector<string> > :: iterator walkerVec = walkerMap->second.begin(); walkerVec != walkerMap->second.end()-1; ++walkerVec )
    		{
    			showStringVector(*walkerVec);
    			cout<<", ";
    		}
    		showStringVector(*(walkerMap->second.end()-1));
    		cout<<" )"<<endl;
    	}
    	cout<<endl;
    
    }
    
    
    void KnowledgeBase::addObjectDescription(string utterance)
    {
    	vector<string> words;
    	tokenize_string(utterance, words);
    	string itemIndex;
    	itemIndex = *(words.end()-1);
    	words.pop_back();
    /*
    	for(vector<string>::iterator i = words.begin(); i != words.end(); i++)
    	{
    		cout<<*i<<endl;
    
    		//if the word is grounded write it
    	}
    */
    	//cout<<*(words.end()-1)<<endl;
    	//cout<<"asd : "<<itemIndex<<endl;
    	userDescription[itemIndex].push_back(words);
    
    //	cout<<((userDescription.begin())->first)<<endl;
    	//showUserDescription();
    
    /*
    	for (map <string, vector< vector<string> > > :: iterator walkerMap = userDescription.begin(); walkerMap != userDescription.end(); walkerMap++)
    	{
    		cout<<"object <"<<walkerMap->first<<">   :   ";
    		for (vector< vector<string> > :: iterator walkerVec = walkerMap->second.begin(); walkerVec != walkerMap->second.end(); ++walkerVec )
    		{
    			showStringVector(*walkerVec);
    		}
    	}
    	cout<<endl<<endl;
    */
    }
    beh nel main ci dovrebbe essere (se non scordo di includere qualcosa) qualcosa come:

    #include <string>
    #include "KnowledgeBase.h"

    int main()
    {
    KnowledgeBase kbase("KnowledgeBase.txt");
    char t_utt[50];
    strcpy(t_utt,"ciao a tutti");
    kbase.addObjectDescription(string().assign(t_utt)) ;
    strcpy(t_utt,"bau a tutti");
    kbase.addObjectDescription(string().assign(t_utt)) ;
    strcpy(t_utt,"miau a qualcuno");
    kbase.addObjectDescription(string().assign(t_utt)) ;

    kbase.showUserDescription();
    return 0;
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    69
    niè scusate se vi ho fatto perdere tempo, ho trovato l'errore che era da un altra parte... ç_ç

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Capita

    Però c'è un errore nel codice che hai postato (e anche grave). Non so se era quello il tuo problema (non lo dici) o se lo hai corretto. (Hint: riguarda un puntatore char*)
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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.