【问题标题】:Double precision array error双精度数组错误
【发布时间】:2013-01-11 05:19:06
【问题描述】:

我正在尝试为数学算法(共轭梯度法)运行代码。这样做时,我输入了一个双精度矩阵,在我的序言中如此定义。编译时出现以下错误:

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 

该代码在我的矩阵输入中没有十进制数字的情况下工作,但我的小数似乎没有,我不知道为什么。

【问题讨论】:

    标签: arrays fortran precision fortran90


    【解决方案1】:

    前面的答案是错误的,标准对数组构造函数的处理方式很清楚。参见 Fortran 2008 C4103。

    问题形式的数组构造函数中的所有元素必须具有相同的声明类型和相同类型的类型参数。此处的编译器会抱怨,因为将实数表达式与那些整数表达式混合违反了此约束。

    仅将第一个元素设为实数/双精度元素是不够的。也许编译器正在使用有关“integer(4) 数组构造函数”的错误消息作为“第一个元素是 integer(4) 但并非所有其他元素都是”的简写。

    要解决这个问题,使用这种形式的数组构造函数,您应该使所有元素具有相同的类型/种类(可能是实数/双精度)。

    如其他答案中所述(正确),数组构造函数还有另一种形式:

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

    将所有元素转换为指定的类型。你甚至可以使用这种形式来创建一个大小为零的数组:

     [ real :: ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 2011-07-07
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多