我遇到了在结构中存储数组的问题,这些问题会进一步写入文件。
问题在于矩阵的大小可以是可变的并且取决于用户的选择(顺便说一下,它也存储在结构中并且进一步存储在文件中)。 我承认我可以将数组的大小设置得足够大以容纳任何可能的大小值,但这会浪费空间。 此外,如果我单独编写数组的每个元素,那么单独处理每个值将是一件麻烦事。读取结构比单独读取许多值更好。 当然,如果我这样做:
struct attribs
{
int a[n][n], b[n][n], n;
}
然后它不起作用。我的问题有更明智的方法吗?至于目前我采取[] []和b [] []各自的大小为20X20,而期望值是4X4到9X9,并将实际值存储在n中,以便只有那个部分可以在结构时轻松读取正在阅读。
答案 0 :(得分:1)
您不能将可变长度数组作为结构类型的成员。您可以做的是使用灵活数组成员作为结构类型的最后一个成员。有关灵活阵列成员特征的更多信息,请参见c99,6.7.2.1。
在您的情况下,我认为最好的方法是在结构类型中使用指针成员,并通过malloc
分配数组对象。
答案 1 :(得分:1)
如果您使用GCC,可以写如下。
int size;
scanf("%d", &size);
typedef int mat[size][size];
struct attribs {
mat a, b;
int n;
};
struct attribs x;//Note that you can not create large arrays on the stack
x.n = size;
//do something
//x.a[row_index][col_index]=value;
使用指针在动态内存中创建。
#include <stdio.h>
#include <stdlib.h>
struct attribs {
void *a, *b;
int n;
};
int main (int argc, char *argv[]) {
int size;
scanf("%d", &size);
struct attribs x;
x.n = size;
x.a = malloc(sizeof(int[size][size]));
x.b = malloc(sizeof(int[size][size]));
int (*mat)[size][size] = x.a;
(*mat)[3][3] = 15;
printf("%d\n", (*mat)[3][3]);
free(x.a); free(x.b);
return 0;
}
答案 2 :(得分:0)
当您将结构写入文件时,其长度取决于用户的首选项,您应首先编写大小,然后编写每个数组的内容。然后要动态地重新创建矩阵,您只需要读取大小,分配适当的内存,然后读取值。
如何将矩阵a
与矩阵b
分开,取决于您,但您的示例显示它们的大小相同。这表明在将{n = n个整数读入a
后,您可以开始读取保存的b
值,假设您没有写出a
之间可能存在的任何可能的填充字节和b
(分别编写大小a
和b
,而不是一次写入整个结构以避免填充字节。)
如果你不能改变格式,并且这些值都是作为混乱的字节存储在一起,你必须盲目地读取,存储每个值。最后sizeof(int)
个字节将是大小,同样假设没有填充字节。
如果可能的话,省去很多麻烦并先写下尺码,然后是矩阵a
,然后是矩阵b
。
当然,由于矩阵是动态调整大小的,你可能首先动态分配一个指针数组,然后为每个指针分配一个int数组。在这种情况下,除非您遍历a
(a[0]
,a[1]
,...)的每个元素,否则您编写了指向文件的指针而不是它们指向的值。< / p>