Obiekt gubi wartości po wyjściu z pętli

0

Cześć,

mam w moim odczuciu nietypowy problem z którym nie potrafię sobie poradzić.
Po krótce o co chodzi w programie, na początku podaję informację ile zestawów pomiarów będzie wczytywanych potem na początku linii ile pomiarów zawiera zestaw a potem same pomiary na zasadzie najpierw wartość pomiaru potem jego ilość. Do przechowywania pomiaru mam stworzoną klasę Pomiar a do trzymania tablicy pomiarów klasa Pomiary.

kod:

 

int main() {
    unsigned short int  iloscZestawow,
                        iloscPomiarow,
                        przechwyconaWartosc,
                        przechwyconaIlosc;
    
    cin>>iloscZestawow;
    Pomiary **tablicaZestawow = (Pomiary **) new Pomiary[iloscZestawow];
    
    for (int i = 0; i < iloscZestawow; i++) 
    {
        cin >> iloscPomiarow;
        Pomiary *pomiary = new Pomiary(iloscPomiarow);
        tablicaZestawow[i] = pomiary;

        for(int j=0; j<iloscPomiarow;j++)
		{
            //przechwytuje dwie kolejne liczby
            cin>>przechwyconaWartosc;
            cin>>przechwyconaIlosc;
            //tworze obiekt pomiar od przechwyconych wartosci
            Pomiar *pomiar = new Pomiar(przechwyconaWartosc, przechwyconaIlosc);
            tablicaZestawow[i]->tablicaPomiarow[j] = pomiar ;
			// w tym miejscu gdy wyswietlam stworozny pomiar wszystko jest ok
            tablicaZestawow[i]->tablicaPomiarow[j]->pokazPomiar();
        }

		// tutaj juz tablica czasami ma zmienione wartosci dla pomiaru
        tablicaZestawow[i]->wyswietlPomiary();
    }

I teraz o co chodzi. W momencie gdy wychodzę z pętli w pierwszym obiekcie z tablicy czasami zmieniają się wartości najlepiej zobaczyć to na obrazku.

user image

Najdziwniejsze jest to, że czasami wszystko działa a czasami nie :) jak widzicie podałem te same wartości i raz wczytało i przekazało je prawidłowo a za drugim razem zadziała się magia. Zauważyłem że gubi się tylko element 0 tablicy.

Z tego co wyczytałem wywołanie pętli tworzy nowy zakres (scope) i wszystko odbywa się na kopiach elementów i tutaj doszukuję się problemu, niestety nie rozumiem jak miałbym to obejść.

Będę wdzięczny za każdą sugestię i odpowiedź.
Jeżeli kod/zagadnienie jest niezrozumiały proszę pytać postaram się go dokładniej przedstawić.

1

Używaj std::vector, a Twoje problemy magicznie znikną.

Z kodu wynika, że nie chcesz tworzyć tablicy dwuwymiarowej, tylko tablicy wskaźników do obiektów typu Pomiary. Po kiego grzyba wskaźników? Dlaczego nie tablicy obiektów typu Pomiary? Tak czy siak błąd jest tutaj:

Pomiary **tablicaZestawow = (Pomiary **) new Pomiary[iloscZestawow];

new Pomiary[iloscZestawow] tworzy obiekty, a nie wskaźniki, więc potem

tablicaZestawow[i] = new Pomiary(iloscPomiarow);

nie ma sensu. Pewnie to UB, choć głowy nie dam.

0

Wielkie dzięki za podpowiedź.

W zadaniu problemem było ograniczenie czasu jakie mamy narzucone na wykonanie kolejnych testów. Bałem się, że po prostu nie zmieszczę się w czasie. A wiedząc że operacje na wskaźnikach są najszybsze chciałem to wykorzystać i stworzyć tablicę wskaźników do obiektów. No ale przecudowałem ;)

Faktycznie wystarczyło tworzyć zwyczajną tablicę obiektów a i tak zapas czasu miałem znaczny.

Jeszcze raz wielkie dzięki :)

0

Ale przecież te obiekty tak czy siak tworzysz. Czy to od razu, czy też potem za pomocą new, więc zupełnie nie widzę, niby na czym zaoszczędziłeś robią te cuda ze wskaźnikami.

A po drugie pozbądź się takiego myślenia

wiedząc że operacje na wskaźnikach są najszybsze chciałem to wykorzystać
bo najzwyczajniej w świecie nie wiesz co jest szybsze od czego. Kompilatory robią pierdylion optymalizacji i nie należy niczego zakładać na temat szybkości bez testów.

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