module shared
!derived type target here
integer, parameter :: nblock = 2
integer, parameter :: xdim = 2
TYPE block_info
INTEGER :: il=10,jl=20,kl=30
REAL, ALLOCATABLE :: x(:)
END TYPE block_info
TYPE(block_info), TARGET :: block(nblock)
end module shared
module point_to
!point to subroutine here
use shared
REAL, POINTER :: x(:)
integer :: il,jl,kl
contains
subroutine set_current(n)
nullify(x)
il = block(n)%il
jl = block(n)%jl
kl = block(n)%kl
x => block(n)%x(0:xdim)
end subroutine set_current
end module point_to
program main
use shared
use point_to
!Iam allocating derived type target and initialize
do i = 1, nblock
allocate(block(i)%x(0:xdim))
do j = 0, xdim
block(i)%x(j) = dble(i)*dble(j)
enddo
enddo
!Iam pointing using set_current subroutine and print
do i = 1, nblock
call set_current(i)
do j = 0, xdim
write(*,*) "i= ",i, "j= ",j, block(i)%x(j), x(j)
enddo
enddo
end program main
Для вышеуказанного кода я получаю следующий выход;Указатель на 0-й индекс проблемный
i= 1 j= 0 0.00000000 0.00000000
i= 1 j= 1 1.00000000 0.00000000
i= 1 j= 2 2.00000000 1.00000000
i= 2 j= 0 0.00000000 0.00000000
i= 2 j= 1 2.00000000 0.00000000
i= 2 j= 2 4.00000000 2.00000000
Я применил вектор x, начиная с 1 до xdim, и у меня не было ошибок. Когда первый индекс выбирается как 0, проблемы начинаются. В приведенном выше выводе последние два значения должны быть равны. Так где же проблема?
Вы использовали тег [tag: fortran90]. Всегда используйте тег [tag: fortran] для вопросов Fortran. Вы можете добавить еще один тег, чтобы отличить версию. * Однако *, ваш код не является Fortran 90. Выделенные компоненты для производных типов даже не разрешены в оригинальном Fortran 95, это функция Fortran 2003. Таким образом, ваш код - Fortran 2003. –