Может ли объявление указателей на производные типы быть неопределенными? - PullRequest
2 голосов
/ 03 июля 2019

У меня есть небольшой код, объявляющий указатель на массив производного типа, который имеет поле, которое является выделяемым массивом другого производного типа, имеющего действительную переменную в качестве поля. Используя gnu fortran (8.2), я получаю разные результаты для каждого местоположения в массиве или в виде вектора.

Использование компилятора intel fortran (2019.4) успешно завершено.

program test
implicit none
integer, parameter :: length = 2
real(8), dimension(length) :: a, b
integer :: i

type point
   real(8) :: x
end type point

type stored
   type(point), dimension(:), allocatable :: np
end type stored

type(stored), dimension(:), pointer :: std=>null()


allocate(std(1))
allocate(std(1)%np(length))
std(1)%np(1)%x = 0.3d0
std(1)%np(2)%x = 0.3555d0

do i = 1, length
   write(*, "('std(1)%np(',i1,')%x = ',1e22.14)") i, std(1)%np(i)%x
end do
do i = 1, length
   write(*, "('std(1)%np(1:',i1,') = ',2e22.14)") i, std(1)%np(1:i)%x
end do
a = std(1)%np(1:2)%x
b = [std(1)%np(1)%x, std(1)%np(2)%x]
if (norm2(a - b) .gt. 1d-3) then
   write(*,*) 'failure'
else
   write(*, *) 'success'
end if
end program test

код успешно завершается, но при использовании gfortran один получает «сбой» на экране и несовместимые отпечатки выше, а при использовании компилятора Intel один получает «успех» на экране и согласованные отпечатки выше.

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Мне не понятно, какой у вас вопрос, если только это не заголовок.Если это так, нет, указатели на производные типы в порядке.Ваша программа правильно выделяет std в виде массива экстента-1, а затем выделяет std (1)% np (2).Затем он присваивает подкомпонентам x обоих элементов np.Выглядит хорошо для меня.

Есть несколько вещей, которые потенциально могут вызвать «сбой» - вы должны запустить код gfortran в отладчике, чтобы увидеть, что идет не так.

0 голосов
/ 07 июля 2019

Проблема, представленная в коде выше, была решена в следующей [ссылка] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91077

...