無法印出single陣列內容,出現invalid floating point operation |
缺席
|
quzo1688
一般會員 發表:2 回覆:8 積分:2 註冊:2008-11-12 發送簡訊給我 |
小弟在練習使用delphi呼叫dll時遇到一問題..
以下我把它簡化,如下... dll部分的code: [code cpp] extern "C" _declspec(dllexport) void FF(float *i) { i[0]=(float)1.1; i[1]=(float)2.1; } [/code] delphi部分: [code delphi] procedure TForm1.Button1Click(Sender: TObject); type TDllFunction = Function(Src:array of single):single;stdcall; ary = array of single; var Hmydll: HWND; mydllfun1:TDllFunction; corr:ary; i:integer; begin SetLength(corr, 2); Hmydll := LoadLibrary('AddDll.dll'); {load DLL} if Hmydll > 0 then try mydllfun1 := GetProcAddress(Hmydll, PChar('FF')); if @mydllfun1 <> nil then begin mydllfun1(corr); // <-用debug下,有看到corr陣列有2個值(1.1000000238, 2.0999999046) for i:=0 to 1 do begin Memo1.Lines.Add(Format('%f', [corr[i]])); end; end else ShowMessage('FF函數沒有找到'); finally FreeLibrary(Hmydll); {釋放DLL} end else ShowMessage('dll沒有找到'); end; [/code] 執行到第19行時,會出現invalid floating point operation... 我有試過將dll與delphi的陣列改成整數型態,可以正常顯示.. 但如果是浮點數情況就出現這種情況,所以想請教各位前輩。
------
hello!! |
quzo1688
一般會員 發表:2 回覆:8 積分:2 註冊:2008-11-12 發送簡訊給我 |
小弟後來又把問題簡化..試著不使用dll
[code delphi] function fact(var n:array of single) : single; begin n[0] := 1.1; n[1] := 2.2; end; procedure TForm1.Button1Click(Sender: TObject); type ary = array of single; var j:integer; a:ary; begin SetLength(a, 2); fact(a); for j := 0 to 1 do Memo1.Lines.Add(Format('%.9f', [a[j]])); end; [/code] 結果執行正常.. 不曉得為什麼載入dll,執行時就會出現invalid floating point operation...
------
hello!!
編輯記錄
quzo1688 重新編輯於 2011-07-12 03:58:55, 註解 無‧
|
quzo1688
一般會員 發表:2 回覆:8 積分:2 註冊:2008-11-12 發送簡訊給我 |
|
quzo1688
一般會員 發表:2 回覆:8 積分:2 註冊:2008-11-12 發送簡訊給我 |
原來錯在function和procedure的不同
dll的函式沒有回傳值, 而我卻用function...後來改成procedure即正常! [code delphi] TDllFunction = procedure(Src:array of Single);cdecl; [/code] 補充書上的說明:函式(function)是一種執行完畢後會傳回一個值的副程式;而程序(procedure)則不會,它沒有回傳值.
------
hello!! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |