#include "stdio.h"
#include "stdarg.h"//标准的都文件,提供va_start,va_arg,va_end,用于存储变长的参数
#define MAX_LENGH 8//规定数组的最大的维数
#include "stdlib.h"
typedef int Status;
typedef int ElemType;
#define OK 1
#define ERROR -1
typedef struct {
ElemType * base;//数组的首地址,用一组连续的地址表示
int dim;//存发的是数组的维数
int *bounds;//数组的维数的基地址
int *constants;//数组映像函数常量基地址
}Array;
Status InitArray (Array *arr,int dim,...) {
int i;
va_list list;
int total = 1;//表示的是数组中元素的个数
arr->dim = dim;
va_start(list,dim);
arr->bounds = (int*)malloc( dim * sizeof(int));
for (i = 0;i < dim;i++) {
arr->bounds[i] = va_arg (list,int);
total = total * arr->bounds[i];
}
arr->base = (ElemType *)malloc(total * sizeof (ElemType));
va_end (list);
arr->constants = (int *)malloc((dim - 1) * sizeof(int));//实际上保存的是每一位的步进的长度,就是指针加上1时,指针应该指示的地址。
arr->constants[dim - 1] = 1;
for (i = dim - 2;i >=0;--i) {
arr->constants[i] = arr->bounds[i + 1] * arr->constants[i + 1];//
}
return OK;
}
Status destroyArray (Array *arr) {
if (arr->base) {
free(arr->base);
arr->base = NULL;
}
if (arr->bounds) {
free(arr->bounds);
arr->bounds = NULL;
}
if (arr->constants) {
free (arr->constants);
arr->constants = NULL;
}
arr->dim = 0;
return OK;
}
//不知在主函数中调用的,但是因为下面的value和Assign都要用到类似的定位,所以提取出来
Status Locate (Array *arr,va_list list,int *off) {//根据相应的哦list指向的值得出在arr->base指向的相对的位置
int i;
int temp;
*off = 0;//相对于基地址的偏移量
for (i = 0;i < arr->dim;i++) {
temp = va_arg (list,int);
if (temp < 0 || temp >= arr->bounds[i]) {
return ERROR;
}
*off += temp * arr->constants[i];
}
return OK;
}
Status Assign (Array *arr,ElemType e,...) {
va_list list;
Status result;
int off;
va_start (list,e);
result = Locate(arr,list,&off);
if (result == ERROR) {
return ERROR;
}else {
*(arr->base + off) = e;
}
va_end (list);
return OK;
}
int Value (Array *arr,ElemType *e,...) {
va_list list;
int result;
int off;
va_start (list,e);
result = Locate(arr,list,&off);
if (result == ERROR) {
return ERROR;
}else {
*e = *(arr->base + off );
return OK;
}
}
int main () {
Array arr;
int i;
int j;
int k;
int count = 0;
int temp;
InitArray(&arr,3,3,4,2);
for (i = 0;i < 3;i++) {
for (j = 0;j < 4;j++) {
for (k = 0;k < 2;k++) {
Assign (&arr,count++,i,j,k);
}
}
}
for (i = 0;i < 3;i++) {
for (j = 0;j < 4;j++) {
for (k = 0;k < 2;k++) {
Value (&arr,&temp,i,j,k);
printf("%d ",temp);
}
}
}
return 0;
}
数组的顺序表示和实现