В этом коде так много неправильного, что почти слишком сложно дать конструктивный ответ.
Если я понимаю, что вы пытаетесь сделать, подпрограмма myalloc
должна действовать как своего рода конструктор копирования - выделять память на предоставленный указатель, а затем копировать содержимое инициализирующего аргумента в выделенную память. Итак, ключевая ошибка в вашем myalloc - это две строки:
allocate(i(2))
i => a
Здесь вы сначала выделяете память для указателя i
, затем присваиваете i
, чтобы указать a
. Зачем вообще выделять меня в этом случае? Я полагаю, это ближе к тому, что вы пытаетесь сделать:
subroutine myalloc(a,b,n)
implicit none
real, dimension(n) :: a
real, pointer,dimension(:) :: b
integer :: n
allocate(b(n))
b = a ! This copies the contents of the array a to the allocation for b
return
end
Тогда в вашей основной программе есть ряд необъяснимых вещей. Почему i
и j
объявлены как целые числа? Конечно, они должны быть указателями на реальные массивы, если вы хотите передать их вашему myalloc
, выполнить операцию выделения / копирования, а затем напечатать их? Если дело обстоит так, то замена вашего основного на что-то вроде этого должно быть ближе к тому, что вы пытаетесь сделать:
program main
implicit none
interface
subroutine myalloc(a,b,n)
real,dimension(n) :: a
real,pointer,dimension(:) :: b
integer :: n
end subroutine myalloc
subroutine myprint(i)
real,pointer,dimension(:) :: i
end subroutine myprint
end interface
real,pointer,dimension(:) :: i, j
real :: a(2)
a=(/1.1,2.2/)
call myalloc(a,i,2)
a=(/3.1,4.2/)
call myalloc(a,j,2)
call myprint(i)
call myprint(j)
stop
end
С этими изменениями вы должны получить это при запуске:
$ ./pointer
1.100000 2.200000
3.100000 4.200000
Это ближе к тому, что вы ожидали получить?