看板 Fortran 關於我們 聯絡資訊
舉個簡單的例子,二個向量交換 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
yhd:我發現問題似乎是a, b 這二個array 的傳遞失敗,如果在swap 裡 03/11 18:28
yhd:明確指定大小,i.e., REAL, DIMENSION(2) :: a, b 03/11 18:30
yhd:但這樣就失去希望work 為一個automatic array 的用意了 03/11 18:31
awer89:不過主程式宣告a b 2陣列的大小 不也限制了work的大小了? 03/11 19:17
yhd:沒有吧,work 會隨著輸入的a 的大小更改 03/11 19:19
awer89:不過這樣要再改一次主程式不是嗎?a b大小都宣告了 03/11 22:49
yhd:是呀,重點在這樣寫subroutine 就不用再傳二個向量的長度這個 03/11 23:01
yhd:引數了。我是看mkl 的blas95 interfaces 這麼寫,想如法炮製 03/11 23:02
charlesdc:你把副程式包成模組的方式使用就沒問題了:) 03/11 23:54
motoman:應該是沒寫interface吧...不過包成module就不用寫了 03/12 09:43
yhd:可以了,謝謝大家,看來我對interface 不熟,來好好研究一下XD 03/12 17:02