#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;
}
{
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;
}
/*若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();
}