如何声明全局变量

问题描述:

我有一个程序在同一个程序中调用函数,但我想声明并初始化顶部的变量并在程序结束时访问它们。如何声明全局变量

!Declaration 
INTEGER TOPCHORD,BOTCHORD, SUPPS, PURLINS; 

!Initialization 
! Define Layers for connecting lines 
TOPCHORD = 32 
BOTCHORD = 32 
SUPPS = 36 
PURLINS = 30 

INTEGER FUNCTION IFLANGE1(IEND1,IEND2,ISUP) 

    IFLANGE1=TOPCHORD 

    SELECT CASE(IEND1) 
     CASE(2,4,6,8,9,10) 
      IFLANGE1=BOTCHORD 
      IF(ISUP.EQ.1)IFLANGE1=SUPPS 
    END SELECT 

    SELECT CASE(IEND2) 
     CASE(2,4,6,8,9,10) 
      IFLANGE1=BOTCHORD 
      IF(ISUP.EQ.1)IFLANGE1=SUPPS 
    END SELECT 

    RETURN 
END 

我得到错误变量“补充程序”引用但没有设置

+0

你用什么编译器来编译你的例子?这真的是你正在使用的确切代码(或重现了错误)?当我尝试编译这个时,我从编译器得到了一个非常不同的错误消息。 –

+0

你的问题的一般答案是 - 你不。全局变量的使用是任何现代编程语言中的反模式,因为这种肮脏和不可预知的行为。最好用本地代码替换它们,并将它们传递给你想修改它们的过程,或者给它们分配函数的返回值。 – Chaosit

+0

如图所示,顶部的声明不是全局的,而是本地的主程序。这里真的没有足够的东西来看看你的全球意味着什么 – agentp

你可能想看看文档 - 你错过了几个重要的声明。 (同时尝试始终包含implicit none - 这对于捕捉某些问题非常有用)。

稍微修改代码应该编译是

!Declaration 
INTEGER TOPCHORD,BOTCHORD, SUPPS, PURLINS; 

!Initialization 
! Define Layers for connecting lines 
TOPCHORD = 32 
BOTCHORD = 32 
SUPPS = 36 
PURLINS = 30 

contains !Indicate that the program unit contains other procedures 
    INTEGER FUNCTION IFLANGE1(IEND1,IEND2,ISUP) 

     IFLANGE1=TOPCHORD 

     SELECT CASE(IEND1) 
      CASE(2,4,6,8,9,10) 
       IFLANGE1=BOTCHORD 
       IF(ISUP.EQ.1)IFLANGE1=SUPPS 
     END SELECT 

     SELECT CASE(IEND2) 
      CASE(2,4,6,8,9,10) 
       IFLANGE1=BOTCHORD 
       IF(ISUP.EQ.1)IFLANGE1=SUPPS 
     END SELECT 

     RETURN 
    END FUNCTION !End the function definition 
END !This is a required end statement to say we've reached the end of the program 

这是不是最好的风格等,但有变化的最小数量进行编译。

对于任何稍微复杂的程序,我强烈建议使用模块来存储要从代码的不同部分访问的变量(以及程序)。