cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 29704|回复: 35

[fx-9860/9750系列] 【ADD-IN】【机上C编译器】WSC & FVM 1.0

[复制链接]
发表于 2012-5-28 20:43:25 | 显示全部楼层 |阅读模式
计算器程序
程序名称: WSC & FVM
平台: fx-9860GII fx-9860G & Slim 
系统/软件要求:
版本号: 1.0
类型: 其他 
作者: Wudy
大小(K): 80
更新日期: 2012-05-28
描述: 机上C语言编译器
已知缺陷: 见notice
源代码: 闭源
本帖最后由 Wudy 于 2012-6-7 11:48 编辑

已有新版 http://www.cncalc.org/thread-7516-1-1.html


------------------------------------------------------------------------------

C语言编译器+虚拟机v1.0(尝鲜版)放出!

WSC是编译器,FVM是虚拟机。编辑器可以用EDIT。

用EDIT写好代码(*.c)后,WSC编译出字节码文件(*.f),交由FVM执行。
所有操作均在计算器上执行。


语法、内核基本都好了,下一步的目标就是扩充库函数。
正式版会有更详细的说明文档,以下一些不完善的地方以后也会慢慢改善,欢迎汇报bug,应该会有挺多的...


Features:
1.操作符
+ - * / % += -= *= /= %= < <= > >= == != && || ! & =
注意&是取地址而不是按位于。
2.数据类型
int、char、float、任意维数的数组、指向基本类型的指针(不能指向数组)
3.语句
if while for return break
4.库函数
共6个(有重载)
int scanf( char *fomat, int *address   );
int scanf( char *fomat. float *address );
int printf( char *format );
int printf( char *format, int value );
int printf( char *format, float value );int printf( char *format, char *str );
getsn( char *buffer, int max );


Notice:
1. int * a, b;
这里a、b都会是指向int的指针(所以建议写成int* a, b; 而不是int *a, b;)
2. int *p; p++;
ansi c里实际p的值会加4(即sizeof(int))而WSC编译器只会让它加1
3. a[ i ] += 5;
带有带有索引的左值不能使用 +=、*= 之类的操作符,例句是错误的
4. char s[50] = "abcde";
这种初始化方式暂未被支持,例句是错误的

C编译器.rar (80.13 KB, 下载次数: 56)

评分

参与人数 4金钱 +17 专家 +1 收起 理由
GWHBOB + 2 好!
NAT + 2 终于出来了!
diameter + 3 好!
zhs490770 + 10 + 1 太棒了

查看全部评分

 楼主| 发表于 2012-5-28 20:49:53 | 显示全部楼层

几个已经完美测试的代码

本帖最后由 Wudy 于 2012-5-28 21:12 编辑

1.八皇后
  1. int C[8];

  2. int tot = 0;

  3. void search( int cur )
  4. {
  5.         int i, j;
  6.         
  7.         if( cur == 8 )
  8.                 tot += 1;
  9.         else
  10.         {
  11.                 for(i = 0; i < 8; i += 1 )
  12.                 {
  13.                         int ok = 1;

  14.                         C[cur] = i;
  15.                         for( j = 0; j < cur; j += 1 )
  16.                                 if( C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur]
  17.                                         == j + C[j] )
  18.                                         {
  19.                                                 ok = 0;
  20.                                                 break;
  21.                                         }
  22.                         if( ok )
  23.                                 search( cur + 1 );                                                
  24.                 }
  25.         }
  26. }

  27. void main()
  28. {
  29.         search( 0 );
  30.         printf( "total : %d\n", tot );
  31. }
复制代码
2.快排
  1. int partition( int* a, int p, int r )
  2. {
  3.   int x, i, j;

  4.   x = a[r];
  5.   i = p - 1;
  6.   for( j = p; j < r; j += 1 )
  7.   {
  8.     if( a[j] <= x )
  9.     {
  10.       i += 1;
  11.       swap( &a, &a[j] );
  12.     }
  13.   }
  14.         swap( &a[i+1], &a[r] );
  15.   return i + 1;
  16. }

  17. void qsort( int *a, int p, int r)
  18. {
  19.   int q;

  20.   if( p < r )
  21.   {
  22.     q = partition( a, p, r );
  23.     qsort( a, p, q-1 );
  24.     qsort( a, q+1, r );
  25.   }
  26. }

  27. void main()
  28. {
  29.   int a[5];
  30.   int i;

  31.   for( i = 0; i < 5; i += 1 )
  32.     scanf( "%d", &a );

  33.   qsort( a, 0, 4 );

  34.   printf( "-----------\n" );
  35.   for( i = 0; i < 5; i += 1 )
  36.     printf( "%d\n", a );
  37. }

  38. void swap( int *a, int *b )
  39. {
  40.   int t;

  41.   t = *a; *a = *b; *b = t;
  42. }
复制代码
3.hello world
  1. void main()
  2. {
  3.         printf( "%s\n", "Hello World!" );
  4. }
复制代码
 楼主| 发表于 2012-5-28 21:05:40 | 显示全部楼层
本帖最后由 Wudy 于 2012-5-28 21:15 编辑

机上写好基本框架,可以传到电脑,再让sdk编译,来获取更好效果
发表于 2012-5-29 12:39:22 | 显示全部楼层
这样就是说……NOIP初赛可以直接将程序输入  得出答案?
(对不起我想得太那个了~)
发表于 2012-5-29 13:13:10 | 显示全部楼层
挺不错的,支持!
发表于 2012-5-29 17:36:01 | 显示全部楼层
感谢楼主,最近在学C
发表于 2012-5-29 23:16:07 | 显示全部楼层
顶,很不错的
发表于 2012-5-30 12:34:19 | 显示全部楼层
编译并执行如下代码:
  1. void main()
  2. {
  3.   char a[20];
  4.   scanf("%s",&a);
  5.   printf("%s\n",a);
  6. }
复制代码
只能输出前4个char,求解释。
 楼主| 发表于 2012-5-30 13:00:31 | 显示全部楼层
楼上C语言没学好,代码是错误的,去翻书吧。
 楼主| 发表于 2012-5-30 13:24:36 | 显示全部楼层
本帖最后由 Wudy 于 2012-5-30 13:32 编辑

再加一个notice
int a[10];
如果要知道a的值,用printf( "%d", a );会得到错误结果,因为编译器对所有指针都一视同仁,在几个重载的函数里,判断成应该调用printf( char *, char * ) 而不是printf( char *, int )。
要得到正确结果可以 int t = a; printf( "%d", t )
发表于 2012-5-30 17:14:31 | 显示全部楼层
我来下个试试看,看起来很不错
发表于 2012-5-30 17:16:01 | 显示全部楼层
9# Wudy 我刚刚学C,但是以下代码在VC++6.0上确实可以运行,请教一下这两个C语言有什么区别?
效果.bmp
 楼主| 发表于 2012-5-30 18:23:11 | 显示全部楼层
本帖最后由 Wudy 于 2012-5-30 18:49 编辑

编译器误导新人啊(试了下gcc也这样)...
你可以去比比你的代码和书上的代码哪里不同,scanf错的
 楼主| 发表于 2012-5-30 20:50:09 | 显示全部楼层
发现一个bug:
把int型数据传给float型参数时会发生错误。

现在已经修复,和下版(支持90%的9860可用标准C函数)一起发布。
发表于 2012-5-30 21:59:52 | 显示全部楼层
8l
代码明显是错的……a已经是一个指针了……
发表于 2012-5-30 22:13:46 | 显示全部楼层
楼主真的很厉害。弱弱地问一句,在计算器上直接编译为g1a有没有可能实现?我还想测试一下同一段代码编译为g1a和编译为“字节码”运行速度相差多少,与casio basic又相差多少。我很关心运行速度,如果字节码的速度能达到g1a的一半就很不错了,不知能不能达到。
楼主前一段时间做的词典其实也很实用,我个人认为是最实用的add-in了,希望能继续开发,并提供更多可供选择的词典文件。
 楼主| 发表于 2012-5-31 11:22:17 | 显示全部楼层
16# jinzihao1996
直接编译g1a有难度

for 1→i to 100000
我的9750,BASIC算了124s,FVM算了13s。

for 1→i to 10000000
g1a差不多1s

g1a约是FVM的1000倍,FVM约是BASIC的10倍。
发表于 2012-5-31 20:03:24 | 显示全部楼层
很不错啊!
对了,我把主函数写成int main()
{
return 0;
}
的形式,结果退不出来了,按reset键退出
发表于 2012-5-31 21:26:52 | 显示全部楼层
说实话,比较标准的是int main
不过void main也不能说错
 楼主| 发表于 2012-6-1 07:22:14 | 显示全部楼层
18# yangsc825
已经修复,欢迎汇报更多bug
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 23:44 , Processed in 0.065763 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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