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

Odc. 10 - Wskaźniki, problem

Object Storage Arubacloud
+1 głos
287 wizyt
pytanie zadane 8 stycznia 2016 w C i C++ przez Wojtek Brzeziński Nowicjusz (170 p.)
edycja 8 stycznia 2016 przez Wojtek Brzeziński
Witam,

mam dwa pytania odnośnie tej części kursu:

1. W pierwszej części (dynamiczna alokacja pamięci) zastanawia mnie jedno - chcemy zarezerwować konkretną wartość komórek w pamięci dla tabeli. Ale nie do końca rozumiem, czym się różni użycie wskaźnika od zwykłego wywołania ilości danych w tabeli ( cin >> n) i potem jej utworzenie ( tab[n] ). To nie działa tak samo, że rezerwuje miejsca w pamięci dla tylu komórek, ile poda użytkownik?

2. W drugiej części nie działa mi program, jaki jest przedstawiany na filmie. Dla sprawdzenia pobrałem kod źródłowy. Jak to u mnie wygląda? Otóż najpierw kiedy chcę zmierzyć czas operacji dla tablicy bez wskaźnika, to po wpisaniu liczby komórek program wysiada. Ściągnąłem kod źródłowy, tam za linią delete [] tablica; jest jeszcze jedna linia tablica = NULL (której chyba nie ma w filmie). Po jej wpisaniu wszystko działa... ale jednak nie do końca.

Kiedy dochodzi porównanie, czyli dopisuje operacje na tablicy z wskaźnikiem, to już nie działa jak powinno - czas liczy się ok dla tablicy bez wskaźnika i potem się wysypuje, niezależnie czy przy drugim pomiarze na końcu jest tablica = NULL czy nie. Dla urozmaicenia, kod źródłowy, absolutnie nieruszany, też nie działa.  Co jest nie tak?

 

Dziękuje za wszystkie odpowiedz, pozdrawiam!

EDIT: Wstawiam kod źródłowy, o którym mowa powyżej. :)

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;

int ile;
clock_t start, stop;
double czas;

int main()
{
    cout << "Ile liczb w tablicy: ";
    cin>>ile;

    //dynamiczna alokacja tablicy
    int *tablica;
    tablica=new int [ile];

    //zacznij odliczac czas
    start = clock();
    //wczytywanie liczb do tablicy
    for (int i=0; i<ile; i++)
    {
        tablica[i]=i;
        tablica[i]+=50;
    }
    stop = clock();
    czas = (double)(stop - start) / CLOCKS_PER_SEC;
    cout<<"Czas zapisu (bez wskaznika): "<<czas<<" s"<<endl;

    delete [] tablica;

    //ponowna alokacja tablicy
     tablica=new int [ile];
     int *wskaznik=tablica;

    //zacznij odliczac czas
    start = clock();
    //wczytywanie liczb do tablicy
    for (int i=0; i<ile; i++)
    {
        *wskaznik = i;
        *wskaznik+=50;
        wskaznik++;
    }
    stop = clock();
    czas = (double)(stop - start) / CLOCKS_PER_SEC;
    cout<<"Czas zapisu (ze wskaznikiem): "<<czas<<" s";

    delete [] tablica;

    return 0;
}

2 odpowiedzi

+1 głos
odpowiedź 8 stycznia 2016 przez Porcupine Nałogowiec (31,560 p.)

Co do pierwszego punktu: jeśli chcesz stworzyć tablicę od wartości zmiennej powinieneś zawsze robić to korzystając z operatora new. To co podałeś z: int tab[n]; jest po prostu złe. Fakt - zwykle działa, ponieważ nowoczesne kompilatory to dopuszczają i korygują, jednak dalej pozostaje to nie poprawną deklaracją tablicy. Jest mały "wyjątek" tzn.:

const int N = 5;
int tab[N];

To jest w porządku, ponieważ zmienna N jest typu constant i nie będzie się zmieniać (czasem potrafi to bardzo uprościć kod, kiedy chcesz stworzyć statyczną tablicę, bo wiesz ile elementów Ci potrzeba, dzięki temu we wszystkich pętlach itd. możesz pisaś N zamiast konkretnej za każdym razem pisać wartość).

Co do drugiej części pytania - fajnie byłoby jakbyś wstawił kod, o którym mówisz :)

Pozdrawiam,

komentarz 8 stycznia 2016 przez Wojtek Brzeziński Nowicjusz (170 p.)
Myślę, że rozumiem już mój pierwszy problem, dzięki wielkie za pomoc!

Wstawiłem kod źródłowy w pierwszym poście. :)
komentarz 8 stycznia 2016 przez Porcupine Nałogowiec (31,560 p.)
I u Ciebie ten kod nie działa? U mnie wszystko ok.
Co do tego tablica = NULL - to samo delete [] tablica; zwalnia pamięć, która była zajmowana przez tablice, te wszystkie zaalokowane wcześniej komórki jednak sam wskaźnik tablica dalej istnieje z tym, że wskazuje na... no właśnie - nie wiadomo na co wskazuje, bo tablicy, na początek, której wskazywał już nie ma.
Dlatego tablica = NULL; po prostu przypisuje mu wartość NULL, żeby to tak skontrolować i żeby w przyszłości jeśli byś ponownie użył tego wskaźnika nie wskazywał na coś nieokreślonego.
komentarz 8 stycznia 2016 przez Wojtek Brzeziński Nowicjusz (170 p.)
Nie wiem co się stało, faktycznie nagle działa :o

Zrestartowałem kompilator, przekopiowałem i działa jak należy. Ale nie ma tego złego - dowiedziałem się, co oznacza ta linia tablica = NULL; Dzięki wielkie, pozdrawiam!
0 głosów
odpowiedź 8 stycznia 2016 przez niezalogowany
Też miałem ten problem. Jednak ktoś w komentarzu pod filmem napisał że należy zamienić te dwie linie kodu: tablica=new int [ile]; int *wskaznik=tablica; Na: int *wskaznik=tablica; tablica=new int [ile]; Dla mnie zadziałało. Było mowa o rezerwowaniu miejsca dla właśnie usuniętej tablicy, i że dlatego się program sypie... Co więcej tak chyba jest napisane w kodzie źródłowym danym do ściągnięcia pod tym odcinkiem.

Podobne pytania

0 głosów
3 odpowiedzi 206 wizyt
pytanie zadane 8 grudnia 2017 w C i C++ przez dretred Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 203 wizyt
pytanie zadane 9 marca 2017 w C i C++ przez Geralt_z_Rivii Nowicjusz (240 p.)
0 głosów
1 odpowiedź 179 wizyt

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

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

...