我在使用gfortran編譯的舊fortan代碼時遇到了一些麻煩。Gfortran與數組大小的常見塊
INTEGER NEQ
DOUBLE PRECISION RE
COMMON /DM18J/ RE,NEQ
CALL FUNC(NEQ,RE)
代碼的問題是該函數假定RE是一個NEQ大小的數組。但是,我不能事先指定數組的大小,因爲它來自公共塊。
由於代碼非常冗長,我希望在不訴諸模塊變量的情況下修復yhis。我想嘗試的一件事是將NEQ作爲參數插入,而不是通過公共塊獲取它。
我在使用gfortran編譯的舊fortan代碼時遇到了一些麻煩。Gfortran與數組大小的常見塊
INTEGER NEQ
DOUBLE PRECISION RE
COMMON /DM18J/ RE,NEQ
CALL FUNC(NEQ,RE)
代碼的問題是該函數假定RE是一個NEQ大小的數組。但是,我不能事先指定數組的大小,因爲它來自公共塊。
由於代碼非常冗長,我希望在不訴諸模塊變量的情況下修復yhis。我想嘗試的一件事是將NEQ作爲參數插入,而不是通過公共塊獲取它。
如果RE是一個數組,那麼它應該被聲明爲這樣。對於參數來說,它的大小爲100
parameter (maxre = 100)
integer neq
double precision re(maxre)
common /dm18j/re, neq
當調用你的例程時,你需要指定函數需要操作的數組的大小。這不一定是數組的大小。您的陣列可能有10000個元素,但如果您只希望在前2個元素上操作,只需將NEQ設置爲2.
! sanity check
if (neq .gt. maxre) then
print *, 'increase the size of maxre to at least ', neq
stop
end if
call func(re, neq)
我改變了代碼中所有常用塊的大小。這個伎倆。 – Hugo 2014-11-17 12:23:15
它不清楚你在問什麼。你是說你有一段時間的舊代碼,現在gfortran正在拋出一個編譯錯誤?錯誤是什麼?你是否想改變工作代碼,最新的變化是什麼? – agentp 2014-11-14 18:23:42
這是舊代碼,無需在英特爾Fortran和g95編譯器中投訴。由於排名不匹配而引發警告。 – Hugo 2014-11-17 12:22:35