typedef, pointeurs de int et assignment makes pointer ... - C - Programmation
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 ?
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
Marsh Posté le 23-08-2005 à 16:35:27
et je compile avec ca :
gcc -c census.c -Wall -Werror -ansi -pedantic |
Marsh Posté le 23-08-2005 à 16:38:11
xav14 a écrit : je teste sur un autre gcc au cas ou |
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); |
Marsh Posté le 23-08-2005 à 16:39:48
ha ben forcément
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.
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
Marsh Posté le 23-08-2005 à 17:06:12
olivthill a écrit : D'habitude, on met la taille de l'autre côté
et le problème devait disparaitre. |
Elle est surtout fausse.
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.
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)
Marsh Posté le 23-08-2005 à 18:22:38
xav14 a écrit :
|
Parenthèses mal placées :
if ((cc=malloc(sizeof(int)*censusSize))==NULL) { |
Pour éviter ça :
|
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 :
|
http://mapage.noos.fr/emdel/notes.htm#malloc
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 :
qui me renvoie cette erreur :
census.c:17: warning: assignment makes pointer from integer without a cast
ca vient de quoi ?