📄 function.c
字号:
//RBASIC自定函数处理
#include <CsAgb.h>
#include <rbasic.h>
#include <rb_mem.h>
#define def_max_par 9
#define bg_id 128
extern double rb_cal(char *exp);
extern void rb_get_str(char *exp,char *str);
extern int get_para(char *exp,double *nump,char *strp,char *tp);
typedef struct
{
u8 p_num;//参数个数
char p_type[def_max_par];//参数类型
u8 p_id[def_max_par];//参数id
char exp[str_max_len];//表达式
} def_mes;//自定义函数信息
def_mes *rb_defs=NULL;//自定义函数信息
def_mes *rb_def_sv=NULL;//自定函数保存信息
void rb_def(char *exp)//自定函数注册
{
int i;
int id,num=0;
if (exp[0]!='D')//不是自定义函数标识
{
rb_error=6;
return;
}
id=exp[1]-bg_id;//注册编号
if (rb_defs[id].p_num!=0)//函数重复定义
{
rb_error=23;
return;
}
i=3;
while (1)
{
if (exp[i]!='F' && exp[i]!='I')//非指定参数格式
{
rb_error=6;
return;
}
rb_defs[id].p_type[num]=exp[i];//记录参数类型
i++;
rb_defs[id].p_id[num]=exp[i]-bg_id;//记录参数id
i++;
num++;
if (exp[i]==')') break;//完成参数扫描
else if (exp[i]==',') i++;
else
{
rb_error=6;
return;
}
}
i++;
if (exp[i]!='=') {rb_error=6;return;}
rb_defs[id].p_num=num;
i++;
num=0;
while (exp[i]!='\0')
{
rb_defs[id].exp[num]=exp[i];
i++;
num++;
}
rb_defs[id].exp[num]='\0';
}
double cal_def_fun(u8 id,char *exp)//自定义函数调用
{
int i;
char tp[def_max_par+5]="0NNNNNNNNNNNN";
double temp[def_max_par];
double sv[def_max_par];
double res;
if (rb_defs[id].p_num==0)//函数未定义
{
rb_error=24;
return 0.0;
}
tp[0]=rb_defs[id].p_num+'0';
if (get_para(exp,temp,NULL,tp)) return 0.0;//获得各参数
for (i=0;i<rb_defs[id].p_num;i++)
{
switch(rb_defs[id].p_type[i])//将参数赠与注册变量
{
case 'F'://浮点数
sv[i]=get_float_val(rb_defs[id].p_id[i]);//保留变量值
give_float_val(rb_defs[id].p_id[i],temp[i]);//将参数赠与变量
break;
case 'I'://整型数
sv[i]=get_int_val(rb_defs[id].p_id[i]);//保留变量值
give_int_val(rb_defs[id].p_id[i],temp[i]);//将参数赠与变量
break;
default:
rb_error=6;
return 0.0;
}
}
res=rb_cal(rb_defs[id].exp);
for (i=0;i<rb_defs[id].p_num;i++)//恢复注册变量值
{
switch(rb_defs[id].p_type[i])
{
case 'F'://浮点数
give_float_val(rb_defs[id].p_id[i],sv[i]);//将参数赠与变量
break;
case 'I'://整型数
give_int_val(rb_defs[id].p_id[i],sv[i]);//将参数赠与变量
break;
}
}
return res;
}
void rb_def_mem()//分配自定函数数据空间
{
int i;
rb_defs=(def_mes *) mymalloc(sizeof(def_mes)*rb_def_cnt);//一次性分配内存空间
if (rb_defs==NULL)//内存不足
{
rb_error=1;
return;
}
for (i=0;i<rb_def_cnt;i++) rb_defs[i].p_num=0;//初始化
}
void rb_def_clear()
{
int i;
if (rb_defs==NULL) return;
for (i=0;i<rb_def_cnt;i++) rb_defs[i].p_num=0;
}
void rb_free_def()//释放自定函数数据空间
{
myfree(rb_defs);
}
void rb_def_save()
{
rb_def_sv=rb_defs;
rb_defs=NULL;
}
void rb_def_load()
{
myfree(rb_defs);
rb_defs=rb_def_sv;
rb_def_sv=NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -