cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 6462|回复: 14

[fx-9860/9750系列] 【ADD-IN】【机上C编译器】WSC & FVM 1.2 加入绘图,文件操作

[复制链接]
发表于 2012-6-21 11:26:10 | 显示全部楼层 |阅读模式
计算器程序
程序名称: WSC & FVM
平台: fx-9860GII fx-9860G & Slim 
系统/软件要求: -
版本号: 1.2
类型: 其他 
作者: Wudy
大小(K): 111
更新日期: 2012-06-21
描述: 机上C编译器
已知缺陷: 详见附件文档
源代码: 开源/部分开源
这次加入了绘图、按键函数,已经可以写游戏了。

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

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

WSC & FVM V1.20.part2.rar (511 KB, 下载次数: 134)

WSC & FVM V1.20.part3.rar (137.94 KB, 下载次数: 134)

评分

参与人数 2金钱 +4 收起 理由
diameter + 3 优秀文章
yangsc825 + 1 我很赞同

查看全部评分

 楼主| 发表于 2012-6-21 11:30:23 | 显示全部楼层
本帖最后由 Wudy 于 2012-6-21 11:42 编辑

发表于 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[3];
           int * tp=&temp[0];
           int * tp1=&temp[1];
           int * tp2=&temp[2];
           int * tp3=&temp[3];
在以后的语句中 就可以:
           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;
语句肯定会溢出,但是程序算完之前不会停止,而且还算不出正确的结果
 楼主| 发表于 2012-6-22 13:25:46 | 显示全部楼层
3# chuxianbing
switch-case和函数跳转表哪个快我也不太清楚
顺序问题是为了和头文件对照,以后都确定好了可以改掉

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

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

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


对源代码的建议我也非常欢迎~
发表于 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[0] = isalnum( temp );
  break;
case INT_CT_ISALPHA:
  R[0] = isalpha( temp );
  break;
绘图函数好像太慢了啊,那个1.1版本中带的计算器程序后面滚屏时让人眼花缭乱的,可以考虑在显存中画好后最后在循环外刷新,不要在循环中刷新屏幕
 楼主| 发表于 2012-6-22 19:15:36 | 显示全部楼层
5# 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[0] = printf( RAM+p->v1.temp );
                     break;
                 case INT_IO_PRINT_D:
                     R[0] = printf( RAM+p->v1.temp, p->v2.temp );
                     break;
好像sizeof(int)与sizeof(float)长度都是4,用上面的程序代替原来的可以省去memcpy函数
 楼主| 发表于 2012-6-24 11:16:24 | 显示全部楼层
不幸的告诉你,你这样是错误的

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

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

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

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

如,
char a[50];
int *p = a + x;
只有x是4的倍数的时候才能正在正常使用p
发表于 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;
后却可以得到正确结果,不知道为什么?
 楼主| 发表于 2012-6-29 21:08:50 | 显示全部楼层
9# chuxianbing
是有这个bug,优化的时候出现了一个错误,现在已经修复。
等待下版本吧= =
发表于 2012-8-14 11:53:08 | 显示全部楼层
强烈支持!!!
发表于 2012-9-15 14:26:24 | 显示全部楼层
LZ,忘了开通向1.3版的传送门~
发表于 2013-7-16 20:09:20 | 显示全部楼层
想问一下那个battery 和 edit 是什么软件啊?
谢谢啦
发表于 2014-12-15 11:15:55 | 显示全部楼层
这个要顶,支持stdio.h就好了
发表于 2017-11-13 21:25:10 | 显示全部楼层
有没有cg20版的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 21:39 , Processed in 0.095644 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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