Повреждение параметров при сопряжении с рутиной FORTRAN - PullRequest
1 голос
/ 21 октября 2011

Я застрял с проблемой повреждения кучи в Visual Studio 2008 с Intel Fortran Compiler 11. Я работаю над 64-разрядной версией Windows 7.

Это вызов подпрограммы (F77) lapack в моей программе F90:

  call dgetrs('N', nbParams, one, a, nbParams, ipv, x, nbParams, err)

Перед этим вызовом отладчик показывает ожидаемые значения для всех параметров. a и x обозначают две «размещаемые» переменные с размерами (nbParams, nbParams) и (nbParams) соответственно.

Однако после запуска этой строки выполнение останавливается с местоположением чтения нарушения доступа 0x0000000000000001. Поскольку я скомпилировал lapack в режиме отладки, я могу войти в вызов, и я вижу, что все, кроме «TRANS», повреждено только в первом утверждении DGETRS.

  SUBROUTINE DGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO )
  ...
  CHARACTER          TRANS
  INTEGER            INFO, LDA, LDB, N, NRHS
  ...
  INTEGER            IPIV( * )
  DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
  ......
  INFO = 0     **--> Now all input vars but TRANS are corrupted or dereferenced!**

Я перепробовал все и не могу найти проблему. Может ли кто-нибудь помочь мне найти проблему?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 28 февраля 2012

Проблемы такого рода обычно возникают при использовании массивов предполагаемой формы без интерфейса.Попробуйте объявить интерфейс, такой как:

INTERFACE
   SUBROUTINE DGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO )
    CHARACTER          TRANS
    INTEGER            INFO, LDA, LDB, N, NRHS
    INTEGER            IPIV( * )
    DOUBLE PRECISION   A( LDA, * ), B( LDB, * )
  END SUBROUTINE
END INTERFACE
...