Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

Пятимерный массив - C++

12.11.2009, 08:40. Просмотров 1923. Ответов 19
Метки нет (Все метки)

Мне нужно использовать пятимерный массив в котором будут целые числа
пишу
C++
1
int mass_all[50][50][50][50][50];
и уже после этой строчки программа вылетает с ошибкой хотя компилятор не выдает ошибок
то есть такой массив нельзя даже инициализировать

а если пишу

C++
1
int mass_all[1][1][1][1][1];
то все нормально

пробовал указать тип данных long но ничего не изменилось

как всетаки можно использовать пятимерный массив mass_all[50][50][50][50][50]
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2009, 08:40     Пятимерный массив
Посмотрите здесь:

C++ Задать массив вещественных чисел и вставить в исходный массив число
C++ Задан вектор X[20]. Положительные числа переписать в массив Y, а отрицательные в массив W
C++ с клавиатуры ввести массив,во второй массив записать нечетные элементы из первого
Дан массив А(4,4). Сформировать массив В(4) из среднеарифметических значений элементов в каждой строке. C++
Массив: Составить массив из двух исходных по заданному принципу заполнения C++
C++ Массив: сформировать массив C[12] так, чтобы элементы располагались следующим образом: A(1) B(1) A(2) B(2)
C++ Массив: Переместить в массив Y все числа, дробная часть которых больше 5.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SONNY
8 / 8 / 0
Регистрация: 30.05.2009
Сообщений: 47
12.11.2009, 08:54     Пятимерный массив #2
используй proxy-классы
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
12.11.2009, 08:57     Пятимерный массив #3
C
1
2
   int mass_all[2][2][2][2][2]={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};
   printf("%d\n", mass_all[0][0][0][0][1]);
Все работает прекрасно
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
12.11.2009, 09:04     Пятимерный массив #4
Цитата Сообщение от nill Посмотреть сообщение
Мне нужно использовать пятимерный массив в котором будут целые числа
пишу
C++
1
int mass_all[50][50][50][50][50];
и уже после этой строчки программа вылетает с ошибкой хотя компилятор не выдает ошибок
то есть такой массив нельзя даже инициализировать

а если пишу

C++
1
int mass_all[1][1][1][1][1];
то все нормально

пробовал указать тип данных long но ничего не изменилось

как всетаки можно использовать пятимерный массив mass_all[50][50][50][50][50]
ошибка типа "Unhandled exception at 0x00411687 in temp.exe: 0xC00000FD: Stack overflow." ?
ты прикинь скока ты места резервируешь 50^5*sizeof(int) где такой стек взять?
экономнее надо товарищь
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
12.11.2009, 10:55     Пятимерный массив #5
а если использовать calloc?
blackswan
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 61
12.11.2009, 10:57     Пятимерный массив #6
Цитата Сообщение от TanT Посмотреть сообщение
ошибка типа "Unhandled exception at 0x00411687 in temp.exe: 0xC00000FD: Stack overflow." ?
ты прикинь скока ты места резервируешь 50^5*sizeof(int) где такой стек взять?
экономнее надо товарищь
так как в таком случае создавать подобные массивы? и почему он попадает в стек?
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
12.11.2009, 11:02     Пятимерный массив #7
C
1
2
3
4
5
unsigned size, nmemb;
long double * mass_all;
size = pow(50.,5.);
nmemb = sizeof(int); /* Определяем размер 1 элемента целого типа */
mass_all = (int*)calloc(nmemb, size);
или както так.....

Добавлено через 56 секунд
size - вроде кол-во элементов

Добавлено через 4 минуты
я вот сейчас подумал..... 50 в 5 степени - это 312,5 млн. элементов...... представь сколько будет длиться их элементарная обработка...........
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
12.11.2009, 11:28     Пятимерный массив #8
Цитата Сообщение от blackswan Посмотреть сообщение
так как в таком случае создавать подобные массивы? и почему он попадает в стек?
попадает в стек так как создаётся в статической памяти (ты сразу говоришь этим кодом int mass_all[50][50][50][50][50]; что у тебя железно будет использоваться стока памяти).
теоретически можно поробовать использовать кучу (heap) как сказал Iworb, но... не лучше ли сократить запросы? не факт что кучи хватит. возможно следует использовать для хранения данных файлы.
для чего тебе столько памяти? какая задача?
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
12.11.2009, 11:47  [ТС]     Пятимерный массив #9
в общем понятно что это очень большой массив и надо делать как то по другому
а задача такая

есть 50 строк
в каждой по 5 переменных

надо посчитать количество повторений

то есть к примеру если бы было всего три строки
1) 1, 2, 40, 15, 16
2) 1, 2, 40, 15, 16
3) 1, 2, 40, 15, 40

в результате я хочу знать что

вариант 1, 2, 40, 15, 16 повторяется 2 раза
вариант 1, 2, 40, 15, 40 повторяется 1 раз

порядок переменных важен
то есть
1, 2, 40, 15, 16 и 1, 2, 40, 16, 15 это разные строки


я хотел написал такой код

C++
1
2
3
4
5
6
7
8
9
10
11
  
int mass_all[50][50][50][50][50]; 
 
х=1; x1=1; x2=2; x3=40; x4=16;
mass_all[x][x1][x2][x3][x4]++;
 
х=1; x1=1; x2=2; x3=40; x4=16;
mass_all[x][x1][x2][x3][x4]++;
 
х=1; x1=1; x2=2; x3=40; x4=40;
mass_all[x][x1][x2][x3][x4]++;
и потом в цикле определил бы элементы массива которые больше нуля и сразу бы узнал количество повторений
А как сделать это же по другому пока не додумался.

ЗЫ Строки конечно заранее не известны я тут просто упростил
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
12.11.2009, 11:51     Пятимерный массив #10
Цитата Сообщение от nill Посмотреть сообщение
есть 50 строк
в каждой по 5 переменных
тебе хватит int mass[50][5];

строки будешь сравнивать по элементно, если все элементы совпали то нашёл совпадение

можешь добаить ешё один элемент в и тоге будет int mass[50][6]; в избыточный элемент будешь пемещать количество повторений, и !ставить маркер, то есть если нашёл в середине массива строку одинаковую с рассматриваемой, то маркируешь найденную -1. таким образом будешь проверять если маркер -1, то с этой строкой сравнивать не надо. ! и не забудь обнулить все ячейки в которые будешь маркер писать
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
12.11.2009, 13:04     Пятимерный массив #11
Продолжая развитие предложения TanT, ниже приведен код, с наличием избыточного элемента в массиве.
Предполагается, что в массив уже все данные занесены (в том числе в mass[i][5]==-1):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 bool fl;
 int count, i, i1, j;
 for(i=0; i<50; i++)
 {
     count=1;
     for(i1=i+1; i1<50; i1++) 
         if(mass[i1][5]==-1)
         {
             fl=false;
             for(j=0; j<5; j++)
                 if(mass[i][j]!=mass[i1][j])
                     fl=true;
            if(!fl)
            {
                mass[i1][5]=0;
                count++;
            }
 
         }
         if(mass[i][5]==-1)
            cout<<"Г‚Г*ðèГ*Г*ГІ: "<<mass[i][0]<<","<<mass[i][1]<<","<<mass[i][2]<<","<<mass[i][3]<<","<<mass[i][4]<<" ïîâòîðÿåòñÿ "<<count<<" Г°Г*Г§"<<endl;
 
 }
cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
12.11.2009, 14:08     Пятимерный массив #12
а если сделать динамический массив??? в нём будут ограничения???
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
12.11.2009, 14:24     Пятимерный массив #13
Цитата Сообщение от cristaloleg Посмотреть сообщение
а если сделать динамический массив??? в нём будут ограничения???
конечно.
cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
12.11.2009, 14:26     Пятимерный массив #14
в плане что можно указать любой размер???

C++
1
int *p = new int[100000000000000000000000000]
работать будет???
mamedovvms
2916 / 837 / 93
Регистрация: 30.04.2009
Сообщений: 2,624
12.11.2009, 14:48     Пятимерный массив #15
Цитата Сообщение от nill Посмотреть сообщение
есть 50 строк
в каждой по 5 переменных
что то я не догнал а как получился пятимерный массив, из за того что сказано 5 переменных, ну хорошо что про 50 не подумал
easybudda
Эксперт С++
9452 / 5465 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
12.11.2009, 16:56     Пятимерный массив #16
Цитата Сообщение от cristaloleg Посмотреть сообщение
в плане что можно указать любой размер???

C++
1
int *p = new int[100000000000000000000000000]
работать будет???
По идее размер объекта должен в size_t помещаться. Для массива переменных типа int
C
1
2
3
4
5
6
7
#include <stdio.h>
#include <limits.h>
 
int main(){
    printf("Maximum elements of int array is: %d\n", SIZE_MAX / sizeof(int));
    return 0;
}
то есть 1073741823
Но могу и ошибаться...

Добавлено через 52 минуты
К слову, 1073741823 элементов типа int - это 4 гига памяти...
cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
12.11.2009, 16:57     Пятимерный массив #17
эт всего или ток на одну плоскость?
easybudda
Эксперт С++
9452 / 5465 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
12.11.2009, 17:27     Пятимерный массив #18
Цитата Сообщение от cristaloleg Посмотреть сообщение
эт всего или ток на одну плоскость?
В каком смысле "на одну плоскость"?
Тип size_t - базовый беззнаковый целочисленный тип языка Си/Си++. Является результатом выполнения оператора sizeof. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива. Например, на 32-битной системе size_t будет занимать 32-бита, на 64-битной - 64-бита. Другими словами в переменную типа size_t может быть безопасно помещен указатель.
То есть максимальное количество элементов в массиве равно SIZE_MAX / размер одного элемента.
cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
15.11.2009, 10:56     Пятимерный массив #19
одномерные массивы(плоские), следовательно одна полоскость
двумерные массивы(объёмные(кубик)), следовательно одна 2 плоскости..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2009, 11:30     Пятимерный массив
Еще ссылки по теме:

Заполнить массив строк из файла. Массив заполняется, но выводится не корректно C++
C++ Дан массив. Записать во второй массив все элементы, не совпадающие с минимальным
Сжать массив, выбросив из него отрицательные элементы - массив становится пустым C++
Дан массив. Создать массив 2 из четных чисел первого массива C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
9452 / 5465 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
15.11.2009, 11:30     Пятимерный массив #20
Цитата Сообщение от cristaloleg Посмотреть сообщение
одномерные массивы(плоские), следовательно одна полоскость
двумерные массивы(объёмные(кубик)), следовательно одна 2 плоскости..
А... Ну двухмерные - это скорее квадратик, трёхмерные - кубик Но это всё условности. Для компьютера это длинная последовательность элементов, а как их обрабатывать - как (к примеру) строку из 100 элементов, или 10 строк по 10 столбцов - уже дело десятое. Максимальное адресуемое пространство для 32-битных систем - 4 гигабайта.
Yandex
Объявления
15.11.2009, 11:30     Пятимерный массив
Ответ Создать тему
Опции темы

Текущее время: 06:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru