21 / 21 / 10
Регистрация: 13.08.2013
Сообщений: 295
1

Прога встает намертво при выделении памяти

28.12.2016, 21:20. Показов 357. Ответов 12
Метки нет (Все метки)

Всем привет. В универе пишем лабу по сортировкам. Надо сгенерировать массив уникальных чисел.
Юзаем такую функцию:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void generate_rnd_array(int * destinationArray, int count) {
    int number, i;
    int * cache = (int*)calloc(count, sizeof(int));
    printf("test");
    srand(time(NULL));
    printf("test2");
    for (i = 0; i < count; i++) {
 
        do 
        {
            number = rand() % count;
        }
        while (cache[number] != 0);
        cache[number] = 1;
        destinationArray[i] = number;
    }
    printf("test3");
}
Данный код отлично отрабатывается на 5-30к, 40к и больше - слово "test3" не выводится и не выполняется следующая функция, смотрел по диагностики памяти, видно, что выделяется.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2016, 21:20
Ответы с готовыми решениями:

Xenons X3A-6407SE встает намертво при печати
Принтер интерьерка xenons x3a 6407 se при печати бывает встанет намертво. и все. помогает только...

Как избежать утечки памяти при данном выделении памяти?
Всем привет. В проекте MFC делаю следующие манипуляции MY_STRUCT *ms = new MY_STRUCT();...

Встает система намертво
1. Купил Corsair Force LS SSD 60Гб. 2. Обновил прошивку на последнюю. 3. Установил проверенную...

Ошибки при выделении памяти
Добрый вечер. В коде я например выделял динамическую память. char *c=new char ; Но не...

12
1266 / 1024 / 469
Регистрация: 25.12.2016
Сообщений: 3,331
28.12.2016, 21:27 2
cache после выделения памяти забит мусором, нужно его забить нулями.

Добавлено через 1 минуту
P.S. Довольно необычный способ заполнения массива случайными числами. Можно было заполнить массив числами 0, 1, 2, ..., а потом перемешать случайным образом.
1
21 / 21 / 10
Регистрация: 13.08.2013
Сообщений: 295
28.12.2016, 22:00  [ТС] 3
Цитата Сообщение от likehood Посмотреть сообщение
cache после выделения памяти забит мусором, нужно его забить нулями.
Вроде calloc это делает в штатном режиме, но все равно попробовал, ничего не изменилось
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void generate_rnd_array(int * destinationArray, int count) {
    int number, i;
    int * cache = (int*)calloc(count, sizeof(int));
    for (i = 0; i < count; i++) {
        cache[i] = 0;
    }
    printf("test");
    srand(time(NULL));
    printf("test2");
    for (i = 0; i < count; i++) {
 
        do 
        {
            number = rand() % count;
        }
        while (cache[number] != 0);
        cache[number] = 1;
        destinationArray[i] = number;
    }
    printf("test3");
}
0
1266 / 1024 / 469
Регистрация: 25.12.2016
Сообщений: 3,331
28.12.2016, 22:57 4
---

Добавлено через 12 минут
Эх, случайно удалил предыдущее сообщение.
В общем, проблема в том, что rand() возвращает число от 0 до RAND_MAX, которое обычно равно 32767. Поэтому, если длина массива больше этого числа, алгоритм зацикливается. Один из способов решения проблемы - расширить диапазон случайных чисел:
C
1
number = (rand() + (rand() << 16)) % count;
1
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
29.12.2016, 00:48 5
Цитата Сообщение от likehood Посмотреть сообщение
cache после выделения памяти забит мусором, нужно его забить нулями.
Нет.

likehood, а чем malloc() и содержащийся там мусор не рандом?
0
С чаем беда...
Эксперт CЭксперт С++
9441 / 4935 / 1350
Регистрация: 18.10.2014
Сообщений: 11,492
29.12.2016, 01:31 6
Del
0
1266 / 1024 / 469
Регистрация: 25.12.2016
Сообщений: 3,331
29.12.2016, 07:35 7
---

Добавлено через 1 минуту
Цитата Сообщение от Вованя Посмотреть сообщение
Сообщение от likehood
cache после выделения памяти забит мусором, нужно его забить нулями.
Нет.
Ты прав. Я написал о этом в другом комментарии, но случайно его удалил
0
21 / 21 / 10
Регистрация: 13.08.2013
Сообщений: 295
29.12.2016, 21:23  [ТС] 8
Апну тему, теперь нужна реализация частично упорядоченного массива.
Сказали сделать, типо первые 100 элементов рандом от 0 до 100, вторые 100 элементов рандом от 100 до 200 и тд.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void generate_partially_ordered_array(int * destinationArray, int count) {
    int number, i, j;
    int * cache;
    int currentIndex = 0;
    srand(count);
    cache = (int*)calloc(count, sizeof(int));
 
    for (i = 0; i < (count / 100); i++) {
 
        for (j = 0; j < 100; j++) {
            do {
                number = (i * 100) + rand() % 99;
            } while (cache[number] == 1);
                cache[number] = 1;
                destinationArray[currentIndex++] = number;
        }
        memset(cache, 0, sizeof(int)*count);
    }
}
В конце цикла очищаю кэш для нового сравнения уникальных чисел.
Что не так?)
Без кеша нормально генерирует, но с дублями, естественно
0
С чаем беда...
Эксперт CЭксперт С++
9441 / 4935 / 1350
Регистрация: 18.10.2014
Сообщений: 11,492
29.12.2016, 21:34 9
Цитата Сообщение от grisha2217 Посмотреть сообщение
Что не так?)
Может вы сами нам сначала расскажете, что не так?
0
21 / 21 / 10
Регистрация: 13.08.2013
Сообщений: 295
29.12.2016, 21:48  [ТС] 10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Может вы сами нам сначала расскажете, что не так?
Функция не выполняется до конца (после выполнения функции стоит printf, который не выполняется). Скорее всего опять где-то зацикливается. Проблема в кеше.
0
1266 / 1024 / 469
Регистрация: 25.12.2016
Сообщений: 3,331
29.12.2016, 22:00 11
count кратно 100?
0
21 / 21 / 10
Регистрация: 13.08.2013
Сообщений: 295
29.12.2016, 22:15  [ТС] 12
Цитата Сообщение от likehood Посмотреть сообщение
count кратно 100?
500
0
1266 / 1024 / 469
Регистрация: 25.12.2016
Сообщений: 3,331
29.12.2016, 22:23 13
Цитата Сообщение от grisha2217 Посмотреть сообщение
number = (i * 100) + rand() % 99;
Нужно делить на 100, а не 99.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2016, 22:23

Ошибка при выделении памяти
Здравствуйте, друзья. Подскажите, пожалуйста, почему выскакивает ошибка при повторном выделении...

Ошибка при выделении памяти
что-то не так с выделением памяти, после запуска выдает ошибку, не могу понять где налажал...

Ошибка при выделении памяти
Когда убираю free(buf), то ошибки нету, а когда есть, то вылазит ошибка. Почему такое происходит? ...

Ошибка при выделении памяти
Вопрос: из-за чего программа может рушится? int *NRRow = new int ; int *NRow = new int ; int...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru