读写配置文件 与 定点数运算


读写配置文件

MiniGUI的配置文件,即/etc/MiniGUI.cfg 文件的格式,采用了类似WindowsINI文件的格式。这种文件格式非常简单,如下所示:

[section-name1]
key-name1=key-value1
key-name2=key-value2
[section-name2]
key-name3=key-value3
key-name4=key-value4

这种配置文件中的参数以 section分组,然后用key=value 的形式指定参数及其值。应用程序也可以利用这种配置文件格式保存一些配置信息,为此,MiniGUI提供了如下三个函数(include/minigui.h) :

int GUIAPI GetValueFromEtcFile (const char* pEtcFile,const char*pSection, const char* pKey,char* pValue,int iLen);
int GUIAPI GetIntValueFromEtcFile (const char* pEtcFile,const char*pSection, const char* pKey,int* value) ;
int GUIAPI SetValueToEtcFile (const char* pEtcFile,const char* pSection,const char* pKey,char* pValue) ;

这三个函数的用途如下:
. GetValueFromEtcFile:从指定的配置文件当中获取指定的键值,键值以字符串形式返回。
. GetIntValueFromEtcFile:从指定的配置文件当中获取指定的整数型键
值。该函数将获得的字符串转换为整数值返回(采用strtol 函数转换)。. SetValueToEtcFile:该函数将给定的键值保存到指定的配置文件当中,
如果配置文件不存在,则将新建配置文件。如果给定的键已存在,则将覆盖旧值。
假定某个配置文件记录了一些应用程序信息,并具有如下格式:

[mginit]nr=8
autostart=0
[app0]
path=. ./tools/
name=vcongui
layer=
tip=Virtual&console&on&MiniGUI
icon=res/konsole.gif
[app1]
path=../bomb/
name=bomb
layer=
tip=Game&of&Minesweapericon=res/kmines.gif
[app2]
path=. ./controlpanel/name=controlpanel
layer=
tip=Control&Panelicon=res/kcmx.gif

其中的[mginit]段记录了应用程序个数(nr键),以及自动启动的应用程序索引(autostart 键)。而[appX]段记录了每个应用程序的信息,包括该应用程序的路径、名称、图标等等。下面的代码演示了如何使用MiniGU的配置文件函数获取这些信息(该代码段来自mde演示包中的 mginit程序):

#define APP_INFO_FILE"mginit.rc"
static BOOL get_app_info (void){
int i ;
APPITEM* item;
/*获取应用程序个数信息*/
if(GetIntValueFromEtcFile (APP_ INFO_FILE,"mginit""nr",&app_ info.nr_apps)!=ETC_OK)
return FALSE;
if (app_info.nr_apps <= 0)
return FALSE;
/*获取自动启动的应用程序索引*/
GetIntValueFromEtcFile (APP_INFO_FILE, "mginit", "autostart",&app_info.autostart) ;
if (app_info. autostart >= app_info.nr_apps || app_info. autostart <0)
app_info. autostart = 0;
/*分配应用程序信息结构*/
if ((app_info.app_items = (APPITEM*)calloc (app_info.nr_apps,sizeof (APPITEM))) == NULL){
return FALSE;
}
/*获取每个应用程序的路径、名称、图标等信息*/item = app_info.app_items;
for (i = 0; i < app_info.nr_apps; i++, item++){
char section [10];
sprintf (section,"app%d",i);
if (GetValueFromEtcFile (APP_INFO_FILE,section,"path",
item->path,PATH_MAX) != ETC_OK)
goto error;
if (GetValueFromEtcFile (APP_INFO_FILE,section,"name",
item->name,NAME_MAX) !=ETC_OK)
goto error;
if (GetValueFromEtcFile (APP_INFO_FILE,section,"layer",
item->layer,LEN_LAYER_NAME) !=ETC_OK)
goto error;
if (GetValueFromEtcFile (APP_INFO_FILE,section,"tip",
item->tip,TIP_MAX) != ETC_OK)
goto error;
strsubchr_(item->tip,&',’');
if (GetValueFromEtcFile (APP_ INFO_FILE, section, "icon",
item->bmp_path,PATH_MAX + NAME_MAX) != ETC_OK)
goto error;
if (LoadBitmap (HDC_SCREEN,&item->bmp,item->bmp_path)!=
ERR_BMP_OK)
goto error;
item->cdpath = TRUE;
}
return TRUE;
error:
free_app_info ();return FALSE;

定点数运算

通常在进行数学运算时,我们采用浮点数表示实数,并利用头文件中所声明的函数进行浮点数运算。我们知道,浮点数运算是一种非常耗时的运算过程。为了减少因为浮点数运算而带来的额外CPU指令,在一些三维图形库当中,通常会采用定点数来表示实数,并利用定点数进行运算,这样,将大大提高三维图形的运算速度。MiniGUI也提供了一些定点数运算函数,分为如下几类:

  1. 整数、浮点数和定点数之间的转换。利用itofix 和 fixtoi 函数可实现
    整数和定点数之间的相互转换;利用ftofix和 fixtof函数可实现浮点数和定点数之间的转换。
  2. 定点数加、减、乘、除等基本运算。利用fadd、fsub、fmul、fdiv、fsqrt等函数可实现定点数加、减、乘、除以及平方根运算。
  3. 定点数的三角运算。利用fcos、fsin、ftan、facos、fasin 等函数可求给定定点数的余弦、正弦、正切、反余弦、反正弦值。
  4. 矩阵、向量等运算。矩阵、向量相关运算在三维图形中非常重要,限于篇
    幅,本文不会详细讲述这些运算,读者可参阅MiniGUI 的
    include/fixedmath.h头文件。

下面的代码段演示了定点数的用法,该程序段根据给定的三个点(pts[o]、pts[1]、pts[2])画一个弧线,其中 pts[0]作为圆心,pts[1]是圆弧的起点,而pts[2]是圆弧终点和圆心连线上的一个点:

void draw_arc (HDC hdc,POINT* pts){
int sx = pts [0].x,sy = pts [0].y;
int dx- pts [1].x- sx,dy = pts [1].y- sy;int r =sqrt (dx * dx * 1.0 +dy *dy *1.0);double cos_d = dx * 1.0 / r;
fixed cos_f = ftofix (cos_d);fixed ang1 = facos (cos_f);int r2;
fixed ang2;
if (dy > 0){
ang1 = fsub (0,ang1);
}
dx = pts [2].x - sx;dy = pts [2].y - sy;
r2 = sqrt (dx * dx * 1.0 +dy * dy * 1.0);cos_d = dx * 1.0 / r2;
cos_f = ftofix (cos_d);ang2 = facos (cos_f);
if (dy > 0){
ang2 = fsub (O, ang2);
Arc (hdc,sx,sy,r,ang1,ang2);
}

上述程序的计算非常简单,步骤如下(该程序段来自mde 演示程序包中的painter/painter.c程序):

  1. 根据pts[0]和 pts[1]计算圆弧的半径,然后计算圆弧的起始偏角,即
    ang1,使用了ftofix函数和facos函数。
  2. 计算 pts[2]点和圆心连线的夹角,即 ang2,使用了ftofix和facos函数。
  3. 调用Arc函数绘制圆弧。

小结

本文讲述了MiniGUI为应用程序提供的一些非 GUI/GDI的接口。这些接口中,某些是为了解决和操作系统的交互而设计的,以便MiniGUI应用程序能够更好地与操作系统提供的机制融合在一起;而某些提供了对UNIX Domain Socket良好封装的接口,可帮助应用程序方便进行进程间通讯或者扩展其功能;其他接口则专注于嵌入式系统的特殊性,为应用程序提供了可移植的文件I/0封装代码。在这些接口的帮助下,嵌入式系统开发人员可以编写功能强大而灵活的应用程序。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特冬哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值