我有一个数组:
typedef short int long_graph[1000][1000][1];
我宣布:
long_graph paf_graph;
我有一个功能:
void construct_paf_graph (sf::Vector2i A,sf::Vector2i B, long_graph &paf_graph, long_list &paf_list, poly_list &poly, int &no_of_poly_on_map, list_of_indexes &XX )
{
short int n,i,j,k,e, t, off; // t is used to convert indices from individual polies to the unified list
bool path_clear;
short int distance, rev_en_ind; // reverse engineer index
n=0; //will be total number of points in paf_graph and paf_list
t=0;
std::fstream debug;
debug.open("assets/debug.txt", std::ios::out | std::ios::trunc);
for ( i=1; i<=XX[0]; i+=1 )
{
debug << XX[i] << "\n";
for ( j=1; j<= poly[XX[i]].point[0].x; j+=1 )
{
n+=1;
paf_graph[n][0][0] = poly[XX[i]].graph[j][0][0];
//paf_graph[n][0][1] = i;
debug << "P["<<n<<"] = " << paf_graph[n][0][1] << " \n";
for (k=1; k<= poly[XX[i]].graph[j][0][0]; k+=1)
{
paf_graph[n][k][0] = poly[XX[i]].graph[j][k][0] + t;
paf_graph[n][k][1] = poly[XX[i]].graph[j][k][1];
debug << " P["<<n<<"] = " << paf_graph[n][0][1] << " " << "k="<<k<< " c="<<poly[XX[i]].graph[j][k][0] + t<<" \n";
if (k==1) debug << "\n\n PP = " << paf_graph[n][k][0] << " " << poly[XX[i]].graph[j][k][0] + t <<"\n";
}
off = paf_graph[n][1][0];
paf_graph[n][0][1] = i;
//paf_graph[n][1][0] = off;
paf_list[n].x = poly[XX[i]].point[j].x;
paf_list[n].y = poly[XX[i]].point[j].y;
}
debug << "\n";
t+= poly[XX[i]].point[0].x;
}
paf_graph[0][0][0] = n;
paf_list[0].x = n;
// function continues some more
我在这里发现了问题:
//paf_graph[n][0][1] = i; //this was not commented originally
debug << "P["<<n<<"] = " << paf_graph[n][0][1] << " \n";
for (k=1; k<= poly[XX[i]].graph[j][0][0]; k+=1)
{
paf_graph[n][k][0] = poly[XX[i]].graph[j][k][0] + t; //when k is 0 e.g. [n][1][0] it also overwrites [n][0][1] with the value
paf_graph[n][k][1] = poly[XX[i]].graph[j][k][1];
debug << " P["<<n<<"] = " << paf_graph[n][0][1] << " " << "k="<<k<< " c="<<poly[XX[i]].graph[j][k][0] + t<<" \n";
if (k==1) debug << "\n\n PP = " << paf_graph[n][k][0] << " " << poly[XX[i]].graph[j][k][0] + t <<"\n";
}
为了隔离这个奇怪的现象,我在更大的代码块中加了3行:
off = paf_graph[n][1][0];
paf_graph[n][0][1] = i; //this line also writes i to [n][1][0]
//paf_graph[n][1][0] = off; //if I take the comment off this line it will
// write "off" to [n][0][1] as well
//so whatever I do they both have the same value
//and one is always wrong
奇怪的是数组本身是[1000] [1000] [1]的短整数和任何其他坐标它工作正常。 我试过把它缩小[100] [100] [1],但问题是一样的,在短整数中传递的值都低于100。
数组作为对函数的引用传递,然后我在主块中使用它,除了[i] [0] [1]和[i] [1] [0]之外,所有值都按预期设置。
不幸的是我无法发布所有代码,因为它非常大,但我已经仔细检查了很多日志记录,问题是与上述部分隔离的。
如果有人知道为什么会发生这种奇怪的行为,请帮助。
我还标记了代码块,因为我正在使用它或许它是mingw编译器的一个已知错误?
无论如何,提前感谢任何建议。
答案 0 :(得分:3)
简化用例后,您的错误变得非常明显。
让我们使用一个简单的一维数组,其大小等于数组最后一个维度的大小。而不是:
typedef short int long_graph[1000][1000][1];
我们只使用一维数组,其大小与最后一维的大小相同:
typedef short int tiny_graph[1];
现在,您宣布了这样的事情:
tiny_graph x;
现在问自己一个问题:这里有效的数组索引是什么?
答案非常明显。只有一个:x[0]
。此数组只有一个值,如您所知,数组索引从0开始。
现在,让我们回到你的阵列:
typedef short int long_graph[1000][1000][1];
让我们看一下有问题的陈述:
paf_graph[n][0][1] = i
你的错误现在应该非常明显。没有paf_graph[n][0][1]
,因为[0]
是此数组的最后一个,第三个维度的最后一个有效索引。并且由于数组衰减到指针和指针算术的方式,这最终会解决下一个更高维度数组的[0]
。