#ifndef _ARRAY_H_ #define _ARRAY_H_ #define MAX_ARRAY_DIM 8 typedef struct { int *base; int dim; int *bounds; //数字维界基址 -- 值表示对应维的长度 int *constants; //数组映象函数常量基址 }Array; typedef enum{ OK, ERROR, OVERFLOW, UNDERFLOW }Status; //... 各维的长度 Status InitArray(Array &A, int dim, ...); Status DestroyArray(Array &A); //Status Locate(Array A, va_list ap, int &off); Status Value(Array A, int *e, ...); Status Assign(Array &A, int e, ...); #endif #include "array.h" #include <stdarg.h> #include <stdio.h> #include <stdlib.h> Status InitArray(Array &A, int dim, ...) { if (dim < 1 || dim > MAX_ARRAY_DIM) return ERROR; A.dim = dim; A.bounds = (int *)malloc(dim * sizeof(int*)); if (!A.bounds) exit(OVERFLOW); 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 UNDERFLOW; elemtotal *= A.bounds[i]; } va_end(ap); A.base = (int *)malloc(elemtotal * sizeof(int)); 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; } Status DestroyArray(Array &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; } Status Locate(Array A, va_list ap, int &off) { off=0; int ind; for (int 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(Array A, int *e, ...) { va_list ap; int off; //前面一个参数是引用会有问题 va_start(ap, e); Status result; if ((result = Locate(A, ap, off)) != OK) return ERROR; *e= *(A.base+off); return OK; } Status Assign(Array &A, int e, ...) { va_list ap; va_start(ap, e); Status result; int off; if ((result = Locate(A, ap, off)) != OK) return ERROR; *(A.base+off) = e; return OK; }