Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/58: Рейтинг темы: голосов - 58, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63

Динамический массив с большим количеством элементов

13.03.2013, 00:15. Показов 12650. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно создать динамический массив (каждый элемент целое положительное число до 10^9), который по введенным данным создавал N элементов массива, где N может быть до 10^5.

unsigned long int *arr = new unsigned long int[num];

Я сделал так, но если количество элементов больше 45920, то выводит ошибку
"terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
This application has requested the Runtime to terminate it in unuasual way.
Please contact the application's support team for more information."
IDE Qt Creator.
Статические массивы типа int array[1000000]; сразу выводят ошибку, причем в обоих случая изменение типа элементов массива ничего не меняет.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2013, 00:15
Ответы с готовыми решениями:

Создать с помощью new динамический массив с указанным количеством элементов
Так как пока что я учусь самостоятельно у меня нету проверяющего, поэтому прошу вас посмотреть все ли правильно я делаю. Задание:...

Применение массивов случайных чисел с большим количеством элементов
Само задание: Создайте две функции для решения одной и той же задачи: динамическое создание и заполнение случайными числами массива...

Сформировать новый массив С, переписав в него массив с большим количеством положительных элементов.
Ввести 2 одномерных массива А и В целого типа. Сформировать новый массив С, переписав в него массив с большим количеством положительных...

61
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
13.03.2013, 03:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
А если есть фрагментация ... + малое количество оперативки ...+ куча процессов жруших память
А для этого у винды есть VirtualAlloc
да и думать нужно когда пишешь, а не бездумно память выделять удалять
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 03:12
Как будто VirualAlloc поможет от фрагментации, которая уже есть.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.03.2013, 03:19
Цитата Сообщение от ValeryS Посмотреть сообщение
да и думать нужно когда пишешь, а не бездумно память выделять удалять
Ну вот и я говорю... не известно что там ТС задумал...
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 03:25  [ТС]
Со статическими объявлениями понятно - одномерный массив работает нормально, двумерный даже не создается из-за размера. Динамические не срабатывают. В этой программе кроме этих случаев операций с памятью нету. Оперативки 16 гб. Завтра буду разбираться с битсет и вектором, но я так и не понял, почему может тупить с созданием динамического массива таких размеров.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
13.03.2013, 03:25
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Как будто VirualAlloc поможет от фрагментации, которая уже есть.
конечно
резервируй в начале проги а не когда уже все загадил
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 03:27
Не, ну это-то понятно. Я про то, что она ни разу не поможет дефрагментировать кучу.

Выделить себе кусок с самого начала можно и без всяких VirtualAlloc (всё равно malloc() вызывает её при достаточно больших запросах памяти).
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
13.03.2013, 03:30
Цитата Сообщение от luck Посмотреть сообщение
Динамические не срабатывают. В этой программе кроме этих случаев операций с памятью нету. Оперативки 16 гб.
ты бы код скинул, а то так можно долго гадать

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Я про то, что она ни разу не поможет дефрагментировать кучу.
а я даже не знаю кто, в рамках языка, поможет дефрагментировать память
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 03:31  [ТС]
Да я по-моему уже скидывал все части, относящиеся к выделению памяти.
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
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
using namespace std;
unsigned long int func(unsigned long int);
//unsigned long int array[100000];
int main()
{
    unsigned long int i,j,num,res = 0;
    cin>>num; //Если num>45920, то ошибка
//    memset(array,0,100000);
    unsigned long int *arr = new unsigned long int[num];
    bool **mass = new bool*[num];
    for (i=0;i<num;i++)
        mass[i]= new bool[num];
    for (i=0;i<num;i++)
        for (j=0;j<num;j++)
            mass[i][j]=0;
    for (i=0;i<num;i++)
      scanf("%d",&arr[i]);
    for (i=0;i<num;i++)
     for (j=0;j<num;j++)
         if ((mass[j][i]==0) and (i!=j) )
                 if (func(arr[i])==func(arr[j]))
         {
                res++;
                mass[i][j]=1;
         }
    printf("%d",res);
    for (i=0;i<num;i++)
        delete[] mass[i];
    delete[] mass;
    delete[] arr;
    return 0;
}
 
unsigned long int func(unsigned long int a)
{
    if (a==0)
        return 0;
    if (a%2==0)
       return func(a/2);
    else
    {
         a=func(a/2)+1;
         return a;
    }
}
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
13.03.2013, 03:49
у меня на 1000000 нормально отработала
теперь несколько замечаний
Цитата Сообщение от luck Посмотреть сообщение
mass[i][j]=0;
для bool нет нуля есть true и false
следовательно вот это
Цитата Сообщение от luck Посмотреть сообщение
if ((mass[j][i]==0) and (i!=j) )
переписывается так
C++
1
if (!mass[j][i] && (i!=j) )
Цитата Сообщение от luck Посмотреть сообщение
for (i=0;i<num;i++)
* * * scanf("%d",&arr[i]);
Ты всерьез думаешь что пользователь будет с клавиатуры вгонять сто тысяч значений?
даже если по секунде на значения это 30 часов
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 03:52  [ТС]
олимпиадная задача, на том тесте, на котором я застрял из-за перебора памяти, было 56к значений)

На тестах проверки используется GCC 4.7, у меня Qt Creator - и там и там не сработало.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.03.2013, 03:55
Цитата Сообщение от ValeryS Посмотреть сообщение
для bool нет нуля есть true и false
чЁ ?
C++
1
if ((mass[j][i]==0) and (i!=j) )
А вот что такое and ?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 03:56
Цитата Сообщение от ValeryS Посмотреть сообщение
для bool нет нуля есть true и false
Ноль приводится к false.

Цитата Сообщение от luck Посмотреть сообщение
олимпиадная задача
Вот с этого надо начинать. Если это олимпиадная задача и она падает на проверочной системе, то 99%, что ваш алгоритм решения — го... не подходит. Целиком.

Цитата Сообщение от Avazart Посмотреть сообщение
А вот что такое and ?
Альтернативный токен. Пункт 2.6 стандарта.
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 04:00  [ТС]
Алгоритм сработал на 10 проверках. На 11 он не сработал, потому что значение num слишком большое, код ошибки - превышение ограничения памяти.
And это видимо моя привычка с паскаля =\
Странно, что на сях сработало.

Добавлено через 1 минуту
Даже если данное решение не пройдет тесты из-за использования массивов (причем я слабо представляю как обойти в отношении массива arr, хотя массив булевых элементов можно и обойти) - все равно он должен работать на моей машине, а это не так.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.03.2013, 04:12
Ммм... ОС у вас точно 64-битная?

А то 45920 x 45920 = 2108646400 = чуть меньше 2 гигабайт. Плюс ещё что-то на указатели, библиотеки и т. п. 2 гига — это предел виртуальной памяти на 32-битной Винде (без хитростей). Совпадает же.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
13.03.2013, 04:13
Цитата Сообщение от Avazart Посмотреть сообщение
чЁ ?
Те!
на то она и логическая переменная чтобы работать с логическими значениями
а то что 0 равен false, ничего не значит
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ноль приводится к false.
я с этим и не спорю
но писать нужно правильно
не пишут ведь
C++
1
 char c=0x41;
а пишут
C++
1
char c='A';
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.03.2013, 04:18
Цитата Сообщение от ValeryS Посмотреть сообщение
Те!
на то она и логическая переменная чтобы работать с логическими значениями
а то что 0 равен false, ничего не значит
Вы хотите сказать что может быть иначе ?
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 04:19  [ТС]
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
ОС у вас точно 64-битная?
64-битная. Но интересный факт, надо будет иметь в виду)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.03.2013, 04:22
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ммм... ОС у вас точно 64-битная?
А то 45920 x 45920 = 2108646400 = чуть меньше 2 гигабайт. Плюс ещё что-то на указатели, библиотеки и т. п. 2 гига — это предел виртуальной памяти на 32-битной Винде (без хитростей). Совпадает же.
Ну да гдето так у меня удавалось ужрать 1.7 Г до исключения...
Цитата Сообщение от luck Посмотреть сообщение
64-битная. Но интересный факт, надо будет иметь в виду)
Ну так а компилятор какой стоит ? Может из-за этого ?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
13.03.2013, 04:26
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
А то 45920 x 45920 = 2108646400 = чуть меньше 2 гигабайт.
да побольше будет
сначала выделяется память под 45920 указателя а они по 4 байта
Цитата Сообщение от luck Посмотреть сообщение
bool **mass = new bool*[num];
а только потом 45920 блока памяти по 45920 байт
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 63
13.03.2013, 04:27  [ТС]
Использую IDE Qt Creator, как проверить какой компилятор он использует? Или существует какой то стандартный Qt?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.03.2013, 04:27

Как преобразовать массив с большим количеством элементов в строку?
Есть ли функция преобразования массива в строку? допустим массив a={8765445678987654567898765212}, нужно что бы это была строка, а не...

Массив заполняется количеством элементов, большим, чем положено
Объясните, почему память ведь выделена статически, но заполняются больше элементов/печатается всё слово в котором явно не 2 символа?(просто...

Организовать динамический массив с заранее неизвестным количеством элементов
Вот задался вопросом: Как организовать динамический массив с заранее неизвестным кол-вом эл-тов? Т.е. например если пользователь сам...

Создать динамический массив с количеством элементов, которое вводит пользователь
Пользователь вводит размерность массива и его элементы. Создать динамический массив с количеством элементов, которые вводит...

Оперирование большим количеством элементов CheckBox
Постановка такая: понадобилась программка для просмотра карт прогноза с разной заблаговременностью. Часовые границы - от 6 до 180 часов...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru