Почему мой массив больше не выделяется внутри подпрограммы? - PullRequest
2 голосов
/ 25 октября 2011

У меня есть тип Fortran, в котором есть запись, которая снова является типом. Этот тип имеет размещаемый целочисленный массив:

type inner
    integer, allocatable :: dyn_arr(:)
    integer another_var
end type
type outer
    type(inner) entry
    type(inner) another_entry
end type

Я выделяю массив и затем вызываю подпрограмму. Внутри подпрограммы я хочу получить доступ к массиву.

type(outer) main_struct

allocate(main_struct%entry%dyn_arr(100))
call routi(main_struct)

Мой код segfaults. Когда я запускаю с отладчиком, перед вызовом все кажется нормально, когда я вхожу в подпрограмму routi, отладчик говорит, что dyn_arr не выделено. Как это может быть?

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Я создал короткую программу, чтобы проверить это, и у меня не было никаких проблем. Не могли бы вы опубликовать короткую программу, которая показывает этот сбой?

Вот мой код, который работал нормально при компиляции с использованием gfortran 4.5:

  MODULE temp_module
    TYPE inner
       INTEGER, ALLOCATABLE :: dyn_arr(:)
       INTEGER another_var
    END TYPE inner
    TYPE outer
       TYPE(inner) entry
       TYPE(inner) another_entry
    END TYPE outer
  CONTAINS

    SUBROUTINE test (input)
      TYPE(outer), INTENT(in) :: input
      WRITE(*,*) input%entry%dyn_arr
    END SUBROUTINE test

  END MODULE temp_module

  PROGRAM XC_VMEC_SIGHTLINE
    USE temp_module
    TYPE(outer) main_struct

    ALLOCATE(main_struct%entry%dyn_arr(10))
    CALL test(main_struct)
  END PROGRAM XC_VMEC_SIGHTLINE
0 голосов
/ 25 октября 2011

Я полагаю, что в routi () у вас есть намерение (нет), не так ли?

С здесь

Выделенный конечный выделяемый компонент фактического аргумента, который связан с фиктивным аргументом INTENT (OUT) запись процедуры, так что соответствующий компонент манекена Аргумент имеет статус выделения, который в данный момент не выделен.

Это гарантирует, что любые указатели, которые указывают на предыдущее содержимое выделяемый компонент переменной становится неопределенным.

Никогда не используйте намерение (выход). Это зло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...