czar
28-12-2009, 16:05
allora ho questa classe:
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:
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
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" ç_ç)
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?
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:
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
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" ç_ç)
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?