Question

j'ai une fonction comme

void printMe (void *i)
{
    printf("%d", i);
}

où je veux passer un pointeur vide et l’imprimer à l’écran. L'exemple ci-dessus convient si i est un entier, float ou double mais plante si i est un caractère. Il n’ya pas de surcharge en C comme je l’utilise habituellement en C ++. La question est donc la suivante: pouvons-nous créer une fonction en C qui imprimera l’élément qui est son paramètre, et si oui, comment est-ce possible, car cela m’échappe totalement en ce moment.

Était-ce utile?

La solution

Q1: La question est donc la suivante: pouvons-nous créer une fonction en C qui imprimera l'élément correspondant à son paramètre

R: Pas comme vous le souhaitez. Vous devrez transmettre des informations à la fonction en lui indiquant le type de données que vous transmettez.

Q2: et si oui, comment est-ce possible, car cela m’échappe totalement en ce moment.

R: Cela vous échappe parce que cela ne peut pas être fait. Il n'y a pas de métadonnées associées à un vide * que le compilateur ou le moteur d'exécution peuvent utiliser pour déterminer s'ils tapent le type sur lequel ils pointent. Vous devez soit

  1. passer une structure qui contient un
    pointeur et informations sur ce que
    le pointeur pointe vers (par exemple un enum).
  2. passer un paramètre supplémentaire avec informations sur ce que le pointeur pointe vers

En ce qui concerne le code, la seule chose que vous pouvez imprimer ici est l'adresse vers laquelle je pointe.

Un pointeur vide pointe sur des données brutes, printf suppose que vous sachiez quel type de données vous imprimez, il n'a aucune intelligence et ne peut pas & "comprendre" & ";" pour vous.

C'est aussi simple que cela.

Ce que vous pouvez faire, c'est transmettre des informations de type à la fonction, mais vous obtenez alors quelque chose de très similaire à printf its self, dans lequel vous transmettez une chaîne de mise en forme contenant des informations de type sur les données dans les arguments suivants.

J'espère que cela vous aidera.

Aussi. . . " Il n’ya pas de surcharge en C comme je l’utilise habituellement en C ++ "

Même en c ++, la surcharge survient au moment de la compilation et, dans ce cas, le compilateur n'a aucun moyen de savoir quelles données seront transmises à cette fonction. Par conséquent, même si vous êtes habitué à la surcharge, cela ne fonctionnerait jamais de cette manière (par exemple: essayez la même chose en utilisant printf, mais compilez-le avec un compilateur C ++, vous obtiendrez exactement les mêmes résultats). Essayez réellement

cout << i;

dans la fonction ci-dessus, et cela vous donnera l'adresse vers laquelle je pointe, pas la & valeur " de i. Vous aurez besoin de lancer i et de le dévier avant de pouvoir obtenir sa valeur

cout << *(int*)i;

Donc, pour que ce qui précède fonctionne en C ++, il vous faut beaucoup de fonctions surchargées (ou une fonction de modèle, ce qui est vraiment la même chose, sauf que le compilateur lance les fonctions pour vous), par exemple. fonctions surchargées

printMe(int i){...}
printMe(double d){...}
printMe(char c){...}
printMe(char* string){...}

En c, il vous suffit de donner à ces fonctions des noms spécifiques

printInt(int i){...}
printDouble(double d){...}
printChar(char c){...}
printString(char* string){...}

Autres conseils

Pour commencer, vous imprimez le pointeur, et non son objet. Pour imprimer le contenu réel, vous devez transmettre *i à printf, et non i.

Si vous voulez vraiment faire cela, une solution est:

void printMe (void *p, int typ) {
    switch(typ) {
        case TYP_INT: printf("%d", *((int*)p)); break;
        case TYP_CHR: printf("%c", *((char*)p)); break;
        /* and so on ... */
    }
}
  

La question est donc la suivante: pouvons-nous créer une fonction en C qui imprimera l’élément qui est son paramètre

Oui, nous pouvons. Une telle fonction fait déjà partie de la bibliothèque standard - elle s'appelle printf;)

Comme il n’ya pas de surcharge des fonctions de compilation en C, vous devez indiquer le type des arguments au moment de l’exécution. La chaîne de formatage <=> peut être utilisée à cette fin. Il n'y a donc aucune raison de créer votre propre fonction d'encapsuleur s'il existe déjà une solution opérationnelle.

Si vous essayez d’imprimer la valeur du pointeur, l’utilisation correcte est printf("%p", i);. Le spécificateur «d» concerne les entiers et le «p» les pointeurs. Il est de votre responsabilité de les corriger, et de mauvaises choses peuvent arriver si vous les mélangez.

Je ne sais pas pourquoi cela échouerait pour un caractère * et non pour un entier *, et il est possible que d'autres problèmes vous causent cela. Si cela échoue toujours avec% p, quelque chose d'autre s'est foiré. Voyez si vous pouvez installer une sorte de logiciel de contrôle de la mémoire pour vérifier les pointeurs en suspens ou les doubles libres (), car à ce moment-là, l’argent intelligent a corrompu la mémoire quelque part.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top