Cで単純な動的配列を作成しました。
typedef struct varray_t
{
void **memory;
size_t allocated;
size_t used;
int index;
} varray;
void
varray_init(varray **array)
{
*array = (varray*) malloc (sizeof(varray));
(*array)->memory = NULL;
(*array)->allocated = 0;
(*array)->used = 0;
(*array)->index = -1;
}
void
varray_push(varray *array, void *data, size_t size)
{
if ((array->allocated - array->used) < size) {
array->memory = realloc(array->memory, array->allocated + size);
array->allocated = array->allocated + size;
}
array->used = array->used + size;
array->memory[++array->index] = data;
}
int
varray_length(varray *array)
{
return array->index + 1;
}
void
varray_clear(varray *array)
{
int i;
for(i = 0; i < varray_length(array); i++)
{
array->memory[i] = NULL;
}
array->used = 0;
array->index = -1;
}
void
varray_free(varray *array)
{
free(array->memory);
free(array);
}
void*
varray_get(varray *array, int index)
{
if (index < 0 || index > array->index)
return NULL;
return array->memory[index];
}
これはうまくいっています。ただし、配列にアイテムを追加するには、呼び出し元は追加される要素のサイズを渡す必要があります。渡された からサイズを取得する別の方法がわかりませんvoid*
。推測できるように設計varray_push(varray *array, void *data, size_t size)
するためのより良い方法があるのではないかと思っていますか?size
どんな助けでも素晴らしいでしょう
提案後に編集されたコード
私の配列にはポインター要素のみが含まれます。Blastfurnace の提案に従ってコードを修正しました。新しいコードはsizeof(void*)
、一定の割合でメモリを使用およびサイズ変更して、挿入時に償却された一定の時間を取得します。
void
varray_push(varray *array, void *data)
{
size_t toallocate;
size_t size = sizeof(void*);
if ((array->allocated - array->used) < size) {
toallocate = array->allocated == 0 ? size : (array->allocated * 2);
array->memory = realloc(array->memory, toallocate);
array->allocated = array->allocated + toallocate;
}
array->memory[++array->index] = data;
array->used = array->used + size;
}