You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HDF5与标准合规Fortran:C_LOC互操作性要求放宽程度问询

HDF5 Fortran示例中C_LOC的标准合规性疑问

我在编写将数据保存为HDF5格式的Fortran代码时,发现所有HDF5示例里使用C_LOC(x)的地方,都存在违反或可能违反Fortran标准(§18.2.3.7和§18.3.4)的情况。以下是某示例中的代码片段:

TYPE s1_t
   CHARACTER(LEN=1), DIMENSION(1:13) :: chr
   INTEGER(KIND=SELECTED_INT_KIND(1)) :: a
   REAL(KIND=SELECTED_REAL_KIND(5)) :: b
   REAL(KIND=SELECTED_REAL_KIND(10)) :: c
END TYPE s1_t
TYPE(s1_t), TARGET :: s1(10)

TYPE(C_PTR) :: f_ptr

...

f_ptr = C_LOC(s1(1))

我认为f_ptr = C_LOC(s1(1))的用法不符合标准,原因如下:

  • 派生数据类型s1_t未带有BIND(C)属性;
  • 派生类型的组件不一定具备可互操作的类型种类参数(可能碰巧与某类可互操作类型的种类参数匹配,但无法保证)。

核心疑问:在使用HDF5时,由于其示例本身未严格遵循Fortran标准互操作性要求,这类互操作性要求可放宽到何种程度?

补充标准说明

关于C_LOC(X)的参数X,标准规定:“X必须带有POINTER或TARGET属性,不得为共索引对象。它必须是具备可互操作类型和种类类型参数的变量、假定类型变量,或无长度类型参数的非多态变量。若为可分配变量,则必须已分配;若为指针,则必须已关联;若为数组,则必须连续且大小非零;不得为零长度字符串”。

关于派生数据类型,标准规定:“派生类型与C结构体类型可互操作,当且仅当该派生类型带有BIND属性[...]”。

内容的提问来源于stack exchange,提问作者Andris R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:12:35