Fortran Coder

标题: f77程序改造f90过程中关于动态数组与指针 [打印本页]

作者: heuwcy    时间: 2022-6-21 21:56
标题: f77程序改造f90过程中关于动态数组与指针
新手求助,目前在处理一套较多子程序的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)会不会有问题。
大佬们有没有比较好的处理思路,希望提一点建议。   

作者: fcode    时间: 2022-6-22 08:50
你这个工作难度比较大,且工作量也巨大。如非特别必要,尽量不要改。

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

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

作者: heuwcy    时间: 2022-6-23 10:35
fcode 发表于 2022-6-22 08:50
你这个工作难度比较大,且工作量也巨大。如非特别必要,尽量不要改。

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

十分感谢,程序中确实涉及到非常多的数组大小不一致的 内存共用, 请问这种情况在处理成module时会存在哪些隐患或者问题呢?
作者: fcode    时间: 2022-6-23 12:02
简而言之,common是用内存对齐来匹配,而module是用变量名来匹配。

详解
http://common.w.fcode.cn/




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