0

C で動的データ構造を作成するタスクが与えられました。私はまだ C に非常に慣れていないので、誰かが私が間違っていること/私が何をしているのかについてのポインタ (笑) を教えていただければ、本当に感謝しています。についてもっと読むべきです。

これが私がこれまでに持っているものです:

flexarray.h

#ifndef FLEXARRAY_H
#define FLEXARRAY_H

typedef struct flexarrayrec flexarray;

flexarray *flexarray_new();
extern void flexarray_add(flexarray *a, char item);
extern void flexarray_set(flexarray *a, char item, int index);
extern char flexarray_get(flexarray *a, int index);
extern void flexarray_trim(flexarray *a);
extern void flexarray_print(flexarray *a);

#endif  /* FLEXARRAY_H */

flexarray.c

#include "flexarray.h"
#include "mylib.h"

#define DEFAULT_CAPACITY 10

typedef struct flexarray{
    int size;
    int capacity;
    char *array;
};

flexarray *flexarray_new(){
    flexarray a;
    a->capacity = DEFAULT_CAPACITY;
    a->size = 0;
    a->array = (char*) erealloc (a ,a->capacity * sizeof(char)); 
    return a;
}

void grow(flexarray a){
    a->capacity = a->capacity * 2;
    a->array = (int*) erealloc (a ,a->capacity * sizeof(int)); 
}

void flexarray_add(flexarray a, char item){
    if(a->size == a->capacity) grow(a);
    a->array[a->size - 1] = item;
    a->size++;    
}

void set(flexarray a, char c, int index){
    if(index < 0 || index  > a->size) return;
    a->array[index] = c;
}

char get(flexarray a, int index){
    if(index < 0 || index  > a->size) return;
    return a->array[index];
}


void flexarray_trim(flexarray a){
    if(a->size == a->capacity) return;
    a->capacity = a->size;
    a->array = (char*) erealloc (a, a->capacity * sizeof(char)); 
}

void flexarray_print(flexarray a){
    int i;
    printf("[");
    for(i = 0; i < a->size - 1; i++){
        printf("%c,", a->array[i]);
    }
    printf("%c]\n", a->array[i + 1]);
}

ありがとうございました

EDIT現在のコンパイル ログ:

flexarray.c:10:1: warning: useless storage class specifier in empty declaration [enabled by default]
flexarray.c: In function 'flexarray_new':
flexarray.c:13:15: error: storage size of 'a' isn't known
flexarray.c: At top level:
flexarray.c:20:21: error: parameter 1 ('a') has incomplete type
flexarray.c:25:30: error: parameter 1 ('a') has incomplete type
flexarray.c:31:20: error: parameter 1 ('a') has incomplete type
make[2]: *** [build/Debug/MinGW_Actual-Windows/flexarray.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2


BUILD FAILED (exit value 2, total time: 1s)
4

3 に答える 3

4
void flexarray_add(flexarray a, char item){
    if(a->size == a->capacity) grow(a);
    a->array[a->size - 1] = item;
    a->size++;    
}

次のようにする必要があります。

void flexarray_add(flexarray *a, char item){
    if(a->size == a->capacity) grow(a);
    a->array[a->size] = item;
    a->size++;    
}

と:

void flexarray_print(flexarray a){
    int i;
    printf("[");
    for(i = 0; i < a->size - 1; i++){
        printf("%c,", a->array[i]);
    }
    printf("%c]\n", a->array[i + 1]);
}

になり得る:

void flexarray_print(flexarray *a){
    int i;
    printf("[");
    for(i = 0; i < a->size; i++){
        printf("%c,", a->array[i]);
    }
    printf("]\n" );
}

文体に関する追加のヒント: サイズとインデックスには、できる限り符号なしの型を使用するようにしてください。

struct buff {
     size_t size;
     size_t used;
     char *data;
     };

これの利点は、負のインデックス ( b->data[b->used - 1] = item;) を使用しようとすると、(メモリがゆっくりと破損するのではなく) 悲惨なほど速く失敗することです。

また、 realloc() の成功/失敗をテストする必要があります

更新 2: また、いくつかのアスタリスクが欠落しているようです。

于 2012-05-03T15:58:21.983 に答える
1
flexarray *flexarray_new(){
    flexarray a;
    return a; // not a flexarray *
}

..と

a->array = (char*) erealloc (a ,a->capacity * sizeof(char)); 

「erealloc()」は何をしますか?

于 2012-05-03T16:11:01.743 に答える
0

あなたtypedefのは間違っています-あなたはどちらかを書きたいです

typedef struct flexarray { ... } flexarray;

typedefヘッダーからを削除する、または

 struct flexarrayrec { ... }; // no typedef

tyepdef struct flexarrayrec flexarray;ヘッダーに保持します。

于 2012-05-03T16:43:50.200 に答える