Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] глобальные переменные


Автор: Mormishka 17.12.2010, 21:23
Не могу понять, в фортране нельзя делать глобальные переменные?

Код

    logical::exititeration    

    program Console1
    implicit none
    logical::exititeration    

    
    

    print *, 'Hello World'

    end program Console1


Код

1>C:\Users\Александр\Documents\Visual Studio 2008\Projects\17_12_2010\Console1\Console1.f90(4): error #6218: This statement is positioned incorrectly and/or has syntax errors.
1>C:\Users\Александр\Documents\Visual Studio 2008\Projects\17_12_2010\Console1\Console1.f90(5): error #6222: This IMPLICIT statement is not positioned correctly within the scoping unit.
1>C:\Users\Александр\Documents\Visual Studio 2008\Projects\17_12_2010\Console1\Console1.f90(6): error #6418: This name has already been assigned a data type.   [EXITITERATION]
1>C:\Users\Александр\Documents\Visual Studio 2008\Projects\17_12_2010\Console1\Console1.f90(13): error #6785: This name does not match the unit name.   [CONSOLE1]

Автор: Фантом 17.12.2010, 21:43
Можно, но не так. Либо объявляйте переменную там, где это положено (после program) - тогда она будет глобальной для всех внутренних процедур и функций (после contains). Либо описывайте ее в модуле и цепляйте этот модуль везде, где требуется.

Автор: Mormishka 18.12.2010, 14:00
Фантом, 

Например, у меня есть переменная i локальная и глобальная. Так правильно?

module m1

integer i

end module m1

Код

program main
use module m1
i=4
call f
contains
subroutine f
i=1
end subroutine f


end main

Автор: Фантом 18.12.2010, 16:02
В целом да, хотя в этом коде есть две синтаксические ошибки.  smile Подключение модуля пишется как use m1 (без  module), программа должна завершаться либо как enf program main, либо просто end, но не так, как у Вас.

Кроме этого, такое определение глобальных переменных в некотором смысле избыточно. Если у Вас все состоит из основной программы и contains в том же файле, то можно не делать отдельный модуль и объявить переменную i прямо в заголовке программы. Отдельный модуль необходим тогда, когда Вы используете много процедур и функций, находящихся в разных модулях и файлах.

Ну и заодно один совет. Если Вы хотите пользоваться глобальными переменными - обязательно вставляйте в заголовки всех программ, функций и процедур implicit none (или хотя бы отключайте неявное объявление переменных ключами компиляции). Это и в других случаях не помешает, но тут просто необходимо, иначе Вы замучаетесь с выяснением того, какой является та или иная переменная - глобальной или локальной, но "объявившейся" неявно. 

Например, если в Вашем примере в модуле сделать i переменной типа real, то возникнет интересный казус. Если модуль подключен, то i везде будет типа real. Но если Вы почему-то забудете подключить модуль, то основной файл все равно скомпилируется, но i уже будет типа integer (из-за неявного объявления).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)