[英]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
,由於n
和2
均為整數,因此為整數除法。 如前所述,該結果是整數。
然后將此整數作為參數傳遞給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.