線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2436
推到 Plurk!
推到 Facebook!

如何轉換Variant至double*

答題得分者是:Stallion
BIMEGiGio
一般會員


發表:3
回覆:6
積分:6
註冊:2004-11-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-04 17:44:33 IP:211.72.xxx.xxx 訂閱
由於使用的SDK都是使用VARIANT型態在傳遞
我在BCB內是將其轉成Variant來使用
在平常的情況下都能夠正常轉換
<textarea class="cpp" rows="10" cols="60" name="code">if(!tmp_Row.IsNull()) { int Count=0; if(tmp_Row.IsArray()) { Count =tmp_Row.parray->rgsabound->cElements; row = (double*) tmp_Row.parray->pvData; } else { Count = 1; row = new double[2]; row[0] = tmp_Row.dblVal; } } </textarea>

不過我今天想要把它寫成函式
希望能夠直接轉換,得到其double陣列, 卻出了問題。

<textarea class="cpp" rows="10" cols="60" name="code">row = Variant2Double(tmp_Row); double* TForm1::Variant2Double(Variant V) { int Count; double *result; result = NULL; if(!V.IsNull()) { if(V.IsArray()) { Count =V.parray->rgsabound->cElements; result = (double*) V.parray->pvData; } else { result = &V.dblVal; } } return result; } </textarea><br />
可以請各位先進,幫忙看看 問題出在哪裡嗎?
謝謝!
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-11 22:56:22 IP:59.105.xxx.xxx 訂閱
在 double* TForm1::Variant2Double(Variant V)
result = &V.dblVal; 應該是有問題的,因為此傳入的 V 應該只在 Stack 中,
&V.dblVal 變成指到 Stack 的某個位址,以此為 result 傳回去用,應該是會 Exception 的。
至於
result = (double*) V.parray->pvData; 我是不太懂啦,我猜想,應該是要看您原本輸入的 V 的內容到底是什麼吧?
不知道您傳入
Variant2Double(V); 的 V 是什麼? 如果是陣列又是如何給值的呢?
------
http://www.ViewMove.com
BIMEGiGio
一般會員


發表:3
回覆:6
積分:6
註冊:2004-11-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-12 08:47:36 IP:211.72.xxx.xxx 訂閱
V的取得是一套SDK函式的傳回值
不見得會是陣列,但是確定是double

===================引 用 dllee 文 章===================
在 double*?TForm1::Variant2Double(Variant?V)
result?=?&V.dblVal; 應該是有問題的,因為此傳入的 V 應該只在 Stack 中,
&V.dblVal 變成指到 Stack 的某個位址,以此為 result 傳回去用,應該是會 Exception 的。
至於
result?=?(double*)?V.parray->pvData;? 我是不太懂啦,我猜想,應該是要看您原本輸入的 V 的內容到底是什麼吧?
不知道您傳入
Variant2Double(V); 的 V 是什麼? 如果是陣列又是如何給值的呢?
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-12 23:00:36 IP:59.105.xxx.xxx 訂閱
那您能確定是何種錯誤嗎?
如上回回覆,如果傳的 V 不是陣列,而您把 Stack 的指標傳回去用,一定會有問題的呀。
但如果 V 傳入的是陣列,或許沒有問題(我不能確定, 因為我也不太熟 Variant)
------
http://www.ViewMove.com
BIMEGiGio
一般會員


發表:3
回覆:6
積分:6
註冊:2004-11-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-13 16:17:39 IP:211.72.xxx.xxx 訂閱
其實嚴格說來不是錯誤
是無法傳回正確的陣列
在函式中 陣列的內容是有值的
我debug的結果是有回傳記憶體位置
但是內容卻不見了

陣列方面的問題我已經有用V.IsArray()避開了
所以暫時不會去考慮這邊的問題

謝謝各位幫我解惑了
===================引 用 dllee 文 章===================
那您能確定是何種錯誤嗎?
如上回回覆,如果傳的 V 不是陣列,而您把 Stack 的指標傳回去用,一定會有問題的呀。
但如果 V 傳入的是陣列,或許沒有問題(我不能確定, 因為我也不太熟 Variant)
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-30 01:01:40 IP:211.22.xxx.xxx 未訂閱
你的目的在傳回轉換後倍精數的「值」而不是值所在的「位址」,應該設計為double即可,而非double *。
為何呢?因為你用來承接倍精數轉換後的變數Result指標是區域變數!沒錯在該函數內Result是指到了V.dblVal的位址,同時保證在該函數內Result指標內的所指的值是正確的!可是一旦離開該轉換函數,該區域變數所佔的空間便被作業系統回收了!沒錯回傳的位址值依然存在正確,可是空間被回收了,當然不能保證回傳位址內的值是正確的!
以上為針對一個傳回值,如果要傳回很多轉換後倍精數陣列,方法有二:
1.將承接倍精數轉換後的倍精數陣列宣告為全域變數,至於這個陣列的大小可視需要動態產生。
2.以傳位址或參考的方式傳入你設計的函數中也可,陣列大小的控制法如上所述。
編輯記錄
Stallion 重新編輯於 2007-07-30 15:04:17, 註解 加入其他說明.‧
系統時間:2024-05-02 19:14:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!