整数,循环,fortran,错误
integer, do loop, fortran, error
我在下面定义了以下 Fortran 代码。如果我更改 n 的值,我将尝试更改 do 循环的长度。当我尝试编译时出现错误:
(1) 处固有的“floor”的“a”参数必须是 REAL。但是当我将 q 和 w 更改为 real 时,我收到另一条错误消息。我怎样才能解决这个问题?当我使用 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
很多人已经在你的问题的评论中指出了这一点,但在这里再次作为答案:
在 Fortran 中,如果您对两个整数值进行除法,结果是一个整数值。
6/3 = 2
如果分子不能被分母整除,则去掉余数:
7/3 = 2
让我们看看你的代码:
q=floor(n/2)
它首先计算 n/2
,因为 n
和 2
都是整数,所以是这样的整数除法。如前所述,这个结果是一个整数。
然后将该整数作为参数传递给 floor
。但是 floor
需要一个浮点变量(或者,如 Fortran 所说:REAL
)。因此错误消息:
[floor
的] 参数 ... 必须是 REAL
。
因此,获得所需内容的最简单方法是完全删除 floor
,因为整数除法完全符合您的要求:
q = n/2 ! Integer Division
如果需要进行浮点除法,即要将两个整型变量除以一个实型变量,则必须至少将其中一个转为浮点数before除法:
print *, 3/2 ! wrong, prints 1
print *, real(3)/2 ! right
print *, 3/2.0 ! right
print *, (3 * 1.0) / 2 ! right
print *, real(3/2) ! wrong, prints 1.0
我在下面定义了以下 Fortran 代码。如果我更改 n 的值,我将尝试更改 do 循环的长度。当我尝试编译时出现错误:
(1) 处固有的“floor”的“a”参数必须是 REAL。但是当我将 q 和 w 更改为 real 时,我收到另一条错误消息。我怎样才能解决这个问题?当我使用 floor(...)
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
很多人已经在你的问题的评论中指出了这一点,但在这里再次作为答案:
在 Fortran 中,如果您对两个整数值进行除法,结果是一个整数值。
6/3 = 2
如果分子不能被分母整除,则去掉余数:
7/3 = 2
让我们看看你的代码:
q=floor(n/2)
它首先计算 n/2
,因为 n
和 2
都是整数,所以是这样的整数除法。如前所述,这个结果是一个整数。
然后将该整数作为参数传递给 floor
。但是 floor
需要一个浮点变量(或者,如 Fortran 所说:REAL
)。因此错误消息:
[floor
的] 参数 ... 必须是 REAL
。
因此,获得所需内容的最简单方法是完全删除 floor
,因为整数除法完全符合您的要求:
q = n/2 ! Integer Division
如果需要进行浮点除法,即要将两个整型变量除以一个实型变量,则必须至少将其中一个转为浮点数before除法:
print *, 3/2 ! wrong, prints 1
print *, real(3)/2 ! right
print *, 3/2.0 ! right
print *, (3 * 1.0) / 2 ! right
print *, real(3/2) ! wrong, prints 1.0