Основы синтаксиса Фортрана?

Поэтому я пытаюсь заставить мой код Fortran 95 работать только для основных функций и определений программ. Я получаю практически ошибку для каждой строки с надписью «Неожиданный» или «Неклассифицированный». Интересно, это мой компилятор (gfortran используется в терминале cygwin) или я должен что-то поместить в начало файла? Вот если кто что подскажет.

    double precision :: pi = 3.14159265359

    PROGRAM Diffraction
            write (*,*) sinc(0)
            write (*,*) sinc(pi)
            write (*,*) 1_Slit(0, 1, 550E-9)
    end PROGRAM Diffraction

    function SINC(angle) result(sinc)
    double precision :: sinc
    double precision :: angle
    if angle == 0.0 then
            sinc == 1
    else
            sinc = (sin(angle)/angle)
    endif
    end function SINC

    function I(angle, d, wl) result(I)
            double precision :: I_0 = 0.01
            double precision :: angle, d, wl, I
            A = (d * pi)/wl
            B = SIN(angle)
            I = I_0 * (SINC(A*B)**f2)
    return
    end function I

Я компилирую так: gfortran Diffraction.f95.


person user2178346    schedule 12.04.2013    source источник
comment
Неважно. Я потратил немного времени на поиск подпрограмм в BNF и устранил все ошибки.   -  person user2178346    schedule 13.04.2013
comment
Поскольку вы работаете на платформе Windows, почему бы не использовать Silverfrost. У него есть встроенная IDE (можно даже использовать Visual Studio Express IDE), что довольно хорошо. Просто нажмите на сообщение об ошибке, и вы перейдете к строке кода. После того, как вы правильно поняли синтаксис, вы можете вернуться к gfortran для более высоких скоростей или просто запустить его из silverfrost.   -  person cup    schedule 14.04.2013


Ответы (1)


Вообще говоря, рекомендуется поместить все определения в основную программу или модуль. Так что ваши "плавающие" определения немного странные.

Ваша программа должна начинаться с PROGRAM [name], за которым следуют используемые вами модули. В вашем случае таких модулей нет. После этого рекомендуется написать IMPLICIT NONE. Это означает, что никакие переменные не имеют предопределенного типа. В противном случае каждая переменная, начинающаяся с I до N, будет иметь тип INTEGER, а все остальные переменные будут иметь тип REAL.

Следующая часть — это часть определения переменных, где определяются ваши переменные. (Первая строка в вашем примере.)

После этого следует основная часть, где вы выполняете свой код.

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

Итак, ваш пример (с некоторыми исправлениями) будет выглядеть так:

PROGRAM Diffraction
IMPLICIT NONE

double precision :: pi = 3.14159265359d0

  write (*,*) sinc(0.d0)
  write (*,*) sinc(pi)
  write (*,*) one_slit(0.d0, 1.d0, 550.d-9)

CONTAINS

  function SINC(angle) result(snc)
    double precision :: snc
    double precision :: angle

    if (angle == 0.d0) then
      snc = 1.d0
    else
      snc = (sin(angle)/angle)
    endif
  end function SINC

  function one_slit(angle, d, wl) result(I)
    double precision :: I0 = 0.01d0, A, B
    double precision :: angle, d, wl, I, f2=2.d0

      A = (d * pi)/wl
      B = SIN(angle)
      I = I0 * (SINC(A*B)**f2)
  end function one_slit

end PROGRAM Diffraction
person Stefan    schedule 15.04.2013
comment
Я бы также добавил parameter к пи. - person ShinTakezou; 23.05.2013