[問題] array 當argument 的問題

看板Fortran作者 (行的正坐的直,不換ID)時間14年前 (2010/03/11 17:31), 編輯推噓2(209)
留言11則, 4人參與, 最新討論串1/1
舉個簡單的例子,二個向量交換 program main implicit none real :: a(2), b(2) a(1) = 1.0E0 a(2) = 2.0E0 b(1) = 3.0E0 b(2) = 4.0E0 call swap(a, b) write(*, *) "a(1)=", a(1), "a(2)=", a(2) write(*, *) "b(1)=", b(1), "b(2)=", b(2) end program main SUBROUTINE swap(a, b) REAL, DIMENSION(:) :: a, b REAL, DIMENSION(SIZE(a)) :: work work = a a = b b = work END SUBROUTINE swap 可以編譯成功,但執行時卻會發生segmentation fault, 把swap 裡的 work = a a = b b = work 註解掉,然後加了 write(*,*) size(a) 看size(a) 的值, 可以正常執行,但size(a) 的結果卻是0 我用的compiler 是ifort 11.1 請問有誰知道這是怎麼回事嗎?謝謝 :-) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.109.176.53

03/11 18:28, , 1F
我發現問題似乎是a, b 這二個array 的傳遞失敗,如果在swap 裡
03/11 18:28, 1F

03/11 18:30, , 2F
明確指定大小,i.e., REAL, DIMENSION(2) :: a, b
03/11 18:30, 2F

03/11 18:31, , 3F
但這樣就失去希望work 為一個automatic array 的用意了
03/11 18:31, 3F

03/11 19:17, , 4F
不過主程式宣告a b 2陣列的大小 不也限制了work的大小了?
03/11 19:17, 4F

03/11 19:19, , 5F
沒有吧,work 會隨著輸入的a 的大小更改
03/11 19:19, 5F

03/11 22:49, , 6F
不過這樣要再改一次主程式不是嗎?a b大小都宣告了
03/11 22:49, 6F

03/11 23:01, , 7F
是呀,重點在這樣寫subroutine 就不用再傳二個向量的長度這個
03/11 23:01, 7F

03/11 23:02, , 8F
引數了。我是看mkl 的blas95 interfaces 這麼寫,想如法炮製
03/11 23:02, 8F

03/11 23:54, , 9F
你把副程式包成模組的方式使用就沒問題了:)
03/11 23:54, 9F

03/12 09:43, , 10F
應該是沒寫interface吧...不過包成module就不用寫了
03/12 09:43, 10F

03/12 17:02, , 11F
可以了,謝謝大家,看來我對interface 不熟,來好好研究一下XD
03/12 17:02, 11F
文章代碼(AID): #1BcBXq8W (Fortran)
文章代碼(AID): #1BcBXq8W (Fortran)