Опитвам се да използвам 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))
?