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

📄 fc-interpret.cpp

📁 我开发了一个基于MFC的语言翻译软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -