Неопределенное поведение для массива сплайсинга с намерением (out) в Фортране 90? - PullRequest
0 голосов
/ 03 декабря 2010

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

предположим, что у меня есть (не претендует на компиляцию)

subroutine X
  real, allocatable :: block(:,:)
  allocate(block(20,20))

  call Sub(block(1:5, 1:5))
! here is undefined behavior
end subroutine

subroutine Sub(b)
   real, intent(out) :: b(:,:)
   b = 0.0
end subroutine

Мой вопрос:Я делаю что-то странное?У меня такое ощущение, что намерение (выход) не определяет весь блок, даже если я пропустил срез, и мне нужен вход.Можете ли вы подтвердить из стандарта?

Редактировать: inout дает то же неопределенное поведение, но передавая невырезанный массив в Sub works.Означает ли это, что нарушением стандарта является передача секционированных массивов для инициализации субблоков?

Спасибо

1 Ответ

2 голосов
/ 04 декабря 2010

Прежде всего, если вы передадите фрагмент, я подозреваю, что вам нужно использовать намерение (inout), потому что вы не собираетесь назначать весь массив, хотя я не совсем уверен в этом, намерение (out) может быть правильным в этом случае.

Но разве источник вашей проблемы в том, что вы делаете ошибку, используя массив предполагаемой формы в подпрограмме, не имея явного интерфейса или не помещая его в модуль? Или вы пропустили эту часть кода?

Я добавил явный интерфейс к вашему коду, назначил 1 блоку, скомпилировал, и затем я смог определить любой вид среза, он был правильно установлен на 0. Так что, если вы все делаете правильно, возможно, вам следует уточнить, что какое неопределенное поведение вы видите в точности?

...