1

tclコードの機能(API)の一部を別の「c」コードファイルで使用したいと思います。しかし、私はそれを行う方法、特にそれらをリンクする方法を理解していません。そのために、2つの数値を加算して合計を出力する1つのAPIを含む非常に単純なtclコードを使用しました。誰かがこのtclコードを呼び出して合計を取得する方法を教えてもらえますか?このtclコードを呼び出すacラッパーを作成するにはどうすればよいですか。以下は私が使用している私のサンプルtclプログラムです:

#!/usr/bin/env tclsh8.5
proc add_two_nos { } {

set a 10

  set b 20

  set c [expr { $a + $b } ]

  puts " c is $c ......."

}
4

2 に答える 2

4

Cコードからスクリプトを評価するには、Tcl_Eval()またはその近親者の1つを使用します。そのAPIを使用するには、Tclライブラリにリンクし、Tclライブラリを初期化し、実行コンテキストを保持するインタプリタを作成する必要があります。さらに、結果を取得して印刷するには、実際にいくつかの作業を行う必要があります(スクリプトエラーの印刷は、デバッグに大いに役立つため、特に重要です!)

したがって、次のようなものが得られます。

#include <tcl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    Tcl_Interp *interp;
    int code;
    char *result;

    Tcl_FindExecutable(argv[0]);
    interp = Tcl_CreateInterp();
    code = Tcl_Eval(interp, "source myscript.tcl; add_two_nos");

    /* Retrieve the result... */
    result = Tcl_GetString(Tcl_GetObjResult(interp));

    /* Check for error! If an error, message is result. */
    if (code == TCL_ERROR) {
        fprintf(stderr, "ERROR in script: %s\n", result);
        exit(1);
    }

    /* Print (normal) result if non-empty; we'll skip handling encodings for now */
    if (strlen(result)) {
        printf("%s\n", result);
    }

    /* Clean up */
    Tcl_DeleteInterp(interp);
    exit(0);
}
于 2012-12-13T09:58:23.610 に答える
0

私はそれを愛したと思います。あなたは正しかった。問題は、私が使用していたincludeメソッドにありました。cコードにtcl.h、tclDecls.h、tclPlatDecls.hのファイルが含まれていますが、これらのファイルはパス/ usr / includeに存在していなかったため、これらのファイルをそのディレクトリにコピーしていました。これは適切ではなかった可能性があります。する方法。最後に、これらのファイルを/ usr / includeにコピーせず、コンパイル中にインクルードパスを指定しました。実行可能ファイルを作成しましたが、ターミナルで適切な結果が得られています。ご協力いただきありがとうございます。

これが私が使用している正確なcコードです:

#include <tcl.h>
#include <tclDecls.h>
#include <tclPlatDecls.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main (int argc, char **argv) {
Tcl_Interp *interp;
int code;
char *result;

printf("inside main function \n");
//    Tcl_InitStubs(interp, "8.5", 0);
Tcl_FindExecutable(argv[0]);
interp = Tcl_CreateInterp();
code = Tcl_Eval(interp, "source simple_addition.tcl; add_two_nos");

/* Retrieve the result... */
result = Tcl_GetString(Tcl_GetObjResult(interp));

/* Check for error! If an error, message is result. */
if (code == TCL_ERROR) {
    fprintf(stderr, "ERROR in script: %s\n", result);
    exit(1);
}

/* Print (normal) result if non-empty; we'll skip handling encodings for now */
if (strlen(result)) {
    printf("%s\n", result);
}

/* Clean up */
Tcl_DeleteInterp(interp);
exit(0);

}

そして、このコードをコンパイルし、実行可能ファイルを生成するために、私は以下のコマンドを使用しています:

gcc simple_addition_wrapper_new.c -I/usr/include/tcl8.5/ -ltcl8.5 -o simple_addition_op

simple_addition_opファイルを実行しましたが、適切な結果が得られました。

inside main function 
c is 30 .......

DonalFellowsとJohannesに感謝します

于 2012-12-18T06:43:49.127 に答える