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:
guy 1996-08-26 15:59:07 +00:00
parent 38f03725d7
commit ebb0b893fb
3 changed files with 79 additions and 57 deletions

View File

@ -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);
TArray::add(new TValue(val), i); CHECKS(var, "Variabile NULLA ", name);
return; if (strcmp(var->getname(), name) == 0)
{
*var = val;
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;
@ -1093,4 +1112,4 @@ bool TExpression::compile(const char* expression, TTypeexp type)
const char* TExpression::last_compiled_token() const const char* TExpression::last_compiled_token() const
{ {
return _tok; return _tok;
} }

View File

@ -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

View File

@ -68,8 +68,9 @@ 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;