Fortran Coder

查看: 48|回复: 3

[求助] f77程序改造f90过程中关于动态数组与指针

[复制链接]

7

帖子

4

主题

0

精华

入门

F 币
40 元
贡献
18 点
发表于 2022-6-21 21:56:31 | 显示全部楼层 |阅读模式
新手求助,目前在处理一套较多子程序的f77商用软件,打算转译成f90,并把一些老语法改成90语法(77没有动态数组分配,采用超大数组进行传参),主要是为了解决程序的可维护性和二次开发功能。
目前遇到了一些问题向大佬们请教。原程序中采用了较多common 以及 equivalence 的h头文件,打算处理成module形式来代替,不知道方案是否可行。fa与ia为超大数组用于传参等功能。
[Fortran] 纯文本查看 复制代码
 integer lfsiz
       parameter (lfsiz=2200000)                                                                
       common /fast/ fa(lfsiz) 
       real*8 fa 
       integer ia(2,lfsiz) 
	   equivalence (fa(1),ia(1,1))

[Fortran] 纯文本查看 复制代码
 equivalence                                                       &
     &  (iselevchk0(1,1)           ,ia(1,125)),                         &
     &  (isccflflg1(1,1)           ,ia(1,126)),                         &
     &  (isnpccflflg2(1,1)         ,ia(1,127)),                         &
     &  (isjunfloregnum38(1,1)     ,ia(1,128)),                         &
     &  (toface911(1,1)            ,ia(1,129)),                         &
     &  (fromface1214(1,1)         ,ia(1,130)),                         &
     &  (isdonprespvwrk15(1,1)     ,ia(1,131)),                         &
     &  (iswatpackjunflg16(1,1)    ,ia(1,132)),                         &
     &  (isstrtchjunflg17(1,1)     ,ia(1,133)),                         &
     &  (iseccmixflg18(1,1)        ,ia(1,134)),                         &
     &  (iseccmixflg19(1,1)        ,ia(1,135)),                         &
     &  (isdbgprntflg20(1,1)       ,ia(1,136)),                         &
     &  (iswatpackflg21(1,1)       ,ia(1,137)),                         &
     &  (isgodunovflg22(1,1)       ,ia(1,138)),                         &
     &  (isgodunovflg23(1,1)       ,ia(1,139)),                         &
     &  (isinithsemod24(1,1)       ,ia(1,140)),                         &
     &  (isinithsemod25(1,1)       ,ia(1,141)),                         &
     &  (islevelmod27(1,1)         ,ia(1,142)),                         &
     &  (isvapcontphasejun28(1,1)  ,ia(1,143)),                         &
     &  (isnolosscoefabrjun29(1,1) ,ia(1,144)),                         &
     &  (isliqentrain30(1,1)       ,ia(1,145))                          

程序涉及到很多头文件,将变量等价到超大数组,如果用模块来处理,外部子程序如果调用多个等价语句会报错,如果采用f90的指针会提示指针变量不能定义数组维度
并且fa 与 ia 同时都是target, 那么equivalence (fa,ia)会不会有问题。
大佬们有没有比较好的处理思路,希望提一点建议。   

1762

帖子

13

主题

5

精华

论坛跑堂

臭石头雪球

F 币
482 元
贡献
184 点

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

发表于 2022-6-22 08:50:07 | 显示全部楼层
你这个工作难度比较大,且工作量也巨大。如非特别必要,尽量不要改。

如果确实需要改动,common 改 module 需要特别注意,有没有某些程序单元利用了内存对齐但数据类型不对齐。比如数组大小不一致,类型不一致。
equivalence 的处理也是一样。一般来说用指针代替是OK的,但要注意,有没有用不同维度的数组之间equivalence。

如果原始代码中大量用了数据类型(或数组大小)不一致的内存共用。有个更佳的办法是,读懂代码逻辑,完全重构。

7

帖子

4

主题

0

精华

入门

F 币
40 元
贡献
18 点
 楼主| 发表于 2022-6-23 10:35:11 | 显示全部楼层
fcode 发表于 2022-6-22 08:50
你这个工作难度比较大,且工作量也巨大。如非特别必要,尽量不要改。

如果确实需要改动,common 改 module ...

十分感谢,程序中确实涉及到非常多的数组大小不一致的 内存共用, 请问这种情况在处理成module时会存在哪些隐患或者问题呢?

1762

帖子

13

主题

5

精华

论坛跑堂

臭石头雪球

F 币
482 元
贡献
184 点

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

发表于 2022-6-23 12:02:40 | 显示全部楼层
简而言之,common是用内存对齐来匹配,而module是用变量名来匹配。

详解
http://common.w.fcode.cn/
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2022-7-5 21:27

Powered by Tencent X3.4

© 2013-2022 Tencent

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