Beispiel #1
0
string RadomFormula::GetFormula()
{
	p1 = rand() % 30;
	p2 = rand() % 30;
	op1 = rand() % OpArr.size();

	int pi = Operate(op1, p1, p2);
	int s1 = -pi;
	int s2 = 30 - pi;
	if (s1 < -30)
	{
		s1 = -30;
	}
	if (s2 > 30)
	{
		s2 = 30;
	}
	p3 = s1 + rand() % (s2 - s1);
	if (p3 >= 0)
	{
		op2 = 0;
	}
	else
	{
		op2 = 1; p3 = -p3;
	}
	return Transport(p1) + OpArr[op1] + Transport(p2) + OpArr[op2] + Transport(p3) + "=";
}
Beispiel #2
0
/*************************************************************
 * Que 3. Post fix expression evaluation
 * 
 * Comment    : 1) prepare stack for holding operands only.
 *              2) Push when numbers are read.
 *              3) Pop two numbers when ever operand is encountered.
 * 
 * Parameters : expression array
 * Returns    : int (eval result)
 *************************************************************/
int  PostFixEval(char A[])
{
   LinkedListStack stack;
   int tokenType = EMPTY,num,i=0;;
   char token;

   while((tokenType = ReadToken(A,i,token,num)) != EMPTY)
   {
      if(tokenType == OPERAND) //Numbers
      {
	 stack.Push(token - '0');
      }
      else if(tokenType == OPERATOR) //Mathematical operator
      {
	int A = stack.Pop();
	int B = stack.Pop();
	stack.Push(Operate(A,B,token));
      }
      else 
      {
	//Should not reach here
	assert(1 == 0);
      }
  }
  if(stack.IsEmpty())
    return -1;
  return stack.Pop();   
}
Beispiel #3
0
int EvaluateExpression()
{
   char ch; type e,theta,a,b;
   SqStack OPTR,OPND;    //OPTR为运算符栈,OPND为运算数栈
   StackInit(&OPTR); StackInit(&OPND);
   Push(&OPTR,'#');
   ch=getchar();
   while(ch!='#' || GetTop(&OPTR)!='#')
   {
      if(!In(ch))
      {
         Push(&OPND,ch);
         ch=getchar();
      }
      else
      {
         switch(Precede(GetTop(&OPTR),ch))
         {
            case '<':Push(&OPTR,ch); ch=getchar(); break;
            case '=':Pop(&OPTR,&e); ch=getchar(); break;
            case '>':Pop(&OPTR,&theta);Pop(&OPND,&b);Pop(&OPND,&a);
                     Push(&OPND,Operate(a,theta,b)); break;
         }
      }
   }
   return GetTop(&OPND);
}
//***************************************************************
EVENT_TYPE	TUsartGSM::OnEvent(TEvent* Event)
{uint16_t	msgMsg = msgEmpty	;

 strRcv = GetS(RcvBuf,LenBF)								;// есть принятые строки?
 cntRcv = (strRcv && *strRcv)? strlen(strRcv) : 0			;// сколько их?
 if(strRcv && cntRcv){ msgMsg = Parse(strRcv,cntRcv)		;  strRcv = 0	;}

 if(!msgMsg) msgMsg = OnEventGSM()							;
 if(!timOut && !msgMsg){ msgMsg = msgTimeOut ; timOut = -1	;}
 if(msgMsg != msgEmpty){ timOut = Operate(msgMsg)			;}// !!!!!!!!!!!!!!!!!
 if(timOut <= 0) timOut = TIM_IDLE							;

 if(prStateTrg != StateTrg || prSttPhase != SttPhase){
   prStateTrg = StateTrg	; prSttPhase = SttPhase			;
   sprintf(StrStt,"%s, %d",strStat[StateTrg],SttPhase)		; strStt = StrStt	;}
 
 switch(Event->Type){
 case evGetEvent:
   if(strDbg)     { Event->Type = evDbgMsg1	; Event->strData[0] = strDbg		; strDbg = 0	;}
   else if(strMsg){ Event->Type = evDbgMsg2	; Event->strData[0] = (char*)strMsg	; strMsg = 0	;}
   else if(flEventNeed){ Event->Type = flEventNeed	; Event->Value = flValueNeed; flEventNeed=0	;}
   else if(strStt){ Event->Type = evStat1	; Event->strData[0] = strStt		; strStt = 0	;}
   else if(flInitOK){Event->Type = evGsmInitOK	; flInitOK = 0	;}
 break	;
 
// case evClearPswGSM	: PswGSM = 0	; if(FnSetPswGSM ) FnSetPswGSM(PswGSM)			; break	;
 
	// если произошло событие по которому необходимо отправить инфоСМС, то
 case evEventSMS :  strncpy(PhoneNmbrSMS,GetMasterNmbr(),16)					;// отправить инф. СМС на MasterNmbr
					if(!StrCmp(PhoneNmbrSMS,strValidNmbr)){		 				 // если он валидный
					  NeedSendSMS = 1 ; timGuardSMS = 0							;}
					else{ *PhoneNmbrSMS = 0	; SetMasterNmbr(PhoneNmbrSMS)		;}// иначе, стереть его
		break	;
 } 
 return Event->Type		;}
Beispiel #5
0
WORD direct_read(WORD pos, WORD size, char *buf)
{
  DiscReq req;
#ifdef debug
	IOdebug("msdosfs : direct_read - pos %d, size %d", pos, size);
#endif

  	req.DevReq.Request = FG_Read;
  	req.DevReq.Action = Action;
	req.DevReq.SubDevice = DEFAULTPART;
  	req.Pos = pos/Sector_size;
  	req.Size = size/Sector_size;
	if(size % Sector_size)
		req.Size++;
  	req.Buf = buf; 

#ifdef debugE
	IOdebug("msdosfs : direct_read %d %d", req.Pos, req.Size);
#endif
		
	Operate(dcb, &req);
    	if( req.DevReq.Result == 0)
	{

#ifdef debugE
	  IOdebug("msdosfs : read %d bytes", req.Actual);
#endif
	  return size;
	}
#ifdef debugE
		IOdebug("msdosfs ERROR : flop_read : can't read");
#endif
	return 0;
}
Beispiel #6
0
ElemType OperaType(void){
	//全数据为整型操作
	SqStack OPTR,OPND;//OPTR运算符栈,OPND运算栈
	InitStack(OPTR);
	Push(OPTR,'#');
	InitStack(OPND);
	int ch,x,a,b,theta;
	ch=getche();
	while(ch!='#' || GetTop(OPTR)!='#'){
		if(!In(ch)){
			Push(OPND,ch-48);
			ch=getche();
		}else{
			switch(Precede(GetTop(OPTR),ch)){
			case '<':
				Push(OPTR,ch);
				ch=getche();
				break;
			case '=':
				Pop(OPTR,x);
				ch=getche();
				break;
			case '>':
				Pop(OPTR,theta);
				Pop(OPND,b);
				Pop(OPND,a);
				Push(OPND,Operate(a,theta,b));
				break;
			}//switch
		}//if else
	}//while
	return GetTop(OPND);
}// OperaTyp
Beispiel #7
0
void CTrigger::Countdown (bool bObjTrigger)
{
if ((m_info.tOperated > 0) && !Delay ()) {
	Operate (m_info.nObject, m_info.nPlayer, m_info.bShot, bObjTrigger);
	if (m_info.flags & TF_PERMANENT)
		m_info.tOperated = -1;
	else
		m_info.time = 0;
	}
}
Beispiel #8
0
void makeStack(OPNDType *top1, OPTRType *top2)
{
	OPNDType	*Np, *Nq;
	OPTRType	*Tp, *Tq;
	char		ch, operator;
	char		save[20] = {0};
	int		i, f, k = 0, k1;
	double		a, b;

	PushStack2(top2, '#');		//先给运算栈低存入 # 起始标识符
	ch = getchar();
	while( 1 ){

		if( !decide(ch) )	//若 非运算符运算数 则转换成 # 结束标识符
			ch = '#';

		i = 0, f = 0, k1 = 0;	//i和f辅助存入 n 位数字 k1 辅助存入负数

		if( (ch >= '0' && ch <= '9') || ch == '.')	f = 1;
		if( (k == '#' || k == '(') && !f && ch == '-'){		//判断减号是否为负号

			ch = getchar(), k1 = 1;
			if( ch >= '0' && ch <= '9' )	f = 1;
		}
		while( (ch >= '0' && ch <= '9') || ch == '.')
			save[i++] = ch, ch = getchar();		//将字符型数字存到数组中

		if( f ){

			save[i] = '\0';
			if( k1 )
				PushStack1(top1, atof(save)*-1);	//将字符串转换成双精度
			else
				PushStack1(top1, atof(save));
			continue ;
		}
		k = ch;			//辅助存入负数
		switch(Precede(GetTop(top2), ch)){

			case 1 : return ;	//运算完毕
			case '<' :
				PushStack2(top2, ch);	ch = getchar();	break;	//进栈继续接收
			case '=' :
				PopStack2(top2, &operator);	ch = getchar();	break;	//出栈继续接收
			case '>' :			//运算 不接收
				PopStack2(top2, &operator);
				PopStack1(top1, &a), PopStack1(top1, &b);
				PushStack1(top1, Operate(b, operator, a));
				break ;
		}
		if( ch == '#' && !top2->next)
			return ;
	}
}
Beispiel #9
0
int EvaluateExpression(){

    int n;
    int flag;
    int c;
    char x,theta;
    int a,b;

    char OP[]="+-*/()#";
    SqStack  OPTR;
    SqStack  OPND;

    init_stack(&OPTR);      
    push(&OPTR,'#');
    init_stack(&OPND);
    flag=getNext(&c);

    get_top(OPTR, &x);
    while(c!='#' || x != '#')
    {
        if(flag == 0)
	     {
                  push(&OPND,c);
                  flag = getNext(&c);
             }        else
	{
            get_top(OPTR, &x);
            switch(Precede(x, c))
	    {
                case '<'://栈顶元素优先级低                    
                    push(&OPTR,c);
                    flag = getNext(&c);
                    break;
                case '='://脱括号并接受下一字符 
                    pop(&OPTR,&x);
                    flag = getNext(&c);
                    break;
                case '>':// 退栈并将运算结果入栈                                       
                    pop(&OPTR, &theta);
                    pop(&OPND,&b);
                    pop(&OPND,&a);
                    push(&OPND, Operate(a, theta, b));
                    break;
            }
        }
        get_top(OPTR, &x);
    }
    get_top(OPND, &c);
    return c;
}
int EvalExpres(void)    /* 表达式求解函数*/
{
	int a,b,i=0,s=0;
	char c[80],r;
	InitStack(&StackR);
	Push(&StackR,'#');
	InitStack(&StackD);
	printf(" 请输入表达式并以‘#’结束:");
	gets(c);
	while(c[i]!='#' || GetTop(&StackR)!='#')
	{      
		if(!In(c[i]))   /* 判断读入的字符不是运算符 是则进栈*/
		{ if(c[i] >= '0' && c[i] <= '9')
		{
			s += c[i]-'0';      
			while(!In(c[++i]))    /*此处实现的功能为当输入的数字为多位数时*/
			{ s*=10;
			s += c[i]-'0';
			}
			Push(&StackD,s+'0');
			s = 0;
		}
		else
		{
			printf("你输入的表达式有误!\n");
			return 0;
		}            
		}
		else        
			switch(Proceed(GetTop(&StackR),c[i])) /* 此函数用来比较读取的运算符和栈顶运算符的优先级*/
		{
			case '<':   /* 栈顶的元素优先级高*/
				Push(&StackR,c[i]);
				i++;
				break;
			case '=':   /* 遇到匹配的小括号时则去掉他*/
				Pop(&StackR);
				i++;
				break;
			case '>': /* 栈顶的优先级低则出栈并将结果写入栈内*/
				r = Pop(&StackR);
				a = Pop(&StackD)-'0';
				b = Pop(&StackD)-'0';
				Push(&StackD,Operate(a,r,b)) ;
				break;                
		}
	}
	return (GetTop(&StackD)-'0');   /* 返回运算结果*/
}
Beispiel #11
0
int EvaluateExpression(){
	// P53 算法3.4
	// 算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合
	SqStack OPTR, OPND;
	InitStack(OPTR);
	bool judgePre=0;	// 判断输入的前一个字符是否为数字,用于多位数的运算
	Push(OPTR, '#');
	InitStack(OPND);
	int c, x, medi;
	OperandType theta;
	int a, b;
	c = getchar();
	while (c!='#' || GetTop(OPTR)!='#'){
		if (!In(c)){	//不是运算符则进栈
			c = c - '0';
			if (!In(GetTop(OPND)) && judgePre){
				Pop(OPND, medi);
				c += medi * 10;
			}
			Push(OPND, c);
			judgePre = 1;
			c = getchar();
		} else {
			switch (Precede(GetTop(OPTR),c)){
				case '<':
					Push(OPTR, c); 
					c = getchar();
					break;
				case '=':
					Pop(OPTR, x);
					c = getchar();
					break;
				case '>':
					Pop(OPTR, theta);
					Pop(OPND, b);
					Pop(OPND, a);
					Push(OPND, Operate(a, theta, b));
					break;
				default:
					break;
			}
			judgePre = 0;
		}
		
	}
	return GetTop(OPND);
}// EvaluateExpression
Beispiel #12
0
float EvaluateExpression(char* MyExpression) {
	// 算术表达式求值的算符优先算法
	// 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合
	SC *OPTR = NULL;       // 运算符栈,字符元素
	SF *OPND = NULL;       // 运算数栈,实数元素
	char TempData[20];
	float Data, a, b;
	char theta, *c, Dr[] = { '#', '\0' };
	OPTR = Push(OPTR, '#');
	c = strcat(MyExpression, Dr);
	strcpy(TempData, "\0");       //字符串拷贝函数
	while (*c != '#' || OPTR->c != '#') {
		if (!In(*c, OPSET)) {
			Dr[0] = *c;
			strcat(TempData, Dr);           //字符串连接函数
			c++;
			if (In(*c, OPSET)) {
				Data = atof(TempData);       //字符串转换函数(double)
				OPND = Push(OPND, Data);
				strcpy(TempData, "\0");
			}
		} else    // 不是运算符则进栈
		{
			switch (precede(OPTR->c, *c)) {
			case '<': // 栈顶元素优先级低
				OPTR = Push(OPTR, *c);
				c++;
				break;
			case '=': // 脱括号并接收下一字符
				OPTR = Pop(OPTR);
				c++;
				break;
			case '>': // 退栈并将运算结果入栈
				theta = OPTR->c;
				OPTR = Pop(OPTR);
				b = OPND->f;
				OPND = Pop(OPND);
				a = OPND->f;
				OPND = Pop(OPND);
				OPND = Push(OPND, Operate(a, theta, b));
				break;
			} //switch
		}
	} //while
	return OPND->f;
} //EvaluateExpression
Beispiel #13
0
float EvaluateExpression(char* MyExpression) {  // 算法3.4
   // 算术表达式求值的算符优先算法。
   // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。
   StackChar  OPTR;    // 运算符栈,字符元素
   StackFloat OPND;    // 运算数栈,实数元素
   char TempData[20];
   float Data,a,b;
   char theta,*c,x,Dr[2];
   
   InitStack (OPTR);
   Push (OPTR, '#');
   InitStack (OPND);
   c = MyExpression;
   strcpy(TempData,"\0");
   while (*c!= '#' || GetTop(OPTR)!= '#') {
      if (!In(*c, OPSET)) {
      	 Dr[0]=*c;
      	 Dr[1]='\0';
         strcat(TempData,Dr);
         c++;
         if(In(*c,OPSET)) {
            Data=(float)atof(TempData);
            Push(OPND, Data);
            strcpy(TempData,"\0");
         }
      } else {   // 不是运算符则进栈
         switch (precede(GetTop(OPTR), *c)) { 
            case '<':   // 栈顶元素优先权低
                 Push(OPTR, *c);  
                 c++;
                 break;
            case '=':   // 脱括号并接收下一字符
                 Pop(OPTR, x);   
                 c++;
                 break;
            case '>':   // 退栈并将运算结果入栈
                 Pop(OPTR, theta);
                 Pop(OPND, b);  
                 Pop(OPND, a);                      
                 Push(OPND, Operate(a, theta, b)); 
                 break;
         } // switch
      }
   } // while
   return GetTop(OPND);
} // EvaluateExpression
Beispiel #14
0
int CTrigger::OperateD1 (short nObject, int nPlayer, int bShot)
{
	int	h = 1;
	int	nTrigger = TRIGGERS.Index (this);


for (int i = 0; i < int (sizeofa (xlatTriggers)); i++)
	if (m_info.flagsD1 & xlatTriggers [i].nFlag) {
		m_info.nType = xlatTriggers [i].nType;
		gameData.trigs.delay [nTrigger] = -1;
		if (!Operate (nObject, nPlayer, bShot, false))
			h = 0;
		}
m_info.nType = TT_DESCENT1;
if (!h)
	gameData.trigs.delay [nTrigger] = gameStates.app.nSDLTicks;
return h;
}
Beispiel #15
0
SElemType EvaluateExpression() /* 算法3.4 */
{   /* 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈 */
    SqStack OPTR,OPND;
    SElemType a,b,c,x,theta;
    InitStack(&OPTR);
    Push(&OPTR,'#');
    InitStack(&OPND);
    c=getchar();
    GetTop(OPTR,&x);
    while(c!='#'||x!='#')
    {
        if(In(c)) /* 是7种运算符之一 */
            switch(Precede(x,c))
            {
            case'<':
                Push(&OPTR,c); /* 栈顶元素优先权低 */
                c=getchar();
                break;
            case'=':
                Pop(&OPTR,&x); /* 脱括号并接收下一字符 */
                c=getchar();
                break;
            case'>':
                Pop(&OPTR,&theta); /* 退栈并将运算结果入栈 */
                Pop(&OPND,&b);
                Pop(&OPND,&a);
                Push(&OPND,Operate(a,theta,b));
                break;
            }
        else if(c>='0'&&c<='9') /* c是操作数 */
        {
            Push(&OPND,c);
            c=getchar();
        }
        else /* c是非法字符 */
        {
            printf("ERROR4\n");
            exit(ERROR);
        }
        GetTop(OPTR,&x);
    }
    GetTop(OPND,&x);
    return x;
}
Beispiel #16
0
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 枚举版本并操作
BOOL CVSTool::Operate(BOOL bDotNet, INT iCommand)
{
	DWORD i;
	HKEY hKey;
	BOOL bResult;
	LONG lResult;
	DWORD dwSize;
	HKEY hToolKey;
	FILETIME ftTime;
	TCHAR tzName[MAX_PATH];
	TCHAR tzToolKey[MAX_PATH];

	// 打开键值
	lResult = RegOpenKeyEx(HKEY_CURRENT_USER, bDotNet ? TEXT("Software\\Microsoft\\VisualStudio") : TEXT("Software\\Microsoft\\Devstudio"), 0, KEY_ALL_ACCESS, &hKey);
	if (lResult != ERROR_SUCCESS)
	{
		return FALSE;
	}

	// 枚举版本循环
	for (i = 0, bResult = FALSE; (bResult == FALSE) || (iCommand != 0); i++)
	{
		// 枚举版本
		dwSize = MAX_PATH;
		lResult = RegEnumKeyEx(hKey, i, tzName, &dwSize, NULL, NULL, NULL, &ftTime);
		if (lResult != ERROR_SUCCESS)
		{
			break;
		}

		// 打开工具菜单键值
		wsprintf(tzToolKey, TEXT("%s\\%s"), tzName, bDotNet ? TEXT("External Tools") : TEXT("Tools"));
		lResult = RegOpenKeyEx(hKey, tzToolKey, 0, KEY_ALL_ACCESS, &hToolKey);
		if (lResult == ERROR_SUCCESS)
		{
			_ExIf(Operate(hToolKey, bDotNet, iCommand), bResult = TRUE);
			RegCloseKey(hToolKey);
		}
	}

	RegCloseKey(hKey);

	return bResult;
}
Beispiel #17
0
double EvaExpression()
{
	SqStack<int> OPTR;
	SqStack<double> OPND;
	
	int buffer;
	bool preIsDigit = false;
	bool hasDot = false; 
	int exp;
	
	double ans = 0;
	
	OPTR.Push(Index('#'));
	
	buffer = mGetchar();
	if (buffer == INPUT_VALID) return EvaExpression();

	while (buffer!='#' || OPTR.GetTop()!=Index('#'))
	{
		if (buffer == '.')
		{
			if (hasDot)
			{
				char tmp_s[1024];
				printf("您的输入有误,请确保输入的算术表达式合法!\n");
				if (buffer != '\n') gets(tmp_s);
				return EvaExpression();
			}
			hasDot = true;
			exp = 0;
			
			buffer = mGetchar();
			if (buffer == INPUT_VALID) return EvaExpression();
		}
		else if (In(buffer, DIGIT)) 
		{
			if (preIsDigit)
			{
				double number; 
				OPND.Pop(&number);
				
				if (hasDot)
				{
					exp--;
					number += E(buffer-'0', exp);
				}
				else
				{
					number *= 10;
					number += buffer-'0';
				}
				OPND.Push(number);
			}
			else
			{
				OPND.Push(buffer-'0');
				preIsDigit = true; 
			}
			
			buffer = mGetchar();
			if (buffer == INPUT_VALID) return EvaExpression();
		}
		else 
		{
			int toOperate, top;
			preIsDigit = false;
			hasDot = false;
			toOperate = Index(buffer);
			top = OPTR.GetTop();
			switch(cmp[top][toOperate])
			{
				case -1:
					OPTR.Push(toOperate);
					buffer = mGetchar();
					if (buffer == INPUT_VALID) return EvaExpression();
					break;
				case 0:
					int tmp;
					OPTR.Pop(&tmp);
					buffer = mGetchar();
					if (buffer == INPUT_VALID) return EvaExpression();
					break;
				case 1:
					int op;
					double a, b;
					if (OPTR.Pop(&op) != OK || OPND.Pop(&b) != OK || OPND.Pop(&a) != OK)
					{
						char tmp_s[1024];
						printf("您的输入有误,请确保输入的算术表达式合法!\n");
						if (buffer != '\n') gets(tmp_s);
						return EvaExpression();
					}
					ans = Operate(a, op, b);  
					OPND.Push(ans);
					break;
				case ERROR:
					char tmp_s[1024];
					printf("您的输入有误,请确保输入的算术表达式合法!\n");
					if (buffer != '\n') gets(tmp_s);
					return EvaExpression();
				default:
					exit(ERROR);
			}
		}
		
	}
	OPND.Pop(&ans);
	if (OPTR.IsEmpty() || OPND.IsEmpty() ) return ans;
	
	char tmp_s[1024];
	printf("您的输入有误,请确保输入的算术表达式合法!\n");
	if (buffer != '\n') gets(tmp_s);
	return EvaExpression();
}                
Beispiel #18
0
void main( )
{  
char express[30], num[10], theta, tp , d;//express[30]用来读入一个表达式
    double a ,b , result, tps;          //num[10]用来存放表达式中连接着的数字字符
int t, i, j;
int position = 0;//表达式读到的当前字符
Initstack(OPND); 
Initstack(OPTR); Push(OPTR , '=');
printf("input 'b' to run the calc:\n");
scanf("%c" , &d);
getchar();
while(d == 'b')
{
printf( "请输入表达式( 可使用+、-、*、/、(、)、= ): " ) ;
gets(express);
while(express[position] != '='||Gettop(OPTR , tp) != '=' )
{
if(!Is_op(express[position])) 
{ //用两个计数器t和j实现浮点数的读取
t = position;j=0;
while(!Is_op(express[position]))
{
position++;
}
for(i = t; i<position ; i++ )
{//把表达式中第t到position-1个字符赋给num[10]
num[j] = express[i];
j++;
}
Push(OPND , atof(num));
    memset(num,0,sizeof(num));//将num[10]清空
}
else
{
switch(Precede(isp(Gettop(OPTR , tp)),icp(express[position])))
{
case '<':
Push(OPTR,express[position]);position++;break;
    case '=':
    Pop(OPTR , tp) ;position++;break; 
    case '>':
{
Pop(OPTR , theta) ;
        Pop(OPND , b) ; 
        Pop(OPND , a) ; 
        result = Operate(a, theta ,b);
        Push(OPND , result);break;  
}//end sase
}//end switch
}//end else
}//end while

printf("%s%8.4f\n",express,Pop(OPND,tps));

    memset(express , 0 , sizeof(express));
    position = 0;
    printf("input 'b' to run the calc again:\n");
    scanf("%c" , &d);
    getchar();
}//end while
}
Beispiel #19
0
/**
* @brief 程序入口
* @param 无
* @return 返回
*/
int main(void)
{
	int nOperRole = 0xff;
	char szOper[OPERCODELEN + 1];

	PubInitUiParam();
	ASSERT_QUIT(Ums_CheckMcVer());	/*重要:判断主控版本*/
	PubLuaOpen();
	PubLuaDisplay("LuaSetUIStyle");	/*设置系统风格*/
	RecordVersion();	/*记录版本信息*/
	PubKbHit();						/*清除按键缓*/

	/**
	* 版本校验(首次运行检测)
	*/
	FirstRunChk();
	/**
	* 模块初始化,重要!!!
	*/
	AppInit();

#if defined(USE_TMS)
	/**<检查是否有应用或者参数的更新*/
	DoTmsTask(TMS_POS_CHKUPDATA);
	GetTmsParamDown();
#endif

	Cup_InitScrLed();

	SetControlChkPinpad(YES);

	
	/*
	* 运行任务
	*/
	while(1)
	{
		/**
		* 设备检查
		*/
		ChkPdAndRF();

		/**
		* 通讯初始化
		*/
		CommInit();
		memset(szOper, 0, sizeof(szOper));
		GetWaterOper(szOper);/**<取做过交易的(有流水)操作员号码*/
		SetOperLimit(szOper);

		GetVarLastOperInfo(szOper, &nOperRole);/**<取最后登陆的操作员信息(保存的)*/
		SetCurrentOper(szOper, NULL, nOperRole);/**<将最后登陆的操作员信息设置给操作员模块*/

		if (ChkIsMCReturn() == APP_SUCC || nOperRole != NORMALOPER || YES != GetVarIsLogin())
		{
			if (OperLogon() != APP_SUCC)
			{
				/*取消已设置的系统风格*/
				PubLuaDisplay("LuaUnSetUIStyle");
				PubLuaClose();
				CommDump();
				Cup_ExitScrLed();
				return APP_QUIT;
			}
		}
		GetCurrentOper(szOper, NULL, &nOperRole);/**<从操作员模块获取当前的操作员信息*/
		SetVarLastOperInfo(szOper, (char)nOperRole);/**<保存最后登陆的操作员信息*/

		/**
		* 系统管理员
		*/
		if (nOperRole == ADMINOPER)
		{
			Manage();
			ParamSave();
			PubClearAll();
		}
		else if(nOperRole == HIDEMENUOPER)
		{
			HideManage();
		}
		else if(nOperRole == MANAGEROPER)
		{
			Operate();
		}
		else
		{
			
			if (APP_SUCC != AppTrans())
			{
				PubLuaDisplay("LuaUnSetUIStyle");
				PubLuaClose();
				CommDump();
				Cup_ExitScrLed();
				return APP_QUIT;
			}
		}
	}
}
int CAmazonWraper::ChangePayType(AmazonOrderStru& objStr)
{
	objStr.iOpFlag = 3;
	return Operate(objStr);
}
int CAmazonWraper::Query(AmazonOrderStru& objStr)
{
	objStr.iOpFlag = 1;
	return Operate(objStr);
}
int CAmazonWraper::Order(AmazonOrderStru& objStr)
{
	objStr.iOpFlag = 2;
	return Operate(objStr);
}
CommandStatus OutstationSBOHandler::Operate(const AnalogOutputDouble64& arCommand, size_t aIndex, uint8_t aSequence, QualifierCode aCode)
{
	return Operate(arCommand, aIndex, aSequence, aCode, mAnalogDoubleSelectMap);
}
Beispiel #24
0
void CFrobLever::Event_Operate()
{
	Operate();
}
Beispiel #25
0
BOOL CMatrixDoc::GetResult(const CString &data,CArrayMatrix & matrix)
{
//在这可以通过修改data字符串和m_VariablePtrList变量链表来实现
//具体方法是首先假如data是包含多个运算符的
	CString sDataString=data;
	sDataString.TrimLeft("\n");
	sDataString.TrimRight("\n");
	CString *pVar;
	CArrayMatrix result;
	bool ok;
	int VarNum=GetVariableNum(sDataString,pVar);
	if(VarNum==0) return FALSE;
	CTypedPtrList<CObList,CArrayMatrix *> tpVarList;
	if(!StringsToMatrixs(pVar,tpVarList,VarNum)) 
	{
		if(pVar!=NULL) delete []pVar;
		return FALSE;
	}
	TurnString(sDataString);
	//表达式求值
	{
		sDataString=sDataString+"#";
		CStack<TCHAR> OPTR;
		CStack<CArrayMatrix *> OPND;
		OPTR.Push('#');
		int index=0;
		TCHAR c=sDataString[index];
		int nVarIndex=0;
		while(c!=TCHAR('#')||OPTR.GetTop()!=TCHAR('#'))
		{
			if(!IsOperator(c)) 
			{
				POSITION pos=tpVarList.GetHeadPosition();
				CArrayMatrix * pt=NULL;
				for(int i=0;i<=nVarIndex&&i<tpVarList.GetCount();i++)
				{
					pt=tpVarList.GetAt(pos);
					tpVarList.GetNext(pos);
				}
				if(pt==NULL) return FALSE;
				OPND.Push(pt);
				nVarIndex++;
				index++;
				c=sDataString[index];
			}
			else
			{
				switch(Precede(OPTR.GetTop(),c))
				{
				case -1:
					{
						OPTR.Push(c);
						index++;
						c=sDataString[index];
						break;
					}
				case 0:
					{
						TCHAR x;
						OPTR.Pop(x);
						index++;
						c=sDataString[index];
						break;
					}
				case 1:
					{
						TCHAR theta;
						OPTR.Pop(theta);
						CArrayMatrix * b=NULL;
						CArrayMatrix * a=NULL;
						OPND.Pop(b);
						OPND.Pop(a);
						OPND.Push(Operate(a,theta,b,ok));
						break;
					}
				}
			}
		}
		result=*(OPND.GetTop());
	}
	

	
	//销毁tpvarlist变量里面的东西
	{
		POSITION pos=tpVarList.GetHeadPosition();
		int len=tpVarList.GetCount();
		for(int i=0;i<len;i++)
		{
			CArrayMatrix * tp=tpVarList.GetAt(pos);
			delete tp;
			tpVarList.GetNext(pos);
		}
		tpVarList.RemoveAll();
	}
	if(pVar!=NULL) delete []pVar;
	if(!ok) return FALSE;
	matrix=result;
	return TRUE;
}
CommandStatus OutstationSBOHandler::Operate(const ControlRelayOutputBlock& arCommand, size_t aIndex, uint8_t aSequence, QualifierCode aCode)
{
	return Operate(arCommand, aIndex, aSequence, aCode, mCROBSelectMap);
}
Beispiel #27
0
int hd_open(dev_t dev, int flags, int fmt)
{
	u_int major, unit, part;
	struct disk *du;
	struct hd_devices *hdev;
	DCB *dcb;
	DiscOpenCloseReq openreq;
	DiscParameterReq dpreq;
	struct buf *bp;
	int error = 0;
	int wasold = FALSE;

#ifdef MONITOR
 printf("hd_open: Called with dev=%d,  flags=%d,   fmt=%d  by %s\n",
	dev,flags,fmt,myprocname(returnlink_(dev)));
#endif
	/* Get the unit info */
	major = major(dev);
	unit = dkunit(dev);
	part = dkpart(dev);
	hdev = &hd[major];
	dcb = hd[major].dcb;
	if (unit >= MAXDISKS) return(ENXIO);
	du = &(hdev->disk[unit]);

#ifdef DEBUG
printf("hd_open: major %d  unit %d  part %d\n",major,unit,part);
#endif

	/* Has the disk already been opened. */
	if (du->dk_state != CLOSED) {
		/* Already open, so don't mess with it. */
		goto getpart;
	}

	/* Undefined device OR Trap old device driver compatibility */
	if ((dcb == NULL) || hdev->old) {
		/* Old style only supports 1 disk */
		return(ENODEV);
	}

	/* Open the actual disk */
	openreq.DevReq.Request = FG_Open;
	openreq.DevReq.Action = dev_openaction;
	openreq.DevReq.SubDevice = unit;
	openreq.DevReq.Timeout = -1;
	openreq.DevReq.Result = MYSPECCODE;	/* Special Code */
	InitSemaphore(&(openreq.WaitLock),0);
	Operate(dcb,&openreq);
	Wait(&(openreq.WaitLock));

	/* Old style device driver was opened */
	if ((openreq.DevReq.Result == MYSPECCODE) || 
	    ((openreq.DevReq.Result & EG_Mask) == EG_WrongFn))  {
		wasold = TRUE;
	} else if (openreq.DevReq.Result) {
		/* Error in opening device */
		return(ENODEV);
	}

	/* Get the disk label using device driver defaults */
	du->dk_lab = dflt_sizes;
	du->dk_state = READLABEL;
	bp = geteblk(DEV_BSIZE);
	bp->b_dev = dev & 0xFFFFFFF8;	/* Force to boot partition (a) */
	bp->b_blkno = LABELSECTOR;
	bp->b_flags = B_READ;
	hd_strategy(bp);		/* Start the operation. */
	biowait(bp);			/* Wait until complete */
	if (bp->b_flags & B_ERROR) {
		error = ENXIO;
		du->dk_state = CLOSED;
		goto done;
	}

	/* Is label there, otherwise open as raw. */
	if (((struct disklabel *)
	    (bp->b_un.b_addr + LABELOFFSET))->d_magic == DISKMAGIC) {
		du->dk_lab = *(struct disklabel *)
				(bp->b_un.b_addr + LABELOFFSET);
		du->dk_state = OPEN;

		/* Pass disk information back to device driver */
		/* Standard Request */
		dpreq.DevReq.Request = FG_SetInfo;
		dpreq.DevReq.Result = MYSPECCODE;
		dpreq.DevReq.Action = dev_openaction;
		dpreq.DevReq.SubDevice = unit;
		dpreq.DevReq.Timeout = -1;
		InitSemaphore(&dpreq.WaitLock,0);

		/* Setup SetInfo parameters */
		dpreq.DriveType = 0;	/* Fixed Disk ? */
		dpreq.SectorSize = du->dk_lab.d_secsize;
		dpreq.SectorsPerTrack = du->dk_lab.d_nsectors;
		dpreq.TracksPerCyl = du->dk_lab.d_ntracks;
		dpreq.Cylinders = du->dk_lab.d_ncylinders;

		/* Make it */
		Operate(dcb,&dpreq);
		Wait(&(dpreq.WaitLock));
			
		if (dpreq.DevReq.Result)
		  printf("hd_open: Warning; Fault 0x%x on major dev %d FG_SetInfo\n",
			 (dpreq.DevReq.Result==MYSPECCODE) ?
			   (SS_Device|EC_Error|EG_WrongFn|EO_Medium):
			   dpreq.DevReq.Result,
			 major);
	} else {
		printf("hd (dev %d): Bad disk label (%x)\n",bp->b_dev,
    ((struct disklabel *)(bp->b_un.b_addr + LABELOFFSET))->d_magic);
		du->dk_state = RAWOPEN;
	}

done:
	/* Release buffer. */
	bp->b_flags = B_INVAL | B_AGE;
	brelse(bp);

getpart:
#ifdef DEBUG
printf("hd_open: device %d get part %d\n",dev,part);
#endif
	/* Get and set the partition info */
	if (part >= MAXPARTITIONS) return(ENXIO);
	if (du->dk_pstatus[part] != CLOSED) {
		/* Partition is already open, don't mess with it. */
#ifdef DEBUG
printf("hd_open: device %d part %d already open\n",dev,part);
#endif
		return(0);
	}
	if (du->dk_state == RAWOPEN) {
#ifdef DEBUG
printf("hd_open: device %d open as raw part %d\n",dev,part);
#endif
		/* If no label, then only allow raw */
		if (part == (RAWPARTITION - 'a')) {
#ifdef DEBUG
printf("hd_open: device %d opened as raw\n",dev);
#endif
			du->dk_pstatus[part] = RAWOPEN;
		} else {
			du->dk_state = CLOSED;
#ifdef DEBUG
printf("hd_open: device %d refused opening partition %d as raw\n",dev,part);
#endif
			return(ENXIO);	
		}
	} else {
		/* Label found, so check overlap with other open partitions */
		struct partition *pp;
		int start,end,i;

		if (part >= du->dk_lab.d_npartitions) return(ENXIO);
		
		pp = &du->dk_lab.d_partitions[part];
		start = pp->p_offset;
		end = start + pp->p_size;
		for (pp = du->dk_lab.d_partitions, i=0;
		     i < du->dk_lab.d_npartitions;
		     pp++, i++) {
			/* Ends before this starts or starts before this ends */
			if (pp->p_offset + pp->p_size <= start ||
			    pp->p_offset >= end)
				continue;
			if (du->dk_pstatus[i]) {
				printf("hd%d%c: overlaps open partition (%c)\n",
				    unit,part+'a',i+'a');
			}
		}

		du->dk_pstatus[part] = OPEN;
	}
#ifdef DEBUG
printf("hd_open: device %d opened error=%d\n",dev,error);
#endif
	if (!error && wasold) hdev->old = TRUE;
	return(error);
}
Beispiel #28
0
static void hd_intr_server(int major)
{
	struct hd_devices *hdev = &hd[major];
	Semaphore *numbufs = &(hdev->numbufs);
	Semaphore *abort = &(hdev->abort);
	DCB *dcb = hdev->dcb;
	struct disk *this_hd = &(hdev->disk[0]);	/* Start at 0 */
	struct disk *last_hd = &(hdev->disk[MAXDISKS]);	/* Terminate check */
	int searched;
	DiscReq req;
	struct partition *pp;
	struct buf *dp, *bp;
#ifdef DEBUG
printf("hd_intr_server: Helios Major device %d running\n",major);
#endif
	/* Loop until ordered to shut down and no more buffers to work on. */
	for (;;) {
		/* Wait for a block to work on. */
		Wait(numbufs);
		if (TestWait(abort)) {
			/* Forget anything else */
			return;
		}

		/* Look for a disk to work on */
		searched = 0;
		while (!TestWait(&this_hd->dk_numq) && searched != MAXDISKS) {
			this_hd++;
			searched++;
			if (this_hd >= last_hd)
				this_hd = &(hdev->disk[0]);
		}
		if (searched == MAXDISKS) {
			printf("hd_intr: PANIC %d, Failed to find buffer\n",major);
			continue;
		}

		/* Extract the buffer */
		dp = &(this_hd->dk_queue);
		bp = dp->b_actf;

		/* Get the partition (offset) */
		pp = &(this_hd->dk_lab.d_partitions[dkpart(bp->b_dev)]);

		/* Perform the operation */
		req.DevReq.Request = ((bp->b_flags & B_READ)?FG_Read:FG_Write);
		req.DevReq.Action = hd_iodone;
		req.DevReq.SubDevice = dkunit(bp->b_dev);
		req.DevReq.Timeout = -1;	/* No Timeout */
		req.Size = bp->b_bcount;
		req.Buf =  bp->b_un.b_addr;
		req.Pos = bp->b_blkno + pp->p_offset;	/* Sector */

		/* Check if we are writing a disk label */
		if ((req.Pos <= LABELSECTOR) && (!this_hd->dk_wlabel) &&
		    (req.DevReq.Request == FG_Write)) {
			bp->b_error = EACCES;	/* Not writeable */
			goto skip;
		}

		/* Adjust to byte location */
		req.Pos *= this_hd->dk_lab.d_secsize;
#ifdef DEBUG
printf("hd_intr_server: Major %d performing %s on dev=%d  buf=0x%x (dcb=0x%x)\n",
	major,((bp->b_flags & B_READ)?"Read":"Write"),bp->b_dev,buf,dcb);
printf("hd_intr_server: Request=0x%x, SubDevice=%d, Timeout=%d, Size=%d\n",
	req.DevReq.Request,req.DevReq.SubDevice,req.DevReq.Timeout,req.Size);
#endif
		InitSemaphore(&(req.WaitLock),0);
		Operate(dcb,&req);
		Wait(&(req.WaitLock));		/* XXX Implement multiple ops
						 * later.  (i.e.TestWait for
						 * each disk)
						 */
hd_ops++;
#ifdef DEBUG
printf("hd_intr_server:  Major%d Pos=%d, Buf=0x%x  Actual=%d  %s\n",
	major,req.Pos,req.Buf,req.Actual,
	(req.Size==req.Actual)?"O.K.":"ERROR");
#endif

		/* Any problems ? */
		if (req.Size == req.Actual) {
			bp->b_error = 0;
		} else {
			/* Error occurred */
			bp->b_error = EIO;
			bp->b_flags |= B_ERROR;
		}

		/* Operation complete, lock queue and remove bp */
skip:
		Wait(&this_hd->dk_guard);
		dp->b_actf = bp->av_forw;
		bp->b_resid = 0;
		bp->av_forw = NULL;
		Signal(&this_hd->dk_guard);

		/* Need to go into UNIX kernel to call biodone */
		tokernel();
		biodone(bp);
		fromkernel();

		/* Round robin scheduling */
		this_hd++;
		if (this_hd >= last_hd) this_hd = &(hdev->disk[0]);

	}
}
Beispiel #29
0
/*
 * Close a drive.
 */
int hd_close(dev_t dev, int flags, int fmt)
{
	u_int major, unit, part;
	struct disk *du;
	struct hd_devices *hdev;
	DCB *dcb;
	
#ifdef MONITOR
printf("hd_close: Called with dev=%d,  flags=%d,   fmt=%d  by %s\n",
	dev,flags,fmt,myprocname(returnlink_(dev)));
#endif
	
	/* Get the unit info */
	major = major(dev);
	unit = dkunit(dev);
	part = dkpart(dev);
	hdev = &hd[major];
	dcb = hdev->dcb;
	if (unit >= MAXDISKS) return(ENXIO);
	du = &(hdev->disk[unit]);

	if (du->dk_state == CLOSED) return(0);
	if (du->dk_state == RAWOPEN) {
		du->dk_state = CLOSED;
		for (part=0; part<MAXPARTITIONS; part++)
			du->dk_pstatus[part] = CLOSED;
		goto done;
	}

	part = dkpart(dev);
	if (part >= du->dk_lab.d_npartitions) return(ENXIO);
	du->dk_pstatus[part] = CLOSED;
	for (part=0; 
		(part<MAXPARTITIONS) && (du->dk_pstatus[part] == CLOSED); 
		part++);
	if (part == MAXPARTITIONS) du->dk_state = CLOSED;

done:
	if (du->dk_state == CLOSED) {
	   if (hdev->old) {
		hdev->old = FALSE;	/* Only unit open now closed */
#ifdef DEBUG
printf("old unit dev %d was closed",dev);
#endif
	   } else {
		DiscOpenCloseReq openreq;

		openreq.DevReq.Request = FG_Close;
		openreq.DevReq.Action = dev_openaction;
		openreq.DevReq.SubDevice = unit;
		openreq.DevReq.Timeout = -1;
		openreq.DevReq.Result = MYSPECCODE;	/* Special Code */
		InitSemaphore(&(openreq.WaitLock),0);
		Operate(dcb,&openreq);
		Wait(&(openreq.WaitLock));

		if (openreq.DevReq.Result)
		  printf("hd_close: Warning, Fault 0x%x on major dev %d\n",
			 (openreq.DevReq.Result==MYSPECCODE) ?
			   (SS_Device|EC_Error|EG_WrongFn|EO_Medium):
			   openreq.DevReq.Result,
			 major);
	    }
	}

	return(0);
}