【发布时间】:2019-09-22 01:59:39
【问题描述】:
我问了这个问题,但我把它删除了,因为它不清楚。我有三个循环产生 0、1 个数据。我想将它们存储为一个矩阵,所以我认为它应该存储在一个多维数组中,我称之为Third。
for (i = 0; i < m; i++) {
for (int l = 0; l < n2; ++l) {
for (x = 0; x < all[i].n; ++x) {
f = (int)VECTOR(v2)[l];
if (a[x].vto == f) {
printf("%d", 1);
} else {
printf("%d", 0);
}
}
}
for (int y = 0; y < n1; ++y) {
for (x = 0; x < all[i].n; ++x) {
q = (int)VECTOR(v1)[y];
if (a[x].vfrom == q) {
printf("%d", 1);
} else {
printf("%d", 0);
}
}
}
printf("\n");
}
之前代码的打印结果是,我想将其存储在此表单中:
100010001111
111000000111100100010010001001
111000000000111000000000111100100100010010010001001001
110000001100000011101010010101
111100010001
我的目标是将打印的结果存储在一个数组中,例如
Third = [[[100][010][001][111]] [[111000][000111][100100][010010][001001]]...[[111][100][010][001]]]
所以如果我想访问数组Third,我会访问Third[3] = [ [110000] [001100] [000011] [101010] [010101] ] 或Third[3][1] = [001100] 或Third[3][1][2] = 1。
我很乐意澄清任何不清楚的地方。感谢您的帮助
编辑 1: 代码太大,无法完整添加。我询问了实现我正在寻找的一般方法,即如何构造一个多维数组或数组数组来存储来自任何三个嵌套循环(不是我的循环)的数据结果。
我修复了当前代码,所以现在数组 Third 包含所有数据,但我认为这不是存储数据以便以后以 Third[3] = [ [110000] [001100] [000011] [101010] [010101] ] 访问它的正确方法
这是我所做的:
int second[n1 + n2][n1 * n2];
int first[n1 * n2];
int Third[m][n1 + n2][n1 * n2];
for (i = 0; i < m; i++) {
Data *a = all[i].datas;
igraph_edge(&graph, i, &from, &to);
igraph_neighbors(&graph, &v1, from, IGRAPH_ALL);
igraph_neighbors(&graph, &v2, to, IGRAPH_ALL);
int n2 = igraph_vector_size(&v2);
int n1 = igraph_vector_size(&v1);
int f, q, x, l, y;
for (l = 0; l < n2; ++l) {
for (x = 0; x < all[i].n; ++x) {
f = (int)VECTOR(v2)[l];
if (a[x].vto == f) {
first[x] = 1;
} else {
first[x] = 0;
}
second[l][x] = first[x];
Third[i][l][x] = second[l][x];
printf("%d", Third[i][l][x]);
}
}
for (y = 0; y < n1; ++y) {
for (x = 0; x < all[i].n; ++x) {
q = (int)VECTOR(v1)[y];
if (a[x].vfrom == q) {
first[x] = 1;
} else {
first[x] = 0;
}
second[y+n2][x] = first[x];
Third[i][y+n2][x] = second[y+n2][x];
printf("%d", Third[i][y+n2][x]);
}
}
printf("\n");
}
在编译之前的代码时,我得到了
100010001111
111000000111100100010010001001
111000000000111000000000111100100100010010010001001001
110000001100000011101010010101
111100010001
我不确定这是否是正确的做法?谢谢
编辑 2:
我想知道下面这样的声明是否正确?是固定大小的三维数组Third 还是(根据需要)根据n1 和n2 动态变化,这取决于i 的迭代。
int second[n1 + n2][n1 * n2];
int first[n1 * n2];
int Third[m][n1 + n2][n1 * n2];
for (i = 0; i < m; i++) {
Data *a = all[i].datas;
igraph_edge(&graph, i, &from, &to);
igraph_neighbors(&graph, &v1, from, IGRAPH_ALL); //initialize the vector v2 where it's values and it's size vary depending on i
igraph_neighbors(&graph, &v2, to, IGRAPH_ALL); //initialize the vector v2 where it's values and it's size vary depending on i
int n2 = igraph_vector_size(&v2); // the size changes depending on i, i.e the change from an iteration to another
int n1 = igraph_vector_size(&v1); // the size changes depending on i, i.e the change from an iteration to another
int f, q, x, l, y;
for (l = 0; l < n2; ++l) {
for (x = 0; x < all[i].n; ++x) {
f = (int)VECTOR(v2)[l];
if (a[x].vto == f) {
first[x] = 1;
} else {
first[x] = 0;
}
second[l][x] = first[x];
Third[i][l][x] = second[l][x];
}
}
}
【问题讨论】:
-
我很乐意澄清任何不清楚的地方。请以minimal reproducible example开头。
-
另外,它在哪里崩溃?你的调试器告诉你什么?
-
您应该有一个能够容纳最大数组的“矩形”数组(并且浪费了空间,但通常不是问题)。或者你有一个指向数组的指针数组,然后你可以分别定义每个数组并将指针存储在指向数组的指针数组中。
-
我不知道你在这里复制代码时缩进是否损坏,但如果你修复它会更好。
-
我所知道的分段错误的最佳调试方法是在您怀疑可能发生的任何两行代码之间复制此行:
printf("%s: %i\n", __FILE__, __LINE__); getchar();。这样,您应该可以快速找到它的断裂点。
标签: c arrays for-loop multidimensional-array segmentation-fault