cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 4505|回复: 4

[89/92/V200] TI-89T 教你在C程序里调用TI-BASIC程序,看看是否有人对这个感兴趣

[复制链接]
发表于 2012-6-19 16:26:22 | 显示全部楼层 |阅读模式
本帖最后由 FreeBlues 于 2012-6-19 16:36 编辑

教你在C程序里调用TI-BASIC程序,看看是否有人对这个感兴趣
昨天翻TIGCC的文档,先瞅了瞅FAQ,话说我看文档有个习惯,就是先看目录,再看FAQ,因为FAQ汇集了很多人曾经遇到过的问题、犯过的错误,而且涵盖各种不同难度,非常值得一看。

在FAQ中看到教人用C程序调用TI-BASIC程序的示范代码,正好我最近在研究TI-BASIC,就想试试,原来的例程如下,我加了一下注释,你会发现C语言的特点是从右往左执行:

// 在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()

cb.89z (450 Bytes, 下载次数: 108)
发表于 2012-6-19 18:42:59 | 显示全部楼层
这些TIGCC的文档里都有讲,
类似的,可以在C程序中使用CAS或标准库里没有的数学函数来简化程序

充分体现 ti-89的扩展性...
 楼主| 发表于 2012-6-20 01:27:47 | 显示全部楼层
这些TIGCC的文档里都有讲,
类似的,可以在C程序中使用CAS或标准库里没有的数学函数来简化程序

充分体现 ti-89的扩展性...
Wudy 发表于 2012-6-19 18:42

其实搞这个的真正目的是想了解下通过C调用TI-BASIC的方式,是不是把整个TI-BASIC的环境设置都照搬过来了,最近玩TI-BASIC,画图时不太喜欢屏幕上面的那个菜单条,占了不少位置,TI-BASIC没有提供设置来取消显示,就想看看通过C调用的BASIC会不会只调用画图代码,能否实现全屏,可惜的是结果依旧。

顺手就写个教程,作为一个热身,因为后续准备在这里为编程新手写一个与TI-BASIC的部分画图功能相关的编程内容的系列教程,所以先发这篇抛个砖试试,看看有多少人对TI-BASIC感兴趣。
发表于 2012-6-20 08:17:24 | 显示全部楼层
说到这个
ns与89类似
ti-lua可以调用ti-basic语句,也可以自己构造菜单
但是绘图功能放到了ti-lua中
官方说法是:
“在LUA 中,可非常简单的调用draw。。这个变化的原因是Nspire 变成了类似Window的界面”
另外,ndless同样可以调用ti-lua脚本
 楼主| 发表于 2012-6-20 22:14:13 | 显示全部楼层
说到这个
ns与89类似
ti-lua可以调用ti-basic语句,也可以自己构造菜单
但是绘图功能放到了ti-lua中
官方说法是:
“在LUA 中,可非常简单的调用draw。。这个变化的原因是Nspire 变成了类似Win ...
wtof1996 发表于 2012-6-20 08:17


没怎么用过LUA,只知道它非常小,比较适合用来写游戏脚本,比如魔兽什么的,我觉得应该可以编译一个专门用于TI-89T的LUA版本
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cnCalc计算器论坛

GMT+8, 2024-4-18 16:00 , Processed in 0.069394 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表