2011-09-26 3 views
5

J'ai une petite fonction, qui est supposée faire une prédiction basée sur un algorithme d'apprentissage automatique. La fonction ne fonctionnait pas, j'ai donc mis une instruction print pour vérifier la valeur, et tout d'un coup ça a commencé à fonctionner. Lorsque je commente la ligne d'impression, elle cesse de fonctionner. Y a-t-il quelque chose qui me manque pour expliquer pourquoi cela se produirait?Pourquoi imprimer une variable changer sa valeur?

int makePrediction(const InstanceT & instance, bool biased){ 
    double dotProduct = (biased ? instance * _weights + _bias : instance * _weights); 
    std::cout << "dotProduct = " << dotProduct << std::endl; 
    return (dotProduct > 0 ? 1 : -1); 
} 

pour une raison quelconque produit un résultat différent alors

int makePrediction(const InstanceT & instance, bool biased){ 
    double dotProduct = (biased ? instance * _weights + _bias : instance * _weights); 
    return (dotProduct > 0 ? 1 : -1); 
} 

et montrer que les résultats sont différents compte tenu des mêmes entrées, j'appelle cette fonction avec:

std::vector<InstanceT> _instances = populate_data() //this works for both versions 
for (int i = 0; i < _instances.size(); i++){ 
    std::cout << "prediction: " << makePrediction(_instances[i], true) << std::endl; 
} 

Toutes les pensées ?

+0

Bonne question pour codereview.stackexchange.com –

+2

Que voulez-vous dire par "ne fonctionnait pas"? Quel était le comportement attendu et observé? Veuillez spécifier l'entrée et la sortie exactes. –

+0

std :: endl se vide généralement également. Votre code d'appel produit-il une sortie qui dépend de l'état du tampon de cout? Cela semble improbable. En quoi la sortie est-elle réellement différente? qu'est-ce qu'une valeur correcte de 'makePrediction' et qu'est-ce que ça donne quand c'est faux? –

Répondre

4

Cela arrive souvent à cause de deux raisons:

  1. problèmes de concurrence. Si votre programme est multithread, vous masquez les conditions de concurrence avec la sortie de débogage. Essayez un débogueur MT comme helgrind.
  2. Piles brisées. Essayez de lancer valgrind sur votre programme et voyez si ça sort propre.

Ce sont, bien sûr, des conseils assez génériques, mais vous devrez mieux préciser votre question pour obtenir de meilleurs conseils :-).

+0

le code n'est pas multithread, donc il ne devrait pas être un problème de concurrence.Et pour répondre à certains des autres commentateurs, concernant la publication des résultats: essentiellement, étant donné les mêmes entrées (les deux paramètres et les membres de la classe étant égaux), le code produit +1 et -1 avec l'instruction print, mais ne produit -1 que lorsque l'instruction d'impression est épuisée. – Max

+0

@Max: Je pense que vous avez manqué le point principal des commentateurs. Donnez un exemple concret où "échoue". Un code que je peux compiler et il va reproduire le problème. Vous avez un bug laid mais si vous ne faites pas d'efforts, personne ne peut vous aider. –

+0

Le problème est, je ne sais pas comment donner un bon exemple, parce que cela fait partie d'une structure de code plus grande, qui repose sur un ensemble de données à partir d'un fichier séparé. Je ne sais pas comment produire un bon exemple sans inclure tout le code. – Max

Questions connexes