Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“种类值超出范围”;fortran中的错误_Fortran - Fatal编程技术网

&引用;“种类值超出范围”;fortran中的错误

&引用;“种类值超出范围”;fortran中的错误,fortran,Fortran,我试图编译一些Fortran代码,但得到了关于:种类值的错误。我正在用Silverfrost(柏拉图FN95)编译它。错误表示变量的精度格式。出于某种原因,使用“种类=8”是必要的。代码如下所示: function diaedg ( x0, y0, x1, y1, x2, y2, x3, y3 ) implicit none real ( kind = 8 ) ca real ( kind = 8 ) cb integer ( kind = 4 ) diaedg re

我试图编译一些Fortran代码,但得到了关于:种类值的错误。我正在用Silverfrost(柏拉图FN95)编译它。错误表示变量的精度格式。出于某种原因,使用“种类=8”是必要的。代码如下所示:

  function diaedg ( x0, y0, x1, y1, x2, y2, x3, y3 )

  implicit none

  real ( kind = 8 ) ca
  real ( kind = 8 ) cb
  integer ( kind = 4 ) diaedg
  real ( kind = 8 ) dx10
  real ( kind = 8 ) dx12
  real ( kind = 8 ) dx30
  real ( kind = 8 ) dx32
  real ( kind = 8 ) dy10
  real ( kind = 8 ) dy12
  real ( kind = 8 ) dy30
  real ( kind = 8 ) dy32
  real ( kind = 8 ) s
  real ( kind = 8 ) tol
  real ( kind = 8 ) tola
  real ( kind = 8 ) tolb
  real ( kind = 8 ) x0
  real ( kind = 8 ) x1
  real ( kind = 8 ) x2
  real ( kind = 8 ) x3
  real ( kind = 8 ) y0
  real ( kind = 8 ) y1
  real ( kind = 8 ) y2
  real ( kind = 8 ) y3

  tol = 100.0D+00 * epsilon ( tol )

  dx10 = x1 - x0
  dy10 = y1 - y0
  dx12 = x1 - x2
  dy12 = y1 - y2
  dx30 = x3 - x0
  dy30 = y3 - y0
  dx32 = x3 - x2
  dy32 = y3 - y2

  tola = tol * max ( abs ( dx10 ), abs ( dy10 ), abs ( dx30 ), abs ( dy30 ) )
  tolb = tol * max ( abs ( dx12 ), abs ( dy12 ), abs ( dx32 ), abs ( dy32 ) )

  ca = dx10 * dx30 + dy10 * dy30
  cb = dx12 * dx32 + dy12 * dy32

  if ( tola < ca .and. tolb < cb ) then

    diaedg = -1

  else if ( ca < -tola .and. cb < -tolb ) then

    diaedg = 1

  else

    tola = max ( tola, tolb )
    s = ( dx10 * dy30 - dx30 * dy10 ) * cb + ( dx32 * dy12 - dx12 * dy32 ) * ca

    if ( tola < s ) then
      diaedg = -1
    else if ( s < -tola ) then
      diaedg = 1
    else
      diaedg = 0
    end if

  end if

  return
end
函数diaedg(x0,y0,x1,y1,x2,y2,x3,y3)
隐式无
真实(种类=8)ca
真实(种类=8)cb
整数(种类=4)diaedg
真实(种类=8)dx10
真实(种类=8)dx12
真实(种类=8)dx30
实数(种类=8)dx32
真实(种类=8)dy10
真实(种类=8)dy12
实际(种类=8)dy30
实数(种类=8)dy32
真实(种类=8)s
真实(种类=8)tol
雷亚尔(种类=8)托拉
实际(种类=8)通行费
实(种类=8)x0
实(种类=8)x1
实(种类=8)x2
真实(种类=8)x3
实际(种类=8)y0
实际(种类=8)y1
实际(种类=8)y2
实际(种类=8)y3
tol=100.0D+00*ε(tol)
dx10=x1-x0
dy10=y1-y0
dx12=x1-x2
dy12=y1-y2
dx30=x3-x0
dy30=y3-y0
dx32=x3-x2
dy32=y3-y2
tola=tol*max(abs(dx10)、abs(dy10)、abs(dx30)、abs(dy30))
tolb=tol*max(abs(dx12)、abs(dy12)、abs(dx32)、abs(dy32))
ca=dx10*dx30+dy10*dy30
cb=dx12*dx32+dy12*dy32
如果(tola
错误如下所示:

  function diaedg ( x0, y0, x1, y1, x2, y2, x3, y3 )

  implicit none

  real ( kind = 8 ) ca
  real ( kind = 8 ) cb
  integer ( kind = 4 ) diaedg
  real ( kind = 8 ) dx10
  real ( kind = 8 ) dx12
  real ( kind = 8 ) dx30
  real ( kind = 8 ) dx32
  real ( kind = 8 ) dy10
  real ( kind = 8 ) dy12
  real ( kind = 8 ) dy30
  real ( kind = 8 ) dy32
  real ( kind = 8 ) s
  real ( kind = 8 ) tol
  real ( kind = 8 ) tola
  real ( kind = 8 ) tolb
  real ( kind = 8 ) x0
  real ( kind = 8 ) x1
  real ( kind = 8 ) x2
  real ( kind = 8 ) x3
  real ( kind = 8 ) y0
  real ( kind = 8 ) y1
  real ( kind = 8 ) y2
  real ( kind = 8 ) y3

  tol = 100.0D+00 * epsilon ( tol )

  dx10 = x1 - x0
  dy10 = y1 - y0
  dx12 = x1 - x2
  dy12 = y1 - y2
  dx30 = x3 - x0
  dy30 = y3 - y0
  dx32 = x3 - x2
  dy32 = y3 - y2

  tola = tol * max ( abs ( dx10 ), abs ( dy10 ), abs ( dx30 ), abs ( dy30 ) )
  tolb = tol * max ( abs ( dx12 ), abs ( dy12 ), abs ( dx32 ), abs ( dy32 ) )

  ca = dx10 * dx30 + dy10 * dy30
  cb = dx12 * dx32 + dy12 * dy32

  if ( tola < ca .and. tolb < cb ) then

    diaedg = -1

  else if ( ca < -tola .and. cb < -tolb ) then

    diaedg = 1

  else

    tola = max ( tola, tolb )
    s = ( dx10 * dy30 - dx30 * dy10 ) * cb + ( dx32 * dy12 - dx12 * dy32 ) * ca

    if ( tola < s ) then
      diaedg = -1
    else if ( s < -tola ) then
      diaedg = 1
    else
      diaedg = 0
    end if

  end if

  return
end
错误600-种类编号应为1、2、3、4或7

“出于某种原因,有必要使用
kind=8
。”不,没有必要。代码的作者可能会认为这是必要的,但正如在

您的主要选择是进行搜索并用其他内容替换所有
kind=8
。具体使用什么取决于您希望处理该代码的程度。最快的将是将其更改为
2
,更可移植的将是
kind(1d0)
或相应的
选定的\u real\u kind()
,它们很可能都会执行相同的操作,但将来对于其他编译器可能有所不同。使用某些内在模块中的某些常量需要插入use语句,这可能很简单,也可能不简单


“4和7也是允许的值。它们是什么:”这对您来说很容易测试,只需尝试并使用一些查询函数,如
bit\u size()
epsilon()
,或者打印一些存储在那里的数值。或者它可能在手册中的某个地方,但您更有可能很好地访问它,我没有您的编译器,因此我无法亲自尝试

但是要小心使用
4
值,因为您的代码中有
整数(kind=4)
,而且您可能在某个地方也有
实数(kind=4)
。检查您是否确实不需要将其更改为仅
整数
实数
或种类1或其他内容。

“出于某种原因,使用
种类=8
是必要的。”不,这是不必要的。代码的作者可能会认为这是必要的,但正如在

您的主要选择是进行搜索并用其他内容替换所有
kind=8
。具体使用什么取决于您希望处理该代码的程度。最快的将是将其更改为
2
,更可移植的将是
kind(1d0)
或相应的
选定的\u real\u kind()
,它们很可能都会执行相同的操作,但将来对于其他编译器可能有所不同。使用某些内在模块中的某些常量需要插入use语句,这可能很简单,也可能不简单


“4和7也是允许的值。它们是什么:”这对您来说很容易测试,只需尝试并使用一些查询函数,如
bit\u size()
epsilon()
,或者打印一些存储在那里的数值。或者它可能在手册中的某个地方,但您更有可能很好地访问它,我没有您的编译器,因此我无法亲自尝试


但是要小心使用
4
值,因为您的代码中有
整数(kind=4)
,而且您可能在某个地方也有
实数(kind=4)
。检查您是否确实不需要将其更改为仅
整数
实数
或种类1或其他内容。

硬连线种类编号是一件危险的事情,因为它们不能保证在Fortran编译器之间兼容。您正在使用Silverfrost FTN95,其实际种类值为1、2和3:

您看到的警告是编译器告诉您它无法识别种类值。我猜kind=8意味着64位实数(因为它们占用8个字节)。您可以使用SELECTED_REAL_KIND和SELECTED_INT_KIND来选择一种值,如下所示:

integer,parameter :: kr_8 = selected_real_kind(12)  ! 12-digits of precision
integer,parameter :: ki_4 = selected_int_kind(8)  ! 8 digits of precision
real ( kind = k_8 ) ca
real ( kind = k_8 ) cb
integer ( kind = ki_4 ) diaedg
real ( kind = k_8 ) dx10

硬连线的种类编号是一件危险的事情,因为它们不能保证在Fortran编译器之间兼容。您正在使用Silverfrost FTN95,其实际种类值为1、2和3:

您看到的警告是编译器告诉您它无法识别种类值。我猜kind=8意味着64位实数(因为它们占用8个字节)。您可以使用SELECTED_REAL_KIND和SELECTED_INT_KIND来选择一种值,如下所示:

integer,parameter :: kr_8 = selected_real_kind(12)  ! 12-digits of precision
integer,parameter :: ki_4 = selected_int_kind(8)  ! 8 digits of precision
real ( kind = k_8 ) ca
real ( kind = k_8 ) cb
integer ( kind = ki_4 ) diaedg
real ( kind = k_8 ) dx10
4和7也是允许的值。它们是什么

KIND=4和KIND=7仅适用于64位编译器。它是用于Windows句柄的。这在供应商文档中

有一个silverfrost编译器选项/ALT_KINDS,允许KIND=8

如果你用的是柏拉图

  • 从菜单中选择项目