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)
{
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;
}
}

View File

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

View File

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