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

0

Fortran で ISO_C_BINDING を使用し、モジュールの組み込み関数を使用することをお勧めしますc_f_pointer。これにより、C ポインターが Fortran 配列に関連付けられます。gfortran マニュアルの「Mixed Language Programming」の下に例があります。

于 2013-09-18T22:16:37.547 に答える