我见过类似的问题,但一直无法得到想要的结果。我需要调用一个 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 中设置数据,但这显然是有缺陷的。
如果对此有任何进一步的澄清,我们将不胜感激。
最佳答案
C++ 代码看起来不错。字节应该在缓冲区中,并且缓冲区应该已转移到 Tcl 的所有权并存储在变量中。您可以使用 string length $result
来仔细检查其中有多少字节; Tcl 将字节数组视为 U+000000 到 U+0000FF 范围内的字符串,因此字符串操作是透明的。
您可能无法做的就是将其打印出来。来自各种协议(protocol)的字节数组通常包含大量空值(U+000000、NUL、\000
、\x00
、\u0000
等)而且它们打印得不好。相反,要理解内容,请使用 binary
命令来解析字节。例如:
binary scan $result i2d ints dble
这将获取该 16 字节缓冲区并从中读取两个小端 32 位整数(将它们存储在 ints
变量中的两元素 Tcl 列表中),然后读取一个 IEEE double -当前平台 native 表示形式的精度 float (将其存储在 dble 变量中)。 i2d
是格式描述符;其中支持许多格式字符,您必须仔细阅读文档才能准确获得您想要的内容。然而,这些变量随后将保存传统的 Tcl 值(二进制扫描的实际结果是格式字符的数量——不包括像 2
这样的修饰符——成功处理,这应该在本例中为两个)。
关于c++ - 从 C++ 函数返回 char 数组到 tcl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700780/