整数,做循环,fortran,错误

时间:2016-03-16 18:59:45

标签: fortran fortran90 gfortran

我在下面定义了以下fortran代码。如果我改变n的值,我试图改变do循环的长度。当我尝试编译时,我得到错误:
(1)内在的“地板”论证必须是真实的。但是,当我改变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

1 个答案:

答案 0 :(得分:1)

很多人已经在你的问题的评论中指出了这一点,但这里又作为一个答案:

在Fortran中,如果对两个整数值进行除法,则结果为整数值。

6/3 = 2

如果分子不能被分母均分,则剩余部分将被删除:

7/3 = 2

让我们来看看你的代码:

q=floor(n/2)

它首先评估n/2,因为n2都是整数,所以这是一个整数除法。如前所述,此结果为整数。

然后将此整数作为参数传递给floor。但是floor期望一个浮点变量(或者,正如Fortran所说的那样:REAL)。因此错误消息:

floor的[[]参数...必须是REAL。”

因此,获得所需内容的最简单方法是完全删除floor,因为整数除法完全符合您的要求:

q = n/2 ! Integer Division

如果你需要进行浮点除法,也就是说你想要将两个整数变量分成一个实数变量,你必须至少将它们中的一个转换为浮点才能除法:

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