gpt4 book ai didi

c++ - 写入数组元素 [i][0][1] 也会覆盖 [i][1][0],反之亦然

转载 作者:行者123 更新时间:2023-11-27 23:56:44 25 4
gpt4 key购买 nike

我有一个数组:

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] 的 short int 并且对于任何其他坐标它都可以正常工作。我试过将它变小 [100][100][1],但问题是一样的,在 short int 内传递的值低于 100。

数组作为对函数的引用传递,之后我在主 block 中使用它,所有值都按预期设置,除了 [i][0][1] 和 [i][1][0]。

不幸的是,我无法发布所有代码,因为它非常大,但我通过大量日志记录仔细检查了问题是否与上述部分无关。

如果有人知道为什么会发生这种奇怪的行为,请提供帮助。

我还标记了代码块,因为我正在使用它,也许它是 mingw 编译器的已知错误?

无论如何,提前感谢您的任何建议。

最佳答案

简化您的用例后,您的错误变得非常明显。

让我们使用一个简单的一维数组,其大小等于数组最后一维的大小。而不是:

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]

关于c++ - 写入数组元素 [i][0][1] 也会覆盖 [i][1][0],反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com