我见过类似的问题,但无法获得预期的结果。我需要调用一个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对象成为对象,使用“缓冲区”作为指向字节数组的指针将其转换为字节数组,然后将数据设置为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双精度浮点数(存储它在dble
变量中)。在i2d
是格式描述符; 那里支持许多格式字符,您必须仔细阅读文档才能准确获得所需的内容。但是,变量之后将保留常规的Tcl值(的实际结果binary scan
是2
成功处理的格式字符数(不包括修饰符),在此示例中应为2)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句