2011-06-21 17 views
3

私はTcl & Tkで書かれた、新しくコンパイルされたプログラムを実行しようとしています。それは私がエラーを取得する実行している場合:tcl_findLibraryが動作しません

[email protected]:~/Документы/Simon$ sudo ./simon1 
invalid command name "tcl_findLibrary" 

私はUbuntuの11.04を実行しています、私は、Tcl & Tkを(私は正常にプログラムを構築することができた原因)がインストールされています。

私は願い実行している場合:

% tcl_findLibrary 
wrong # args: should be "tcl_findLibrary basename version patch initScript enVarName varName" 

を誰が助けてもらえますか?

main(int argc, char *argv[]) 
{ 
    Tcl_Interp *interp; 
    int main_window; 

    char *args; 
    char buf[20]; /* intermediate storage to pass a value to TCL */ 
    char *tcl_command; /* points to a string of a TCL command line */ 
    int tcl_return_value;/* is either TCL_OK or TCL_ERROR */ 

    interp = Tcl_CreateInterp(); 

    /* Command line arguments are passed to TCL. TCL stores in argv0 the name 
    of the command, that is argv[0], in argv all other arguments, and in 
    argc the number of arguments. */ 

    args = Tcl_Merge(argc - 1, argv+1); 
    Tcl_SetVar(interp, "argv", args, TCL_GLOBAL_ONLY); 
    ckfree(args); /* Tcl_Merge allocates memory for the returned string */ 

    sprintf(buf, "%d", argc - 1); 
    Tcl_SetVar(interp, "argc", buf, TCL_GLOBAL_ONLY); 

    Tcl_SetVar(interp, "argv0", argv[0], TCL_GLOBAL_ONLY); 

    /* Create main window and do some initialization for Tcl/Tk */ 
    main_window = Tk_Init(interp); 
    if (main_window != TCL_OK) { 
     fprintf(stderr, "%s\n", interp->result); 
     exit(1); 
    } 

    if (Tcl_AppInit(interp) == TCL_ERROR) { 
     printf("%s\n",interp->result); 
     exit(1); 
    } 


    /* testing if environment variable SIMON_PATH is specified */ 
    tcl_return_value = Tcl_Eval(interp, 
      "if {![info exist env(SIMON_PATH)]} {" 
      "puts \"Environment variable SIMON_PATH is missing!\";" 
      "exit }"); 

    /* Evaluate my GUI simon.tk */ 

    /* the 33 is the lenght of the string "source $env(SIMON_PATH)/simon.tk" */ 
    tcl_command = (char *)MyMalloc(33 * sizeof(char)); 
    strcpy(tcl_command,"source $env(SIMON_PATH)/simon.tk"); 

    tcl_return_value = Tcl_Eval(interp, tcl_command); 
    if (*interp->result != 0) printf("%s \n", interp->result); 
    if (tcl_return_value != TCL_OK) 
    { 
     printf("simon.tk at line: %d\n",interp->errorLine); 
     exit(1); 
    } 

    /* Waiting for interactive events. */ 

    Tk_MainLoop(); 
} 

int Tcl_AppInit(Tcl_Interp *interp) 
{ 
    if (Tcl_Init(interp) == TCL_ERROR) { 
     return TCL_ERROR; 
} 
    if (Tk_Init(interp) == TCL_ERROR) { 
     return TCL_ERROR; 
} 
    Tcl_CreateCommand(interp, "set_parser", SET_Parser, (ClientData) NULL, 
     (Tcl_CmdDeleteProc *) NULL); 
    Tcl_CreateCommand(interp, "set_c2tcl_data", SET_C2TclData, 
     (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); 

    Tcl_CreateCommand(interp, "set_free_and_reset_module_data", 
     SET_FreeAndResetModuleData, 
     (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); 
    Tcl_CreateCommand(interp, "set_free_and_reset_global_data", 
     SET_FreeAndResetGlobalData, 
     (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); 
    Tcl_CreateCommand(interp, "set_reset_sim_control_parameter", 
     SET_ResetSimControlParameter, 
     (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); 
    Tcl_CreateCommand(interp, "set_random_number", SET_RandomNumber, 
     (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); 
    Tcl_CreateCommand(interp, "set_scale_graph_data", SET_ScaleGraphData, 
     (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); 

    return TCL_OK; 
} 
+0

:あなたはこのようなコードで終わるだろうか? – RHSeeger

+0

はコードをトップに追加しました – astrohome

+0

サイドノート:最近、定数文字列を 'Tcl_Eval'に安全に渡すことができます。 (これが8.4に当てはまるのであれば、私は覚えていませんが、8.5では間違いありません)。これは文字列を書込み可能なメモリに最初にコピーすることで混乱する必要がないことを意味します。物事を簡素化する! –

答えて

2

あなたはOKですが、あなたは(ライブラリを初期化する)Tcl_FindExecutable最初の呼び出しを必要とTcl_CreateInterp代わりのTcl_Mainを呼んでいます。 TclのCインターフェイスへの最初の呼び出しは、Tcl_FindExecutableまたはTcl_Mainのいずれかでなければなりません(Tcl_FindExecutableが呼び出されるためです)。 Tclが初期化されていないとき、あらゆる種類の奇妙なことが間違っている可能性があります。その場合、コードの正しい動作を保証するものではありません。

コードを確認した後、Tk_MainTcl_Mainなど、Tk対応)の使用に切り替えることをおすすめします。あなたはTclインタプリタを初期化するために使用しているコードを表示することができます

static int AppInit(Tcl_Interp *interp) { 
    /* Basic init */ 
    if (Tcl_Init(interp) == TCL_ERROR) 
     return TCL_ERROR; 
    if (Tk_Init(interp) == TCL_ERROR) 
     return TCL_ERROR; 
    Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit); 
    /* Make your commands here */ 
    Tcl_CreateCommand(interp, "set_parser",   SET_Parser, NULL, NULL); 
    Tcl_CreateCommand(interp, "set_c2tcl_data",  SET_C2TclData, NULL, NULL); 
    Tcl_CreateCommand(interp, "set_random_number", SET_RandomNumber, NULL, NULL); 
    Tcl_CreateCommand(interp, "set_scale_graph_data", SET_ScaleGraphData, NULL, NULL); 
    Tcl_CreateCommand(interp, "set_free_and_reset_module_data", 
      SET_FreeAndResetModuleData, NULL, NULL); 
    Tcl_CreateCommand(interp, "set_free_and_reset_global_data", 
      SET_FreeAndResetGlobalData, NULL, NULL); 
    Tcl_CreateCommand(interp, "set_reset_sim_control_parameter", 
      SET_ResetSimControlParameter, NULL, NULL); 
    /* Can't remember if you need this */ 
    Tcl_SetVar(interp, "tcl_rcFileName", "~/.simonrc", TCL_GLOBAL_ONLY); 
    /* Now your remaining initialization - assume no error for this! */ 
    Tcl_Eval(interp, 
      "if {![info exist env(SIMON_PATH)]} {" 
      "puts \"Environment variable SIMON_PATH is missing!\";" 
      "exit }"); 
    /* Read your startup code */ 
    return Tcl_Eval(interp, "source $env(SIMON_PATH)/simon.tk"); 
} 
int main(int argc, char **argv) { 
    Tk_Main(argc, argv, AppInit); 
    return 0; /* Not Reached */ 
} 
+0

ありがとう!すべての作品は完璧! – astrohome

関連する問題