2017-05-04 393 views
0

我有一個程序在同一個程序中調用函數,但我想聲明並初始化頂部的變量並在程序結束時訪問它們。如何聲明全局變量

!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

回答

1

你可能想看看文檔 - 你錯過了幾個重要的聲明。 (同時嘗試始終包含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 

這是不是最好的風格等,但有變化的最小數量進行編譯。

對於任何稍微複雜的程序,我強烈建議使用模塊來存儲要從代碼的不同部分訪問的變量(以及程序)。