简单的数组,实现了4个基本功能
#include<stdio.h>
#include<stdarg.h>//用于取变长的参数表 (不懂的话可以查资料)
#include<stdlib.h>
#define MAX_ARRAY_DIM 8
typedef struct {
int* base;//数组基址
int dim;//数组的维数
int* bounds;//该指针指向空间的作用是 存储各个维度的具体值
int* constants;//该指针指向空间的作用是 存储各个维度能存储多少元素 用于计算元素的下标
}Array;
//初始化
void Init_Array(Array* a, int dim, ...) {
//判断维数是否正确
if (dim<1 || dim>MAX_ARRAY_DIM) exit(0);
a->dim = dim;
a->bounds = (int*)malloc(dim * sizeof(int));
if (!a->bounds) exit(0);
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) exit(0);//输入有误
elemtotal *= a->bounds[i];
}
va_end(ap);
a->base = (int*)malloc(elemtotal * sizeof(int));
if (!a->base) exit(0);
a->constants = (int*)malloc(dim * sizeof(int));
if (!a->constants) exit(0);
a->constants[dim - 1] = 1;
for (int i = dim - 2; i >= 0; i--)
a->constants[i] = a->constants[i + 1] * a->bounds[i + 1];
printf("初始化完成!\n");
}
//销毁
void Destroy_Array(Array* a) {
if (!a->base) exit(0);
else {
free(a->base);
a->base = NULL;
}
if (!a->bounds) exit(0);
else {
free(a->bounds);
a->bounds = NULL;
}
if (!a->constants) exit(0);
else {
free(a->constants);
a->constants = NULL;
}
printf("销毁成功!\n");
}
//根据元素下标,查出元素的位置
void Locate_Array(Array* a,va_list ap,int *off) {
int sum=0;
int ind;//当前维数所能存储的元素个数
for (int i = 0; i < a->dim; i++) {
ind = va_arg(ap, int);
if (ind<0 || ind>=a->bounds[i]) exit(0);
else sum += ind * a->constants[i];
}
*off = sum;
}
//根据下标查找
void Value_Array(int* e,Array a, ...) {
va_list ap;
int off;
va_start(ap, a);
Locate_Array(&a, ap,&off);
va_end(ap);
*e = *(a.base + off);
}
//根据下标创建或修改元素的值
void Assign_Array(Array* a, int e, ...) {
va_list ap;
int off;
va_start(ap, e);
Locate_Array(a, ap,&off);
va_end(ap);
*(a->base + off) = e;
}
int main() {
Array a;
Init_Array(&a, 2, 2, 2);//二维数组
int e = 0;
int off = 0;
int* p = a.bounds;//打印各维的数值
for (int i = 0; i < a.dim; i++)
printf("%d ", *(p + i));
printf("\n");
p = a.constants;//打印每个维度能容纳多少元素
for (int i = 0; i < a.dim; i++)
printf("%d ", *(p + i));
printf("\n");
for(int i=0;i<2;i++)//打印 测试assign和value
for (int j = 0; j < 2; j++) {
Assign_Array(&a, 1, i, j);
Value_Array(&e, a, i, j);
printf("a[%d][%d]=%d\n", i,j,e);
}
Destroy_Array(&a);
return 0;
}