PDA

View Full Version : [C]Problema passaggio array di struct a funzione


vv1984
12-09-2008, 12:35
Ciao a tutti,
ho un array "ready" contenente strutture di tipo "msg"
da me definite. Il campo payload contiene un array di byte,
i primi quattro (ai quali provo ad accedere con il cast a (int *))
rapresentano un numero progressivo.
Nella definizione della funzione "ordina" il compilatore mi restituisce
il seguente errore: "array type has incomplete element type"

Vi ringrazio in anticipo per l'aiuto

typedef struct msg
{
char payload[100];
}

msg ready[10];

void ordina(msg *ready)
{
printf("prova %d", *(int *)(ready[5]).payload);
}

vv1984
12-09-2008, 12:48
per quale riga da errore?

quella in cui provo a chiamare la printf

DanieleC88
12-09-2008, 13:24
typedef struct msg
{
char payload[100];
}

msg ready[10];

Ad occhio dovrebbe essere:
typedef struct msg
{
char payload[100];
}
msg;

msg ready[10];

tomminno
12-09-2008, 13:29
Non so che compilatore usi ma secondo me se non scrivi:

typedef struct msg
{
char payload[100];
} msg;

Oppure dichiari

struct msg ready[10];

void ordina(struct msg *ready)


il tuo codice non compila.

vv1984
13-09-2008, 19:17
infatti non credo che sia corretto perchè ad occhio e croce fai un typedef affermando che la struttura struct msg sia un alias per msg ready[10], un gran casino, non puoi fare una dichiarazione contestuale alla definizione di una variabile in un typedef. il typedef va a parte...

Chiedo scusa ma mi ero sbagliato a ricopiare il codice..
il problema ovviamente persiste:

typedef struct msg
{
char payload[100];
} msg;

msg ready[10];

void ordina(msg *ready)
{
printf("prova %d", *(int *)(ready[5]).payload);
}

DanieleC88
13-09-2008, 20:19
Ho appena provato col seguente codice:
#include <stdio.h>

typedef struct
{
char payload[100];
} msg;

msg ready[10];

void ordina(msg *ptr)
{
printf("prova %d", *(int *)(ptr[5]).payload);
}

int main()
{
int x;

for (x = 0; x < 10; ++x)
{
char y;

for (y = 0; y < 100; ++y)
{
ready[x].payload[y] = (y + 1);
}
}

ordina(ready);
return 0;
}

Il programma compila correttamente e mi mostra il risultato corretto. Il fatto è però che l'ho compilato con TCC, che generalmente è più permissivo di GCC. Mi viene in mente che potresti usare esplicitamente (*(int *) (ptr[5].payload)) per evitare che il cast venga interpretato in modo errato, e che dovresti modificare la struct in modo da non far collidere il nome assegnato alla struct con il nome del tipo che la identifica (anche se dovrebbe essere comunque lecito farlo, ma non posso assicurartelo se non lo provo da GCC):
typedef struct { char payload[100]; } msg;

Prova iniziando con queste modifiche e vediamo se migliora. ;)