Я изучаю основы Fortran. Я создал простую подпрограмму инициализации матрицы:Неверный результат при использовании глобальной переменной в Fortran
program test
integer, parameter :: n = 1024
real :: a(n, n)
call init(a)
write (*, *) a(1, 1)
end program
subroutine init(a)
real :: a(n, n)
a(:, :) = 3.0
end subroutine
Тогда выход является 0.0
вместо ожидаемого 3.0
. Кроме того, valgrind
говорит, что:
==7006== Conditional jump or move depends on uninitialised value(s)
==7006== at 0x400754: init_ (in /home/marcin/proj/mimuw/fortran/test)
==7006== by 0x4007A4: MAIN__ (in /home/marcin/proj/mimuw/fortran/test)
==7006== by 0x40083B: main (in /home/marcin/proj/mimuw/fortran/test)
Почему? Параметр n
правильно распознается компилятором и должен быть глобальным.
Я составил программу с gfortran 6.3.1
Возможно, вы думаете о внутренней процедуре. – tim18
'n' не является глобальным объектом. Если вы добавите 'implicit none' в подпрограмму, вы увидите ошибку. – francescalus
О, так что мне тоже нужно 'implicit none' в подпрограммах! Не знал об этом. При тестировании я пытался использовать это в 'program', но не в' подпрограмме'. Можно ли использовать 'implicit none' глобально? – marmistrz