Newsgroup: it.comp.lang.c++
Titolo: problemino con 1 struct.

Ciao a tutti. alle volte mi domando: ma sono scemo io o il compilatore?
il + delle volte devo concludere che il compilatore sta benessimo...
x es:
typedef struct {
    GLfloat  x;        //GLfloat ovviamente e` gia definito in gl.h
    GLfloat  y;
    GLfloat  z;
} GLpoint;
typedef struct {
    GLpoint       v0;
    GLpoint       v1;
    GLpoint       v2;
    GLtriangle*  Next;
} GLtriangle;
il problema e` GLtriangle* Next;. io non ero sicuro che si potesse fare,
ma mi sono documentato, e ho sotto gli occhi un esempio che lo fa tale e
quale. a me invece dice sintax error before '*'. ma perche`?
grazie e ciao
mauro.
--
ICQ# 12946469


Prova a dare un nome alla struct es.
typedef struct gltriangle {
    GLpoint       v0;
    GLpoint       v1;
    GLpoint       v2;
    gltriangle*  Next;
} GLtriangle;
dovrebbe funzionare :-)
Luca.

Non sono esperto ma ho provato a scrivere il tuo codice ed anche a me viene
segnalato il tuo stesso errore.
Ciò che hai scritto non è un errore ma, facciamo un esempio:
typedef struct {
           float b;
           float c;
           anonima* puntatore;
} anonima;
L'errore sta nel fatto che tu dichiari un puntatore con un identificatore
(il nome della struttura) senza averlo ancora definito, quindi il
compilatore  giustamente ti segnala errore.
Prova quindi a scrivere:
struct GLtriangle{
          	GLpoint a;
            GLpoint b;
            GLpoint c;
            GLtriangle* puntatore;
}
Come per le classi il nuovo tipo può essere utilizzato anche immediatamente
senza aver completato la definizione della struttura.       

 quale. a me invece dice sintax error before '*'. ma perche`?
L'esempio in questione, se veramente "tale e quale" quello che riporti,
e` in errore rispetto allo standard.
Non c'e` altra abbondanza che metodi per trasformare questo codice in
codice perfettamente standard, come ad esempio riportare GLtriangle
anche fra "struct" e la "{" ora immediatamente successiva.
Incidentalmente, questo tipo di strutture (tipicamente usate per
implementarsi 'a manina' una lista...) diventano inutili con l'uso
di strumenti appropriati, come std::list delle librerie standard.
Alex

 di strumenti appropriati, come std::list delle librerie standard.
dici bene: sto proprio implementando 'a manina' una lista. come avevo intuito
che std::list fosse quello che faceva al caso mio. ho anche tentato di capire
come funziona ma non ci ho capito un H...(domanda implicita: cosa si puo`
leggere sull' argomento?).
grazie mille (anche a tutti gli altri che hanno risposto), ci sentiamo alla
prossima impasse.
mauro
--
ICQ# 12946469

 leggere sull' argomento?).
Ho sentito parlare bene di un paio di testi introduttivi assai
specifici, ma non li ho visti di persona.  Comunque, Lippman e
Lajoie, C++ Primer (Addison-Wesley), disponibile anche in
italiano da Addison-Wesley Italia, copre anche i contenitori
standard del C++, oltre a vari altri argomenti spesso non bene
compresi, come quello che ti causava specificamente problemi.
#include <list>
typedef struct {
    // ...
} ilnome;
typedef std::list<ilnome> lalista;
Ora puoi dichiarare variabili di tipo lalista.  Alcune vecchie
implementazioni ti richiedono di rendere visibile comunque anche
una funzione bool operator<(const ilnome&, const ilnome&) [che
in realta` verra` usata se e solo se vuoi fare il sort di una
di queste liste, quindi al limite scrivila contenente solo un
"return true;" per far contento un vecchio compilatore...].
Per aggiungere strutture in fondo a una lista:
    lalista li;
    li.push_back(ilnome(argomenti di costruttore));
e similmente con push_front per aggiungerne davanti.  La lista
ha anche funzioni-membro insert, delete, erase, clear, e varie
altre, per farci varie modifiche, accessori back e front per
tornare un reference alla testa e coda, un metodo size che ti
dice quanti elementi ha ora la lista, ecc ecc.
Normalmente per 'camminare' sulla lista usi i suoi iteratori
e il metodi begin ed end:
    lalista::iterator it = li.begin();
    while(it!=li.end()) {
        // usa *it, la struct corrente
        ++it;
    }
Alex

quale. a me invece dice sintax error before '*'. ma perche`?
Devi dare un nome alla struttura, l'identificatore GLtriangle non
e` visibile se non alla fine di tutta la typedef.
L'idioma (C) corretto e`
typedef struct GLtriangle {
    GLpoint       v0;
    GLpoint       v1;
    GLpoint       v2;
    GLtriangle*  Next;
} GLtriangle;
Ma se programmi in C++ puoi farne a meno e usare direttamente
struct GLtriangle {
    GLpoint       v0;
    GLpoint       v1;
    GLpoint       v2;
    GLtriangle*  Next;
};
e utilizzare direttamente
GLtriangle UnaVariabile;  // senza struct
Meglio ancora faresti poi utilizzando std::list (rigorosamente in
C++)
Paolo
--------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
--------------------------------------------------

Esempio:
struct pippo;
typedef struct {
    pippo* ptr;
    void* data;
} pippo;
Perche' funziona? con struct pippo hai detto che esiste una struct di nome
pippo (incredibile, vero?). pippo* e' un oggetto che il compilatore sa
perfettamente trattare (e' un puntatore ad un'istanza di pippo). Alla fine,
il puntatore sa anche come e' fatto pippo (e qui siamo tutti felici e
contenti).
Quello che non puo' fare (in C++) e'
typedef struct {
    pippo tmp;
    void* data;
} pippo;
perche' quando il compilatore raggiunge il punto di dover mettere
all'interno della struct un'istanza di pippo non conosce ancora
completamente il layout dell'oggetto.
Ciao!!!!

 completamente il layout dell'oggetto.
Una ragione assai piu` cogente e` che, se un compilatore potesse
fare cio` che qui si scrive, si avrebbe:
    sizeof(pippo) >= sizeof(pippo)+sizeof(void*) > sizeof(pippo)
L'interessante vincolo della forma X > X e` piuttosto difficile
da soddisfare.
Alex