1楼正解
这里有更详细的说明:
把浮点运算错误屏掉.
var
Saved8087CW: Word;
begin
Saved8087CW := Default8087CW;
Set8087CW($133f);
处理代码
Set8087CW(Saved8087CW);
在Delphi 7 中使用ArcGIS Engine 9.1时,加载空的SceneControl或者为MapControl加载MXD文档都会出现Invalid floating point operation的错误。对于SceneControl,即使设计状态没有加载任何sxd文件,只要在Delphi 7中运行程序,就会出现Invalid floating point operation的错误。
导致原因
在Delphi 7中需要通过浮点单位控制指令设置浮点运算单位。浮点单位控制指令控制着浮点运算的精度、四舍五入的方式以及特定的浮点运算是否触发异常。可以参阅Intel处理器的详细文档。
在Delphi 7中有函数可以直接访问处理器的控制指令。比如,可以使用Set8087CW函数改变8087CW控制指令的值,从而改变程序浮点计算的行为。编程人员需要自己负责在程序结束时重置这个指令。
解决办法
第一种方法是下载并安装delphi 7 的update包。
需要注意的是,在安装补丁包之前,必须删除import中已经导入的所有esri的pas,dcu,dcr文件,编译并保存包含这些库的package,默认是dclusr.dpk。
第二种方法就是直接禁用浮点异常,方法如下:
在Delphi 7中,当使用OpenGL进行3D渲染时,推荐使用Set8087CW函数禁用浮点异常。可以在调用OpenGL函数之前,比如在mainForm的OnCreate的过程中写入: Set8087CW(0x133f)
实例代码:
1.声明全局的变量保存原有的8087CW设置
var
Saved8087CW: Word;
2.在mainForm的OnCreate过程中改变8087CW的值,改变之前先保存默认值
Saved8087CW := Default8087CW;
Set8087CW($133f); { Disable all fpu exceptions }
3.在程序结束前,使用默认值重置8087CW指令值。在mainForm的OnClose过程中
Set8087CW(Saved8087CW);
4.还有一点需要注意,如果在程序中使用了SceneControl.LoadSxFile载入了3D文档,那么必须在程序退出时,在Set8087CW之前调用IScene的ClearLayers方法清除图层,否则程序在退出时会出现异常。
参考代码为:
SceneControl1.Scene.ClearLayers;
Set8087CW(Saved8087CW);
5.还有在程序退出之前需要调用如下语句
(CoAoInitialize.Create as IAoInitialize).Shutdown;
I have found a solution in borland.public.cppbuilder.
The floating point overflow is produced by the driver of this printer. Maybe in Microsoft compilers floating point errors are ignored during the printing process. In Borland compilers they aren't ignored.
In Borland Builder, to tell to the floating point unit (FPU) to ignore floating point errors, it is necessary to write to following code:
WORD Saved8087CW = Default8087CW;
Set8087CW(0x133F);
try{
Prntr->EndDoc();
}__finally
{
Set8087CW(Saved8087CW);
}
本文来自作者[语芙]投稿,不代表巨商报立场,如若转载,请注明出处:https://91zxpc.com/zx/2689.html
评论列表(3条)
我是巨商报的签约作者“语芙”
本文概览:1楼正解这里有更详细的说明:把浮点运算错误屏掉. var Saved8087CW: Word; begin Saved808...
文章不错《Delphi7的-Invalid pointer operation-异常的解决办法》内容很有帮助