Динамическое размещение строковых массивов в Фортране не меняет размер - PullRequest
0 голосов
/ 09 мая 2018

Рассмотрим следующую программу на Фортране:

program test
character(len=:), allocatable :: str
allocate(character(3) :: str)
print *, len(str)
str = '12345'
print *, len(str)
end program

Когда я запускаю это, я получаю ожидаемый результат:

   3
   5

То есть строка символов была изменена с 3 до 5, когда для str было установлено значение «12345». Если вместо этого я использую массив динамических строк, это не так. Пример:

program test
character(len=:), allocatable :: str(:)
allocate(character(3) :: str(2))
print *, len(str(1)), len(str(2))
str(1) = '12345'
print *, len(str(1)), len(str(2))
end program

Когда я запускаю это, я получаю:

   3           3
   3           3

Таким образом, набор str (1) не изменил длину строки. Я получаю такое же поведение с ifort 16.0.2 и gfortran 5.3.1. Мой вопрос соответствует ли это поведение последнему стандарту Fortran или это ошибка в компиляторах?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Расширяя ответ @Vladimir F, вы можете достичь того, что имеете в виду, с помощью нескольких изменений в коде, например, следующего (который создает зубчатый массив векторов символов):

program test

type :: CherVec_type
    character(len=:), allocatable :: str
end type CherVec_type

type(CherVec_type) :: JaggedArray(2)

allocate(character(3) :: JaggedArray(1)%str)
allocate(character(3) :: JaggedArray(2)%str)
print *, len(JaggedArray(1)%str), len(JaggedArray(2)%str)

JaggedArray(1)%str = "12345"
print *, len(JaggedArray(1)%str), len(JaggedArray(2)%str)

end program

, который создает следующий вывод:

$gfortran -std=f2008 *.f95 -o main
$main
       3           3
       5           3
0 голосов
/ 09 мая 2018

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

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