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

Sens wskaźników, zadanie na wskaźnikach C++ ( z wypisywaniem liczb Fibonaciego) w oparciu o 10. odcinek MZ

Object Storage Arubacloud
+1 głos
623 wizyt
pytanie zadane 30 czerwca 2017 w C i C++ przez Poczprogramista123 Bywalec (2,900 p.)
edycja 30 czerwca 2017 przez Poczprogramista123

Witam, jestem początkującym programistą i jak pewnie większość osób oglądający kurs pana MZ na YT potkneła się na 10. odc o wskaźnikach. Ja jako tako samą teorie wskaźników rozumiem i z logicznego punktu widzenia są przydatne (anegdota o rozkładzie jazdy autobusów, jaką pan MZ zastosował jest świetna) tylko gorzej z ich użyciem (głownie w programie w którym program pytał ile liczb fibonaciego ma wypisać i postanowiłem, że postaram się porównać czas działania tych programów na wskaźnikach i bez nich) związku z czym mam kilka pytań dotyczących mojego kodu w oparciu o te wskaźniki. Wszystko się kompiluje i działa, tylko właśnie ta różnica czasu jest dla mnie niezrozumiała, bo bez wskaźników działa szybciej i to mnie zbiło z nóg. Możliwe że kod jest zły, ale to już zostawię waszej ocenie poniżej. Liczę że wykażecie się wyrozumiałością i jak znajdziecie trochę czasu na podjęcie się rozwiązania mojego problemu to będę bardzo wdzięczny. 

 

Po pierwsze mój kod laugh

int odp; clock_t start,stop; double czas;
cout<< "ile liczb fib mam wypisac? "; cin>> odp; cout<<endl;
long double *wskaznik;
wskaznik= new long double [odp]; // nowy obszar w pamieci ogarniam
wskaznik[0]=1;  // ale tu już gorzej(przyznam żę robiłem metodą prób i błędów) 

wskaznik[1]=1;
long double *wsk=wskaznik;
for(int i=2; i<odp;i++)
{// wiem żę z * pracujemy na wartosci zmiennej
// ale własnie używając tej * wyskakuje błąd
    wsk[i]=wsk[i-1]+wsk[i-2];
}
//cout<< setprecision(10000);
start=clock();
for(int i=0;i<odp;i++)
{//no i tutaj z anegdoty o rozkladzie jazdy odczyt powinien być szybszy
cout<< "liczba "<<i+1<<". "<<*wsk++<<endl;
}
stop=clock();
czas=(double)(stop-start)/ CLOCKS_PER_SEC;
cout<< "czas z uzyciem wskaznikow zad z liczbami fib "<< czas<< endl<<endl<<endl<<endl;
delete[] wskaznik;


cout<< "ile liczb fib mam wypisac? "; cin>> odp; cout<<endl;
 long double lfib[odp];
 lfib[0]=1;
 lfib[1]=1;
 for(int i=2; i<odp;i++)
    {
        lfib[i]=lfib[i-1]+lfib[i-2];
    } //cout<< setprecision(10000);
   start=clock();
   for(int i=0;i<odp;i++)
   {// kom za każdym razem musi znales odpowiednia szufladke
       cout<< "liczba "<<i+1<<". "<<lfib[i]<<endl;
    }
    stop=clock();
    czas=(double)(stop-start)/ CLOCKS_PER_SEC;
    cout<< "czas bez wskaznika zad z liczbami fib "<< czas<< endl;

I pytanie czy jest dobry(bardzo liczę na korektę). Co do wyników to przy 4000 szufladek bez wskaźników 3.4  z wskaźnikami 4.3 ( oczywiście czas się zmienia za każdym razem, ale bez wskaźników zawsze jest krótszy)

Po drugie, czy bez tych wskaźników można się obejść. Nie ukrywam że są trochę irytujące i właśnie czy można je na chwile obecną zostawić i zacząć przerabiać kolejne filmy z kursu?

Na zakończenie przeglądając wpisy widziałem, że kiedyś ktoś poruszył podobny temat (ale nie w oparciu o ten program z wypisywaniem kolejnych liczb fibonaciego) i nie ukrywam że wprowadził spore zamieszanie w mojej głowie. I moje pytanie brzmi czy to wszystko prawda? link>>https://forum.pasja-informatyki.pl/210645/wskazniki-czy-kurs-pana-miroslawa-zelenta-zawiera-bledy-merytoryczne?show=210645#q210645 

Wiem, że trochę odgrzewane kotlety, ale wy kiedyś też pewnie tacy byliście cool. Z góry dzięki yes

 

 

komentarz 30 czerwca 2017 przez Molester Bywalec (2,920 p.)
Tak to prawda, jeżeli chodzi o wartość merytoryczną (z całym szacunkiem dla autora, bo prowadzi je w sposób ciekawy, pod względem tego że ma podejście do ucznia). Ale te poradniki są co najmniej słabe. Dużo było już tematów na tym forum odnośnie tego, więc nie ma co znowu się rozwodzić, jednak powinno się coś z tym zrobić (zaktualizować je, bądź też usunąć) bo de facto wprowadzają w błąd.
komentarz 1 lipca 2017 przez Poczprogramista123 Bywalec (2,900 p.)
Zgadzam sie. Pan MZ powinien zaktualizowac odcinek o wskaznikach bo badz co badz  sama teorie wytlumaczyl ale gorzej z zastosowaniem

1 odpowiedź

+1 głos
odpowiedź 30 czerwca 2017 przez NaviFox Dyskutant (8,950 p.)
Wskaźniki nie są po to żeby były szybsze. Wyobraź sobie, że przekazujesz dużą tablicę czy strukturę do funkcji albo obiekt, wtedy kompilator musi przydzielić dodatkową pamięć automatyczną na taki obiekt, dodatkowo przy przekazywaniu czegokolwiek przez wartość musisz tą wartość zwrócić w postaci kopii co w następstwie może zająć pamięć i czas procesora. A wystarczy przekazać jako argument wskaźnik i nie musisz poświęcać tyle samo miejsca w pamięci automatycznie operując na oryginale którego nie musisz zwracać a jeśli nie chcesz modyfikować oryginału dajesz kwalifikator "const" i już. Poza tym użyłeś w programie dynamicznego przydziału pamięci, zrób to bez wskaźnika :). Wskaźniki nie są takie straszne, to tylko pierwsze wrażenie w porównaniu z tym co cię dopiero czeka w przygodzie z programowaniem :). Okazują się bardzo pomocne i niezbędne jest nauczenie się ich w C/C++ i razem z nimi od razu zalecałbym uczenie  się smart pointers https://msdn.microsoft.com/pl-pl/library/hh279674.aspx .
komentarz 1 lipca 2017 przez Poczprogramista123 Bywalec (2,900 p.)
Bardzo dziekuje za odpowiedz i wytlumaczenie. Zaskoczyl mnie Pan zdaniem ze wskazniki nie sa od tego by byly szybszee. W odcinku 10 Pan MZ w drugim punkcie wymienil wlasnie w zaletach wskaznikow ze sprawiaja szybszy odczyt i zapis. Co do przekazywanie funkcjom orginalnych  zmiennych to racja to jest napewno przydatne. Czyli rozumiem ze mam pominac ogolnie ten drugi punkt i ten program ba wskaznikach?
komentarz 1 lipca 2017 przez NaviFox Dyskutant (8,950 p.)
To nie tak. Popatrz na to z innej strony. Jeśli przekażesz wskaźnik jako argument do funkcji operując na oryginale to czy funkcja nie będzie działać szybciej nie musząc dodatkowo poświęcać pracy procesora i pamięci automatycznej na stworzenie kopii argumentu? To nie wskaźnik ma być szybszy od zmiennej tylko program może być szybszy gdy w odpowiedni sposób użyjesz wskaźników i to jest faktem.

Podobne pytania

0 głosów
1 odpowiedź 529 wizyt
0 głosów
3 odpowiedzi 570 wizyt
pytanie zadane 26 czerwca 2018 w C i C++ przez Bartaz Początkujący (440 p.)
0 głosów
1 odpowiedź 1,137 wizyt
pytanie zadane 3 stycznia 2016 w C i C++ przez CichoCiemny Początkujący (480 p.)

92,552 zapytań

141,399 odpowiedzi

319,533 komentarzy

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

...