PDA

Visualizza la versione completa : Utilizzare un array di puntatori a strutture


cicciox80
20-06-2008, 18:19
Ciao a tutti, mi servirebbe una struttura dati di questo tipo

- un array di 20 elementi
- ogni elemento è un puntatore ad una struttura

Nel mio caso ho una lista di giocatori, stavo pensando di implementarla così:



struct persona {
int eta;
int peso;
};

struct persona * persone[20]; // va bene così?


ho fatto un programma di esempio, che aggiunge 2 persone:



#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
struct persona {
int eta;
int peso;
};

struct persona * persone[20]; // va bene così?
int i;
for (i=0; i<20; i++)
persone[i] = NULL;

// allocazione dinamica di una persona
struct s * p;
*p = malloc(sizeof(struct s));
*p.eta=20;
*p.peso=65;
persone[5] = p; // così il 5° elemento dell'array punta alla persona creata

// stessa cosa ma aggiungo una nuova persona all'8° elemento
*p = malloc(sizeof(struct s));
*p.eta=50;
*p.peso=75;
persone[8] = p;

// stampa della lista delle persone
for (i=0; i<20; i++)
if (persone[i] == NULL)
printf("%2d\n", i);
else
printf("%2d: eta=%d, peso=%d\n", i, persone[i].eta, persone[i].peso);

return 0;
}


Il compilatore (gcc) mi dà tutti questi errori:



prova.c: In function 'main':
prova.c:22: error: incompatible types in assignment
prova.c:23: error: request for member 'eta' in something not a structure or union
prova.c:24: error: request for member 'peso' in something not a structure or union
prova.c:27: error: incompatible types in assignment
prova.c:28: error: request for member 'eta' in something not a structure or union
prova.c:29: error: request for member 'peso' in something not a structure or union
prova.c:36: error: request for member 'eta' in something not a structure or union
prova.c:36: error: request for member 'peso' in something not a structure or union


dove ho sbagliato?

MItaly
20-06-2008, 18:35
struct persona * p;
*p = malloc(sizeof(*p));

Tra puoi anche evitare di dichiarare p lavorando direttamente sull'array:


persone[5] = malloc(sizeof(struct persona);
persone[5]->eta=20;
persone[5]->peso=65;
.
P.S.: manca il linguaggio nel titolo.

cicciox80
22-06-2008, 12:41
Originariamente inviato da MItaly


struct persona * p;
*p = malloc(sizeof(*p));

Tra puoi anche evitare di dichiarare p lavorando direttamente sull'array:


persone[5] = malloc(sizeof(struct persona);
persone[5]->eta=20;
persone[5]->peso=65;
.
P.S.: manca il linguaggio nel titolo.

non ci avevo pensato!

ma qual'è l'errore del mio codice?

oregon
22-06-2008, 13:26
ma qual'è l'errore del mio codice?

Ma la struttura s cosa e' e da dove viene?

struct s * p;

???

La struttura l'hai chiamata

struct persona

mi pare ...

E MItaly ti ha mostrato cosa dovevi scrivere ...

Samuele_70
22-06-2008, 13:27
Usavi

struct s * p;

ma la struttura 's' non era dichiarata.



#include <stdlib.h>
#include <stdio.h>

struct persona
{
int eta;
int peso;
};

int main()
{
struct persona *p, *persone[20];
int i;

for (i=0; i<20; i++)
persone[i] = NULL;

// allocazione dinamica di una persona
p = (struct persona*)malloc(sizeof(struct persona));
p->eta=20;
p->peso=65;
persone[5] = p; // così il 5° elemento dell'array punta alla persona creata

// stessa cosa ma aggiungo una nuova persona all'8° elemento
p = (struct persona*)malloc(sizeof(struct persona));
p->eta=50;
p->peso=75;
persone[8] = p;

// stampa della lista delle persone
for (i=0; i<20; i++)
if (persone[i] == NULL)
printf("%2d : NULL\n", i);
else
printf("%2d : eta=%d, peso=%d\n", i, persone[i]->eta, persone[i]->peso);

return 0;
}

kyoboom
30-05-2011, 09:58
E se uno avesse bisogno di 10 persone in + come fa ad "aggiungere" altre persone?

Persone=(struct Persona *)realloc(persone,sizeof(Persona)*30);

alka
30-05-2011, 14:54
Originariamente inviato da kyoboom
E se uno avesse bisogno di 10 persone in + come fa ad "aggiungere" altre persone?

Persone=(struct Persona *)realloc(persone,sizeof(Persona)*30);

Non risollevare discussioni vecchie di anni per porre una nuova domanda.
Apri una discussione separata, come da Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887).

Loading