Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void slice2(int *a, int nDims, int *askips, int *b, int *start, int *count, int *bskips) {
int i;
if (nDims == 1)
memcpy(b, a + *start, *count * sizeof(*a));
else
for (i = *start; i < *start + *count; i++)
slice2(a + i * *askips, nDims-1, askips+1,
b + (i-*start) * *bskips, start+1, count+1, bskips+1);
}
void slice(int *a, int nDims, int *dims, int *b, int *start, int *count) {
int i;
int *askips = malloc(sizeof(*askips)*(nDims-1));
int *bskips = malloc(sizeof(*bskips)*(nDims-1));
askips[nDims-2] = dims[nDims-1];
for (i = nDims - 3; i >= 0; i--)
askips[i] = askips[i+1] * dims[i+1];
bskips[nDims-2] = count[nDims-1];
for (i = nDims - 3; i >= 0; i--)
bskips[i] = bskips[i+1] * count[i+1];
slice2(a, nDims, askips, b, start, count, bskips);
free(askips);
free(bskips);
}
void print2(int *a, int nDims, int *dims, int *skips) {
int i;
if (nDims == 1) {
for (i = 0; i < *dims; i++) printf("%3d ", a[i]);
printf("\n");
}
else
for (i = 0; i < *dims; i++)
print2(a + i * *skips, nDims - 1, dims+1, skips+1);
}
void print(int *a, int nDims, int *dims) {
int i;
int *skips = malloc(sizeof(*skips)*(nDims-1));
skips[nDims-2] = dims[nDims-1];
for (i = nDims - 3; i >= 0; i--)
skips[i] = skips[i+1] * dims[i+1];
print2(a, nDims, dims, skips);
printf("\n");
free(skips);
}
int main(void) {
int a[24] = {
0, 1, 2, 3,
10, 11, 12, 13,
20, 21, 22, 23,
100, 101, 102, 103,
110, 111, 112, 113,
120, 121, 122, 123};
int dims[3] = {2, 3, 4};
int b[8];
int start[3] = {0, 1, 1};
int count[3] = {2, 2, 2};
print(a, 3, dims);
slice(a, 3, dims, b, start, count);
print(b, 3, count);
return 0;
}