TCL Windows DLL функция, которая получает в качестве аргумента и возвращает список - PullRequest
0 голосов
/ 05 сентября 2018

Я программирую DLL в Windows как расширение для TCL, и мне нужно создать функцию, которая получает в качестве аргументов список и возвращает также список. Пока я имею дело с простыми аргументами и возвращаю только одно значение:

Tcl_SetDoubleObj(resultptr, val);

например.

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 05 сентября 2018

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

...