Использование члена производного типа как переменной итерации цикла do [duplicate]

Если у вас есть такая конфигурация:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/var/www/example.com"

    <FilesMatch "\.php$">
        SetHandler "proxy:fcgi://127.0.0.1:9000"
    </FilesMatch>
</VirtualHost>

Раскомментируйте следующие строки в вашем httpd.conf

LoadModule proxy_module lib/httpd/modules/mod_proxy.so
LoadModule proxy_fcgi_module lib/httpd/modules/mod_proxy_fcgi.so

Это работает для меня

5
задан user3136376 28 October 2014 в 09:02
поделиться

3 ответа

Ответ Владимира F верен, но мы можем подчеркнуть более важную точку.

Правило цитированного синтаксиса для переменной do -

R819 do-variable - scalar-int-variable-name

, и очень важно точно отметить, что это означает .

Разумеется, необходимо, чтобы переменная do была скалярной целочисленной переменной. В случае вопроса элемент массива i(1)i(2)) является скалярной целочисленной переменной: элементы массива - это переменные ранга 0.

Однако имя является дополнительным ограничением. i(1) само не является именем. Мы видим правило синтаксиса

R303 name - письмо [ буквенно-цифровой символ ] ...

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

  • компоненты производных типов;
  • функции с результатами указателя (переменная с Fortran 2008, а не

Это означает, что следующее недопустимо:

type t
  integer i
end type t
type(t) x

do x%i=1,1   ! x%i is not a name
end do

end

Также нет

integer, target :: i
do f()=1,1
end do

contains
  function f()
    integer, pointer :: f
    f=>i
  end function
end

как отмечено в ответе chw21 , существует успех с использованием ассоциированной конструкции:

type t
  integer i
end type
type(t) x
integer n(1)

associate (i=>x%i, j=>n(1))
  do i=1,1
    do j=1,1
    end do
  end do
end associate
end

Хотя x%i и n(1) не являются именами, конструкция associate создает имена:

R803 associate-stmt is [ associate-construct-name :] ASSOCIATE ( association-list ])

R804 ассоциация является ассоциированным именем => селектором

Обратите внимание, что ассоциированный объект, являющийся просто переменной, недостаточен.

Точно так же указатели разрешены, если есть имя:

type t
  integer i
end type
type(t), target :: x
integer, target :: n(1)

integer, pointer :: i, j

i => x%i
j => n(1)

do i=1,1
  do j=1,1
  end do
end do
end

Опять же, i и j здесь имена.

Для интереса компилятор NAG отмечает использование указателей и ассоциированных объектов как переменные как «сомнительные». Действительно, нужно избегать изменения переменной цикла.

5
ответ дан francescalus 20 August 2018 в 22:05
поделиться

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

program test
    integer, dimension(2) :: i

    associate (x => i(1), y => i(2))
        do x = 1, 3
        do y = 1, 3
            ! anything here
            write(*, *) i
        end do
        end do
    end associate
end program

Это обновляет i внутри двойного цикла.

(Примечание: пока @VladimirF не подтвердил это в комментарии ниже , Я не был уверен, соответствует ли это стандарту. Спасибо)

4
ответ дан chw21 20 August 2018 в 22:05
поделиться
  • 1
    Это то, о чем мне интересно вчера, сразу после возвращения сюда. Не уверен, допустимо ли имя-ассоциированное здесь, но, возможно, это так, и я просто не могу его найти. – Vladimir F 19 April 2018 в 11:39
  • 2
    Да F2018: 11.1.3.3.5 Собственный объект сам по себе является переменной ... Это более ясный и понятный по сравнению с F2008. – Vladimir F 19 April 2018 в 11:43
  • 3
    Да, конечно, но я сомневался в том, что это переменная. Из текста F2008 не было ясно. – Vladimir F 19 April 2018 в 14:31

Извините за мой первый неправильный ответ.

Ограничение следует из правил языка:

Fortran 2008 (ISO / IEC 1539-1: 2010) 8.1.6.2:

R818 loop-control is, do-variable = ...

R819 do- переменная is, scalar-int-variable-name

C812 (R819) Доменная переменная должна быть переменной типа integer.

Поэтому да, в позиции контрольной переменной цикла разрешено только имя переменной сканера.

Если вы спросите, почему правила языка похожи на это, вы должны спросить авторов стандарта, SC22 / WG5 и X3J3, но я бы предположил, что это связано с необходимостью синтаксической однозначности в форме с фиксированным источником. В формах с фиксированным источником пространства не значительны, и трудно придумать однозначную грамматику.

5
ответ дан Vladimir F 20 August 2018 в 22:05
поделиться
  • 1
    Поскольку это в основном синтаксическая проблема, как вы думаете, будет ли лучшая работа для этой проблемы? (например, делать с ручным приращением, назначать массив для каждого шага, указатель, если он когда-либо работает) – user3136376 28 October 2014 в 09:47
  • 2
    Все трое будут работать. Какой из них выбрать - это вопрос стиля, и он будет зависеть от конкретного фрагмента кода. – Vladimir F 28 October 2014 в 09:49
Другие вопросы по тегам:

Похожие вопросы: