#include<iostream>
#include<stdarg.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_ARRAY_DIM 8
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *base;
int dim;
int *bounds;
int *constants;
} Array;
//构建多维数组
Status InitArray(Array &A,int dim,...)
{
if(dim<1||dim>MAX_ARRAY_DIM) return -1;
A.dim=dim;
A.bounds=(int *)malloc(dim *sizeof(int));
if(!A.bounds) exit(-1);
int elemtotal=1;
va_list ap;
va_start(ap,dim);
for(int i=0; i<dim; ++i)
{
A.bounds[i]=va_arg(ap,int);
if(A.bounds[i]<0) return -3;
elemtotal*=A.bounds[i];
}
va_end(ap);
A.base=(ElemType *)malloc(elemtotal *sizeof(ElemType));
if(!A.base) exit(-2);
A.constants=(int *)malloc(dim *sizeof(int));
if(!A.constants) exit(-2);
A.constants[dim-1]=1;
for(int i=dim-2; i>=0; --i)
A.constants[i]=A.bounds[i+1]*A.constants[i+1];
return 1;
}
//销毁数组
Status DestoryArray(Array &A)
{
if(!A.base) return 0;
free(A.base);
A.base=NULL;
if(!A.bounds) return 0;
free(A.bounds);
A.bounds=NULL;
if(!A.constants) return 0;
free(A.constants);
A.constants=NULL;
return 1;
}
//求出该元素在A中相对地址off
Status Locate(Array A,va_list ap,int &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 -2;
off+=A.constants[i]*ind;
}
return 1;
}
//对数组进行赋值
Status Assign(Array &A,ElemType e,...)
{
va_list ap;
va_start(ap,e);
int result,off;
if(result=Locate(A,ap,off)<=0) return result;
*(A.base+off)=e;
}
//获取数组指定位置的元素值。
Status Value(Array &A,ElemType &e,...)
{
va_list ap;
int off,result;
va_start(ap,e);
if(result=Locate(A,ap,off)<=0) return result;
e=*(A.base+off);
return 1;
}
int main()
{
Array A;
int i,j,k,*p,dim=3,bounds1=3,bounds2=4,bounds3=2;
ElemType e,*q;
printf("A.bounds=");
InitArray(A,dim,bounds1,bounds2,bounds3);
p=A.bounds;
for(i=0; i<dim; i++)
printf("%d",*(p+i));
printf("\nA.dim=%d",A.dim);
p=A.constants;
printf("\nA.constants=");
for(i=0; i<dim; i++)
printf("%d",*(p+i));
printf("\n%d页%d行%d列矩阵元素如下:\n",bounds1,bounds2,bounds3);
for(i=0; i<bounds1; i++)
{
for(j=0; j<bounds2; j++)
{
for(k=0; k<bounds3; k++)
{
Assign(A,100*i+j*10+k,i,j,k);
Value(A,e,i,j,k);
printf("A[%d][%d][%d]=%3d",i,j,k,e);
}
printf("\n");
}
printf("\n");
}
q=A.base;
printf("A.base=");
for(i=0; i<bounds3*bounds2*bounds1; i++)
{
printf("%d",*(q+i));
}
printf("\nA.dim=%d",A.dim);
DestoryArray(A);
return 0;
}
#include<stdarg.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_ARRAY_DIM 8
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *base;
int dim;
int *bounds;
int *constants;
} Array;
//构建多维数组
Status InitArray(Array &A,int dim,...)
{
if(dim<1||dim>MAX_ARRAY_DIM) return -1;
A.dim=dim;
A.bounds=(int *)malloc(dim *sizeof(int));
if(!A.bounds) exit(-1);
int elemtotal=1;
va_list ap;
va_start(ap,dim);
for(int i=0; i<dim; ++i)
{
A.bounds[i]=va_arg(ap,int);
if(A.bounds[i]<0) return -3;
elemtotal*=A.bounds[i];
}
va_end(ap);
A.base=(ElemType *)malloc(elemtotal *sizeof(ElemType));
if(!A.base) exit(-2);
A.constants=(int *)malloc(dim *sizeof(int));
if(!A.constants) exit(-2);
A.constants[dim-1]=1;
for(int i=dim-2; i>=0; --i)
A.constants[i]=A.bounds[i+1]*A.constants[i+1];
return 1;
}
//销毁数组
Status DestoryArray(Array &A)
{
if(!A.base) return 0;
free(A.base);
A.base=NULL;
if(!A.bounds) return 0;
free(A.bounds);
A.bounds=NULL;
if(!A.constants) return 0;
free(A.constants);
A.constants=NULL;
return 1;
}
//求出该元素在A中相对地址off
Status Locate(Array A,va_list ap,int &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 -2;
off+=A.constants[i]*ind;
}
return 1;
}
//对数组进行赋值
Status Assign(Array &A,ElemType e,...)
{
va_list ap;
va_start(ap,e);
int result,off;
if(result=Locate(A,ap,off)<=0) return result;
*(A.base+off)=e;
}
//获取数组指定位置的元素值。
Status Value(Array &A,ElemType &e,...)
{
va_list ap;
int off,result;
va_start(ap,e);
if(result=Locate(A,ap,off)<=0) return result;
e=*(A.base+off);
return 1;
}
int main()
{
Array A;
int i,j,k,*p,dim=3,bounds1=3,bounds2=4,bounds3=2;
ElemType e,*q;
printf("A.bounds=");
InitArray(A,dim,bounds1,bounds2,bounds3);
p=A.bounds;
for(i=0; i<dim; i++)
printf("%d",*(p+i));
printf("\nA.dim=%d",A.dim);
p=A.constants;
printf("\nA.constants=");
for(i=0; i<dim; i++)
printf("%d",*(p+i));
printf("\n%d页%d行%d列矩阵元素如下:\n",bounds1,bounds2,bounds3);
for(i=0; i<bounds1; i++)
{
for(j=0; j<bounds2; j++)
{
for(k=0; k<bounds3; k++)
{
Assign(A,100*i+j*10+k,i,j,k);
Value(A,e,i,j,k);
printf("A[%d][%d][%d]=%3d",i,j,k,e);
}
printf("\n");
}
printf("\n");
}
q=A.base;
printf("A.base=");
for(i=0; i<bounds3*bounds2*bounds1; i++)
{
printf("%d",*(q+i));
}
printf("\nA.dim=%d",A.dim);
DestoryArray(A);
return 0;
}