c - 将代码从 32 位更改为 64 位后,将指针从 Microsoft Visual C++ 传递到 Fortran 并返回

标签 c pointers fortran 32bit-64bit

<分区>

在 Fortran 中调用 C 函数(在 Visual Studio 64 位中编译):

SUBROUTINE GET_PNTR

INTEGER*8 NXLOC(41)
REAL*4 WRX25I(41)

NXLOC(1) = IVRLOC( WRX25I(1) )

RETURN
END

C 函数定义为:

long long IVRLOC(var)
void *var;
{
    return var;
}

当我在 return 语句处停止时,var 被定义为 FORTRAN_X64.exe!0x00007ff6de5b8074

  • 将地址转换为 big endian 得到 32758 -564428684
  • 将地址转换为小端字节序得到 -159449088 1954569182

当我退出函数时,只有最后 4 个字节(在本例中为 -564428684)的大端字节序显示为 NXLOC(1) 的值。我不确定这是否正确,但似乎不可能,并且由于下一步使用该地址失败,因此似乎已确认它是不正确的。通过搜索网络,该值似乎应该是小端,但这不是我所看到的。

这是怎么回事?

当使用地址时,Fortran 代码的下一步如下所示:

PROGRAM USE_PTR

INTEGER*8 NXLOC(41)
REAL*4 XSLAM(41)

NX = 41
CALL VALOCX(NXLOC(1),XSLAM(1),NX)

RETURN
END

C 函数的样子:

void VALOCX( nsloc, vals, ns)
float *nsloc[], vals[];
int *ns;
{
    int i;

    for (i=0; i<*ns; i++) {
        vals[i] = *nsloc[i];
    }
}
此函数中的

nsloc 现在具有值 0x00007ff6de5b3c00 {FORTRAN_X64.exe!CHKSUB} {0xffffffffde5b8074 {???}} 其中仅恢复原始变量地址的最后四个字节。我假设我需要在某个时候从大端转换为小端,但到目前为止我的努力似乎只会增加我的困惑。

为什么“var”在退出 IVRLOC 时不转换为正确的值,以便它在 VALOCX 中转换回正确的值?

最佳答案

如果您没有将 IVRLOC 声明为在 Fortran 端返回 INTEGER*8 (或者可能是 INTEGER(c_intptr_t) )的函数,它是默认整数类型,可能是一个 4 字节整数。这可以解释由于类型不匹配,原始 8 字节值的一半被设置为零。

关于c - 将代码从 32 位更改为 64 位后,将指针从 Microsoft Visual C++ 传递到 Fortran 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70413786/

相关文章:

c - 在 C 中的结构内部分配指针?

arrays - 可以从指针数组中的值初始化指针吗?

pointers - 删除指针值不会 panic

fortran - 保存文件位置并在 Fortran 90 中返回

fortran - HDF5 用于使用 Fortran 编写的数据文件

c - 如何在 C 中创建一个验证用户输入的函数?

c - 如何创建一个库,其中链接器仅链接我的程序使用的函数?

c - 为什么我的字符数组不起作用?

c# - Java 中的 Marshal.ReadIntPtr(IntPtr) (C#) 等效项是什么?

c - 从 gfortran 将 mxgetfield 添加到 mexinterface