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

Problem ze wskaźnikami

VPS Starter Arubacloud
0 głosów
263 wizyt
pytanie zadane 16 marca 2018 w C i C++ przez Patryk01 Obywatel (1,270 p.)

Witam, uczę się C++ i jestem na etapie wskaźników oraz dynamicznego alokowania pamięci. Stwierdziłem, że najlepszym rozwiązaniem będzie praktyka, więc spróbowałem zrobić jedno zadanie. Polega ono na przepisaniu odwrotności wpisanych liczb. Kod wkleiłem poniżej, proszę Was o napisanie co  zrobiłem źle, i jak powinienem to zrobić. Użyłem do tego w/w dynamicznej alokacji pamięci, ale mam problem z przypisaniem podanych wartości do tablicy, a potem jej dekrementacji. Przypominam, że dopiero się uczę, więc prosiłbym o wyrozumiałość i o zrozumiałe wytłumaczenie. Pozdrawiam.

#include <iostream>

using namespace std;

int ile, n, liczba;

int main() {
	cin >> ile;
	for (int i = 0; i < ile; i++) {
		cin >> n;
		int *tab = new int[n];
		for (int j = 0; j < n; j++) {
			cin >> liczba;
			tab[j] = liczba;

		}
		for (int k = n; k > 0; k--)
		{
			cout << liczba << endl;
			tab--;
		}
	
	}
	system("pause");
	return 0;
}

 

3 odpowiedzi

+1 głos
odpowiedź 16 marca 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

#include <iostream>

using namespace std;

int ile, n, liczba;

int main() {
    cin >> ile;
    for (int i = 0; i < ile; i++) {
        cin >> n;
        int *tab = new int[n];
        for (int j = 0; j < n; j++) {
            cin >> liczba;
            tab[j] = liczba;

        }
        for (int k = n-1; k >= 0; k--)
        {
            cout <<tab[k]<< endl;
        }
        delete[] tab;
    }
    system("pause");
    return 0;
}

Co do kodu to poprawiłem dwie rzeczy.

Pierwszą rzeczą jest inicjalizacja tablicy. Tablice indeksujemy od 0 do n-1 elementów więc można wskazać na ostatni element tablicy przypisując jej wartość n-1.

  for (int k = n-1; k >= 0; k--)

Aby odwołać się do tablicy można użyć operatora operator[](int)

cout <<tab[k]<< endl;

Na końcu przebiegu pętli czyścimy tablice za pomocą operatora delete[]

+1 głos
odpowiedź 16 marca 2018 przez Dexterim Dyskutant (8,370 p.)

Po pierwsze w pętli

 for (int k = n; k > 0; k--)
        {
            cout << liczba << endl;

nie robisz nic ciekawego poza wyświetleniem n-razy zmiennej o nazwie liczba jeśli byś chciał wyświetlić tablice od tyłu to powinieneś się do niej odwał np. tab[k] w tym przypadku wyglądało by to tak:

 for (int k = n; k > 0; k--)
        {
            cout << tab[k] << endl;
}

Przy dynamicznym alokowaniu pamięci nie zalecane jest inkrementować bądź dekremontować wskaźnik tak jak to robisz w linijce nr. 20. Dzieje się tak z tego względu że pamieć zaalokowaną trzeba zwolnić czego Ty w swoim programie nie robisz. Potrzeba na koniec takiej linijki;

delete [] tab;

 Zmieniając wskaźnik zwalniasz nie tą pamięć którą wcześniej zaalokowałeś. 

komentarz 16 marca 2018 przez Patryk01 Obywatel (1,270 p.)
Dzięki wielkie ;)
komentarz 16 marca 2018 przez Patryk01 Obywatel (1,270 p.)

Kurcze napotkałem mały problem po zwolnieniu tablicy: 

komentarz 16 marca 2018 przez Dexterim Dyskutant (8,370 p.)
kod?
komentarz 16 marca 2018 przez Patryk01 Obywatel (1,270 p.)
#include <iostream>

using namespace std;

int ile, n, liczba;

int main() {
	cin >> ile;
	for (int i = 0; i < ile; i++) {
		cin >> n;
		int *tab = new int[n];
		for (int j = 0; j < n; j++) {
			cin >> liczba;
			tab[j] = liczba;

		}
		for (int k = n-1; k > 0; k--)
		{
			cout << tab[k] << endl;
		}
	
	}
	delete [] tab;
	system("pause");
	return 0;
}

 

komentarz 16 marca 2018 przez Dexterim Dyskutant (8,370 p.)
no to tak jak Ci kompilator mówi tab na tym poziomie nie istnieje. Zauważ że alokujesz pamięć tyle razy ile przechodzi pierwsza pętla for. Zatem musisz tyle samo razy ją dealakować. Twoje tab nie jest w zasiegu maina a w zasiegu pierwszej pętli więc dealkoacje musisz przrzucic do linjki 21. A i zdecyduj sie na jedną konwencje do klamer.
komentarz 16 marca 2018 przez Patryk01 Obywatel (1,270 p.)

Okej, już wszystko działa :) Dziękuję bardzo. A właśnie, zadanie robiłem ze spoj-a i mógłbyś mi powiedzieć dlaczego wyskakuje błąd kompilacji? Kod wygląda tak, a u mnie działa normalnie. 

#include <iostream>

using namespace std;

int ile, n, liczba;

int main() {
	cin >> ile;
	for (int i = 0; i < ile; i++) {
		cin >> n;
		int *tab = new int[n];
		for (int j = 0; j < n; j++) {
			cin >> liczba;
			tab[j] = liczba;

		}
		for (int k = n-1; k >= 0; k--) {
		
			cout << tab[k] << endl;
		}
		delete[] tab;
	}
	
	return 0;

 

komentarz 16 marca 2018 przez Dexterim Dyskutant (8,370 p.)
Spoj chyba daje informacje dlaczego sie nie kompiluje. Ale jak patrze na to co tu wkleiles to barkuje klamry zamykajacej maina
0 głosów
odpowiedź 16 marca 2018 przez nik Obywatel (1,640 p.)
W trzeciej pętli jak masz tab-- to ustawiasz wskaźnik na adres który nie jest dla niego zarezerwowany, co może powodować błędy podczas próby wykorzystania go, ale nie wykorzystujesz go więc jak dla mnie to program 100% legit :)

Podobne pytania

0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 16 marca 2018 w C i C++ przez grzechu79 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 124 wizyt
pytanie zadane 26 lutego 2017 w C i C++ przez Mikusbombro Użytkownik (990 p.)
0 głosów
1 odpowiedź 78 wizyt
pytanie zadane 21 stycznia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...