Newsgroup: it.comp.lang.c++
Titolo: enum in un loop?

Avrei voluto inserire un comando enum all'interno di un ciclo while
    while(!mioFile.eof())
    {
       getline(mioFile,linea);
       if(linea.find("createConcept")!=linea.npos)
       {
         parola = linea.substr(15, linea.find(" ",16)-15);
         cout << parola << endl;
         enum nodes
         {
            parola = i
          }
          i++
       }
Cosě non funziona, č possibile farlo funzionare, o č proprio sbagliata 
l'idea?
Grazie.

 l'idea?
L'espressione "non funziona" lascia pensare che almeno produca un 
programma, ma il codice che hai scritto non e' nemmeno sintatticamente 
corretto.
Comunque non mi e' chiara l'idea. se la domanda e' <<Si puo' inserire un 
"enum" in un ciclo "while"?>>, la risposta e' si'. Nel tuo esempio puoi 
scrivere:
    enum nodes { parola = 123 };
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

 
Il file di testo contiene 166 volte la keyword createConcept.
Ogni volta che trovo createConcept devo passare la parola che segue ad 
un metodo che lo aggiunge come nodo di una rete bayesiana. Quel metodo 
prende come parametro interi. Enum mi avrebbe evitato di memorizzare in 
qualche modo l'associazione nome/numero del nodo.
Insomma, enum si può usare solo con costanti? Speravo poterlo usare con 
variabili, puntatori etc.

 variabili, puntatori etc.
Si', "enum" si puo' usare solo per definire identificatori di costanti 
in base a espressioni intere costanti.
Se non ho capito male, quello che puoi fare e' usare una variabile 
vector<string> v. Ogni volta che leggi una parola, aggiungi la parola al 
vector chiamando v.push_back(parola). E al metodo passi l'indice di tale 
parola, cioe' il numero v.size() - 1.



Il codice che ho scritto sinora è:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include "dlib/bayes_utils.h"
#include "dlib/graph_utils.h"
#include "dlib/graph.h"
#include "dlib/directed_graph.h"
using namespace std;
using namespace dlib;
int main ()
{
    vector<string> v
    ifstream mioFile;
    mioFile.open ("TBox.txt");
    string linea, parola;
    int i;
    i = 0;
    while(!mioFile.eof())
    {
       getline(mioFile,linea);
       if(linea.find("createConcept")!=linea.npos)
       {
         parola = linea.substr(15, linea.find(" ",16)-15);
         cout << parola << endl;
         v.push_back(parola);
       }
    }
    mioFile.close();
    return 0;
}
Ma è sbagliato, ottengo questo messaggio dal compilatore:
i.cpp: In function ‘int main()’:
i.cpp:13: error: reference to ‘vector’ is ambiguous
dlib/bayes_utils/../matrix/../geometry/vector.h:21: error: candidates 
are: template<class T> class dlib::vector
/usr/include/c++/4.2/bits/stl_vector.h:159: error: 
template<class _Tp, class _Alloc> class std::vector
i.cpp:13: error: expected primary-expression before ‘>’ token
i.cpp:13: error: ‘v’ was not declared in this scope
i.cpp:14: error: expected `;' before ‘ifstream’
i.cpp:15: error: ‘mioFile’ was not declared in this scope

 i.cpp:13: error: reference to ‘vector’ is ambiguous
scrivi std::vector invece che vector.
E.


Grazie.
Per stampare a video il contenuto del vettore?
Posso usare v[i] all'interno di un loop?

cr610 ha scritto:

Sì!
E.


Ancora non riesco a farlo funzionare:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include "dlib/bayes_utils.h"
#include "dlib/graph_utils.h"
#include "dlib/graph.h"
#include "dlib/directed_graph.h"
using namespace std;
using namespace dlib;
int main ()
{
    ifstream mioFile;
    mioFile.open ("TBox.txt");
    string linea, parola;
    int i,j;
    i=0;
    struct nodo
       {
       string nome;
       std::vector<string> figli;
       };
    std::vector <nodo> lista;
    while(!mioFile.eof())
    {
       getline(mioFile,linea);
       if(linea.find("createConcept")!=linea.npos)
       {
         parola = linea.substr(15, linea.find(" ",16)-15);
         cout << parola << endl;
        lista.nome.push_back(parola);
       }
    }
    for (j=0; j!= v.size();j++)
       {
       cout << v[j] << endl;
       }
    mioFile.close();
    return 0;
}
Se provo a compilare ottengo:
i.cpp: In function ‘int main()’:
i.cpp:24: error: template argument for ‘template<class _Alloc> class 
std::allocator’ uses local type ‘main()::nodo’
i.cpp:24: error:   trying to instantiate ‘template<class _Alloc> class 
std::allocator’
i.cpp:24: error: template argument 2 is invalid
i.cpp:24: error: invalid type in declaration before ‘;’ token
i.cpp:33: error: request for member ‘nome’ in ‘lista’, which is of 
non-class type ‘int’
i.cpp:37: error: ‘v’ was not declared in this scope

        lista.nome.push_back(parola);
questa istruzione non ha senso. Quello che vuoi fare è qualcosa del tipo:
	nodo n;
	n.nome=...;
	list.push_back(n);
E.