Остановка / зависание вызова функции при содержании оператора write, но только при связывании с определенными библиотеками во время компиляции - PullRequest
4 голосов
/ 04 октября 2011

Вот мой минимальный пример:

program test    
  implicit none
  real :: testfunc
  write(*,*) "Writing from main"
  write(*,*) testfunc()
end program test

function testfunc() result(y)
  real             :: y
  write(*,*) "Write from function g"
  y=1.0
  return
end function testfunc

При компиляции с простым

gfortran test.f90

или при включении библиотеки, такой как Slatec

gfortran test.f90 -lslatec

Это работаетнормально.

Однако при изменении библиотеки на -llapack из -lblas программа зависает во время выполнения при вызове testfunc ().Обратите внимание, что мой пример кода здесь на самом деле не использует ни одну из этих библиотек.Последнее, что я вижу, это «Запись с основного», тогда ничего не происходит, и мне нужно CTRL-C, чтобы восстановить контроль.При зависании процесс, похоже, не использует циклы ЦП.

Странно сейчас то, что, если я закомментирую оператор записи внутри testfunc (), он будет работать постоянно.

Итак, мой вопрос на самом деле: могут ли эти библиотеки действительно помешать мне печатать внутри моих собственных функций?Зачем?Как?

(На самом деле я работаю над более крупной программой, которая требует lapack и blas, поэтому я, очевидно, не могу просто перестать ссылаться на них.)

1 Ответ

7 голосов
/ 05 октября 2011

Насколько я помню, нереально стандартно рекурсивно вызывать ключевое слово WRITE.

Чтобы исправить вашу программу, слегка измените основную программу

program test    
  implicit none
  real :: testfunc,result
  write(*,*) "Writing from main"
  result=testfunc()
  write(*,*) result
end program test

С моей точки зрения, проблема, с которой вы столкнулись, не имеет ничего общего с используемыми библиотеками, но в этом случае симптомы ошибки могут измениться (от, по-видимому, отсутствия ошибок до сбоя).

...