给定的参数值在 C++ 中的函数 body 中被更改
given argument values are changed in the function body in C++
我有以下header和函数定义;
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 但是当代码进入函数时 body 它们会变成不同的随机大值。
我在 VS2013 Win8 上编码。从这些观察中,您会提出什么建议来诊断那个有趣的问题?
编辑:
一旦我在一次编译前后为 w 和 h 定义了默认值,我就删除了。之后就出现了这个问题。同样的问题也出现在另一个函数上,我通过改变函数参数的顺序解决了它,但现在它还不能正常工作
当参数被覆盖时,这可能意味着您正在覆盖堆栈的边界。我不知道它是否会导致实际问题,但您正在尝试访问无效的数据元素,因为我可以成为 data.size()。循环应该是
for (int i = 1; i <= data.size(); i++){
...
}
要具体分析这个问题,printf 或 cout i 的值连同 w 和 h 的值,你应该能看出哪里出了问题。
我马上看到的一个错误是:
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;});
我有以下header和函数定义;
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 但是当代码进入函数时 body 它们会变成不同的随机大值。
我在 VS2013 Win8 上编码。从这些观察中,您会提出什么建议来诊断那个有趣的问题?
编辑: 一旦我在一次编译前后为 w 和 h 定义了默认值,我就删除了。之后就出现了这个问题。同样的问题也出现在另一个函数上,我通过改变函数参数的顺序解决了它,但现在它还不能正常工作
当参数被覆盖时,这可能意味着您正在覆盖堆栈的边界。我不知道它是否会导致实际问题,但您正在尝试访问无效的数据元素,因为我可以成为 data.size()。循环应该是
for (int i = 1; i <= data.size(); i++){
...
}
要具体分析这个问题,printf 或 cout i 的值连同 w 和 h 的值,你应该能看出哪里出了问题。
我马上看到的一个错误是:
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;});