Fortran динамические объекты

Я пытаюсь создать подпрограмму, которая возвращает данные в виде указателя:

Я хочу что-то подобное:

subroutine f(p)
     type(tra), pointer p
     type(tra), target :: instance

     p=>instance
     do_work(instance)
end subroutine

Строго говоря, я хочу реализовать аналог C++ "нового" оператора.

Я хочу затем использовать такую ​​подпрограмму следующим образом:

subroutine other
    type(tra), pointer :: p1,p2
    call f(p1)
    call f(p2)
end subroutine

Приведенный выше код может не работать, так как я предполагаю, что "экземпляр" внутри f уничтожается после выхода из f, и следующий вызов f снова создает "экземпляр" в том же месте в памяти.

В частности, я нахожу с p1 а также p2 указывая на те же объекты, но я думаю, это зависит от компилятора. Это правда?

Я думаю, что возможное решение:

subroutine f(p)
     type(tra), pointer p
     type(tra), allocatable, target :: instance(:)

     p=>instance(1)
     do_work(instance(1))
end subroutine

Это "официальный" способ ведения дел?

1 ответ

Решение

Строго говоря, я хочу реализовать аналог C++ "нового" оператора.

это ALLOCATE, То, что вы пытаетесь сделать, должно быть просто так:

subroutine f(p)
     type(tra), pointer :: p

     ! you can actually leak memory this way! caution required.
     if(associated(p)) then
         stop "possible memory leak - p was associated"
     end
     allocate(p)
     do_work(p)
end subroutine

Приведенный выше код может не работать, так как я предполагаю, что "экземпляр" внутри f уничтожается после выхода из f, и следующий вызов f снова создает "экземпляр" в том же месте в памяти.

Нет, это не так Локальные переменные подпрограммы обычно "распределяются" один раз (и даже инициализируются только один раз), см., Например, спецификацию Fortran 90, глава 14, особенно раздел 14.7.

Другие вопросы по тегам