PDA

Visualizza la versione completa : [C] Struct, vettore di struct, problemi


bako
13-05-2006, 12:53
edit: cribbio ho dimenticato il tag
questa è la parte del codice:


typedef struct
{
char cmd[100];
int pid;
} t_figlio;

#define MAX_FIGLI 100

t_figlio figli[MAX_FIGLI];
int tot=0;

void update_figli(int pid,char * arg){
int i=0;
while(i<MAX_FIGLI && figli[i]!=pid) i++;
strcpy(figli[i].cmd,arg);
}

void init_figli(){
int i;
for(i=0;i<MAX_FIGLI;i++)
figli[i].pid=0;

}
void add_figlio(int pid){
int i;
i=0;
while(i<MAX_FIGLI && figli[i]!=0) i++;
figli[i].pid=pid;
tot=i;
}

void rem_figlio(int pid){

int i,k;
i=0;
while(i<MAX_FIGLI && figli[i]!=pid) i++;
if (i==tot) exit(-1);
for(k=i;k<tot;k++) {
figli[k].pid=figli[k+1].pid;
strcpy(figli[k].cmd,figli[k].cmd)
}
tot--;

}

ora, quando compilo dice:



stefano@ubuntu:~/shell$ make
figli.c:13: error: syntax error before ‘figli’
figli.c:13: warning: data definition has no type or storage class
figli.c: In function ‘update_figli’:
figli.c:19: error: request for member ‘cmd’ in something not a structure or union
figli.c: In function ‘init_figli’:
figli.c:25: error: request for member ‘pid’ in something not a structure or union
figli.c: In function ‘add_figlio’:
figli.c:32: error: request for member ‘pid’ in something not a structure or union
figli.c: In function ‘rem_figlio’:
figli.c:42: error: request for member ‘pid’ in something not a structure or union
figli.c:42: error: request for member ‘pid’ in something not a structure or union
figli.c:43: error: request for member ‘cmd’ in something not a structure or union
figli.c:43: error: request for member ‘cmd’ in something not a structure or union
figli.c:44: error: syntax error before ‘}’ token
figli.c: In function ‘jobs’:
figli.c:54: error: request for member ‘pid’ in something not a structure or union
figli.c:60: error: request for member ‘cmd’ in something not a structure or union
figli.c:62: error: request for member ‘cmd’ in something not a structure or union
figli.c:69: error: request for member ‘cmd’ in something not a structure or union
figli.c:71: error: request for member ‘cmd’ in something not a structure or union
make: *** [figli.o] Error 1

che diavolo vuole?

GabbOne
13-05-2006, 14:24
while(i<MAX_FIGLI && figli[i]!=pid) i++;


figli[i] è una struttura
pid è un intero

non ha senso figli[i]!=pid

sicuramente un errore di distraction

anzi è stato un pò recitivo ci stà in tutte le funzioni

non l'ho finito di guardare perchè non so che fà il tuo prog
:fighet:

devil89
14-05-2006, 12:57
Prima di tutto questo non va bene:


t_figlio figli[MAX_FIGLI];
davanti devi aggiungere typedef, perchè stai rinominando la struttura t_figlio con un array.

Inoltre vengono segnalati errori in funzioni che non hai postato.

Dovresti poi in tutte le funzioni, dichiarare un puntatore all'array figli[MAX_FIGLI] e tramite quello accedere al campo pid o cmd.

Esempio:


figli *pt;
(*pt).figli[i].cmd

oregon
14-05-2006, 13:30
Originariamente inviato da devil89
Prima di tutto questo non va bene:


t_figlio figli[MAX_FIGLI];
davanti devi aggiungere typedef, perchè stai rinominando la struttura t_figlio con un array.

Non comprendo questa tua affermazione ...

La dichiarazione va bene cosi' com'e' ... la typedef c'e' ... quindi esiste un nuovo tipo di dato ... si dichiara un array di elementi del nuovo tipo di dato e mi sembra non ci sia problema ...


Originariamente inviato da devil89
Dovresti poi in tutte le funzioni, dichiarare un puntatore all'array figli[MAX_FIGLI] e tramite quello accedere al campo pid o cmd.

Esempio:


figli *pt;
(*pt).figli[i].cmd


Anche questo non e' corretto ... la visibilita' dell'array e' globale ...

devil89
14-05-2006, 13:42
Originariamente inviato da oregon
Non comprendo questa tua affermazione ...

La dichiarazione va bene cosi' com'e' ... la typedef c'e' ... quindi esiste un nuovo tipo di dato ... si dichiara un array di elementi del nuovo tipo di dato e mi sembra non ci sia problema ...



Non c'è la typedef.
Non capisco come possa essere giusta la scrittura:

t_figlio figli[MAX_FIGLI];

Lui in quel modo vuole far diventare la struttura t_figlio un array, quindi come può fare senza typedef?

Io ho sempre usato typedef.

bako
14-05-2006, 13:56
Originariamente inviato da devil89
Non c'è la typedef.
Non capisco come possa essere giusta la scrittura:

t_figlio figli[MAX_FIGLI];

Lui in quel modo vuole far diventare la struttura t_figlio un array, quindi come può fare senza typedef?

Io ho sempre usato typedef.
il typedef c'è


typedef struct
{
char cmd[100];
int pid;
} t_figlio;


il problema è che mettevo la dichiarazione nel .h e nn me la prendeva perchè mi ero dimenticato l'inculde. e anche i .pid nel ciclo

oregon
14-05-2006, 15:38
Originariamente inviato da devil89
Non c'è la typedef.
Non capisco come possa essere giusta la scrittura:

t_figlio figli[MAX_FIGLI];

Lui in quel modo vuole far diventare la struttura t_figlio un array, quindi come può fare senza typedef?

Io ho sempre usato typedef.

Guarda che ti stai confondendo ... la typedef esiste eccome ...



typedef struct
{
char cmd[100];
int pid;
} t_figlio;

GabbOne
15-05-2006, 15:46
Forse è più semplice e coerente con il significato della typedef , utilizzare questa notazione

struct nome_struttura
{
....
....
};

typedef nome_struttura nome_struttura;


//dichiarazioni

nome_struttura myVar;


:ciauz:

oregon
15-05-2006, 16:53
E perche' mai?

La definizione di un tipo a partire da una struttura anonima e' perfettamente legittima.

U-bahn
15-05-2006, 17:46
hai provato ad usare -> invece di . (essendo un array, dovrebbe avere più senso...credo)


figli[i]->pid=pid;

Loading