Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1308 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1182505
xav14
Posté le 23-08-2005 à 16:23:28  profilanswer
 

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 ?

mood
Publicité
Posté le 23-08-2005 à 16:23:28  profilanswer
 

n°1182528
Elmoricq
Modérateur
Posté le 23-08-2005 à 16:33:52  profilanswer
 

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 ?

n°1182530
xav14
Posté le 23-08-2005 à 16:34:42  profilanswer
 

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

n°1182532
xav14
Posté le 23-08-2005 à 16:35:27  profilanswer
 

et je compile avec ca :

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

n°1182537
Elmoricq
Modérateur
Posté le 23-08-2005 à 16:38:11  profilanswer
 

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
n°1182541
xav14
Posté le 23-08-2005 à 16:39:48  profilanswer
 

ha ben forcément  [:wam]


Message édité par xav14 le 23-08-2005 à 16:40:07
n°1182546
olivthill
Posté le 23-08-2005 à 16:43:27  profilanswer
 

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.

n°1182573
xav14
Posté le 23-08-2005 à 16:56:21  profilanswer
 

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

n°1182592
matafan
Posté le 23-08-2005 à 17:06:12  profilanswer
 

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.

n°1182610
olivthill
Posté le 23-08-2005 à 17:16:31  profilanswer
 

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.

mood
Publicité
Posté le 23-08-2005 à 17:16:31  profilanswer
 

n°1182614
Elmoricq
Modérateur
Posté le 23-08-2005 à 17:20:46  profilanswer
 

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)

n°1182664
Emmanuel D​elahaye
C is a sharp tool
Posté le 23-08-2005 à 18:22:38  profilanswer
 

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/
n°1182677
xav14
Posté le 23-08-2005 à 18:40:43  profilanswer
 

:jap: pour le mini-cours


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
[MSSQL] Pointer vers une autre BDDPointer sur un exe avec flash (supérieur au 5)
les pointeurs , les tableaux ??? je mis perdBug sur une affectation "Java null pointer exeption"
pb avec typedefles pointeurs - petite aide !
A propos des pointeurs.[Débutant]Toujours constructeur, pointeurs, agrégation
java et pointeurs sur fonction[c++] classe et typedef
Plus de sujets relatifs à : typedef, pointeurs de int et assignment makes pointer ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR