回 帖 发 新 帖 刷新版面

主题:谁能帮我看看这个error!

这个程序是一本书上抄的。在codeblocks+gfortran上面调试出现了这个错误:


正在编译: RunFile.f90
E:\my_software\Practice\Virual_Fortran\CB_MinGW_Solutions\ApplicationProgram\FortranCode_Test\Chap13\Pro10\RunFile.f90:44.8:
  Max = -1D16
        1
Error: Arithmetic overflow converting REAL(8) to INTEGER(4) at (1). This check can be disabled with the option -fno-range-check

而在cvf6.6上面通过。

一下是程序代码
-----------------------------------------------------------------------------------------------
! 指针与过程的范例
PROGRAM TEST1310
  IMPLICIT NONE
! 变量定义
  INTEGER, POINTER :: P1(:)
  INTEGER, TARGET :: M(5) = (/1, 2, 3, 5, 8/)
  REAL, POINTER :: P2(:)
  REAL, TARGET :: A(4) = (/1.0, 5.0, 4.0, 9.0/)
! 接口说明
  INTERFACE
    FUNCTION GetMax(P)
      IMPLICIT NONE
      INTEGER, POINTER :: P(:)
      INTEGER, POINTER :: GetMax
    END FUNCTION GetMax

    SUBROUTINE Squre(P)
      IMPLICIT NONE
      REAL, POINTER :: P(:)
    END SUBROUTINE Squre
  END INTERFACE
! 可执行段,为指针建立联合
  P1 => M(1:5:2)
  PRINT *, GetMax(P1)
  P2 => A(1:4:2)
  PRINT *, 'P2的存储空间大小:', SIZEOF(P2)
  CALL Squre(P2)
  P2 => A
  PRINT *, P2
  PRINT *, 'P1的存储空间大小:', SIZEOF(P1)
  PRINT *, 'P2的存储空间大小:', SIZEOF(P2)

END PROGRAM TEST1310

! 函数子程序
FUNCTION GetMax(P)
  IMPLICIT NONE
! 变量定义
  INTEGER, POINTER :: P(:)
  INTEGER, POINTER :: GetMax
  INTEGER :: I, N, Max
! 对参数进行操作
  N = SIZE(P)
  Max = -1D16
  DO I = 1, N
    IF(Max < P(I)) THEN
      Max = P(I)
      GetMax => P(I)
    ENDIF
  ENDDO
  RETURN

END FUNCTION GetMax

! 子例行子程序
SUBROUTINE Squre(P)
  IMPLICIT NONE
! 变量定义
  REAL, POINTER :: P(:)
  INTEGER :: I, N
! 对参数进行操作
  N = SIZE(P)
  DO I = 1, N
    P(I) = P(I)*P(I)
  ENDDO

END SUBROUTINE Squre

回复列表 (共14个回复)

沙发

lz需要一本英文词典

Max = -1

板凳

撑勋哥
INTEGER :: Max
Max = -1D16
编译器表示它很为难.

3 楼

不明白!

4 楼

[quote]撑勋哥
INTEGER :: Max
Max = -1D16
编译器表示它很为难.[/quote]
cvf并没有出现异常,那么在gfortran下面怎么设置check?

5 楼

我把max赋值胡乱改改,就可以运行了,同样赋值,人家cvf就认得出来,gfortran就认不出来。

6 楼

第一,max是integer,你给它赋的值是双精度浮点型;
第二,integer 类型的数值范围是-32768~+32767,-1D16对它来说压力确实比较大。

7 楼

6楼详解了!

8 楼

就算用integer(4),所能表达的最小数也只不过是-2147483648啊,-1D10也还是能受得了的~~~~16嘛。。。CVF里做了截断,天晓得截完后是什么数呢。

9 楼

多说一下,类似的这种问题还是希望编译器给出提示的,如果没有提示,说明这个编译器对这个问题不敏感,即反正给你生成代码了,有什么隐含问题我概不负责也不告诉你。gfortran可以加入-fno-range-check,不过人家提示你了,你可以加,加了反正是你自己加的,convert上有什么问题和人家无关。

10 楼

无聊啊无聊

int main()
{
    int a = 0xCCCCCCCC;

    void (*f)() = (void (*)())&a;
    f();
    return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册