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
129
include/expr.cpp
129
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)
|
||||
|
||||
{
|
||||
for (int i = 0; i < items(); i++)
|
||||
if (strcmp(((TVar *) objptr(i))->getname(), name) == 0)
|
||||
{
|
||||
TArray::add(new TValue(val), i);
|
||||
return;
|
||||
for (int i = items()-1; i >= 0; i--)
|
||||
{
|
||||
TVar* var = (TVar*)objptr(i);
|
||||
CHECKS(var, "Variabile NULLA ", name);
|
||||
if (strcmp(var->getname(), name) == 0)
|
||||
{
|
||||
*var = val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TVararray::set(const char* name, const char* val)
|
||||
|
||||
{
|
||||
for (int i = 0; i < items(); i++)
|
||||
if (strcmp(((TVar *) objptr(i))->getname(), name) == 0)
|
||||
for (int i = items()-1; i >= 0; i--)
|
||||
{
|
||||
TVar* var = (TVar*)objptr(i);
|
||||
CHECKS(var, "Variabile NULLA ", name);
|
||||
if (strcmp(var->getname(), name) == 0)
|
||||
{
|
||||
TArray::add(new TValue(val), i);
|
||||
return;
|
||||
*var = val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
real __r;
|
||||
|
||||
const real& TVararray::getnum(const char* name)
|
||||
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < items(); i++)
|
||||
for (int i = items()-1; i >= 0; i--)
|
||||
{
|
||||
if (strcmp(((TVar*) objptr(i))->getname(), name) == 0)
|
||||
{
|
||||
__r = ((TVar*) objptr(i))->number();
|
||||
return __r;
|
||||
}
|
||||
const TVar* var = (const TVar*)objptr(i);
|
||||
CHECKS(var, "Variabile NULLA ", name);
|
||||
if (strcmp(var->getname(), name) == 0)
|
||||
return var->number();
|
||||
}
|
||||
fatal_box("Unknown variable : %s", name);
|
||||
return __r;
|
||||
NFCHECK("Unknown variable: %s", name);
|
||||
return ZERO;
|
||||
}
|
||||
|
||||
|
||||
const real& TVararray::getnum(int varnum)
|
||||
|
||||
{
|
||||
if (varnum >= items())
|
||||
fatal_box("invalid variable number : %d", varnum);
|
||||
__r = ((TVar*) objptr(varnum))->number();
|
||||
return __r;
|
||||
return ((TVar*)objptr(varnum))->number();
|
||||
}
|
||||
|
||||
|
||||
const char* TVararray::getstring(const char* name)
|
||||
|
||||
{
|
||||
const char* s = NULL;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < items(); i++)
|
||||
for (int i = items()-1; i >= 0; i--)
|
||||
{
|
||||
if (strcmp(((TVar*) objptr(i))->getname(), name) == 0)
|
||||
return ((TVar*) objptr(i))->string();
|
||||
const TVar* var = (TVar*)objptr(i);
|
||||
if (strcmp(var->getname(), name) == 0)
|
||||
return var->string();
|
||||
}
|
||||
fatal_box("Unknown variable : %s", name);
|
||||
return s;
|
||||
NFCHECK("Unknown variable : %s", name);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
const char* TVararray::getstring(int varnum)
|
||||
|
||||
{
|
||||
if (varnum >= items())
|
||||
fatal_box("invalid variable number : %d", varnum);
|
||||
return ((TVar*) objptr(varnum))->string();
|
||||
if (varnum < 0 || varnum >= items())
|
||||
{
|
||||
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; }
|
||||
|
||||
void TExpression::evaluate_user_func(int index, int nparms, TStack & stack, TTypeexp type) const
|
||||
|
||||
{
|
||||
CHECKD(FALSE, "Unknown function ", index);
|
||||
for ( int i = nparms ; i > 0; i--)
|
||||
stack.pop();
|
||||
stack.push(ZERO);
|
||||
stack.pop();
|
||||
if (curtype == _numexpr)
|
||||
stack.push(ZERO);
|
||||
else
|
||||
stack.push(TString(""));
|
||||
}
|
||||
|
||||
TExpression::operator bool()
|
||||
@ -215,37 +216,50 @@ TExpression::operator bool()
|
||||
void TExpression::setvar(const char* varname, const real& val)
|
||||
|
||||
{
|
||||
_dirty |= _var.getnum(varname) != val;
|
||||
_var.set(varname, val);
|
||||
if (_var.getnum(varname) != val)
|
||||
{
|
||||
_var.set(varname, val);
|
||||
_dirty = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TExpression::setvar(int varnum, const real& val)
|
||||
|
||||
{
|
||||
_dirty |= _var.getnum(varnum) != val;
|
||||
_var.set(varnum, val);
|
||||
if (_var.getnum(varnum) != val)
|
||||
{
|
||||
_var.set(varnum, val);
|
||||
_dirty = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TExpression::setvar(const char* varname, const char* val)
|
||||
|
||||
{
|
||||
_dirty |= strcmp(_var.getstring(varname), val) != 0;
|
||||
_var.set(varname, val);
|
||||
if (strcmp(_var.getstring(varname), val) != 0)
|
||||
{
|
||||
_var.set(varname, val);
|
||||
_dirty = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TExpression::setvar(int varnum, const char* val)
|
||||
|
||||
{
|
||||
_dirty |= strcmp(_var.getstring(varnum), val) != 0;
|
||||
_var.set(varnum, val);
|
||||
if (strcmp(_var.getstring(varnum), val) != 0)
|
||||
{
|
||||
_var.set(varnum, val);
|
||||
_dirty = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
bool TExpression::print_error(const char* msg) const
|
||||
{
|
||||
return fatal_box("%s", msg);
|
||||
}
|
||||
|
||||
void TExpression::eval()
|
||||
|
||||
{
|
||||
TStack evalstack(50);
|
||||
TBit_array types;
|
||||
@ -314,6 +328,11 @@ void TExpression::eval()
|
||||
break;
|
||||
case _divide:
|
||||
o2 = (real&) evalstack.pop();
|
||||
if (o2.is_zero())
|
||||
{
|
||||
print_error("Divisione per zero!");
|
||||
o2 = 1.0;
|
||||
}
|
||||
o1 = (real&) evalstack.pop();
|
||||
evalstack.push(real(o1 / o2));
|
||||
break;
|
||||
@ -1093,4 +1112,4 @@ bool TExpression::compile(const char* expression, TTypeexp type)
|
||||
const char* TExpression::last_compiled_token() const
|
||||
{
|
||||
return _tok;
|
||||
}
|
||||
}
|
||||
|
@ -397,6 +397,8 @@ class TExpression : public TObject
|
||||
protected:
|
||||
// @cmember funzione utente da ricalcolare
|
||||
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
|
||||
void eval();
|
||||
// @cmember Converte una stringa in un nome di funzione o _invalid se non esiste
|
||||
|
@ -68,8 +68,9 @@ void TIndwin::set_text(
|
||||
}
|
||||
|
||||
TIndwin::~TIndwin()
|
||||
{
|
||||
close_modal();
|
||||
{
|
||||
if (is_open())
|
||||
close_modal();
|
||||
|
||||
if (_text) delete _text;
|
||||
if (_cancel) delete _cancel;
|
||||
|
Loading…
x
Reference in New Issue
Block a user