按值传递结构,使用另一个结构作为其成员之一,更改此成员的成员的值

时间:2010-04-21 18:29:50

标签: c++ c gcc struct

对于令人困惑的标题感到抱歉,但它基本上都说明了一切。这是我正在使用的结构(在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 :(得分:0)

当我写完这个问题时,我找到了答案。所以我想如果有人遇到同样的问题,我会发帖。代码本身并没有错(或者至少,它并没有完全错误)。但是我在ppc处理器(G5)上使用MacOS X和apple-gcc。我使用-fast标志进行优化。 删除-fast标志(仅留下-O3)解决了这个问题。