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