教你在C 程序裏調用TI-BASIC程序,看看是否有人對這個感興趣
昨天翻TIGCC的文檔,先瞅了瞅FAQ,話說我看文檔有個習慣,就是先看目錄,再看FAQ,由於FAQ聚集了不少人曾經遇到過的問題、犯過的錯誤, 並且涵蓋各類不一樣難度,很是值得一看。
在FAQ中看到教人用C程序調用TI-BASIC程序的示範代碼,正好我最近在 研究TI-BASIC,就想試試,原來的例程以下,我加了一下注釋,你會發現C語言的特色是從右往左執行:
api
// 在C中定義一個 函數,參數是TI-BASIC的程序名稱 void progrun(const char *name) { // 定義字符串變量 char fname[25]; // 定義一個HANDLE型指針變量 h,h 未來使用時會按照HANDLE結構動態分配一個內存塊,把內存塊入口地址關聯到 h ,h 實際是一個HANDLE結構型的內存指針變量 HANDLE h; // 把TI-BASIC程序名稱拷貝到咱們定義的字符串變量 fname 中 strcpy (fname, name); // 在 fname 追加"()",假設fname裏原來的數據是"myprgm",執行strcat後就變成"myprgm()" strcat (fname, "()"); // 解析字符串fname裏的表達式,而且把tokenized(標識化)的表達式內容所有壓入到表達式棧中 push_parse_text (fname); // 這個語句要從後往前分析:HS_popEStack () 作的是分配一個內存區域,而後把剛纔壓棧的表達式出棧,而且把出棧的內容拷貝到新分配的內存塊裏,最後把這個內存塊的地址當作一個結構指針變量返回給 h h = HS_popEStack (); TRY // 調用 NG_execute 來執行 h ,也就是執行 TI-BASIC 程序 NG_execute (h, FALSE); FINALLY // 最終執行完畢,釋放 h 使用的內存 空間 HeapFree (h); ENDFINAL }
最後在你的 main 函數裏調用 progrun 就能夠了,這裏假設你已經在 計算器上準備好了一個名爲 testprog 的TI-BASIC 程序
progrun ("testprog");
我用TIGCC在PC上編譯了一次,OK,又在 計算器上用GTC編譯了一次,也OK,下面是我稍做修改後的代碼,由於例子裏沒有讓TI-BASIC程序帶參數,我改寫了一個帶參數版本的,其實簡單,就是把你的PRGM的內容所有傳到 progrun 裏就能夠了,而後把追加括號的語句註釋掉便可。不過這個帶參數的 功能不徹底,由於TIGCC的 main函數沒有 argc 和 argv,因此我還沒搞清楚 如何在主程序中帶參數,所以這裏默認的PRGM程序名稱爲 apic(1,2) ,有兩個參數,因此你須要事先在計算器上建立一個名稱爲apic的PRGM程序,這個程序帶兩個參數。
下面是代碼: 函數
#define USE_TI89 #define OPTIMIZE_ROM_CALLS #define MIN_AMS 101 #include <tigcclib.h> void progrun(const char *name) { char fname[25]; HANDLE h; strcpy (fname, name); //strcat (fname, "()"); push_parse_text (fname); h = HS_popEStack (); TRY NG_execute (h, FALSE); FINALLY HeapFree (h); ENDFINAL } // Main Function void _main(void) { progrun ("apic(0,0)"); //progrun ("apic(0,100)"); ngetchx(); }
這裏是編譯好的程序,用法就是直接在home界面執行:
cb()
spa