Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Zadanie dotyczące Tablic C++


Rekomendowane odpowiedzi

Opublikowano

Witam. 

Napisałem rozwiązanie tego zadania jednak sędzia online uznaję to za błąd wykonania (SIGABRT)

 

 To jest treść zadania :

Odwróć kolejność elementów w tablicy.

Wejście
Najpierw liczba testów t (t ≤ 100). Następnie dla każdego testu liczba n (n ≤ 100) i n liczb oddzielonych spacjami.

Wyjście
Dla każdego testu n liczb w porządku odwrotnym niż na wejściu.

Przykład
Wejście:
2
7 1 2 3 4 5 6 7
3 3 2 11

Wyjście:
7 6 5 4 3 2 1
11 2 3

Tutaj kod:

#include <iostream>

using namespace std;
int t,l;
int main()
{
    cin>>t;
    for(int i=0; i<t; i++)
    {
        //////////////////////////////////
        cin>>l;
        int *tab;
        tab=new int[l];
        for(int j=0; j<l; j++)
        {
         cin>>*tab;
         tab++;
        }
        tab--;
        for(int k=0; k<l; k++)
        {
         cout<<*tab<<" ";
         tab--;
        }
        delete [] tab;
        //////////////////////////////////
    }
}

Co tu jest nie tak?

v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v
 

Opublikowano

Do delete nie przekazujesz oryginalnego wskaźnika. Wskazuje on na jednego inta do tylu, bo dekrementujesz go o jeden raz za dużo.

Polecam nie modyfikować wskaźnika, tylko odwoływać się do elementów poprzez operator indeksowania [].

Opublikowano

chodzi o to że chcę się nauczyć korzystania ze wskaźników na ten moment.
Czyli lepiej by było zrobić zmienną i przypisać jej np

int wskaznik=*tab 
I korzystać z wskaznika a *tab jako takiego w ogóle nie ruszać tak?

v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v
 

Opublikowano

I korzystać z wskaznika a *tab jako takiego w ogóle nie ruszać tak?

 
 
W zmiennej tab masz adres w pamięci i nie powinno się go edytować bo możesz go "zgubić" co później doprowadzi do memory leaka bo nie będziesz mógł usunąć pewnych wartości z heapu (sterty).
 
*tab to nic innego jak tab[0], idąc dalej *(tab + 1) to tab[1] itd.
 
Jak chcesz coś do tej tablicy wpisać to możesz to zrobić tak.
for(int j=0; j<l; j++)
{
    cin >> tab[j];
} 

lub tak

for(int j=0; j<l; j++)
{
    cin >> *(tab + j);
} 
 
Generalnie co sie dzieje w tym programie, że jest niepoprawny. Na czerwono tablica.

 

veZlL9i.png

 

 

01223928 to adres naszej tablicy który znajduje się w tab.

A już w *tab mamy to co się pod tym adresem znajduje czyli w tym wypadku liczba 1 zapisana w little endian. 

 

Później w pętli mamy przesuwanie wskąźnika na kolejne adresy dochodząc do 01223940

 

potem jest 

tab--;

i program wypisuje liczby cofając adres do tego miejsca 01223924

 

JIQzTeb.png

 

czyli nie wracamy na początek tablicy a 4 bajty wcześniej.

Następnie mamy

delete[] tab;

Czyli zamiast tablicy usuwamy to co było przed nią i program wywala błąd.

 

tnPqZgw.png

 

Żeby było jasne sama zmiana że program wróci na 01223928 nie sprawi, że będzie poprawny (powinien działać) ale ogólnie nie powinno się w ten sposób wykonywać operacji na wskaźnikach.

 

I tak samego tab nie powinieneś ruszać.

 

 

PS1: Każdy z tych adresów po każdym uruchomieniu będzie się zmieniał.

 

PS2: Dlaczego mówie o tab jako o zmiennej a nie wskaźniku. Ponieważ wskaźnik to właśnie "zmienna" która zajmuje 4 bajty / 32 bit (są jeszcze fat pointery ale to przy funkcjach i one zajmują > 4 bajty) jest alokowana na stosie i przechowuje ADRES do naszej tablicy a dokładniej jej początku. 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...