Fortran Coder

标题: Fortran与C的内存对齐 [打印本页]

作者: 愤怒的三炮    时间: 2024-10-20 02:40
标题: Fortran与C的内存对齐
本帖最后由 愤怒的三炮 于 2024-10-20 02:41 编辑

我有一个派生数据类型,需要在C和Fortran中共同使用。

在C这头,我定义为
[C] 纯文本查看 复制代码
struct MyType
{
        char str[3];
        int  i;

};

在Fortran这头,我的定义为
[Fortran] 纯文本查看 复制代码
        type,bind(c):: MyType
                character(c_char):: str(3)
                integer(c_int):: i
        end type

正常使用是没有问题的。

但现在我需要取消它们的内存对齐,用以读取二进制文件。
于是我在C代码中添加了
[C] 纯文本查看 复制代码
#pragma pack(1)

同时,当我在Fortran中用sequence取消内存对齐时,编译器却不让我这么做,提示“Error: Derived type 'mytype' at (1) cannot have the SEQUENCE attribute because it is BIND(C)”.

我该如何同时在Fortran和C两头都取消内存对齐?

作者: fcode    时间: 2024-10-20 09:13
语法标准没有这部分内容,具体要看编译器是否支持。
比如 intel fortran 可以用
[Fortran] 纯文本查看 复制代码
!DEC$ PACK:1
type,bind(c):: MyType
        character(c_char):: str(3)
        integer(c_int):: i
end type
!DEC$ PACK

对于 gfortran 你可以尝试用 -fpack-structs=1 编译选项

作者: 愤怒的三炮    时间: 2024-10-20 10:37
fcode 发表于 2024-10-20 09:13
语法标准没有这部分内容,具体要看编译器是否支持。
比如 intel fortran 可以用
[mw_shl_code=fortran,true ...

成功了,感谢雪球




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2