Чтобы проанализировать список, используйте 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
, но для этих простых случаев они вам не нужны.