&引用;“种类值超出范围”;fortran中的错误
我试图编译一些Fortran代码,但得到了关于:种类值的错误。我正在用Silverfrost(柏拉图FN95)编译它。错误表示变量的精度格式。出于某种原因,使用“种类=8”是必要的。代码如下所示:&引用;“种类值超出范围”;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
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
如果你用的是柏拉图