Fortran Coder

查看: 86|回复: 2
打印 上一主题 下一主题

[派生类型] Fortran与C的内存对齐

[复制链接]

43

帖子

13

主题

0

精华

专家

F 币
429 元
贡献
155 点
跳转到指定楼层
楼主
发表于 2024-10-20 02:40:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 愤怒的三炮 于 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两头都取消内存对齐?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2015

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1572 元
贡献
676 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2024-10-20 09:13:57 | 只看该作者
语法标准没有这部分内容,具体要看编译器是否支持。
比如 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 编译选项

43

帖子

13

主题

0

精华

专家

F 币
429 元
贡献
155 点
板凳
 楼主| 发表于 2024-10-20 10:37:41 | 只看该作者
fcode 发表于 2024-10-20 09:13
语法标准没有这部分内容,具体要看编译器是否支持。
比如 intel fortran 可以用
[mw_shl_code=fortran,true ...

成功了,感谢雪球
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-1 12:40

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表