Błąd wyświetlenia.

0

Witam.

Niestety nie mogę dojść gdzie popełniłem błąd. Problem dotyczy niewczytywania przypisanych wartości string'om.

Poniżej kod i screen w czym problem.

#include <iostream>
#include <string>
using namespace std;

class Zamowienie
{
private:
	string nazwa_produktu, data_zakupu;
	float cena_produktu, koszt_produktu;
	int liczba_sztuk, nr_produktu;
public:
	void zapisz_dane(int nr, string nazwa, float cena, string data, int liczba)
	{
		nr_produktu = nr;
		nazwa_produktu = nazwa;
		cena_produktu = cena;
		data_zakupu = data;
		liczba_sztuk = liczba;
	}

	void wyswietl_dane()
	{
		cout << "Produkt nr: " << nr_produktu << endl;
		cout << "Nazwa produktu: " << nazwa_produktu 
			<< ", cena produktu: " << cena_produktu 
			<< "zl, data zakupu: " << data_zakupu
			<< ", liczba sztuk: " << liczba_sztuk
			<< "." << endl;
	}

	string podaj_nazwe_produktu()
	{
		return nazwa_produktu;
	}
	float podaj_cene()
	{
		return cena_produktu;
	}
	string podaj_date_zakupu()
	{
		return data_zakupu;
	}
	int podaj_liczbe_sztuk()
	{
		return liczba_sztuk;
	}
	float podaj_koszt()
	{
		return koszt_produktu = liczba_sztuk * cena_produktu;
	}
};

int main() {
menu:
	Zamowienie z1;
	Zamowienie z2;
	int wybor = 0;
	cout << "Wybierz co chcesz zrobic:" << endl;
	cout << "1. Zamow produkt." << endl;
	cout << "2. Wyswietl produkt." << endl;
	cout << "3. Exit" << endl;
	cin >> wybor;
	switch (wybor)
	{
	case 1:
	{
		  dodaj:
			  system("cls");
			  cout << "Wybrales opcje zamowienia produktu." << endl << endl;
			  string nazwa, data;
			  float cena;
			  int liczba, nr;
			  cout << "Podaj nr produktu: "; cin >> nr;
			  cout << "Podaj nazwe produktu: "; cin >> nazwa;
			  cout << "Podaj cene produktu w zl: "; cin >> cena;
			  cout << "Podaj date zakupu produktu: "; cin >> data;
			  cout << "Podaj liczbe sztuk produktu: "; cin >> liczba;
			  z1.zapisz_dane(nr, nazwa, cena, data, liczba);
			  cout << endl;
			  cout << "Podaj nr produktu: "; cin >> nr;
			  cout << "Podaj nazwe produktu: "; cin >> nazwa;
			  cout << "Podaj cene produktu w zl: "; cin >> cena;
			  cout << "Podaj date zakupu produktu: "; cin >> data;
			  cout << "Podaj liczbe sztuk produktu: "; cin >> liczba;
			  z2.zapisz_dane(nr, nazwa, cena, data, liczba);
			  cout << endl;
			  goto menu1;
	}
	case 2:
	{
			  system("cls");
			  cout << "Wybrales opcje wyswietlenia produktu." << endl << endl;
			  z1.wyswietl_dane();
			  cout << "Calkowity koszt zamowienia wynosi - " << z1.podaj_koszt() << " zl." << endl << endl;
			  z2.wyswietl_dane();
			  cout << "Calkowity koszt zamowienia wynosi - " << z2.podaj_koszt() << " zl." << endl << endl;

			  goto menu2;
	}
	case 3:
	{
			  return 0;
	}
	}

menu1:
	int taknie = 0;
	cout << "Wybierz jedna z opcji:" << endl;
	cout << "1 - Chce dodac kolejny produkt." << endl;
	cout << "2 - Chce przejsc do menu glownego." << endl;
	cout << "3 - Chce zamknac program." << endl;
	cin >> taknie;
	switch (taknie)
	{
	case 1:
	{
			  system("cls");
			  goto dodaj;
	}
	case 2:
	{
			  system("cls");
			  goto menu;
	}
	case 3:
	{
			  return 0;
	}
	default:
	{
			   system("cls");
			   goto menu1;
	}
	}
menu2:
	int taknie1 = 0;
	cout << "Wybierz jedna z opcji:" << endl;
	cout << "1 - Chce przejsc do menu glownego." << endl;
	cout << "2 - Chce zamknac program." << endl;
	cin >> taknie1;
	switch (taknie1)
	{
	case 1:
	{
			  system("cls");
			  goto menu;
	}
	case 2:
	{
			  return 0;
	}
	default:
	{
			   system("cls");
			   goto menu1;
	}
	}
	system("pause");
} 

Przykładowe dane przy wprowadzeniu
user image

W miejscu czerwonych "kółek" powinien wyświetlać się wcześniej podane teksty "Andrzej", "10.05.2014", "Dupa" i "11.05.2015".
user image

6

Dostawałeś już porady, że używanie goto bez bardzo wyraźnego powodu to debilizm. Właśnie się na tym przejechałeś. W kodzie - po doprowadzeniu do jego kompilacji - masz UB - odczyt z niezainicjalizowanej zmiennej. menu jest przed definicją z1 i z2, więc w momencie goto menu te zmienne wychodzą z zakresu i są tworzone na nowo. To, że znajdują się w tych samych miejscach stosu powoduje, że wartości typów prostych są niezmienione - ale ich odczyt to UB, bo nie zostały zainicjalizowane.

  1. Nie używaj goto (mając kilka lat doświadczenia możesz wrócić do tej rady i ją zmienić na "używaj tylko w razie potrzby")
  2. Nie używaj nazewnictwa w konwencji foo, foo1, foo2, szczególnie jeśli do foo1 przypisujesz bar, a do foo2 - bar1. To jest bardzo nieczytelne.
  3. Nie używaj polskiego nazewnictwa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1