嘿,我写了这个(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上发布任何内容。如果我已经破坏了大量的礼节,请不要生气!)
答案 0 :(得分:3)
您似乎已将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
和minpaths
)。使用IMPLICIT NONE
可以节省数小时的调试时间。
答案 1 :(得分:1)
而.EQ。可以用==代替,但仍然只有.AND。
为了让您的代码块检查“变量是否存在”,您可以使用“where”并使用更短的代码!
在Fortran&gt; = 90语句和函数可以对数组进行操作,因此不必频繁使用显式循环。
没有(列表中的对象),但使用where语句可以做一些非常相似的事情。
许多作用于数组的内部函数也将掩码作为选择性操作的可选参数。
我建议您阅读一本书来了解这些功能。我喜欢Metcalf,Reid和Cohen的那个。与此同时,第二篇维基百科文章可能有所帮助:http://en.wikipedia.org/wiki/Fortran_95_language_features