簡體   English   中英

C99 如何將簡單指針轉換為可變長度的多維數組?

[英]C99 How to cast simple pointer to a multidimensional-array of variable length?

在我的函數體reduce()initialize(...)我想將數組globalArray作為一個三維數組globalArray ,其中的維度直到運行時才知道。

如何將globalArray指針轉換為變長數組(指針)並自然使用? 我認為typedef方法有幫助,但我仍然迷失了方向。 在我的修補之后,這個當前版本可以編譯並且似乎可以工作。 演員 #1 和演員 #2 是否盡可能清晰和安全?

#include <stdlib.h>
#include <stdio.h>

double * globalArray; /* working from a situation where the array is global, declared elsewhere */
int M, N, P; /*array dimensions not known until runtime */

double reduce();
double reduce()
{
    /* Here I want to re-interpret the one-dimensional globalArray into
       a multi-dimensional variable-length array so that compiler takes
       care of the indexing math for me.*/
    typedef double (*arr_t)[N][P];

    const arr_t castArray = (arr_t)globalArray;  /* Cast #1 */

    double sum=0.0;
    for (int i=0; i<M; i++)
        for (int j=0; j<N; j++)
            for (int k=0; k<P; k++)
                sum += castArray[i][j][k];
    return sum;
}

void initialize(int M, int N, int P, double threedimarray[M][N][P])
{
    for (int i=0; i<M; i++)
        for (int j=0; j<N; j++)
            for (int k=0; k<P; k++)
                threedimarray[i][j][k] = (double)(i*N*P + j*P + k);
}

int main(int argc, char **argv)
{
    M = 10; N=1000; P=200;
    globalArray = malloc( M*N*P* sizeof(double) );

    typedef double (*arr_t)[N][P];
    initialize(M, N, P, (arr_t)globalArray); /* Cast #2 */

    double result = reduce();
    printf("Reduced result: %f\n", result );
    return 0;
}

https://ideone.com/5Y8Q64

我正在修改一個大型程序的一小部分。 顯然有比程序范圍數組指針更好的設計方法。 就是這樣。 從自我記錄的角度來看,如果解決方案不拋棄我們“知道”領先維度 (M) 的范圍這一事實,那就太好了。

與函數參數聲明相關的類似 SO 問題很有幫助,但我沒有把我猜的點聯系起來。 我決定在這里問,希望答案能傳達給更多人。

這是我經過一些修補后得出的一種可能的鑄造解決方案。

typedef double (*arr_t)[N][P];
arr_t castArray = (arr_t)globalArray;

/* Now castArray can be accessed by multi-dimensional index notation */
castArray[i][j][k] = 3.14;

缺點:

1) 不自行記錄已知的前導維度長度M

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM