日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Tcl/Tk 命令与C/C++的集成研究

發(fā)布時(shí)間:2024/5/15 c/c++ 90 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tcl/Tk 命令与C/C++的集成研究 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


Tcl/Tk 命令與C/C++的集成研究


1. 問題來源
????? 基于虛擬現(xiàn)實(shí)的維修性分析評(píng)價(jià)系統(tǒng)(以下簡(jiǎn)稱 VMSAS)是為適應(yīng)產(chǎn)品無紙?jiān)O(shè)計(jì)、分析、評(píng)審的需要,以人機(jī)工效商業(yè)軟件JACK 為平臺(tái),由本單位進(jìn)行二次開發(fā)形成的一個(gè)維修性設(shè)計(jì)分析評(píng)價(jià)系統(tǒng),主要功能包括樣機(jī)建模、動(dòng)作建模、維修仿真與檢測(cè)、維修性分析與評(píng)價(jià)等。
????? VMSAS 的使用全過程涉及大量數(shù)據(jù)。為確保VMSAS 滿足并行設(shè)計(jì)和集成設(shè)計(jì)的要求,成為一種實(shí)用、先進(jìn)的維修性設(shè)計(jì)分析工具,能夠與CAD 系統(tǒng)、工程分析系統(tǒng)緊密集成,就必須要解決數(shù)據(jù)獲取的授權(quán)、數(shù)據(jù)一致的保證、數(shù)據(jù)的集成、提交、審核與批準(zhǔn)等統(tǒng)一管理及權(quán)限等問題。

?????? 以上要求 VMSAS 與產(chǎn)品數(shù)據(jù)管理(PDM)系統(tǒng)進(jìn)行集成。二者之間的集成方案如圖1 所示。
PDM系統(tǒng)
應(yīng)用程序接口
系統(tǒng)集成接口
產(chǎn)品配置管理
產(chǎn)品結(jié)構(gòu)管理
變更管理
文檔管理
工作流管理
對(duì)象管理框架
RMS軟件
CAD軟件
Microsoft
Office
Adobe
Acorbat
VisView
VMSAS
系統(tǒng)
數(shù)據(jù)獲取
樣機(jī)準(zhǔn)備
虛擬樣機(jī)成熟
拆卸過程仿真
維修性分
析與評(píng)價(jià)
仿真過程分析
仿真過程記錄
分析與評(píng)價(jià)結(jié)果
人機(jī)和諧界面
人機(jī)交互界面
虛擬場(chǎng)景生成
虛擬環(huán)境管理
拆卸過程控制
Oracle
產(chǎn)品基本信息
產(chǎn)品可靠性數(shù)據(jù)
產(chǎn)品故障信息
分析評(píng)價(jià)準(zhǔn)則
虛擬設(shè)施工具等
產(chǎn)品CAD數(shù)據(jù)
維修性設(shè)計(jì)要求
虛擬人體模型
維修知識(shí)經(jīng)驗(yàn)
維修資源模型
維修任務(wù)及其
仿真分析數(shù)據(jù)
圖1 VMSAS 系統(tǒng)與PDM 系統(tǒng)集成框架
????? VMASA 以JACK 系統(tǒng)為平臺(tái)進(jìn)行二次開發(fā)的,JACK 有一套應(yīng)用程序開發(fā)接口(API)——JACKScript,JACKScript 提供了對(duì)JACK 場(chǎng)景進(jìn)行有效控制的途徑,可以使用Tcl、Python、Lisp 三種語言進(jìn)行交互以及二次開發(fā)。我們以Tcl/Tk 開發(fā)應(yīng)用程序,以Python 開發(fā)仿真腳本。選用UGS PLM Solution 公司的TeamCenter Enterprise 系統(tǒng)進(jìn)行開發(fā)來管理VMASA 中的數(shù)據(jù)。TeamCenter 系統(tǒng)中的應(yīng)用程序接口API 函數(shù)都是以C/C++語言開發(fā)的,以DLL 文件形式提供給用戶調(diào)用。故要在Tcl/Tk 環(huán)境中調(diào)用這些API 函數(shù),就要解決Tcl/Tk 命令與C/C++函數(shù)之間的接口問題。本文圍繞這個(gè)問題進(jìn)行討論。
????? 基金項(xiàng)目:國(guó)家自然科學(xué)基金資助項(xiàng)目:并行設(shè)計(jì)中產(chǎn)品維修性模型研究(編號(hào):50005023),“十五”武器裝備預(yù)研項(xiàng)目資助。
????? 作者簡(jiǎn)介:梁偉杰(1980.05~),男,漢族,碩士生,研究方向?yàn)榫S修性理論與應(yīng)用。通訊地址:石家莊軍械工程學(xué)院六系維修工程實(shí)驗(yàn)中心,050003。聯(lián)系電話:0311-86879059。蔣科藝(1977~),男,漢族,博士生,主要研究方向?yàn)樘摂M維修仿真以及應(yīng)用。呂劍鋒(1981~),男,漢族,碩士生,研究方向?yàn)榫S修性理論與應(yīng)用。
http://www.elecfans.com 電子發(fā)燒友 http://bbs.elecfans.com 電子技術(shù)論壇
2. Tcl/Tk 設(shè)計(jì)原理
在控制、仿真、檢測(cè)等多個(gè)領(lǐng)域,涉及大量專用系統(tǒng)的開發(fā)以及測(cè)試環(huán)境的建立,測(cè)試環(huán)境的建立異常繁瑣。人們力圖尋找一種新的編程語言,它既要有好的代碼可重用性,又要簡(jiǎn)單易學(xué),這樣就促成了Tcl(Tool Command Language,工具命令語言)的產(chǎn)生。其總體結(jié)構(gòu)如圖1所示:
擴(kuò)展層Tcl層應(yīng)用層
剖析器
初始化
命令循環(huán)
擴(kuò)展命令內(nèi)建命令應(yīng)用擴(kuò)展命令
圖1 TCL總體結(jié)構(gòu)簡(jiǎn)圖
Tcl 讓應(yīng)用程序由包含編譯代碼的大塊實(shí)體和一小部分用于配置和編寫高級(jí)命令的Tcl 代碼組成,把編程按照基于組件的方法來進(jìn)行,不同的組件有不同的功能,用于不同的目的。Tcl 有良好的擴(kuò)展性, 方便用戶為其增添新的功能模塊。Tcl 是一種集C/C++靈活強(qiáng)大的功能與BASIC 易學(xué)高效的風(fēng)格于一身的通用程序設(shè)計(jì)語言。
Tcl 是一種可嵌入的命令腳本化語言 (Command Script Language)。“可嵌入”是指把很多應(yīng)用有效,無縫地集成在一起。“命令”是指每一條 Tcl 語句都可以理解成命令加參數(shù)的形式:
????? Tk(Tool Kit)是基于Tcl 的圖形程序開發(fā)工具箱,是Tcl 的重要擴(kuò)展部件。Tcl/Tk 提供了足夠的可編程特性(變量、流程控制和過程),使得現(xiàn)有程序可以組裝成符合自己需要的復(fù)雜的腳本程序。Tcl 解釋器可以很容易地添加到已有應(yīng)用程序中去,這種能力將它與其他Shell 語言區(qū)分開來,它是一種擴(kuò)展語言的語言,用來配置和定制應(yīng)用程序。Tk 隱藏了許多C/C++ 程序的設(shè)計(jì)細(xì)節(jié),可快速地開發(fā)基于圖形界面窗口的程序。Tcl/Tk 可快速開發(fā)應(yīng)用程序及應(yīng)用系統(tǒng),在自控、仿真、測(cè)試系統(tǒng)、網(wǎng)絡(luò)管理、可視化應(yīng)用、CAD
等方面都有大量的應(yīng)用成果,在歐美的許多大學(xué)和實(shí)驗(yàn)室中都有廣泛的應(yīng)用。
????? 但Tcl/Tk畢竟是一種腳本語言,就象其它的一些腳本語言一樣,也有很多事情不能夠做或很難做。其解決途徑是聯(lián)合C/C++與Tcl/Tk共同開發(fā)。提供C/C++程序調(diào)用TCL/TK 的解釋器來運(yùn)行TCL/TK腳本。
3. C/C++函數(shù)注冊(cè)為Tcl/Tk 命令
?????? 用 C/C++語言很容易實(shí)現(xiàn)Tcl/Tk 命令的擴(kuò)展,而且用C/C++實(shí)現(xiàn)的命令比相應(yīng)的Tcl 命令執(zhí)行效率要高。在各種以C/C++實(shí)現(xiàn)的仿真檢測(cè)程序中可方便地調(diào)用Tcl/Tk 命令。實(shí)現(xiàn)Tcl 命令的C/C++代碼被稱之為命令過程(command procedure),命令過程的接口非常類似于主程序main 的接口,它的輸入是一個(gè)數(shù)組,包含了與Tcl 腳本命令變?cè)_切對(duì)應(yīng)的值,其結(jié)果就是Tcl 命令的結(jié)果。
?????? 在用戶的 C/C++程序中,為了能夠訪問TCL/TK 庫(kù),必須在源代碼聲明兩個(gè)調(diào)用庫(kù)的頭文件,即"tcl.h"
和"tk.h"兩個(gè)文件。要建立混合Tcl/Tk 和C/C++應(yīng)用程序,須按如下方式進(jìn)行:
3.1 調(diào)用"Tcl_Main"函數(shù)(Tk_Main 原理相同)
????? Tcl_Main(argc, argv, Tcl_AppInit),用來控制整個(gè)Tcl 解釋器程序,沒有返回值。這是一種較為高級(jí)的接口,可以替用戶創(chuàng)建解釋器、處理命令行變?cè)獊韴?zhí)行腳本,提供交互式命令循環(huán)等。"Tcl_Main"函數(shù)有三個(gè)變量:第一個(gè)變量表示在這個(gè)數(shù)組的元素個(gè)數(shù);第三個(gè)變量是指向初始化函數(shù)的指針;第二個(gè)變量是一個(gè)字符串型數(shù)組,每個(gè)字符串都有一個(gè)特殊的含義。字符串?dāng)?shù)組通"Tcl_Main"來通知Tcl/Tk 解釋器應(yīng)用程序的名稱和Tcl/Tk 命令在腳本中的位置。這個(gè)數(shù)組實(shí)際上是傳給解釋器的命令行參數(shù)。數(shù)組的第一項(xiàng)給出應(yīng)用程序名稱,第二項(xiàng)給出了運(yùn)行的腳本位置。
命令 [參數(shù) 1] [參數(shù) 2] [參數(shù) 3] [參數(shù) 4] ...... [參數(shù) N]
http://www.elecfans.com 電子發(fā)燒友 http://bbs.elecfans.com 電子技術(shù)論壇
3.2 初始化函數(shù)
????? "Tcl_Main"的調(diào)用控制了程序在Tcl/Tk 中的整個(gè)調(diào)用,但是在底部初始化之后和Tcl/Tk 腳本運(yùn)行之前,能夠執(zhí)行用戶自定義的函數(shù)。在從Tcl/Tk 腳本中使用命令過程之前,必須提供該命令過程的初始化注冊(cè)過程,為了使用Tcl 解釋器,應(yīng)用程序首先產(chǎn)生一個(gè)稱之為解釋器(interpreter)的對(duì)象。此時(shí),如果要將自己的擴(kuò)展模塊創(chuàng)建為共享庫(kù),此初始化過程的名稱必須以“_Init”來結(jié)束,如TclApi_Init,Random_Init等。當(dāng)Tcl/Tk 腳本加載這個(gè)庫(kù)的時(shí)候就會(huì)自動(dòng)調(diào)用這個(gè)過程。
3.3 C/C++函數(shù)注冊(cè)為Tcl/Tk 過程
????? C/C++函數(shù)在Tcl 中注冊(cè)時(shí)需調(diào)用一個(gè)特定的原型函數(shù),此函數(shù)返回一個(gè)整數(shù)類型,并設(shè)置4 個(gè)變量,第一個(gè)是Tcl/Tk 庫(kù)文件類型"ClientData";第二個(gè)變量是指向解釋器的指針;最后的兩個(gè)變量類似于在C/C++ "main"函數(shù)中的"argc"和 "argv"這兩個(gè)變量被用于傳遞參數(shù)給Tcl/Tk 過程。參數(shù)"argc"包含了傳遞給Tcl/Tk 過程的參數(shù)個(gè)數(shù)"argv" 是字符串?dāng)?shù)組,每個(gè)字符串包含了一個(gè)參數(shù)。如下所示:
int TclApi(ClientData clientData, Tcl_Interp *interp,int argc,char *argv[]);
當(dāng)一個(gè)函數(shù)被注冊(cè)作為Tcl/Tk 過程使用時(shí)需一個(gè)指針與之聯(lián)系,指針通過"ClientData"來傳遞進(jìn)來。
"ClientData"的概念允許程序員聯(lián)系數(shù)據(jù)結(jié)構(gòu)和對(duì)象,調(diào)用能引用這個(gè)對(duì)象的過程。3.2 中提到的注冊(cè)過程需要調(diào)用"Tcl_CreateCommand"函數(shù),此函數(shù)有5 個(gè)參數(shù):第一個(gè)參數(shù)是指向解釋器的指針;第二個(gè)參數(shù)是在Tcl/Tk 中的過程名;第三個(gè)參數(shù)是一個(gè)指向函數(shù)的指針,它在Tcl/Tk 過程被執(zhí)行時(shí)調(diào)用;最后兩個(gè)參數(shù)是"ClientData"項(xiàng)和一個(gè)指針刪除例程。如下面例子所示,Tcl/Tk 將"TclApi"函數(shù)注冊(cè)為" tcl_app"命令:
Tcl_CreateCommand(interp, "tcl_app", TclApi, (ClientData)NULL,(Tcl_CmdDeleteProc *)NULL );
3.4 變量訪問
在執(zhí)行Tcl/Tk 過程時(shí)能調(diào)用C/C++函數(shù),并可從C/C++中通過一些函數(shù)獲得Tcl/Tk 的幫助。
"Tcl_GetVar"函數(shù)返回一個(gè)指向Tcl/Tk 變量的字符串指針。此Tcl/Tk 變量在執(zhí)行腳本聯(lián)系到解釋器的當(dāng)前范圍被訪問,如果在當(dāng)前范沒有局部變量則訪問全局變量,如沒有匹配的全局變量存在則返報(bào)告錯(cuò)誤。
下面是Tcl/Tk 腳本中被訪問的一部分代碼。
set a_prd_tree_name "1966PZ152"
下面是在C/C++代碼中訪問Tcl/Tk 變量:"a_prd_tree_name"
char PTName_001 [10];
strncpy(PTName_001, Tcl_GetVar( pInterp, "a_prd_tree_name", 0 ), 9 );
這樣,變量PTName_001 的值就變?yōu)榱?#34;1966PZ152"。
"Tcl_SetVar"函數(shù)允許程序修改Tcl/Tk 變量的值。
綜上所述,若要實(shí)現(xiàn)Tcl/Tk 命令調(diào)用C/C++ API,則被調(diào)用的API 需具有以上特定結(jié)構(gòu),可給此API構(gòu)造一個(gè)具有以上特性的“外殼”,如圖2 所示:
擁有Tcl解釋器的C/C++函數(shù)
函數(shù)的Tcl初始化過程
Tcl/Tk腳本中要調(diào)用的DLL
中的C/C++函數(shù)
C/C++函數(shù)注冊(cè)為Tcl/Tk命令
Tcl/Tk命令C/C++過程
圖 2 Tcl/Tk 調(diào)用C/C++函數(shù)
4. Tcl/Tk 命令調(diào)用PDM 系統(tǒng)API 函數(shù)的一個(gè)實(shí)例
如何在 Tcl/Tk 命令實(shí)現(xiàn)的系統(tǒng)中調(diào)用C/C++ DLL 中的函數(shù)是筆者在VMSAS 系統(tǒng)與某PDM 系統(tǒng)進(jìn)行集成時(shí)遇到的問題。有人寫過一個(gè)可以將C/C++ API 輸出為Tcl 命令的工具,叫做SWIG(Simple WrapperInterface Generator)。這個(gè)工具的缺點(diǎn)是C/C++的代碼必須可知,并且SWIG 生成的C 接口對(duì)于腳本編寫
http://www.elecfans.com 電子發(fā)燒友 http://bbs.elecfans.com 電子技術(shù)論壇
人員并不友好,而手工編制的Tcl 接口要好得多。
例如,用戶要登錄 PDM 系統(tǒng),首先必須要進(jìn)行驗(yàn)證,此時(shí)用到一個(gè)baseapi.dll 中的函數(shù):
int clLogin2(char UsrName[], char Password[], int mfail)
要在Tcl/Tk 腳本中調(diào)用這個(gè)函數(shù)。可按如下方式進(jìn)行:
1)、生成DLL 必要信息
#include "stdio.h"
#include "string.h"
#include "windows.h"
#include "tcl.h"
#ifndef DECLSPEC_EXPORT
#define DECLSPEC_EXPORT __declspec(dllexport)
#endif
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) { return TRUE; }
2)、引用這個(gè)函數(shù)
#pragma comment(lib, "/yourPath/baseapi.dll")
extern "C" _declspec(dllimport) int clLogin2(char UsrName[], char Password[], int mfail);
3)、對(duì)應(yīng)的擁有Tcl 解釋器的形式
int clLogin2Cmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]);
4)、對(duì)此函數(shù)進(jìn)行初始化
EXTERN_C int DECLSPEC_EXPORT clLogin2_Init(Tcl_Interp* interp) // 此處必須加“_Init”后綴
{ // 將此C 過程注冊(cè)為Tcl 命令
Tcl_CreateCommand(interp, " clloginto",
(Tcl_CmdProc *)ClLogin2Cmd, // 調(diào)用第4 步實(shí)現(xiàn)
(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
Tcl_PkgProvide(interp, " clloginto ", "0.1"); // 給此注冊(cè)的Tcl 命令一個(gè)版本號(hào)0.1
}
5)、具體的實(shí)現(xiàn)
int clLogin2Cmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[ ] )
{ char usr[]; char psword[];
int error1, error2, error3, mfail, dstat;
clLogin2_Init(interp); // 必須先調(diào)用函數(shù)初始化過程
if (argc > 4)
{ interp->result = "Usage: clloginto ?range?";
return TCL_ERROR; }
if (argc == 4)
{ // 使用 Tcl_GetString 接受字符串參數(shù):
error1 = Tcl_GetInt(interp, argv[1], usr);
if (error1 != TCL_OK) return error1;
error2 = Tcl_GetString(interp, argv[2], psword);
if (error2 != TCL_OK) return error2;
error3 = Tcl_GetInt(interp, argv[3], mfail);
if (error3 != TCL_OK) return error3;
}
dstat = ClLogin2(usr, psword, mfail); // 在此調(diào)用C DLL 中的函數(shù)
return dstat; // 返回登錄狀態(tài)值,由此可以進(jìn)行用戶登錄驗(yàn)證
}
http://www.elecfans.com 電子發(fā)燒友 http://bbs.elecfans.com 電子技術(shù)論壇
可將上述實(shí)現(xiàn)在C/C++編譯器中生成一個(gè)DLL 文件,這個(gè)DLL 中的函數(shù)就可以由Tcl/Tk 經(jīng)過pkg_mkIndex 和package require 命令處理就可調(diào)用了。以上只是一個(gè)簡(jiǎn)單的示例,其它函數(shù)可以相應(yīng)地進(jìn)行處理,也可以用宏實(shí)現(xiàn)大量函數(shù)的轉(zhuǎn)化,此處不再贅述。
5. 小結(jié)
通過以上的分析,實(shí)現(xiàn)了在Tcl/Tk 腳本中調(diào)用C/C++ DLL 中的函數(shù)。并在VMSAS 與某PDM 系統(tǒng)集成中進(jìn)行了驗(yàn)證。
此種方法對(duì)于其它的以Tcl/Tk 實(shí)現(xiàn)的仿真或檢測(cè)系統(tǒng)中,為提高運(yùn)行效率或提供新的功能而引入C/C++函數(shù)進(jìn)行擴(kuò)展的情況,都有一定的參考意義。
參考文獻(xiàn):
[1] 郝建平,蔣科藝等,基于虛擬維修仿真的維修性分析評(píng)價(jià)及系統(tǒng)實(shí)現(xiàn),數(shù)字制造科學(xué),2004.12
[2] Brent B. Welch. Tcl/ tk 組合教程。王道義,喬陶鵬等譯。北京:電子工業(yè)出版社,2002.6
[3] 王堅(jiān),金革,Tcl/Tk 和 C 語言的接口,計(jì)算機(jī)應(yīng)用,2000.12
[4] 周波,楊貫中,蔡宇輝,TCL/TK 語言結(jié)構(gòu)分析及其在網(wǎng)絡(luò)教學(xué)中的應(yīng)用,計(jì)算機(jī)工程,2002.4
[5]
http://www.swing.org
[6] news://comp.lang.tcl
[7] http://www.tclchina.com
[8] http://etude.uwaterloo.ca/~ctrudeau/lessons/tcl_tk/tcl_C.html

總結(jié)

以上是生活随笔為你收集整理的Tcl/Tk 命令与C/C++的集成研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。