我正在Windows中将dll编程为TCL的扩展名,我需要创建一个函数来接收列表作为参数并返回列表。 到目前为止,我正在处理简单的参数,并只返回一个值:
Tcl_SetDoubleObj(resultptr, val);
例如。
预先感谢您的帮助。
答案 0 :(得分:0)
要解析列表,请使用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
来操纵值的引用计数,但是对于这些简单的情况,则不需要它们。