2010-04-21 3 views
0

Désolé pour le titre déroutant, mais il dit essentiellement tout. Voici les structures que je utilise (dans OpenCV):Passer une structure par valeur, avec une autre structure comme l'un de ses membres, change les valeurs des membres de ce membre

struct CV_EXPORTS CvRTParams : public CvDTreeParams 
{ 
    bool calc_var_importance; 
    int nactive_vars; 
    CvTermCriteria term_crit; 

    CvRTParams() : CvDTreeParams(5, 10, 0, false, 10, 0, false, false, 0), 
     calc_var_importance(false), nactive_vars(0) 
    { 
     term_crit = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 50, 0.1); 
    } 
} 

et

typedef struct CvTermCriteria 
{ 
    int type; 
    int max_iter; 
    double epsilon; 
} 
CvTermCriteria; 

CV_INLINE CvTermCriteria cvTermCriteria(int type, int max_iter, double epsilon) 
{ 
    CvTermCriteria t; 

    t.type = type; 
    t.max_iter = max_iter; 
    t.epsilon = (float)epsilon; 

    return t; 
} 

Maintenant, j'initialiser une structure CvRTParams et les valeurs définies pour ses membres:

CvRTParams params; 
params.max_depth = 8; 
params.min_sample_count = 10; 
params.regression_accuracy = 0; 
params.use_surrogates = false; 
params.max_categories = 10; 
params.priors = priors; 
params.calc_var_importance = true; 
params.nactive_vars = 9; 
params.term_crit.max_iter = 33; 
params.term_crit.epsilon = 0.1; 
params.term_crit.type = 3; 

Ensuite, appeler une fonction d'un objet, en prenant comme paramètre params:

CvRTrees* rt = new CvRTrees; 
rt->train(t, CV_ROW_SAMPLE, r, 0, 0, var_type, 0, params); 

Que se passe-t-il maintenant? Les valeurs de ...

params.term_crit.max_iter 
params.term_crit.epsilon 
params.term_crit.type 

ont changé! Ils ne sont plus 33, 0.1 et 3, mais quelque chose comme 3, 7.05541e-313 et 4, et ce, pour toute la durée de la fonction CvRtrees :: train() ...

Répondre

0

le temps que j'ai fini d'écrire cette question, j'ai trouvé la réponse. J'ai donc pensé que je posterais quand même si quelqu'un rencontrait le même problème. Le code lui-même n'était pas faux (ou du moins, ce n'était pas complètement faux). Cependant j'utilise MacOS X et apple-gcc sur un processeur ppc (G5). J'utilisais le drapeau -fast pour l'optimisation. La suppression de l'indicateur -fast (ne laissant que -O3) a résolu le problème.

+0

Pouvez-vous fermer le poste? –

+0

Si c'est fait en cliquant sur l'icône de cocher pour le rendre vert, je ne peux le faire en deux jours (parce que j'ai répondu à ma propre question, je suppose). –

+0

rappel qu'il a été deux jours - s'il vous plaît fermer la question. –

Questions connexes