C语言接口与实现-创建可重用软件的技术 (笔记10)

   

<<C语言接口与实现-创建可重用软件的技术>>(笔记10)


Array_T 动态数组

 

接口:
T Array_new (int length, int size); 创建一个动态数组
void Array_free(T *array); 释放一个动态数组
int Array_length(T array); 取得数组大小
int Array_size  (T array); 取得数组元素大小
void *Array_get(T array, int i); 取得第i个元素, 即通常的array[i]
void *Array_put(T array, int i, void *elem); 把元素elem存入数组第i个位置
void Array_resize(T array, int length); 重新设置数组的大小
T Array_copy  (T array, int length); 复制数组

 

实现文件:
include/array.h
include/arrayrep.h
src/array.c

 

 

arrayrep.h

/* $Id: arrayrep.h 6 2007-01-22 00:45:22Z drhanson $ */ #ifndef ARRAYREP_INCLUDED #define ARRAYREP_INCLUDED #define T Array_T struct T { int length; int size; char *array; }; /* 设计此接口来初始化一个结构T有助于减少耦合. */ extern void ArrayRep_init(T array, int length, int size, void *ary); #undef T #endif

 

array.h

/* $Id: array.h 6 2007-01-22 00:45:22Z drhanson $ */ #ifndef ARRAY_INCLUDED #define ARRAY_INCLUDED #define T Array_T typedef struct T *T; extern T Array_new (int length, int size); extern void Array_free(T *array); extern int Array_length(T array); extern int Array_size (T array); extern void *Array_get(T array, int i); extern void *Array_put(T array, int i, void *elem); extern void Array_resize(T array, int length); extern T Array_copy (T array, int length); #undef T #endif

   

 

array.c

 /* 该文件定义了一个数组ADT的高层视图 */ static const char *rcsid = "$Id: array.c 6 2007-01-22 00:45:22Z drhanson $"; #include <stdlib.h> #include <string.h> #include "assert.h" #include "array.h" #include "arrayrep.h" #include "mem.h" #define T Array_T /* @length: 数组长度(数组元素个数) * @size: 元素大小 * */ T Array_new(int length, int size) { T array; NEW(array); if (length > 0) ArrayRep_init(array, length, size, CALLOC(length, size)); else ArrayRep_init(array, length, size, NULL); return array; } /* 初始化结构Array_T * * @array: 结构Array_T地址 * @length: 数组长度 * @size: 元素大小 * @ary: 实际存储数组的首地址 * */ void ArrayRep_init(T array, int length, int size, void *ary) { assert(array); assert(ary && length>0 || length==0 && ary==NULL); assert(size > 0); array->length = length; array->size = size; if (length > 0) array->array = ary; else array->array = NULL; } /* 释放数组元素及结构Array_T * * @array: 结构Array_T的地址的地址 * */ void Array_free(T *array) { assert(array && *array); FREE((*array)->array); FREE(*array); } /* 取得第 i+1 个元素; 返回该元素的地址 * * @array: * @i: * */ void *Array_get(T array, int i) { assert(array); assert(i >= 0 && i < array->length); return array->array + i*array->size; } /* 把元素elem存入数组第i个位置; 返回存入的元素 * * @array: * @i: 之前数组已有元素的个数 * @elem: 要存入的元素 * */ void *Array_put(T array, int i, void *elem) { assert(array); assert(i >= 0 && i < array->length); assert(elem); memcpy(array->array + i*array->size, elem, array->size); return elem; } /* 返回数组的大小 * */ int Array_length(T array) { assert(array); return array->length; } /* 返回数组元素的大小 * */ int Array_size(T array) { assert(array); return array->size; } /* 重新设置数组的大小 * * @array: * @length: 新的大小 * */ void Array_resize(T array, int length) { assert(array); assert(length >= 0); if (length == 0) FREE(array->array); else if (array->length == 0) array->array = ALLOC(length*array->size); else /* 如果是扩大, 则不改变原有的内容; 缩小, 则不改变剩下的 */ RESIZE(array->array, length*array->size); array->length = length; } /* 复制数组: 返回复制后得到的数组(复制后的数组大小=min{length, array->length} * * @array: * @length: 复制后的数组大小 * */ T Array_copy(T array, int length) { T copy; assert(array); assert(length >= 0); copy = Array_new(length, array->size); if (copy->length >= array->length && array->length > 0) memcpy(copy->array, array->array, array->length*array->size); else if (array->length > copy->length && copy->length > 0) memcpy(copy->array, array->array, copy->length*array->size); return copy; }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C语言接口与实现-创建可重用软件的技术 (笔记10))