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

Tablice dynamiczne

Object Storage Arubacloud
0 głosów
168 wizyt
pytanie zadane 15 grudnia 2018 w C i C++ przez four Użytkownik (720 p.)

Mam w programie klasę przechowującą zmienne typu całkowitego int i mam napisać metode wpisującą nowy element do tablicy, w przypadku braku miejsca należy zwiększyć rozmiar tablicy dynamicznej. Mam coś takiego i niestety nie działa

void wpisz(int a)
{
    if(licznik<rozmiar)
       {
           tab[licznik]=a;
           licznik++;
       }
    else
        {
            int *pom1= tab;
            rozmiar++;
            tab = new int[rozmiar];
            for(int i=0; i<rozmiar; i++)
            {
                tab[i]=pom1[i];
            }
        }
        tab[licznik]=a;
        licznik++;
}

Mógłby ktos podpowiedzieć co jest nie tak

1 odpowiedź

0 głosów
odpowiedź 15 grudnia 2018 przez RafalS VIP (122,820 p.)

Mam nadzieje, że jest to metoda klasy a nie funkcja korzystająca z globalnych zmiennych: tab, licznik, rozmiar

Na pierwszy rzut oka dodajesz do tablicy 2 razy w przypadku gdy jest jeszcze miejsce w tablicy, no i wychodzisz poza zakres przy kopiowaniu:

        rozmiar++;
        tab = new int[rozmiar];
        for (int i = 0; i < rozmiar; i++)
        {
            tab[i] = pom1[i];
        }

gdzie rozmiar zostal juz inkrementowany. Kopiowane powinne być wartości od 0 do rozmiaru starej tablicy.

Móglbyś też zwalniać zapominany blok przy pomocy delete[]

Sugeruje też zmodyfikować tą linijke:

rozmiar++;

bo teraz za każdym razem tworzysz nową tablice. Lepsze byłoby np:

rozmiar *= 2;

 

komentarz 15 grudnia 2018 przez four Użytkownik (720 p.)

A co zmienić żeby dwa razy nie dodawać?? 

void wpisz(int a)
{
    int rozmiar1;
    rozmiar1=rozmiar;
    if(licznik<rozmiar)
       {
           tab[licznik]=a;
           licznik++;
       }
    else
        {
            int *pom1= tab;
            rozmiar *= 2;
            tab = new int[rozmiar];
            for(int i=0; i<rozmiar1; i++)
            {
                tab[i]=pom1[i];
            }
        }
        tab[licznik]=a;
        licznik++;
}

 

komentarz 15 grudnia 2018 przez RafalS VIP (122,820 p.)

2 ostatnie linijki funkcji są poza elsem co oznacza, ze jesli if bedzie prawdziwy to wykona taki kod:

           tab[licznik]=a;
           licznik++;
           tab[licznik]=a;
           licznik++;

 A generalnie ja bym to przerobil tak:

void wpisz(int a)
{
	int stary_rozmiar = rozmiar;
	if (licznik >= rozmiar)
	{
		int *tmp = tab;
		rozmiar *= 2;
		tab = new int[rozmiar];
		for (int i = 0; i < stary_rozmiar; i++)
		{
			tab[i] = tmp[i];
		}
		delete[] tmp;
	}
	tab[licznik++] = a;
}

 

komentarz 15 grudnia 2018 przez four Użytkownik (720 p.)

Mam jeszcze jedno pytanie jak mam tablice tworzoną w konstruktorze 

  Liczba(int size)
  {
  	 tab= new int[size];
  	 rozmiar=size;
  }

A w main pobieram od użytkownika rozmiar tablicy to jak następnie mogę stworzyć obiekt przechowujący max tyle elementów ile podał użytkownik?

komentarz 15 grudnia 2018 przez RafalS VIP (122,820 p.)
yyy, ten konstruktor robi dokładnie to co opisałeś. Z czym masz problem z wywołaniem konstruktora?
komentarz 16 grudnia 2018 przez four Użytkownik (720 p.)
Tak chodzi o wywolanie
komentarz 16 grudnia 2018 przez RafalS VIP (122,820 p.)

Powtórz podstawy programowania obiektowego, bo wywołanie konstruktora to są podstawy podstaw.

Na takie sposoby możesz to zrobić w C++. Wybierz sobie jedną.

Liczba liczba = Liczba(rozmiar);
Liczba liczba(rozmiar);
Liczba liczba{rozmiar};
Liczba liczba = Liczba{rozmiar};

Plus deklarajce typu zmiennej mozesz zamienic na auto w tych przypadkach:

	auto liczba = Liczba(rozmiar);
	auto liczba = Liczba{ rozmiar };

 

Podobne pytania

0 głosów
1 odpowiedź 194 wizyt
0 głosów
3 odpowiedzi 2,430 wizyt
pytanie zadane 21 września 2017 w C i C++ przez Ziom Początkujący (430 p.)
0 głosów
2 odpowiedzi 718 wizyt
pytanie zadane 2 marca 2017 w C i C++ przez Mateusz Ścigała Początkujący (280 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

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

...