delphi 除數為零錯誤如何不出錯自動回傳0
當然不加try 例外處理的情況下 因為我是帶決議功能的所以不能每行都加上 try 請各位大位幫忙解決啊
uj5u.com熱心網友回復:
要么提前判斷除數為0時, 回傳0要么try except, 沒別的好辦法
你可以把計算程序放在一個函式內, 這樣靈活性, 安全性會好些
uj5u.com熱心網友回復:
function chu(a,b:extended):extended;begin
try
result:=a/b;
except
on EDivZero do result:=0;
end;
end
uj5u.com熱心網友回復:
像這些運算最好考慮uj5u.com熱心網友回復:
本來很簡單的問題,加上樓主的限制就不會了。呵呵,關注一下,感覺沒有其他方法了
uj5u.com熱心網友回復:
1步:讓我們的例外處理程序最早執行,也就是在Try指定的處理程序之前執行(我的方法是:In Line Hook ntdll.KiUserExceptionDispatcher,然后Hook中替換首個SEH程序(FS:[0])為指定的程序,然后繼續執行.在這個指定的程序中,還原FS:[0],并判斷PExceptionRecord.ExceptionCode=$C0000094(整除0) $C000008E(浮點計算除0)如果是進入除0例外處理,如果不是轉入原例外處理程序處理.)2步:除0例外處理程序,首先取出例外地址處的機器碼長度,把Context.EIP+指令長度(跳過例外的指令),然后模擬例外處的指令(由于你想把 n / 0 = 0,因此這里能模擬的),模擬分以下情況:
1.DIV或者IDIV指令(整除0),把Context.Eax,Edx置0即可,Eax為商,Edx為余數;
2.FDIV m32/m64/m80 把ST(0)置0
3.FDIV ST(i) 把 ST(i)置0即可
4.FDIV ST(i),ST(0) 把ST(i)置0
5.FDIVP ST(i), ST(0) 把ST(i)置0,并Pop一次,
6.FIDIV...
...這里情況有點多,需要逐個模擬指令的執行結果即可,浮點例外處理的最后記得把FPU的例外標志去掉
這樣處理的結果是:
var i , n : integer;
begin
i := 100;
n := 0;
try
if (i DIV n)=0 then ShowMessage('i Div n 結果為 0');
except
ShowMessage('i Div n發生例外');
end;
end;
如果未經過前面的處理,執行這代碼,顯示例外,經過上面的處理,顯示 結果為0,而 例外 的訊息時不會顯示的.
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/149099.html
標籤:語言基礎/算法/系統設計
上一篇:如何打開這樣的IE?
下一篇:急,DCOM連接問題
