Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
26 / 26 / 17
Регистрация: 29.12.2010
Сообщений: 90
1

Как создать многомерный массив?

02.12.2012, 21:17. Показов 1396. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите, пожалуйста, возможно ли задать многомерный массив в С, если заранее (на момент написания кода) не известно точное число количества мер? Может, как-то возможно реализовать через указатели или там массивы указателей?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2012, 21:17
Ответы с готовыми решениями:

Как заполнить значениями многомерный массив
ДобрДобрый вечер,уважаемые форумчяне! Возник такой вопрос, как на чистом Си ввести в масиив типа:...

Многомерный массив
Как поменять макс и мин элемент в каждой строке #include<stdio.h> int main() { int n,m,i,j;...

Двумерный массив (Многомерный)
Ввести построчно элементы двумерного массива чисел заданных размеров . Из столбцов исходного...

Многомерный массив в функции
Всем доброго дня!!!! подскажите пожалуйста каким образом передать двумерный массив sales в...

2
9 / 4 / 5
Регистрация: 24.02.2012
Сообщений: 43
02.12.2012, 22:04 2
Здравствуйте)
Я думаю,что нет.В Си можно пользоваться массивами,размерность которых больше двух(т.е. трехмерные,четырехмерные и так до бесконечности). Однако, чем больше размерность массива,тем больший объем памяти он будет занимать.Например : четырехмерный массив символов размерностью 10x6x9x4 занимает 2160 байтов. Если бы массив содержал 2-байтовые целые, потребовалось бы 4320 байтов. Если бы элементы массива имели тип double, причем каждый элемент (вещественное число двойной точности) занимал бы 8 байтов, то для хранения массива потребовалось бы 17280 байтов. Объем требуемой памяти с ростом числа измерений растет экспоненциально.
Я считаю,что в поставленной задаче должны быть оговорены все моменты,вплоть до мелочей(в данном случае мерность массива),а иначе корректно написать программу не получится.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.12.2012, 08:29 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Можно, если хранить представлять многомерный массив через одномерный.

Программа запрашивает число размерностей, значение каждой размерности, затем предлагает пользователю заполнить массив и выводит его на экран:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct md_array
{
    unsigned rank;
    unsigned *dimensions;
    int *data;
};
 
unsigned num_elements(unsigned rank, unsigned *dimensions)
{
    unsigned num = 1, i;
    for(i = 0; i < rank; ++i)
        num *= dimensions[i];
    return num;
}
 
struct md_array *make_md_array(unsigned rank, unsigned *dimensions)
{
    struct md_array *array = malloc(sizeof *array);
    if(array == NULL)
        goto err_ret;
 
    array->dimensions = malloc(rank * sizeof *dimensions);
 
    if(array->dimensions == NULL)
        goto free_array;
 
    array->data = malloc(num_elements(rank, dimensions) * sizeof *(array->data));
 
    if(array->data == NULL)
        goto free_dimensions;
 
    array->rank = rank;
    memcpy(array->dimensions, dimensions, rank * sizeof *dimensions);
 
    return array;
 
free_dimensions:
    free(array->dimensions);
 
free_array:
    free(array);
 
err_ret:
    return NULL;
}
 
unsigned calculate_offset(unsigned rank, unsigned *dimensions, unsigned *indices)
{
    unsigned offset = 0, i, last_dim = 1;
    for(i = 0; i < rank; ++i)
    {
        offset = offset * last_dim + indices[i];
        last_dim = dimensions[i];
    }
    return offset;
}
 
int *get_item(struct md_array *array, unsigned *indices)
{
    return &(array->data[calculate_offset(array->rank, array->dimensions, indices)]);
}
 
void destroy_md_array(struct md_array *array)
{
    free(array->data);
    free(array->dimensions);
    free(array);
}
 
typedef int (*MD_ARRAY_FUN)(struct md_array *, unsigned *);
 
int gen_walk(struct md_array *array, MD_ARRAY_FUN fun, unsigned *indices, unsigned curr_dim)
{
    if(curr_dim >= array->rank)
        return fun(array, indices);
 
    for(indices[curr_dim] = 0; indices[curr_dim] < array->dimensions[curr_dim]; ++indices[curr_dim])
        if(gen_walk(array, fun, indices, curr_dim + 1) == 0)
            return 0;
 
    return 1;
}
 
int walk_md_array(struct md_array *array, MD_ARRAY_FUN fun)
{
    int ret;
    unsigned *indices = calloc(array->rank, sizeof *indices);
 
    if(indices == NULL)
        return 0;
 
    ret = gen_walk(array, fun, indices, 0);
 
    free(indices);
    return ret;
}
 
void print_indices(unsigned count, unsigned *indices)
{
    unsigned i;
    for(i = 0; i < count; ++i)
        printf("[%u]", indices[i]);
}
 
int read_array(struct md_array *array, unsigned *indices)
{
    printf("ARRAY");
    print_indices(array->rank, indices);
    printf(": ");
    fflush(stdout);
    if(scanf("%d", get_item(array, indices)) != 1)
    {
        perror("scanf");
        return 0;
    }
 
    return 1;
}
 
int print_array(struct md_array *array, unsigned *indices)
{
    printf("ARRAY");
    print_indices(array->rank, indices);
    printf(" = %d\n", *get_item(array, indices));
    return 1;
}
 
int main(void)
{
    unsigned rank, i;
    unsigned *dimensions;
    struct md_array *array;
    int ret = EXIT_FAILURE;
 
    printf("Rank: ");
    fflush(stdout);
    scanf("%u", &rank);
 
    dimensions = malloc(rank * sizeof *dimensions);
 
    if(dimensions == NULL)
    {
        perror("malloc");
        goto err_ret;
    }
 
    for(i = 0; i < rank; ++i)
    {
        printf("Dim #%u: ", i);
        fflush(stdout);
        scanf("%u", &dimensions[i]);
    }
 
    array = make_md_array(rank, dimensions);
 
    if(array == NULL)
    {
        perror("make_md_array");
        goto free_dimensions;
    }
 
    puts("Enter array:");
    if(walk_md_array(array, read_array) == 0)
        goto free_array;
    puts("Got array:");
    if(walk_md_array(array, print_array) == 0)
        goto free_array;
 
    ret = EXIT_SUCCESS;
 
free_array:
    destroy_md_array(array);
 
free_dimensions:
    free(dimensions);
 
err_ret:
    exit(ret);
}
Пример ввода массива 2x2x2:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ ./sample
Rank: 3
Dim #0: 2
Dim #1: 2
Dim #2: 2
Enter array:
ARRAY[0][0][0]: 1
ARRAY[0][0][1]: 2
ARRAY[0][1][0]: 3
ARRAY[0][1][1]: 4
ARRAY[1][0][0]: 5
ARRAY[1][0][1]: 6
ARRAY[1][1][0]: 7
ARRAY[1][1][1]: 8
Got array:
ARRAY[0][0][0] = 1
ARRAY[0][0][1] = 2
ARRAY[0][1][0] = 3
ARRAY[0][1][1] = 4
ARRAY[1][0][0] = 5
ARRAY[1][0][1] = 6
ARRAY[1][1][0] = 7
ARRAY[1][1][1] = 8
Особо программу не проверял, так что возможны косяки.
0
03.12.2012, 08:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2012, 08:29
Помогаю со студенческими работами здесь

Считать в память многомерный (трехмерный) массив
Всем привет задача такая вообщем есть массив вот примерно такой 3 3 a1 a2 a3 b1 b2 b3 c1 c2...

Динамическое выделение памяти под многомерный массив
Проблема с выводом многомерного массива. Может память неправильно выделяю? Помогите чайнику. ...

Объявить многомерный массив из N*3 и ввести данные в него
Задача объявить многомерный массив из N*3 и ввести данные в него. Пишу на Си. Объявляю: ...

Многомерный массив: поменять вертикальное расположение на горизонтальное
Написал программку, распределяющую квартиры по подъездам и этажам. Но получается вертикальное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru