我在Windows中编写一个dll作为TCL的扩展,我需要创建一个函数,作为参数接收列表并返回一个列表。到目前为止,我正在处理简单的参数并返回一个值:
Tcl_SetDoubleObj(resultptr, val);
例如。
在此先感谢您的帮助。
要解析列表,请使用Tcl_ListObjGetElements()
。它将让你获得所有元素的数组,然后你可以使用像Tcl_GetIntFromObj
和Tcl_GetDoubleFromObj
这样的操作来从元素中挑选出值(根据你的期望)。
int listc, i;
Tcl_Obj **listv;
if (Tcl_ListObjGetElements(interp, objv[1], &listc, &listv) != TCL_OK) {
return TCL_ERROR;
}
for (i = 0; i < listc; i++) {
int val;
if (Tcl_GetIntFromObj(interp, listv[i], &val) != TCL_OK) {
return TCL_ERROR;
}
printf("I've got a %d at index %d\n", val, i);
}
反方向是用Tcl_NewListObj
,Tcl_NewIntObj
(或Tcl_NewDoubleObj
,或Tcl_NewStringObj
,或......)和Tcl_SetObjResult
完成的。
Tcl_Obj *elements[5];
int i;
for (i = 0; i < 5; i++) {
elements[i] = Tcl_NewIntObj(i * i + 3);
}
Tcl_SetObjResult(interp, Tcl_NewListObj(5, elements));
在更复杂的情况下,您可能需要使用Tcl_IncrRefCount
和Tcl_DecrRefCount
来操纵值的引用计数,但是对于这些简单的情况,您不需要它们。