Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > Первая функция на GNU Fortran


Автор: Dark Elf 6.4.2014, 10:53
Добрый день

Пишу первую в жизни функцию на Фортран 2003 (если что то в Фортран 90 те же результаты):

Код

program test

    implicit none

    integer :: iter = 12345
    real :: value = 1.0/sqrt(3.0)
    real :: s

    !Здесь и сыпется
    s = arcsin(value, iter)
    !!!!!!!!!!!!!!!!!!!!!!

    print *, 'The arcsin of ', value, ' is ', s * 45 / atan(1.0)

end program test

real function arcsin(value, iter)

    integer :: i, j
    real :: k, s = 0
    do i = 1, iter, 2
        k = 1
        do j = 1, i
            if (mod(j, 2) == 0 .or. j == i) then
                k = k / j
            else
                k = k * j
            end if
        end do
        s = s + k * value ** i
    end do
    arcsin = s

end function arcsin


При попытке скомпилить (при включении отмеченной строчки компилятор ругается на ошибку:

Function 'arcsin' at (1) has no IMPLICIT type

Не подскажете ли случайно как это исправить?

Автор: Фантом 6.4.2014, 12:26
Проблема в том, что на момент компиляции программы функция еще не объявлена и, соответственно, неизвестна. Можно сделать следующее:
1) Описать в программе arcsin как "переменную" типа real. Это очень плохой "костыль", соранившийся ради обратной совместимости с древними стандартами языка, но все же допустимый.
2) Вставить в заголовок основной программы (после описания переменных) интерфейсный блок примерно такого вида:
Код

    interface
     real function arcsin(value, iter)
     end
    end interface 

В терминах, возможно, более знакомых C/C++ это объявление прототипа функции. Это уже нормально, но в данном случае является излишеством.
3) Воспользоваться существующем в современном Фортране механизмом модулей и встроенных функций. В данном случае надо просто перенести строку end program test в конец файла, а на ее место вставить новую строку contains. Это наиболее нормальный способ. Однако при этом действие оператора implicit none в основной программе будет распространяться также и на функцию, поэтому тип аргументов iter и value нужно будет описать.

Заодно, кстати, можно немного упростить описание функции. Если оформить ее заголовок как
Код

function arcsin(value, iter) result(s)

то переменную s можно будет использовать так же, как и раньше, но вот строчка arcsin=s не понадобится, в качестве значения функции будет возвращено содержимое переменной s в момент окончания работы функции.

Автор: Dark Elf 6.4.2014, 13:32
***DEL***

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)