c - C中初始化多维数组类似于Fortran

标签 c fortran

我用 FORTRAN 90 编写了一个小型测试用例程序,它初始化切片中的 3d 数组。可以在 C 语言中轻松复制相同的行为吗?

  program fortranEngine

  real(4) , dimension(10,10) :: tmp
  real(4) , dimension(10,10,3) :: p    

  tmp = RESHAPE( [  0.973, 1.053, 0,     0,     0,     0,     0,     0,     0,     0, &
                    1.053, 1.080, 0,     0,     0,     0,     0,     0,     0,     0, &
                    1.010, 0.408, 0.442, 0,     0,     0,     0,     0,     0,     0, &
                    1.119, 0.900, 0.399, 0.762, 0,     0,     0,     0,     0,     0, &
                    1.211, 0.975, 0.845, 0.952, 1.105, 0,     0,     0,     0,     0, &
                    1.248, 1.016, 0.485, 0.000, 0.000, 1.110, 0,     0,     0,     0, &
                    1.225, 1.123, 1.056, 0.000, 0.000, 0.949, 0.832, 0,     0,     0, &
                    1.138, 1.232, 1.089, 1.050, 0.930, 0.402, 0.789, 0.774, 0,     0, &
                    1.149, 1.406, 1.201, 1.052, 0.416, 0.878, 0.896, 0.431, 1.144, 0, &
                    1.351, 1.255, 1.290, 1.358, 1.240, 1.228, 1.257, 1.140, 1.123, 1.228] &
                    , [10,10] )    

    p(:,:,1) = tmp    

    ...

    end program fortranEngine

最佳答案

您或多或少可以在 C99 或 C2011 中执行此操作,但不如在 Fortran 中方便。当心initialization命令; Fortran 以一种顺序(列优先)执行,C 以另一种顺序(行优先)执行。忽略它,你可以这样做:

float tmp[10][10] =
{
    { 0.973, 1.053, 0,     0,     0,     0,     0,     0,     0,     0,    },
    { 1.053, 1.080, 0,     0,     0,     0,     0,     0,     0,     0,    },
    { 1.010, 0.408, 0.442, 0,     0,     0,     0,     0,     0,     0,    },
    { 1.119, 0.900, 0.399, 0.762, 0,     0,     0,     0,     0,     0,    },
    { 1.211, 0.975, 0.845, 0.952, 1.105, 0,     0,     0,     0,     0,    },
    { 1.248, 1.016, 0.485, 0.000, 0.000, 1.110, 0,     0,     0,     0,    },
    { 1.225, 1.123, 1.056, 0.000, 0.000, 0.949, 0.832, 0,     0,     0,    },
    { 1.138, 1.232, 1.089, 1.050, 0.930, 0.402, 0.789, 0.774, 0,     0,    },
    { 1.149, 1.406, 1.201, 1.052, 0.416, 0.878, 0.896, 0.431, 1.144, 0,    },
    { 1.351, 1.255, 1.290, 1.358, 1.240, 1.228, 1.257, 1.140, 1.123, 1.228 },
};
float p[3][10][10];    

for (int i = 0; i < 3; i++)
    memmove(p[i], tmp, sizeof(tmp));

请注意,虽然我将维度 [3] 从声明的末尾移到了声明的开头。另一种方式在 C 中没有多大意义。因此,该表示法或多或少可用,但存储管理的细节使得如何准确实现您想要的不太明显。

关于c - C中初始化多维数组类似于Fortran,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411041/

相关文章:

c - ALSA中period的含义

C 以与 Java Compiler Api 7 相同的方式动态加载代码

指针可以表现为变量吗?

c - 为什么在 C 语言的 Ubuntu Linux 上 pango_layout_get_pixel_size 略有错误

optimization - 过度使用函数调用会影响性能吗?特别是在 Fortran 中

python - 快速将 numpy 数组加载到 Fortran 中

linux - 采购 `compilervars.sh intel64` 时 libtbb.so.2 库不存在

c - 在 C 中为密码添加随机符号

loops - 关于MPI并行循环的问题

调用 Fortran 例程的 C MPI 程序崩溃