#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#define MAX_ARRAY_DIM 8
#define OK 1
#define ERROR 0
typedef int ElemType ;
typedef struct
{
ElemType * base;
int dim;
int *bounds;
int *constants;/*数组映像函数常数基址*/
}Array;
int initArray(Array *A,int dim,...);
int DestroyArray(Array *A);
int Value(Array A,ElemType *e,...);
int Assign(Array *A,ElemType e,...);
int initArray(Array *A,int dim,...)
{
va_list ap;
int i,l;
if(dim<1 || dim >MAX_ARRAY_DIM) return ERROR; //维数超出范围
A->dim=dim;
A->bounds=(int *)malloc(sizeof(int)*dim);
if(!A->bounds) exit(0);
va_start(ap,dim);
for(l=1,i=0;i<dim;i++) //记录每一个维度的大小
{
A->bounds=va_arg(ap,int);
l*=A->bounds;
}
va_end(ap);
A->base=(ElemType *)malloc(sizeof(ElemType)*l);
if(!A->base) exit(0);
A->constants=(int *)malloc(sizeof(int)*dim);
A->constants[dim-1]=1;
if(!A->constants) exit(0);
for(i=dim-2;i>=0;i--)
{
A->constants=A->bounds*A->constants;
}
return OK;
}
int DestroyArray(Array *A)
{
if(A->base) free(A->base);
if(A->bounds) free(A->bounds);
if(A->constants) free(A->constants);
return OK;
}
int Value(Array A,ElemType *e,...)
{
int i,l,j;
va_list ap;
va_start(ap,e);
for(l=i=0;i<A.dim;i++)
{
j=va_arg(ap,int);
if(j<0 || j>=A.bounds) return ERROR;
l+=A.constants*j;
}
va_end(ap);
*e=A.base[l];
return OK;
}
int Assign(Array *A,ElemType e,...)
{
int i,l,j;
va_list ap;
va_start(ap,e);
for(l=i=0;i<A->dim;i++)
{
j=va_arg(ap,int);
//printf("%d %d/n",j,A->bounds);
if(j<0 || j>=A->bounds) return ERROR;
l+=A->constants*j;
}
va_end(ap);
A->base[l]=e;
return OK;
}
int main(int argc, char *argv[])
{
int i,j,k,v;
Array A;
initArray(&A,3,2,3,4);
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
for(k=0;k<4;k++)
if(Assign(&A,i*3*4+j*4+k,i,j,k)<=0)
printf("Error/n");
}
}
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
for(k=0;k<4;k++)
{
Value(A,&v,i,j,k);
printf("%d ",v);
}
printf("/n");
}
printf("/n");
}
DestroyArray(&A);
return 0;
}