Newsgroup: it.comp.lang.c++
Titolo: map

sono un programmatore alle prime armi e vorrei avere qualche 
delucidazione sulle map. in questo codice nella funzione prim() non 
riesco a capire come possa assegnare un valore alla names[string_value] 
in quanto non c'è nessuna espressione del tipo
names[string_value] = val;
questo è il codice riguarda una calcolatrice con analizzatore sintattico
#include<iostream>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
using namespace std;
enum Token_value {
NAME, 
	FUNCTION,	NUMBER,		END,
PLUS='+', 
MINUS='-', 
MUL='*', 
DIV='/',
PRINT=';', 
ASSIGN='=', 
LP='(', 
	RP=')'};
Token_value curr_tok = PRINT;
map<string,double> names;
//map<string,string> func; è ancora da implementare
int no_of_errors;
double number_value;
string string_value, func_body;
istream *input;	//puntatore allo stream di input
double expr(bool get);
double errors(const string &s)
{
no_of_errors++;
cerr<<"error :"<<s<<'\n';
return 1;
}
Token_value get_token(istream *input)
{
char ch=0;
do {
if(!input->get(ch))return curr_tok = END;
}while(ch!='\n' && isspace(ch));
switch(ch){
case '\n':
case ';':
return curr_tok=PRINT;
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
return curr_tok = Token_value(ch);
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
input->putback(ch);
*input>>number_value;
return curr_tok = NUMBER;
default: //NAME
if(isalpha(ch)){
string_value=ch;
while(input->get(ch) && isalnum(ch))
string_value.push_back(ch);
input->putback(ch);
return curr_tok = NAME;
}
errors("bad token");
return curr_tok = PRINT;
}
}
double prim(bool get)
{
if(get) get_token();
switch(curr_tok){
case NUMBER:
{
double v = number_value;
get_token();
return v;
}
case NAME:
{
double &v = names[string_value];
if(get_token() == ASSIGN) v = expr(true);
return v;
}
case MINUS:
return -prim(true);
case LP:
{
double e = expr(true);
if(curr_tok != RP) return errors(") expected");
get_token(); //prende ')'
return e;
}
// 
	case FUNCTION:
// 
	{
//
// 
		if(func_body = func[string_value] == ""){
// 
						if(get_token() //== ASSIGN){};//-----Da Finire
// 
						else //errors("Funsione non definita");
// 
						}
// 
		else{
// 
		input = new istringstream(func_body);
// 
		double v = expr(true);
// 
		}
// 
	}
default:
return errors("primary expected");
}
}
double term(bool get) //moltiplicazione e divisione
{
double left=prim(get);
for(;;)
switch(curr_tok){
case MUL:
left*=prim(true);
break;
case DIV:
if(double d = prim(true)){
left /=d;
break;
}
return errors("divide by 0");
default:
return left;
}
}
double expr(bool get) //somma e sottrae
{
double left=term(get);
for(;;)
switch(curr_tok){
case PLUS:
left += term(true);
break;
case MINUS:
left-=term(true);
break;
default:
return left;
}
}
int main(int argc, char* argv[])
{
switch (argc){
case 1:	//lettura dallo stdin
input = &cin;
break;
case 2:	//lettura dalla linea di comando
input = new istringstream(argv[1]);
break;
default:
errors("too many argument");
return 1;
}
names["pi"]=3.14159;
names["e"]=2.7182;
while(*input){
get_token();
if(curr_tok == END) break;
if(curr_tok == PRINT) continue;
cout<<expr(false)<<'\n';
}
if(input!=&cin)delete input;
return no_of_errors;
}
sarò grato a chiunque possa aiutarmi

names[string_value] = val;
map e' un costrutto C++ !!!!
fa riferimento a it.comp.lang.c++, per cortesia !

fa riferimento a it.comp.lang.c++, per cortesia !
ops... non avevo visto il crosspost (!!!), scusate...

 
map<>::operator[] crea implicitamente la chiave nella map qualora non
esista già. Tipicamente è implementato con una chiamata a 
  pair<iterator, bool> insert( const value_type& val )  
che aggiunge l'elemento se non ne esiste già uno con la stessa chiave e
restituisce un iterator che punta all'elemento creato o a quello già
esistente. Perciò:
 map<string,int>	mappa;
 
 int& pippo = mappa["pippo"]; 
      // crea l'elemento e inizializza il reference pippo
 pippo = 100;  // modifica l'elemento dentro mappa
Max

 wrote in message
Pine.LNX.4.10.100082...@c64.comm2000.it...

Ho capito grazie mille!