易码技术论坛

 找回密码
 加入易码
搜索
查看: 5172|回复: 62

[工具] 发几个实用的库函数[4.19]更新

[复制链接]
发表于 2008-3-21 11:29:49 | 显示全部楼层 |阅读模式
//------------- 4.19 更新 --------------------------//

重写了float.y里的 ftoa 函数,函数原型不变,主要做以下修正:

1.把以前显示十位有效数字改成了显示八位,主要是考虑到最后两位数字大多情况下是由于精度损失后造成的错数。以至于经常出现类似 1.01 输出为 "1.0100000XX" 的错误。

2.对浮点数进行分析后以不同形式输出,这点和以前的统统按科学计数法输出不同,具体输出形式如下:
   当指数大于7次或小于-1次时以科学计数法形式输出,其余以浮点小数的形式输出。(同GVbasic里的小数输出规则)

  所以: 1.0 ->"1"  , 0.123 ->"0.123",  0.0123456 ->"1.23456e-2" ,  12345.6789 ->"12345.679"
        123 ->"123" , 123456789123456789 ->"1.2345679e+17"   ....  ....   


//------------- 4.18 更新 --------------------------//

在float.y 新加入如下函数:

原型: long forml ( int  type ,int formula ,  ... ) ;

功能:求含参量的混合运算表达式的值。

说明:
     1.formula为指定格式的混合运算表达式,后面跟要参与运算的变量,变量的类型由格式符%进行说明:
          %d 十进制整数;
          %s 字符串表示的数值,可以是整数形式,如:"-100",也可以是小数形式,如:"3.14159";
          %f  浮点型变量。
     2.运算表达式目前支持以下运算浮:( )  -(负号)*/  +-  > >= <= != ==  (优先级依次降低)。其中逻辑运算成立为浮点型的 -1 (0xbf800000), 不成立为浮点型的 0(0x00000000)。
         以下表达式都是合法的:
         "(3.6+%d)*%d"
           "-%d*%d/3.14519"
           "%d>=%d"
           "%d+%d*(%d>0.5)"           
             ...  ....
            
    3.type为函数的返回类型,定义如下:
          'd' 整形, 'f'  浮点型, 's'  字符串地址。

4.18:小更新了下,更新的地方红字加亮,可以在表达式中直接写数字了,另外完善了负号的使用.
再就把type参数提前了,落在后面好象容易被忘掉^____^b

以后能写不定参数的函数了,真的很是高兴,再次感谢YAN的无私帮助!!

ps:下面的函数库是用YAN2.13编译器制作,已不被最新版本兼容,故不能使用.考虑到已被收录,就不作更新啦

//------------- 3.29 更新 --------------------------//

库名:refresh.y 作者:yoYohenry

原型:void RefreshPoint(int x,int y)
功能:以缓存区数据为背景画点刷新。

原型:void RefreshLine(int x0,int y0,int x1,int y1)
功能:以缓存区数据为背景画线刷新。

原型:void RefreshBox(int x0,int y0,int x1,int y1,int fill)
功能:以缓存区数据为背景画矩形刷新。

原型:RefreshShutt(int x0,int y0,int x1,int y1,int n,int type)
功能:以缓存区数据为背景在屏幕(x0,y0,x1,y1)范围内以百叶窗形式刷新。
说明:n为百叶窗每页宽度;type=0为纵向百叶窗,type=1为横向百叶窗。

demo1.gif    demo2.gif    shutter1.gif    shutter2.gif

新加入几个矢量刷屏函数,现在可以玩转艺术刷屏啦~

//------------- 3.24 更新 --------------------------//
库名:triangle.y 作者:yoYohenry

原型:int sin(int deg)
功能:计算sin(deg)的值。
说明:deg的单位是度,取-32767~-32767之间的整数(这里注意和Sin()的区别)。返回值是sin(deg)的小数值乘以1024(范围为-1024~1024)。

原型:int asin(int x)
功能:计算arcsin(x/1024)的值,单位:度。
说明:abs(x)>1024 时返回90(-90)度。

原型:int cos(int deg)
功能:计算cos(deg)的值。
说明:deg的单位是度,取-32767~-32767之间的整数(这里注意和Cos()的区别)。返回值是cos(deg)的小数值乘以1024(范围为-1024~1024)。

原型:int acos(int x)
功能:计算arccos(x/1024)的值,单位:度。
说明:abs(x)>1024 时返回0(180)度。

原型:long tan(int deg)
功能:计算tan(deg)的值。
说明:deg的单位是度,取-32767~-32767之间的整数。返回值是tan(deg)的小数值乘以1024,tan(90)返回0xfffffff。

原型:int atan(long x)
功能:计算arctan(x/1024)的值,单位:度。
说明:abs(x)>0xfffffff时返回90(-90)度。


下面是运行截图

tri1.JPG       tri2.JPG       tri3.JPG

NC3000上运行的速度检测

sin.JPG asin.JPG

cos.JPG acos.JPG

tan.JPG atan.JPG

ps:感觉在运行速度和精准度上都还不错哈~ 另外在不涉及负数的情况下还是提倡使用系统自带的Sin()和Cos()两个函数,毕竟自定义函数在运行效率上和系统函数是没法比的。

//------------- 3.22 更新 --------------------------//
作者:yoYohenry
原型:long sqrt(long x);
功能:计算x的算术平方根。
说明:计算结果向零方向取整,负数返回-1。

sqrt.JPG sqrt测速.JPG sqrt检测.JPG

这个是原math库里的sqrt函数速度检测
原sqrt测速.JPG



===================================================

作者:yoYohenry
原型:long cub(long x);
功能:计算x的立方根。
说明:计算结果向零方向取整。
cub.JPG cub测速.JPG cub检测.JPG

//----------------3.21 更新----------------------------//

库名:digit.y 作者:yoYohenry

原型:void digset(char &digbuf[],char heigh);
功能:生成 8*heigh 的电子数字字模数据,配合函数digout2使用。

原型:void digout(int x,int y,int width,int heigh,int num,char type)
功能:在(x,y)处画 width*heigh 的电子数字(0~9)。
说明:此函数作矢量图,type=0 直接在屏幕作图,1在缓存区作图。优点:使用方便,可在程序中直接调用,且字模大小可任意;不足:由于是作矢量图,显图速度较digout2函数慢(1E-2s级)。

原型:void digout2(int x,int y,int heigh,char &digbuf[],char num,int type)
功能:在(x,y)处画 8*heigh 的电子数字(0~9)。
说明:此函数作向量图,使用前必须先用digset(digbuf[],heigh)生成大小10*heigh的字模数据,优点是显图快(1E-3s级),type含义见WriteBlock。
digit.JPG


=================================

库名:TXTout.y 作者:yoYohenry
功能:与文本字符在屏幕显示的相关函数。

原型:void TextOut2(int x,int y,char &strbuf[],int type)
功能:类似TextOut的字符串显示函数。
说明:type的bit7=1:大字体,bit7=0:小字体
bit6为1时直接在屏幕上绘图,否则在缓冲区作图
★bit5为1时显示镂空字体
★bit4为1时显示加粗字体

[荐]可以同时镂空加粗哟
bit3为1时图形反显
bit2-0:1:copy 2:not 3: or 4:and 5:xor

原型:void msg(char &msgbuf[],int type)
功能:弹出信息框,字符串中支持换行符'\n',信息框居中显示,type 定义见TextOut2。

******分***隔***线******

以下为文段显示函数

原型:void TXTrange(int x0,int y0,int x1,int y1,int type)
功能:设置文段在屏幕显示的区域和文字显示参数,type 含义见 TextOut2。
说明:默认参数为(0,0,159,79,0x41)

原型:void Setlbreak(char lbreak,char len_lb)
功能:设置段落标记的第一字符和段落标记占的字节长度。
说明:默认参数为('\n',1)。常见的段落标记还有0x0D0A(如文本文件),可设为(0x0d,2)。

ps:字符(串)中的 \n会被编译为0x0A,占一个字节长度,如果要在字符串显示\n,应写为 \\\n。


原型:int TXTload(char &TXTbuf[],long TXTlen,int &lip[])
说明:载入要显示的文段信息,TXTbuf为文段信息开始地址,TXTlen为文本长度,lip[]用来存每行首文字的指针,函数返回文段总行数。


原型:void TXTout(int lCur)
功能:在区域(x0,y0,x1,y1)内以type类型从lCur行开始显示TXT文本信息。

TXTout0.JPG
TXTout1.JPG
TXTout2.JPG
================================

库名:time.y 作者:yoYohenry
原型:void gettime(struct TIME &t);
功能:读取系统时间,精确到1/255秒。
原型:long dsec(struct TIME &t1,struct TIME &t2,int &ms);
功能:求24小时内t1到t2的时间段长度,精确到0.01秒。
说明:所求时间长度单位为秒,函数返回其整数部分,ms存其小数部分。

[ 本帖最后由 yoyohenry 于 2008-4-19 20:50 编辑 ]

digit.rar

1.63 KB, 下载次数: 355

TXTout.rar

2.86 KB, 下载次数: 363

time.rar

1.04 KB, 下载次数: 348

sqrt.rar

1.83 KB, 下载次数: 340

开源

cub.rar

1.83 KB, 下载次数: 349

开源

triangle.rar

1.43 KB, 下载次数: 338

refresh.rar

1.56 KB, 下载次数: 335

float.rar

5.98 KB, 下载次数: 345

评分

参与人数 6小红花 +52 收起 理由
POTO + 10 原创内容
DenZh-TP + 2 好啊
black + 5 支持~~
jason + 10 精品文章
yan + 15 支持,希望lz多发库函数。

查看全部评分

 楼主| 发表于 2008-3-21 11:36:43 | 显示全部楼层
自己坐沙发哈,有时间再发几个吼
发表于 2008-3-21 11:54:47 | 显示全部楼层
强烈支持,收藏了,将收集到库中。
发表于 2008-3-21 11:58:51 | 显示全部楼层
可惜花用完了。 希望lz多多发库函数。
发表于 2008-3-21 12:24:35 | 显示全部楼层
我下了
好用好用
发表于 2008-3-21 12:44:18 | 显示全部楼层
我也试了下,效果很好,就是函数msg在电脑上运行会提示错误的读写地址,望lz解决一下。
 楼主| 发表于 2008-3-21 13:06:49 | 显示全部楼层
这几个都是星端写的,好像还没出现过什么BUG,模拟器上的错误我看看是不是下标越界什么的
 楼主| 发表于 2008-3-21 16:00:37 | 显示全部楼层
原帖由 yan 于 2008-3-21 12:44 发表
我也试了下,效果很好,就是函数msg在电脑上运行会提示错误的读写地址,望lz解决一下。



模拟器上这段程序编译后通不过安全检测,不知道为什么哈

void main()
{
printf("%d",strchr("Hello World",'W'));
}
发表于 2008-3-21 17:47:28 | 显示全部楼层
"Hello World"字符串保存的一个循环缓冲区,其地址不是在变量空间内(变量空间是以0x2000起),所以出现错误的读写地址。最好这样:
  1. char s[] = "Hello World";
  2. void main()
  3. {
  4.   printf("%d", strchr(s, 'W'));
  5. }
复制代码
发表于 2008-3-21 17:49:51 | 显示全部楼层
这个问题出现最多!
发表于 2008-3-21 17:53:48 | 显示全部楼层
C语言里就可以这样使用了。
发表于 2008-3-21 17:55:52 | 显示全部楼层
那太好了,不用刻意去注意了!
这是LAVA本身的问题吧?能不能通过编译器解决?(我只是说说,呵呵)
发表于 2008-3-21 17:59:55 | 显示全部楼层
可以。
可以给这些临时字符串开辟一个常量区,然后在引用。
不过挺麻烦的。
最好是手动解决。
发表于 2008-3-21 18:00:39 | 显示全部楼层
手动的话,在电脑上还行,在WQX上很恼火!
 楼主| 发表于 2008-3-21 18:04:13 | 显示全部楼层
原帖由 yan 于 2008-3-21 17:47 发表
"Hello World"字符串保存的一个循环缓冲区,其地址不是在变量空间内(变量空间是以0x2000起),所以出现错误的读写地址。最好这样:char s[] = "Hello World";
void main()
{
  printf("%d", strchr(s, 'W'));
} ...


这样哦,谢谢Yan解疑
那想偷懒还是用 msg("你好!",0x41 );先存给临时变量太麻烦哈,反正这样在星端是没有任何问题的,呵呵
发表于 2008-3-21 18:07:40 | 显示全部楼层
但是用模拟器就不能运行了,还是麻烦点吧!
那样好!程序不存在错误是好的!
发表于 2008-3-21 18:32:39 | 显示全部楼层
LAVA中的字符串缓冲区只能读不能写.

[ 本帖最后由 Eastsun 于 2008-3-21 18:35 编辑 ]
发表于 2008-3-21 18:34:27 | 显示全部楼层
可以这样:
  1. void msg(char &str[], char type)
  2. {
  3.   char strBuf[256];

  4.   strcpy(strBuf, str);
  5.   ....
  6. }
复制代码
然后在使用strBuf代替str
发表于 2008-3-21 18:36:04 | 显示全部楼层
原帖由 Eastsun 于 2008-3-21 18:32 发表
LAVA中的字符串缓冲区只能读不能写.

改的好快!
发表于 2008-3-21 18:36:50 | 显示全部楼层
麻烦一点,但是可靠!

顺便问一下,yan那个代码粘贴的效果是怎么弄的!
别笑我!真不知道,也没用过!
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-20 05:04 , Processed in 0.014779 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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