2015-02-24 59 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