繁体   English   中英

C中的2D可变长度数组的结构

[英]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*));

这个想法是将结构的成员链接到动态分配的数组。 这是编译器错误

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的问题/答案,您不能再问这个问题。 :-)

您在这里做了什么:

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的指针)。

然后,您需要自己计算索引:

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;
}

还有其他方法可以做到这一点,包括:

  1. 声明一个90长的1D指针数组以进行浮动,然后分配浮动行。

缺点是执行了91个malloc() / free()操作,而不是1个操作。不利的是,您可以分配一个具有不同长度行的参差不齐的数组。

  1. 声明一个静态(编译时)大小的数组float c [90] [buffer_size];

其中buffer_size是编译时间常数。 缺点是它的编译时间是固定的(并且如果较大且局部变量可能会破坏堆栈)。 好处是管理内部的r*90+c行计算已由您承担。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM