从C++函数返回一个char数组到tcl
我看到了一个类似的问题,但一直未能得到想要的结果。我需要调用一个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,但这显然是有缺陷的。
任何进一步的澄清,将不胜感激。
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
这样的修饰符 - 已成功处理,在本示例中应为两个)。
你是对的。代码工作正常,在我忽略了之后,我在这个微不足道的部分犯了一个愚蠢的错误。感谢您花时间解释二进制扫描命令内部工作的细节,这将非常有用! – 2015-02-25 14:28:14
一个字节数组在Tcl中没有隐含的含义。这不是一个字符串,你不应该查看它。 – 2015-02-24 16:25:16
@ n.m。所以我应该寻找一种方法将其转换为Tcl中的字符串? – 2015-02-24 16:30:19
你怎么确定结果是空的?使用二进制扫描? – 2015-02-24 16:44:26