Fortran中函数赋值中的不兼容列组导致
我想创建一个函数,返回矩阵中的最大绝对值,但编译器返回此错误Fortran中函数赋值中的不兼容列组导致,fortran,gfortran,fortran90,Fortran,Gfortran,Fortran90,我想创建一个函数,返回矩阵中的最大绝对值,但编译器返回此错误 mv = maxVal(a, n) 1 Error: Incompatible ranks 0 and 1 in assignment at (1) 这是我的Fortran代码 real*8, dimension(:, :), allocatable :: a integer :: n real*8 :: mv read*, n allocate(a(n, n)) read*,
mv = maxVal(a, n)
1
Error: Incompatible ranks 0 and 1 in assignment at (1)
这是我的Fortran代码
real*8, dimension(:, :), allocatable :: a
integer :: n
real*8 :: mv
read*, n
allocate(a(n, n))
read*, a
mv = maxVal(a, n)
end
real*8 function maxVal(a, n)
integer :: n
integer :: i, j, max
integer, dimension(2) :: index
real*8, dimension(n, n) :: a
max = abs(a(1, 1))
index = (/1, 1/)
do i = 1, size(a)
do j = 1, size(a, 1)
if (abs(a(i, j)) .gt. max) then
max = abs(a(i, j))
index = (/i, j/)
endif
end do
end do
maxVal = a(index(1), index(2))
return
end
MAXVAL是一个Fortran内部函数。由于主程序没有将MaxVal声明为外部,也没有显式接口,因此编译器假定您使用的是内部。(如果您将其声明为外部,您还需要将其声明为REAL*8。我会很迂腐,建议您不要使用REAL*8之类的扩展,因为该语言有标准的方法来执行这些操作。)
MAXVAL,当提供DIM参数(第二个参数)时,如果第一个参数的秩大于1,则始终返回一个数组-这就是为什么编译器会抱怨,因为无法将数组分配给标量。这是它的副本,在这种情况下,编译器似乎可以提供更详细的错误消息。“警告用户定义的符号名称与内在冲突”大多数Fortran编译器不会发出这样的警告,因为这样做是bog标准Fortran,在许多应用程序中会触发不必要的警告。在许多情况下,如果参数与内在期望值不匹配,编译器会抱怨,但在这里它们确实匹配。真正的答案是使用模块或内部过程,以便显式接口可用,而不是依赖隐式接口。感谢您提供错误消息。请下次使用该功能,以避免出现已关闭的投票问题。如果你有更多的,它可以导致一项禁令。看看我是如何编辑这个问题,使它更容易阅读和更直接。您不必在StackOverflow中使用
。我建议您了解模块和内部函数。它们对Fortran 90及更高版本非常重要,将帮助您诊断其中一些错误。