下面给出了多维数组的完整程序。该程序在VC++ 6.0和Dev-C++下编译通过。代码主要参考了严蔚敏老师的教材,本人完成了main函数的编写。注意在Assign和Value两个函数中多定义了一个参数temp用于占位,没有实际用途。如果没有temp这个参数,在VC++6.0下结果不正确。
#include "stdio.h"
#include "stdlib.h"
#include"stdarg.h "
#define ERROR 0
#define MAX_ARRAY_DIM 8 //假设数组的最大维数为8
typedef struct
{
int *base;//存储数组元素的首地址(基址),由InitArray分配
int dim; //数组的维数
int *bounds; //存放数组维界的基地址,由InitArray分配
int *constants; //存放映象函数常量基址,由InitArray分配
}Array;
int InitArray(Array &A, int dim,...)
{ //若维数 dim 和各维长度合法,构造数组A,并返回1
if(dim<1||dim> MAX_ARRAY_DIM )
return ERROR;
A.dim=dim;
A.bounds=(int*)malloc(dim*sizeof(int));
if(! A.bounds)
exit(-2);
//若各维长度合法,则存入A.bounds
int i,elemtotal=1;
va_list ap;
va_start(ap,dim);
for(i=0;i<dim;i++)
{
A.bounds[i]=va_arg(ap,int);
if(A.bounds[i]<0) return -2;
elemtotal*= A.bounds[i];
}
va_end(ap);
A.base= (int *)malloc(elemtotal*sizeof(int));
if(!A.base)
exit(-2);
A.constants=(int*)malloc(dim*sizeof(int));
if(!A.constants)
exit(-2);
//求映象函数的值
A.constants[dim-1]=1; //L=1,指针的增减以元素大小为单位
for(i=dim-2;i>=0;i--)
A.constants[i]= A.bounds[i+1] *A.constants[i+1];
return 1;
}// InitArray
int DestroyArray(Array &A)
{ //销毁数组A
if(!A.base)
return ERROR;
free(A.base);
A.base=NULL;
if(!A.bounds)
return ERROR;
free(A.bounds);
A.bounds=NULL;
if(!A.constants)
return ERROR;
free(A.constants);
A.constants=NULL;
return 1;
}// DestroyArray
int Locate(Array A, va_list ap, int &off)
{
//若ap所指下标合法,则求出元素在数组中的相对位置off
// 最终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(-2);
off+=A.constants[i]*ind;
}
return 1;
}// Locate
int Assign(Array &A, int e, int temp, ...) //temp为占位用的,没有实际用途
{
int off,result;
va_list ap;
va_start(ap,temp);
if((result=Locate(A,ap,off))<=0)
return result;
va_end(ap);
*(A.base+off)=e;
return 1;
}//Assign
int Value(Array A, int &e, int temp, ...) //temp为占位用的,没有实际用途,如果去掉,在vc++ 6.0下运行结果不正确
{
//若各下标不超界,则e赋值为所指定的A 的元素值
va_list ap;
int off,result;
va_start(ap,temp);
if((result=Locate(A,ap,off))<=0)
return result;
va_end(ap);
e=*(A.base+off);
return 1;
}// Value
int main()
{
Array A; //定义数组A
int e1,e2;
InitArray(A,4,5,10,7,3);//创建数组A,维数为4维,每一维的大小分别为5,10,7,3
e1=18;
Assign(A,e1,0,4,7,3,1); //将下标为4,7,3,1的数组元素赋值为18
Value(A,e2,0,4,7,3,1); //读取下标为4,7,3,1的数组元素的值到e2
printf("下标为4,7,3,1的数组元素的值为%d\n",e2);
DestroyArray(A);
return 0;
}