通过更改代码格式来计算结构向量中包含的双变量的平均值的不同结果?

Posted

技术标签:

【中文标题】通过更改代码格式来计算结构向量中包含的双变量的平均值的不同结果?【英文标题】:Different results calculating the average of double variables contained in a vector of structs by altering code formatting? 【发布时间】:2012-11-12 09:37:59 【问题描述】:

我目前正在与 OpenCV/C++ 的一个非常奇怪的行为作斗争。这就是我正在做的:

更新1:这里有更多信息:

我计算一组像素的梯度方向并将它们存储在自声明的structdouble 字段中。结构元素存储在向量中。

myfunct1() 
    (...)
    c.grad_orientation = (sum_ori / highgrads.size()) + M_PI; // +M_PI because i just  want to rotate the angle around 180°.
    (...)
    my_struct_vector.push_back(c);

我后来将几个 c 存储在一个向量中,并想估计每个 grad_orientation 的平均值,存储在我的向量的每个结构元素中,如下所示:

myfunct0() 
    myfunct1(); //adds element to the my_struct_vector
    (...)
    int n = 0;
    double total_ori = 0.0;
    for (uint i = 0; i < my_struct_vector.size(); ++i) 
        total_ori += my_struct_vector[i].grad_orientation;
        n++;
    

    azimuth = (total_ori / n);
    cout << "Average: " << azimuth * 180/M_PI << endl; // print out in degrees

现在是有趣的部分:如果我在某些情况下这样做,cout 将打印 215.963。这是我最常得到的结果(正是这个结果)。 在某些情况下,如果我添加上面命名的这些矩阵,或者(是的,真的)如果我将结构中包含grad_orientation 的双字段移动到更高一列的代码,我得到223.442。所以代码中两个结果的区别只有如下:

struct my_struct 

std::vector<cv::Point> contour_shadow;
std::vector<cv::Point> contour_light;
cv::RotatedRect rect;
cv::Point pf; 
cv::Point pc;
double grad_orientation; // this line moved one column down, beneath "grad_flag" results in a differing result.
bool grad_flag;
double grad_magnitude;

;

打印结果不仅取决于结构声明中列的位置,还取决于我更改代码的不同部分时。

这可能与双精度有关,但是如果我移动代码列,为什么它会改变?

【问题讨论】:

听起来像是一些缓冲区溢出。如果没有看到声明图像变量的代码,以及在它们的实例化和上面的函数调用之间对它们执行的操作,很难判断。 检查你是如何做循环的。完成标准是 craters.size(),然后是 my_struct[i] ??我会期待陨石坑[i]。另一个技巧是使用好的调试器,你很快就会发现问题 另一方面,您的“编辑”似乎与您的第一个问题完全无关,似乎与opencv没有任何关系。可能超出数组范围或类似 好吧,是的,我现在很困惑。我已经删除了过时的部分以澄清问题,我希望现在更好。对于您的第一条评论:我在这里复制代码时犯了一个错误。现在应该清楚了,对不起。由于程序的大小和复杂性,调试是我的最后一步,但我现在就去做。谢谢。 如果你替换了行,并且碰巧使用了未初始化的内存(我仍然相信是这种情况),那么当它尝试读取 grad_orientation 时,它将从你的(未初始化的)内存的另一部分读取它,因为结构在内存中按成员的顺序顺序排列。可能这个位置的数据不是完全随机的,因此每次的结果都是一样的。 【参考方案1】:

好的,感谢 Rolle 在这方面的帮助。我希望可以回答我自己的问题只是为了标记它已回答? 问题确实是在结构内部使用了未初始化的内存和布尔标志(在错误的决定之后)(如果未初始化,当然不是零)。事情很明显,但是代码中的行交换(甚至在结构之外!)导致错误(但不知何故非随机)值的事实让我有点困惑。

请看这里Are members of a C++ struct initialized to 0 by default?

【讨论】:

以上是关于通过更改代码格式来计算结构向量中包含的双变量的平均值的不同结果?的主要内容,如果未能解决你的问题,请参考以下文章

从类中包含的结构访问变量

为了能够检查向量中包含的类的数据成员,我需要在 autoexp.dat 中输入啥?

Codeigniter,通过变量中包含的值增加数据库值

如何处理 C++ 17 中变体中包含的类型的无意义方法

如何从类外修改向量

如何更改向量中元素的值?