簡體   English   中英

將數組從C傳遞到Fortran而不知道大小?

[英]Passing arrays from C to Fortran without knowing the size?

我正在嘗試將3D動態數組從C傳遞到Fortran。 例如,我第一次調用該函數

 extern "C" Fun_(double X[], double Y[], double Z[],
                 int *Nx, int *Ny, int *Nz,
                 double F[][20][20]);

第二次我必須將其更改為

extern "C" Fun_(double X[], double Y[], double Z[],
                int *Nx, int *Ny, int *Nz,
                 double F[][10][40]);

等等。 主要代碼是

int main() {
char path[500],id_type[3];
char *dir_path, *file_path;      
Nx=10000,Ny=20,Nz=20; ----> or Ny=10,Nz=40;                                       
double X[Nx], Y[Ny], Z[Nz];
double F[Nx][20][20] --- > or F[Nx][10][40];
....}

陣列更改446次。 因此,我必須動態更改其大小。 有什么建議么? 謝謝

Fortran代碼很長,但這是相關的部分

SUBROUTINE  Fun(X,Y,Z,Nx,Ny,Nz,F)
integer :: Nx,Ny,Nz,inx,iny,inz
real(8) :: F(Nx,Ny,Nz)
real(8) :: X(Nx),Y(Ny),Z(Nz)
....

警告:自從我開始使用fortran已經很長時間了,但這就是我想出的。

可變長度數組似乎很容易。 但是,C對其2D [及更高]數組使用行優先順序。 但是,Fortran使用列優先順序。 因此,C代碼或Fortran代碼都需要意識到這一點。

我創建了兩個子例程: subx是本機Fortran,按列排序。 並且, suby與C兼容,行優先。

另外,下面是一些測試輸出。 由於將數組創建為與C兼容,行suby的數組,因此只有suby產生預期的輸出。

旁注:我對此的參考之一是: http : //www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html


這是C代碼:

#include <stdio.h>

void subx_(int *,int *,int *);
void suby_(int *,int *,int *);

void
dotest(int Dy,int Dx)
{
    int val = 0;

    int arr[Dy][Dx];

    for (int y = 0;  y < Dy;  ++y) {
        for (int x = 0;  x < Dx;  ++x)
            arr[y][x] = val++;
    }

    subx_(&Dy,&Dx,&arr[0][0]);
    suby_(&Dy,&Dx,&arr[0][0]);
}

int
main(void)
{

    printf("testing ...\n");
    dotest(3,4);
    dotest(6,5);

    return 0;
}

這是Fortran代碼:

! this uses column-major order -- _not_ C compatible
subroutine subx(Dy,Dx,arr)
integer :: Dy,Dx
integer :: arr(Dy,Dx)
integer :: x,y

    write(*,700) ""
700 format (a)
    write(*,800) "subx: Dy=",Dy," Dx=",Dx
800 format (a,i4,a,i4)

    do y = 1, Dy
        do x = 1, Dx

    write(*,900) "subx ",x,y,arr(y,x)
900 format (a,i8,i8,i8)

        end do
    end do

end subroutine subx

! this uses row-major order -- _is_ C compatible
subroutine suby(Dy,Dx,arr)
integer :: Dy,Dx
integer :: arr(Dx,Dy)
integer :: x,y

    write(*,700) ""
700 format (a)
    write(*,800) "suby: Dy=",Dy," Dx=",Dx
800 format (a,i4,a,i4)

    do y = 1, Dy
        do x = 1, Dx

    write(*,900) "suby ",x,y,arr(x,y)
900 format (a,i8,i8,i8)

        end do
    end do

end subroutine suby

這是程序輸出:

testing ...

subx: Dy=   3 Dx=   4
subx        1       1       0
subx        2       1       3
subx        3       1       6
subx        4       1       9
subx        1       2       1
subx        2       2       4
subx        3       2       7
subx        4       2      10
subx        1       3       2
subx        2       3       5
subx        3       3       8
subx        4       3      11

suby: Dy=   3 Dx=   4
suby        1       1       0
suby        2       1       1
suby        3       1       2
suby        4       1       3
suby        1       2       4
suby        2       2       5
suby        3       2       6
suby        4       2       7
suby        1       3       8
suby        2       3       9
suby        3       3      10
suby        4       3      11

subx: Dy=   6 Dx=   5
subx        1       1       0
subx        2       1       6
subx        3       1      12
subx        4       1      18
subx        5       1      24
subx        1       2       1
subx        2       2       7
subx        3       2      13
subx        4       2      19
subx        5       2      25
subx        1       3       2
subx        2       3       8
subx        3       3      14
subx        4       3      20
subx        5       3      26
subx        1       4       3
subx        2       4       9
subx        3       4      15
subx        4       4      21
subx        5       4      27
subx        1       5       4
subx        2       5      10
subx        3       5      16
subx        4       5      22
subx        5       5      28
subx        1       6       5
subx        2       6      11
subx        3       6      17
subx        4       6      23
subx        5       6      29

suby: Dy=   6 Dx=   5
suby        1       1       0
suby        2       1       1
suby        3       1       2
suby        4       1       3
suby        5       1       4
suby        1       2       5
suby        2       2       6
suby        3       2       7
suby        4       2       8
suby        5       2       9
suby        1       3      10
suby        2       3      11
suby        3       3      12
suby        4       3      13
suby        5       3      14
suby        1       4      15
suby        2       4      16
suby        3       4      17
suby        4       4      18
suby        5       4      19
suby        1       5      20
suby        2       5      21
suby        3       5      22
suby        4       5      23
suby        5       5      24
suby        1       6      25
suby        2       6      26
suby        3       6      27
suby        4       6      28
suby        5       6      29

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM