2010-08-27 1 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 

Кроме того, я довольно новыми для Fortran, так что у меня есть несколько других вопросов;

Могу ли я использовать & & вместо .and. ?

Есть ли версии для (объекта в списке) {} петли, найденной на многих других языках?

Есть ли версия php-функции in_array? т.е. BOOL in_array (иглы, стог), и если есть, то есть лучший способ сделать это, чем:

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

затем с помощью переменной проверки, чтобы увидеть, если она есть?

(я не писал ничего на StackOverflow раньше. Пожалуйста, не сердитесь, если я сломал нагрузки этикета вещей!)

+0

Можете ли вы использовать == в Fortran? В прошлый раз я использовал его (Fortran 77 - я знаю, что мир изменился с тех пор) вы использовали .EQ. и .LT. и так далее. Я знаю, что Fortran 90 много модернизировал, но я не знаю, что изменилось. Попробуйте использовать .EQ., .LT., .LE., .NE., .GT., .GE. а также .AND., .OR., и .NOT. и посмотреть, помогает ли это. Классический Фортран говорит, но, скорее всего, будет работать. –

+0

этот сайт: http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap03/logical.html говорит == должен работать, также работает несколько строк выше, и если я меняю его, он просто сдвигает ошибку до 72.46. не похоже, что проблема :-( – will

+0

Вы уверены, что это выражение «путь (nodesin (j)) (k)»? Что такое «путь» и «узлы»? Как они определены в коде? – Wildcat

ответ

3

Похоже, что вы определили path и minpaths как два одномерных массивов , Многомерные массивы доступны по-разному в Fortran по сравнению с C-подобными языками. В Fortran вы разделяете индексы запятыми в одном наборе круглых скобок.

Я предполагаю, что с помощью этих переменных они являются целыми массивами. Вот как получить доступ к элементам этих массивов (так как вы не разделяете ваши переменные декларации Я составляющие форму этих массивов):

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

ваших, если заявление должно быть:

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.

+0

О, да, ты! – will

1

В то время как .EQ. может быть заменен на ==, есть еще только .AND.

Для вашего кода, чтобы проверить, есть ли «переменная», вы можете использовать «где» и иметь гораздо более короткий код!

В Fortran> = 90 операторов и функций могут работать на массивах, поэтому явные петли не должны использоваться так часто.

Нет (для объекта в списке), но использование оператора where может сделать что-то очень похожее.

Многие из встроенных функций, которые действуют на массивы, также принимают маски в качестве необязательных аргументов для выборочной работы.

Предлагаю прочитать книгу, чтобы узнать об этих функциях. Мне нравится Меткалф, Рид и Коэн. В то же время вторая статья в Википедии может помочь: http://en.wikipedia.org/wiki/Fortran_95_language_features