2009-12-02 4 views
0

j'ai une classe CognitiveEntity, défini de cette façon:valeur membres, les changements entre les appels successifs de la même fonction

class CognitiveEntity : public Object 
{ 
public: 
    CognitiveEntity (FuzzyCognitiveMap fcm, SystemState s); 
    ~CognitiveEntity(); 

    template <typename T> void RegisterChange (std::string context, T value); 

    bool operator!= (const CognitiveEntity& rhs) const; 

private: 
    FuzzyCognitiveMap m_fuzzyCognitiveMap; 
    SystemState  m_systemState; 

    std::vector <SystemState> RunFuzzyCognitiveMap(); 
}; 

Comme le montre, un CognitiveEntity a un objet SystemState, ce qui a un vecteur de Concept objets (seules les lignes les plus pertinentes sont présentées):

class SystemState 
{ 
public: 
    SystemState(); 
    ~SystemState(); 

    void  AddConcept (Concept c) { m_L.push_back(c); } 
    std::vector <Concept> m_L; 
}; 

a l'intérieur du CognitiveEntity::RegisterChange, je marque un concept comme une cause potentielle (en appelant Concept::IsPotentialCause (bool) qui définit simplement un membre privé la valeur passée):

template <typename T> 
void 
CognitiveEntity::RegisterChange (std::string context, T value) 
{ 
    std::string name = context.substr(context.find_last_of ("/") +1); 
    int pos = m_systemState.FindConcept(name); 
    if (pos > -1) 
    { 
    int intValue = value ? 1 : 0; 
    m_systemState.m_L[pos].SetConceptValue (intValue, false); 

    if (m_systemState.m_L[pos].CheckVariation()) 
    { 
     m_systemState.m_L[pos].IsPotentialCause (true); // Mark this concept as a potential cause 

     for (int cause = 0; cause < m_systemState.GetSize(); cause++) 
     { 
     if ((cause != pos) && (m_systemState.m_L[cause].MayBeCause())) 
     { 
      m_fuzzyCognitiveMap.UpdateFuzzyCognitiveMapEntry (cause, pos, m_systemState); 
      m_systemState.m_L[cause].IsPotentialCause (false); 
     } 
     } 
    } 
    } 

} 

Ce qui se passe est que dès que RegisterChange est appelé une autre fois, l'Concept qui a été marqué comme cause potentielle, est marqué plus. J'ai essayé d'exécuter gdb et je suis sûr que ce membre n'est pas défini ailleurs. Je ne suis pas sûr si cette petite information est suffisante pour que vous me donniez quelques indications sur un tel comportement (je ne voulais pas inonder le poste avec le code des deux classes SystemState et Concept).

Cordialement, Jir

+0

Vous ne gérez pas le cas de plusieurs concepts avec le même nom, avez-vous besoin de cela? Si non, pourquoi n'utilisez-vous pas quelque chose comme une «carte»? Peut-être que de nouveaux 'Concept' ont été ajoutés entre les appels à' RegisterChange() '. –

+0

Comme Tim dit ci-dessous, il ne semble pas vraiment y avoir assez ici pour continuer. Vous dites que vous êtes sûr que "le membre n'est pas défini ailleurs" ... mais voulez-vous dire que Concept ne modifie que le membre dans IsPossibleCause ou voulez-vous dire que le code ci-dessus représente les SEULS appels à IsPossibleCause ?? – imaginaryboy

+0

gf: Je suis sûr qu'il n'y a pas plusieurs concepts avec le même nom. Cependant, j'ai trouvé plus facile de travailler avec des conteneurs 'vector' (en fait, je suis nouveau dans les conteneurs STL et je n'ai pas vraiment inspecté les autres conteneurs). De plus, aucun concept n'a été ajouté entre les appels. imaginaryboy: désolé pour la description désordonnée. Ce que je voulais dire, c'est que 'Concept' ne modifie que le membre dans' IsPossibleCause' et que 'IsPossibleCause' n'est appelé que dans ce morceau de code. – Jir

Répondre

0

Si tel était un système multi-thread, je dirais que cela ressemble à un cas classique de partage, état mutable qui n'a pas été correctement synchronisé.

Si vous n'avez pas une situation multithread, je dirais mettre une montre sur cette variable et voir ce qui la change.

+0

Bon conseil!J'ai découvert qu'une copie de l'objet est modifiée, et non l'original. – Jir

+0

Je peux seulement l'accepter. Besoin de 15 points de réputation pour voter contre, désolé :) – Jir

0

Il s'avère que le problème était lié à l'appel du code depuis le simulateur de réseau (le code devait être utilisé dans le simulateur de réseau "ns-3"). Donc, le problème n'était même pas dans le code que j'ai posté, et pourtant vous avez réussi à m'aider à trouver la solution: grâce aux suggestions que vous m'avez données, j'ai préparé une version autonome du code et j'ai regardé la variable .

Le problème était de savoir comment je passais l'objet. Plus précisément, au lieu de faire circuler l'objet par référence (comme je le pensais), j'aurais dû utiliser des pointeurs intelligents.

Merci à tous pour les bonnes idées! (et désolé pour le désordre ... la prochaine fois je serai plus précis!)

Questions connexes