![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| massiv |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 27.9.2009 Репутация: нет Всего: нет |
Есть 2-е функции для работы с динамическими массивами (_push и _pop). Одна добавляет элемент в массив, другая удаляет элемент из массива. Вроде бы функции написаны правильно, и жаде делают то что нужно
1) есть массив с одним элементом : m = {A} (массив естественно динамический, это я для примера в фигурных пишу) 2) применяем функцию добавление элемента B в массив: _push(m, massiv_size, B), 3) получаем массив m= {B,B}, а должен быть равен {A,B} Собственно вопрос: почему так происходит? замечу что происходит так не всегда. Коды функций ниже: _pop:
_push
Если что то не понятно объяснил, спрашивайте. В конце концов могу полный код привести если понадобится |
||||
|
|||||
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: 2 Всего: 5 |
massiv, во первых, ставте критические секции на добавление и удаление, во вторых, не думаю что пробегатся фором по всему масиву при перезаписи - это правильный выбор.
-------------------- Иногда переменная - это просто переменная |
|||
|
||||
| massiv |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 27.9.2009 Репутация: нет Всего: нет |
не понимаю, поясните пож-ста
вы об этом участке в функции _push ? for (i = 0, j = 0; i < msize; i++) { if (mas[i] != pop_value) { mas[j] = mas[i]; j++; } } несколько способов перебрал...на мой взгляд этот самый простой и лаконичный для поиска и исключения заданного элемента pop_value из массива, если есть проще, подскажите пожалуста Я кажется понял что вы хотели сказать во втором, наверное на перезапись действительно может потратиться много времени особенно если массив большой, хорошо бы как то просто удалить этот элемент и сдвинуть массив, как то вот так : (A,B,C,D) -> (A, NULL, C, D) -> (A, C, D) но как это можно осуществить relloc-ом - непонятно.... Это сообщение отредактировал(а) massiv - 27.9.2009, 18:06 |
||||
|
|||||
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: 2 Всего: 5 |
massiv, функция memcpy или memmove
http://c2p.ru/c/func/strokovye-i-simvolnye Можна заюзать СТЛ контейнеры А чему вы удивляетесь? Представте себе ситуация когда два потока одновременно обращаются к вашим функциям...)) http://ru.wikipedia.org/wiki/%D0%9A%D1%80%...%86%D0%B8%D1%8F http://www.cyberguru.ru/programming/cpp/mu...ntro-page2.html Это сообщение отредактировал(а) Graf_h - 27.9.2009, 19:36 -------------------- Иногда переменная - это просто переменная |
|||
|
||||
| massiv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 27.9.2009 Репутация: нет Всего: нет |
Нет, в том то и суть, я защищаю участки использования этих функций мьютексами, так что в этом плане всё в порядке, я уверен. Остальное сейчас почитаю. Ага!на счёт критических секций, я уже ответил - использую мьютексы, STL контейнеры тоже отпадают, код написан на С и компиляется это всё под линуксом (забыл упомянуть) Это сообщение отредактировал(а) massiv - 27.9.2009, 22:56 |
|||
|
||||
| massiv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 27.9.2009 Репутация: нет Всего: нет |
Пытаюсь сделать с помощью memmove, но сталкиваюсь с проблемой :
Вопрос: как же скопировать остальные элементы, стоящие после исключаемого с помощью memmove? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
для этого есть RCU главное обеспечить барьеры перед изменением поинтера хотя для массивов int и этого не надо -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Graf_h |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: 2 Всего: 5 |
massiv,
Елементы, которы стоят до исключаемого или добавляемого елемента трогать вообще не нужно. Нужно только сдвигать те, которые после. realloc вам вообще не нужен. Сделайте как в СТЛ векторе зарезервируйте количество памяти, и если елементов станет больше, выделите в 2 раз больше памяти (так называемое перераспредиление). На мой взгляд - это логичней всего.
Это сообщение отредактировал(а) Graf_h - 28.9.2009, 09:30 -------------------- Иногда переменная - это просто переменная |
||||
|
|||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
Чем отличаются эти две строки? Надо &mas[index] и sizeof(int) умножать на количество оставшихся элементов. Как-то так -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: 2 Всего: 5 |
Andrey44, там вообще не нужно променжуточного масива.
Это сообщение отредактировал(а) Graf_h - 28.9.2009, 17:27 -------------------- Иногда переменная - это просто переменная |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
Но это-же ты писал? -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: 2 Всего: 5 |
Andrey44, да)). поспешил. извиняюсь.
Это сообщение отредактировал(а) Graf_h - 28.9.2009, 14:25 -------------------- Иногда переменная - это просто переменная |
|||
|
||||
| massiv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 27.9.2009 Репутация: нет Всего: нет |
немного не так, вот как :
memmove(mas+j, mas+j+1, (msize-j) *sizeof(int)); всем спасибо Это сообщение отредактировал(а) massiv - 28.9.2009, 17:07 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |