[c++] problema con typedef e struct

Oo.Stud.ssa.oO
Qual è il problema in questo codice?

#include <cstdlib>
#include <iostream>

struct sdati {
        int d;
        float c;
        } ;
        
typedef struct sdati dati;
       
struct snodo {
        dati dato;
        struct snodo *next;
        };
typedef struct snodo nodo;
nodo *InsertFirst (nodo* s, dati CurrD);
nodo *InsertInOrder (nodo *s, dati CurrD);
void Stampa(nodo *s);

int main(int argc, char *argv[])
{
    
    nodo *s;
    s=NULL;
    dati dato;
    int dim, i=0;
    cout<<"Quanti elementi vuoi inserire?";
    cin>>dim;
    
    while ( i<dim){
          cout<<"Inserire elemento:";
          cin>>dato;
          InsertInOrder (s,dato);
          i++;}
    Stampa (s);
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

nodo *InsertFirst (nodo* s, dati CurrD){
     nodo*  p;
     nodo *q = new nodo;
     q->dato = CurrD;
     q->next = s;
     p=q;
     return p;}
     
nodo *InsertInOrder (nodo *s, dati CurrD){
     nodo *p = s;
     if (s==NULL){
                  InsertFirst ( s, CurrD);}
     while (p->next != NULL && CurrD.d > p->next->dato.d){
           p = p->next;
           }
     nodo *r = new nodo;
     p->next = r;
     r->next = p->next;
     return s;}
     
void Stampa(nodo *s){
     while (s!=NULL){
           cout<<s->dato.d<<"-";
           s = s->next;}}



E perchè prima che scrivessi sul main non mi dava poblemi mentre adesso mi dice:
Ridefinition of 'struct dati' previous definition of struct dati

e idem per struct nodo? :|

Risposte
apatriarca
Potresti mostrare l'output del compilatore per esteso? È inoltre tutto nello stesso file oppure sono in file diversi? Che cosa hai cambiato esattamente tra quando funzionava e quando ha smesso di funzionare? Non ho tempo adesso di compilare il codice.

Oo.Stud.ssa.oO
è in file diversi, gli struct e gli header in lista.h, l' implementazione delle funzioni in lista.cpp e un terzo file per il main;

L' output del compilatore è

11 D:\LISTE\lista.h redefinition of `struct nodo'
4 D:\LISTE\main.cpp from main.cpp
4 D:\LISTE\lista.h redefinition of `struct dati'
4 D:\LISTE\lista.h previous definition of `struct dati'
11 D:\LISTE\lista.h redefinition of `struct nodo'
11 D:\LISTE\lista.h previous definition of `struct nodo'
D:\LISTE\main.cpp In function `int main(int, char**)':
19 D:\LISTE\main.cpp no match for 'operator>>' in 'std::cin >> dato'

Ho scritto il codice all'interno del main e dopo ho compilato e non mi ha dato DONE come il solito ma si è chiuso da solo e mi ha dato questo errore

apatriarca
Inizia a leggerti questa pagina di wikipedia e vedi se risolve il problema. Il problema è secondo me in ogni caso legato all'inclusione dei vari file. Sarebbe quindi meglio se inserissi il codice per intero e separassi meglio i diversi file.

Oo.Stud.ssa.oO
A ecco dov era l'errore, praticamente faceva una doppia dichiarazione e serviva mettere
#ifndef PERSONA_H
#define PERSONA_H





 #endif


Però un errore me lo da lo stesso

D:\LISTE\main.cpp In function `int main(int, char**)':
19 D:\LISTE\main.cpp no match for 'operator>>' in 'std::cin >> dato'

ma non vedo perchè..
ho messo l' using namespace std;

apatriarca
dato è una struttura di tipo dati. std::cin non ha idea di come leggere una struttura di questo tipo. Devi implementare l'operatore >> per la tua struttura se vuoi usare questa sintassi. In alternativa puoi scrivere qualcosa come
std::cin >> dato.d >> dato.c;


Ma non avevo notato fosse C++!!! Non è allora necessario (e neanche consigliato) usare tutti quei typedef. Questo è il modo giusto di dichiarare strutture in C++:
struct dati {
    int d;
    float c;
};
       
struct nodo {
    dati dato;
    nodo *next;
};

E cerca di formattare il tuo codice un po' meglio in modo da renderlo più leggibile..

Oo.Stud.ssa.oO
Ma com'è possibile allora che una settimana fa un analogo programma non mi abbia dato problemi nonostante avessi fatto la stessa identica cosa?


Ma scrivendo le struct in quel modo dati è un tipo?

apatriarca
Sì.. In C++ dati è un tipo e non è necessario scrivere struct (o union o enum o..) prima del nome. Chi ti ha insegnato che è necessario inserire il typedef o si riferiva al C oppure non conosce affatto il C++ ma lo vuole comunque insegnare pensando sia uguale al C ma con iostream al posto di stdio.h.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.