Прога встает намертво при выделении памяти - C (СИ)
Формулировка задачи:
Всем привет. В универе пишем лабу по сортировкам. Надо сгенерировать массив уникальных чисел.
Юзаем такую функцию:
Данный код отлично отрабатывается на 5-30к, 40к и больше - слово "test3" не выводится и не выполняется следующая функция, смотрел по диагностики памяти, видно, что выделяется.
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"); }
Решение задачи: «Прога встает намертво при выделении памяти»
textual
Листинг программы
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); } }
Объяснение кода листинга программы
- Объявлены переменные:
number
- для хранения числового значенияi
иj
- для работы в циклахcache
- для временного хранения чиселcurrentIndex
- для отслеживания индекса текущего элемента в массивеcount
- количество элементов в массиве
- Инициализируется генератор случайных чисел
- Выделяется память под массив
cache
с помощью функцииcalloc
, которая возвращает указатель на начало блока памяти. Размер блока памяти определяется переменнойcount
, аsizeof(int)
указывает на размер памяти, выделяемой под каждый элемент массива. - В главном цикле происходит заполнение массива
cache
числами от 0 до 99. Цикл выполняется, пока текущий индекс не достигнет 100. - Каждое сгенерированное число проверяется на уникальность в массиве
cache
. Если число уже присутствует в массиве, то оно заменяется новым числом. - После заполнения массива
cache
числами, он передается в функциюmemset
, которая обнуляет все его элементы. - После выполнения всех итераций главного цикла, текущий индекс увеличивается на единицу.
- В конце функции происходит выделение памяти под массив
cache
с помощью функцииfree
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д