📄 eval.cpp
字号:
{
bufftemp0[yy0]=bufftemp[yy];
yy0++;
}
bufftemp0[yy0]='\0';
buffer.Connect(bufftemp0);
}
//result=buffer;
stkTokens.Push(buffer);
}
//else if (sTemp=="^")
else if (cm8==0)
{
op1=atoi(stkTokens.pop().GetValue());
op2=atoi(stkTokens.pop().GetValue());
op3=op1 ^ op2;
ltoa((long)op3, resbuf,10);
len=strlen(resbuf);
// if (len<9)
// {
for (k=0;k<len;k++)
result.SetAt (k,resbuf[k]);
result.SetAt (k,'\0');
// }
stkTokens.Push(result);
}
//else if (sTemp=="&")
else if (cm9==0)
{
op1=atoi(stkTokens.pop().GetValue());
op2=atoi(stkTokens.pop().GetValue());
op3=op1 & op2;
//ltoa((long)op3, resbuf,10);
itoa((int)op3, resbuf,10);
len=strlen(resbuf);
//if (len<9)
//{
for (k=0;k<len;k++)
result.SetAt (k,resbuf[k]);
result.SetAt (k,'\0');
//}
stkTokens.Push(result);
}
//else if (sTemp=="|")
else if (cm10==0)
{
op1=atoi(stkTokens.pop().GetValue());
op2=atoi(stkTokens.pop().GetValue());
op3=op1 | op2;
ltoa((long)op3, resbuf,10);
len=strlen(resbuf);
// if (len<9)
// {
for (k=0;k<len;k++)
result.SetAt (k,resbuf[k]);
result.SetAt (k,'\0');
// }
stkTokens.Push(result);
}
}
}
i = j + 1;
if (i<sExpression.GetLength())
{
buffer.SetValue("");
//buffer=sExpression.Mid (i,sExpression.GetLength()-i);
buffer=sExpression.Mid (i,sExpression.GetLength()-i);
j=buffer.Find(' ');
j=j+i;
i++;
}
else
j=-1;
}
if (stkTokens.GetStackSize() > 0)
returnflg =(float)atof(stkTokens.pop().GetValue());
else
returnflg = 0;
return returnflg;
}
bool CEval::Evaluate(CPrvString sExpression, float *InData)
{
int nErrPosition;
bool rett;
float retval;
rett=false;
nErrPosition = InfixToPostfix(sExpression);
if (nErrPosition ==0)
{
//retval=DoEvaluate(sBuffer);
*InData =DoEvaluate(sBuffer);
rett=true;
}
else if (nErrPosition ==1)
{
// dlgError.v_errmsg =sErrorMessage;
// dlgError.DoModal();
rett=false;
}
else
{
//retval= (float)nErrPosition;
*InData =nErrPosition;
rett=false;
}
return rett;
}
int CEval::InfixToPostfix(CPrvString sExpression)
{
int i,nCurrState,nParenCount,yy0;
bool bDecPoint;
CStack stkTokens;
CPrvString sTemp,pushstr,comstr,ssensor;
char ch,temch;
float idata;
char *resbuf;
int decimal, sign;
char *bufftemp;
char bufftemp0[256];
int yy,cm0;
char yh[2];
CPrvString buffer, hyy;
int retfloat;
int isensor;
float fvl;
retfloat=0;
nCurrState = STATE_NONE;
nParenCount = 0;
//ch='a';
i = 1;
comstr.SetValue("0123456789.");
while (i<=sExpression.GetLength())
{
ch=sExpression.GetAt(i-1);
//ch=sExpression.Mid (i-1,1);
if (ch>' ')
{
switch(ch)
{
case '(':
if (nCurrState == STATE_OPERAND)
{
sErrorMessage.SetValue("缺少操作数!");
goto EvalError;
}
if (nCurrState == STATE_UNARYOP)
nCurrState = STATE_OPERATOR;
//pushstr=ch;
yh[0]=ch;
yh[1]='\0';
pushstr.SetValue(yh);
stkTokens.Push(pushstr);
nParenCount = nParenCount + 1;
break;
case ')':
if (nCurrState != STATE_OPERAND)
{
sErrorMessage.SetValue("缺少操作符!");
goto EvalError;
}
if (nParenCount == 0)
{
sErrorMessage.SetValue("缺少)括号!");
goto EvalError;
}
sTemp = stkTokens.pop();
temch=sTemp.GetAt(0);
//while (sTemp != '(')
while (temch !='(')
{
//sBuffer = sBuffer + sTemp + ' ';
sBuffer.Connect(sTemp.GetValue());
sBuffer.Connect(" ");
sTemp = stkTokens.pop();
temch=sTemp.GetAt(0);
}
nParenCount = nParenCount - 1;
break;
case '+':
case '-':
case '*':
case '/':
case '^':
case '&':
case '|':
case '!':
case '$':
case '@':
if (nCurrState == STATE_OPERAND)
{
yh[0]=ch;
yh[1]='\0';
//pushstr=ch;
pushstr.SetValue(yh) ;
while (stkTokens.GetStackSize() > 0)
{
if (GetPrecedence(stkTokens.GetPopValue()) < GetPrecedence(pushstr))
break;
// sBuffer = sBuffer + stkTokens.pop() + ' ';
hyy=stkTokens.pop();
sBuffer.Connect(hyy.GetValue());
sBuffer.Connect(" ");
}
//buffer=pushstr;
stkTokens.Push(pushstr);
nCurrState = STATE_OPERATOR;
}
else if (nCurrState == STATE_UNARYOP)
{
sErrorMessage.SetValue("缺少操作数,请重新输入");
goto EvalError;
}
else if (nCurrState == STATE_lOGICNOT)
{
sErrorMessage.SetValue("缺少操作数,请重新输入");
goto EvalError;
}
else if (nCurrState == STATE_SIN)
{
sErrorMessage.SetValue("缺少操作数,请重新输入");
goto EvalError;
}
else if (nCurrState == STATE_COS)
{
sErrorMessage.SetValue("缺少操作数,请重新输入");
goto EvalError;
}
else
if (ch == '-')
{
hyy.SetValue("(-)");
//stkTokens.Push(UNARY_NEG);
stkTokens.Push(hyy);
nCurrState = STATE_UNARYOP;
}
else if (ch == '!')
{
//stkTokens.Push(LOGIC_NOT);
hyy.SetValue("(!)");
stkTokens.Push(hyy);
nCurrState = STATE_lOGICNOT;
}
else if (ch == '$')
{
//stkTokens.Push(TRIANGLE_SIN);
hyy.SetValue("($)");
stkTokens.Push(hyy);
nCurrState = STATE_SIN;
}
else if (ch == '@')
{
//stkTokens.Push(TRIANGLE_COS);
hyy.SetValue("(@)");
stkTokens.Push(hyy);
nCurrState = STATE_COS;
}
else
{
sErrorMessage.SetValue("缺少操作符!");
goto EvalError;
}
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
if (nCurrState == STATE_OPERAND)
{
sErrorMessage.SetValue("缺少操作符,请重新输入");
goto EvalError;
}
sTemp.SetValue("");
bDecPoint = false;
//while (comstr.Find (ch,0)!=-1)
while (comstr.Find(ch)!=-1)
{
if (ch == '.')
{
if (bDecPoint)
{ sErrorMessage.SetValue("操作符中有多个小数点!");
goto EvalError;
}
else
bDecPoint = true;
}
// sTemp = sTemp + ch;
yh[0]=ch;
yh[1]='\0';
sTemp.Connect(yh) ;
i = i + 1;
if (i > sExpression.GetLength())
break;
ch=sExpression.GetAt(i-1);
//ch = Mid$(sExpression, i, 1);
}
i = i - 1;
cm0=-1;
cm0=strcmp(sTemp.GetValue(),".");
//if (sTemp == '.')
if (cm0 == 0)
{
sErrorMessage.SetValue("非法操作符!");
goto EvalError;
}
//sBuffer = sBuffer + sTemp + ' ';
sBuffer.Connect(sTemp.GetValue());
sBuffer.Connect(" ");
nCurrState = STATE_OPERAND;
break;
default :
if (nCurrState == STATE_OPERAND)
{
sErrorMessage.SetValue("缺少操作数!");
goto EvalError;
}
yh[0]=ch;
yh[1]='\0';
hyy.SetValue(yh);
//if (IsSymbolCharFirst(ch))
if (IsSymbolCharFirst(hyy))
{
//sTemp = ch;
sTemp = hyy;
i = i + 1;
if (i <= sExpression.GetLength())
{
ch=sExpression.GetAt(i-1);
//ch = Mid$(sExpression, i, 1)
yh[0]=ch;
yh[1]='\0';
hyy.SetValue(yh);
//while (IsSymbolChar(ch))
while (IsSymbolChar(hyy))
{
//sTemp = sTemp + ch;
yh[0]=ch;
yh[1]='\0';
sTemp.Connect(yh);
i = i + 1;
if (i > sExpression.GetLength())
break;
ch=sExpression.GetAt(i-1);
//ch = Mid$(sExpression, i, 1)
yh[0]=ch;
yh[1]='\0';
hyy.SetValue(yh);
}
}
ssensor=sTemp.Mid(1,sTemp.GetLength()-1);
ssensor.Mid(1,sTemp.GetLength()-1);
isensor=atoi(ssensor.GetValue());
getvl(isensor,&fvl);
//if (m_SymbolTable.IsDefined(sTemp))
// m_SymbolTable.Delete (sTemp);
//idata=atof(InputData.GetValue());
//if (idata > 0)
if ((fvl==-100) || (fvl==-200) || (fvl==-300) )
//m_SymbolTable.AddOrModify(sTemp,fvl);
//else
{
retfloat=(int)idata;
goto ErrorValue;
}
buffer.SetValue("");
//bufftemp = _fcvt( m_SymbolTable.GetValue(sTemp), 3, &decimal, &sign );
bufftemp = _fcvt(fvl, 3, &decimal, &sign );
if (sign==1)
//buffer='-';
buffer.SetValue("-");
if (decimal==0)
{ //buffer=buffer+'0'+'.'+bufftemp;
buffer.Connect("0");
buffer.Connect(".");
buffer.Connect(bufftemp);
}
else
{
for (yy=0;yy<decimal;yy++)
//buffer=buffer+bufftemp[yy];
bufftemp0[yy]=bufftemp[yy];
bufftemp0[yy]='\0';
buffer.Connect(bufftemp0);
buffer.Connect(".");
//buffer=buffer+'.';
yy0=0;
for (yy;(unsigned)yy<strlen(bufftemp);yy++)
//buffer=buffer+bufftemp[yy];
{
bufftemp0[yy0]=bufftemp[yy];
yy0++;
}
bufftemp0[yy0]='\0';
buffer.Connect(bufftemp0);
}
//sBuffer = sBuffer + buffer + ' ';
sBuffer.Connect(buffer.GetValue());
sBuffer.Connect(" ");
nCurrState = STATE_OPERAND;
i = i - 1;
}
else
{
sErrorMessage.SetValue("无效字符!");
goto EvalError;
}
}
}
i++;
}
if ((nCurrState == STATE_OPERATOR) || (nCurrState == STATE_UNARYOP) || (nCurrState == STATE_lOGICNOT))
{
sErrorMessage.SetValue("缺少操作符!");
goto EvalError;
//m_sErrMsg = "Operand expected"
}
if (nParenCount > 0)
{
sErrorMessage.SetValue("缺少)括号!");
goto EvalError;
//m_sErrMsg = "Closing parenthesis expected"
}
while ((stkTokens.GetStackSize())!=0)
{
//sBuffer = sBuffer + stkTokens.pop() + ' ';
CPrvString hyy;
hyy=stkTokens.pop();
sBuffer.Connect(hyy.GetValue());
sBuffer.Connect(" ");
}
return 0;
EvalError: return 1;
ErrorValue: return retfloat;
}
bool CEval::getvl(int sensor,float *vl)
{
int n=0;
while((n<Timedata.DataNum)&&(Timedata.NowdataRec[n].addr_sensor!=sensor))
n++;
if(Timedata.NowdataRec[n].addr_sensor==sensor)
{
*vl=Timedata.NowdataRec[n].nowdata;
return 1;
}
return 0;
}
bool CEval::SinIsNumric(CPrvString sss)
{
CPrvString m;
bool returnflg;
int i,j,k;
char cc;
m.SetValue("0123456789.");
returnflg=true;
j=sss.GetLength();
for (k=0;k<j;k++)
{
cc=sss.GetAt(k);
i=m.Find(cc);
if (i==-1)
{
returnflg = false;
break;
}
}
return returnflg;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -