【问题标题】:integer, do loop, fortran, error整数,循环,fortran,错误
【发布时间】: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/2 is an integer (正如@agentp 所说,地板是多余的)并且不能将整数传递给地板。如果您必须保持地板,请尝试floor(n/2.),它有一个真正的论点。
  • 当我只使用 q=n/2 和 w=n/2+n/6 时它起作用了。即使我将 n 更改为 45。似乎 fortran 将实数 45/2 自行转换为整数。尽管我觉得这很奇怪。有人知道这是否正确吗?

标签: fortran fortran90 gfortran


【解决方案1】:

很多人已经在 cmets 中针对您的问题指出了这一点,但这里再次作为答案:

在 Fortran 中,如果你对两个整数值进行除法,结果是一个整数值。

6/3 = 2

如果分子不能被分母整除,则舍去余数:

7/3 = 2

让我们看看你的代码:

q=floor(n/2)

它首先计算n/2,因为n2 都是整数,所以是这样的整数除法。如前所述,这个结果是一个整数。

这个整数然后作为参数传递给floor。但是floor 需要一个浮点变量(或者,正如 Fortran 所称:REAL)。因此错误消息:

floor ...的[The]参数必须是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2011-07-05
    • 2014-02-25
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多