Fortran Coder

查看: 15295|回复: 7
打印 上一主题 下一主题

[求助] COMMON代码对齐问题

[复制链接]

13

帖子

5

主题

0

精华

入门

F 币
73 元
贡献
41 点
跳转到指定楼层
楼主
发表于 2019-1-25 13:35:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
build project 时出现如下提醒
Warning: Padding of 4 bytes required before 'qfe2' in COMMON 'pinput' at (1); reorder elements or use -fno-align-commons [-Walign-commons]

这是什么意思呢?应该如何解决呢?
初学者     多谢各位帮助,多谢了

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
沙发
发表于 2019-1-25 17:07:19 | 只看该作者
1、如果你用的老代码,且确认代码无误,不管它;
2、如果自己写代码,common已经废弃了,改用module;
3、如果要改这个代码,你得给出代码;
4、可以试试在 qfe2 前面放一个4字节变量。

13

帖子

5

主题

0

精华

入门

F 币
73 元
贡献
41 点
板凳
 楼主| 发表于 2019-1-25 17:33:58 | 只看该作者
您好,多谢了,我用的是老代码FORTRAN77,出现了这个warning,但是不影响程序运行,就是不知道这个是什么原因导致的,代码如下:
COMMON/PINPUT/ RI,RW,RO,RF,XL,AL,AR1,AR2,
     &        TFIN,FRHO,FCP,FMU,FK,FV,FA,PR,FMFR,FMFR2,PI,FU,FU2,FUO,
     &        RE,REO,FRICTION,WRHO,WCP,WK,WA,WNA,ALMDW,PTHERMW,
     &        CRA,ERAN,TM,PRHOS,PCPS,PKS,PRHOL,PCPL,PKL,PVL,PH,
     &        PAS,PNAS,ALMDPS,PTHERMPS,PAL,PNAL,ALMDPL,PTHERMPL,ALMDPSL,
     &               G,BT,SDL,TT0,RA,DT0,DT,TIME,TINI0,TINI,EPS,PTHERMP,ALMDP,
     &        XL1,RL1,XL2,RL2,AXL1,ARL1,AXL2,ARL2,PLOT1,PLOT2,     
     &        AXL1L,AXL1R,ARL1L,ARL1R,AXL2L,AXL2R,ARL2L,ARL2R,
     &        T1,T2,SUMF,SUMF0,SUMF1,TP,TTP,
     &        Q,QFS,QFL,QF,QW,QPS,QPL,QP,QFS2,QFL2,QF2,EQ,EW,TEQ,TEW,
     &        E1,E2,TQ,TQFS,TQFL,TQF,TQW,TQPS,TQPL,TQP,TQFS2,TQFL2,TQF2,
     &        EEQ,EEW,TEEQ,TEEW,EE1,EE2,
     &        DTTP,DSUMF,DTQ,DTQF,DTQW,DTQP,DTQF2,DEQ,DEW,DTEQ,DTEW,DE1,
     &        DE2,DEEQ,DEEW,DTEEQ,DTEEW,DEE1,DEE2,DTIME
     &        EXPA,TEXPA,EEWI,TEEWI,EEWO,TEEWO,EEX1,EEX2,FRICTIONO,FEI
     &        DEXPA,DTEXPA,DEEWI,DTEEWI,DEEWO,DTEEWO,DEEX1,DEEX2
     &        QFE,QFE2,TQFE,TQFE2,EEX3,EEX4,DEEX3,DEEX4
     &        I1,J1,I2,J2

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1643 元
贡献
709 点

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

地板
发表于 2019-1-26 09:34:23 | 只看该作者
举个例子,如下代码
[Fortran] 纯文本查看 复制代码
real :: a , b , c
integer :: d , e , f
integer(2) :: x
common /namespace/ a , b , c , x , d , e , f
end

a b c d e f 都是4个字节的。而 X 是 2 个字节的 。这就导致了内存里没有对齐,就像一条马路,因为一个井盖缺了一小块。
这样会导致运行效率不够高。(就像马路上有个井盖,大家经过的时候都要减个速)
于是编译器警告一下你。你可以在前面填充4个字节(Padding of 4 bytes),让它对齐。
也可以重新调换一下顺序(reorder elements ),让井盖到马路的尽头处(不太影响正常行车)
当然还可以用 -fno-align-commons 选项,让编译器不要管它。
COMMON是旧代码最恶心的语法之一,强烈建议新写代码不要使用它了。

13

帖子

5

主题

0

精华

入门

F 币
73 元
贡献
41 点
5#
 楼主| 发表于 2019-1-26 09:40:52 | 只看该作者
fcode 发表于 2019-1-26 09:34
举个例子,如下代码
[mw_shl_code=fortran,true]real :: a , b , c
integer :: d , e , f

多谢多谢了,明白了一点儿,这个就是影响程序的运行效率,当时不影响程序的正确性吧?

还有我用Simply Fortran 编译器, 明明没有定义一个参数(写错了),但是程序运行过程中还是能够运行,并且没有提醒,这个怎么解决呢?

多谢多谢

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1643 元
贡献
709 点

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

6#
发表于 2019-1-26 23:39:03 | 只看该作者
一般不会影响正确性。(但也不敢保证,毕竟编译器和编译器都有差别)

每个程序单元,都加上 Implicit None 就可以了。

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
7#
发表于 2019-1-27 11:48:52 | 只看该作者
fcode 发表于 2019-1-26 23:39
一般不会影响正确性。(但也不敢保证,毕竟编译器和编译器都有差别)

每个程序单元,都加上 Implicit None ...

说到这个Implicit None
想起好多教科书和网上教程、讨论里边甚至每个function和subroutine里边都来一句
感觉矫枉过正了吧,只要主程序和每个module里写一句就够了吧……

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
8#
发表于 2019-1-28 09:24:55 | 只看该作者
module 里写 implicit none 对整个 module 有效(但对 SubModule 无效)
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-28 01:26

Powered by Tencent X3.4

© 2013-2024 Tencent

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