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

gdzie tkwi błąd w programie? (dynamiczna pamięć dla tablicy i jej odczyt)

0 głosów
92 wizyt
pytanie zadane 22 maja 2021 w C i C++ przez Arek Kowalski Początkujący (450 p.)

Witam 

Chciałem napisać program, który za pomocą dynamicznie stworzonej tablicy pozwoli zapisać z klawiatury jakieś dane a potem poprzez wskaźnik pozwoli wpisane wartości odczytać, niestety finalnie dane z komórek tablicy zwracane są błędnie (podawane są inne dane) - pomocy, gdzie strzeliłem bug'a?

# include <iostream>

using namespace std;

int main(){

    
    int ile, set, k;
    cout << "podaj ile liczb w tablicy: " << endl;
    cin >> ile;
    int var = ile;

    int *tablica;
    tablica = new int [ile];
    

    for ( int i =0 ; i < ile ; i++){
        cout << "podaj wartosc komorki tablicy [" << i << "]"<< endl; 
        cin >> set;
        *tablica = set;
        tablica++;
    }
    
    cout << "podales dane: " << endl;
   

    for (k = 0 ; k < var ; ++k){
        
        cout << k+1 << " tablica ["<< k <<"] = " <<tablica[k]<<endl; 
       
    }

    delete [] tablica;
    return 0;
}

 

1 odpowiedź

+3 głosów
odpowiedź 22 maja 2021 przez tkz Nałogowiec (41,900 p.)

Linia 20. i 21. do usunięcia, nie możesz inkrementować całego wskaźnika. 

*(tablica+i) = set;

 

komentarz 23 maja 2021 przez Arek Kowalski Początkujący (450 p.)
edycja 23 maja 2021 przez Arek Kowalski

dzięki - w sumie teraz działa ale nadal czegoś nie ogarniam ?

Dlaczego nie mogę inkrementować wskaźnika kiedy np. przy odczycie (po dodatkowej zmianie w programie zastosowałem inkrementację i działa <poniżej fragment działającego kodu>

for (k = 0 ; k < var ; ++k){
        
        cout << k+1 << " tablica ["<< k <<"] = " << * tablica <<endl; 
        tablica++;
       
    }

i jeszcze jeden fragment z kursu P. Zelenta (odcinek 10). ok 18:40 autor podaje przykład implementacji danej do szufladki tablicy a następnie inkrementacji szufladki właśnie w taki sposób jak chciałem na początku ale mi nie działało. Jak to wyjaśnić? Tam była inkrementacja całego wskaźnika 

1
komentarz 23 maja 2021 przez Oscar Nałogowiec (26,410 p.)
edycja 23 maja 2021 przez Oscar

Wskaźniki wolno inkrementować, ale trzeba być świadomym faktu, że taka operacja zmienia wartość wskaźnika i konsekwencji tej zmiany. To już dalej nie jest ta sama wartość wskaźnika co na początku. A ty potem indeksujesz tym zmienionym wskaźnikiem tablicę jakby on dalej wskazywał na jej początek. I jeszcze w szczególności delete musi dostać taką samą wartość wskaźnika, jaką zwrócił new.

Na tym screendumpie jest po prostu wyciek pamięci - nie jest zwolniona. No i jeszcze zła kolejność inicjowania zmiennych. Ten kod jest błędny. Ale są ślady poprawnego podejścia - mamy dwa wskaźniki - jednym (wskaznik) się bawimy, ale drugi (tablica) cały czas przechowuje oryginalną wartość, zwróconą przez new. Nigdy nie należy zmieniać ani zapominać tego co zwraca new.

 

Podobne pytania

0 głosów
1 odpowiedź 93 wizyt
pytanie zadane 8 czerwca 2020 w PHP przez patryk241 Użytkownik (700 p.)
0 głosów
2 odpowiedzi 539 wizyt
pytanie zadane 3 lipca 2018 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
1 odpowiedź 136 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez szachovy Początkujący (270 p.)

88,701 zapytań

137,308 odpowiedzi

306,748 komentarzy

58,894 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...