【ADD-IN】【机上C编译器】WSC & FVM 1.0
本帖最后由 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 = "abcde";
这种初始化方式暂未被支持,例句是错误的
几个已经完美测试的代码
本帖最后由 Wudy 于 2012-5-28 21:12 编辑1.八皇后int C;
int tot = 0;
void search( int cur )
{
int i, j;
if( cur == 8 )
tot += 1;
else
{
for(i = 0; i < 8; i += 1 )
{
int ok = 1;
C = i;
for( j = 0; j < cur; j += 1 )
if( C == C || cur - C == j - C || cur + C
== j + C )
{
ok = 0;
break;
}
if( ok )
search( cur + 1 );
}
}
}
void main()
{
search( 0 );
printf( "total : %d\n", tot );
}2.快排int partition( int* a, int p, int r )
{
int x, i, j;
x = a;
i = p - 1;
for( j = p; j < r; j += 1 )
{
if( a <= x )
{
i += 1;
swap( &a, &a );
}
}
swap( &a, &a );
return i + 1;
}
void qsort( int *a, int p, int r)
{
int q;
if( p < r )
{
q = partition( a, p, r );
qsort( a, p, q-1 );
qsort( a, q+1, r );
}
}
void main()
{
int a;
int i;
for( i = 0; i < 5; i += 1 )
scanf( "%d", &a );
qsort( a, 0, 4 );
printf( "-----------\n" );
for( i = 0; i < 5; i += 1 )
printf( "%d\n", a );
}
void swap( int *a, int *b )
{
int t;
t = *a; *a = *b; *b = t;
}3.hello worldvoid main()
{
printf( "%s\n", "Hello World!" );
}
本帖最后由 Wudy 于 2012-5-28 21:15 编辑
机上写好基本框架,可以传到电脑,再让sdk编译,来获取更好效果 这样就是说……NOIP初赛可以直接将程序输入得出答案?
(对不起我想得太那个了~) 挺不错的,支持! 感谢楼主,最近在学C 顶,很不错的 编译并执行如下代码:void main()
{
char a;
scanf("%s",&a);
printf("%s\n",a);
}
只能输出前4个char,求解释。 楼上C语言没学好,代码是错误的,去翻书吧。 本帖最后由 Wudy 于 2012-5-30 13:32 编辑
再加一个notice
int a;
如果要知道a的值,用printf( "%d", a );会得到错误结果,因为编译器对所有指针都一视同仁,在几个重载的函数里,判断成应该调用printf( char *, char * ) 而不是printf( char *, int )。
要得到正确结果可以 int t = a; printf( "%d", t ) 我来下个试试看,看起来很不错 9# Wudy 我刚刚学C,但是以下代码在VC++6.0上确实可以运行,请教一下这两个C语言有什么区别? 本帖最后由 Wudy 于 2012-5-30 18:49 编辑
编译器误导新人啊(试了下gcc也这样)...
你可以去比比你的代码和书上的代码哪里不同,scanf错的 发现一个bug:
把int型数据传给float型参数时会发生错误。
现在已经修复,和下版(支持90%的9860可用标准C函数)一起发布。 8l
代码明显是错的……a已经是一个指针了…… 楼主真的很厉害。弱弱地问一句,在计算器上直接编译为g1a有没有可能实现?我还想测试一下同一段代码编译为g1a和编译为“字节码”运行速度相差多少,与casio basic又相差多少。我很关心运行速度,如果字节码的速度能达到g1a的一半就很不错了,不知能不能达到。
楼主前一段时间做的词典其实也很实用,我个人认为是最实用的add-in了,希望能继续开发,并提供更多可供选择的词典文件。 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倍。 很不错啊!
对了,我把主函数写成int main()
{
return 0;
}
的形式,结果退不出来了,按reset键退出 说实话,比较标准的是int main
不过void main也不能说错 18# yangsc825
已经修复,欢迎汇报更多bug
页:
[1]
2