全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1465
推到 Plurk!
推到 Facebook!

無法印出single陣列內容,出現invalid floating point operation

缺席
quzo1688
一般會員


發表:2
回覆:8
積分:2
註冊:2008-11-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-07-12 12:34:41 IP:180.177.xxx.xxx 訂閱
小弟在練習使用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 重新編輯於 2011-07-11 22:35:17, 註解 無‧
quzo1688 重新編輯於 2011-07-11 22:35:54, 註解 無‧
quzo1688 重新編輯於 2011-07-11 22:36:56, 註解 無‧
quzo1688 重新編輯於 2011-07-11 22:37:15, 註解 無‧
quzo1688 重新編輯於 2011-07-11 23:05:40, 註解 無‧
quzo1688
一般會員


發表:2
回覆:8
積分:2
註冊:2008-11-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-07-12 17:11:45 IP:180.177.xxx.xxx 訂閱
小弟後來又把問題簡化..試著不使用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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-07-16 17:36:21 IP:180.177.xxx.xxx 訂閱
不知道有沒有前輩可以指點一下..

之後又用C#環境下載入那DLL,可以正常顯示DLL function的陣列回傳值
而在delphi環境下,這個BUG我始終不知道錯在哪



------
hello!!
編輯記錄
quzo1688 重新編輯於 2011-07-16 03:40:37, 註解 無‧
quzo1688
一般會員


發表:2
回覆:8
積分:2
註冊:2008-11-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-07-18 16:14:08 IP:59.120.xxx.xxx 訂閱
 原來錯在function和procedure的不同
dll的函式沒有回傳值, 而我卻用function...後來改成procedure即正常!

[code delphi]
TDllFunction = procedure(Src:array of Single);cdecl;
[/code]


補充書上的說明:函式(function)是一種執行完畢後會傳回一個值的副程式;而程序(procedure)則不會,它沒有回傳值.
------
hello!!
編輯記錄
quzo1688 重新編輯於 2011-07-18 02:15:22, 註解 無‧
quzo1688 重新編輯於 2011-07-18 02:16:07, 註解 無‧
系統時間:2024-04-20 15:38:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!