Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从C++;tcl的功能_C++_Arrays_Tcl - Fatal编程技术网

C++ 从C++;tcl的功能

C++ 从C++;tcl的功能,c++,arrays,tcl,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[h

我见过一个类似的问题,但一直无法得到预期的结果。我需要调用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中设置数据,但这显然是有缺陷的。

如对此有任何进一步澄清,将不胜感激string length$result仔细检查,查看其中有多少字节;Tcl认为字节数组是U+000000到U+0000FF范围内的字符串,因此字符串操作是透明的

你可能不能做的就是把它打印出来。来自各种协议的字节数组通常包含大量的空值(U+000000、NUL、
\000
\x00
\u0000
,等等),并且它们不能很好地打印。相反,要理解内容,请使用
binary
命令解析字节。例如:

binary scan $result i2d ints dble

这将占用16字节的缓冲区并从中读取两个小的endian 32位整数(将它们存储在
ints
变量中的两元素Tcl列表中),然后在当前平台的本机表示中读取IEEE双精度浮点(将其存储在
dble
变量中)。
i2d
是格式描述符;其中有许多支持的格式字符,您必须仔细阅读文档才能获得所需的格式字符。但是,变量随后将保持常规Tcl值(二进制扫描的实际结果是成功处理的格式字符数,不包括
2
,在本例中应该是两个)。

字节数组在Tcl中没有隐含意义。它不是字符串,您不应该查看它。@n.m.那么我应该寻找一种方法在Tcl中将其转换为字符串吗?您如何确定结果为空?使用二进制扫描?如果你想要一个字符串,也许使用TCLJRistGObjJ和朋友,而不是C++上的TCLYBYTAREARE。如果您确实需要二进制数据,并且只想将其转换为字符串以进行调试,请在Tcl端使用例如
binary encode base64
。@Austin Mullins我最初只是尝试将内容“放入”Tcl中,但我现在知道不正确。您是正确的。代码运行正常,我只是在我忽略的那一小部分中犯了一个愚蠢的错误。感谢您花时间解释二进制扫描命令内部工作的细节,这将非常有用!