當前位置:編程學習大全網 - 編程語言 - Delphi7的"Invalid pointer operation"異常的解決辦法

Delphi7的"Invalid pointer operation"異常的解決辦法

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);

}

  • 上一篇:VPS和虛擬主機有什麽區別?
  • 下一篇:段寄存器在實模式下和保護模式下的作用有什麽不同
  • copyright 2024編程學習大全網