Wudy 发表于 2012-6-21 11:26:10

【ADD-IN】【机上C编译器】WSC & FVM 1.2 加入绘图,文件操作

这次加入了绘图、按键函数,已经可以写游戏了。

移植了两个力学模拟的demo(spring.c、ball.c),在计算器上把对比度调高,效果还不错。

更新
* 2012 – 06 – 21                  version 1.2
- 添加了一个简单的预处理器(现在需要#include了)
- 添加绘图和文件操作的函数
- 添加多键强退功能
- 添加一项优化技术,测试数据中速度最大提高10%
- 修复参数传递中的一些错误
- 修复数组初始化只能出现一次的错误
- 修复多维数组取地址的错误
- 其它




Wudy 发表于 2012-6-21 11:30:23

本帖最后由 Wudy 于 2012-6-21 11:42 编辑

http://player.youku.com/player.php/sid/XNDE3Mjg4MzYw/v.swf

chuxianbing 发表于 2012-6-22 11:43:02

对于switch -case 结构
   是否可以都用函数转跳表代替呢,我没试过,不知道那样速度是否更快
   在使用case语句时,也可以考虑将最可能产生的情况放在最前面
   比如cos函数比acos使用的频率更高,可以排在前面
还有像
    memcpy( &temp,RAM+R[$IA],   sizeof(int) );
    memcpy( &temp2, RAM+R[$IA]+4, sizeof(int) );
    memcpy( &temp2, RAM+R[$IA]+8, sizeof(int) );
    memcpy( &temp2, RAM+R[$IA]+12, sizeof(int) );
的结构
          是否可以先定义:
         int temp;
         int * tp=&temp;
         int * tp1=&temp;
         int * tp2=&temp;
         int * tp3=&temp;
在以后的语句中 就可以:
         memcpy( tp, RAM+R[$IA], 4*sizeof(int) );
或2位参数时用
          memcpy( &temp, RAM+R[$IA], 2*sizeof(int) );
这样速度应该会快些,代码应该会短些
当程序运行完毕时,是否可以考虑直接回到程序文件选择界面
是否考虑增加一个计算定积分的函数
是否考虑增加对数值溢出的检测,比如计算整数1000的阶乘
int s=1;
int i=1;
for(i=1;i<1001;i++)s=s*i;
语句肯定会溢出,但是程序算完之前不会停止,而且还算不出正确的结果

Wudy 发表于 2012-6-22 13:25:46

3# chuxianbing
switch-case和函数跳转表哪个快我也不太清楚
顺序问题是为了和头文件对照,以后都确定好了可以改掉

对于temp的建议非常好!下版你不会再看到原来的烂代码了

微积分这些恐怕不会有了,有也要很久

溢出这是程序员的责任了,就跟C语言不检查越界一样


对源代码的建议我也非常欢迎~

chuxianbing 发表于 2012-6-22 18:05:12

还可以考虑将参数个数及参数类型都完全相同的函数放在同一个switch中
switch( funcCode )
{
memcpy( &temp, RAM+R[$IA], sizeof(int) );   //   在case语句之前先进行mencpy 可以减小gla文件的大小,要是全部换成这种形式估计可以减小gla文件大小1k的样子//
case INT_CT_ISALNUM:
R = isalnum( temp );
break;
case INT_CT_ISALPHA:
R = isalpha( temp );
break;
绘图函数好像太慢了啊,那个1.1版本中带的计算器程序后面滚屏时让人眼花缭乱的,可以考虑在显存中画好后最后在循环外刷新,不要在循环中刷新屏幕

Wudy 发表于 2012-6-22 19:15:36

5# chuxianbing
滚屏幕是我故意的,动画效果不是还不错嘛。。。

绘图函数不慢吧,视频里那个不是挺好的?

chuxianbing 发表于 2012-6-23 20:51:03

typedef union
{
        float tempf;
        int   temp;
}Value;
typedef struct
{
value v1;
value v2;
value v3;
value v4;
value v5;
value v6;
} valuex;

valuex *p;

void interrupt( unsigned char vector, unsigned char funcCode )
{
p=RAM+R[$IA];
   switch( vector )
   {
        case INT_IO:
           switch( funcCode )
                {
               case INT_IO_PRINT:
                     R = printf( RAM+p->v1.temp );
                     break;
               case INT_IO_PRINT_D:
                     R = printf( RAM+p->v1.temp, p->v2.temp );
                     break;
好像sizeof(int)与sizeof(float)长度都是4,用上面的程序代替原来的可以省去memcpy函数

Wudy 发表于 2012-6-24 11:16:24

不幸的告诉你,你这样是错误的

我在原来是这么写的(在VC++6里)

#define CAST_INT( a )      (*(int *)(a))

case INT_IO_PRINT_D:
R = printf( RAM+CAST_INT(RAM+R[$IA]), CAST_INT(RAM+R[$IA]+4) );

不用memcpy,不用sizeof(int)与sizeof(float)长度都是4这个与机器有关特性,但是一运行就报错,后来发现9860SDK的指针必须内存对齐的访问。

如,
char a;
int *p = a + x;
只有x是4的倍数的时候才能正在正常使用p

chuxianbing 发表于 2012-6-29 18:42:48

#include<math.h>
#include<stdio.h>
void main()
{
float a=0.001,b=0.002,c=0.1,t=0.0,s=0.0;
float q;
for(t=0;t<=1;t+=0.001)
{
s=s+sin(a*t*t+b*t+c);
}
printf("%f",s);
}
编译成b.f文件时显示结果不正确
把循环部分改成:
q=sin(a*t*t+b*t+c);
s=s+q;
后却可以得到正确结果,不知道为什么?

Wudy 发表于 2012-6-29 21:08:50

9# chuxianbing
是有这个bug,优化的时候出现了一个错误,现在已经修复。
等待下版本吧= =

hao8986 发表于 2012-8-14 11:53:08

强烈支持!!!

GWHBOB 发表于 2012-9-15 14:26:24

LZ,忘了开通向1.3版的传送门~

aggciy 发表于 2013-7-16 20:09:20

想问一下那个battery 和 edit 是什么软件啊?
谢谢啦

slymitec 发表于 2014-12-15 11:15:55

这个要顶,支持stdio.h就好了

a_12365 发表于 2017-11-13 21:25:10

有没有cg20版的?
页: [1]
查看完整版本: 【ADD-IN】【机上C编译器】WSC & FVM 1.2 加入绘图,文件操作