Производный Coarray тип выделяемого вектора выделяемых символьных компонентов - PullRequest
0 голосов
/ 12 июня 2018

Рассмотрим следующий код, который пытается создать производный тип coarray, содержащий массив типов символов, выделяемых переменной длины.

program testCoarrayJaggedArray

implicit none

integer :: i
type                                :: CharVec_type
    character(:), allocatable       :: record
end type

type                                :: List_type
    type(CharVec_type), allocatable :: Item(:)
end type

type(List_type)                     :: List[*]

if (this_image()==1) then
    allocate( List%Item(num_images()) )
    do i = 1, num_images()
        allocate( character(63) :: List%Item(i)%record )
        write(List%Item(i)%record,*) i
        List%Item(i)%record = "King" // trim(adjustl(List%Item(i)%record))
    end do
    sync images(*)
else
    sync images(1)
    allocate( List%Item( size(List[1]%Item(:)) ) )
    do i = 1, size(List%Item(:))
        allocate( character( len(List[1]%Item(i)%record) ) :: List%Item(i)%record )
        List%Item(i)%record = List[1]%Item(i)%record
        write(*,*) this_image(), List%Item(i)%record
    end do
end if

end program testCoarrayJaggedArray

Intel ifort 2018 в режиме отладки, coarray совместно используемой памяти, жалуется на несколькоаспекты этого кода.Вот первый:

ifort /debug /Qcoarray=shared /standard-semantics /traceback /gen-interfaces /check /fpe:0 main.f90 -o run.exe
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 18.0.2.185 Build 20180210
Copyright (C) 1985-2018 Intel Corporation.  All rights reserved.

main.f90(30): error #6457: This derived type name has not been declared.   [CHARACTER]
        allocate( character( len(List[1]%Item(i)%record) ) :: List%Item(i)%record )
------------------^
main.f90(30): error #8235: If type specification appears, the type and kind type parameters of each object being allocated must be the same as type and kind type parameters of the type specification.   [RECORD]
        allocate( character( len(List[1]%Item(i)%record) ) :: List%Item(i)%record )
---------------------------------------------------------------------------^
compilation aborted for main.f90 (code 1)

Является ли этот код нестандартным Fortran?В частности, строка, которая выделяет тип символа, используя длину соответствующего символа на первом изображении:

allocate( character( len(List[1]%Item(i)%record) ) :: List%Item(i)%record )

1 Ответ

0 голосов
/ 13 июня 2018

Независимо от соответствия программы, первое сообщение об ошибке - бред: character не является допустимым именем для производного типа.По крайней мере, об этом следует сообщить в службу поддержки Intel как о проблеме качества реализации.

Теперь, соответствует ли код?Вместо того, чтобы ответить на этот вопрос, я посмотрю на следующую программу:

integer :: i[*]
character(:), allocatable :: x

i=1
allocate(character(i[this_image()]) :: x)

end

Когда я скомпилирую с помощью ifort 18.0.2

test.f90(5): error #6457: This derived type name has not been declared.   [CHARACTER]
allocate(character(i[this_image()]) :: x)
---------^
test.f90(5): error #8235: If type specification appears, the type and kind type parameters of each object being allocated must be the same as type and kind type parameters of the type specification.   [X]
allocate(character(i[this_image()]) :: x)
---------------------------------------^
compilation aborted for test.f90 (code 1)

Давайте посмотрим, что должно произойти с этой программой.

1011 * Мы можем, вероятно, все согласны с тем, что единственной спорной линией является утверждением распределения, а лишь часть того, что сложно это (опять же) длинами типа параметра для спецификации типа.Итак, является ли i[this_image()] допустимым параметром типа здесь?

Это скалярное целочисленное выражение, и оно определено.Нам просто нужно определить, применяется ли какое-либо другое ограничение, которое нарушается.В Fortran 2008 его нет.

Компилятор не должен отклонять эту программу.

В качестве обходного пути для программы вопроса: создайте временную копию выражения non-coarray для использования в выражении длины.в отчете о распределении.

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