我正在尝试创建一个包含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*));
这个想法是将结构的成员链接到动态分配的数组。 这是编译器错误
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;
顺便说一下,整个代码真的很大,我提供给你的只是实际代码的一小部分。
答案 0 :(得分:0)
如果c
是结构的成员,则必须使用c_matrice.c
,而不是c_matrice->c
。并仔细记下人们告诉你的关于c
不是二维数组的所有内容。要分配这些,在SO上有大量的问题/答案,你不能再问这个问题。 :-)
答案 1 :(得分:0)
你在这里做了什么:
c_matrice.c = malloc((90 * sizeof (float*) * buffer_size));
分配一个大小为90 *的指针到浮点数* buffer_size的长缓冲区。
在C中实现2D数组的方法有很多选择。 一种方法是改变你拥有的东西:
c_matrice.c = malloc((90 * sizeof (float) * buffer_size));
所以你已经为90*buffer_size
float
分配了空间(而不是指向float
s的指针。)
然后您需要自己计算索引:
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;
}
还有其他方法可以做到这一点,包括:
缺点是91 malloc()
/ free()
次操作而不是1次。
好处是你可以分配一个不同长度行的不规则数组。
其中buffer_size
是编译时常量。
缺点是它的编译时间是固定的(如果大且局部变量可能会破坏堆栈)。
好处是管理内部r*90+c
行计算。