繁体   English   中英

整数,执行循环,fortran,错误

[英]integer, do loop, fortran, error

我在下面定义了以下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

许多人已经在对您的问题的评论中指出了这一点,但在此再次作为答案:

在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM