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

Dynamiczna tablica - zwiększanie na "żądanie" użytkownika

Object Storage Arubacloud
+2 głosów
203 wizyt
pytanie zadane 23 grudnia 2017 w C i C++ przez AnastaZIuk Początkujący (330 p.)

Witam,

mam problem z pewną sprawą dotyczącą wymuszenia zmiany wielkości tablicy za pomocą wpisywania przez użytkownika następnych wartości prosto do niej (Tablica na początku posiada 10 elementów, po czym zwiększa rozmiar dwukrotnie, jeśli zmienna nastepny_element (+ 1) wynosi nasz rozmiar - następuje skopiowanie wszystkiego, co znajduje się w "starej" tablicy, utworzenie nowej o żądanej wielkości i nadpisanie starej tą nową tak, że możemy dalej wpisywać nasze wartości do tablicy, aż nie osiągniemy limitu wielkości, po którym ponownie następuje dwukrotne zwiększenie i w kółko.

Kod:
 

#include <iostream>
#include <cstdlib>
 
using namespace std;
 
void drukujTablice(int *w_tablica, int rozmiar, int zajete_pola);
int *zwiekszTablice(int *w_tablica, int *rozmiar);
 
int main()
{
    int nastepny_element = 0;
    int rozmiar = 10;
    int *w_tablica = new int[rozmiar];
    int wartosc;
    cout << "Podaj liczbe: ";
    cin >> wartosc;
    while( wartosc > 0 )
    {
        system("cls");
        if(rozmiar == nastepny_element + 1)
        {
            w_tablica = zwiekszTablice(w_tablica, &rozmiar);
        }
        w_tablica[nastepny_element] = wartosc;
        nastepny_element++;
        cout << "Bierzace paramentry tablicy: " << endl;
        drukujTablice(w_tablica, rozmiar, nastepny_element);
        cout << "Podaj liczbe (0 - wyjscie z programu): ";
        cin >> wartosc;
        cout << "\n\n";
    }
    delete [] w_tablica;
}
 
void drukujTablice(int *w_tablica, int rozmiar, int zajete_pola)
{
    cout << "Calkowity rozmiar tablicy: " << rozmiar << endl;
    cout << "Liczba zajetych pol tablicy: " << zajete_pola << endl;
    cout << "Wartosc w tablicy: \n\n";
    for (int i = 0; i < zajete_pola; i++)
    {
        cout << "w_tablica[" << i << "] = " << w_tablica[i] << endl;
    }
    cout << "\n";
}
 
int *zwiekszTablice(int *w_tablica, int *rozmiar)
{
    int przypisz = *rozmiar;
    *rozmiar = przypisz * 2;
    int *w_nowa_tablica = new int[*rozmiar];
 
    for (int i = 0; i < *rozmiar; i++)
    {
        w_nowa_tablica[i] = w_tablica[i];
    }
    delete [] w_tablica;
    return w_nowa_tablica;
}



Problem zaczyna się w momencie, w którym program dochodzi do 40 elementu, występuje błąd, tak jakby mój kod przestawał być właścicielem i nie miałby dostępu do tej pamięci i próbował dokonać dereferencji(?) [Przepraszam, jeśli piszę w zły sposób, jeszcze nie rozumiem alokacji pamięci w 100% i wszystkich zagadnień związanych z tymi podstawami)

Prosiłbym o wyrozumiałość, wciąż się uczę i co ciekawe, jest to kod zawarty w książce Alexa Allaina pdt. "Przewodnik dla początkujących".

Może tablica nie zwiększa się, bo typ danych na to nie pozwala? Chociaż ta opcja wydaje mi się złudna

Prosiłbym o pomoc i wytłumaczenie, jeśli ktoś ma na to czas :/

komentarz 23 grudnia 2017 przez d0n Mądrala (6,440 p.)
w 53 linijce wykonujesz pętle po pamięci, która nie należy do tablicy w_tablica, dlatego że w rozmiar jest już nowa, dwa razy większa wartość, wiec w_tablica ma rozmiar / 2 elementow, a nie rozmiar elementow
1
komentarz 23 grudnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Proszę nie odpowiadać na pytania w sekcji komentarzy. Ukryj komentarz i napisz rozwiązanie w odpowiedzi.
1
komentarz 23 grudnia 2017 przez AnastaZIuk Początkujący (330 p.)
Dziękuję ci bardzo, zastanawiałem się nad tym i coś mi się wydawało, że kod próbuje dokonać dereferencji czegoś, czego nie powinien, ale nie pomyślałem nad tym

Trochę dziwne, że mam taki błąd w książce

Pozdrawiam i życzę wesołych świąt :)

1 odpowiedź

0 głosów
odpowiedź 24 grudnia 2017 przez d0n Mądrala (6,440 p.)
w 53 linijce wykonujesz pętle po pamięci, która nie należy do tablicy w_tablica, dlatego że w rozmiar jest już nowa, dwa razy większa wartość, wiec w_tablica ma rozmiar / 2 elementow, a nie rozmiar elementow

Podobne pytania

0 głosów
0 odpowiedzi 146 wizyt
0 głosów
0 odpowiedzi 178 wizyt
pytanie zadane 2 września 2022 w C i C++ przez Michalecekxd Użytkownik (830 p.)

92,628 zapytań

141,490 odpowiedzi

319,859 komentarzy

62,010 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!

...