簡體   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