avertissement: affectation à partir incompatible pointer type [activé par défaut] lors de l'attribution de la fonction de l'adresse de pointeur de fonction
Je suis en train de mettre en œuvre une simple fonction d'échange de l'aide de la fonction de pointeur mais quand j'assigne la fonction de l'adresse d'un pointeur de fonction en suis pointersTofunctionB.c:14:6:warning: assignment from incompatible pointer type [enabled by default]
. Ci-dessous mon code
#include <stdio.h>
void intSwap(int *a,int *b);
void charSwap(char *a,char *b);
void (*swap)(void*,void*);
int main(int argc, char const *argv[])
{
int a=20,b=15;
char c='j',d='H';
swap=&intSwap;//warning here
swap(&a,&b);
printf("%d %d\n",a,b);
swap=&charSwap;//warning here also
swap(&c,&d);
printf("%c %c\n",c,d );
return 0;
}
void intSwap(int *a,int *b)
{
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
void charSwap(char *a,char *b)
{
char temp;
temp=*a;
*a=*b;
*b=temp;
}
comment puis-je supprimer cet avertissement. quelqu'un m'aider sur ce point.
OriginalL'auteur sAm | 2014-12-24
Vous devez vous connecter pour publier un commentaire.
Les avertissements apparaissent en raison de la citation suivante de la Norme C
6.3.2.3 Pointeurs
Que deux fonctions seraient compatibles leurs paramètres doivent avoir des types compatibles
6.7.6.3 Fonction declarators (y compris les prototypes)
Dans vos fonctions paramètres sont déclarés comme des pointeurs. De sorte qu'ils (les pointeurs) serait compatible qu'ils sont des pointeurs vers des types compatibles
6.7.6.1 Pointeur declarators
2 Pour les deux types de pointeur pour être compatible, à la fois doit être identique qualifiés et les deux sont des pointeurs vers des types compatibles.
Cependant les types int ou char, d'une part, et le type void en revanche ne sont pas des types compatibles.
Vous pouvez définir les fonctions de la manière suivante
Cela aurait l'avantage de préserver typesafety dans le cas où vous voulez impliquer intSwap directement quelque part d'autre...
OriginalL'auteur Vlad from Moscow
Vous avez besoin de changer
à
En va de même pour
swap=&charSwap;
aussi.Encore une fois, votre signature de fonction(s) ne correspond pas à la fonction de pointeur de la signature.
Votre fonction est
qui est de type de retour void, deux paramètres d'entrée de
int *
, alors que, de votre pointeur de la fonction de signature estqui prend deux
void *
s. De même pourvoid charSwap
fonction.Soit yoou avoir à changer la signature de la fonction, ou vous devez utiliser un autre pointeur de la fonction de prototype. Sinon, le comportement est indéfini. [comme mentionné dans Vlad réponse].
&intSwap
donne la même chose queintSwap
par lui-même. Il ne fait aucune différence si l'esperluette est là ou pas.Vous avez raison monsieur,ils ont tous les deux évalue à la même chose. Cependant je pensais que c'est recommandé écrire comme
swap=intSwap;
. S'il vous plaît corrigez-moi que j'ai tort.Personnellement, je n'ai pas de sentiments forts de toute façon, je ne suis pas sûr si d'autres personnes vous recommandons de laisser l'esperluette ou non.
OriginalL'auteur Sourav Ghosh
using namespace std;
? La question est à propos du C, pas du C++.OriginalL'auteur sujeet kumar
Pour supprimer l'avertissement, le code de cette surcharge:
Surcharge? En C? Je pense que vous confondez le C et le C++...
OriginalL'auteur sujeet kumar