Tcl/Tk 入門

C から Tcl の変数を設定する

最終更新: [2005/11/03]
Copyright

ふつーの変数の場合

C の関数中で Tcl の変数を設定するには,通常の変数は SetVar を使い変数名と値を指定し,配列の場合は配列名,キー,値を指定します.次のようになります.これは libfoo.so という動的ライブラリを作成するものです.load コマンドで読み込んだあと,作成される foo コマンドを実行すると,変数の foo, bar(tmp) を設定します.

SetVar の最後の引数はフラグで種々のものがあるようですが,ひとまず.TCL_GLOBAL_ONLY にしててもいいみたいです??でも関数中から呼ばれたときとかには問題ですね.

値の取得には Tcl_GetVar() などを使います.

See. Tcl_SetVar(3)

#include <tcl.h>

/*
 * gcc -fPIC -I/usr/local/include -c foo.c
 * ld -Bshareable -x foo.o -o libfoo.so -L/usr/local/lib -ltcl80jp -lm
 */

int foo(ClientData clientData, Tcl_Interp *interp,
             int argc, char *argv[])
{
    Tcl_SetVar(interp, "foo", "12349", TCL_GLOBAL_ONLY);
    Tcl_SetVar2(interp, "bar", "test", "5678", TCL_GLOBAL_ONLY);
    return TCL_OK;
}

int Foo_Init(Tcl_Interp* interp)
{
    Tcl_CreateCommand(interp, "foo", foo, NULL, NULL);
    return TCL_OK;
}

リンク


リスト値を設定する

リスト値というかずらずらと値をスペースで区切ってつないだ文字列にし,それを返す方法です.Tcl_DStringAppend() を使って sprintf() で文字列に変換した数値をリストにしていっています.書式指定の %d 後の空白で区切りにしています.もちろん,項目に空白が含まれる場合のクォートなどは行なっていませんし,浮動小数などの場合は値の桁落ちも大きいので,その場合には向きません.

下記の例では i を 0 から 99 まで変化させ,i*i の値をリストにして返します.

int foo(ClientData clientData, Tcl_Interp *interp,
             int argc, char *argv[])
{
    Tcl_DString dstr;
    char str[512];
    int i;

    Tcl_DStringInit(&dstr);
    for (i=0; i<100; i++) {
        sprintf(str, "%d ", i*i);
        Tcl_DStringAppend(&dstr, str, -1);
    }
    Tcl_DStringResult(interp, &dstr);
    Tcl_DStringFree(&dstr);

    return TCL_OK;
}

||Tcl/Tk 入門||

Mail-to: oshiro@mibai.tec.u-ryukyu.ac.jp