?? fc-interpret.cpp
字號:
#include "stdafx.h"
#include "FC.h"
#include "FCDlg.h"
#include "FCInputDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BOOL CFCDlg::TestAddress(int iAddress)
{
if(iAddress>=nMEMORY)
{
Output("\r\n地址溢出,程序停止執(zhí)行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
BOOL CFCDlg::ZeroSlashMod(int i)
{
if(i==0)
{
Output("\r\n“/”或“%”的右操作數(shù)為0,程序停止執(zhí)行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
BOOL CFCDlg::ZeroSlashMod(double d)
{
if(d==0.0)
{
Output("\r\n“/”或“%”的右操作數(shù)為0,程序停止執(zhí)行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
BOOL CFCDlg::ArraySubscript(int index,int length)
{
if(index<0 || (length>=0 && index>=length))
{
Output("\r\n數(shù)組下標溢出,程序停止執(zhí)行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
BOOL CFCDlg::ValideArray(void *pArray)
{
if(pArray==NULL)
{
Output("\r\n無法分配數(shù)組空間,程序停止執(zhí)行!\r\n");
MessageBeep(0);
return FALSE;
}
return TRUE;
}
// CFCDlg 運行函數(shù)
BOOL CFCDlg::Interpret(void)
{
const double m_iCode=0;//定義此變量只是為了屏蔽外部成員變量
int i,n,iTemp;
double dTemp;
register int iBase=0; //函數(shù)基地址
register int iCode=0; //代碼指針
register int iAddress=0; //地址指針
ZMemory memory[nMEMORY]; //虛內(nèi)存
register int iOp; //指令條數(shù)計數(shù)
BOOL bWarning=TRUE; //是否對可能的死循環(huán)進行警告
clock_t tStart,tElapse=0;
tStart=clock();
for(iOp=0;;iOp++)
{
if(iOp==17333 && bWarning)//17333只是表示173班33號,無其他意義
{
tElapse+=clock()-tStart;
switch(MessageBox("\
程序可能進入死循環(huán),要中止解釋執(zhí)行嗎?\n\
按“是”中止解釋執(zhí)行,按“否”繼續(xù)解釋執(zhí)行\(zhòng)n\
按“取消”繼續(xù)解釋執(zhí)行并不再顯示此消息框",
"FC 2.2",MB_YESNOCANCEL|MB_ICONQUESTION))
{
case IDYES:
tStart=clock();
goto EndInterpret;
//此處無需break語句
case IDCANCEL:
bWarning=FALSE;
//此處不填入break語句
case IDNO:
tStart=clock();
iOp=0;
break;
}
}
switch(m_code[iCode].op)
{
case OP_AND: //邏輯與
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_CALL: //調(diào)用函數(shù)
if(!TestAddress(iAddress+3))// +3 是因為下邊需要3單元虛內(nèi)存
return FALSE;
memory[iAddress+1].iNumber=iBase; //保留原基地址
memory[iAddress+2].iNumber=iAddress;//保留原棧頂指針
memory[iAddress+3].iNumber=iCode; //保留原中間代碼指針
iBase=iAddress+1;
iCode=m_code[iCode].sd.iNumber;
iAddress+=m_code[iCode].sd.iNumber+3;
iCode++;
break;
case OP_CHANGESIGNALD: //實數(shù)變號
memory[iAddress].dNumber= -memory[iAddress].dNumber;
iCode++;
break;
case OP_CHANGESIGNALI: //整數(shù)變號
memory[iAddress].iNumber= -memory[iAddress].iNumber;
iCode++;
break;
case OP_COPYD: //復制棧頂實數(shù)
iAddress++;
if(!TestAddress(iAddress))
return FALSE;
memory[iAddress].dNumber=memory[iAddress-1].dNumber;
iCode++;
break;
case OP_COPYI: //復制棧頂整數(shù)
iAddress++;
if(!TestAddress(iAddress))
return FALSE;
memory[iAddress].iNumber=memory[iAddress-1].iNumber;
iCode++;
break;
case OP_D2I: //實數(shù)變整數(shù)
memory[iAddress+m_code[iCode].sd.iNumber].iNumber=
(int)memory[iAddress+m_code[iCode].sd.iNumber].dNumber;
iCode++;
break;
case OP_DELARRAYD: //刪除實數(shù)數(shù)組
delete memory[iBase+3+m_code[iCode].sd.iNumber].dArray;
iCode++;
break;
case OP_DELARRAYI: //刪除整型數(shù)組
delete memory[iBase+3+m_code[iCode].sd.iNumber].iArray;
iCode++;
break;
case OP_DELETE: //刪除棧頂數(shù)
iAddress--;
iCode++;
break;
case OP_EQUALD: //實數(shù)相等
if(memory[iAddress-1].dNumber == memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_EQUALI: //整數(shù)相等
if(memory[iAddress-1].iNumber == memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_EXIT: //程序結束標志
goto EndInterpret;
case OP_GREATD: //實數(shù)大于
if(memory[iAddress-1].dNumber > memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_GREATEQUALD: //實數(shù)大于等于
if(memory[iAddress-1].dNumber >= memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_GREATEQUALI: //整數(shù)大于等于
if(memory[iAddress-1].iNumber >= memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_GREATI: //整數(shù)大于
if(memory[iAddress-1].iNumber > memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_I2D: //整數(shù)變實數(shù)
memory[iAddress+m_code[iCode].sd.iNumber].dNumber=
(double)memory[iAddress+m_code[iCode].sd.iNumber].iNumber;
iCode++;
break;
case OP_INPUTARRAYD: //輸入實數(shù)數(shù)組
iTemp=iBase+3+m_code[iCode].sd.iNumber;//數(shù)組頭位置
i=memory[iAddress].iNumber;//數(shù)組下標
if(!ArraySubscript(i,memory[iTemp].length))//下標檢查
return FALSE;
tElapse+=clock()-tStart;
memory[iTemp].dArray[i]=InputDouble();
tStart=clock();
iAddress--;
iCode++;
break;
case OP_INPUTARRAYI: //輸入整數(shù)數(shù)組
iTemp=iBase+3+m_code[iCode].sd.iNumber;//數(shù)組頭位置
i=memory[iAddress].iNumber;//數(shù)組下標
if(!ArraySubscript(i,memory[iTemp].length))//下標檢查
return FALSE;
tElapse+=clock()-tStart;
memory[iTemp].iArray[i]=InputInt();
tStart=clock();
iAddress--;
iCode++;
break;
case OP_INPUTD: //輸入實型值
tElapse+=clock()-tStart;
memory[iBase+3+m_code[iCode].sd.iNumber].dNumber=InputDouble();
tStart=clock();
iCode++;
break;
case OP_INPUTI: //輸入整型值
tElapse+=clock()-tStart;
memory[iBase+3+m_code[iCode].sd.iNumber].iNumber=InputInt();
tStart=clock();
iCode++;
break;
case OP_JUMP: //無條件跳轉
iCode=m_code[iCode].sd.iNumber;
break;
case OP_JUMPC: //條件跳轉
if(memory[iAddress].iNumber!=0)
iCode=m_code[iCode].sd.iNumber;
else iCode++;
iAddress--;
break;
case OP_LESSD: //實數(shù)小于
if(memory[iAddress-1].dNumber < memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_LESSEQUALD: //實數(shù)小于等于
if(memory[iAddress-1].dNumber <= memory[iAddress].dNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_LESSEQUALI: //整數(shù)小于等于
if(memory[iAddress-1].iNumber <= memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_LESSI: //整數(shù)小于
if(memory[iAddress-1].iNumber < memory[iAddress].iNumber)
memory[iAddress-1].iNumber=1;
else memory[iAddress-1].iNumber=0;
iAddress--;
iCode++;
break;
case OP_LOADARRAYD: //導入實數(shù)數(shù)組
iTemp=iBase+3+m_code[iCode].sd.iNumber;//數(shù)組頭位置
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -