【问题标题】:C99 How to cast simple pointer to a multidimensional-array of variable length?C99 如何将简单指针转换为可变长度的多维数组?
【发布时间】:2018-03-07 22:52:51
【问题描述】:

在我的函数体 reduce()initialize(...) 中,我想将数组 globalArray 作为一个三维数组,其中的维度直到运行时才知道。

如何将globalArray 指针转换为可变长度数组(指针)并自然地使用它? 我认为typedef 方法会有所帮助,但我仍然迷路了。这个当前版本在我修修补补后编译并且似乎可以工作。 Cast #1 和 Cast #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 问题很有帮助,但我并没有把我猜想的点连接起来。我决定在这里提问,希望答案能惠及更多人。

【问题讨论】:

  • 你试过了吗:double castArray[M][N][P] = (double[][][])globalArray; ?
  • 好吧,现在我有:错误:数组的元素类型不完整'double []'
  • 可以这样,但是M、N、P必须是const:double(castArray)[2][2][2] = (double() [2][2][2])全局数组;但最好像这样访问 globalArray: globalArray[i * M + j * N + k],其中 0
  • 正确的表达式是globalArray[i * N*P + j * P + k],但这正是我试图通过 C99 可变长度数组功能避免的。

标签: c multidimensional-array casting c99 variable-length-array


【解决方案1】:

这是我经过一番修改后得出的一种可能的铸造解决方案。

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

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多