我在处理禁止的内存访问方面遇到了问题。我有一个任务是找到矩阵的最高山峰(定义为高于围绕它的数字平方和的数字)。代码工作时,我硬编码它不能访问矩阵中的元素,这根本不是一件好事。
如何确保我永远不会尝试访问我不应该访问的内存?
typedef std::vector<std::vector<double>> Matrix;
typedef std::vector<double> Vector;
unsigned CalculateSum(Matrix mat, int counter, int x, int y)
{
unsigned sum(0);
if (x < counter) return 0;
for (int i(x - counter); i <= (x + counter); i++) {
if(y < counter) return 0;
for (int j(y - counter); j <= (y + counter); j++) {
if (i == x && j == y) continue;
sum += mat.at(i).at(j);
}
}
return sum;
}
Matrix HighestMountain(Matrix mat)
{
for (int i(0); i < mat.size(); i++) {
if (mat.at(i).size() != mat.size()) throw std::domain_error("Wrong
format");
}
Matrix insert;
Vector v;
int sum1(0), sum2(0);
int counter(1);
for (int i(0); i < mat.size(); i++) {
for (int j(0); j < mat.at(i).size(); j++) {
if(i == 0 || j == 0 || i == mat.size()-1 || j == mat.at(i).size()-1) continue;
while (CalculateSum(mat, counter, i, j) < mat.at(i).at(j)) {
insert.clear();
for (int k(i - counter); k <= counter + 2; k++) {
for (int l(j - counter); l <= counter + 2; l++) {
v.push_back(mat.at(k).at(l));
}
insert.push_back(v);
v.clear();
}
counter++;
if(counter > i || counter > j || i+counter > mat.size()-1 ||
j+counter > mat.at(i).size()-1) break;
}
}
}
return insert;
}
答案 0 :(得分:0)
首先确定您要处理的各种情况。角元素有三个邻居。不是角落的边缘元素有五个。内部元素有八个。因此,有三种不同的情况需要代码。
或者您可以使用每个尺寸2大于数据的矩阵,并在所有边元素中添加零。然后你感兴趣的一切都是内部元素,有八个邻居。
一切都与设计有关。