Copier des tableaux de structures en C

Cela fait longtemps que je n’utilise pas le langage C et cela me rend folle. J’ai un tableau de structures et j’ai besoin de créer une fonction qui va copier un tableau dans un autre (j’ai besoin d’une copie exacte), mais je ne sais pas comment définir l’appel de fonction. Je suppose que je dois utiliser des pointeurs, mais lorsque j’essaie, cela me donne une erreur.

struct group{ int weight; int x_pos; int y_pos; int width; int height; }; struct group a[4]; struct group b[4]; copySolution(&a, &b); 

Cette dernière déclaration m’envoie une erreur. Comme je l’ai dit, la programmation en C est longue depuis longtemps, alors je suis un peu perdue pour le moment 🙁

Ça devrait le faire:

 memcpy(&b, &a, sizeof(a)); 

EDIT : Au fait: cela sauvegardera une copie de a in b .

Comme le dit Johannes Weiß, memcpy() est une bonne solution.

Je veux juste souligner que vous pouvez copier des structures comme des types normaux:

 for (i=0; i<4; i++) { b[i] = a[i]; /* copy the whole struct a[i] to b[i] */ } 

Cela donne l’impression d’un devoir mal masqué … De toute façon, étant donné le format d’appel prédéterminé pour copySolution dans le message d’origine, la définition correcte de copySolution ressemblerait à ceci:

 void copySolution(struct group (*a)[4], struct group (*b)[4]) { /* whatever */ } 

À l’intérieur de copySolution vous pouvez copier les tableaux à votre guise. Soit utiliser un cycle

 void copySolution(struct group (*a)[4], struct group (*b)[4]) { const struct group *pb, *pbe; struct group *pa; for (pa = *a, pb = *b, pbe = pb + sizeof *b / sizeof **b; pb != pbe; ++pa, ++pb) *pa = *pb; } 

ou utilisez memcpy comme suggéré ci-dessus

 void copySolution(struct group (*a)[4], struct group (*b)[4]) { memcpy(b, a, sizeof *b); } 

Bien sûr, vous devez d’abord décider dans quelle direction vous voulez que vos tableaux soient copiés. Vous n’avez fourni aucune information, donc tout le monde est arrivé à une conclusion.

Dans mon cas, les solutions précédentes ne fonctionnaient pas correctement! Par exemple, la solution de @Johannes Weiß n’a pas copié “suffisamment” de données (elle a copié environ la moitié du premier élément).
Donc, si quelqu’un a besoin d’une solution qui vous donnera des résultats corrects, la voici:

 int i, n = 50; struct YourStruct *a, *b; a = calloc(n, sizeof(*a)); b = malloc(n * sizeof(*b)); for (i = 0; i < n; ++i) { // filling a } memcpy(b, a, n * sizeof(*a)); // <----- see memcpy here if (a != NULL) free(a); a = calloc(n*2, sizeof(*a)); memcpy(a, b, n * sizeof(*b)); // <------ see memcpy here again 

Certaines notes, j’utilisais calloc pour a, car dans la partie '// remplir une', je faisais des opérations nécessitant des données initialisées.

Le compilateur ne dispose d’aucune information sur la taille du tableau après l’avoir passé en tant que pointeur dans une fonction. Donc, vous avez souvent besoin d’un troisième paramètre: la taille des tableaux à copier.

Une solution (sans vérification d’erreur) pourrait être:

 void copySolution(struct group* a, struct group* b, size_t size) { memcpy(a, b, size * sizeof(*a)); } 

Le plus simple est probablement

  b=a 

bien qu’une solution avec memcpy() fonctionne également.