¿Cómo debo llamar a una función de Fortran?
Pregunta
¿Cómo debo llamar a una función de Fortran?
Estoy tratando de llamar Dlansy pero devuelve erróneamente 0. Consulte el código y la salida del programa a continuación.
SUBROUTINE COND(TYP,N,A,LDA,IPIV,WORK,LWORK,IWORK,INFO,RCOND)
INTEGER TYP, N, LDA, IPIV(*), IWORK(*), INFO, LWORK
DOUBLE PRECISION A(LDA,*), ANORM, RCOND, WORK(*)
CHARACTER*1 UPLO
EXTERNAL DLANSY, DSYTRF, DSYCON
IF (TYP .EQ. 0) THEN
UPLO = 'L'
ELSE
UPLO = 'U'
ENDIF
DO I = 1, N
DO J = 1,N
WRITE(*,*) I,J,A(I,J)
END DO
END DO
WRITE(*,*) 'TYPE ',UPLO
WRITE(*,*) 'N ',N
WRITE(*,*) 'LDA ',LDA
ANORM = DLANSY('1', UPLO, N, A, LDA, WORK)
C ANORM = 10;
WRITE(*,*) 'ANORM ',ANORM
END
Y lo que imprime:
1 1 1.0000000000000000
1 2 2.0000000000000000
1 3 3.0000000000000000
1 4 4.0000000000000000
2 1 1.0000000000000000
2 2 2.0000000000000000
2 3 3.0000000000000000
2 4 4.0000000000000000
3 1 1.0000000000000000
3 2 2.0000000000000000
3 3 3.0000000000000000
3 4 4.0000000000000000
4 1 1.0000000000000000
4 2 2.0000000000000000
4 3 3.0000000000000000
4 4 4.0000000000000000
TYPE L
N 4
LDA 4
ANORM 0.0000000000000000
En las matrices de entrada son de tamaño adecuado.
¿Qué está pasando?
Solución
Debe decirle al compilador que Dlansy devuelve un valor de doble precisión, en lugar de real, que es lo que obtiene actualmente a través de las reglas de escritura implícitas. Por ejemplo, con una línea como
double precision, external :: dlansy
O, si por alguna extraña razón, uno se limita a algún compilador antiguo que no admite F90:
DOUBLE PRECISION DLANSY
EXTERNAL DLANSY
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow