Ошибка: две основные программы на Фортране - PullRequest
0 голосов
/ 08 июля 2010

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

    real function am1d
    do i=1,L
        do j=1,L
            if (i.eq.j) then
                am1d(i,j)=rand()*w-w/2.
            elseif ((i-j.eq.1) .or. (j-i.eq.1)) then
                am1d(i,j)=1
            else am1d(i,j)=0
        enddo
    enddo
end function am1d

И попытался вызвать ее отсюда (в том же исходном файле, чуть выше функции)

    program make3d
    integer, parameter :: L = 20
    real, parameter    :: w = 0.5
    real :: x


    !x=rand(1234)   ! seed random manually
    x=rand(itime)   ! seed random from current local time
    print *,am1d()(:)


end program make3d

Но попытка скомпилировать это бросаетошибка:

   $ f95 make3d.f
make3d.f:18.21:

       print *,am1d()(:)                                                
                     1
Error: Syntax error in PRINT statement at (1)
make3d.f:7.72:

      program make3d                                                    
                                                                        1
make3d.f:24.72:

      real function am1d                                                
                                                                        2
Error: Two main PROGRAMs at (1) and (2)

Что это значит?Я не думал, что функция может быть программой?У меня были небольшие логические функции под оператором endprogram прежде, без каких-либо проблем.

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Если вы хотите, чтобы функция am1d возвращала массив, вам нужно объявить его как таковой.Было несколько других синтаксических ошибок.Компилятор запутался ... Вы забыли оператор "Содержит" ... без этого или без модуля, компилятор не будет "знать", что делать с другой процедурой, и может попытаться интерпретировать его как вторую основную программу.

Попробуйте:

program make3d
    integer, parameter :: L = 20
    real, parameter    :: w = 0.5
    real :: x

    x=rand(1234)   ! seed random manually
    !x=rand(itime)   ! seed random from current local time
    write (*, *) am1d()

stop

contains

function am1d ()
real, dimension (L,L) :: am1d
    integer i, j
    do i=1,L
        do j=1,L
            if (i.eq.j) then
                am1d(i,j)=rand()*w-w/2.
            elseif ((i-j.eq.1) .or. (j-i.eq.1)) then
                am1d(i,j)=1
            else 
               am1d(i,j)=0
            end if
        enddo
    enddo
end function am1d

end program make3d

или поместите подпрограмму в модуль, который, как мне кажется, обеспечивает более понятный и понятный интерфейс (делает переменную связь явной) - тогда вам нужно будет «использовать»модуль в основной программе и передать w и L в качестве аргументов:

module a_mod

contains

function am1d (w,L)
real, intent (in) :: w
integer, intent (in) :: L
real, dimension (L,L) :: am1d

.....
end function am1d


end module a_mod
0 голосов
/ 23 февраля 2011

У меня была такая же проблема.И, похоже, тот же ответ.Вы поместили «END» в 6 символов лейбла.Если вы просто переместите свой END на 6 символов дальше, это может быть магией ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...