Я пытаюсь использовать fftpack с gfortran, но получаю ошибки, которые, как я думаю, связаны с тем, что некоторым подпрограммам передаются сложные массивы, когда фиктивный аргумент объявлен как реальный.
Я прочитал комментарий на странице Intel Fortran о том, что можно отключить «проверить стандартный интерфейс». Кто-нибудь знает, есть ли подобный вариант для gfortran?
Я бы не хотел редактировать fftpack... (я думаю, это потому, что комплекс в памяти представлен двумя вещественными числами, а аргументы массива передаются как ссылки, но, пожалуйста, поправьте меня, если я ошибаюсь :))
[для уточнения и удовлетворения комментариев ...] Итак, после загрузки dfftpack из netlib и компиляции в виде отдельного файла (f77, я нажимаю) со всеми подпрограммами в одном файле я получаю предупреждение, например, в
SUBROUTINE DFFTF (N,R,WSAVE)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DIMENSION R(1) ,WSAVE(1)
IF (N .EQ. 1) RETURN
CALL RFFTF1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))
RETURN
END
варинг появляется при звонке CALL RFFTF1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))
. Начало RFFTF1 выглядит так...
SUBROUTINE RFFTF1 (N,C,CH,WA,IFAC)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DIMENSION CH(*) ,C(*) ,WA(*) ,IFAC(*)
и предупреждение от компиляции попадает в фактический аргумент WSAVE(2*N+1)
- в фиктивный аргумент IFAC
: (вывод из окна журнала сборки code::blocks)
mingw32-gfortran.exe -Jobj\Debug\ -Wall -g -c
C:\... \dfftpack.f -o obj\Debug\dfftpack.o
C:\... \dfftpack.f:345.40:
CALL RFFTB1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))
1 Warning: Type mismatch in argument
'ifac' at (1); passed REAL(8) to INTEGER(4)
Я предполагаю, что это приведет к неправильному результату.. (передача вещественного числа в целое, похоже, не преобразует/округляет до ближайшего целого числа, а до чего-то другого. Кто-нибудь знает, следует ли округлять его при вызове, например: NINT(WSAVE(2*N+1))
?