Как решить синтаксическую ошибку в выписке данных?

Привет, я новичок здесь и хочу решить эту проблему:

do k=1,31
    Data H(1,k)/0/
End do

do l=1,21
   Data H(l,1)/0.5*(l-1)/
End do

do m=31,41
   Data H(17,m)/0/
End do

do n=17,21
   Data H(n,41)/0.5*(n-17)/
End do

Я получаю сообщение об ошибке для l и n, говорящее, что это синтаксическая ошибка в выражении DATA. Кто-нибудь знает, как решить эту проблему?


person Jason    schedule 14.12.2015    source источник
comment
Какое сообщение об ошибке вы получаете? И что вы пытаетесь сделать? То есть, почему вы хотите использовать здесь операторы data, а не присваивание?   -  person francescalus    schedule 14.12.2015
comment
операторы данных должны появляться перед любым исполняемым кодом, поэтому не может быть в цикле   -  person agentp    schedule 14.12.2015
comment
@agentp Это неверно даже в Fortran 2008/2015.   -  person francescalus    schedule 14.12.2015
comment
Джейсон, какой компилятор?   -  person agentp    schedule 14.12.2015


Ответы (1)


У вас тут три проблемы, и не только с циклами "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