2015-02-24 89 views
1

我看到了一個類似的問題,但一直未能得到想要的結果。我需要調用一個C++函數並讓該函數將一個數組傳遞給tcl。我現在的結構是:從C++函數返回一個char數組到tcl

Tcl_Obj *  result = Tcl_NewObj(); 
    unsigned char *buffer = Tcl_SetByteArrayLength(result, 16); 
    //some other code 

    //I2C function that fills the buffer 
    sub_i2c_read(handles[handle], theI2cAddr, 0, 0, (char*)buffer, theNumToRead 

    //more code 
    //try to place data in tcl 
    Tcl_SetObjResult(theInterp, result); 

我已經能夠看到,緩衝區有C++中所需的內容,但我想它在TCL設置變量爲空。

我想這樣稱呼它:

set result [sub20 read $hand "70" 3] 

我現在的思維過程是,這使得TCL對象,使用「緩衝」爲指針字節數組把它變成一個字節數組,然後將數據設置爲tcl,但這顯然是有缺陷的。
任何進一步的澄清,將不勝感激。

+0

一個字節數組在Tcl中沒有隱含的含義。這不是一個字符串,你不應該查看它。 – 2015-02-24 16:25:16

+0

@ n.m。所以我應該尋找一種方法將其轉換爲Tcl中的字符串? – 2015-02-24 16:30:19

+0

你怎麼確定結果是空的?使用二進制掃描? – 2015-02-24 16:44:26

回答

2

C++代碼看起來不錯。這些字節應該在緩衝區中,並且緩衝區應該已經被轉移到Tcl的所有權並且存儲在變量中。您可以通過使用string length $result來查看有多少個字節; Tcl認爲字節數組是U + 000000到U + 0000FF範圍內的一串字符,因此字符串操作是透明的。

你可能不能做的只是打印出來。來自各種協議的字節陣列通常包含大量空值(U + 000000,NUL,\000,\x00,\u0000等),並且它們打印不好。相反,要了解內容,請使用binary命令解析字節。例如:

binary scan $result i2d ints dble 

這將需要該16字節的緩衝區和讀取的兩個小端的32位整數出它(它們存儲在ints可變的兩元件Tcl列表),然後一個IEEE雙-precision在當前平臺的本地表示中浮動(將其存儲在dble變量中)。 i2d是格式描述符;有許多格式字符支持在那裏,你必須仔細閱讀文檔,以得到你想要的。但是,變量之後將保留常規Tcl值(binary scan的實際結果是格式字符的數量 - 不包括像2這樣的修飾符 - 已成功處理,在本示例中應爲兩個)。

+0

你是對的。代碼工作正常,在我忽略了之後,我在這個微不足道的部分犯了一個愚蠢的錯誤。感謝您花時間解釋二進制掃描命令內部工作的細節,這將非常有用! – 2015-02-25 14:28:14