2010-01-02 7 views
0

Comment ajouter un enregistrement si vous envoyez un paramètre à une fonction?Comment ajouter des enregistrements (struct) dans une fonction dans le langage de programmation C?

struct record { 
char name[20]; 
int nr; 
}; 

void AddRecord(struct record **p_allRecs, int p_size); 

int main() { 

struct record *allRecs; 
/* putting in some records manually, size++... */ 
allRecs = (struct record *)malloc(size*sizeof(struct record)); 
} 

AddRecord(&allRecs, size);/* wan't to add a record like this */ 
}/* end main */ 

void AddRecord(struct myRecord **p_allRecs, int p_size){ 
int i; 
struct record *allRecsTemp; /* temporary */ 
allRecsTemp = (struct record *)malloc((p_size+1)*sizeof(struct record));/* oneup */ 
/* first copy existing recs */ 
for(i = 0; i < p_size; i++) { 
strcpy(allRecsTemp[i].name, p_allRecs[i]->name);/* this want't work */ 
allRecsTemp[i].nr = p_allRecs[i]->nr;/* this want't work */ 
} 
/* then ask for new record */ 
printf("Name?"); 
    scanf("%s", &allRecssTemp[p_size].name); 
    printf("Nr? "); 
    scanf("%d", &allRecsTemp[p_size].nr); 
    p_size++; 
    free(p_allRecs); 
    p_allRecs = allRecsTemp; 
+0

cela ressemble à une ré-écriture maladroite de realloc. –

+0

C'est maladroit, mais réécrire realloc n'est pas une mauvaise chose, à mon humble avis. –

Répondre

2

Dans C, les structures peuvent être affectées. Vous pouvez donc dire des choses comme:

allRecsTemp[i] = (*p_allRecs)[i]; 

Pas besoin pour les appels à strcpy(), etc. Faire cela devrait simplifier votre code. Oh, et:

free(p_allRecs); 
p_allRecs = allRecsTemp; 

devrait être:

free(* p_allRecs); 
* p_allRecs = allRecsTemp; 

Rappelez-vous - p_allRecs est pointeur s à un pointeur, alors que allRecsTemp est juste un pointeur.

+0

Ok, merci beaucoup! –

0

Rappelez-vous p_allRecs est un pointeur sur le pointeur au début du tableau des enregistrements:

void AddRecord(struct myRecord **p_allRecs, int p_size){ 
    int i; 
    struct record *allRecsTemp; 
    allRecsTemp = (struct record *)malloc((p_size+1)*sizeof(struct record)); 

    memcpy(allRecsTemp, *p_allRecs, p_size*sizeof(struct_record)); // only if records do not contain pointers to one another! 

    free(*p_allRecs); 
    *p_allRecs = allRecsTemp; 

    (*p_allRecs)[p_size].name = "new record name"; 
    (*p_allRecs)[p_size].nr = 3; // or whatever 

} 
Questions connexes