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