使用lindex命令可以相当容易地访问TCL列表中的子元素.以下是我的 list :

set myList {Y {FUNCTION {{KEY1 KEY2 KEY3}}}}

我的目标是能够检索此子列表:

KEY1 KEY2 KEY3.

Side Tcl, with lindex command I can do that : lindex $myList {1 1 0}.
With Tcl C API, I think I need to use this function Tcl_ListObjIndex, but it doesn't allow you to add several indexes to select elements from sublists. Here's my C code :

Tcl_Obj* first_list  = Tcl_NewObj();
Tcl_Obj* sub_list    = Tcl_NewObj();
Tcl_Obj* subsub_list = Tcl_NewObj();

Tcl_ListObjIndex(interp, myList, 1, &first_list);
Tcl_ListObjIndex(interp, first_list, 1, &sub_list);
Tcl_ListObjIndex(interp, sub_list, 0, &subsub_list);

return subsub_list;

它起作用了,但我刚刚试着把我的Tcl代码翻译成C代码,我不知道这是非常有效还是正确的.

推荐答案

虽然有一个用于执行您所讨论的确切操作(TclLindexFlat())的内部API,但它没有公开,因为它有点笨重(在引用计数管理和列表和索引之间的非混叠方面有一些不太繁琐的要求--这是作为命令的包装为您处理的事情).像这样多次拨打Tcl_ListObjIndex()是相当高效的;几乎没有开销.尴尬而不是大获全胜?没有expose !

如果你想要一个相当于lset的数字,那就更重要了,因为在保持效率的同时,can't很容易由基本的操作组成.(TclListObjSetElement()没有文档,多指数版本-TclLsetFlat()-根本没有公开...)

如果你想公开这些东西,你真的应该联系Tcl核心团队,解释你的用例,说服我们清理这些东西,让我们使用公共API.

C++相关问答推荐

为什么已经设置的值在C中被重置为for循环条件中的新值?

什么C代码将确定打开的套接字正在使用的网络适配器?

__VA_OPT__(,)是否可以检测后面没有任何内容的尾随逗号?

如何在C宏中确定 struct 中元素的类型?

如何将字符**传递给需要常量字符指针的常量数组的函数

解决S随机内存分配问题,实现跨进程高效数据共享

在创建动态泛型数组时,通过realloc对故障进行分段

在进程之间重定向输出和输入流的问题

理解bzip2的BZ2_解压缩函数中的状态重新分配

链接器脚本和C程序使用相同的头文件,这可能吗?

不带Malloc的链表

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

区分MySQL C界面中的文本和BLOB字段

C中的数组下标和指针算法给出了不同的结果

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

模仿 memmove 的行为

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组

我们可以在不违反标准的情况下向标准函数声明添加属性吗?

如何根据当前舍入方向将float转换为int?