簡體   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