Передача структуры по значению с другой структурой в качестве одного из ее членов изменяет значения членов этого члена - PullRequest
0 голосов
/ 21 апреля 2010

Извините за запутанный заголовок, но в основном все сказано. Вот структуры, которые я использую (находится в OpenCV):

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 );
    }
}

и

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;
}

Теперь я инициализирую структуру CvRTParams и устанавливаю значения для ее членов:

 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;

Затем вызвать функцию объекта, взяв params в качестве параметра:

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

Что происходит сейчас? Значения ...

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

изменились! Это уже не 33, 0.1 и 3, а что-то вроде 3, 7.05541e-313 и 4, и это на протяжении всей функции CvRtrees :: train () ...

1 Ответ

0 голосов
/ 21 апреля 2010

К тому времени, как я закончил писать этот вопрос, я нашел ответ. Поэтому я решил, что я все равно опубликую, если кто-то столкнется с той же проблемой. Сам код не был неправильным (или, по крайней мере, он не был полностью неправильным). Однако я использую MacOS X и apple-gcc на процессоре PPC (G5). Я использовал флаг -fast для оптимизации. Снятие флага -fast (оставляя только -O3) решило проблему.

...