1

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

代码示例:

#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
4

2 回答 2

2

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

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

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

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

于 2013-09-18T20:04:33.770 回答
0

我建议在 Fortran 中使用 ISO_C_BINDING 和模块中的内在函数c_f_pointer,它将 C 指针与 Fortran 数组相关联。在“混合语言编程”下的 gfortran 手册中有一个示例。

于 2013-09-18T22:16:37.547 回答