为什么值放置在 fortran 函数的数组中,而在调用 c++ 函数中不存在

Why are values placed in an array in a fortran function not there in the calling c++ function?

本文关键字:函数 调用 不存在 c++ fortran 为什么 数组      更新时间:2023-10-16

我有一堆Fortran代码,我正在用一些c ++代码进行调整。问题区域基本上可以归结为:

调用 fortran 函数的C++函数:

extern "C" 
{
void CALX(float* w, int* nw, double* dw, int* idmx, int* lo);
}
void calcPort(float* w, int* nw, double* dw, int *idmx)
{
    int lo[250]; //>100 used for internal stuff
    //stuff
    CALX(w, nw, dw, idmx, lo);
    for(int i=0; i<100; ++i)
    {
        cout<<lo[i]<<", ";
        if(i%50 == 49)
        {
            cout<<endl;
        }
    }
    //more stuff
}

Fortran函数的重要部分:

      SUBROUTINE CALX(W,NW,DW,LO) bind(C, name="CALX")                  CALX-001
        use iso_c_binding
C Lots o' comments
      LOGICAL LO(250)                                                   CALX-160
      DOUBLE PRECISION DW(1)                                            CALX-161
C Bunch o' common blocks
    1 READ (5,1000) TITLE                                               CALX-175
C some miscellaneous stuff dealing with a couple special title strings
      DO 4 I=1,100                                                      CALX-184
    4 LO(I)=.FALSE.                                                     CALX-185
      READ (5,1001) (LO(I),I=1,50)                                      CALX-186
      WRITE (6,*) SIZEOF(LO(1))
      WRITE (6,1001) (LO(I),I=1,50)
C IF LO(36)=.TRUE. RETURN TO RESTART A SEARCH SAVED ON TAPE 8           CALX-187
      IF (LO(36)) RETURN                                                CALX-188
      READ (5,1001) (LO(I),I=51,100)                                    CALX-189
      WRITE (6,1001) (LO(I),I=51,100)
C More stuff

在我看来,这应该有效。调用函数后,c++ 代码应以与 fortran 相同的模式读取 0 或非零。相反,我得到的是这个:

来自 fortran 写入语句的这一位(与我重定向到其中的输入相匹配):

FFFFFFTTFFTTFFFTFFFFFFFFFFFTFFTTFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFTTTFTTTFFFFFFFFFFFFFFFFFTTFFFFFFFF

我的循环中的这一部分。

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

显然存在一些沟通失败。为什么?我该如何解决?

C++调用中有五个参数。 您的 Fortran 代码需要四个。

(请注意,USE ISO_C_BINDING本身不会改变代码的行为。 不过,BIND(C) 确实如此。