///********数组顺序存储表示***********
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stdarg.h>
///标准头文件,提供va_start、va_arg和va_end
///用于存取变长参数表
using namespace std;
#define MAX_ARRAY_DTM 8 ///假设数组位数最大值为8
#define ERROR 0
#define OVERFLOW -2
#define UNDERFLOW -100
#define OK 1
typedef struct
{
int *base; ///数组元素基址,由 InitArray分配
int dim; ///数组维数
int *bounds; ///数组维界基址,由 InitArray分配
///暂时不太清楚这是干啥的
int *constants; ///数组映像函数常量基址,由 InitArray分配
///这个就是用来存放ci的。给出ci的递归定义:Cn = L, Ci-1=Bi*Ci,1<=i<=n
}Array;
bool InitArray(Array &A, int dim,...)
{
///若维数dim和各维长度合法,则构造相应数组A,并返回OK
if(dim < 1 || dim > MAX_ARRAY_DTM) return ERROR;
A.dim = dim;
A.bounds = (int *)malloc(dim * sizeof(int));
if(!A.bounds) exit(OVERFLOW);
///若各维度长度合法,则存入A.bounds,并求出A的元素总数elemtotal
int elemtotal = 1;
va_list ap;
va_start(ap, dim); ///ap为va_list类型,是存放变长参数表信息的数组
for(int i=0;i<dim;++i){
A.bounds[i] = va_arg(ap, int);
if(A.bounds[i] < 0) return UNDERFLOW;
elemtotal *= A.bounds[i];
}
va_end(ap);
A.base = (int *)malloc(elemtotal * sizeof(int));
if(!A.base) exit(OVERFLOW);
///求映像函数的常数c,并存入A.constants[i + 1],i=1,...,dim
A.constants = (int *)malloc(dim * sizeof(int));
if(!A.constants) exit(OVERFLOW);
A.constants[dim - 1] = 1;
///L=1,指针的增减以元素的大小为单位
///L的话不应该是1啊
for(int i=dim - 2; i >= 0; --i)
A.constants[i] = A.bounds[i+1]*A.constants[i+1];
return OK;
}
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 OK;
}
int Locate(Array A, va_list ap, int &off)
{
///若ap指示的各下标值合法,则求出该元素在A中相对地址off
off=0;
for(int i=0;i<A.dim;i++)
{
int ind = va_arg(ap, int);
if(ind < 0 || ind >= A.bounds[i]) return OVERFLOW;
off += A.constants[i] * ind;
}
return OK;
}
int Value(Array A, int &e,...)
{
///A是n维数组,e为元素变量,随后是n个下标值
///若各下标不超界,则e赋值为所指定的A的元素值,并返回OK
va_list ap;
va_start(ap,e);
int result,off;
if((result = Locate(A,ap,off))<=0) return result;
e = *(A.base + off);
return OK;
}
int Assign(Array &A, int e,...)
{
///A是n维数组,e为元素变量,随后是n个下标值
///若下标不超界,则将e的值赋值给所指定A的元素,并返回OK
va_list ap;
va_start(ap, e);
int result,off;
if((result = Locate(A,ap,off))<=0) return result;
*(A.base + off) = e;
return OK;
}
int main()
{
Array A;
InitArray(A,2,5,5);
///测试Assign
Assign(A,0,0,0);
///测试Value
int e=100;
Value(A,e,0,0);
printf("e=%d\n",e);
DestroyArray(A);
return 0;
}
中途竟然去找Locate函数传的参数怎么用,以为直接在main里用呢...sb了