我正在尝试运行数学算法的代码(Conjugate Gradient方法)。在这样做时,我输入了一个双精度矩阵,在我的序言中定义。编译时,我收到以下错误:
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
代码在我的矩阵输入中没有十进制数字,但似乎没有我的小数,我不明白为什么。
答案 0 :(得分:1)
上一个答案是不正确的,标准非常清楚如何处理数组构造函数。参见Fortran 2008 C4103。
问题形式的数组构造函数中的所有元素必须具有相同的声明类型和相同类型的参数。这里的编译器抱怨,因为通过将真实表达式与那些整数表达式混合来违反了这种约束。
简单地将第一个元素设为实/双精度元素是不够的。也许编译器使用关于“integer(4)
数组构造函数”的错误消息作为“第一个元素是integer(4)
而不是所有其他元素都是”的简写。
要解决这个问题,使用这种形式的数组构造函数,你应该制作相同类型/种类的所有元素(可能是真/双精度)。
正如在其他答案中所述(正确地)所述,数组构造函数还有另一种形式:
[ real ::0,8,0,4,26,8,0,17.5,0,0,0,17.5 ... ]
将所有元素转换为指定的类型。您甚至可以使用此表单创建一个零大小的数组:
[ real :: ]