Fortran计算转动惯量代码编译报错与旧语法兼容问题求助
问题1:funV已定义却报无隐式类型错误的原因
implicit none的作用是关闭Fortran默认的隐式类型推导规则(首字母i~n默认整型,其余默认实型),要求所有符号(变量、函数等)必须显式声明类型和属性。
你在主程序开启了implicit none,但仅声明了普通变量,没有对funV、funMI两个外部函数做类型声明,也没有声明external属性告知编译器这是外部函数,因此编译器无法识别该符号,抛出错误。
解决方法
在主程序的变量声明段补充如下代码即可:
external funV, funMI real :: funV, funMI
额外提示:你当前的funV和funMI中直接使用了主程序定义的cR、h、rho0等变量,外部函数默认无法访问主程序的局部变量,会导致运行结果异常,建议将这些公共参数放入公共块,或者将函数写入主程序的contains段中解决作用域问题。另外你计算转动惯量时第二次调用cheb2仍传入了funV,应该改为funMI才能得到正确的转动惯量结果。
问题2:共享DO终止标签的现代Fortran替换写法
旧Fortran标准允许嵌套DO循环共用同一个带标号的continue作为循环结束,该特性在Fortran2018中被正式删除,现代Fortran要求每个DO循环有独立的结束标识,使用end do即可。
修改示例
原有旧代码:
do 3 i=1,4 do 3 j=1,4 ss=ss+f(xx(i),yy(j)) 3 continue
修改为现代写法:
do i = 1,4 do j = 1,4 ss = ss + f(xx(i),yy(j)) end do end do
另一个循环同理修改:
do i = 1,m do j = 1,n aa = a + (i-1)*hx bb = aa + hx cc = c + (j-1)*hy dd = cc + hy call ch4xy(aa,bb,cc,dd,f,ri) rr = rr + ri end do end do
修改完成后即可消除对应的警告。
内容的提问来源于stack exchange,提问作者gray KK
相关产品推荐
相关产品推荐

