为什么这个fortran代码不起作用?

时间:2010-08-27 12:37:07

标签: fortran prims-algorithm

嘿,我写了这个(fortran),目的是找到一堆点的最小生成树( syscount )。我知道这个方法有效,因为我今天早些时候用javascript编写了它。虽然js很慢,我想看看fortran会有多快! 唯一的问题是它不起作用,我得到一个恼人的错误;

  

prims.f95:72.43:

     

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

                                 1
     

错误:表达式(1)

中的右括号

到底是怎么回事?!该行的第43个字符是“路径”的“h”

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

另外,我对fortran很新,所以我还有其他一些问题;

我可以使用&amp;&amp;而不是.and。 ?

是否有许多其他语言的for(对象列表){}循环版本?

有没有php函数in_array的版本?即bool in_array(needle,haystack),如果有,有更好的方法吗:

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

然后使用check变量来查看它是否存在?

(我之前没有在stackoverflow上发布任何内容。如果我已经破坏了大量的礼节,请不要生气!)

2 个答案:

答案 0 :(得分: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可以节省数小时的调试时间。

答案 1 :(得分:1)

而.EQ。可以用==代替,但仍然只有.AND。

为了让您的代码块检查“变量是否存在”,您可以使用“where”并使用更短的代码!

在Fortran&gt; = 90语句和函数可以对数组进行操作,因此不必频繁使用显式循环。

没有(列表中的对象),但使用where语句可以做一些非常相似的事情。

许多作用于数组的内部函数也将掩码作为选择性操作的可选参数。

我建议您阅读一本书来了解这些功能。我喜欢Metcalf,Reid和Cohen的那个。与此同时,第二篇维基百科文章可能有所帮助:http://en.wikipedia.org/wiki/Fortran_95_language_features