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