2010-02-24 6 views
2

J'essaie de créer une structure de stockage de chaînes et j'obtiens une erreur de types incompatibles lorsque j'essaie d'insérer une chaîne dans le tableau. C'est la première fois que je travaille avec un programme en C. Quelqu'un pourrait-il aider à identifier mon problème?Tableau de chaînes en C

C'est ma mise en œuvre de list.c

struct list *init_list(int num) { 
    struct list *p; 
    p = malloc(LISTSZ(num)); 
    if(p == NULL) 
     return(NULL); 
    p->maxsz = num; 
    p->sz = 0; 
    return(p); 
} 

void debug_list(struct list *p) { 
    int i; 
    fprintf(stderr, "\nDynamic List\n\n"); 
    fprintf(stderr, " sz = %d\n", p->sz); 
    fprintf(stderr, " maxsz = %d\n", p->maxsz); 
    for(i = 0; i < p->maxsz; i++) 
     fprintf(stderr," %s\n", (p->item[i])); 
} 

void prt_list(struct list *p) { 
    int i; 
    for(i = 0; i < p->sz; i++) 
     printf("%s\n", (p->item[i])); 
} 

int ins_list(char *data, struct list **p) { 
    struct list *q; 
    if((*p)->sz == (*p)->maxsz) { 
     q = realloc(*p, LISTSZ((*p)->maxsz + INCRSZ)); // Problem? 
     if(q == NULL) 
      return(-1); 
     q->maxsz += INCRSZ; 
     *p = q; 
    } 
    (*p)->item[(*p)->sz] = data; // incompatible types in assignment 
    (*p)->sz ++; 
    return(0); 
} 

Ceci est ma mise en œuvre de list.h

struct list { 
    int sz; 
    int maxsz; 
    char item[][1024]; // Problem? 
}; 

#define INITSZ 5 
#define INCRSZ 5 
#define LISTSZ(n) ((size_t)(sizeof(struct list) + ((n)-1)*sizeof(char[1024]))) // Problem? 

struct list *init_list(int num); 
int ins_list(char *data, struct list **p); 
void prt_list(struct list *p); 
void debug_list(struct list *p); 
+1

C'est beaucoup de code; pouvez-vous le réduire à l'endroit du problème et nous montrer les erreurs que vous obtenez? –

+0

J'ai ajouté un commentaire où je reçois l'erreur et d'autres endroits qui pourraient causer des problèmes. Désolé. –

Répondre

0

A cette ligne:

(*p)->item[(*p)->sz] = data; // incompatible types in assignment 

(*p)->item[(*p)->sz] est un tableau de 1024 ombles - vous ne pouvez pas attribuer aux tableaux avec = (tableaux sont "lvalues ​​non modifiables") .

Vous avez juste besoin de faire une copie. Pour une copie de chaîne de longueur sûre, je préfère utiliser strncat():

(*p)->item[(*p)->sz][0] = '\0'; /* Truncate existing string to empty */ 
strncat((*p)->item[(*p)->sz], data, (sizeof (*p)->item[(*p)->sz]) - 1); 
+0

Merci. Je pense que c'est le problème que je devais résoudre pour mon code. –

4

Vous avez un tableau de char, mais vous essayez de mettre un char * dans ça. Je pense que strncpy fera ce que vous voulez. Vous pouvez également déclarer item sous la forme d'un tableau de char *.

3
struct list { 
    int sz; 
    int maxsz; 
    char *item[1024]; 
}; 
+0

Non - le code de l'OP était correct - 'item' est un membre flexible du groupe C99. – caf

+0

L'utilisation de strncpy est un moyen de corriger le code de l'OP, mais cela le résoudra également. Je n'ai jamais dit que la déclaration était fausse ou quoi que ce soit, je viens de poster quelque chose qui corrige son erreur. À mon avis, c'est préférable parce que cela évite un appel à la mine désagréable. – IVlad

+0

Le problème est que cela change la sémantique du code - le code OP est clairement destiné à avoir la liste pour stocker une copie indépendante des données, pas un pointeur vers lui. En outre, 'strncpy' est presque certainement * pas * la bonne fonction à utiliser ici. – caf

2

Il y a plus de différences entre C et C++ que ce qui est généralement admis.

Pour votre erreur, la raison est simple: vous essayez d'assigner un pointeur (char *) à sz qui est un int. Ce type d'affectation génère l'avertissement de type incompatible.

Deuxième chose que vous ne pouvez pas faire (au moins pour autant que je sache) un tableau partiellement dynamique que vous le faites. Dans votre cas, vous devriez utiliser au moins un malloc et le type d'objet devrait être char **. Cependant, il y a une astuce pour utiliser un seul malloc pour créer un tableau 2D.

Pour le realloc rien ne m'a frappé ... Quelle est l'erreur de compilation?

Toutefois, votre code ne semble pas comme code C:/

Vous pourriez avoir besoin de reconstruire forme de zéro, parce que vous êtes ici faites une confusion entre des listes et des tableaux 2D ...

Je peux écrire quelques exemples de codes si vous voulez, mais vous devriez probablement trouver un tutoriel de base C sur google.

Bonne luke :)

+0

Où essaye-t-il d'assigner un char * au champ sz? Je pense que vous vouliez dire item, ce qui n'est pas un tableau char *. – IVlad

Questions connexes