?? 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 + -