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

时间:2017-02-12 01:16:05

标签: c++ codeblocks

我有一个数组:

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编译器的一个已知错误?

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

1 个答案:

答案 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]