[問題] subroutine 無法回傳值

看板Fortran作者 (Luke)時間14年前 (2010/04/23 16:17), 編輯推噓0(0031)
留言31則, 3人參與, 最新討論串1/1
如題 之前用副程式計算矩陣 在主程式呼叫都可以傳回來整個矩陣的元素 可是這次只是用一維的陣列從(0:10) 在主程式呼叫卻無法回傳值 0 errors ; 0 warings 只好貼上程式檔請大家看看 謝謝<(_ _)> http://www.badongo.com/cn/file/22202617 -- 鮮花無限好 只是進牛糞 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.176.57

04/23 18:24, , 1F
不能抓...
04/23 18:24, 1F

04/23 18:37, , 2F
不會用CVF...冏 原po先寫interface看看 我遇過類似問題
04/23 18:37, 2F

04/23 18:38, , 3F
對了 可以抓
04/23 18:38, 3F

04/23 18:43, , 4F
你xl,xr,dx是real N是整數...還有你func宣告要加external
04/23 18:43, 4F

04/24 00:27, , 5F
抱歉還是新手,不太懂m大說的方法
04/24 00:27, 5F

04/24 09:19, , 6F
不同變數型態不能混合運算 你寫了 (xl-xr)/dx=N
04/24 09:19, 6F

04/24 09:20, , 7F
要把real變integer或integer變real 還有你allocate時
04/24 09:20, 7F

04/24 09:21, , 8F
裡面的N一定要整數才行 函數宣告時要寫 real,external::f
04/24 09:21, 8F

04/24 09:22, , 9F
最後一個很細節的問題是allocatble進出函式時某些編譯器
04/24 09:22, 9F

04/24 09:23, , 10F
會出問題或者編譯過但執行有問題 解決方法是把這變數放在
04/24 09:23, 10F

04/24 09:23, , 11F
module或寫個interface
04/24 09:23, 11F

04/24 10:50, , 12F
那請問如何寫module or interface 我剛試過把n的運算式
04/24 10:50, 12F

04/24 10:51, , 13F
改成N=int((xr-xl)/dx) func也加了real,external::f
04/24 10:51, 13F

04/24 10:51, , 14F
還是不能跑出來= =
04/24 10:51, 14F

04/24 12:49, , 15F
請問你說的不能跑出來,是指哪個變數有問題?
04/24 12:49, 15F

04/24 12:50, , 16F
在主程式呼叫卻無法回傳值,這句是指陣列Euler嗎
04/24 12:50, 16F

04/24 12:51, , 17F
Euler只有在副程式Euler1裡面有計算,但你沒傳Euler進去
04/24 12:51, 17F

04/24 12:52, , 18F
自然沒有回傳,你的Euler只能算是副程式Euler1所宣告的
04/24 12:52, 18F

04/24 12:53, , 19F
區域變數,主程式main雖然也宣告Euler,但你沒傳進副程式
04/24 12:53, 19F

04/24 12:54, , 20F
接收,也沒初始化,所以看起來有問題
04/24 12:54, 20F

04/24 12:56, , 21F
對就是Euler
04/24 12:56, 21F

04/24 12:57, , 22F
Euler只有在副程式Euler1 這段是什麼意思
04/24 12:57, 22F

04/24 12:58, , 23F
之前我副程式用這樣寫兩個矩陣的相乘傳出第三個矩陣
04/24 12:58, 23F

04/24 12:59, , 24F
直接用這種方式就可以傳回了
04/24 12:59, 24F
矩陣相乘: http://www.badongo.com/cn/file/22216647 ※ 編輯: tp6b123 來自: 220.136.169.251 (04/24 13:02)

04/24 13:03, , 25F
感謝大家回答讓我又學習到東西 ︿︿
04/24 13:03, 25F

04/24 13:23, , 26F
你之所以可以從副程式Mu中回傳C,就是因為你有傳C進去
04/24 13:23, 26F

04/24 13:23, , 27F
但你現在這支程式你沒傳Euler進去Euler1,她沒辦法回傳
04/24 13:23, 27F

04/24 13:24, , 28F
你沒把Euler宣告成全域變數,她只是各副程式中的區域變
04/24 13:24, 28F

04/24 13:25, , 29F
數,自然不會有你要的效果
04/24 13:25, 29F

04/24 13:37, , 30F
知道了!!要改成Euler1(Euler,N,x,dx)
04/24 13:37, 30F

04/24 13:37, , 31F
感謝
04/24 13:37, 31F
文章代碼(AID): #1BqLUNNI (Fortran)
文章代碼(AID): #1BqLUNNI (Fortran)