📄 rb_data.c
字号:
#include <CsAgb.h>
#include <rb_mem.h>
#include <rbasic.h>
#include <rb_var.h>
#define rb_dat_num_cnt 128//data区最大数据个数
#define rb_dat_str_len 2048
extern u8 get_pstr(char lp,char rp,char *exp,char *sv);
double *rb_dat_num_M=NULL;//实型数据区
u8 rb_dat_num_p;
u8 rb_dat_num_np;
char *rb_dat_str_M=NULL;//字符数据区
u16 rb_dat_str_p;
u16 rb_dat_str_np;
void dat_add_num(double num)//置数字数据
{
if (rb_dat_num_p+1>=rb_dat_num_cnt)
{
rb_error=25;
return;
}
rb_dat_num_M[rb_dat_num_p]=num;
rb_dat_num_p++;
}
double dat_read_num()//读数据
{
if (rb_dat_num_np>=rb_dat_num_p)//无数据溢出
{
rb_error=26;
return 0.0;
}
rb_dat_num_np++;
return rb_dat_num_M[rb_dat_num_np-1];
}
void dat_add_str(char *str)//置字符串数据
{
char len=str_len(str);
if (rb_dat_str_p+len>=rb_dat_str_len)
{
rb_error=25;
return;
}
rb_dat_str_M[rb_dat_str_p]=len;
strcpy(rb_dat_str_M+rb_dat_str_p+1,str);
rb_dat_str_p+=len+2;
}
char *dat_read_str()//读字符串数据
{
if (rb_dat_str_np>=rb_dat_str_p)//无数据溢出
{
rb_error=26;
return NULL;
}
rb_dat_str_np+=rb_dat_str_M[rb_dat_str_np]+2;
return rb_dat_str_M+rb_dat_str_np+1;
}
void dat_restore()//数据重置
{
rb_dat_str_np=0;
rb_dat_num_np=0;
}
void rb_dat_mem()//数据区空间分配
{
rb_dat_num_np=0;
rb_dat_num_p=0;
rb_dat_str_np=0;
rb_dat_str_p=0;
rb_dat_num_M=(double *)new_malloc(sizeof(double)*rb_dat_num_cnt);
rb_dat_str_M=(char *)new_malloc(rb_dat_str_len);
if (rb_dat_num_M==NULL || rb_dat_str_M==NULL)//分配空间失败
{
rb_error=1;
return;
}
}
void rb_dat_free()//释放数据空间
{
new_free(rb_dat_num_M);
new_free(rb_dat_str_M);
}
void dat_clean()//数据清除
{
rb_dat_num_np=0;
rb_dat_num_p=0;
rb_dat_str_np=0;
rb_dat_str_p=0;
rb_dat_free();
}
void rb_data(char *exp) //置数据
{
int i=0;
int tp=0;
u8 is_num=1;
char temp[str_max_len];
char str[str_max_len];
if (rb_dat_num_M==NULL || rb_dat_str_M==NULL)//尚未分配数据区
{
rb_dat_mem();//分配数据空间
if (rb_error) return;
}
while (1)
{
if (exp[i]=='\"')//是字符串常量
{
tp=0;
i++;
while (exp[i]!='\"' && exp[i]!='\0')
{
temp[tp]=exp[i];
tp++;
i++;
}
if (exp[i]!='\"')
{
rb_error=6;
return;
}
temp[tp]='\0';
dat_add_str(temp);
i++;
}
else
{
tp=0;
if (exp[i]=='S' || exp[i]=='C' || exp[i]=='c') is_num=0;
while (exp[i]!=',' && exp[i]!='\0')
{
temp[tp]=exp[i];
i++;
tp++;
}
temp[tp]='\0';
if (is_num) dat_add_num(rb_cal(temp));
else
{
rb_get_str(temp,str);
dat_add_str(str);
}
}
if (exp[i]=='\0') return;
if (exp[i]==',') i++;
else
{
rb_error=6;
return;
}
}
}
void rb_read(char *exp)//读数据
{
int i=0;
char temp[str_max_len];
int id;
u8 step;
while (1)
{
switch (exp[i])
{
case 'F'://读与实数
give_float_val(exp[i+1]-bg_id,dat_read_num());
i+=2;
break;
case 'f'://读与实型数组元素
id=exp[i+1]-bg_id;
i+=3;
step=get_pstr('[',']',exp+i,temp);
if (step==0) {rb_error=6;return;}
i+=step;
give_float_dim_val(id,rb_cal(temp),dat_read_num());
break;
case 'I'://读与整数
give_int_val(exp[i+1]-bg_id,dat_read_num());
i+=2;
break;
case 'i'://整型数组
id=exp[i+1]-bg_id;
i+=3;
step=get_pstr('[',']',exp+i,temp);
if (step==0) {rb_error=6;return;}
i+=step;
give_int_dim_val(id,rb_cal(temp),dat_read_num());
break;
case 'C'://读字符
give_str_val(exp[i+1]-bg_id,dat_read_str());
i+=2;
break;
case 'c'://字符串数组
id=exp[i+1]-bg_id;
i+=3;
step=get_pstr('[',']',exp+i,temp);
if (step==0) {rb_error=6;return;}
i+=step;
give_str_val(id,dat_read_str());
break;
default:
rb_error=6;
return;
}
if (exp[i]=='\0') return;
if (exp[i]==',') i++;
else
{
rb_error=6;
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -