2010-08-27 192 views
0

嘿,我寫這個(fortran)的目的是找到一堆點的最小生成樹(syscount其中)。我知道這個方法是有效的,因爲我今天早些時候用javascript寫了它。 js雖然很慢,但我想看看fortran會快多快! 唯一的問題是它不工作,我得到一個惱人的錯誤;爲什麼Fortran代碼不工作?

prims.f95:72.43:

if((check == 1) .and. (path(nodesin(j))(k) < minpath)) then

        1 

Error: Expected a right parenthesis in expression at (1)

這到底是什麼?!上線第43字符是「路徑」

nodesin(1) = 1 

do i = 1,syscount-1 
    pathstart = -1 
    pathend = -1 
    minpath = 2000 

    do j = 1,i 
     do k = 1, syscount 

      check = 1 
      do l = 1, i 
       if(nodesin(l) == k) then 
        check = 0 
       end if 
      end do 

      if((check == 1) .and. (path(nodesin(j))(k) < minpath)) then 
       minpath = path(nodesin(j))(k) 
       pathstart = nodesin(j) 
       pathend = k 
      end if 

     end do 
    end do 

    nodesin(i+1) = pathend 
    minpaths(i)(1) = pathstart 
    minpaths(i)(2) = pathend 

end do 

同樣的「H」,我是相當新的Fortran,所以我有一些其他問題;我可以使用& &而不是.and。 ?

是否有在其他許多語言中找到的for(object in list){}循環的版本?

有沒有PHP函數in_array的verion?即布爾in_array(針,乾草堆),如果有,有沒有這樣做比一個更好的辦法:

check = false 
Asize = size(array) 
do i = 1, Asize 
    if(array(i) == needle) then 
     check = true 
    end if 
end do 

然後使用檢查參數,看看它的存在?

(我還沒有張貼任何計算器之前,請不要生氣,如果我打破的禮儀東西負載!)

+0

你可以在Fortran中使用==嗎?上次我使用它(Fortran 77 - 我知道世界已經改變了),你使用了.EQ。和.LT。等等。我知道Fortran 90進行了很多現代化改造,但我不知道它發生了什麼變化。嘗試使用.EQ。,.LT。,.LE。,.NE。,.GT。,.GE。以及.AND。,.OR。和.NOT。並看看是否有幫助。經典Fortran發言 - 但可能會工作。 – 2010-08-27 12:43:39

+0

這個網站:http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap03/logical.html 說==應該工作, 也,它的工作幾行,並且如果我改變它,它只是將錯誤轉移到72.46。 看起來不是這個問題:-( – will 2010-08-27 13:05:04

+0

你確定這個表達式的路徑(nodesin(j))(k)「?什麼是」路徑「和」nodesin「?它們是如何在代碼中定義的? – Wildcat 2010-08-27 13:56:31

回答

3

看起來你已經定義pathminpaths爲二維數組。與C類語言相比,Fortran中多維數組的訪問方式不同。在Fortran中,用逗號分隔一組括號內的索引。

我猜測通過使用這些變量他們是整數數組。這裏是你如何訪問這些數組的元素(因爲你不同意你的變量聲明,我做了這些陣列的形狀):

integer :: path(n1, n2) 
integer :: minpaths(n3, 2) 

你的if語句應該是:

if((check == 1) .and. (path(nodesin(j), k) < minpath)) then 

你到minpaths訪問應該是:

minpaths(i, 1) = pathstart 
minpaths(i, 2) = pathend 

另外,如果你不使用IMPLICIT NONE我建議你考慮一下。不使用它是危險的,並且您使用的變量名稱彼此接近(minpathminpaths)。您可以使用IMPLICIT NONE節省數小時的頭髮調試。

+0

哦,謝謝你! – will 2010-08-27 20:50:08

1

雖然.EQ。可以用==替換,仍然只有.AND。

對於你的代碼塊來檢查一個「變量是否存在」,你可以使用「where」並且有更短的代碼!

在Fortran> = 90語句和函數可以對數組進行操作,因此不必頻繁使用顯式循環。

沒有for(列表中的對象),但使用where語句可以做一些非常相似的事情。

許多作用於數組的內部函數也將掩碼作爲可選參數來選擇性地操作。

我建議讀一本書瞭解這些功能。我喜歡Metcalf,Reid和Cohen的那個。與此同時,第二篇維基百科文章可能有所幫助:http://en.wikipedia.org/wiki/Fortran_95_language_features