f77程序改造f90过程中关于动态数组与指针
新手求助,目前在处理一套较多子程序的f77商用软件,打算转译成f90,并把一些老语法改成90语法(77没有动态数组分配,采用超大数组进行传参),主要是为了解决程序的可维护性和二次开发功能。目前遇到了一些问题向大佬们请教。原程序中采用了较多common 以及 equivalence 的h头文件,打算处理成module形式来代替,不知道方案是否可行。fa与ia为超大数组用于传参等功能。
integer lfsiz
parameter (lfsiz=2200000)
common /fast/ fa(lfsiz)
real*8 fa
integer ia(2,lfsiz)
equivalence (fa(1),ia(1,1))
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)会不会有问题。
大佬们有没有比较好的处理思路,希望提一点建议。
你这个工作难度比较大,且工作量也巨大。如非特别必要,尽量不要改。
如果确实需要改动,common 改 module 需要特别注意,有没有某些程序单元利用了内存对齐但数据类型不对齐。比如数组大小不一致,类型不一致。
equivalence 的处理也是一样。一般来说用指针代替是OK的,但要注意,有没有用不同维度的数组之间equivalence。
如果原始代码中大量用了数据类型(或数组大小)不一致的内存共用。有个更佳的办法是,读懂代码逻辑,完全重构。
fcode 发表于 2022-6-22 08:50
你这个工作难度比较大,且工作量也巨大。如非特别必要,尽量不要改。
如果确实需要改动,common 改 module ...
十分感谢,程序中确实涉及到非常多的数组大小不一致的 内存共用, 请问这种情况在处理成module时会存在哪些隐患或者问题呢? 简而言之,common是用内存对齐来匹配,而module是用变量名来匹配。
详解
http://common.w.fcode.cn/
页:
[1]