C中二维可变长度数组的结构
Struct of 2D Variable Length Array in C
我正在尝试创建一个包含 2 个可变长度数组的结构(buffer_size 是在 运行 时获取的可变参数)。
这是我的代码:
struct data {
float *c; //2D array
float *mtdt; //1D array
};
struct data c_matrice;
c_matrice.c = malloc((90 * sizeof (float*) * buffer_size));
c_matrice.mtdt = malloc(90 * sizeof (float*));
想法是 link 结构的成员到动态分配的数组。
这是编译器错误
expected « = », « , », « ; », « asm » or « __attribute__ » before « . » token
c_matrice.c = malloc((90 * sizeof (float*) * buffer_size));
当我尝试访问这些成员时,我得到
subscripted value is neither array nor pointer nor vector
在之前的问题中,我一直没能找到解决问题的方法。坦率地说,作为初学者,我什么都不懂。我错过了什么?
编辑 1:好的,我通过将最后两行移到我的 main.c 而不是 .h 文件中来消除第一个错误(这是一个基本的愚蠢错误)。现在我还要面对
subscripted value is neither array nor pointer nor vector
当我尝试使用类似这样的方式访问结构时
pmoy = pow(10,(c_matrice->c[i][curve2apply]/20))*pmax;
顺便说一句,整个代码真的很大,我给你展示的只是实际代码的一小部分。
如果 c
是结构的成员,那么您必须使用 c_matrice.c
,而不是 c_matrice->c
。并仔细注意人们告诉你的关于 c
不是二维数组的所有内容。要分配这些,SO 上有大量 question/answers,你不能再问这个问题了。 :-)
你在这里做了什么:
c_matrice.c = malloc((90 * sizeof (float*) * buffer_size));
分配一个大小为 90 * 浮点指针大小 * buffer_size 的长缓冲区。
关于如何在 C 中实现二维数组,您有很多选择。
一种方法是将现有内容更改为:
c_matrice.c = malloc((90 * sizeof (float) * buffer_size));
因此您已经为 90*buffer_size
float
分配了 space(而不是指向 float
的指针)。
然后你需要自己计算索引:
float get_matrix_element(struct data *c_matrix, size_t row, size_t column) {
return c_matrix->c[row*buffer_size+column];
}
这是一种非常流行且非常有效的数据存储方式,因为它存储为一个内存块,您可以做一些有用的事情,例如在单个块中分配它并遍历它而不用关心结构:
float get_matrix_sum(struct data *c_matrix) {
size_t sz=buffer_size*90;
float sum=0.0f;
for(size_t i=0;i<sz;++i){
sum+=c_matrix->c[i];
}
return sum;
}
还有其他方法可以做到这一点,包括:
- 声明一个 90 长的一维浮点指针数组,然后分配浮点行。
缺点是 91 malloc()
/free()
次操作,而不是 1 次。
好处是您可以分配一个具有不同长度行的参差不齐的数组。
- 声明一个静态(编译时)大小的数组 float c[90][buffer_size];
其中 buffer_size
是编译时间常量。
缺点是它的编译时间是固定的(如果很大并且局部变量可能会破坏堆栈)。
好处是管理内部 r*90+c
行计算从你身上拿走了。
我正在尝试创建一个包含 2 个可变长度数组的结构(buffer_size 是在 运行 时获取的可变参数)。 这是我的代码:
struct data {
float *c; //2D array
float *mtdt; //1D array
};
struct data c_matrice;
c_matrice.c = malloc((90 * sizeof (float*) * buffer_size));
c_matrice.mtdt = malloc(90 * sizeof (float*));
想法是 link 结构的成员到动态分配的数组。 这是编译器错误
expected « = », « , », « ; », « asm » or « __attribute__ » before « . » token
c_matrice.c = malloc((90 * sizeof (float*) * buffer_size));
当我尝试访问这些成员时,我得到
subscripted value is neither array nor pointer nor vector
在之前的问题中,我一直没能找到解决问题的方法。坦率地说,作为初学者,我什么都不懂。我错过了什么?
编辑 1:好的,我通过将最后两行移到我的 main.c 而不是 .h 文件中来消除第一个错误(这是一个基本的愚蠢错误)。现在我还要面对
subscripted value is neither array nor pointer nor vector
当我尝试使用类似这样的方式访问结构时
pmoy = pow(10,(c_matrice->c[i][curve2apply]/20))*pmax;
顺便说一句,整个代码真的很大,我给你展示的只是实际代码的一小部分。
如果 c
是结构的成员,那么您必须使用 c_matrice.c
,而不是 c_matrice->c
。并仔细注意人们告诉你的关于 c
不是二维数组的所有内容。要分配这些,SO 上有大量 question/answers,你不能再问这个问题了。 :-)
你在这里做了什么:
c_matrice.c = malloc((90 * sizeof (float*) * buffer_size));
分配一个大小为 90 * 浮点指针大小 * buffer_size 的长缓冲区。
关于如何在 C 中实现二维数组,您有很多选择。 一种方法是将现有内容更改为:
c_matrice.c = malloc((90 * sizeof (float) * buffer_size));
因此您已经为 90*buffer_size
float
分配了 space(而不是指向 float
的指针)。
然后你需要自己计算索引:
float get_matrix_element(struct data *c_matrix, size_t row, size_t column) {
return c_matrix->c[row*buffer_size+column];
}
这是一种非常流行且非常有效的数据存储方式,因为它存储为一个内存块,您可以做一些有用的事情,例如在单个块中分配它并遍历它而不用关心结构:
float get_matrix_sum(struct data *c_matrix) {
size_t sz=buffer_size*90;
float sum=0.0f;
for(size_t i=0;i<sz;++i){
sum+=c_matrix->c[i];
}
return sum;
}
还有其他方法可以做到这一点,包括:
- 声明一个 90 长的一维浮点指针数组,然后分配浮点行。
缺点是 91 malloc()
/free()
次操作,而不是 1 次。
好处是您可以分配一个具有不同长度行的参差不齐的数组。
- 声明一个静态(编译时)大小的数组 float c[90][buffer_size];
其中 buffer_size
是编译时间常量。
缺点是它的编译时间是固定的(如果很大并且局部变量可能会破坏堆栈)。
好处是管理内部 r*90+c
行计算从你身上拿走了。