Если у вас есть такая конфигурация:
<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
Это работает для меня
Ответ Владимира F верен, но мы можем подчеркнуть более важную точку.
Правило цитированного синтаксиса для переменной do -
R819 do-variable - scalar-int-variable-name
blockquote>, и очень важно точно отметить, что это означает .
Разумеется, необходимо, чтобы переменная do была скалярной целочисленной переменной. В случае вопроса элемент массива
i(1)
(иi(2)
) является скалярной целочисленной переменной: элементы массива - это переменные ранга 0.Однако имя является дополнительным ограничением.
i(1)
само не является именем. Мы видим правило синтаксисаR303 name - письмо [ буквенно-цифровой символ ] ...
blockquote>Это ограничение вне скалярной целочисленной переменной выходит за пределы элементов массива. Кроме того, следующими могут быть переменные, которые не имеют соответствующих имен:
- компоненты производных типов;
- функции с результатами указателя (переменная с 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 ассоциация является ассоциированным именем => селектором
blockquote>Обратите внимание, что ассоциированный объект, являющийся просто переменной, недостаточен.
Точно так же указатели разрешены, если есть имя:
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 отмечает использование указателей и ассоциированных объектов как переменные как «сомнительные». Действительно, нужно избегать изменения переменной цикла.
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 не подтвердил это в комментарии ниже , Я не был уверен, соответствует ли это стандарту. Спасибо)
Извините за мой первый неправильный ответ.
Ограничение следует из правил языка:
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.
blockquote>Поэтому да, в позиции контрольной переменной цикла разрешено только имя переменной сканера.
Если вы спросите, почему правила языка похожи на это, вы должны спросить авторов стандарта, SC22 / WG5 и X3J3, но я бы предположил, что это связано с необходимостью синтаксической однозначности в форме с фиксированным источником. В формах с фиксированным источником пространства не значительны, и трудно придумать однозначную грамматику.