Вопрос

Как мне назвать функцию Fortran?

Я пытаюсь позвонить Дласи Но он ошибочно возвращает 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   

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

Что здесь происходит?

Это было полезно?

Решение

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

double precision, external :: dlansy

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

DOUBLE PRECISION DLANSY
EXTERNAL DLANSY
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top