Почему этот код не работает? - PullRequest
0 голосов
/ 27 августа 2010

Эй, я написал это (фортран) с целью найти минимальное остовное дерево для группы точек ( syscount из них). Я точно знаю, что этот подход работает, так как я написал это в javascript ранее сегодня. JS медленный, хотя, и я хотел посмотреть, насколько быстрее будет Фортран! Единственная проблема в том, что он не работает, я получаю досадную ошибку;

prims.f95: 72,43:

if ((check == 1) .and. (Путь (nodein (j)) (k)

                                 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

Кроме того, я довольно плохо знаком с фортраном, поэтому у меня есть еще несколько вопросов;

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

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

есть ли версия функции 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. Пожалуйста, не сердитесь, если я нарушил кучу вещей из этикета!)

Ответы [ 2 ]

3 голосов
/ 27 августа 2010

Похоже, вы определили path и minpaths как двумерные массивы.К многомерным массивам в Фортране обращаются по-разному по сравнению с С-подобными языками.В Фортране вы разделяете индексы запятыми в одном наборе скобок.

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

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 голос
/ 27 августа 2010

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

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

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

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

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

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

...