Ошибка массива двойной точности

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

A=RESHAPE((/ 0,8,0,4,26,8,0,17.5,0,0,0,17.5,0,2.5,-8,4,0,2.5,0,-5,26,0,-8,-5,0 
                        1
Error: Element in INTEGER(4) array constructor at (1) is REAL(4)
make: FTranProjectBuilder: Error: Execution exited with code 2 
*** [cg_main.o] Error 1

Мое определение в программе с определяемой матрицей дается как таковое (определение массива — первая операция моей программы):

PROGRAM cg_main 
IMPLICIT NONE 

INTEGER,PARAMETER                     ::d=5 !use a parameter for the dimensions (simple)
DOUBLE PRECISION,DIMENSION(d,d)       ::A !matrix
INTEGER,DIMENSION(2)                  ::order2 = (/ 2, 1 /) !matrix reshape order

[MORE DECLARATIONS HERE]

A=RESHAPE((/ 0,8,0,4,26,8,0,17.5,0,0,0,17.5,0,2.5,-8,4,0,2.5,0,-5,26,0,-8,-5,0 /),(/d,d/), order2) !specify dxd matrix

[MORE CODE HERE]

END PROGRAM 

Код работает без десятичных чисел в моем вводе матрицы, но, похоже, не работает с моими десятичными знаками, и я понятия не имею, почему.


person user2016338    schedule 27.01.2013    source источник


Ответы (1)


Предыдущий ответ неверен, и стандарт очень ясно описывает, как обрабатывается конструктор массива. См. в Фортране 2008 C4103.

Все элементы в конструкторе массива формы вопроса должны иметь один и тот же объявленный тип и одинаковые параметры типа типа. Компилятор здесь жалуется, потому что это ограничение было нарушено путем смешивания реального выражения с этими целочисленными выражениями.

Недостаточно просто сделать первый элемент элементом реальной/двойной точности. Возможно, компилятор использует сообщение об ошибке «конструктора массива integer(4)» как сокращение для «первый элемент integer(4), но не все остальные элементы».

Чтобы решить эту проблему, с помощью этой формы конструктора массива вы должны сделать все элементы одного и того же типа/вида (вероятно, с реальной/двойной точностью).

Как указано (правильно) в этом другом ответе, для конструкторов массивов существует другая форма:

[ real ::0,8,0,4,26,8,0,17.5,0,0,0,17.5 ... ]

который преобразует все элементы в указанный тип. Вы даже можете использовать эту форму для создания массива нулевого размера:

 [ real :: ]
person francescalus    schedule 05.10.2017