c - 将多维 C 数组传递给 FORTRAN 函数进行修改

标签 c multidimensional-array fortran

我正在尝试将一个在 C 中初始化的多维数组传递给 FORTRAN 函数并修改数组元素。我发现了一个类似的问题here ,但我无法让它与多维数组一起使用。尝试写入阵列会导致核心转储。我错过了什么?

代码示例:

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

double f_function(double ****);

double ****alloc_4D_double(int wlen, int xlen, int ylen, int zlen)
{
    int i,j,k;

    double ****ary = (double****)malloc(wlen*sizeof(double***));

    for (i = 0; i < wlen; i++) 
    {
        ary[i] = (double***)malloc(xlen*sizeof(double**));

        for (j = 0; j < xlen; j++) 
        {
            ary[i][j] = (double**)malloc(ylen*sizeof(double*));

            for (k = 0; k < ylen; k++) 
            {
                ary[i][j][k] = (double*)malloc(zlen*sizeof(double));
            }
        }
    }

    return ary;
}

int main ( void ) {

    double ****cary = alloc_4D_double(2, 2, 2, 2);

    // intialize values
    for (j=0; j < 2; j++)
    {       
        for (k=0; k < 2; k++)
        {
            for (l=0; l < 2; l++)
            {
                for (m=0; m < 2; m++)
                {
                    cary[j][k][l][m] = 0;
                }
            }
        }
    }   

    f_function (cary);

    return 0;
}

    real(4) function f_function(cary)
        use, intrinsic :: iso_c_binding    
        !DEC$ ATTRIBUTES C :: f_function

        implicit none    

        real(c_double)        , intent(out), dimension(2,2,2,2) :: cary

        ! attempt to overwrite value (core dump!)
        cary=1.1_c_double

        ...

    end function f_function

最佳答案

在 Fortran 中,多维数组作为连续数据存储在内存中。

但是,您在 C 中通过指向指向...的指针来声明多维数组,显然 Fortran 不知道如何处理它。

您只需malloc(wlen*xlen*ylen*zlen*sizeof(double)),并将这个单个指针传递给您的 Fortran 程序。

如果您非常需要多指针表示,您可以首先使用单个 malloc 将数据数组分配为连续数据,然后将指针分配给指针,使它们最终指向数据数组内部。和以前一样,您只将指向数据数组的指针传递给 Fortran。因此 Fortran 不会看到多个指针,但您仍然可以在 C 中使用它们。

关于c - 将多维 C 数组传递给 FORTRAN 函数进行修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18881139/

相关文章:

c - eclipse /GDB : How to set an automatic breakpoint after hardware reset?

php - for 循环 > if 语句 ($foo=$array[$i])

javascript - 二维数组 Javascript

fortran - Fortran中BLOCK的意义是什么?

python - 尝试安装 scipy 时出现 Fortran 错误

c - pthread 的问题

c - 英特尔编译器优化

在c中将图像的一个区域更改为 "color"

java - 我在多维数组的特定索引处输入和显示字符时遇到问题

fortran - 为什么具有可分配组件的 coarray 在从不同图像访问时会产生分割错误?