2015-10-14 1 views
3

У меня странное поведение в 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 

Если я раскомментируйте оператор печати, я получаю ожидаемый результат. Если я продолжу его комментировать, результат становится очень странным с огромными числами. Кстати, заявление печати появилось только для цели отладки. Как ни странно, он «решил» проблему, но это не надежное решение. Подпрограмма является частью большого кода, и я еще не смог устранить проблему из контекста большого кода. Отладчик мало помог. Очевидно, что проблема находится где-то в другом месте, потому что оператор печати не должен изменять результат вычисления.

Мой вопрос: каковы возможные ошибки, которые могут привести к такой проблеме? У кого-то была схожая проблема?

ответ

3

Это типичный признак повреждения памяти. Попробуйте выполнить компиляцию с помощью «-fcheck = all -Wall -g» и исправить все предупреждения и ошибки. Если это не помогает, выполните через valgrind и/или адрес дезинфицирующего средства.

+0

Это, конечно, повреждение памяти, но трудно найти. У меня уже есть «-fcheck = all -Wall -g», и у меня нет предупреждения. Я проверю, возможно ли в моей рабочей среде иметь вальгурин или дезинфицирующее средство для адреса. – innoSPG

+1

@innoSPG У меня была такая же ошибка некоторое время назад. Я исправил его, скомпилировав свой код со всеми возможными вариантами отладки и тщательно просмотрев его. Ошибка при доступе к массиву за пределами границ. Ваша ошибка может быть чем-то еще. Смотрите: https://en.wikipedia.org/wiki/Heisenbug – solalito

+1

@innoSPG Я отправил аналогичный вопрос о SOF: http://stackoverflow.com/questions/27920043/adding-removing-a- print-statement-changes-variables – solalito