#include "stdio.h"
#include "math.h"
#include "stdarg.h"               /*通过宏来实现可变参数的问题*/
#define OK 1                      /*宏定义结果状态代码*/
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAX_ARRAY_DIM 8
typedef int ElemType;
typedef int Status;               /*Status是函数的类型,其值是结果状态代码*/
typedef struct{
 ElemType *base;                /*数组元素基址,用于将多维数组的值以一维方式输出*/
 int dim;                       /*多维数组的维数*/
 int *bounds;                   /*数组维界基址,用于输出各维下标值*/
 int *constants;                /*数组映像函数常量基址*/
 }Array;
 /*顺序存储数组的基本操作*/
Status InitArray(Array *A,int dim,...) /*构造数组A,...代表各维下标值,是不确定的*/
{
  int elemtotal=1,i;   /*elemtotal是元素个数的总值*/
  va_list ap;          /*ap是定义的宏类型的变量,它是一个指向第一个参数地址的指针*/
  if(dim<1||dim>MAX_ARRAY_DIM)     /*判断维界是否合法*/
    return ERROR;
  (*A).dim=dim;
  (*A).bounds=(int *)malloc(dim*sizeof(int));
  if(!(*A).bounds)             /*分配存储失败*/
    exit(OVERFLOW);
  va_start(ap,dim);             /*初始化宏*/
  for(i=0;i<dim;i++)
  {
   (*A).bounds[i]=va_arg(ap,int);     /*取出其值*/
   if((*A).bounds[i]<0)               /*如果维界不合法,则退出*/
     return UNDERFLOW;   /*在math.h中定义为4*/
   elemtotal*=(*A).bounds[i];     /*元素总数等于各维界的乘积*/
  }
  va_end(ap);
  (*A).base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
  if(!(*A).base)                /*分配存储失败*/
   exit(OVERFLOW);
   (*A).constants=(int *)malloc(dim*sizeof(int));
  if(!(*A).constants)           /*分配存储失败*/
   exit(OVERFLOW);
  (*A).constants[dim-1]=1;
  for(i=dim-2;i>=0;i--)
   (*A).constants[i]=(*A).bounds[i+1]*(*A).constants[i+1];
   return OK;
}
Status DestroyArray(Array *A)      /*销毁数组*/
{
 if((*A).base)
 {
   free((*A).base);
   (*A).base=NULL;
 }
 else
   return ERROR;
 if((*A).bounds)
 {
  free((*A).bounds);
  (*A).bounds=NULL;
  }
  else
    return ERROR;
  if((*A).constants)
  {
    free((*A).constants);
    (*A).constants=NULL;
  }
   else
     return ERROR;
  return OK;
}
Status Locate(Array A,va_list ap,int *off)
/*若ap指示的各下标值合法,则求出该元素在A中的相对地址off*/
{
 int i,ind;
 *off=0;
 for(i=0;i<A.dim;i++)
 {
  ind=va_arg(ap,int);
  if(ind<0||ind>=A.bounds[i])
   return OVERFLOW;
  *off+=A.constants[i]*ind;    /*当你编译执行后看到结果就好理解了*/
  }
  return OK;
}
Status Value(ElemType *e,Array A,...)
/*...表示数组各维的下标值,如果合法,则将每个值相应赋值给e*/
{
 va_list ap;
 Status result;
 int off;
 va_start(ap,A);
 if((result=Locate(A,ap,&off)==OVERFLOW))
   return result;
 *e=*(A.base+off);
 return OK;
}
Status Assign(Array *A,ElemType e,...) /*将e的值赋值给数组相应的元素*/
{
 va_list ap;
 Status result;
 int off;
 va_start(ap,e);
 if((result=Locate(*A,ap,&off)==OVERFLOW))
  return result;
 *((*A).base+off)=e;
 return OK;
}
void main()
{
 Array A;
 int i,j,k,*p,dim=3,bound1=3,bound2=4,bound3=2;
 ElemType e,*p1;
 InitArray(&A,dim,bound1,bound2,bound3);
 p=A.bounds;
 printf("A.bounds=");
 for(i=0;i<dim;i++)
  printf("%d",*(p+i));
 p=A.constants;
 printf("\nA.constants=");
 for(i=0;i<dim;i++)
  printf("%d ",*(p+i));
 printf("\n%d页%d行%d列矩阵元素如下:\n",bound1,bound2,bound3);
 for(i=0;i<bound1;i++)
  {
   for(j=0;j<bound2;j++)
    {
     for(k=0;k<bound3;k++)
      {
       Assign(&A,i*100+j*10+k,i,j,k);
       Value(&e,A,i,j,k);
       printf("A[%d][%d][%d]=%2d ",i,j,k,e);
      }
      printf("\n");
     }
     printf("\n");
   }
 p1=A.base;
 printf("A.base=\n");
 for(i=0;i<bound1*bound2*bound3;i++)
 {
   printf("%4d",*(p1+i));
   if(i%(bound2*bound3)==bound2*bound3-1)
     printf("\n");
  }
 DestroyArray(&A);
 getch();
}