私は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;
}
:あなたはこのようなコードで終わるだろうか? – RHSeeger
はコードをトップに追加しました – astrohome
サイドノート:最近、定数文字列を 'Tcl_Eval'に安全に渡すことができます。 (これが8.4に当てはまるのであれば、私は覚えていませんが、8.5では間違いありません)。これは文字列を書込み可能なメモリに最初にコピーすることで混乱する必要がないことを意味します。物事を簡素化する! –