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

Dynamiczna tablica wskaźników na strukturę, rożne działanie w zależności od ilości elementów.

Object Storage Arubacloud
0 głosów
403 wizyt
pytanie zadane 14 lipca 2018 w C i C++ przez Łukasztu Nowicjusz (220 p.)

Witam,

Mam problem z kodem: 

#include <iostream>
#include <string>

using namespace std;

int main()
{
	struct uczen
	{
		string name;
		int age;
		float avg;
	};

	cout << "Podaj ilosc uczniow: ";
	int ile;
	cin >> ile;

	uczen *ps = new uczen[ile];

	for (int i = 0; i < ile; i++)
	{
		ps = ps + i;
		cin >> ps->name;
		//cin >> ps->age;
		//cin >> ps->avg;
	}
	cout << "\nWyswietlam baze danych: \n";

	ps = ps - ile + 1;

	for (int j = 0; j < ile; j++)
	{
		ps = ps + j;
		cout << ps->name << endl;
		//cout << ps->age << endl;
		//cout << ps->avg << endl << endl;
	}


	system("pause");
	return 0;
}

W zależności od wartości ile, mam rożne zachowanie programu,przy 1 i 2 wszystko jest w porządku,

przy 3 i więcej mam coś takiego, oraz w konsoli CMD losowe znaki i liczby. 

Czy ktoś potrafi zdiagnozować błąd? 

2 odpowiedzi

0 głosów
odpowiedź 14 lipca 2018 przez monika90 Pasjonat (22,940 p.)
edycja 14 lipca 2018 przez monika90

Gdybyś zamiast ps = ps + i; oraz ps = ps + j; miał ps = ps + 1; a zamiast ps = ps - ile + 1; miał ps = ps - ile; to by  to działało, (ps = ps + 1; powinno być na samym końcu ciała pętli).

Ale dlaczego nie napiszesz tego po ludzku, czyli

for (int i = 0; i < ile; i++)
    {
        cin >> ps[i].name;
        //cin >> ps[i].age;
        //cin >> ps[i].avg;
    }

bez żadnych dziwnych operacji na ps.

komentarz 14 lipca 2018 przez Łukasztu Nowicjusz (220 p.)
Ten sam kod pisze na kilka rożnych sposobów, aby się nauczyć, zobaczyć różnice, a te dziwne operacje, im dziwniejsze tym mydle ze więcej się uczę :D. Poprawiłem zgodnie ze wskazówkami i działa.

Możesz mi wytłumaczyć czemu mój sposób nie działał? z góry bardzo dziękuje :D
komentarz 14 lipca 2018 przez Łukasztu Nowicjusz (220 p.)

@monika90, jeszcze jedno, jak skasować tę strukturę, wpisując delete ps; lub delete[] ps; kompilator wyrzuca mi wyjątek podczas kompilacji

1
komentarz 14 lipca 2018 przez monika90 Pasjonat (22,940 p.)

Żeby wskaźnik przeszedł do następnego elementu tablicy należy go zwiększyć o 1, a Ty dodawałeś i, a i przyjmuje coraz to większe wartości, tak więc wskaźnik wyszedł daleko poza zakres tablicy.

Po ostatniej pętli również musisz skorygować ps instrukcją ps = ps - ile; i użyj delete[] ps; bo alokowałeś tablicę.

0 głosów
odpowiedź 14 lipca 2018 przez niezalogowany

Można też tak jeżeli chcesz poćwiczyć operacje na wskaźnikach:

    uczen *ps = new uczen[ile];

	for (uczen* i = ps; i != ps + ile; ++i)
	{
		cin >> i->name;
		//cin >> i->age;
		//cin >> i->avg;
	}
	cout << "\nWyswietlam baze danych: \n";

	for (uczen* i = ps; i != ps + ile; ++i)
	{
		cout << i->name << endl;
		//cout << i->age << endl;
		//cout << i->avg << endl << endl;
	}

Podobne pytania

0 głosów
1 odpowiedź 181 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez szachovy Początkujący (270 p.)
0 głosów
2 odpowiedzi 917 wizyt
pytanie zadane 3 lipca 2018 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
1 odpowiedź 279 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...