【发布时间】:2016-03-16 18:59:44
【问题描述】:
我在下面定义了以下 fortran 代码。如果我更改 n 的值,我正在尝试更改 do 循环的长度。当我尝试编译时出现错误:
(1) 处固有的“floor”的“a”参数必须是 REAL。但是,当我将 q 和 w 更改为真实时,我会收到另一条错误消息。我怎样才能解决这个问题?当我使用 floor(...) 时,q 和 w 显然是一个整数
subroutine boundrycon(n,bc,u,v)
!input
integer :: n,bc
!output
real(8) :: u(n+2,n+2), v(n+2,n+2)
!lokale
integer :: j,i,w,q
n=30
q=floor(n/2)
w=(floor(n/2)+floor(n/6))
do j=q,w
u(q,j)=0.0;
v(q+1,j)=-v(q,j);
u(w,j)=0.0;
v(w+1,j)=-v(w,j);
end do
do i=q,w
v(i,q)=0.0;
u(i,q)=-u(i,q+1);
u(i,w+1)=-u(i,w);
v(i,w)=0;
end do
end subroutine boundrycon
【问题讨论】:
-
q显然是一个整数,因为它被声明为一个整数,而不是因为它被分配了一个整数函数结果。floor的参数在第一个参数中是一个整数,这就是问题所在。q不是函数的参数:n/2是。 [n/2是整数,因为n是整数。] 那么,您在问,如何将n/2设为真实值? -
整数除法的结果
n/2(对于正数n)是除法的“下限”,所以你很可能根本不需要内在的floor函数. -
n/2=15,但是如果我将 n 更改为 45,例如,45/2=22.5 重点是当我更改 n 时,我会更改 do 循环长度。我在问为什么我在编译时会出错,即使 q 和 w 是整数,并且我已经满足了 do 循环的要求。
-
错误不是关于
q,而是关于floor(n/2)。n/2is an integer (正如@agentp 所说,地板是多余的)并且不能将整数传递给地板。如果您必须保持地板,请尝试floor(n/2.),它有一个真正的论点。 -
当我只使用 q=n/2 和 w=n/2+n/6 时它起作用了。即使我将 n 更改为 45。似乎 fortran 将实数 45/2 自行转换为整数。尽管我觉得这很奇怪。有人知道这是否正确吗?
标签: fortran fortran90 gfortran