📄 rb_cyc.c
字号:
#include <CsAgb.h>
#include <rb_stdio.h>
#include <rbasic.h>
#include <rb_var.h>
#define max_cyc_cnt 15 //最大循环深度
#define cyc_for 1
#define cyc_while 2
#define cyc_sub 3
extern double rb_cal(char *exp);
extern logic_exe(char *exp);
typedef struct
{
u8 type;
u8 id;//循环变量代号
u32 pc;//入口地址
double end_val;//终止数值
double step;//步长
char exp[str_max_len];//条件代码
} rb_cyc;//循环体数据结构
rb_cyc *rb_cycs;//循环体数据存储区
u8 cyc_p=0;//当前循环深度
void rb_for(char *exp)
{
int i,sp;
double start;
char temp[str_max_len];
if (cyc_p>=max_cyc_cnt) {rb_error=27;return;}
if (exp[0]!='F' || exp[2]!='=') {rb_error=6;return;}//循环变量只能用实型变量
rb_cycs[cyc_p].id=exp[1]-bg_id;//获得循环变量编号
rb_cycs[cyc_p].type=cyc_for;//置循环体类型
i=3;
sp=0;
while (1)//获得初始值
{
if (exp[i]=='K' && exp[i+1]==bg_id+17) break;
if (exp[i]=='\0') {rb_error=6;return;}
temp[sp]=exp[i];
i++;
sp++;
}
if (sp==0) {rb_error=6;return;}
temp[sp-1]='\0';
start=rb_cal(temp);
i+=3;
sp=0;
while (1)//获得终止值
{
if (exp[i]=='\0' || (exp[i]=='K' && exp[i+1]==bg_id+18)) break;
temp[sp]=exp[i];
i++;
sp++;
}
if (exp[i]=='K')//有step
{
temp[sp-1]=='\0';
rb_cycs[cyc_p].end_val=rb_cal(temp);//置终止数值
sp=0;i+=3;
while (exp[i]!='\0')
{
temp[sp]=exp[i];
sp++;i++;
}
temp[sp]='\0';
rb_cycs[cyc_p].step=rb_cal(temp);//置步长
}
else //步长取默认值
{
temp[sp]='\0';
rb_cycs[cyc_p].end_val=rb_cal(temp);//置终止数值
if (rb_cycs[cyc_p].end_val>start) rb_cycs[cyc_p].step=1;
else rb_cycs[cyc_p].step=-1;
}
give_float_val(exp[1]-bg_id,start);//循环变量赋初值
rb_cycs[cyc_p].pc=rb_pc;//置程序入口
cyc_p++;
}
void rb_next(char *exp)
{
int np=cyc_p-1;
double val;
if (cyc_p==0 || rb_cycs[np].type!=cyc_for) {rb_error=8;return;}
val=get_float_val(rb_cycs[np].id);
val+=rb_cycs[np].step;
give_float_val(rb_cycs[np].id,val);
if ((rb_cycs[np].step>=0.0 && val>rb_cycs[np].end_val)
|| (rb_cycs[np].step<0 && val<rb_cycs[np].end_val)) cyc_p--;//循环结束
else //更新循环变量值
{
rb_pc=rb_cycs[np].pc;
}
}
void rb_while(char *exp)
{
int i=0;
if (cyc_p>=max_cyc_cnt) {rb_error=27;return;}
while (exp[i]!='\0')
{
rb_cycs[cyc_p].exp[i]=exp[i];
i++;
}
rb_cycs[cyc_p].exp[i]='\0';
rb_cycs[cyc_p].type=cyc_while;
rb_cycs[cyc_p].pc=rb_pc;
cyc_p++;
}
void rb_wend(char *exp)
{
int np=cyc_p-1;
if (cyc_p==0 || rb_cycs[np].type!=cyc_while) {rb_error=29;return;}
if (logic_exe(rb_cycs[np].exp)) rb_pc=rb_cycs[np].pc;//继续执行循环体
else cyc_p--;//循环结束
}
void rb_gosub(char *exp)
{
u8 id;
if (cyc_p>=max_cyc_cnt) {rb_error=27;return;}
if (exp[0]!='@' || exp[2]!='\0') {rb_error=6;return;}
rb_cycs[cyc_p].type=cyc_sub;
rb_cycs[cyc_p].pc=rb_pc;
rb_pc=rb_marks[exp[1]-bg_id];
cyc_p++;
if (rb_pc==0) rb_error=31;
}
void rb_ret(char *exp)
{
int np=cyc_p-1;
if (cyc_p==0 || rb_cycs[np].type!=cyc_sub) {rb_error=10;return;}
rb_pc=rb_cycs[np].pc;
cyc_p--;
}
void rb_cyc_mem()
{
rb_cycs=(rb_cyc *)malloc(sizeof(rb_cyc)*max_cyc_cnt);
cyc_p=0;
}
void free_cyc()
{
myfree(rb_cycs);
cyc_p=0;
}
void clean_cyc()
{
cyc_p=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -