Как мне вызвать функцию Фортрана? - PullRequest
0 голосов
/ 11 января 2012

Как мне вызвать функцию Фортрана?

Я пытаюсь вызвать DLANSY , но он ошибочно возвращает 0. См. Код и вывод программы ниже.

      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

И что это печатает:

           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   

Во входных массивах правильного размера.

Что происходит?

1 Ответ

4 голосов
/ 11 января 2012

Вы должны сообщить компилятору, что DLANSY возвращает значение двойной точности, а не действительное, которое вы получаете в настоящее время с помощью правил неявной типизации. Например. с линией вроде

double precision, external :: dlansy

Или, если по какой-то странной причине один ограничен каким-то древним компилятором, который не поддерживает F90:

DOUBLE PRECISION DLANSY
EXTERNAL DLANSY
...