2009年4月3日 星期五

Tcl Extending

creating new TCL pakage from C source using swig

it’s created by me in my second year in my uni.

maybe it’s a little defect for the document ,don’t care plz!!! thx..

目前在世面上,大約有二種方法是較常用來擴充Tcl模組的方法,一種是利用Tcl目錄裡, include資料夾裡的.h檔來進行,大部份都只用到tcl.h, 也有tk.h是用來包給tk用的。

今天我要介紹的方法,是利用世面上一個叫做swig的軟體,它神奇之處在於你不必使用太繁複的方法宣告很多tcl.h的資料形態,你只需要以平常寫C的方式,寫出你要用的程式片斷,在底下我以example.c命名,並且寫出一個介面(interface),用來宣告在Tcl底下,Tcl如何來引用我的example.c,我把這個檔案命名為example.i,以下的操作環境為ubuntu 8.04,因為手邊暫時沒有windwos系統,請大家見諒。






Swig官方網站

http://www.swig.org/

/* example.c /

#include <stdio.h>

//寫一個函式來列出99乘法表,有二個引數,第一個是開始的數字,第二個是結束的數字。

void print99(int start,int end){
int i,j;
for(i=start;i<=end;i++){
for(j=1;j<=9;j++)
printf(“%d%d=%2d “,i,j,ij);
printf(“\n”);
}
}



/ example.i /

//以下開始大家必須照著它的格式寫,大部份是套用巨集,不過比起我們自己引入tcl.h來撰寫要簡單多了。

%module example

%{

//以下可以把你寫好的函式列在下方,當在swig轉換時,它自動會被置換。

extern void print99(int start,int en);

%}

//上面寫了幾個,下面也要寫幾個。

extern void print99(int start,int en);

//利用swig -tcl指令,可以把example.c包成 example_wrap.c



jerry@jerry-laptop:~/swig$ swig -tcl example.i



//利用超級使用者的身份編譯(sudo->superuser do)gcclinux內建來編譯ccompiler,-fpic是在建立獨立狀態的code, -c是不進行連結程式碼連結,/opt/ActiveTcl-8.4/include/



是我的Tcl include資料夾的位置。

jerry@jerry-laptop:~/swig$ sudo gcc -fpic -c example.c example_wrap.c -I/opt/ActiveTcl-8.4/include/



//shared是建立動態連結share library(so),在windows的環境下,稱作dynamic link library(DLL)-o是指定目地檔的檔名。



jerry@jerry-laptop:~/swig$ gcc -shared example.o example_wrap.o -o example.so





//執行tcl



jerry@jerry-laptop:~/TclBin$ sudo ./tclsh



//讀我放置example.so的檔案



% load ~/swig/example.so



//這時候print99tcl中已經被宣告為一組指令了,後面跨二個引數



//1印到8



% print99 1 8



11= 1 12= 2 13= 3 14= 4 15= 5 16= 6 17= 7 18= 8 19= 9

21= 2 22= 4 23= 6 24= 8 25=10 26=12 27=14 28=16 29=18

31= 3 32= 6 33= 9 34=12 35=15 36=18 37=21 38=24 39=27

41= 4 42= 8 43=12 44=16 45=20 46=24 47=28 48=32 49=36

51= 5 52=10 53=15 54=20 55=25 56=30 57=35 58=40 59=45

61= 6 62=12 63=18 64=24 65=30 66=36 67=42 68=48 69=54

71= 7 72=14 73=21 74=28 75=35 76=42 77=49 78=56 79=63

81= 8 82=16 83=24 84=32 85=40 86=48 87=56 88=64 89=72





//4印到6



% print99 4 6

41= 4 42= 8 43=12 44=16 45=20 46=24 47=28 48=32 49=36

51= 5 52=10 53=15 54=20 55=25 56=30 57=35 58=40 59=45

61= 6 62=12 63=18 64=24 65=30 66=36 67=42 68=48 69=54

%




沒有留言:

張貼留言