#include <stdio.h>
#include <stdarg.h>
static const int MAX_DIM = 100;
typedef int element;
typedef struct {element *base; int dim; int *bounds;int *constants;} array;
void init(array * , int , ...);
void destory(array *);
int locate(array * , va_list );
element value(array * , ... );
void assign(array * , element , ...);
int main()
{
array arr;
init(&arr , 2 , 3 , 4 );
assign(&arr , 3 , 1 , 1);
assign(&arr , 4 , 2 , 2);
printf("%d\n" , value(&arr , 1 , 1) );
printf("%d\n" , value(&arr , 2 , 2) );
getchar();
return 0;
}
void init(array *arr ,int dim , ...)
{
va_list ap;
if(dim < 1 || dim > MAX_DIM) { printf("error dim");getchar();}
arr->dim = dim;
arr->bounds = (int *)malloc(dim * sizeof(int));
//
int ele_total = 1;
va_start(ap,dim);
int i;
for(i=0 ; i<dim ; i++ )
{
*(arr->bounds+i) = va_arg(ap , int);
if( *(arr->bounds+i) < 0 )
{
printf("error bounds");
getchar();
}
ele_total *= *(arr->bounds+i);
}
arr->base = (element *)malloc(ele_total * sizeof(element));
arr->constants = (int *)malloc(dim * sizeof(int));
*( arr->constants+(dim-1) ) = 1;
for (i = dim -2 ; i >= 0 ; --i)
{
*( arr->constants+i ) = (*( arr->bounds+i+1 )) * (*( arr->constants+i+1 ));
}
}
void destory(array *arr)
{
free(arr->base);
free(arr->bounds);
free(arr->constants);
}
int locate(array *arr , va_list ap )
{
int off =0;
int i;
int ind;
for(i = 0 ; i < arr->dim ; ++i)
{
ind = va_arg(ap , int );
if(ind < 0 || ind >= *(arr->bounds+i) )
return -1;
off += (*(arr->constants+i)) * ind;
}
return off;
}
element value(array *arr , ... )
{
va_list ap;
va_start(ap,arr);
return *(arr->base + locate(arr , ap));
}
void assign(array *arr , element e , ...)
{
va_list ap;
va_start(ap,e);
*(arr->base + locate(arr , ap)) = e ;
数组的维度全是顺序线性表模拟出来的,分成很多小段,维度增加,继续分成更小的段
所以数组的存取就是对这些段的管理。
void init(array *arr ,int dim , ...)里:
arr->bounds 表示每个维度含有多少它下一级的维度元素
arr->base 表示该线性表的起始地址
ele_total 表示一共有多少基本元素,即element ,所以就拿arr->bounds一直乘
arr->constants 表示纬度单位含有基本元素的个数,主要是方便寻址,因为最大的纬度就是基本元素,所以是倒着计算。
int locate(array *arr , va_list ap )函数:
就是把你输入的 1,2,3的寻址方式转换为线性表的寻址方式,在下面assign 和 value 中都要到了。
上面的示例为2维,如果你喜欢,可以最多定义100维,