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

Многократный сдвиг массива влево - C++

Восстановить пароль Регистрация
 
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
04.11.2012, 00:06     Многократный сдвиг массива влево #1
У меня есть массив , к примеру :
C++
1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Проходя по нему я проверяю является ли число не четным.Если нет , сдвигаю массив влево и освобождаю память занятую последним числом.

C++
1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 0 ; ilosc2 != i ; i++ ) // запускаем счетчик
        {   
            g = p[i];      // считываем число
            k = g%2; // проверяем делится ли оно  на 2
            if (k==1) // если нет 
     {
                for (int b=ш;ilosc2-1!=b;b++)    // сдвигаем массив влево
                {
                    zm2=p[b];
                    p[b-1]=zm2;
                }
                p = (int*)realloc(p,(ilosc2-1)*sizeof(int));// и освобождаем место последнего числа в памяти
В идеале, после прохода массив должен выглядеть так
C++
1
3 5 7 9 11 13 15 17 19 21
Но вся память почему-то не освобождается ,а занимается числом 21
C++
1
3 5 7 9 11 13 15 17 19 21 21 21 21 21 21 21 21 21 21 21 21 -33686019
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
04.11.2012, 00:35     Многократный сдвиг массива влево #2
maSt, какой-то бред пишете, если честно. К тому же, чтобы сдвинуть весь массив влево, достаточно только сместить указатель на головной элемент на 1 вправо. Но вместо выкидывания четных значений будет просто укорачиваться сам массив, и останется левый кусок, длиной N - Nчетных
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.11.2012, 00:56     Многократный сдвиг массива влево #3
Я вас разочарую, но из массива нельзя просто так взять и выкинуть реаллоком элемент из середины. И с конца тоже назвать это выкидываем можно с натяжкой. И ещё нельзя вызывать realloc(), передавая ему другой указатель, а не именно тот, который был выдан malloc() ранее.

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

И не забывайте у себя уменьшать счётичик с количеством элементов массива. А то вы вроде как "удалили" элементы оттуда, но почему-то продолжаете печатать мусор из памяти.
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
04.11.2012, 01:32  [ТС]     Многократный сдвиг массива влево #4
Понял, буду переделывать . Извините если код выглядит как-то "идиотически" я вообще рарбше не имел дела с освобождением памяти, а тут такое задание.
И когда переделаю, то для отрезки ненужной части опять таки использовать realloc или возможно это сделать через free?
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
04.11.2012, 01:44     Многократный сдвиг массива влево #5
maSt, вы пытаетесь надеть трусы через голову реализовать динамическую структуру данных (список) через статическую (массив)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.11.2012, 01:46     Многократный сдвиг массива влево #6
Да не идиотически, просто, эээ... нелогично. С точки зрения массивов. Если б это был связный список, то флаг в руки.

malloc()/calloc() выделяет вам кусок памяти и выдаёт указатель на его начало. Они же сохраняют в памяти информацию о том, что где выделено, чтобы free() потом могла отработать так, как надо. Или realloc(). Именно поэтому надо в free() или realloc() передавать строго тот же указатель, который вернула malloc(). Там весьма хитрая хореография внутри и не стоит её ломать.

Так что realloc(), если вам надо изменить размер выделенного куска.
Yandex
Объявления
04.11.2012, 01:46     Многократный сдвиг массива влево
Ответ Создать тему
Опции темы

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