Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2013, 14:41   #11
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

почему программа не хочет удалять мне лекарства по имени?
Код:
void PharmV::del_name(const wchar_t *f)
{
	int q=0;
	int i = 0;
	pmedicines = vmedicines.begin();
	while (pmedicines != vmedicines.end())
	{
		if (wcscmp(vmedicines[i].get_name(), f) == 0)
		{
			vmedicines.erase(pmedicines);
			q++;
		}

		pmedicines++;
		i++;
	}
	if (q == 0) { cout << "не найдены данные" << endl; }
};
Diana528 вне форума Ответить с цитированием
Старый 21.11.2013, 14:56   #12
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Было бы неплохо увидеть хотя бы объявление метода get_name()
nikmoon вне форума Ответить с цитированием
Старый 21.11.2013, 14:59   #13
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

Код:
class Medicine//Класс Лекарство
{
  private: 
      static int count; 
      wchar_t name[lname];  
      int price; 
      friend class Pharmacy;
      
  public:  
         Medicine(); 
         ~Medicine();
         
void set_name(const wchar_t*); 
wchar_t* get_name();

void set_price(int); 
int get_price(); 

void show(); 
void read();
};
и определение
Код:
void Medicine::set_name(const wchar_t *r) 
{wcscpy(name, r);};
wchar_t *Medicine::get_name() 
{return &name[0];};
Diana528 вне форума Ответить с цитированием
Старый 21.11.2013, 15:04   #14
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Не знаю, код нормальный.
nikmoon вне форума Ответить с цитированием
Старый 21.11.2013, 15:08   #15
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

пишет такую ошибку - vector iterator not incrementable
Diana528 вне форума Ответить с цитированием
Старый 21.11.2013, 15:19   #16
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Хрень какая-то, или эта ошибка относится к коду, который не показан.
nikmoon вне форума Ответить с цитированием
Старый 21.11.2013, 21:48   #17
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

vmedicines у тебя все еще вектор, так же? )

Итератор для вектора фактически является указателем на элемент. Когда ты удаляешь что-то из средины вектора - следующие элементы сдвигаются на единицу ближе к началу. И итератор показывает уже на следующий элемент. А ты после этого увеличиваешь его еще раз, пропуская таким образом одно из значений.
Это продолжает работать (хоть как-то, с пропуском некоторых элементов) до тех пор, пока ты не удалишь последний элемент. После этого итератор показывает уже на vector.end(). И тогда он становится действительно not incrementable, потому что куда ж еще увеличивать-то. )
При этом стандарт языка вообще говорит о том, что любой итератор, показывающий на место за удаляемым элементом, перестает быть валидным. И такой код может падать вообще на первой итерации.
Чтобы как-то разрулить это, они решили возвращать из erase итератор на следующий за удаляемым элемент (или на vector.end(), если такого нет). Потому самый простой способ починить этот цикл -
Код:
	while (pmedicines != vmedicines.end())
	{
		if (wcscmp(pmedicines->get_name(), f) == 0)
		{
			pmedicines = vmedicines.erase(pmedicines);
			q++;
		} else //увеличиваем только если не было удаления
		pmedicines++;
	}
P.S. Вот из-за такой фигни в C++ не рекомендуется писать подобные вещи руками, для этого есть std::remove_if.
Son Of Pain вне форума Ответить с цитированием
Старый 22.11.2013, 16:08   #18
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

теперь ошибку пишет - Ошибка 8 error C2039: get_name: не является членом "std::vector<_Ty>" d:\мои документы\visual studio 2010\projects\laba.9\laba.7\pharma. cpp 541 1 Laba.9

Ошибка 10 error C2232: ->std::vector<_Ty>::erase: левый операнд имеет тип "class", используйте "." d:\мои документы\visual studio 2010\projects\laba.9\laba.7\pharma. cpp 543 1 Laba.9

Ошибка 7 error C2819: тип "std::vector<_Ty>" не имеет перегруженный "operator ->" d:\мои документы\visual studio 2010\projects\laba.9\laba.7\pharma. cpp 541 1 Laba.9

Последний раз редактировалось Stilet; 23.11.2013 в 13:29.
Diana528 вне форума Ответить с цитированием
Старый 22.11.2013, 17:23   #19
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Покажи весь код.
Son Of Pain вне форума Ответить с цитированием
Старый 23.11.2013, 08:53   #20
Diana528
Форумчанин
 
Регистрация: 13.02.2013
Сообщений: 221
По умолчанию

спасибо всем огромное) я разобралась..теперь все работает
Diana528 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
Сортировка Шелла и Шейкер-сортировка AleksandrMakarov Паскаль, Turbo Pascal, PascalABC.NET 11 11.03.2012 12:18
Сортировка массива методами предсортировки и слияния, и пирамидальная сортировка. lenny_24 Помощь студентам 2 17.04.2011 18:57
паскаль,одномерный массив,сортировка вставка,сортировка убывания,от максимального до конца немозг Помощь студентам 11 06.02.2010 21:57
Сортировка файлов в Explorer vs сортировка в Delphi mutabor Общие вопросы Delphi 11 04.09.2009 14:32