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: (изход от прозореца на регистъра на кода::блокове за изграждане)

 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
Доколкото разбирам от Steve Lionels коментира тук 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 файл и той се компилира в an.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