У меня странное поведение в FORtran подпрограммой, которая выглядит как:Результат меняется, когда переменная используется в операторе печати перед вычислением
subroutine compute(a, b, c)
real(8), dimension(:,:), intent(in) :: a
real(8), dimension(:), intent(in) :: b
real(8), dimension(:), intent(in out) :: c
!print*, c
! do some computation here to update c
end subroutine compute
Если я раскомментируйте оператор печати, я получаю ожидаемый результат. Если я продолжу его комментировать, результат становится очень странным с огромными числами. Кстати, заявление печати появилось только для цели отладки. Как ни странно, он «решил» проблему, но это не надежное решение. Подпрограмма является частью большого кода, и я еще не смог устранить проблему из контекста большого кода. Отладчик мало помог. Очевидно, что проблема находится где-то в другом месте, потому что оператор печати не должен изменять результат вычисления.
Мой вопрос: каковы возможные ошибки, которые могут привести к такой проблеме? У кого-то была схожая проблема?
Это, конечно, повреждение памяти, но трудно найти. У меня уже есть «-fcheck = all -Wall -g», и у меня нет предупреждения. Я проверю, возможно ли в моей рабочей среде иметь вальгурин или дезинфицирующее средство для адреса. – innoSPG
@innoSPG У меня была такая же ошибка некоторое время назад. Я исправил его, скомпилировав свой код со всеми возможными вариантами отладки и тщательно просмотрев его. Ошибка при доступе к массиву за пределами границ. Ваша ошибка может быть чем-то еще. Смотрите: https://en.wikipedia.org/wiki/Heisenbug – solalito
@innoSPG Я отправил аналогичный вопрос о SOF: http://stackoverflow.com/questions/27920043/adding-removing-a- print-statement-changes-variables – solalito