Комплекс Gfortran от фактического до реального фиктивного аргумента

Я пытаюсь использовать 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))?


person Erik Thysell    schedule 11.05.2015    source источник
comment
Если подпрограмма имеет фиктивный аргумент реального массива, то добавление фактического аргумента сложного массива и сообщение компилятору, что я знаю, доверяю мне, кажется интересным. Возможно, вы просто имеете в виду передать реальную составляющую комплекса?   -  person francescalus    schedule 11.05.2015
comment
Насколько я понял из комментария Стива Лайонелса здесь software.intel.com/en- us/forums/topic/289586 кажется довольно распространенным....   -  person Erik Thysell    schedule 11.05.2015
comment
Справедливо. Как также отмечалось, это не законно, но если вы уверены, что это то, что вы хотите сделать, кто-то действительно может предложить аналогичный вариант.   -  person francescalus    schedule 12.05.2015
comment
@ErikThysell Вы используете одну из подпрограмм здесь? netlib.org/fftpack   -  person roygvib    schedule 12.05.2015
comment
@roygvib Кажется, я использовал версию с двойной точностью f90, которую где-то нашел. Вместо этого я загрузил версию .f из netlib и поместил все функции в один файл .f, и он скомпилировался в файл .o, хотя и с несколькими предупреждениями о преобразовании реальных чисел в целочисленные.   -  person Erik Thysell    schedule 16.05.2015
comment
@ErikThysell Обходной путь состоит в том, чтобы скомпилировать библиотечные подпрограммы и ваши исходные файлы отдельно (вместо того, чтобы помещать их все в один файл), а затем связать полученные файлы *.o (например, gfortran -c yourcode.f; gfortran -c yourlib .f; gfortan yourcode.o yourlib.o). Но критически важно убедиться, что данные, переданные в библиотеку, верны, даже если несоответствие типов возникает из-за старых стилей Fortran. Что касается предупреждений о действительном и целочисленном преобразовании, то они кажутся несколько странными и могут привести к ошибочным результатам. Так что нужно внимательно проверять список аргументов :)   -  person roygvib    schedule 16.05.2015
comment
Как говорится в сообщении об ошибке, в этом примере кода вы пытаетесь связать реальный фактический аргумент с целочисленным фиктивным аргументом (неявно типизированным).   -  person francescalus    schedule 16.05.2015
comment
Я бы подумал, что fftpack был исправлен для таких ошибок, так как он такой старый...???   -  person Erik Thysell    schedule 16.05.2015
comment
Используйте тег fortran, чтобы привлечь больше внимания.   -  person Vladimir F    schedule 19.02.2016
comment
@VladimirF: я вижу тег fortran с моей точки зрения, и я думаю, что он всегда был там - или вы просто добавили его?   -  person Erik Thysell    schedule 20.02.2016
comment
Проверьте историю редактирования.   -  person Vladimir F    schedule 20.02.2016


Ответы (1)


Я столкнулся с этой проблемой при рефакторинге FFTPACK 5.1 с FORTRAN 77 на Fortran 2008. Я выполнил приведение в стиле языка C без копирования следующим образом:

use ISO_C_binding, only: c_f_pointer, c_loc

integer, parameter :: N = 42
complex, target    :: c(N) ! Also works for the allocatable attribute
real, pointer      :: r(:) => null()

! Pass memory address from complex array to real array
call c_f_pointer(c_loc(c), r, shape=[2*size(c)])

call procedure_expecting_real_arg(r, ....)

! Terminate association
nullify( r )
person jlokimlin    schedule 16.07.2016