c - 长 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_long
32 位系统中整数的限制,因为huge(1_c_long)=$7FFFFFFF
在 32 位中。所以我有几种方法可以解决这个问题,但我仍然想知道......为什么它必须首先是这样?例如,c_double
在 32 位和 64 位系统中是相同的(应该如此);一样c_int
,无论如何都是一样的。为什么c_long
不一样?正因为如此,我花了几个小时才弄清楚复杂程序中发生了什么。
解决方案
long
(甚至)没有通用长度int
。各种系统和编译器使用一种常见的数据模型(维基百科),它使用 32 位和 64 位来表示int
、long
和long long
指针。
Fortran使用伴随处理器iso_c_binding
的概念指定类型。这意味着 Fortran 编译器在其特定配置中(在特定操作系统中)使用这些类型与特定 C 编译器兼容,并在特定操作系统上具有某些特定配置。
值得注意的是,Microsoft Windows 上的 Microsoft 和 MinGW C 编译器使用 LLP64 模型。Linux 和其他 Unix 上的编译器通常使用 LP64 数据模型。因此大小long
不同。
如果没有具体细节(编译器、操作系统),很难针对您的情况说更多。但大小不是通用的,仅对特定操作系统上的特定编译器有效,Fortran 编译器将其视为配套处理器。
推荐阅读
- firebase - 如何区分同一用户的 Firebase IdToken?
- c++ - 为什么通用引用必须对成员函数使用模板而不是类?
- android - 仅发布模式的 APK 构建的颤振问题
- python-3.x - 如何使用 PIL 保存具有自定义名称的图像?
- jquery - JQuery 选项卡在 Jquery DataTables 的 Page2 上不起作用
- docker - Docker Django GPIO Rasbian buster
- pandas - 制作多索引数据框的 matplotlib 线图,每行具有不同的线,其索引用作 X 轴
- javascript - 如何使用从exports.default 函数传递的变量
- python - 将两列组合在一起作为列表数据类型,并从抑制 json 文件中过滤掉单词
- sql-server - 重新登录无法通过 t-sql xp_commandshell 工作,但相同的命令在命令提示符下工作