代码之家  ›  专栏  ›  技术社区  ›  will

为什么这个Fortran代码不能工作?

  •  0
  • will  · 技术社区  · 14 年前

    嘿,我写这个(fortran)的目的是找到一组点的最小生成树( 系统计数 他们当中)我知道这种方法是可行的,因为今天早些时候我用JavaScript编写了它。不过JS速度很慢,我想看看Fortran会有多快!! 唯一的问题是它不工作,我有一个恼人的错误;

    原稿F95:72.43:

    如果((检查==1)。和。(path(nodesin(j))(k)<minpath))然后

                                     1
    

    错误:在(1)处的表达式中需要右括号

    这到底是怎么回事?!第43行字符是“path”的“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还比较陌生,所以我还有几个问题要问;

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

    是否在许多其他语言中找到for(object in list)循环的版本?

    数组中有PHP函数的版本吗?例如,“bool in ou array”(针,草堆),如果有的话,还有比以下更好的方法吗?

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

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

    (我以前没有在StackOverflow上发布过任何内容。如果我破坏了一大堆礼仪,请不要生气!)

    2 回复  |  直到 14 年前
        1
  •  3
  •   brady    14 年前

    看起来你已经定义了 path minpaths 作为二维数组。与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 我建议你考虑一下。不使用它是危险的,并且您使用的变量名彼此接近( minpath 小径 )通过使用 隐无 .

        2
  •  1
  •   M. S. B.    14 年前

    虽然.eq.可以用==替换,但仍然只有.and。

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

    在FORTRAN>=90中,语句和函数可以在数组上操作,这样就不必频繁地使用显式循环。

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

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

    我建议读一本书来了解这些特性。我喜欢梅特卡夫、里德和科恩的作品。与此同时,维基百科的第二篇文章可能有助于: http://en.wikipedia.org/wiki/Fortran_95_language_features