📄 fc-interpret.cpp
字号:
i=memory[iAddress].iNumber;//数组下标
if(!ArraySubscript(i,memory[iTemp].length))//下标检查
return FALSE;
memory[iAddress].dNumber=memory[iTemp].dArray[i];
iCode++;
break;
case OP_LOADARRAYI: //导入整数数组
iTemp=iBase+3+m_code[iCode].sd.iNumber;//数组头位置
i=memory[iAddress].iNumber;//数组下标
if(!ArraySubscript(i,memory[iTemp].length))//下标检查
return FALSE;
memory[iAddress].iNumber=memory[iTemp].iArray[i];
iCode++;
break;
case OP_LOADCONSTD: //导入实常数
iAddress++;
if(!TestAddress(iAddress))
return FALSE;
memory[iAddress].dNumber=m_code[iCode].sd.dNumber;
iCode++;
break;
case OP_LOADCONSTI: //导入整常数
iAddress++;
if(!TestAddress(iAddress))
return FALSE;
memory[iAddress].iNumber=m_code[iCode].sd.iNumber;
iCode++;
break;
case OP_LOADVARD: //导入实型变量
iAddress++;
if(!TestAddress(iAddress))
return FALSE;
memory[iAddress].dNumber=memory[iBase+3+m_code[iCode].sd.iNumber].dNumber;
iCode++;
break;
case OP_LOADVARI: //导入整型变量
iAddress++;
if(!TestAddress(iAddress))
return FALSE;
memory[iAddress].iNumber=memory[iBase+3+m_code[iCode].sd.iNumber].iNumber;
iCode++;
break;
case OP_MINUSD: //实数减
memory[iAddress-1].dNumber-=memory[iAddress].dNumber;
iAddress--;
iCode++;
break;
case OP_MINUSI: //整数减
memory[iAddress-1].iNumber-=memory[iAddress].iNumber;
iAddress--;
iCode++;
break;
case OP_MOD: //余
if(!ZeroSlashMod(memory[iAddress].iNumber))
return FALSE;
memory[iAddress-1].iNumber%=memory[iAddress].iNumber;
iAddress--;
iCode++;
break;
case OP_NEWARRAYD: //申请实型数组
iTemp=memory[iAddress].iNumber;
if(!ArraySubscript(iTemp,-1))
return FALSE;
n=iBase+3+m_code[iCode].sd.iNumber;
memory[n].dArray=new double[iTemp];
memory[n].length=iTemp;
if(!ValideArray(memory[n].iArray))
return FALSE;
for(i=0;i<iTemp;i++)//数组赋初值
memory[n].dArray[i]=0.0;
iCode++;
iAddress--;
break;
case OP_NEWARRAYI: //申请整型数组
iTemp=memory[iAddress].iNumber;
if(!ArraySubscript(iTemp,-1))
return FALSE;
n=iBase+3+m_code[iCode].sd.iNumber;
memory[n].iArray=new int[iTemp];
memory[n].length=iTemp;
if(!ValideArray(memory[n].iArray))
return FALSE;
for(i=0;i<iTemp;i++)//数组赋初值
memory[n].iArray[i]=0;
iCode++;
iAddress--;
break;
case OP_NOT: //逻辑非
if(memory[iAddress].iNumber!=0)
memory[iAddress].iNumber=0;
else memory[iAddress].iNumber=1;
iCode++;
break;
case OP_NOTEQUALD: //实数不等
if(memory[iAddress-1].dNumber != memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_NOTEQUALI: //整数不等
if(memory[iAddress-1].iNumber != memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_NULL: //函数结束标志,返回
iAddress=memory[iBase+1].iNumber //恢复中间代码指针
-m_code[iCode].sd.iNumber;//回收参数传递时参数占用的虚内存
iCode =memory[iBase+2].iNumber+1; //恢复栈顶指针
iBase =memory[iBase].iNumber; //恢复原基地址
if(iBase==0)
goto EndInterpret;
break;
case OP_OR: //逻辑或
if(memory[iAddress-1].iNumber!=0 || memory[iAddress].iNumber!=0)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_OUTPUTD: //输出实数
Output(memory[iAddress].dNumber);
iAddress--;
iCode++;
break;
case OP_OUTPUTI: //输出整数
Output(memory[iAddress].iNumber);
iAddress--;
iCode++;
break;
case OP_OUTPUTS: //输出字符串
Output(m_code[iCode].sd.string);
iCode++;
break;
case OP_PARAMTRANSD: //传递实型参数
memory[iBase+3+m_code[iCode].sd.iNumber].dNumber=
memory[iBase+m_code[iCode].sd.iNumber-m_code[iCode].sd.nParam].dNumber;
iCode++;
break;
case OP_PARAMTRANSI: //传递整型参数
memory[iBase+3+m_code[iCode].sd.iNumber].iNumber=
memory[iBase+m_code[iCode].sd.iNumber-m_code[iCode].sd.nParam].iNumber;
iCode++;
break;
case OP_PLUSD: //实数加
memory[iAddress-1].dNumber+=memory[iAddress].dNumber;
iAddress--;
iCode++;
break;
case OP_PLUSI: //整数加
memory[iAddress-1].iNumber+=memory[iAddress].iNumber;
iAddress--;
iCode++;
break;
case OP_RETURN: //函数返回
iAddress=memory[iBase+1].iNumber+1 //恢复中间代码指针
-m_code[iCode].sd.iNumber;//回收参数传递时参数占用的虚内存
iCode =memory[iBase+2].iNumber+1; //恢复栈顶指针
iBase =memory[iBase].iNumber; //恢复原基地址
if(iBase==0)
goto EndInterpret;
break;
case OP_RETURND: //实型函数返回
dTemp=memory[iAddress].dNumber;//保留返回值
iAddress=memory[iBase+1].iNumber+1 //恢复中间代码指针
-m_code[iCode].sd.iNumber;//回收参数传递时参数占用的虚内存
iCode =memory[iBase+2].iNumber+1; //恢复栈顶指针
iBase =memory[iBase].iNumber; //恢复原基地址
memory[iAddress].dNumber=dTemp;
break;
case OP_RETURNI: //整型函数返回
iTemp=memory[iAddress].iNumber;//保留返回值
iAddress=memory[iBase+1].iNumber+1 //恢复中间代码指针
-m_code[iCode].sd.iNumber;//回收参数传递时参数占用的虚内存
iCode =memory[iBase+2].iNumber+1; //恢复栈顶指针
iBase =memory[iBase].iNumber; //恢复原基地址
memory[iAddress].iNumber=iTemp;
break;
case OP_SAVEARRAYD: //存储实数数组
iTemp=iBase+3+m_code[iCode].sd.iNumber;//数组头位置
i=memory[iAddress-1].iNumber;//数组下标
if(!ArraySubscript(i,memory[iTemp].length))//下标检查
return FALSE;
memory[iTemp].dArray[i]=memory[iAddress].dNumber;
iAddress-=2;
iCode++;
break;
case OP_SAVEARRAYI: //存储整数数组
iTemp=iBase+3+m_code[iCode].sd.iNumber;//数组头位置
i=memory[iAddress-1].iNumber;//数组下标
if(!ArraySubscript(i,memory[iTemp].length))//下标检查
return FALSE;
memory[iTemp].iArray[i]=memory[iAddress].iNumber;
iAddress-=2;
iCode++;
break;
case OP_SAVED: //保存实型变量值
memory[iBase+3+m_code[iCode].sd.iNumber].dNumber=memory[iAddress].dNumber;
iAddress--;
iCode++;
break;
case OP_SAVEI: //保存整型变量值
memory[iBase+3+m_code[iCode].sd.iNumber].iNumber=memory[iAddress].iNumber;
iAddress--;
iCode++;
break;
case OP_SLASHD: //实数除
if(!ZeroSlashMod(memory[iAddress].dNumber))//测试是否除数为0
return FALSE;
memory[iAddress-1].dNumber/=memory[iAddress].dNumber;
iAddress--;
iCode++;
break;
case OP_SLASHI: //整数除
if(!ZeroSlashMod(memory[iAddress].iNumber))//测试是否除数为0
return FALSE;
memory[iAddress-1].iNumber/=memory[iAddress].iNumber;
iAddress--;
iCode++;
break;
case OP_TIMESD: //实数乘
memory[iAddress-1].dNumber*=memory[iAddress].dNumber;
iAddress--;
iCode++;
break;
case OP_TIMESI: //整数乘
memory[iAddress-1].iNumber*=memory[iAddress].iNumber;
iAddress--;
iCode++;
break;
default://由于定义的所有操作上边均已经实现,认为不可能到此default,故有以下处理
Output("\r\n程序发生错误,请将此错误告知ZKF,以便进行修改,谢谢!\r\n");
return FALSE;
}
}
EndInterpret:
Output("\r\n程序执行用时 ");
Output(tElapse+clock()-tStart);
Output(" 毫秒\r\n");
MessageBeep(0);
return TRUE;
}//end interpret
void CFCDlg::Output(CString string)
{
m_strEdit+=string;
UpdateData(FALSE);
}
void CFCDlg::Output(int n)
{
CString temp;
temp.Format("%d",n);
m_strEdit+=temp;
UpdateData(FALSE);
}
void CFCDlg::Output(double d)
{
CString temp;
temp.Format("%."+m_strPrecision+"f",d);
m_strEdit+=temp;
UpdateData(FALSE);
}
int CFCDlg::InputInt(void)
{
CFCInputDlg dlg;
int result=dlg.InputInt();
CString temp;
temp.Format("%d\r\n",result);
m_strEdit+=temp;
UpdateData(FALSE);
return result;
}
double CFCDlg::InputDouble(void)
{
CFCInputDlg dlg;
double result=dlg.InputDouble();
CString temp;
temp.Format("%."+m_strPrecision+"f\r\n",result);
m_strEdit+=temp;
UpdateData(FALSE);
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -