【文件属性】:
文件名称:tcl 入门学习.md
文件大小:232B
文件格式:MD
更新时间:2023-08-02 17:32:14
tcl
## 1 自定义命令
(1)编写自定义命令
> 1 编写自定义命令内容
> 2 注册指定命令
```tcl
/*
*set up numbers sort command
*/
#include
#include
#include
#include
// numbers sort
int NumSort(ClientData ClientData, Tcl_Interp *Interp,
int objc, Tcl_Obj *const objv[]) {
double arr[objc], tmp;
char *pstr, *pstr2;
char buf[100];
int cnt = 1, cnt2 = 0, i = 0;
//1. string convert number,numbers sort
for(cnt = 1; cnt < objc; ++cnt) {
//1.1 string convert number
tmp = atof(Tcl_GetString(objv[cnt]));
//1.2 numbers sort
if(cnt == 1) arr[0] = tmp;
else {
for(cnt2 = cnt-1; cnt2 > 0; --cnt2) {
if(tmp >= arr[cnt2 -1]) {
arr[cnt2] = tmp;
break;
}
else arr[cnt2] = arr[cnt2 -1];
}
}
}
//2. numbers convert string and return
for(cnt2 = 0; cnt2 < objc -1;++cnt2) {
Tcl_AppendResult(Interp,gcvt(arr[cnt2], sizeof(arr[cnt2]), buf),
" ",NULL);
}
return 0;
}
int Numsort_Init(Tcl_Interp *Interp) {
//login command
Tcl_CreateObjCommand (Interp, "numsort", NumSort, 0, 0);
return TCL_OK;
}
```
> 注解:
(1)初始化函数Init的名字必须是文件名首字母大写+"_Init",上文c文件名是numsort.c,
故初始化函数名为Numsort_Init;
## 2 编译生成动态库
(1) 格式:
gcc -fPIC -shared ____.c -o lib____.so
```
$ gcc -fPIC -shared numsort.c -o libnumsort.so
```
> 注解:
(1) ____.c 代表要进行编译的C文件名
(2)lib___是lib+C文件名,生成动态库的库名为lib__.so
## 3 加载动态库
(1) 格式:
load libname
```tcl
% load libnumsort.so
```
## 4 调用自定义命令
(1) commondname args
```tcl
% numsort 1 1.1 2 2.2 22 3.3 90 2.5 11.11
1 1.1 2 2.2 2.5 3.3 11.11 22 90
```
## 1 自定义命令
(1)编写自定义命令
> 1 编写自定义命令内容
> 2 注册指定命令
```tcl
/*
*set up numbers sort command
*/
#include
#include
#include
#include
// numbers sort
int NumSort(ClientData ClientData, Tcl_Interp *Interp,
int objc, Tcl_Obj *const objv[]) {
double arr[objc], tmp;
char *pstr, *pstr2;
char buf[100];
int cnt = 1, cnt2 = 0, i = 0;
//1. string convert number,numbers sort
for(cnt = 1; cnt < objc; ++cnt) {
//1.1 string convert number
tmp = atof(Tcl_GetString(objv[cnt]));
//1.2 numbers sort
if(cnt == 1) arr[0] = tmp;
else {
for(cnt2 = cnt-1; cnt2 > 0; --cnt2) {
if(tmp >= arr[cnt2 -1]) {
arr[cnt2] = tmp;
break;
}
else arr[cnt2] = arr[cnt2 -1];
}
}
}
//2. numbers convert string and return
for(cnt2 = 0; cnt2 < objc -1;++cnt2) {
Tcl_AppendResult(Interp,gcvt(arr[cnt2], sizeof(arr[cnt2]), buf),
" ",NULL);
}
return 0;
}
int Numsort_Init(Tcl_Interp *Interp) {
//login command
Tcl_CreateObjCommand (Interp, "numsort", NumSort, 0, 0);
return TCL_OK;
}
```
> 注解:
(1)初始化函数Init的名字必须是文件名首字母大写+"_Init",上文c文件名是numsort.c,
故初始化函数名为Numsort_Init;
## 2 编译生成动态库
(1) 格式:
gcc -fPIC -shared ____.c -o lib____.so
```
$ gcc -fPIC -shared numsort.c -o libnumsort.so
```
> 注解:
(1) ____.c 代表要进行编译的C文件名
(2)lib___是lib+C文件名,生成动态库的库名为lib__.so
## 3 加载动态库
(1) 格式:
load libname
```tcl
% load libnumsort.so
```
## 4 调用自定义命令
(1) commondname args
```tcl
% numsort 1 1.1 2 2.2 22 3.3 90 2.5 11.11
1 1.1 2 2.2 2.5 3.3 11.11 22 90
```