通用版本。可以以任意数量的维度运行。将一维数组视为多维空间,因此可以以不同方式查看同一内存区域。
完整的例子可以在here找到。
#include <stdio.h>
#include <stdint.h>
int get_idx(int a[], uint32_t dims[], uint32_t dims_n, int value)
{
size_t size;
size_t index = 0, n;
if (dims[0] < 1) return -1;
size = 1;
n = dims_n;
while (n)
size *= dims[--n];
if (dims_n > size) return -1;
while (index < size && a[index] != value)
{
++index;
}
if (index == size)
return -1;
n = 0;
while (n < dims_n)
{
size /= dims[n];
dims[n] = index / size;
index = index % size;
++n;
}
return 0;
}
用法:
int
main(void) {
int res;
uint32_t dims[5];
int a[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
dims[0] = 12;
res = get_idx(a, dims, 1, 10);
if (res == -1) goto fail;
printf("dim1 [%u]\n", dims[0]);
dims[0] = 2;
dims[1] = 6;
res = get_idx(a, dims, 2, 10);
if (res == -1) goto fail;
printf("dim1 [%u] dim2 [%u]\n", dims[0], dims[1]);
dims[0] = 3;
dims[1] = 2;
dims[2] = 2;
res = get_idx(a, dims, 3, 10);
if (res == -1) goto fail;
printf("dim1 [%u] dim2 [%u] dim3 [%u]\n", dims[0], dims[1], dims[2]);
dims[0] = 2;
dims[1] = 2;
dims[2] = 2;
dims[3] = 2;
res = get_idx(a, dims, 4, 10);
if (res == -1) goto fail;
printf("dim1 [%u] dim2 [%u] dim3 [%u] dim4 [%u]\n",
dims[0], dims[1], dims[2], dims[3]);
return 0;
fail:
printf("Not found\n");
return -1;
}
输出:
dim1 [10]
暗1 [1]暗2 [4]
暗1 [2]暗2 [1]暗3 [0]
dim1 [1] dim2 [0] dim3 [1] dim4 [0]