PDA

View Full Version : [C] spiegatemi questo WARNING


cn73
08-04-2004, 09:58
...struct msgbuf1 { /* struttura che contiene: */
long mtype; /* - tipo del messaggio; */
char mtext[100]; /* - il messaggio; */
} sndbuf, rcvbuf, *msgp;
char *piatto, *temp_pid;
...
piatto = malloc(strlen(msgp->mtext) - strlen(temp_pid ) );




~/Marco/>gcc program.c -o accademia
program.c: In function `main':
program.c:131: warning: assignment makes pointer from integer without a cast
~/Marco/>

VICIUS
08-04-2004, 10:08
gcc ti avverte solo che quando fai quel assegnamento non hai fatto nessun cast quindi ce lo mette lui.
Se lo metti esplicito smette di dare il warning.
piatto = (char*) malloc(strlen(msgp->mtext) - strlen(temp_pid ) );
ciao ;)

ilsensine
08-04-2004, 10:11
Il codice è corretto, forse l'errore è da un'altra parte (ridefinizione di variabili, boh...)

Intanto cerca la variabile "sospetta", controlla ad es. se con uno di questi due cast il warning scompare:

strlen((char *) (msgp->mtext))
strlen((char *) temp_pid)

Tieni anche conto che in presenza di certe macro (non so se ne usi qualcuna) le righe riportate dal gcc possono essere scorrette. Ad esempio ti sei concentrato sulla malloc, e forse l'errore è sulla linea dopo...boh...

Sono solo indicazioni, la malloc come la hai scritta non dovrebbe produrre warning.

ilsensine
08-04-2004, 10:12
Originariamente inviato da VICIUS
gcc ti avverte solo che quando fai quel assegnamento non hai fatto nessun cast quindi ce lo mette lui.

Non è obbligatorio castare da void * a <qualsiasitipo> * (malloc ritorna void *, non un intero come suggerisce il warning). Almeno, non con tutte le verisoni di gcc che ho provato.

cn73
08-04-2004, 10:28
Non è perchè il campo mtext della struttura è definito come char[100] e non come char * ?

cn73
08-04-2004, 10:30
mmm...il warning sparisce solo se:


piatto = (char *)malloc(strlen(msgp->mtext) - strlen(temp_pid ) );

ilsensine
08-04-2004, 10:31
No. Un array di char è un puntatore costante.

ilsensine
08-04-2004, 10:32
Originariamente inviato da cn73
mmm...il warning sparisce solo se:


piatto = (char *)malloc(strlen(msgp->mtext) - strlen(temp_pid ) );


Puoi vedere se il warning ti compare anche con questo codice?

void *v = NULL;
char *c;
c = v;

cn73
08-04-2004, 10:50
Col tuo codice non compare...

ilsensine
08-04-2004, 10:51
Allora la tua malloc è definita restiruire "unsigned long". Strano, che versione delle libc stai usando?

ilsensine
08-04-2004, 12:57
Ho capito... :doh:

SCOMMETTO che se compili con
gcc program.c -o accademia -Wall
ovvero dicendogli di mostrare tutti i warning, ti compare anche questo:

warning: implicit declaration of function `malloc'

...VERO? :huh:

Hai capito ora dove è il "problema"? ;)

cn73
08-04-2004, 13:13
Esatto il messaggio è proprio quello...

mmm...non so, la malloc non è definita per restituire un tipo stabilito ma è una void?...perciò assegnando il suo valore a una variabile dovrei castizzarla?

ilsensine
08-04-2004, 13:17
Includi stdlib.h, animale! :D

cn73
08-04-2004, 13:37
:muro: :D