Newsgroup: it.comp.lang.c
Titolo: [beginner] strutture II

Chiedo scusa, con riferimento al topic già postato (scusate ne apro un altro
perchè temo che quello verrà abbandonato....)
Ottengo un warning quando vado a fare la malloc. E' cosa "grave" ??
Grazie in anticipo
Francesco
#include <stdio.h>
struct automobile {
 char* colore;
 int price;
};
main() {
struct automobile *ferrari;
ferrari = malloc(sizeof(struct automobile));
ferrari->price = 25000;
ferrari->colore = malloc(6);
strcpy(ferrari->colore,"rosso");
printf("colore %s e prezzo %d",ferrari->colore,ferrari->price);
}
struct1.c:13: warning: assignment makes pointer from integer without a cast
struct1.c:15: warning: assignment makes pointer from integer without a cast

 }
Ciao,
Ema

 ha
scritto:

Non centra la versione del compilatore.
E' normale, in C la malloc restituisce un puntatore generico (void *, pe
intenderci), e il compilatore, non avendo informazioni sul tipo di memoria
allocata, richiede un cast esplicito al tipo corretto.
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

 ciao.g
Sicuro di non aver compilato un file cpp? Nel C99 il cast sul valore di
ritorno della malloc non è più necessario.
Ciao

 Ciao
uso tutti file rigorosamente in c. (nome compreso).
Comunque da un warning, non un errore.
ciao.
g.

 Ciao
Verissimo ed e' buona norma eliminare i warning.
Tra l'altro facendo una compilata con
$ gcc -Wall -pedantic auto.c
auto.c:11: warning: return type defaults to `int'
auto.c: In function `main':
auto.c:14: warning: implicit declaration of function `malloc'
auto.c:14: warning: assignment makes pointer from integer without a cast
auto.c:16: warning: assignment makes pointer from integer without a cast
auto.c:18: warning: implicit declaration of function `strcpy'
auto.c:22: warning: control reaches end of non-void function
Consiglio a Francesco di usare soprattutto l'opzione -Wall fin da adesso che
e' principiante per imparare a scrivere codice corretto, che nel caso
specifico diventerebbe:
#include <string.h>  /* serve per strcpy */
#include <stdlib.h>  /* serve per malloc */
#include <stdio.h>
struct automobile {
 char* colore;
 int price;
};
int main(void)
{
struct automobile *ferrari;
ferrari = (struct automobile*)malloc(sizeof(struct automobile));
ferrari->price = 25000;
ferrari->colore = (char *)malloc(6);
strcpy(ferrari->colore,"rosso");
printf("colore %s e prezzo %d",ferrari->colore,ferrari->price);
return 0;
}

Ottengo un warning quando vado a fare la malloc. E' cosa "grave" ??
Devi includere "stdlib.h".
Con malloc(), in C, il cast non va MAI usato (vedi i vecchi messaggi).
-- 
Andrea Laforgia
Open Delphi Manual
http://groups.yahoo.com/group/delphi_open_manual/

Aggiungi il cast:
Non è per questo.  L'uso del cast in C va *sempre* evitato (al
contrario del C++ in cui è obbligatorio).  Se non si sta compilando in
modalità C++, il warning è dovuto alla mancanza dell'include di
"stdlib.h".  Inclusa questa, è tutto OK, senza cast.


Comunque da un warning, non un errore.
morphing ? "Francesco" o "Giovanni Resta" ? :-)
Vedi le altre mie risposte.


specifico diventerebbe:
Il codice che hai postato è tutt'altro che corretto.  Come già
ripetuto molte volte qui dentro e sul ng americano comp.lang.c (vedi
le FAQ), il cast, in C, non si usa.  I warning bisogna eliminarli
includendo gli header giusti, nel caso specifico "stdlib.h".


 Vedi le altre mie risposte.
nessun morphing, stavo solo rispondendo a wonderboy
a proposito del messaggio di warning nel gcc-3.2.3
che lui supponeva potesse essere dovuto al g++ e invece
non mi ero accorto della mancanza della stdlib.h
non sono Francesco.
g.

 includendo gli header giusti, nel caso specifico "stdlib.h".
Ecco la FAQ che parla dei cast. C'e' anche la 7.6 che indica l'inclusione di
<stdlib.h> come da te indicato negli altri post.
Mi pare che si dica "these casts are no longer necessary" non che non si
debba usarli.
L'uso dei cast consente la portabilità.
Question 7.7
Why does some code carefully cast the values returned by malloc to the
pointer type being allocated?
----------------------------------------------------------------------------
----
Before ANSI/ISO Standard C introduced the void * generic pointer type, these
casts were typically required to silence warnings (and perhaps induce
conversions) when assigning between incompatible pointer types. (Under
ANSI/ISO Standard C, these casts are no longer necessary.)

Grazie 1000 per tutte le risposte (ho scatenato un piccolo putiferio!)
in ogni caso il compilatore che uso è quello installato con la Mandrake 9.0
su Linux (non ricordo a memoria la versione ma abbastanza recente cmq)
salutoni
ciao
Francesco
"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:nsi1jvsr3oht4dj4g...@4ax.com...


L'uso dei cast consente la portabilità.
La portabilità non c'entra un benemerito *nulla* con l'uso dei cast.
I cast, in C, abbassano il (già ridotto all'osso) controllo sui tipi e
questo è male.
