Même s'il est possible d'écrire du code générique dans C à l'aide du pointeur Void (pointeur générique), je constate qu'il est assez difficile de déboguer le code puisque le pointeur de vide peut prendre tout type de pointeur sans avertissement de compilateur. (FOCATION E.G FOO () Prenez le pointeur vide qui est censé être pointé sur la structure, mais le compilateur ne se plaingait pas si le tableau de charcuterie est passé.) Quel type d'approche / stratégie utilisez-vous tous lorsque vous utilisez un pointeur vide dans C? P>
6 Réponses :
Nous savons tous que le type C est fondamentalement la merde, mais essayez de ne pas faire cela ... Vous avez encore des options pour traiter des types génériques: syndicats et pointeurs opaques. P>
Quoi qu'il en soit, si une fonction générique prend un pointeur vide en tant que paramètre, il ne devrait pas essayer de la désirer!. P>
La solution ne doit pas utiliser vide * code> à moins que vous ne puissiez vraiment. Les endroits où un pointeur vide est réellement requis sont très petits: les paramètres des fonctions de thread et une poignée d'autres endroits où vous devez passer des données spécifiques à la mise en œuvre via une fonction générique. Dans tous les cas, le code qui accepte le paramètre Void * code> ne doit accepter que le type de données em> est passé via le pointeur vide et le type doit être documenté dans des commentaires et respectivement respectueux de Tous les appelants. P>
L'OP a spécifiquement mentionné la programmation générique, qui constitue un très bon étui d'utilisation pour annuler * (en l'absence d'installations de langage de niveau supérieur tels que des modèles ou de belles macros.)
Je veux dire, par exemple, qsort () et bsearch ()
@Matt, QSort et BSearch sont des exemples de "données spécifiques à la mise en œuvre via une fonction générique".
@Js: Droite, et lorsque vous faites une programmation générique, le nombre d'endroits que vous devez faire est plus proche d'un camion plein qu'une poignée ;-)
L'approche / la stratégie consiste à minimiser l'utilisation des points nuls *. Ils sont nécessaires dans des cas spécifiques. Si vous avez vraiment besoin de passer du vide *, vous devez également passer la taille de la cible du pointeur. P>
Cette fonction de swap générique vous aidera beaucoup dans la compréhension du vide générique * p>
xxx pré> blockQuote>
La solution d'Arya peut être modifiée un peu pour supporter une taille variable:
#include <stdio.h>
#include <string.h>
void swap(void *vp1,void *vp2,int size)
{
char buf[size];
memcpy(buf,vp1,size);
memcpy(vp1,vp2,size);
memcpy(vp2,buf,size); //memcpy ->inbuilt function in std-c
}
int main()
{
int array1[] = {1, 2, 3};
int array2[] = {10, 20, 30};
swap(array1, array2, 3 * sizeof(int));
int i;
printf("array1: ");
for (i = 0; i < 3; i++)
printf(" %d", array1[i]);
printf("\n");
printf("array2: ");
for (i = 0; i < 3; i++)
printf(" %d", array2[i]);
printf("\n");
return 0;
}
Si ceci est une question C seule question, supprimez la balise C ++
Hmmm ... "Quand je frappe mon doigt avec un marteau, ça fait mal grand temps. Quelle approche utilisez-vous lorsque vous utilisez des parties frappantes de votre corps avec un marteau?"
Si vous pensez que C Programmation générique avec VOID * peut être élégant / agréable à utiliser, consultez ce que vous devez faire pour utiliser la fonction QSort ...
Pourquoi êtes-vous si inquiet pour le pointeur vide lorsque vous avez de nombreux types de données spécifiques ... :)
Utilise des modèles C ++ non une option viable? Si vous êtes inquiet pour la programmation générique, vous devez certainement le considérer.
@WRAPPERM à l'aide de pointeurs de vide pourrait être vraiment économique, en particulier si vous avez besoin d'une structure de données générique.
J'ai fait des recherches dans le domaine de la programmation générique utilisant C. J'ai résumé toutes mes conclusions dans cet article: antreinc.net/2010/09/30/generic-Data-tructures-in-c peut-être cela aide-t-il.
@Andrei: Cela aurait pu être une réponse