⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 function.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 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 + -