我一直在使用Ffidl來處理一些使用FTDI驅動程序的設備,而且大多數情況下它都工作得很好。我相當肯定,我失敗的領域來自我對TCL如何處理幕後指針的理解。在任何情況下,我已經得到了關於通過引用傳遞通過做這樣的工作函數的例子:在TCL中使用Ffidl返回通過引用的字符串和數組
::ffidl::callout rpbrd {pointer-var} int \
[ffidl::symbol [ffidl::find-lib library] returns_pass_by_reference_double]
set dbl_ptr = [binary format [::ffidl::info format double] 1]
set my_int = [rpbrd dbl_ptr]
binary scan $dbl_ptr [::ffidl::info format double] my_dbl
puts $my_dbl
但是,我還沒有設法弄清楚兩件事情是迴歸「引用」的字符串(char *
),因爲他們似乎總是返回一些垃圾數據,每當我嘗試上述方法時,以及與數組有關的任何事情,因爲我甚至不知道從哪裏開始讓這些工作。我很確定這兩者背後的過程是相似的,因爲一個是一個字符數組,另一個只是一個數組......其他的東西。
任何幫助搞清楚這一點將不勝感激。我一直在爲它工作好幾天,當我搜索任何涉及ffidl的很好的例子時,我的Google-fu失敗了。
編輯:自從我的文章發佈以來,我使用::ffidl::pointer-into-string
命令管理了一些難以獲得字符串的工作。基本上只是看內存和複製字節,直到它達到一個零點(我猜)。這不是我認爲最佳方法應該是的,因爲這似乎不適用於引用,因爲我無法通過引用指向內存中的特定位置來傳遞指針,只是期望它在沒有後果的情況下工作。 (如果我不清楚,基本上我會做的就是在當前的內存塊中選擇一個隨機子地址,然後說:「嗯,是的,這似乎是放置一些數據的好地方。」這確實是一個糟糕的主意。)
我將繼續嘗試弄清楚如何讓數組工作。從複製內存開始,並嘗試使用一些binary scan
s的魔法字節。
雖然這有助於我理解Tcl如何在「幕後」工作,但我不確定我是如何使用它將Ffidl指向內存位置的指針解釋爲整數數組。 並不是說這不能回答這個問題,必然只是我不知道如何應用它。 – ashays 2011-04-08 15:18:32
我不太清楚我的實現是否真的使用了你特別提到的內容,但我認爲這有助於我在某種程度上形成我的解決方案。爲此,我感謝你。 – ashays 2011-04-08 16:34:48