将char数组从C ++函数返回到tcl

时间:2015-02-24 16:13:27

标签: c++ arrays tcl

我见过类似的问题,但一直无法得到理想的结果。我需要调用一个c ++函数并让函数将数组传递给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对象,使用'buffer'作为指向字节数组的指针将其转换为字节数组,然后将数据设置为tcl,但这显然是有缺陷的。
对此进一步澄清将不胜感激。

1 个答案:

答案 0 :(得分: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双精度浮点数在当前平台的本机表示中(将其存储在dble变量中)。 i2d是格式描述符;那里支持许多格式字符,您必须仔细阅读文档以获得您想要的内容。但是,变量将保留传统的Tcl值(binary scan的实际结果是格式字符的数量 - 不包括2之类的修饰符 - 已成功处理,在此示例中应为2)。