Potenziate espressioni e corretto distruttore dell TIndwin.
git-svn-id: svn://10.65.10.50/trunk@3448 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									38f03725d7
								
							
						
					
					
						commit
						ebb0b893fb
					
				
							
								
								
									
										123
									
								
								include/expr.cpp
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								include/expr.cpp
									
									
									
									
									
								
							@ -52,81 +52,80 @@ void TVararray::add(const char* name, const TValue& val)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TVararray::set(const char* name, const real& val)
 | 
					void TVararray::set(const char* name, const real& val)
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  for (int i = 0; i < items(); i++)
 | 
					  for (int i = items()-1; i >= 0; i--)
 | 
				
			||||||
    if (strcmp(((TVar *) objptr(i))->getname(), name) == 0)
 | 
					  {
 | 
				
			||||||
 | 
					    TVar* var = (TVar*)objptr(i);
 | 
				
			||||||
 | 
					    CHECKS(var, "Variabile NULLA ", name);
 | 
				
			||||||
 | 
					    if (strcmp(var->getname(), name) == 0)
 | 
				
			||||||
    {     
 | 
					    {     
 | 
				
			||||||
      TArray::add(new TValue(val), i);
 | 
					      *var = val;
 | 
				
			||||||
      return;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TVararray::set(const char* name, const char* val)
 | 
					void TVararray::set(const char* name, const char* val)
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  for (int i = 0; i < items(); i++)
 | 
					  for (int i = items()-1; i >= 0; i--)
 | 
				
			||||||
    if (strcmp(((TVar *) objptr(i))->getname(), name) == 0)
 | 
					  {
 | 
				
			||||||
 | 
					    TVar* var = (TVar*)objptr(i);
 | 
				
			||||||
 | 
					    CHECKS(var, "Variabile NULLA ", name);
 | 
				
			||||||
 | 
					    if (strcmp(var->getname(), name) == 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      TArray::add(new TValue(val), i);
 | 
					      *var = val;
 | 
				
			||||||
      return;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
real __r;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const real& TVararray::getnum(const char* name)
 | 
					const real& TVararray::getnum(const char* name)
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int i;
 | 
					  for (int i = items()-1; i >= 0; i--)
 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i = 0; i < items(); i++)
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (strcmp(((TVar*) objptr(i))->getname(), name) == 0)
 | 
					    const TVar* var = (const TVar*)objptr(i);
 | 
				
			||||||
    {
 | 
					    CHECKS(var, "Variabile NULLA ", name);
 | 
				
			||||||
      __r  = ((TVar*) objptr(i))->number();
 | 
					    if (strcmp(var->getname(), name) == 0)
 | 
				
			||||||
      return __r;
 | 
					      return var->number();
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  fatal_box("Unknown variable : %s", name);
 | 
					  NFCHECK("Unknown variable: %s", name);
 | 
				
			||||||
  return __r;
 | 
					  return ZERO;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const real& TVararray::getnum(int varnum)
 | 
					const real& TVararray::getnum(int varnum)
 | 
				
			||||||
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (varnum >= items())
 | 
					  if (varnum >= items())
 | 
				
			||||||
    fatal_box("invalid variable number : %d", varnum);
 | 
					    fatal_box("invalid variable number : %d", varnum);
 | 
				
			||||||
  __r  = ((TVar*) objptr(varnum))->number();
 | 
					  return ((TVar*)objptr(varnum))->number();
 | 
				
			||||||
  return __r;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* TVararray::getstring(const char* name)
 | 
					const char* TVararray::getstring(const char* name)
 | 
				
			||||||
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  const char* s = NULL;
 | 
					  for (int i = items()-1; i >= 0; i--)
 | 
				
			||||||
  int   i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (i = 0; i < items(); i++)
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (strcmp(((TVar*) objptr(i))->getname(), name) == 0)
 | 
					    const TVar* var = (TVar*)objptr(i);
 | 
				
			||||||
      return ((TVar*) objptr(i))->string();
 | 
					    if (strcmp(var->getname(), name) == 0)
 | 
				
			||||||
 | 
					      return var->string();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  fatal_box("Unknown variable : %s", name);
 | 
					  NFCHECK("Unknown variable : %s", name);
 | 
				
			||||||
  return s;
 | 
					  return "";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* TVararray::getstring(int varnum)
 | 
					const char* TVararray::getstring(int varnum)
 | 
				
			||||||
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (varnum >= items())
 | 
					  if (varnum < 0 || varnum >= items())
 | 
				
			||||||
    fatal_box("invalid variable number : %d", varnum);
 | 
					  {
 | 
				
			||||||
  return ((TVar*) objptr(varnum))->string();
 | 
					    NFCHECK("Invalid variable number : %d", varnum);
 | 
				
			||||||
 | 
					    return "";
 | 
				
			||||||
 | 
					  }        
 | 
				
			||||||
 | 
					  const TVar* var = (const TVar*)objptr(varnum);
 | 
				
			||||||
 | 
					  CHECKD(var, "Variabile nulla: ", varnum);
 | 
				
			||||||
 | 
					  return var->string();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -195,12 +194,14 @@ void TExpression::print_on(ostream& out) const
 | 
				
			|||||||
{ out << _original; }
 | 
					{ out << _original; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TExpression::evaluate_user_func(int index, int nparms, TStack & stack, TTypeexp  type) const
 | 
					void TExpression::evaluate_user_func(int index, int nparms, TStack & stack, TTypeexp  type) const
 | 
				
			||||||
 | 
					 | 
				
			||||||
{                
 | 
					{                
 | 
				
			||||||
  CHECKD(FALSE, "Unknown function ", index);
 | 
					  CHECKD(FALSE, "Unknown function ", index);
 | 
				
			||||||
  for ( int i = nparms ; i > 0; i--)
 | 
					  for ( int i = nparms ; i > 0; i--)
 | 
				
			||||||
    stack.pop(); 
 | 
					    stack.pop(); 
 | 
				
			||||||
  stack.push(ZERO);
 | 
					  if (curtype == _numexpr)  
 | 
				
			||||||
 | 
					    stack.push(ZERO);
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    stack.push(TString(""));
 | 
				
			||||||
}    
 | 
					}    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TExpression::operator bool()
 | 
					TExpression::operator bool()
 | 
				
			||||||
@ -215,37 +216,50 @@ TExpression::operator bool()
 | 
				
			|||||||
void TExpression::setvar(const char* varname, const real& val)
 | 
					void TExpression::setvar(const char* varname, const real& val)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  _dirty |= _var.getnum(varname) != val;
 | 
					  if (_var.getnum(varname) != val)
 | 
				
			||||||
  _var.set(varname, val);
 | 
					  {
 | 
				
			||||||
 | 
					    _var.set(varname, val);
 | 
				
			||||||
 | 
					    _dirty = TRUE;
 | 
				
			||||||
 | 
					  }  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TExpression::setvar(int varnum, const real& val)
 | 
					void TExpression::setvar(int varnum, const real& val)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  _dirty |= _var.getnum(varnum) != val;
 | 
					  if (_var.getnum(varnum) != val)
 | 
				
			||||||
  _var.set(varnum, val);
 | 
					  {
 | 
				
			||||||
 | 
					    _var.set(varnum, val);
 | 
				
			||||||
 | 
					    _dirty = TRUE;
 | 
				
			||||||
 | 
					  }  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TExpression::setvar(const char* varname, const char* val)
 | 
					void TExpression::setvar(const char* varname, const char* val)
 | 
				
			||||||
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  _dirty |= strcmp(_var.getstring(varname), val) != 0;
 | 
					  if (strcmp(_var.getstring(varname), val) != 0)
 | 
				
			||||||
  _var.set(varname, val);
 | 
					  {
 | 
				
			||||||
 | 
					    _var.set(varname, val);
 | 
				
			||||||
 | 
					    _dirty = TRUE;
 | 
				
			||||||
 | 
					  }  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TExpression::setvar(int varnum, const char* val)
 | 
					void TExpression::setvar(int varnum, const char* val)
 | 
				
			||||||
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  _dirty |= strcmp(_var.getstring(varnum), val) != 0;
 | 
					  if (strcmp(_var.getstring(varnum), val) != 0)
 | 
				
			||||||
  _var.set(varnum, val);
 | 
					  {
 | 
				
			||||||
 | 
					    _var.set(varnum, val);
 | 
				
			||||||
 | 
					    _dirty = TRUE;
 | 
				
			||||||
 | 
					  }  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool TExpression::print_error(const char* msg) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return fatal_box("%s", msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TExpression::eval()
 | 
					void TExpression::eval()
 | 
				
			||||||
 | 
					 | 
				
			||||||
{                                   
 | 
					{                                   
 | 
				
			||||||
  TStack        evalstack(50);
 | 
					  TStack        evalstack(50);
 | 
				
			||||||
  TBit_array    types;
 | 
					  TBit_array    types;
 | 
				
			||||||
@ -314,6 +328,11 @@ void TExpression::eval()
 | 
				
			|||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case _divide:
 | 
					    case _divide:
 | 
				
			||||||
      o2 = (real&) evalstack.pop();
 | 
					      o2 = (real&) evalstack.pop();
 | 
				
			||||||
 | 
					      if (o2.is_zero())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        print_error("Divisione per zero!");
 | 
				
			||||||
 | 
					        o2 = 1.0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      o1 = (real&) evalstack.pop();
 | 
					      o1 = (real&) evalstack.pop();
 | 
				
			||||||
      evalstack.push(real(o1 / o2));
 | 
					      evalstack.push(real(o1 / o2));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
				
			|||||||
@ -397,6 +397,8 @@ class TExpression : public TObject
 | 
				
			|||||||
protected:
 | 
					protected:
 | 
				
			||||||
  // @cmember funzione utente da ricalcolare
 | 
					  // @cmember funzione utente da ricalcolare
 | 
				
			||||||
  virtual bool user_func_dirty() { return _user_func_defined;}
 | 
					  virtual bool user_func_dirty() { return _user_func_defined;}
 | 
				
			||||||
 | 
					  // @cmember stampa un messaggio d'errore
 | 
				
			||||||
 | 
					  virtual bool print_error(const char* msg) const;
 | 
				
			||||||
  // @cmember Valuta (calcola) l'espressione
 | 
					  // @cmember Valuta (calcola) l'espressione
 | 
				
			||||||
  void eval();
 | 
					  void eval();
 | 
				
			||||||
  // @cmember Converte una stringa in un nome di funzione o _invalid se non esiste
 | 
					  // @cmember Converte una stringa in un nome di funzione o _invalid se non esiste
 | 
				
			||||||
 | 
				
			|||||||
@ -69,7 +69,8 @@ void TIndwin::set_text(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
TIndwin::~TIndwin()
 | 
					TIndwin::~TIndwin()
 | 
				
			||||||
{     
 | 
					{     
 | 
				
			||||||
  close_modal(); 
 | 
					  if (is_open())
 | 
				
			||||||
 | 
					    close_modal(); 
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  if (_text) delete _text;
 | 
					  if (_text) delete _text;
 | 
				
			||||||
  if (_cancel) delete _cancel;
 | 
					  if (_cancel) delete _cancel;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user