• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usuwanie elementu z listy przy pomocy funkcji 'erase'

Object Storage Arubacloud
0 głosów
449 wizyt
pytanie zadane 6 stycznia 2018 w C i C++ przez Łukasz Michalski Użytkownik (560 p.)
void zrealizuj_recepte(){  //Zakup lekarstwa z Apteki
string nazwa_leku, nazwa_apteki;
int numer_recepty,straznik=0;;
float koszt=0;
cout<<"\nPodaj nazwe apteki w ktorej sie znajdujesz: ";
cin>>nazwa_apteki;
fstream plik;              //ZEROWANIE PARAGONU
plik.open("Paragon.txt",ios::out);
plik<<"*******Paragon*******";
plik.close();
plik.clear();


cout<<"\nPodaj numer recepty ";
cin>>numer_recepty;

Recepta rec_pom,rec_pom2;
for(list<Recepta>::iterator i=lista_recept.begin(); i!= lista_recept.end(); ++i)
{rec_pom=*i;
if(rec_pom.numer_recepty==numer_recepty)
rec_pom2=rec_pom;

}


Lek lek_pom;
straznik=0;
for(list<Lek>::iterator i=lista_lekow.begin(); i!= lista_lekow.end(); ++i)
{
lek_pom=*i;

if(lek_pom.miejsce==nazwa_apteki&& lek_pom.nazwa==rec_pom2.lek.nazwa &&lek_pom.ilosc>=rec_pom2.ilosc )
{
    koszt=koszt+(rec_pom2.ilosc*lek_pom.cena);
    i->ilosc=i->ilosc-rec_pom2.ilosc;
    straznik=straznik+1;


fstream plik;
plik.open("Paragon.txt",ios::app);
plik<<"\n"<<rec_pom2.lek.nazwa<<" ilosc: "<<rec_pom2.ilosc<<" koszt: "<<rec_pom2.ilosc*lek_pom.cena;

plik.close();
plik.clear();

lista_recept.erase(i);


}

}
if(straznik==0)
{cout<<"\nUPS cos poszlo nie tak!";}
else
{lista_zrealizowanych_recept.push_back(rec_pom2);
//lista_recept.remove(numer);
cout<<"\nRecepta zostala zrealizowana";
};

//cout<<"\nKoszt zakupow wyniosl "<<koszt<<" zl"<<endl;
plik.open("Paragon.txt",ios::app);
plik<<"\n\nKoszt calkowity: "<<koszt<<" zl";
plik.close();
plik.clear();
}
||=== Build: Debug in Apteka (compiler: GNU GCC Compiler) ===|
C:\Users\Delfin\Desktop\Apteka\Apteka\Apteka\main.cpp||In function 'void zrealizuj_recepte()':|
C:\Users\Delfin\Desktop\Apteka\Apteka\Apteka\main.cpp|543|error: no matching function for call to 'std::__cxx11::list<Recepta>::erase(std::__cxx11::list<Lek>::iterator&)'|
C:\Programy\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\list.tcc|148|note: candidate: std::__cxx11::list<_Tp, _Alloc>::iterator std::__cxx11::list<_Tp, _Alloc>::erase(std::__cxx11::list<_Tp, _Alloc>::iterator) [with _Tp = Recepta; _Alloc = std::allocator<Recepta>; std::__cxx11::list<_Tp, _Alloc>::iterator = std::_List_iterator<Recepta>]|
C:\Programy\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\list.tcc|148|note:   no known conversion for argument 1 from 'std::__cxx11::list<Lek>::iterator {aka std::_List_iterator<Lek>}' to 'std::__cxx11::list<Recepta>::iterator {aka std::_List_iterator<Recepta>}'|
C:\Programy\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_list.h|1326|note: candidate: std::__cxx11::list<_Tp, _Alloc>::iterator std::__cxx11::list<_Tp, _Alloc>::erase(std::__cxx11::list<_Tp, _Alloc>::iterator, std::__cxx11::list<_Tp, _Alloc>::iterator) [with _Tp = Recepta; _Alloc = std::allocator<Recepta>; std::__cxx11::list<_Tp, _Alloc>::iterator = std::_List_iterator<Recepta>]|
C:\Programy\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\stl_list.h|1326|note:   candidate expects 2 arguments, 1 provided|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Nie mam pojęcia co jest nie tak. A chodzi o głupie usunięcie elementu z listy przy pomocy gotowej funkcji.

Kompilator wskazuję tą linijkę "lista_recept.erase(i);"

Z góry dzięki za pomoc

2 odpowiedzi

0 głosów
odpowiedź 6 stycznia 2018 przez Łukasz Michalski Użytkownik (560 p.)
void zrealizuj_recepte(){  //Zakup lekarstwa z Apteki
string nazwa_leku, nazwa_apteki;
int numer_recepty,straznik=0;;
float koszt=0;
cout<<"\nPodaj nazwe apteki w ktorej sie znajdujesz: ";
cin>>nazwa_apteki;
fstream plik;              //ZEROWANIE PARAGONU
plik.open("Paragon.txt",ios::out);
plik<<"*******Paragon*******";
plik.close();
plik.clear();


cout<<"\nPodaj numer recepty ";
cin>>numer_recepty;

Recepta rec_pom,rec_pom2;
for(list<Recepta>::iterator b=lista_recept.begin(); b!= lista_recept.end(); ++b)
{rec_pom=*b;
if(rec_pom.numer_recepty==numer_recepty)
rec_pom2=rec_pom;

}


Lek lek_pom;
straznik=0;
for(list<Lek>::iterator i=lista_lekow.begin(); i!= lista_lekow.end(); ++i)
{
lek_pom=*i;

if(lek_pom.miejsce==nazwa_apteki&& lek_pom.nazwa==rec_pom2.lek.nazwa &&lek_pom.ilosc>=rec_pom2.ilosc )
{
    koszt=koszt+(rec_pom2.ilosc*lek_pom.cena);
    i->ilosc=i->ilosc-rec_pom2.ilosc;
    straznik=straznik+1;


fstream plik;
plik.open("Paragon.txt",ios::app);
plik<<"\n"<<rec_pom2.lek.nazwa<<" ilosc: "<<rec_pom2.ilosc<<" koszt: "<<rec_pom2.ilosc*lek_pom.cena;

plik.close();
plik.clear();

lista_recept.erase(b);
//lista_recept.remove(rec_pom2.numer_recepty);

}

}
if(straznik==0)
{cout<<"\nUPS cos poszlo nie tak!";}
else
{lista_zrealizowanych_recept.push_back(rec_pom2);
//lista_recept.remove(numer);
cout<<"\nRecepta zostala zrealizowana";
};

//cout<<"\nKoszt zakupow wyniosl "<<koszt<<" zl"<<endl;
plik.open("Paragon.txt",ios::app);
plik<<"\n\nKoszt calkowity: "<<koszt<<" zl";
plik.close();
plik.clear();
}
||=== Build: Debug in Apteka (compiler: GNU GCC Compiler) ===|
C:\Users\Delfin\Desktop\Apteka\Apteka\Apteka\main.cpp||In function 'void zrealizuj_recepte()':|
C:\Users\Delfin\Desktop\Apteka\Apteka\Apteka\main.cpp|557|error: name lookup of 'b' changed for ISO 'for' scoping [-fpermissive]|
C:\Users\Delfin\Desktop\Apteka\Apteka\Apteka\main.cpp|557|note: (if you use '-fpermissive' G++ will accept your code)|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

 

Znalazłem błąd przy użyciu erase ale kompilator dalej nie puszcza. Ciekawi mnie ten komunikat "if you use '-fpermissive' G++ will accept your code"

komentarz 6 stycznia 2018 przez adrian17 Ekspert (344,860 p.)
Nie wrzuciłeś całego kodu, ani konkretnego błędu kompilatora, ani kawałka kodu w którym chcesz zrobić to usuwanie. Bez tych rzeczy raczej nikt nie będzie w stanie pomóc.

BTW to formatowanie jest kompletnie zepsute, tego się nie da czytać :/

BTW2 czemu std::list zamiast std::vector?
komentarz 6 stycznia 2018 przez the_danger Gaduła (4,800 p.)
Jakbyś normalnie formatował kod to byś wiedział dlaczego jest błąd.
komentarz 6 stycznia 2018 przez Łukasz Michalski Użytkownik (560 p.)

@adrian17, Wrzuciłem całą funkcję. Wiem, że źle formatuje ale dopiero się uczę programować, teraz wiem, że lepiej byłoby zrobić wektorami ale już tak zacząłem a projekt do oddania na poniedziałek.

Kompilator przyczepia się dokładnie do 46 linijki tj. lista_recept.erase(b);

Wrzuciłem wszystkie błędy jakie wyskoczyły w kompilatorze, bez tej linijki wszystko kompiluje się poprawnie

komentarz 6 stycznia 2018 przez Łukasz Michalski Użytkownik (560 p.)

@the_danger, Znalazłeś i się droczysz czy tak sobie napisałeś?

komentarz 6 stycznia 2018 przez adrian17 Ekspert (344,860 p.)

Kompilator przyczepia się dokładnie do 46 linijki tj. lista_recept.erase(b);

No bo jakby poprawnie sformatować kod, to on wygląda (z usunięciem nieważnych rzeczy) tak:

	Recepta rec_pom,rec_pom2;
	for(list<Recepta>::iterator b=lista_recept.begin(); b!= lista_recept.end(); ++b)
	{
		// ...
	}
	for(list<Lek>::iterator i=lista_lekow.begin(); i!= lista_lekow.end(); ++i)
	{
		if(...)
		{
			lista_recept.erase(b);
		}
	 
	}

W miejscu `lista_recept.erase(b); ` nie ma zmiennej `b`. Zmienna `b` jest zadeklarowana w pętli wyżej, ale nie istnieje poza tą pętlą.

0 głosów
odpowiedź 6 stycznia 2018 przez Łukasz Michalski Użytkownik (560 p.)

Coś jest nie tak z tym wskaźnikiem b.

Nie mogę go użyć w żadnym wypadku, przy próbie wpisania b->ilosc=1;

dostałem ten sam błąd tj;

error: name lookup of 'b' changed for ISO 'for' scoping [-fpermissive]|
 (if you use '-fpermissive' G++ will accept your code)|

 

Podobne pytania

0 głosów
2 odpowiedzi 971 wizyt
pytanie zadane 11 maja 2017 w C i C++ przez Isild Użytkownik (580 p.)
0 głosów
3 odpowiedzi 425 wizyt
+1 głos
2 odpowiedzi 969 wizyt
pytanie zadane 24 grudnia 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)

92,568 zapytań

141,420 odpowiedzi

319,620 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...