| program main_p |
| |
| implicit none |
| |
| integer, parameter :: n = 10 |
| integer, parameter :: m = 5 |
| |
| integer, parameter :: b = 3 |
| integer, parameter :: t = n+b-1 |
| |
| integer, parameter :: l = 4 |
| integer, parameter :: u = 7 |
| integer, parameter :: s = 3 |
| integer, parameter :: e = (u-l)/s+1 |
| |
| call test_f() |
| call test_s() |
| call test_p() |
| call test_a() |
| stop |
| |
| contains |
| |
| subroutine test_f() |
| integer, target :: x(n,n) |
| integer, target :: y(b:t) |
| integer :: i |
| |
| x = reshape([(i, i=1,n*n)], [n,n]) |
| y = x(:,m) |
| call sub_s(x(:,m), y, 1, n, n) |
| call sub_s(y, x(:,m), b, t, n) |
| return |
| end subroutine test_f |
| |
| subroutine test_s() |
| integer, target :: x(n,n) |
| integer, target :: v(e) |
| integer :: i |
| |
| x = reshape([(i, i=1,n*n)], [n,n]) |
| v = x(l:u:s,m) |
| call sub_s(v, v, 1, e, e) |
| call sub_s(x(l:u:s,m), v, 1, e, e) |
| call sub_s(v, x(l:u:s,m), 1, e, e) |
| return |
| end subroutine test_s |
| |
| subroutine test_p() |
| integer, target :: x(n,n) |
| integer, pointer :: p(:) |
| integer :: v(e) |
| integer :: i |
| |
| x = reshape([(i, i=1,n*n)], [n,n]) |
| v = x(l:u:s,m) |
| p => x(:,m) |
| call sub_s(p(l:u:s), v, 1, e, e) |
| p => x(l:u:s,m) |
| call sub_s(p, v, 1, e, e) |
| p(l:) => x(l:u:s,m) |
| call sub_s(p, v, l, e+l-1, e) |
| p(l:l+e-1) => x(l:u:s,m) |
| call sub_s(p, v, l, e+l-1, e) |
| allocate(p(n)) |
| p(:) = x(:,m) |
| call sub_s(p(l:u:s), v, 1, e, e) |
| deallocate(p) |
| allocate(p(e)) |
| p(:) = x(l:u:s,m) |
| call sub_s(p, v, 1, e, e) |
| deallocate(p) |
| allocate(p(l:l+e-1)) |
| p(:) = x(l:u:s,m) |
| call sub_s(p, v, l, e+l-1, e) |
| deallocate(p) |
| allocate(p(l:l+e-1)) |
| p(l:) = x(l:u:s,m) |
| call sub_s(p, v, l, e+l-1, e) |
| deallocate(p) |
| allocate(p(l:l+e-1)) |
| p(l:l+e-1) = x(l:u:s,m) |
| call sub_s(p, v, l, e+l-1, e) |
| deallocate(p) |
| return |
| end subroutine test_p |
| |
| subroutine test_a() |
| integer :: x(n,n) |
| integer, allocatable, target :: a(:) |
| integer :: v(e) |
| integer :: i |
| |
| x = reshape([(i, i=1,n*n)], [n,n]) |
| v = x(l:u:s,m) |
| a = x(:,m) |
| call sub_s(a(l:u:s), v, 1, e, e) |
| deallocate(a) |
| allocate(a(n)) |
| a(:) = x(:,m) |
| call sub_s(a(l:u:s), v, 1, e, e) |
| deallocate(a) |
| a = x(l:u:s,m) |
| call sub_s(a, v, 1, e, e) |
| deallocate(a) |
| allocate(a(e)) |
| a(:) = x(l:u:s,m) |
| call sub_s(a, v, 1, e, e) |
| deallocate(a) |
| allocate(a(l:l+e-1)) |
| a(:) = x(l:u:s,m) |
| call sub_s(a, v, l, e+l-1, e) |
| deallocate(a) |
| allocate(a(l:l+e-1)) |
| a(l:) = x(l:u:s,m) |
| call sub_s(a, v, l, e+l-1, e) |
| deallocate(a) |
| allocate(a(l:l+e-1)) |
| a(l:l+e-1) = x(l:u:s,m) |
| call sub_s(a, v, l, e+l-1, e) |
| deallocate(a) |
| return |
| end subroutine test_a |
| |
| subroutine sub_s(a, b, l, u, e) |
| integer, pointer, intent(in) :: a(:) |
| integer, intent(in) :: b(:) |
| integer, intent(in) :: l |
| integer, intent(in) :: u |
| integer, intent(in) :: e |
| |
| integer :: i |
| |
| if(lbound(a,dim=1)/=l) stop 1001 |
| if(ubound(a,dim=1)/=u) stop 1002 |
| if(any(shape(a)/=[e])) stop 1003 |
| if(size(a, dim=1)/=e) stop 1004 |
| if(size(a)/=size(b)) stop 1005 |
| do i = l, u |
| if(a(i)/=b(i-l+1)) stop 1006 |
| end do |
| end subroutine sub_s |
| |
| end program main_p |