我的程序会创建一个矩阵。它移动并将其中心化为更大的一个。现在我想填充使用第一个矩阵的边缘值创建的边框,使其看起来像这样:
到目前为止,我有以下代码,但它似乎无法正常工作(让我们将矩阵视为具有宽度,高度和边框的图像):
/////////////////////////Up/Down Fill////////////////////////////
for(i=border;i<(width+border);i++){
for(j=0;j<(height+2*border);j++){
if(j<border){
fmatr[i][j]=fmatr[i][border];
}
else if(j>(height+border)){
fmatr[i][j]=fmatr[i][(height+border)];
}
}
}
/////////////////////////Left/Right//////////////////////////////
for(i=0;i<(width+2*border);i++){
for(j=0;j<(height+2*border);j++){
if(i<border){
fmatr[i][j]=fmatr[border][j];
}
else if(i>(width+border)){
fmatr[i][j]=fmatr[(width+border)][j];
}
}
}
有人能指出我正确的方向吗?
答案 0 :(得分:1)
您是 off-one错误的受害者。
通常在C中,要迭代一个序列,你就这样使用了start index和next_to_last索引:
for (i = first; i < next_to_last; ++i)
这很方便,因为next_to_last索引是第一个加上长度:
for (i = first; i < first + length; ++i)
如果您想知道索引是否超出范围,请使用<
和>=
:
out_of_bounds = i < first || i >= next_to_last;
out_of_bounds = i < first || i >= first + length;
所有这一切都很酷,因为当你有两个连续的序列时,你不必在从一个到另一个时进行任何调整:
for (i = 0; i < a; ++i) ...;
for (; i < b; ++i) ...;
for (; i < c; ++i) ...;
但是如果你想访问一个序列的最后一个元素,你必须记住减去一个:
last = array[next_to_last - 1];
last = array[first + length - 1];
所以当你说:
else if(j>(height+border)){
fmatr[i][j] = fmatr[i][(height+border)];
}
你可能意味着:
else if(j >= height + border){
fmatr[i][j] = fmatr[i][height + border - 1];
}
和witdh一样。
那说我会把内循环写成两个循环。 IMO你的意图更加清晰:
for (j = 0; j < border; ++j)
fmatr[i][j] = fmatr[i][border];
for (j = height + border; j < height + 2 * border; ++j)
fmatr[i][j]=fmatr[i][height + border - 1];
与宽度运行相同。