Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

knkd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
#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;
}
 

Всего записей: 196 | Зарегистр. 15-01-2008 | Отправлено: 18:35 30-08-2011
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru