给定的参数值在C ++中的函数体中被更改

时间:2015-03-04 20:56:28

标签: c++ visual-studio-2013

我有以下标题和函数定义;

blautil.hpp

namespace blautil{
    ...
    cv::Mat compute_mean_mat(std::vector<cv::Mat> data, const int w, const int h);
    ...
}

blautil.cpp

namespace blautil{
...
    cv::Mat compute_mean_mat(std::vector<cv::Mat> data, const int w, const int h){
        cv::Mat Mean = cv::Mat::zeros(w, h, CV_32F);
        for (int i = 1; i <= data.size(); i++){
            cv::Mat image = data[i];
            Mean += image;
        }
        Mean = Mean / data.size();
        Mean.convertTo(Mean, CV_8U);
        return Mean;
    }
...
}

我在这里称呼它;

cv::Mat mean_img = blautils::compute_mean_mat(imageVector, width, height);

问题是在运行时这些宽度和高度值分别为25和45但是当代码进入函数体时,它们会变为不同的随机大值。

我在VS2013 Win8编码。从这些观察中,你会建议你诊断出那个有趣的问题?

编辑: 一旦我在一次编译之前和之后定义了w和h的默认值,我就删除了。之后发生了这个问题。同样的问题也出现在另一个函数中,我通过改变函数参数的顺序解决了它,但是现在它不能正常工作

2 个答案:

答案 0 :(得分:2)

当参数被覆盖时,它可能意味着您正在写入堆栈的边界。我不知道它是否会导致实际问题,但您正在尝试访问无效的数据元素,因为我可以成为data.size()。循环应该是

for (int i = 1; i <= data.size(); i++){
...
}

要分析这个特定的问题,printf或cout i的值以及w和h的值,你应该能够看到它出错的地方。

答案 1 :(得分:0)

我看到的一个错误就是这个错误:

for (int i = 1; i <= data.size(); i++)
                  ^^
{
    cv::Mat image = data[i];
    Mean += image;
}

应该是:

for (int i = 1; i < data.size(); i++)

更安全,你不会超出界限:

#include <algorithm>
//...
std::for_each(data.begin(), data.end(), [&](cv::Mat& m){Mean += m;});