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.
相关产品推荐
相关产品推荐

