2010-02-24 2 views
2

Я пытаюсь создать структуру, хранящую строки, и я получаю ошибку несовместимых типов, когда я пытаюсь вставить как строку в массив. Это мой первый раз, когда я работал с программой на C. Может ли кто-нибудь помочь определить мою проблему.Массив строк в C

Это моя реализация 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); 
} 

Это моя реализация 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

Это код; можете ли вы сузить его до проблемного места и показать нам ошибки, которые вы получаете? –

+0

Я добавил комментарий, где я получаю ошибку и другие места, которые могут вызвать проблемы. Извините. –

ответ

0

На этой линии:

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

(*p)->item[(*p)->sz] представляет собой массив из 1024 символов - вы не можете назначить массивы с = (массивами являются "неизменяемой lvalues") ,

Вам просто нужно сделать копию. Для надежной строковой копии я предпочитаю использовать 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

Спасибо. Я думаю, что это проблема, которую мне нужно было решить для моего кода. –

4

У вас есть массив char, но вы пытаетесь поставить char * внутрь.

Я бы предположил, что strncpy будет делать то, что вы хотите. В качестве альтернативы объявите item как массив из char *.

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

Нет - код OP был прав - 'item' является членом гибкого массива C99. – caf

+0

Использование strncpy - это один из способов фиксации кода OP, но это также устранит его. Я никогда не говорил, что объявление было неправильным или что-то еще, я просто разместил что-то, что фиксирует его ошибку. На мой взгляд, это предпочтительнее, потому что это позволяет избежать уродливого вызова strncpy. – IVlad

+0

Проблема в том, что это изменяет семантику кода - код OP явно предназначен для того, чтобы список сохранял независимую копию данных, а не указатель на нее. Кроме того, 'strncpy' почти наверняка * не * правильная функция для использования здесь. – caf

2

Есть больше различий между C и C++, чем обычно принято.

Для вашей ошибки причина проста: вы пытаетесь назначить указатель (char *) в sz, который является int. Этот тип присвоения генерирует предупреждение о несовместимом типе.

Второе, что вы не можете сделать (по крайней мере, насколько я знаю) частично динамический массив, как вы это делаете. В вашем случае вы должны использовать по крайней мере malloc, и тип элемента должен быть char **. Однако есть трюк, чтобы использовать только один malloc для создания 2D-массива.

Для realloc ничего не ударил меня ... Какая ошибка компиляции?

Однако ваш код не выглядит как код C:/

Вы, возможно, потребуется восстановить его формы царапины, потому что вы здесь делать путаницы между списками и 2D массивов ...

я могу написать некоторые примеры кодов, если вы хотите, но вы, вероятно, должны найти учебник по основам C в google.

Хорошо :) Люк

+0

Где он пытается присвоить char * полю sz? Я думаю, что вы имели в виду элемент, который не является массивом char *. – IVlad

Смежные вопросы