2014-11-24 59 views
1

我目前正在更新一些舊的F77固定格式代碼並用gfortan編譯。gfortran:強制靜態內存分配

有沒有辦法在我使用時獲得警告而不是使用靜態內存分配,例如,如果我調用子例程並傳遞一些在運行時不固定的維度值?或者我會不得不使用舊的f77編譯器?

編輯:

下面是一些代碼例如:

 program test 

     integer A,b 
     read(*,*) b 

     select case(b) 
      case(50) 
      A=40 
      case(40) 
      A = 50 
     end select 

     call arr(A) 
     end 

     subroutine arr(A) 
     integer A 
     double precision E(A,A) 

     E(1,1) =10. 
     E(42,41)= 41 
     write(*,*) E(42,41), A 
     end 
+0

很多人都需要這個,所以很難找到它。你有60年代的電腦嗎? – 2014-11-24 12:33:43

+0

請參閱評論在http://stackoverflow.com/questions/17004270/strict-fortran77-compiler-or-gfortran-compiler-flag – 2014-11-24 12:35:02

+0

你能展示一個你想趕上的代碼的例子 – agentp 2014-11-24 12:44:02

回答

2

您使用select case,這是的Fortran 90.因此,使用的Fortran 77編譯器不是一種選擇。我擔心你只需要小心。如果您遠離allocatablepointerallocate,您只需確保沒有自動陣列。您還可以通過-fno-automatic或類似的方法禁用小靜態數組和其他變量的堆棧分配。

關於你的例子,它確實使用了一個自動數組。如果你真的需要遠離它們,你必須聲明這個界限爲編譯時常量:

subroutine arr(A) 
    integer MAXA 
    parameter (MAXA=1000) 
    integer A 
    double precision E(MAXA,MAXA) 

    E(1,1) =10. 
    E(42,41)= 41 
    write(*,*) E(42,41), A 
    end 
+0

好的。這將是一個解決方案。但是:我的觀點是,像這樣你把信息放入我想檢查的代碼中。 f77編譯器只會引發錯誤。但是,這意味着我只需要更加小心。 – dbacc 2014-11-25 15:11:27