다 차원 배열 의 실현
2 차원 배열 a [m] [n] 을 예 로 들 면
열 순서:
a[0][0] a[1][0] ...... a[m-1][0]
.............
a[m-1][0] a[m-1][1] ...... a[m-1][n-1]
줄 순서:
a[0][0] a[1][0] ...... a[m-1][0]
.............
a[0][n-1] a[1][ [n-1 ] ...... a[m-1][n-1]
데 이 터 는 일반적으로 연속 적 인 주소 로 저 장 됩 니 다. 계산 방법 은 (i, j) = & a + (b) + j; / b 1 차원 요소 의 개수 입 니 다.
다 차원 배열 에 보급 (j1, j2, j3,..., jn) = (b2 * b3 *... * bn * j1 + b3 * b4 *... * bn * j2 +... + bn * jn - 1 + jn)
예 를 들 어 배열 a [5] [4] [10] 을 알 고 있 습 니 다. a [2] [3] [4] 의 주 소 를 구 합 니 다.
j1=2、j2 = 3、j3 = 4;b1=5、b2=4、b3=10;
a[2][3][4]=b2*b3*j1+b3*j2+j3=4*10*2+10*3+4;
다음은 코드 구현 입 니 다. (아래 코드 는 제 가 ubuntu 에서 간단하게 테스트 를 통 과 했 습 니 다. 다른 시스템 에서 실행 할 수 없다 면 양해 해 주 십시오. 이 코드 는 간단 한 테스트 만 거 쳤 습 니 다. 문제 가 발생 하면 양해 해 주 십시오.)
/*
*created by Reage at 2013 March 28
*description: , 、 、 、
*
*blog:http://blog.csdn.net/rentiansheng
*/
#include
#include
#include
#define MAXDIM 4
typedef struct Array
{
int dim;
int *ptr;
int *bounds;
int *base_add;
}Array;
int array_init(Array *a, int dim, ...);
int array_set_value(Array *a, int value, ...);
int array_print_line(Array *a);
int array_get_value(Array *a, ...);
void array_destory(Array *a);
int main(int argc, char *argv[])
{
Array a;
int i = 0;
int j;
int total = 1;
array_init(&a, 2, 4, 6);
for(; i < 4; i++)
{
for(j = 0; j < 6; j++)
{
array_set_value(&a, total++, i, j);
}
}
array_print_line(&a);
for(i = 0; i < 4; i++)
{
for(j = 0; j < 6; j++)
{
printf("%-7d",array_get_value(&a, i, j));
}
printf("
");
}
array_destory(&a);
}
int array_init(Array * a, int dim, ...)
{
if(1 > dim || 8 < dim)
return -1;
a->dim = dim;
va_list ap;
int i;
long total = 1;
a->bounds = (int *)malloc(dim * sizeof(int));
va_start(ap, dim);
for(i = 0; i < dim; i++)
{
a->bounds[i] = va_arg(ap, int);
total *= a->bounds[i];
}
va_end(ap);
a->ptr = (int *) malloc(total * sizeof(int));
a->base_add = (int *) malloc(dim * sizeof(int));
a->base_add[dim -1] = 1;
i = dim -2;
for(; i >= 0; i--)
{
a->base_add[i] = a->base_add[i+1] * a->bounds[i+1];
}
return 0;
}
#define FREE(x) if(NULL != (x)) free(x)
void array_destory(Array *a)
{
FREE(a->ptr);
FREE(a->bounds);
FREE(a->base_add);
}
int array_get_value(Array *a, ...)
{
va_list va;
va_start(va, a);
int result = array_get_locate(a, va);
if(-1 == result) return -1;
return a->ptr[result];
}
int array_print_line(Array *a)
{
int total = 1;
int i = 0;
int line ;
for(; i < a->dim; i++)
{
total *= a->bounds[i];
}
line = total/a->bounds[0];
for(i = 0; i < total; i++)
{
if(0 == i % line && 0 != i) printf("
");
printf("%-7d", a->ptr[i]);
}
printf("
");
return 0;
}
int array_get_locate(Array *a, va_list va)
{
int result = 0;
int bound;
int i;
for(i = 0; i < a->dim; i++)
{
bound = va_arg(va, int);
if(0 > bound || bound > a->bounds[i])
{
return -1;
}
result += bound * a->base_add[i];
}
return result;
}
int array_set_value(Array *a, int value, ...)
{
if(NULL == a) return -1;
va_list va;
va_start(va, value);
int result = array_get_locate(a, va);
if( -1 == result) return -1;
a->ptr[result] = value;
return 0;
}
blog: http://blog.csdn.net/rentiansheng/article/details/8737225
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어 간단한 파일 r/w 조작 방법데이터의 입력과 출력은 거의 모든 C 언어 프로그램과 수반된다. 입력이란 원본에서 데이터를 얻는 것이다. 출력은 단말기에 데이터를 쓰는 것으로 이해할 수 있다.이곳의 원본은 키보드, 마우스, 하드디스크, 시디, 스캐...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.