2009-10-03 8 views
1

J'ai un fichier dans un format connu et je veux le convertir en un nouveau format, par exemple .:C: struct copie/éléments du tableau

struct foo { 
    char   bar[256]; 
}; 

struct old_format { 
    char   name[128]; 
    struct foo  data[16]; 
}; 

struct new_format { 
    int    nr; 
    char   name[128]; 
    struct foo  data[16]; 
}; 

static struct old_format old[10]; 
static struct new_format new[10]; 

Problème: après avoir rempli les « anciens » avec les données que je Je ne sais pas comment copier son contenu à "nouveau". Si je

new[0].name = old[0].name; 
new[0].data = old[0].data; 

Je reçois une erreur de compilation sur l'affectation char * à char [128] (struct foo * sur struct foo [16], respectivement).

J'ai essayé une solution que j'ai trouvé via Google pour la partie chaîne:

strcpy (new[0].name, old[0].name); 
new[0].data = old[0].data; 

, mais je ne sais pas comment gérer la struct. Il semble que je manque de connaissances de base sur la façon de gérer les tableaux, mais je ne veux pas apprendre C - J'ai juste besoin de terminer cette tâche.

+0

quelqu'un devoirs? –

+1

Pourquoi devrais-je prendre des classes C sans vouloir apprendre C? –

+1

'bar' et' name' ne sont pas (nécessairement) des chaînes terminées par zéro - ce sont des tableaux char à longueur fixe. Sans plus d'informations sur ce que ces tableaux contiennent réellement, vous ne devriez pas utiliser strcpy du tout. –

Répondre

4

Si vous ne voulez pas apprendre C, vous devriez être capable de lire l'ancien format de fichier dans n'importe quelle langue avec une bibliothèque d'E/S décent.

Pour compléter ce que vous essayez de faire en C, vous pouvez utiliser memcpy.

Ainsi, au lieu de:

new[0].data = old[0].data; 

Utilisez

memcpy(new[0].data, old[0].data, sizeof(foo) * 16); 
+0

Et je suppose que cela fonctionnerait indépendamment des types des membres de la structure (par exemple si j'ai uint32_t de stdint)? –

+0

En fait, il était memcpy (nouveau [0] .data, ancien [0] .data, sizeof (struct foo) * 16); mais ça a marché, merci beaucoup! –

+0

Vous pouvez supprimer la constante en utilisant sizeof (old [0] .data) au lieu du calcul explicite (sizeof (element) * number_of_elements). De cette façon, il ne se cassera pas silencieusement si le tableau est étendu en taille. –

2

Vous pouvez également envelopper les tableaux C dans un struct. Ensuite, la copie des éléments va copier le tableau automatiquement.

typedef struct { 
    char name[100]; 
} name_array_t; 

struct { 
    name_array_t name_struct; 
    ... 
} x; 

struct { 
    name_array_t name_struct; 
    ... other members ... 
} y; 

x.name_struct = y.name_struct; 
+0

Nice! Merci aussi! –

0

(solution trop évidente peut-être)

Comme nous traitons avec le tableau, nous ne pouvons pas faire ce genre d'opération

new.name = old.name;

donc je suppose que vous devez écrire une fonction

Fonction vide (char * nom, struct new_format * nouveau); où vous devez affecter le caractère un par un.

Il est évident que vous appellerez comme ceci: Fonction (old.name, & nouveau)

Questions connexes