c++ - 从 C++ 函数返回 char 数组到 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[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/

相关文章:

arrays - 将新值附加到 ruby​​ 中的现有 JSON 数组

php - 将复杂数组转换为 foreach 循环

shell - 如何使用参数在 tchsh 中执行 tcl 脚本

c++ - 如何通过自定义结构传递数组初始化?

c++ - 任何类型的指针都可以指向任何东西吗?

c++ - 使用指针新建和删除

c - c 中的 malloc() 和 free() 数组

tcl - 如何在 Expect 中保存和解析命令输出?

list - TCL:检查变量是否为列表

c++ - 从 C++ std::vector 中删除第 i 个项目