TCL TK 與 C 程式的整合

2021-03-31 08:56:59 字數 4212 閱讀 4146

tcl/tk 與 c 程式的整合

一、 簡介

比較tcl/tk 提供的快速而又容易的開發圖形擁護介面,x 程式顯得很煩瑣。tcl/tk 是一種指令碼語言,就象其它的一些指令碼語言一樣,也有很多事情不能夠做或很難做。解決途徑是聯合 c 與 tcl/tk 一起來開發. tcl/tk 系統提供c 程式呼叫tcl/tk 的直譯器來執行tcl/tk指令碼。提供的庫包括初始化變數的方法,呼叫不同的指令碼和訪問變數。利用這些混合變數對它們訪問x固有的特性也提供了好處。簡單的**和時間函式允許程式設計師制定事件,註冊乙個c函式為tcl/tk的過程的能力成為乙個強大的工具。這篇文件覆蓋了tcl/tk指令碼與c 整合的一些基礎知識。  編譯選項部分描述了變數庫幷包含了建立程式的必要檔案。初始化與註冊名令部分解釋了怎樣開始,怎樣從tcl/tk指令碼中呼叫c函式,最後一部分訪問變數闡述了怎樣來從c函式裡來讀與寫tcl/tk變數。

二、編譯選項

為了能訪問tcl/tk 庫,必須在你的源**中要設定一些常規的例程做並編譯它。有兩個呼叫庫的標頭檔案被宣告。

#include

#include

編譯混合應用程式需要指出正確的編譯目錄,正確的庫,並設定正確的連線標誌。在tcl/tk頂部的設定也是必須要包含的檔案。而下面的設定是在使用 g++ 時要設定的。你的系統依賴於編譯器和檔案的定位可能有不同的變化。

-i/software/tcl-7.4/include

-i/software/tk-4.0/include

-i/software/x11r5_dev/include

-l/software/tcl-7.4/lib

-l/software/tk-4.0/lib

-l/software/x11r5_dev/lib

-ltk

-ltcl

-lx11

三、初始化與註冊命令

建立混合 tcl/tk & c 應用程式的中心要圍繞幾條選擇命令。

首先就是"tk_main" 函式, 它用來控制整個 tcl/tk 直譯器程式。這條命令沒有返回值,因此,它需在你的"main" 函式中加下劃線,你所有程式的一旦初始化,"tk_main" 函式帶來三個變數。第二個變數是乙個字串型陣列,每個字串都有乙個特殊的含義。第乙個變數表示在這個陣列的元素個數。第三個變數是指向初始化函式的指標。此初始化函式在許多地方都要被執行。字串陣列通過"tk_main"來通知tcl/tk直譯器應用程式的名稱和tcl/tk 命令在指令碼中的位置。這個陣列實際上是傳給直譯器的命令列引數。陣列的第一項給出應用程式名稱,第二項給出了執行的指令碼位置。如果指令碼沒有在相同的執行目錄下,則需要完整路徑。由於繼承原因,tcl/tk 需要字串在許多函式裡可以修改,它也有函式作用範圍的問題,避免這些問題最早的辦法是傳遞時動態分配字串下面的**碎片顯示了呼叫利用"hello world" 應用程式和指令碼"hello.tcl"來呼叫 "tk_main"。

// prototype for the initialization function

int initproc( tcl_interp *interp );

// declare an array for two strings

char *ppszarg[2];

// allocate strings and set their contents

ppszarg[0] = (char *)malloc( sizeof( char ) * 12 );

ppszarg[1] = (char *)malloc( sizeof( char ) * 12 );

strcpy( ppszarg[0], "hello world" );

strcpy( ppszarg[1], "./hello.tcl" );

// the following call does not return

tk_main( 2, ppszarg, initproc );

初始化函式

"tk_main" 的呼叫控制了你的程式在tcl/tk中的整個呼叫,但是在底部初始化之後和tcl/tk 指令碼執行之前,能夠執行使用者自定義的函式。上面的例子中展示了這個型別的函式: "initproc". 使用者定義的初始化函式必須要返回乙個整數型別並產生乙個指向直譯器的引數tcl_interp *。在初始化函式裡面建立實際直譯器呼叫"tk_init"。"tk_init"函式設定乙個指向直譯器的引數,這正是傳遞到初始化函式的指標。下面的**僅只是初始化函式,更多的則是在後面列出。

int initproc( tcl_interp *interp )

// end if

return( tcl_ok );

} // end initproc

c函式作為 tcl/tk 過程

現在你要熟悉在tcl/tk 指令碼中的過程呼叫。當設計混合應用程式中有tcl/tk的過程呼叫c函式是可能的。完成它需要呼叫"tcl_create***mand" 函式。這是在初始化函式裡的常用做法。在tcl/tk 過程中呼叫函式就象呼叫其它的過程一樣。在tcl/tk 指令碼中存在就不必宣告這個過程。函式註冊有乙個特定原型的過程。它們必須要返回乙個整數型別,並設定4個變數,第乙個是tcl/tk庫檔案型別 "clientdata"。第二個變數是指向直譯器的指標。最後的兩個變數類似於在c "main"函式中的 "argc" 和 "argv" 這兩個變數被用於傳遞引數給tcl/tk 過程。引數"argc" 包含了傳遞給tcl/tk過程的引數個數"argv" 是字串陣列,每個字串包含了乙個引數。

int myfunc( clientdata data, tcl_interp *pinterp, int argc, char *argv );

當乙個函式被註冊作為tcl/tk 過程使用時需乙個指標與之聯絡,指標通過"clientdata"來傳遞進來。"clientdata"的概念允許程式設計師聯絡資料結構和物件,呼叫能引用這個物件的過程。這個結構不經常需要。象早先提到的註冊過程需要呼叫"tcl_create***mand" 函式。這個函式有5個引數。第乙個引數是指向直譯器的指標,第二個引數是在tcl/tk 中的過程名,第三個引數是乙個指向函式的指標,它在當tcl/tk過程被執行時呼叫。最後兩個引數是 "clientdata" 項, 乙個指標刪除例程。它允許c函式在程式退出為了清空聯絡物件的結構時被呼叫。象指向刪除函式的指標"clientdata"不經常呼叫。下面是 tcl/tk 過程呼叫"hey_there" 來呼叫上面宣告的"myfunc"進行註冊的例子。

tcl_create***mand( interp, "hey_there", myfunc, (clientdata)null,

(tcl_cmddeleteproc *)null );

變數訪問

在執行tcl/tk過程時能呼叫c函式並允許你從c中獲得tcl/tk的幫助,為了從tcl/tk 中獲得c的幫助,這有一系列函式,其中包含了從tcl/tk變數中處理獲得的資訊和設定的資訊。

tcl_getvar

"tcl_getvar" 函式返回乙個指向tcl/tk變數的字串指標。這個函式有三個引數:指向直譯器的指標,tcl/tk 變數的名稱,乙個標誌flag。這個變數在執行指令碼聯絡到直譯器的當前範圍被訪問。如果在當前範沒有區域性變數則訪問全域性變數。如沒有匹配的全域性變數存在則返回乙個錯誤。 flags引數允許你指定tcl_global_only, 為了使這個函式僅僅訪問此變數名的全域性變數,下面是tcl/tk 指令碼中被訪問的一部分**。

set say_hello_to "world"

下面的**是在c裡訪問tcl/tk變數"say_hello_to".

char shelloto[30];

// after this call shelloto should contain "world"

strncpy( shelloto, tcl_getvar( pinterp, "say_hello_to", 0 ), 29 );

tcl_setvar

"tcl_setvar"函式允許程式設計師修改tcl/tk變數的值。此函式有四個引數:第乙個是直譯器指標,第二個是要修改值的tcl/tk變數名稱,第三個是要修改的新值,最後乙個是tcl/tk標誌flags。"tcl_setvar" 的標誌flags跟"tcl_getvar"的相同。當設定期間遇到出錯時"tcl_setvar"函式返回null值。如果變數不存在,則此函式將在直譯器指標引用的指令碼內建立乙個新的變數。下面的**將設定tcl/tk變數"say_hello_to"的值為"world"。

tcl_setvar( pinterp, "say_hello_to", "world", 0 );

***bining c and tcl/tk

****

中文譯者:  陸紹飛

lua lua與C C 程式的整合

lua與c c 互動,主要靠lua api和向lua註冊好的函式。如下圖 注 luaglue就是讓lua指令碼中可呼叫的c 函式的介面。即那些註冊的函式。這裡起關鍵作用的要數lua state的結構,這就得講一下lua環境和lua stack。lua環境 lua環境由所有可操作的資料構成,如編譯好的...

QML與C 的整合

qml引擎與qt的元物件系統的整合,使得qml中可以直接呼叫c 的功能。只有qobject子類才能夠將資料或者函式提供給qml使用。由於qml引擎整合了qt元物件系統,由qobject派生的所有子類的屬性 方法和訊號燈都可以在qml中訪問。除了可以從qml中訪問c 的功能,在qt qml模組中也提供...

lua學習 lua與C C 程式的整合

lua與c c 互動,主要靠lua api和向lua註冊好的函式。如下圖 注 luaglue就是讓lua指令碼中可呼叫的c 函式的介面。即那些註冊的函式。這裡起關鍵作用的要數lua state的結構,這就得講一下lua環境和lua stack。lua環境 lua環境由所有可操作的資料構成,如編譯好的...