TI-89T 教你在C程序裏調用TI-BASIC程序,看看是否有人對這個感興趣

教你在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

相關文章
相關標籤/搜索