Matrix.h #ifndef MATRIX_H_H #define OK 0 #define ERROR -1 #define MAX_DIM_SIZE 8 typedef int ElemType; typedef struct { ElemType *base; //矩阵基地址 int dim; //矩阵维数 int *bounds; //保存维界值。如A[3][2] bounds[0] = 3, bounds[1] = 2 int *constants; //保存矩阵每个维度一半的元素个数。 /* ** 例如:三位数组A[2][3][4],对于A[2]而言,它有 ** 2行,每一行有3 * 4 == 12个元素,那么这时候就有 ** constants[0] == 12,对于A[2][3]而言, ** 它有2 * 3 == 6行,每一行有4个元素, ** 此时,constants[1] == 4, ** constants[2] == 1 */ }Array; int init_matrix(Array*, int, ...); int destroy_matrix(Array*); int locate(Array*, va_list, int*); int assign_matrix(Array*, ElemType, ...); int print_matrix(Array*, int, int); int value_matrix(Array*, ElemType*, ...); #endif Matrix.cpp #include<stdio.h> #include<stdlib.h> #include<stdarg.h> #include"Matrix.h" //初始化矩阵 int init_matrix(Array *A, int dim, ...) { A->dim = dim; if(!(A->bounds = (int*)malloc(sizeof(int) * dim))) return ERROR; int total_elem = 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 ERROR; total_elem *= A->bounds[i]; } va_end(ap); if(!(A->base = (ElemType*)malloc(sizeof(ElemType) * total_elem))) return ERROR; if(!(A->constants = (int*)malloc(sizeof(int) * dim))) return ERROR; A->constants[dim - 1] = 1; for(i = dim - 2 ; i >= 0 ; i--) { A->constants[i] = A->bounds[i + 1] * A->constants[i + 1]; } //初始化矩阵元素,只适用于二维数组 for(i = 0 ; i < A->bounds[0] ; i++) { for(int j = 0 ; j < A->bounds[1] ; j++) { *(A->base + i * A->bounds[0] + j) = 0; } } return OK; } //销毁矩阵 int destroy_matrix(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; } //找元素位置 int 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 ERROR; *off += A->constants[i] * ind; } return OK; } //为指定位置赋值 int assign_matrix(Array *A, ElemType e, ...) { if(!A->base || !A->bounds || !A->constants) return ERROR; va_list ap; int off; va_start(ap,e); if(locate(A,ap,&off)) return ERROR; *(A->base + off) = e; va_end(ap); return OK; } //返回矩阵指定位置的值 int value_matrix(Array *A, ElemType *e, ...) { if(!A->base || !A->bounds || !A->constants) return ERROR; va_list ap; int off; va_start(ap, e); if(locate(A,ap,&off)) return ERROR; *e = *(A->base + off); va_end(ap); return OK; } //打印矩阵 int print_matrix(Array *A, int m, int n) { if(!A->base || !A->bounds || !A->constants) return ERROR; for(int i = 0 ; i < m ; i++) { for(int j = 0 ; j < n ; j++) { printf("%3d", *(A->base + i * m + j)); } printf("/n"); } return OK; }