Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Первая функция на GNU Fortran, Не могу вызвать функцию 
:(
    Опции темы
Dark Elf
  Дата 6.4.2014, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 26.12.2003
Где: Брисбен

Репутация: нет
Всего: 10



Добрый день

Пишу первую в жизни функцию на Фортран 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

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



--------------------
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Фантом
Дата 6.4.2014, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 5
Всего: 49



Проблема в том, что на момент компиляции программы функция еще не объявлена и, соответственно, неизвестна. Можно сделать следующее:
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 в момент окончания работы функции.

Это сообщение отредактировал(а) Фантом - 6.4.2014, 12:29
PM   Вверх
Dark Elf
  Дата 6.4.2014, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 26.12.2003
Где: Брисбен

Репутация: нет
Всего: 10



***DEL***

Это сообщение отредактировал(а) Dark Elf - 6.4.2014, 14:56


--------------------
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.1169 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.