LINUX.ORG.RU
ФорумTalks

[фортран] Что-то я в этой жизни не понимаю....


0

0

Код на Фортране:

      PROGRAM TASK
      PRINT *, FUNC(10)
      END PROGRAM

      REAL FUNCTION FUNC(N)
      INTEGER N
      FUNC = N + 1
      RETURN
      END FUNCTION

При выполнении всё отлично:

$ gfortran app.f && ./a.out 
   11.000000

А теперь изменим тип возвращаемого значения функции:

      INTEGER FUNCTION FUNC(N)
      INTEGER N
      FUNC = N + 1
      RETURN
      END FUNCTION

$ gfortran app.f && ./a.out 
   0.000000

Объясните мне, пожалуйста, что не так?

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

скорее всгео с точки зрения вызывающих сущностей твоя функция не задекларирована и возвращающее значение взялось исходя из первой буквы её имени (F)
вот такой вариант будет работать (потому что декларация будет по I)

FUNCTION INT_FUNC(N)
INTEGER :: INT_FUNC
INTEGER :: N
INT_FUNC = N + 1
RETURN
END FUNCTION

PROGRAM TASK
PRINT *, INT_FUNC(10)
END PROGRAM

gour
()
Ответ на: комментарий от gour

скорее всгео с точки зрения вызывающих сущностей твоя функция не задекларирована и возвращающее значение взялось исходя из первой буквы её имени (F)

забавно... то есть имя функции всегда содержит тип возвращаемого события? и для каждого типа есть префиксы?

ferhiord ★★
() автор топика
Ответ на: комментарий от ferhiord

содержит тип возвращаемого события

содержит возвращаемый тип

Кстати сработало.. спасибо...

ferhiord ★★
() автор топика

попробуй в самом начале написать «implicit none».

оно отменит определение типа по первой букве

EqX
()

Вот из-за таких сюрпризов я и бросил фортран и перешел на С. Приходится иногда искать по 20 минут ошибку подобную этой. Самое обидное вначале ищешь в другом месте.

Ошибка еще в том, что по умолчанию стоит:

IMPLICIT REAL(A-H, O-Z), INTEGER(I-N) IMPLICIT

Отсюда функция F(N) - по умолчанию real :(

//Когда использовал, жестко задавал тип переменной.

Zodd ★★★★★
()
Ответ на: комментарий от Zodd

Да без implicit none как уже выше сказали никуда, везде будут сюрпризы =) А так Фортран вполне себе нормальный язык. Да, забыл что хотел умного сказать... Пишите интерфейсы к функциям чтобы не было таких ошибок.

WerNA ★★★★★
()
Ответ на: комментарий от WerNA

ага, еще где-то слышал, что у него стандартная библиотека хорошо оптимизирована под вычисления, проги побыстрее, чем на С получаются.

правда, сам язык временами доставляет, взять хотя бы эти страшные интерфейсы или implicit %)

EqX
()
Ответ на: комментарий от gour

Так получается что неявные определения типа по первой букве перекрывают явное указание типа функции?

Иначе бы из-за чего не сработало это

      INTEGER FUNCTION FUNC(N)
      INTEGER N
      FUNC = N + 1
      RETURN
      END FUNCTION

mclaudt
()
Ответ на: комментарий от EqX

AFAIK, gcc/g77/gfotran используют одну и ту же библиотеку матфункций, так что различия могут накопиться только из-за способа вызова -- у C по значению (что включает дополнительное копирования переменной в стеке), у Фортрана -- по ссылке.

annoynimous ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.