您的位置:首页 > 其它

一个动态多维数组的实现

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

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐