cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 24553|回复: 27

[TI-Nspire系列] Nspire机上C解释器 dPicoC v2.11 beta1

[复制链接]
发表于 2013-6-23 21:31:45 | 显示全部楼层 |阅读模式
计算器程序
程序名称: dPicoC v2.11 beta1
平台: TI-Nspire 
系统/软件要求: 需要ndless!
版本号: 2.11
类型: 其他 
作者: //移植--diameter直径君(Anderain)
大小(K): 91
更新日期: 2013-06-23
描述: on-calc C语言解释器。
增加更多模式
增加更多函数
已知缺陷: --欢迎找bug
源代码: 闭源
本帖最后由 ExAcler 于 2015-2-1 22:24 编辑

变更日志      
v2.11
          -   增加 <OS.h><math.h>支持。但只有部分函数被支持
          -   增加脚本模式,工程模式,配置模式
v2.10
          -  Nspire版本放出

截图

主界面:
main.png
测试(未完成的)小游戏:EvilSword:

test1.png
设置:
config.png
附件:(包含主程序,完整说明文档,程序例)
dPicoC.zip (446.07 KB, 下载次数: 519)
函数支持见2L。

 楼主| 发表于 2013-6-23 21:31:51 | 显示全部楼层
本帖最后由 diameter 于 2013-6-23 21:43 编辑

内建头文件/函数列表
新添加的函数以粗体标注
stdio.h
int sprintf(char *, char *,...);
int puts(char *);
char * gets(char *);
void cls();
int printf(char*,...);
FILE *fopen(char *, char *);
FILE *freopen(char *, char *, FILE *);
int fclose(FILE *);
int fread(void *, int, int, FILE *);
int fwrite(void *, int, int, FILE *);
int fgetc(FILE *);
int getc(FILE *);
char *fgets(char *, int, FILE *);
int fputc(int, FILE *);
int fputs(char *, FILE *);
int feof(FILE *);
int ftell(FILE *);
int fseek(FILE *, int, int);
stdlib.h
float atof(char *);
int atoi(char *);
int atol(char *);
int strtol(char *,char **,int);
void *malloc(int);
void *calloc(int,int);
void *realloc(void *,int);
void free(void *);
int rand();
void srand(int);
void abort();
void exit(int);
char *getenv(char *);
int abs(int);
int labs(int);
string.h
void *memcpy(void *,void *,int);
void *memmove(void *,void *,int);
void *memchr(char *,int,int);
int memcmp(void *,void *,int);
void *memset(void *,int,int);
char *strcat(char *,char *);
char *strncat(char *,char *,int);
char *strchr(char *,int);
char *strrchr(char *,int);
int strcmp(char *,char *);
int strncmp(char *,char *,int);
char *strcpy(char *,char *);
char *strncpy(char *,char *,int);
ctype.h
int isalnum(int);
int isalpha(int);
int isblank(int);
int iscntrl(int);
int isdigit(int);
int isgraph(int);
int islower(int);
int isprint(int);
int ispunct(int);
int isspace(int);
int isupper(int);
int isxdigit(int);
int tolower(int);
int toupper(int);
math.h
double sin(double);
double cos(double);
double tan(double);
double sqrt(double);
double fabs(double);
double ln(double);
double log(double);
double exp(double);
double pow(double);
os.h
int  is_incolor();
void setpixel(int x,int y,int color);
int  getpixel(int x,int y);
void setpixelbuf(unsigned char*scrbuf,int x,int y,int  color);
int  getpixelbuf(unsigned char*scrbuf,int x,int  y);
void wait_key();
void wait_no_key();
int  getch();
void clrscr();
unsigned char * get_scr_base_addr();
int  get_scr_byte_size();
int  msgbox  (char*title,char*msg);
int   msgbox2b(char*title,char*msg,char*button1,char*button2);
int   msgbox3b(char*title,char*msg,char*button1,char*button2,char*button3);
void sleep(int);
int  usr_input(char*title,char*subtitle,char*default,char**value);  
int  num_input1(char*title,char*subtitle,char*msg,int*value_ref,int min,int max);
int  num_input2(char*title,char*subtitle,char*msg1,int*value_ref1,int min1,int max  2,char* msg2,int*value_ref2,int min2,int max2);
void putstr(int x,int  y,char*str,int color_fg,int_color_bg);
void write_graph(int x,int  y,int width,int height,unsigned char* image,int color_fg,int color_bg);
void  write_graph_buf(unsigned char*scrbuf,int x,int y,int width,int height,unsigned  char* image,int color_fg,int color_bg);
 楼主| 发表于 2013-6-23 21:32:29 | 显示全部楼层
本帖最后由 diameter 于 2013-6-23 21:48 编辑

程序例

脚本模式测试:script_chs_demo.c.tns
需要把附带的HZK16.tns文件放在文件夹”dpicoc“中
截图:
chs_test.png
  1. #define FONT_16_SIZE 32

  2. FILE *                        HZK = NULL;
  3. unsigned char        mat[FONT_16_SIZE];

  4. int open_hzk ()
  5. {
  6.         HZK = 16.tns","rb");
  7.         if (HZK==NULL) return 0;
  8.         return 1;
  9. }

  10. void put_chs(int x,int y,unsigned char * str)
  11. {
  12.         unsigned char c1,c2;
  13.         while(*str)
  14.         {
  15.                 c1 = *str++;
  16.                 if(!(c1 & 0x80)) continue;
  17.                 c2 = *str++;
  18.                 fseek(HZK,(94*(c1-0xa1)+(c2-0xa1))*FONT_16_SIZE,SEEK_SET);
  19.                 fread(mat,FONT_16_SIZE,1,HZK);
  20.                 write_graph(x,y,16,16,mat,0x0,0xF);
  21.                 x+=16;
  22.         }
  23. }

  24. void close_hzk ()
  25. {
  26.         if (HZK!=NULL)
  27.                 fclose(HZK);
  28. }

  29. open_hzk        ();
  30. put_chs                (0,0,"汉字库使用演示——by 安德兰");
  31. close_hzk        ();

  32. sleep(500);
  33. getch();
复制代码
工程模式测试:
a.cpj.tns(必须放置在dpicoc文件夹中)
  1. /documents/dpicoc/file1.c.tns
  2. /documents/dpicoc/file2.c.tns
复制代码
file1.c.tns
  1. #include <stdio.h>
  2. extern int abs(int);
  3. extern long atol(char *);

  4. int main ()
  5. {
  6.         int a;
  7.         char buf[64];
  8.         puts("input a num");
  9.         a = atol(gets(buf));
  10.         printf("abs(%d)=%d\n",a,abs(a));
  11.         return 0;
  12. }
复制代码
file2.c.tns
  1. #include <ctype.h>
  2. long atol(char *nptr)
  3. {
  4.     int c;
  5.     long total;
  6.     int sign;

  7.     while ( isspace((int)(unsigned char)*nptr) )
  8.         ++nptr;

  9.     c = (int)(unsigned char)*nptr++;
  10.     sign = c;
  11.     if (c == '-' || c == '+')
  12.         c = (int)(unsigned char)*nptr++;

  13.     total = 0;

  14.     while (isdigit(c)) {
  15.         total = 10 * total + (c - '0');
  16.         c = (int)(unsigned char)*nptr++;
  17.     }

  18.     if (sign == '-')return -total;
  19.     else            return total;
  20. }

  21. int abs(int x)
  22. {
  23.   return x<0 ? -x:x;
  24. }
复制代码
发表于 2013-6-23 21:41:55 | 显示全部楼层
{:grin:} 太好了 。有的玩了
发表于 2013-6-24 09:27:47 | 显示全部楼层
我是看不懂{:051:}
发表于 2013-6-24 13:05:30 来自手机 | 显示全部楼层
好东西
发表于 2013-6-24 13:26:28 来自手机 | 显示全部楼层
好,有的玩了
发表于 2013-6-24 19:44:56 来自手机 | 显示全部楼层
我觉得楼主应修改一下,尽量向标准C语言靠近
 楼主| 发表于 2013-6-24 20:24:12 | 显示全部楼层
DAS 发表于 2013-6-24 19:44
我觉得楼主应修改一下,尽量向标准C语言靠近

给点具体的意见?是标准库还是语法
发表于 2013-6-25 08:53:30 | 显示全部楼层
#inculde <stdio.h>
int main()
{double a=1.0,b=2.0;
printf("a=%f,b=%f\n",a,b);
return 0;
}

运行结果:
a=0.000000 b=0.000000

float 也是

怎么回事?
 楼主| 发表于 2013-6-25 09:49:31 | 显示全部楼层
415987611 发表于 2013-6-25 08:53
#inculde
int main()
{double a=1.0,b=2.0;

请仔细查看说明文档(最后一页)
这是ndless标准库的问题,printf只有%d能正常工作
%x无论什么结果都显示xxx
%f无论什么都显示0.000000
发表于 2013-6-25 10:01:55 | 显示全部楼层
这么坑爹……

有什么替代的解决方案?
 楼主| 发表于 2013-6-25 10:08:51 | 显示全部楼层
本帖最后由 diameter 于 2013-6-25 10:09 编辑
415987611 发表于 2013-6-25 10:01
这么坑爹……

有什么替代的解决方案?

自己实现一个呗...gcvt在ndless里面倒是可以正常使用,下一次加到内建函数里面去
这里倒是有一个比较烂的ftoa
  1. char *d_ftoa(double d, char* str)
  2. {
  3.         char str1[64];
  4.         int j=0,k,i;

  5.         if (d<0)
  6.         {
  7.                 *str = '-';
  8.                 d_ftoa(-d,str+1);
  9.         }
  10.         else
  11.         {
  12.                 i = (int)d;  //浮点数的整数部分
  13.                 if (i==0)
  14.                 {
  15.                         str1[j++] = '0';
  16.                 }
  17.                 else
  18.                 {
  19.                         while(i>0)
  20.                         {
  21.                                 str1[j++] = i%10+'0';
  22.                                 i /= 10;
  23.                         }
  24.                 }
  25.                 for(k=0;k<j;k++)
  26.                         str[k] = str1[j-1-k]; //
  27.                
  28.                 str[j++] = '.';
  29.                
  30.                 d -= (int)d;
  31.                
  32.                 for(i=0;i<16;i++)
  33.                 {
  34.                         d *= 10.0;
  35.                         str[j++] = (int)d+'0';
  36.                         d -= (int)d;
  37.                 }
  38.                
  39.                 j-=4;
  40.                
  41.                 while(str[--j]=='0');
  42.                         str[j] = '\0';
  43.                
  44.                 if (str[j-1]=='.')
  45.                         str[j-1] = '\0';
  46.         }
  47.         return str;
  48. }
复制代码
发表于 2013-8-12 17:05:15 | 显示全部楼层
好东西。。。。。。。。
发表于 2013-12-23 19:55:00 | 显示全部楼层
C语言!!好厉害
发表于 2014-4-26 22:07:13 | 显示全部楼层
感谢楼主分享!
发表于 2014-4-26 23:09:41 | 显示全部楼层
bug不少...
最大的bug是键盘
发表于 2014-4-26 23:10:41 | 显示全部楼层
bug不少..
最大bug是键盘

留守tiGTC
发表于 2014-4-27 17:11:56 来自手机 | 显示全部楼层
居然早就有了!!!太赞
发表于 2014-7-16 16:31:20 | 显示全部楼层
看得眼花缭乱
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 22:09 , Processed in 0.061386 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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