Wyjście poza zakres wektora

0

Witam

Mam problem ze swoim programem i nie mogę zlokalizować problemu.. Program ma być prostą bazą danych (obsługa warsztatu). Uruchamia się on poprawnie, jednakże po wybraniu opcji wyświetlenia zapisanych danych wyskakuje błąd krytyczny, dotyczący wyjścia poza zakres wektora. Bardzo prosiłbym bardziej obeznanych ode mnie o pomoc :)

#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>

using namespace std;

void menu() {
	system("cls");
	cout << "Menu:" << endl;
	cout << "\t1:Dodaj zlecenie do bazy danych" << endl;
	cout << "\t2:Zlecenia w trakcie realizacji" << endl;
	cout << "\t3:Zlecenia zrealizowane" << endl;
	cout << "\t4:Zapisz wykaz napraw zrealizowanych" << endl;
	cout << "\t5:Wczytaj wykaz napraw zrealizwoanych" << endl;
	cout << "\tEsc:Koniec" << endl;
}

void witaj() {
	cout << "Witaj w programie obslugujacym warsztat samochodowy." << endl << endl << "Nacisnij dowolny klawisz, aby przejsc do Menu Glownego" << endl;

}

class Wtrakcie {
public:
	string marka;
	string model;
	int rocznik;
	string imie;
	string nazwisko;
	char usterka[100];
	int cenanetto;
	int cenabrutto;
}w1;

vector<Wtrakcie>wtr;
vector<Wtrakcie>::iterator x;

void NoweW() {

	cout << "Podaj marke:" << endl;
	cin >> w1.marka;
	cout << "Podaj model:" << endl;
	cin >> w1.model;
	cout << "Podaj rocznik:" << endl;
	cin >> w1.rocznik;
	cout << "Podaj imie wlasciciela: " << endl;
	cin >> w1.imie;
	cout << "Podaj nazwisko wlasiciela" << endl;
	cin >> w1.nazwisko;
	cout << "Podaj uszkodzony element" << endl;
	cin >> w1.usterka;
	cout << "Podaj koszt czesci plus robocizny NETTO" << endl;
	cin >> w1.cenanetto;
	cout << "Cena BRUTTO wynosi: " << w1.cenanetto + (23 * w1.cenanetto / 100) << endl;
	wtr.push_back(w1);
	_getch();

}

void Wybor() {
	cout << "Jezeli chcesz dodac zlecenie zrealizowane - WYBIERZ 1" << endl << endl
		<< "Jezeli chcesz dodac zlecenie w trakcie realizacji - WCISNIJ 2" << endl;

	int a;
	cin >> a;
	if (a == 1)
	{
		cout << "Nowe zlecenie ZREALIZOWANE:" << endl << endl;
		NoweZ();
	}
	if (a == 2)
	{
		cout << "Nowe zlecenie W TRAKCIE REALIZACJI" << endl << endl;
		NoweW();
	}
	if (a > 2)
		cout << endl << "Bledna wartosc. Naciscij dowolny klawisz, aby przejsc do Menu Glownego" << endl;

}



int main()
{
	witaj();
	_getch();
	int x;
	bool koniec = false;
	char znak;
	menu();
	do {
		if (_kbhit()) {
			znak = _getch();
			switch (znak) {
			case	'1':
				Wybor();
				_getch();
				menu();
				break;
			case '2':
				x = 0;
				while (x <= (sizeof(wtr) - 2))
				{
					cout << "zlecenie " << wtr[x].marka << wtr[x].model << endl;
					x++;
				}
				_getch();
				menu();
			case '3':
				//				Pokazzrealizowane();
				_getch();
				menu();


			}
		}
	} while (!koniec);

	_getch();
	return 0;
}
0
while (x <= (sizeof(wtr) - 2))

Huh? Przecież zwyczajny for czy odpowiednik for-each wystarczy - po co takie bajery?

0

Zmieniłem, ale efekt jest taki sam, jak poprzednio. Dodam tylko, że po próbie wyświetlenia elementy wyskakują poprawnie, tylko wraz z błędem :/

case '2':
				//x = 0;
				//while (x <= (sizeof(wtr) - 2))
				for (x = 0; x < (sizeof(wtr) - 1); x++)
				{
					cout << "zlecenie " << wtr[x].marka << wtr[x].model << endl;
					//x++;
				}
				_getch();
				menu();
2

Dlaczego zgadujesz składnię, zamiast spojrzeć w przykłady?

2
sizeof(wtr)

sizeof zwraca wielkość typu zmiennej, nie ilość elementów. Użyj metody size(). Albo ranged fora.

0

Takie pytanie, jakiego wyniku spodziewasz sie po sizeof(wtr)?

0

@kaczus:
Z tego co rozumiem działanie tych mechanizmów, to pętla for ma umożliwić wyświetlenie kolejnych pozycji dodanych do bazy. Sizeof(wtr) ma być ostatnim elementem w wektorze (tam powinno być chyba "sizeof(wtr)-1"), po którego wypisaniu pętla ma się przerywać. Chyba, że się totalnie mylę. Natomiast nijak nie mogę zaimplementować tego w sposób, jaki zasugerował kq, żeby to się uruchomiło poprawnie..

1

Coś takiego?

int main()
{
    witaj();
    _getch();
    int x;
    bool koniec = false;
    char znak;
    menu();
    do {
        if (_kbhit()) {
            znak = _getch();
            switch (znak) {
            case    '1':
                Wybor();
                _getch();
                menu();
                break;
            case '2':

               for(int x=0; x<wtr.size()-1; x++)
                {
                    cout << "zlecenie " << wtr[x].marka << wtr[x].model << endl;
                }
                _getch();
                menu();
            case '3':
                //              Pokazzrealizowane();
                _getch();
                menu();

            }
        }
    } while (!koniec);

    _getch();
    return 0;
}
0

Wszystko działa jak należy. Ten "-1" przy wtr.size() był jednak zbędny, bo ucinało pierwszą pozycję.

Dzięki bardzo za pomoc i cierpliwość :)

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