一个动态多维数组的实现

来源:互联网 发布:甲种本 知乎 编辑:程序博客网 时间:2024/05/21 19:22

 只是一个想法的实现,投入到实际应用中还需进一步完善
作者:李嘉
未经书目许可,禁止任何商业目的的转载

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
//////////////////////////////////////////////////////////////////////////
//
// Code By : LiJia, http://blog.csdn.net/imjj
// Date : 2007-05-04
// Purpose : a mulidim, dynamic array show
//////////////////////////////////////////////////////////////////////////
struct Array
{
int dim;
int * dims;
int * data;
};
Array * array_create(int dim, ...)
{
if (dim < 1 )
return NULL;
int i;
int * dims;
int total_elems = 1;
Array * array = NULL;
// parse arguments
va_list argptr;
va_start(argptr, dim);
dims = (int*)malloc(dim * sizeof(int));
for (i = 0; i < dim; i++)
{
dims[i] = va_arg(argptr, int);
total_elems *= dims[i];
}
// create the array
array = (Array*)malloc(sizeof(Array));
array->dim = dim;
array->dims = dims;
array->data = (int*)malloc(total_elems * sizeof(int));
return array;
}
void array_free(Array * array)
{
free(array->dims);
free(array->data);
free(array);
}
int * array_get(Array * array, ...)
{
int i, j;
int pos = 0;
int n;
int exp;
va_list argptr;
va_start(argptr, array);
for(i = 0; i < array->dim; i++)
{
n = va_arg(argptr, int);
//TODO: check n in range [0, array->dims[i]] here
exp = 1;
//TODO: a more effective pos calculate algorithm
for (j = array->dim - 1; j > i; j--)
exp *= array->dims[j];
pos += n * exp;
}
return array->data + pos;
}
int array_size(Array * array)
{
int size = 1;
int i;
for (i = 0; i < array->dim; i++)
size *= array->dims[i];
return size;
}
const int I = 5, J = 5, K = 5;
int main(int agrc, char * argv [])
{
Array * array = array_create(3, I, J, K); // create a 3 dim and size [5][5][5] array
int i, j, k;
int size = array_size(array);
for (i = 0; i < size; i++)
array->data[i] = (i + 1);
for(int i = 0; i < I; i++)
{
for (j = 0; j < J; j++)
{
for (k = 0; k < K; k++)
printf("a[%d][%d][%d] = %d/n",
i, j, k,
*array_get(array, i, j , k));
}
}
array_free(array);
return 0;
}