首页 > 解决方案 > 长 C 整数的 Fortran 互操作性

问题描述

我有一个 C 库,它在结构中声明了几个long变量。我通常将它们视为integer(kind=c_long)在 Fortran 中,但这会在特定的更复杂的程序中引起意想不到的问题。我的 Fortran 代码在 32 位系统中正确运行,甚至无法在 64 位系统中编译。原因太复杂,无法在这里解释,对于问题的目的来说并不重要,但归结为事实c_long在 32 位和 64 位系统中并不相同。至少在 gfortranc_long中,32 位是 4 个字节,64 位是 8 个字节。事实上,c_long = c_int = 4在 32 位中,在 64 位中是c_long = c_double = 8.

现在,在这个特定的 C 库中,long整数仅用于char变量,使用的最大值是 $FFFFFF,远远超出了c_long32 位系统中整数的限制,因为huge(1_c_long)=$7FFFFFFF在 32 位中。所以我有几种方法可以解决这个问题,但我仍然想知道......为什么它必须首先是这样?例如,c_double在 32 位和 64 位系统中是相同的(应该如此);一样c_int,无论如何都是一样的。为什么c_long不一样?正因为如此,我花了几个小时才弄清楚复杂程序中发生了什么。

标签: cfortraninteropfortran-iso-c-binding

解决方案


long(甚至)没有通用长度int。各种系统和编译器使用一种常见的数据模型(维基百科),它使用 32 位和 64 位来表示intlonglong long指针。

Fortran使用伴随处理器iso_c_binding的概念指定类型。这意味着 Fortran 编译器在其特定配置中(在特定操作系统中)使用这些类型与特定 C 编译器兼容,并在特定操作系统上具有某些特定配置。

值得注意的是,Microsoft Windows 上的 Microsoft 和 MinGW C 编译器使用 LLP64 模型。Linux 和其他 Unix 上的编译器通常使用 LP64 数据模型。因此大小long不同。

如果没有具体细节(编译器、操作系统),很难针对您的情况说更多。但大小不是通用的,仅对特定操作系统上的特定编译器有效,Fortran 编译器将其视为配套处理器


推荐阅读