我一直在尝试编译程序并遇到一个看起来很简单的问题。但是,我还没能解决它。任何想法都非常感谢。该程序如下所示,
代码:
subroutine rescal(zy,nvar)
integer nvar,i, nexponent
double complex zy(nvar)
double precision maxabs, scalfac
maxabs = 0.d0
do i = 1, nvar
maxabs = max(zabs(zy),maxabs)
enddo
maxabs((rank 0))应该存储zy
和maxabs
的最大值。简单,对吧?
我尝试使用gfortran编译此程序并收到以下错误。我不明白为什么编译器抱怨maxabs
应该是1级而不是0级。据我所知,zabs
是使用双精度复数的正确函数。< / p>
gfortran -e -Ofast -ffixed-line-length-none -std=legacy -c -o rescal.o rescal.f
rescal.f:13.8:
maxabs = max(zabs(zy),maxabs)
1
Error: Incompatible ranks 0 and 1 in assignment at (1)
make: *** [rescal.o] Error 1
答案 0 :(得分:1)
max
是一个元素函数,给定一个数组参数返回一个数组结果。那么,你的问题是zabs(zy)
是一个数组。
简单地说,您在循环时错过了选择zy
的元素:
do i = 1, nvar
maxabs = max(zabs(zy(i)),maxabs) ! Select the i-th element of zy
enddo
那说了几点:
zabs
; abs
maxval
功能可用。你可以改为
maxabs = MAXVAL(ABS(zy))