Мне нужен массив переменного размера в Фортране. В 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».
Спасибо за ответы и комментарии.