#include <stdlib.h> #include <stdio.h> #include <stdbool.h> #define DATA_TYPE int /* Отладочная печать индекса */ static inline void pprint_index(size_t const * index, size_t size) { size_t i; printf("("); for (i = 0; i < size; i++, index++) { printf("%d", (int)*index); if (i < size - 1) { printf(", "); } } printf(")"); } /* Вычисление общего количества элементов в многомерном массиве */ static inline size_t calc_size(const size_t const * dims, const size_t dim) { size_t all = 1; size_t i; for (i=0; i < dim; i++) { all *= dims[i]; } return all; } /* Приращение индекса (Без контроля границ!) */ static inline void go_counter( const size_t * dims, /* Размерности массива */ size_t * counter, /* Индекс текущего элемента */ const size_t dim, /* Количество измерений */ const size_t level /* Уровень вложенности */ ) { size_t index = level - 1; if (counter[index] < dims[index] - 1) { counter[index] += 1; } else { counter[index] = 0; go_counter(dims, counter, dim, level - 1); } } /* Перебор элементов массива по строкам */ void loop(DATA_TYPE * data, /* Массив с данными */ const size_t * dims, /* Размерности массива */ size_t * counter, /* Индекс текущего элемента */ const size_t dim /* Количество измерений */ ) { size_t all = calc_size(dims, dim); size_t i; for (i=0; i<all; i++) { pprint_index(counter, dim); printf(" %d\n", data[i]); go_counter(dims, counter, dim, dim); } } int main() { const size_t dim = 4; /* Количество измерений */ DATA_TYPE data[2][5][3][4] = {{ {{1111,1112,1113,1114}, {1121,1122,1123,1124}, {1131,1132,1133,1134}}, {{1211,1212,1213,1214}, {1221,1222,1223,1224}, {1231,1232,1233,1234}}, {{1311,1312,1313,1314}, {1321,1322,1323,1324}, {1331,1332,1333,1334}}, {{1411,1412,1413,1414}, {1421,1422,1423,1424}, {1431,1432,1433,1434}}, {{1511,1512,1513,1514}, {1521,1522,1523,1524}, {1531,1532,1533,1534}} },{ {{2111,2112,2113,2114}, {2121,2122,2123,2124}, {2131,2132,2133,2134}}, {{2211,2212,2213,2214}, {2221,2222,2223,2224}, {2231,2232,2233,2234}}, {{2311,2312,2313,2314}, {2321,2322,2323,2324}, {2331,2332,2333,2334}}, {{2411,2412,2413,2414}, {2421,2422,2423,2424}, {2431,2432,2433,2434}}, {{2511,2512,2513,2514}, {2521,2522,2523,2524}, {2531,2532,2533,2534}} }}; size_t dimlist[4] = {2, 5, 3, 4}; /* Храним размерности массива */ size_t tmplist[4] = {0, 0, 0, 0}; /* Храним индекс текущего элемента */ loop((DATA_TYPE *) data, (size_t *) dimlist, (size_t *) tmplist, dim ); return EXIT_SUCCESS; } |