typedef, pointeurs de int et assignment makes pointer ...

typedef, pointeurs de int et assignment makes pointer ... - C - Programmation

Marsh Posté le 23-08-2005 à 16:23:28    

C'est sûrement très c*n mais j'ai ce petit bout de code :

Code :
  1. typedef int *CensusCode ;
  2. CensusCode newCensusCode() {
  3. CensusCode cc;
  4. if ((cc=malloc(sizeof(int)*censusSize)==NULL)) {
  5.  printf("Census : newCensusCode : memory allocation failure\n" );
  6.  return NULL;
  7. }
  8. }


 
qui me renvoie cette erreur :

census.c:17: warning: assignment makes pointer from integer without a cast


 
ca vient de quoi ?

Reply

Marsh Posté le 23-08-2005 à 16:23:28   

Reply

Marsh Posté le 23-08-2005 à 16:33:52    

A priori, je dirais que tu as oublié #include <stdlib.h> et le compilateur pense que malloc() retourne un int.
 
Ou alors c'est autre chose. Tu compiles avec quoi au fait ?

Reply

Marsh Posté le 23-08-2005 à 16:34:42    

gcc 3.4.2. sous mingw
 
stdlib est bien incluse
 
je teste sur un autre gcc au cas ou [:spamafote]

Reply

Marsh Posté le 23-08-2005 à 16:35:27    

et je compile avec ca :

gcc -c census.c -Wall -Werror -ansi -pedantic

Reply

Marsh Posté le 23-08-2005 à 16:38:11    

xav14 a écrit :

je teste sur un autre gcc au cas ou [:spamafote]


 
Pas la peine.
 
Sinon, censusSize c'est défini comment ?
 
 
Et essaie en remplaçant :

if ((cc=malloc(sizeof(int)*censusSize)==NULL))


 
par
 

if ((cc=malloc(sizeof(int)*censusSize))==NULL)


 
EDIT :
Tu peux même faire plus propre avec :

cc = malloc(censusSize * sizeof *cc);
if ( cc == NULL ) {
...


Message édité par Elmoricq le 23-08-2005 à 16:40:05
Reply

Marsh Posté le 23-08-2005 à 16:39:48    

ha ben forcément  [:wam]


Message édité par xav14 le 23-08-2005 à 16:40:07
Reply

Marsh Posté le 23-08-2005 à 16:43:27    

D'habitude, on met la taille de l'autre côté

   if ((cc=malloc(censusSize*sizeof(int))==NULL)) {

et le problème devait disparaitre.
 
L'explication est un peu subtile. C'est une question de priorité des opérateurs.
Le compilateur croit que *censusSize est un pointeur, au lieu d'être une multiplication. Donc, il faut mettre des parenthèses, ou peut-être simplement un expace après l'étoile pour éviter la confusion.

Reply

Marsh Posté le 23-08-2005 à 16:56:21    

non mais c'est juste que j'avais pas vu que je fermais pas les parenthèses au bon endroit :/
loin de moi l'idée de vouloir écrire x=y==z :o

Reply

Marsh Posté le 23-08-2005 à 17:06:12    

olivthill a écrit :

D'habitude, on met la taille de l'autre côté

   if ((cc=malloc(censusSize*sizeof(int))==NULL)) {

et le problème devait disparaitre.
 
L'explication est un peu subtile.


Elle est surtout fausse.

Reply

Marsh Posté le 23-08-2005 à 17:16:31    

Moi-aussi, j'ai ps vu le plcement incorrect de la parenthèse fermante, mais sinon il me semble que mon explication est correcte. C'est facile de dire c'est faux sans dire pourquoi. Pourrais-tu développer pour que j'apprenne quelque chose ? En changeant de côté, le compilateur ne va pas considérer que "*sizeof(int)" est un pointeur car il sait que "sizeof(int)" n'est pas un nom de variable, et donc il n'y a pas de confusion possible pour lui.

Reply

Marsh Posté le 23-08-2005 à 17:16:31   

Reply

Marsh Posté le 23-08-2005 à 17:20:46    

olivthill a écrit :

Moi-aussi, j'ai ps vu le plcement incorrect de la parenthèse fermante, mais sinon il me semble que mon explication est correcte. C'est facile de dire c'est faux sans dire pourquoi. Pourrais-tu développer pour que j'apprenne quelque chose ? En changeant de côté, le compilateur ne va pas considérer que "*sizeof(int)" est un pointeur car il sait que "sizeof(int)" n'est pas un nom de variable, et donc il n'y a pas de confusion possible pour lui.


 
Sauf que la précédence ne s'applique par définition qu'entre plusieurs opérateurs.
Là il n'y en a qu'un seul, et qui plus est binaire. Pas de confusion possible.
 
La précédence s'applique plutôt dans des cas comme celui-ci, par exemple :

machin * *bidule


(*bidule sera évalué avant la multiplication)

Reply

Marsh Posté le 23-08-2005 à 18:22:38    

xav14 a écrit :


Code :
  1. if ((cc=malloc(sizeof(int)*censusSize)==NULL)) {


qui me renvoie cette erreur :

census.c:17: warning: assignment makes pointer from integer without a cast




 
Parenthèses mal placées :  

if ((cc=malloc(sizeof(int)*censusSize))==NULL) {


Pour éviter ça :  


#include <stdlib.h>
#include <stdio.h>
 
typedef int *CensusCode;
 
CensusCode newCensusCode (size_t censusSize)
{
   CensusCode cc = malloc (sizeof (int) * censusSize);
 
   if (cc == NULL)
   {
      printf ("Census : newCensusCode : memory allocation failure\n" );
   }
 
   return cc;
}
 
int main (void)
{
   CensusCode c = newCensusCode (10);
   if (c != NULL)
   {
      free (c), c = NULL;
   }
 
   return 0;
}


Je déconseille formellement l'usage du type 'pointeur' et l'usage qui en est fait. En effet, si la définition change, il faut aussi modifier le malloc(), ce qui est une absurdité. Le bon sens commande de faire ceci :  


#include <stdlib.h>
#include <stdio.h>
 
typedef int CensusCode;
 
CensusCode *newCensusCode (size_t censusSize)
{
   CensusCode *cc = malloc (sizeof *cc * censusSize);
 
   if (cc == NULL)
   {
      printf ("Census : newCensusCode : memory allocation failure\n" );
   }
 
   return cc;
}
 
int main (void)
{
   CensusCode *c = newCensusCode (10);
   
   if (c != NULL)
   {
      free (c), c = NULL;
   }
 
   return 0;
}


http://mapage.noos.fr/emdel/notes.htm#malloc


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-08-2005 à 18:40:43    

:jap: pour le mini-cours

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed