作者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