PDA

Visualizza la versione completa : [C++] Uso del typedef per dichiarare un array di struct


salvatore991
03-01-2011, 15:03
Salve ragazzi, provando a fare uno degli esercizi del prof sono inceppato in un problema.
Dovrei creare un array di struct, io ho pensato di utilizzare le typedef scrivendo il seguente codice
-----------------------------------------------------------
#define NMAX 100

typedef struct dati {
int eta;
char sesso;
} sdati;

typedef sdati vett[NMAX];
------------------------------------------------------------
ma il compilatore mi dai problemi(uso dev c++) sulla dichiarazione di vett, dice
"forbids declaration of vett with no type".
potete darmi qualche suggerimento su come fare???

torn24
03-01-2011, 15:12
typedef struct dati {
int eta;
char sesso;
} sdati;

sdati vett[NMAX];//typedef non ci vuole sdati è gia un tipo

salvatore991
03-01-2011, 15:39
grazie per l'aiuto, ma io voglio definire proprio un tipo vett con dimensione [NMAX] in modo da dichiarare le variabili cosi
vett VS, VM, VF;
ho provato a scrivere il codice cosi


typedef struct dati {
int eta;
char sesso;
} vett[NMAX];

ma il compilatore da sempre lo stesso errore

ramy89
03-01-2011, 16:22
typedef struct
{
int eta;
char sesso;
} vett1;
typedef struct
{
vett1[NMAX];
}vett2;

alka
04-01-2011, 11:16
Originariamente inviato da salvatore991
uso del typedef per dichiarare un array di struct

Il linguaggio va indicato anche nel titolo, come da Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887) (qui l'ho corretto io), e il codice va formattato inserendolo nel tag [CODE].

Ciao! :ciauz:

torn24
04-01-2011, 13:50
citazione:

grazie per l'aiuto, ma io voglio definire proprio un tipo vett con dimensione [NMAX] in modo da dichiarare le variabili cosi
vett VS, VM, VF;
ho provato a scrivere il codice cosi


anche se fosse possibile dichiararle in questo modo vett VS, VM, VF;
cambierebbe solo la dichiarazione poi dovresti accederci normalmente
non ti cambia molto scrivere una riga cosi vett VS[100], VM[100], , VF[100];

salvatore991
04-01-2011, 16:23
io avevo pensato di fare in questo modo visto che le dichiarazioni delle variabili e delle funzioni devo farle in un file separato che ho chiamato "funzioni.h".
quest vettori devo passarli come parametri alle funzioni ma il compilatore mi da errore quando vado a passarli

ramy89
04-01-2011, 18:16
Pensandoci molto alla fine una soluzione l' ho trovata,includi nell' header le definizioni dei tipi:



#define NMAX 10
#define use typedef struct{int eta;char sesso;}vett1;typedef struct{vett1 vett2[NMAX];}vett3;


use è la parola chiave che ti definisce tutte le definizioni dei tipi,la puoi anche cambiare.
Basta scrivere in testa al file:


use


E tu hai automaticamente definito il tipo vett1 e il tipo vett2 e vett3.
A questo punto però accedere alla struttura non è semplice come prima,devi dichiarare una variabile di tipo vett3 e accedere agli elementi:



vett3 beta;
beta.vett2[0].sesso='c';


Il che te lo sconsiglio.
In effetti il tipo array non è definito in C,questo perchè le dimensioni sarebbero prestabilite.
Non essendoci i garbage collectors in C è compito del programmatore usare la memoria minima.
Se poi ti capita spesso di usare il numero NMAX di strutture si che è una convenienza includerlo nell' header.Altrimenti ti ricordo che ci sono anche i puntatori se già li conosci.
Puoi semplicemente dichiarare la definizione della struttura una volta,poi allocare spazio NMAX volte con calloc.
Altrimenti includi la definizione nell' header.
Una soluzione è includere solo vett1 e poi dichiarare nella main un vettore come ad esempio:



vett1 alfa[NMAX];


Così secondo me è più semplice.

bubino91
04-01-2011, 21:34
Ciao scusa ma perchè non evitare l'uso del typedef visto che stai creando una sola nuova struttura e procedere così:

#define NMAX 100

struct dati {
int eta;
char sesso;
};

dati nomevettore[NMAX];

o volendo puoi usare l'allocazione dinamica:


#define NMAX 100

struct dati {
int eta;
char sesso;
};

dati *nomepuntatoreadati;
nomepuntatoreadati=new dati[NMAX];

MacApp
05-01-2011, 00:58
Originariamente inviato da salvatore991
io avevo pensato di fare in questo modo visto che le dichiarazioni delle variabili e delle funzioni devo farle in un file separato che ho chiamato "funzioni.h".
quest vettori devo passarli come parametri alle funzioni ma il compilatore mi da errore quando vado a passarli
A me non da errori:


/*
$ g++ --version
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646) (dot 1)
$ g++ -Wall -ansi -pedantic -Wextra -Wconversion main.cpp
$ ./a.out
6
*/

#include <iostream>

const int NMAX=3;

typedef struct dati {
int eta;
char sesso;
} sdati;

typedef sdati vett[NMAX];

namespace ig{
int test (vett theVett){
int ret = 0;
for (int i = 0; i < NMAX; ++i){
ret += theVett [i].eta;
}
return ret;
}
}

int main (void){
vett aVett={{1, 'M'}, {2, 'M'}, {3, 'M'}};

std::cout << ig::test (aVett) << std::endl;
return 0;
}


Fornisci un esempio minimalista completo atto a riprodurre il tuo errore.

Loading