Фортран увеличивает размер динамического массива в функции

Мне нужен массив переменного размера в Фортране. В C ++ я бы использовал вектор. Итак, у меня есть функция вроде

integer function append(n, array, value)
  integer, pointer, dimension(:) :: array
  integer, pointer, dimension(:) :: tmp_arr
  integer n

  if (size(array) .eq. n) then
     allocate(tmp_arr(2*size(array)))
     tmp_arr(1:size(array)) = array
     deallocate(array)
     array => tmp_arr
  end if
  n = n + 1
  array(n) = value
  append = n
end function

, которая отлично работает, если я использую ее так

integer pos, val
pos = append(n, array, val)

Однако, если я хочу использовать ее так

integer i,j,n ! i,j<n
array(i) = append(n, array, array(j))

с gfortran, это не сработает. Он компилируется, но не работает. Проблема, похоже, в том, что gfortran делает адреса из array (i) и array (j), отправляет последний в функцию append, а затем, когда осуществляется доступ к адресу array (j) и записывается один из array (i) , адресное пространство освобождено.

Я бы хотел, чтобы значение массива (j) помещалось в стек (а не адрес), а затем использовалось в функции, и после завершения функции просматривался последний адрес массива (i) и результат сохраненной в нем функции.

Я почти уверен, что gcc сделает это так, как я хочу, почему gfortran такой злой?

Есть ли в Фортране способ сделать устойчивый (это означает, что array (j) = ... пример работает) { {1}} функция или тип данных, чтобы иметь поведение, подобное вектору c ++ stl?

Заключение:

В конце концов я ввел временные переменные

integer tmp_val
tmp_val = value
...
array(n) = tmp_val

, так что, по крайней мере, метод может называться

pos = append(n, array, array(j))
array(i) = pos

и надеюсь, что другие / будущие разработчики проекта не будут пытаться «оптимизировать» две строки, чтобы исключить необходимость в «pos».

Спасибо за ответы и комментарии.

7
задан Matthias 009 26 September 2011 в 20:04
поделиться