x-t
08-05-2008, 13:07
qualcuno mi sa dire perchè questo codice non compila?
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>
#include <map>
#include <list>
#include <algorithm>
#include <iostream>
using namespace std;
//definiamo l'elemento nodo_rete, ovvero un generico elemento della rete di sensori
typedef struct{
list<int> lista_nodi_adiacenti;//è una lista che contiene gli identificativi dei nodi adiacenti
bool principale;//true indica che è il nodo principale, false indica che è un nodo secondario
int identificativo;//identificativo del nodo di rete in questione
int identificativo_nodo_seguente;//identificativo del successivo nodo cui passare un pacchetto
int numero_passi;
} nodo_rete;
double p; //probabilità di morte di un nodo
double q; //probabilità che un nodo ne generi un altro
double xxx; //probabilità che un nodo generato si interconnetta con un altro qualsiasi nodo della rete
int contatore_identificativi=1;
//restituisce un numero random nell'intervallo [0,1)
double random01(){
return ((double)rand() / ((double)(RAND_MAX)+(double)(1)) );
}
void evolvi_rete(map<int,nodo_rete> *map){
//prima di tutto facciamo morire i nodi con probabilità p, e aggiorniamo la lista dei nodi adiacenti per tutti gli altri nodi
cout<<"Morte dei nodi con probabilita' p="<<p<<"\n"<<endl;
list<int> lista_nodi_da_eliminare;
map<int, nodo_rete>::iterator it; //qui c'è l'errore
for ( it=(*map).begin(); it!=(*map).end(); it++){
if(it->first.identificativo!=0 && random01()<=p){
lista_nodi_da_eliminare.insert(lista_nodi_da_eliminare.begin(),it->first);
}
}
list<int>::iterator it1;
for ( it1=lista_nodi_da_eliminare.begin(); it1!=lista_nodi_da_eliminare.end(); it1++){
(*map).erase(it1);
}
//adesso facciamo nascere, per ogni nodo esistente, un nuovo nodo con probabilità q
cout<<"Nascita dei nodi con probabilita' q="<<q<<"\n"<<endl;
for ( it=(*map).begin(); it!=(*map).end(); it++){
if(it->first!=0 && random01()<=q){
nodo_rete nodoFiglio;
nodoFiglio.identificativo=contatore_identificativi;
cout<<"E' nato un nodo con identificativo "<<contatore_identificativi<<" dal nodo padre "<<it->first<<endl;
contatore_identificativi++;
nodoFiglio.principale=false;
nodoFiglio.lista_nodi_adiacenti.insert(nodoFiglio.lista_nodi_adiacenti.begin(),it->first);
it->second.lista_nodi_adiacenti.insert(it->second.lista_nodi_adiacenti.begin(), contatore_identificativi -1);
//facciamo legare il nodo creato agli altri nodi della rete con probabilità xxx
map<int,nodo_rete>::iterator it2;
for ( it2=(*map).begin(); it2!=(*map).end(); it2++){
if(random01()<=xxx && it2->first!=it->first){
nodoFiglio.lista_nodi_adiacenti.insert(nodoFiglio.lista_nodi_adiacenti.begin(),it2->first);
it2->second.lista_nodi_adiacenti.insert(it2->second.lista_nodi_adiacenti.begin(),contatore_identificativi -1);
}
}
}
(*map).insert(pair<int,nodo_rete>(contatore_identificativi -1, nodoFiglio));
}
//Applichiamo l'algoritmo di routing
return;
}
int main(int argc, char *argv[]){
//impostiamo i valori di default delle probabilità
p=0.3;
q=0.6;
xxx=0.1;
//creiamo e inizializiamo la mappa che contiene i nodi che fanno parte della rete di sensori
map<int,nodo_rete> mappa_nodi_rete;
//creiamo il nodo principale e lo inseriamo in testa alla lista
nodo_rete nodo_principale;
nodo_principale.principale=true;
nodo_principale.identificativo=0;
nodo_principale.numero_passi=0;
nodo_principale.identificativo_nodo_seguente=0;
nodo_principale.lista_nodi_adiacenti.insert(nodo_principale.lista_nodi_adiacenti.begin(),0);//il nodo principale è adiacente a se stesso
mappa_nodi_rete.insert(pair<int,nodo_rete>(0, nodo_principale));
//cout<< (lista_nodi_rete.getNumElementi());
srand( (unsigned)time(0) );
int scelta;
do{
cout<<"Programma gestione rete di sensori\n\n1.Imposta probabilita' di nascita\n2.Imposta probabilita' di morte\n3.Fai evolvere la rete di sensori\n4.Fai partire pacchetto da un nodo\n5.Calcola percorso medio\n6.Esamina stato della rete";
cout<<"\n0.Esci\n";
cout<<"\n\nScelta:";
cin>>scelta;
system("CLS");
switch(scelta){
case 1:{
double choose;
do{
cout<<"Imposta la probabilita' di nascita q.\nIl valore attualmente impostato e' "<<q<<"\n\nN.B. La probabilita' deve avere un valore compreso tra 0 e 1.\n"<<endl;
cin>>choose;
system("CLS");
if(choose>1 || choose <0) cout<<"\aLa probabilita' deve essere compresa tra 0 e 1!\n\n\a";
else q=choose;
}while(choose>1 || choose <0);
}
break;
case 2:{
double choose;
do{
cout<<"Imposta la probabilita' di morte p.\nIl valore attualmente impostato e' "<<p<<"\n\nN.B. La probabilita' deve avere un valore compreso tra 0 e 1.\n"<<endl;
cin>>choose;
system("CLS");
if(choose>1 || choose <0) cout<<"\aLa probabilita' deve essere compresa tra 0 e 1!\n\n\a";
else p=choose;
}while(choose>1 || choose <0);
}
break;
case 3:{
//evolvi_rete(&lista_nodi_rete);
system("pause");
system("CLS");
}
break;
case 5:{
//percorso medio
}
break;
case 6:{
system("CLS");
cout<<"La rete possiede attualmente le seguenti caratteristiche:\n";
cout<<"Probabilita' di nascita di un nodo: "<<q<<endl;
cout<<"Probabilita' di morte di un nodo: "<<p<<endl;
//cout<<"Sono presenti complessivamente "<<lista_nodi_rete.getNumElementi()<<" nodi"<<endl;
cout<<"Mediamente il percorso tra un nodo secondario e il principale e' costituito da N passi"<<endl;
system("pause");
system("CLS");
}
break;
case 0:{
cout<<"Arrivederci\n";
system("pause");
break;
}
default:{
cout<<"Voce di menu non valida: riprovare!!\n";
system("pause");
}
}
}while(scelta!=0);
return 0;
}
preciso che si tratta di un programmino che simula una rete.
Il compilatore mi genera il seguente errore:
error C2062: tipo 'int' imprevisto
nella definizione dell'iteratore. Ma come è possibile? non capisco proprio.
L'unica cosa che sono riuscito a capire è che non è possibile utilizzare l'iterator fuori dal mai...ma mi sembra strano che non sia possibile farlo.
vi prego, datemi una mano.
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>
#include <map>
#include <list>
#include <algorithm>
#include <iostream>
using namespace std;
//definiamo l'elemento nodo_rete, ovvero un generico elemento della rete di sensori
typedef struct{
list<int> lista_nodi_adiacenti;//è una lista che contiene gli identificativi dei nodi adiacenti
bool principale;//true indica che è il nodo principale, false indica che è un nodo secondario
int identificativo;//identificativo del nodo di rete in questione
int identificativo_nodo_seguente;//identificativo del successivo nodo cui passare un pacchetto
int numero_passi;
} nodo_rete;
double p; //probabilità di morte di un nodo
double q; //probabilità che un nodo ne generi un altro
double xxx; //probabilità che un nodo generato si interconnetta con un altro qualsiasi nodo della rete
int contatore_identificativi=1;
//restituisce un numero random nell'intervallo [0,1)
double random01(){
return ((double)rand() / ((double)(RAND_MAX)+(double)(1)) );
}
void evolvi_rete(map<int,nodo_rete> *map){
//prima di tutto facciamo morire i nodi con probabilità p, e aggiorniamo la lista dei nodi adiacenti per tutti gli altri nodi
cout<<"Morte dei nodi con probabilita' p="<<p<<"\n"<<endl;
list<int> lista_nodi_da_eliminare;
map<int, nodo_rete>::iterator it; //qui c'è l'errore
for ( it=(*map).begin(); it!=(*map).end(); it++){
if(it->first.identificativo!=0 && random01()<=p){
lista_nodi_da_eliminare.insert(lista_nodi_da_eliminare.begin(),it->first);
}
}
list<int>::iterator it1;
for ( it1=lista_nodi_da_eliminare.begin(); it1!=lista_nodi_da_eliminare.end(); it1++){
(*map).erase(it1);
}
//adesso facciamo nascere, per ogni nodo esistente, un nuovo nodo con probabilità q
cout<<"Nascita dei nodi con probabilita' q="<<q<<"\n"<<endl;
for ( it=(*map).begin(); it!=(*map).end(); it++){
if(it->first!=0 && random01()<=q){
nodo_rete nodoFiglio;
nodoFiglio.identificativo=contatore_identificativi;
cout<<"E' nato un nodo con identificativo "<<contatore_identificativi<<" dal nodo padre "<<it->first<<endl;
contatore_identificativi++;
nodoFiglio.principale=false;
nodoFiglio.lista_nodi_adiacenti.insert(nodoFiglio.lista_nodi_adiacenti.begin(),it->first);
it->second.lista_nodi_adiacenti.insert(it->second.lista_nodi_adiacenti.begin(), contatore_identificativi -1);
//facciamo legare il nodo creato agli altri nodi della rete con probabilità xxx
map<int,nodo_rete>::iterator it2;
for ( it2=(*map).begin(); it2!=(*map).end(); it2++){
if(random01()<=xxx && it2->first!=it->first){
nodoFiglio.lista_nodi_adiacenti.insert(nodoFiglio.lista_nodi_adiacenti.begin(),it2->first);
it2->second.lista_nodi_adiacenti.insert(it2->second.lista_nodi_adiacenti.begin(),contatore_identificativi -1);
}
}
}
(*map).insert(pair<int,nodo_rete>(contatore_identificativi -1, nodoFiglio));
}
//Applichiamo l'algoritmo di routing
return;
}
int main(int argc, char *argv[]){
//impostiamo i valori di default delle probabilità
p=0.3;
q=0.6;
xxx=0.1;
//creiamo e inizializiamo la mappa che contiene i nodi che fanno parte della rete di sensori
map<int,nodo_rete> mappa_nodi_rete;
//creiamo il nodo principale e lo inseriamo in testa alla lista
nodo_rete nodo_principale;
nodo_principale.principale=true;
nodo_principale.identificativo=0;
nodo_principale.numero_passi=0;
nodo_principale.identificativo_nodo_seguente=0;
nodo_principale.lista_nodi_adiacenti.insert(nodo_principale.lista_nodi_adiacenti.begin(),0);//il nodo principale è adiacente a se stesso
mappa_nodi_rete.insert(pair<int,nodo_rete>(0, nodo_principale));
//cout<< (lista_nodi_rete.getNumElementi());
srand( (unsigned)time(0) );
int scelta;
do{
cout<<"Programma gestione rete di sensori\n\n1.Imposta probabilita' di nascita\n2.Imposta probabilita' di morte\n3.Fai evolvere la rete di sensori\n4.Fai partire pacchetto da un nodo\n5.Calcola percorso medio\n6.Esamina stato della rete";
cout<<"\n0.Esci\n";
cout<<"\n\nScelta:";
cin>>scelta;
system("CLS");
switch(scelta){
case 1:{
double choose;
do{
cout<<"Imposta la probabilita' di nascita q.\nIl valore attualmente impostato e' "<<q<<"\n\nN.B. La probabilita' deve avere un valore compreso tra 0 e 1.\n"<<endl;
cin>>choose;
system("CLS");
if(choose>1 || choose <0) cout<<"\aLa probabilita' deve essere compresa tra 0 e 1!\n\n\a";
else q=choose;
}while(choose>1 || choose <0);
}
break;
case 2:{
double choose;
do{
cout<<"Imposta la probabilita' di morte p.\nIl valore attualmente impostato e' "<<p<<"\n\nN.B. La probabilita' deve avere un valore compreso tra 0 e 1.\n"<<endl;
cin>>choose;
system("CLS");
if(choose>1 || choose <0) cout<<"\aLa probabilita' deve essere compresa tra 0 e 1!\n\n\a";
else p=choose;
}while(choose>1 || choose <0);
}
break;
case 3:{
//evolvi_rete(&lista_nodi_rete);
system("pause");
system("CLS");
}
break;
case 5:{
//percorso medio
}
break;
case 6:{
system("CLS");
cout<<"La rete possiede attualmente le seguenti caratteristiche:\n";
cout<<"Probabilita' di nascita di un nodo: "<<q<<endl;
cout<<"Probabilita' di morte di un nodo: "<<p<<endl;
//cout<<"Sono presenti complessivamente "<<lista_nodi_rete.getNumElementi()<<" nodi"<<endl;
cout<<"Mediamente il percorso tra un nodo secondario e il principale e' costituito da N passi"<<endl;
system("pause");
system("CLS");
}
break;
case 0:{
cout<<"Arrivederci\n";
system("pause");
break;
}
default:{
cout<<"Voce di menu non valida: riprovare!!\n";
system("pause");
}
}
}while(scelta!=0);
return 0;
}
preciso che si tratta di un programmino che simula una rete.
Il compilatore mi genera il seguente errore:
error C2062: tipo 'int' imprevisto
nella definizione dell'iteratore. Ma come è possibile? non capisco proprio.
L'unica cosa che sono riuscito a capire è che non è possibile utilizzare l'iterator fuori dal mai...ma mi sembra strano che non sia possibile farlo.
vi prego, datemi una mano.