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

Posted

技术标签:

【中文标题】按值传递结构,将另一个结构作为其成员之一,更改此成员的成员的值【英文标题】:Passing a structure by value, with another structure as one of its members, changes values of this member's members 【发布时间】:2010-04-21 18:29:50 【问题描述】:

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

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

【讨论】:

如果通过单击复选图标将其变为绿色来完成,我只能在两天内完成(因为我想我已经回答了我自己的问题)。 已经休假一段时间了。完毕。抱歉耽搁了。

以上是关于按值传递结构,将另一个结构作为其成员之一,更改此成员的成员的值的主要内容,如果未能解决你的问题,请参考以下文章

C / C ++:将带有成员数组的结构/类按值传递给函数

如何在 Objective-C 中传递(按值)结构?

试图取消引用一个接口,该接口是一个指向后端结构对象的指针,以便我可以按值传递给函数

按值传递和返回结构(带有数组成员)

如何在 x86 程序集中按值传递结构

空的或不需要的结构字段