Я загрузил гипергеометрическую функцию 2F1, но оказалось, что она не компилируется на моем компьютере. Это из Эта статья. я использую
GNU Fortran (Built by Jeroen for the R-project) 8.3.0
поставляется с RTools 4.0. Можете ли вы понять, почему он не компилируется и как это можно решить? В приведенном ниже коде я просто оставил одну строку, которая генерирует ошибку. Ошибка указана далее.
MODULE HYP_2F1_MODULE
!--------------------------------------------------------------------
IMPLICIT NONE
INTEGER, PARAMETER :: PR=KIND(1.0D0)
REAL(PR) :: ONE=1.0D0
CONTAINS
!
END MODULE HYP_2F1_MODULE
!
!----------------------------------------------------------------------
RECURSIVE FUNCTION LOG_GAMMA(Z) RESULT(RES)
USE HYP_2F1_MODULE
IMPLICIT NONE
COMPLEX(PR),INTENT(IN) :: Z
COMPLEX(PR) :: RES
!
RES = LOG_GAMMA( ONE -z);
!
END FUNCTION LOG_GAMMA
Вот сообщение об ошибке
testZ.f90:18:22:
RES = LOG_GAMMA( ONE - Z);
1
Error: 'x' argument of 'log_gamma' intrinsic at (1) must be REAL
@bob только что обновил код, затем сообщение об ошибке
Ну, это не компилируется, и я не могу понять, почему. Это взято (как есть) из репозитория НАСА. Я пытался преобразовать ONE в сложный CMPLX (ONE, ZERO) перед вычитанием, но все равно не компилируется.
RES LOG_GAMMA четко указано как COMPLEX, поэтому я не понимаю, почему в нем говорится, что (1) должно быть REAL.
О, я вижу, я не заметил, что сама функция называется LOG_GAMMA
. LOG_GAMMA
также является встроенной функцией Fortran 2018. Интересно, почему внутреннее не затенено здесь.
Разве функция не должна затенять внутреннюю?
Проблема будет в рекурсивном атрибуте и связанном предложении результата и может быть ошибкой компилятора.
Хороший улов, я не знал, что LOG_GAMMA встроен. Переименую без проблем. Если вы хотите превратить это в ответ? Спасибо.
Я предполагаю, что решения включают в себя использование более нового компилятора или использование -std=f95 для отключения встроенного.
@veryreverie Очень хороший момент, для старых кодов -std=f95
будет работать. Даже -f2003
достаточно.
Кажется, что правильная функция вызывается, если типы совпадают.
Существует одноименная встроенная функция Fortran 2008+.
16.9.119 LOG_GAMMA (X)
1 Description. Logarithm of the absolute value of the gamma function.
2 Class. Elemental function.
3 Argument. X shall be of type real. Its value shall not be a negative integer or zero.
Здесь какая-то коллизия, которую я не совсем понимаю. Очевидным обходным путем является переименование вашей функции. Что я могу сказать, так это то, что без предложения результата (которое вам нужно из-за рекурсивного атрибута) встроенная функция будет скрыта. Это может быть ошибка компилятора.
Также подумайте, не может ли встроенная функция с тем же именем делать то, что вам нужно от вашей функции.
Это ошибка. F2018, 15.6.2.2, стр. 319: если появляется RESULT, имя результата функции — имя-результата, и все вхождения имени функции в операторах исполнительной части в его области действия относятся к самой функции.
@steve сообщил как gcc.gnu.org/bugzilla/show_bug.cgi?id=105138
Спасибо. Я добавил цитируемый текст для F2018 в контрольный журнал.
Был отправлен патч для исправления gfortran. См. URL-адрес опубликованного PR @Vladimir. Не знаю, когда, и даже если, он превратится в дерево.
В дополнение к предложениям @VladimirF вы можете добавить флаг компилятора -std=f95
, чтобы обеспечить соответствие стандарту Fortran 95. Если вы не добавили -fall-intrinsics
, это отключит все встроенные функции из стандартов после Fortran 95 и заставит работать устаревший код.
Также -std=f2003
в этом случае, если нужно что-то из Fortran 2003.
Сообщение об ошибке, показанное в вашем вопросе, не соответствует коду, который вы разместили.