#include<stdio.h>
#include<stdarg.h> //变长参数
#include<stdlib.h>
#define MAX_ARRAY_DIM 8
#define ERROR 0
#define UNDERFLOW -1
#define OVERFLOW -2
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType *base; //元素基址
int dim; //维数
int *bounds; //维界基址
int *constants; //映像函数常量基址
}Array;
Status InitArray(Array &A, int dim, ...)
{
va_list ap;
int elemtotal;
if(dim < 1 || dim > MAX_ARRAY_DIM)
return ERROR;
A.dim = dim;
A.bounds = (int *)malloc(dim * sizeof(int));
if(!A.bounds)
exit(OVERFLOW);
elemtotal = 1;
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 = (ElemType *)malloc(elemtotal * sizeof(ElemType));
if(!A.base)
exit(OVERFLOW);
A.constants = (int *)malloc(dim * sizeof(int));
A.constants[dim - 1] = 1;
for(int i = dim - 2; i >= 0; --i)
A.constants[i] = A.constants[i + 1] * A.bounds[i + 1];
return OK;
}
void PrintArrayStruct(Array A)
{
printf("\nA.dim:%d", A.dim);
printf("\nA.bounds:");
for(int i = 0; i < A.dim; ++i)
printf("%d ", A.bounds[i]);
printf("\nA.constants:");
for(int i = 0; i < A.dim; ++i)
printf("%d ", A.constants[i]);
}
Status Locate(Array A, va_list ap, int &off)
{
int ind;
off = 0;
for(int i = 0; i < A.dim; ++i)
{
ind = va_arg(ap, int);
if(ind < 0 || ind >= A.bounds[i])
return UNDERFLOW;
off += A.constants[i] * ind;
}
va_end(ap);
return OK;
}
Status Value(Array A, int &e, int e1, ...)
{
//参数e1是没有意义的,直接将变长参数写在&e的后面会出错,主要原因是他们的数据类型不一致
int result, off;
va_list ap;
va_start(ap, e1);
if((result = Locate(A, ap, off)) <= 0)
return result;
e = *(A.base + off);
return OK;
}
Status Assign(Array A, int e, ...)
{
int result, off;
va_list ap;
va_start(ap, e);
if((result = Locate(A, ap, off)) <= 0)
return result;
*(A.base + off) = e;
return OK;
}
int main()
{
Array A;
int e = 0;
InitArray(A, 3, 10, 20, 30);
Assign(A, 999, 7, 8, 9);
Assign(A, 888, 7, 8, 8);
Value(A, e, 3, 7, 8, 9);
printf("\n e = %d\n", e);
PrintArrayStruct(A);
return 0;
}
多维数组qwq
最新推荐文章于 2025-05-21 21:05:12 发布