У вас тут три проблемы, и не только с циклами "l
" и "n
".
Первая проблема заключается в том, что значения в операторе data
не могут быть произвольными выражениями. В частности, они должны быть константами; 0.5*(l-1)
не является константой.
Вторая проблема заключается в том, что границы в списках объектов также должны быть постоянными (выражениями); l
не является постоянным выражением.
Во-первых, также стоит отметить, что *
в списке значений данных имеет особое значение и не является оператором умножения. *
дает количество повторов, а количество повторений 0.5
недействительно.
Второй пункт можно исправить довольно просто, используя такие конструкции, как
data H(1,1:31) /31*0./ ! Note the repeat count specifier
вне цикла или с использованием подразумеваемого цикла
data (H(1,k),k=1,31) /31*0./
Делать что-то для цикла "l
" более утомительно
data H(1:21,1) /0., 0.5, 1., 1.5, ... /
и мы должны быть очень осторожны с количеством указанных значений. Это не может быть динамическим.
Третья проблема заключается в том, что вы не можете указать явную инициализацию для элемента более одного раза. Посмотрите на свои первые два цикла: если бы это сработало, вы бы инициализировали H(1,1)
дважды. Несмотря на то, что задано то же значение, оно все равно недействительно.
Ну, на самом деле у вас есть четыре проблемы. Четвертый связан с пунктом о динамическом количестве значений. Вы, вероятно, не хотите выполнять явную инициализацию. Хотя можно делать то, что вы хотите, просто используйте присваивание там, где эти ограничения не применяются.
do l=1,21
H(l,1) = 0.5*(l-1)
End do
Да, бывают случаи, когда желательна сложная явная инициализация, но в этом случае, в том, что я предполагаю, является новым кодом, сохранение простоты — это хорошо. Часть «инициализации» вашего кода, которая выполняет задания, гораздо более «современна».
person
francescalus
schedule
14.12.2015
data
, а не присваивание? - person francescalus   schedule 14.12.2015