主题:[原创]关于公共块变量排序问题
mltx
[专家分:20880] 发布于 2005-06-01 23:11:00
最近,好几个人问到公共块出错的问题,都是出于一个原因,特在这里把老贴整理一下供大家参考。
问题:
Compiling Fortran...
D:\FRAME2D.FOR
D:\FRAME2D.FOR(314) : Warning: Because of COMMON, the alignment of object is inconsistent with its type [ASA]
COMMON /EM/LM(6),ND,ASA(6,6),RF(6),SA(6,6)
--------------------------^
D:\FRAME2D.FOR(314) : Warning: Because of COMMON, the alignment of object is inconsistent with its type [RF]
COMMON /EM/LM(6),ND,ASA(6,6),RF(6),SA(6,6)
-----------------------------------^
解答:
这是老Fortran的规则。看你的公共语句:
COMMON /EM/LM(6),ND,ASA(6,6),RF(6),SA(6,6),SF(6),T(3,3)
根据程序的隐含规则,LM(6),ND一共是7个整型数,每个整型数4个字节,共28个字节,不是8字节的整倍数。紧跟着是双精度的ASA(6,6),每个数是8个字节,可是ASA(1,1)不能从8字节整倍数位置开始存储,这就是the alignment of object is inconsistent with its type 的意思。
对于警告错误,可以忽略,一般不致于影响执行结果。如果要改的话,有几种办法:
1)在公共语句中,把双精度数放在前边,整形数跟在后边;
2)在ASA()前插一个整型变量(哪怕是没用的),用来占用4个字节,以使得后面的双精度数可以从8字节整数倍位置开始存储。
准则:作为好的编程习惯,建议在公共块中,把实型变量排在前边,把整型数据放在后边,就不会有对位不整的错误!
仅供参考。
补充:(05.06.01)
公共块不是用堆栈实现的,是内存中的一段连续存储的数据。
按照Fortran的规定,当读取双精度数据时,总是假定前面的数据长度是双精度数字节长度(8个字节)的整数倍。
对于本例,ASA(1,1)从第29个字节开始存放8个字节;可是读取的时候,要从第33个字节(28不是8的倍数,32是28之后最小的8的倍数)开始读入8个字节,这就是定位(alignment)错误。
所以F90之后不提倡用公共块共享数据,而可用更为灵活的module来代替公共块共享数据。
公共块是过时的语言功能。
回复列表 (共28个回复)
沙发
lj1982002 [专家分:430] 发布于 2005-05-31 10:27:00
请教个问题:
主要我对数据结构存储不太明白,您既然前面有28个字节存储,而数据也是顺次压入堆栈的,难道在存储双精度时候,不能从29-36,37-44,这样依次放入呢
反正是8个字节的依次存。这样不是就不会出现警告信息了吗,(32-39,40-47)
板凳
mltx [专家分:20880] 发布于 2005-06-01 23:15:00
见首贴的补充。
3 楼
无心 [专家分:0] 发布于 2005-06-07 12:36:00
你的是什么啊??他垃圾啦!
4 楼
asymptotic [专家分:16630] 发布于 2005-09-05 17:18:00
可以参考 CVF 帮助文档中地 !DEC$ PACK : n 命令。
5 楼
studymore [专家分:370] 发布于 2006-04-05 11:03:00
堆栈不就是内存中的一个存储空间吗?为什么要说:“公共块不是用堆栈实现的,是内存中的一段连续存储的数据。”
6 楼
mltx [专家分:20880] 发布于 2006-04-05 12:52:00
堆栈是动态结构,数据可进栈出栈。
公共块是静态连续内存,编译时就开辟好了。运行时,不管你用不用,那部分内存总保留在那。
7 楼
kingzhc [专家分:0] 发布于 2006-04-29 13:46:00
高手真的是很多啊,佩服
编程的时候真的没有考虑这么全,一般的警告都是视而不见。
8 楼
lucyadams [专家分:0] 发布于 2006-07-28 11:49:00
mltx老师:
您好!你的邮箱mltx@bj1860.net是常用的吗?我有问题请教,不知道您能不能收到邮件。我用lucyadams@sina.com发给您的。谢谢!
9 楼
中华韧峰 [专家分:600] 发布于 2006-12-06 15:39:00
Common这个东西应该是寿终正寝了,虽然曾经起到过很大的作用.
其最大的缺点就是导致程序不好读
10 楼
spower [专家分:10] 发布于 2007-01-16 18:10:00
[quote]Common这个东西应该是寿终正寝了,虽然曾经起到过很大的作用.
其最大的缺点就是导致程序不好读[/quote]
但是,对于一些常量,在程序中不需要变化的,同时实参虚参传递比较多的时候,common还是很有用的,呵呵1
我来回复