1 / 4
Mar 2017

Temat, to kopia niedawno zadanego mi pytania i nie umiem [nie chce mi się?] na nie odpowiadać. Jeżeli jesteś początkującym programistą, i nie znasz odpowiedzi na to pytanie i ktoś wmawia Ci [pokazuje i używa], że jest inaczej [zmienne glob. są super duper], to sprawdż to sam, korzystając z innych źródeł informacji i sam o tym zadecyduj. Ja nie muszę tego sprawdzać ani udawadniać.

Malutki i tylko jeden, najmniej drastyczny, trochę naciągany przykład
działa, ale global i
///
int i;
main(){
.....
// dużo linijek kodu
for (; i < 10; ++i) // bo leniwy koder wierzy, że i jest globalne i równe zero, ale przy przeglądaniu kodu, trzeba to sprawdzić i szukać gdzie jest deklaracja i czy faktycznie i jest global
cout << i << endl;
..........

poprawnie - lokal i
main (){
..........
for (int i = 0; i < 10; ++i) // od razu widzę deklarację i inicjalizację zmiennej w jednym miejscu

Konkluzja:
Jeżeli nie wiesz czy zastosować zmienną lokalną czy globalną, moja rada, na razie zapomnij o zmiennych globalnych.

PS
Jeżeli nie możesz się tego [czemu glob jest fuj] dowiedzieć, ze swojego źródła [kursu], to może najwyższy czas rozglądnąć się za innym?

  • created

    Mar '17
  • last reply

    Apr '17
  • 3

    replies

  • 1.5k

    views

  • 3

    users

  • 3

    links

1 month later

Cóż to ja podam kontrprzykład.

Mamy zadanie tego typu: dostajesz na wejściu t < 1000 (liczba testów).
Każdy test składa się z liczby n i macierzy n x n czyli n*n + 1 liczb.
Na wyjściu należy wypisać macierz odbitą symetrycznie

Podejście używamy tylko zmiennych lokalnych może spowodować dostanie TLE przy poprawnym algorytmie (duże słowo do tego zadania).
Pierwsza wersja korzystająca z globalnych zmiennych: http://ideone.com/PrcStB26
Druga wersja korzystająca z lokalnych zmiennych: http://ideone.com/WCu73W24

Dobra oba programy działają tak samo, więc jaka jest różnica?
Ano taka, że po pierwsze druga wersja traci czas na alokowanie i kasowanie komórek pamięci gdzie pierwsza wersja ma to już raz zrobione. Ba trzeba przy takim podejściu wiedzieć co to są wskaźniki i jak deklarować pamięć.

Dlatego stwierdzenie jak nie wiesz co robić to rób lokalnie jest słabe (mówię tutaj o pisanie programów typowo pod spoj'a), trzeba posiadać trochę wiedzy.
Zmienne globalne wymagają abyś pamiętał o zerowaniu wartość.

Zmienne globalne wcale nie są be, są natomiast często wygodne. Oczywiście dobrze jest wiedzieć jak, i kiedy ich używać, ale to przecież dotyczy całego programowania :slight_smile:

Inna sprawa, że w rzeczywistych programach rzadko używam zmiennych globalnych (głownie jako wskaźniki lub jakieś kontenery), natomiast w rozwiązaniach zadań spoj-a większość to zmienne globalne.

Zaś stwierdzenie "jak nie wiesz co robić to ...." rozwinąłbym " ... nie próbuj programować"

Bardzo, bardzo, bardzo kiepski przykład. Powiem rekontra! :wink:
Gdybym mógł, powiedziałbym: - wybacz im ojcze, bo nie wiedzą co czynią.

W pierwszym przykładzie deklarujesz statyczną tablicę globalną, więc w drugim, powinieneś analogicznie zadeklarować [odpowiednio dużą] statyczną tablicę lokalną, a nie dynamiczną. W tym zadaniu nie ma też potrzeby kasowania [zerowania] zawartości tablicy ani na początku, ani w żadnym innym momencie. Wczytywanie powoduje za każdym razem nadpisywanie poprzedniej zawartości [a więc nie ważne, czy wcześniej były tam zera, czy inne śmieci]. Gdyby było inaczej, twoja globalna tablica musiałaby i tak być czyszczona wielokrotnie i to, że była zerowana na początku nic by nie pomogło. I to jest właśnie przykład wady [fujostwa] zmiennych globalnych. Autor kodu myśli, że jest ok, a przecież wcale nie jest

.

Możliwe, że to jest [p]omyłka literowa [zabrakło małego słówka "nie"], ale może jednak @reborn_withelm zupełnie nie wie co i oczym pisze?
Więc tylko powtórzę: wybacz im ojcze, bo nie wiedzą o czym mówią i piszą :wink:

PS
Mój przykład też jest słaby i dotyczy c++, ale poruszany problem nie dotyczy tylko c++ i nie napisałem też: jak nie wiesz co robić to..... Jeżeli chcesz, i uważasz, że zmienne globalne są dla CIebie wygodniejsze, to używaj.
Smutne jest tylko, że mieniący się informatykiem i wielkim dydaktykiem i propagatorem programowania w swoim wideokursie pokazuje zupełną indolencję i brak wiedzy na ten temat.

PS
Mógłbym podać przykłady, kiedy czasami ja sam używam zmiennych globalnych, bo oczywiście są fuj, ale jednak ...Mógłbym, ale nie mam zamiaru udowadniać, że wielbłąd jest garbaty lub nie i to twoja a nie moja decyzja jak programujesz czy raczej jak piszesz swoje kody i czy są na spoja czy gdziekolwiek indziej i na inną okazję. Chociaż przecież na spoju, powinieneś uczyć się i utrwalać dobrą praktykę programowania. Spoj tego nie ocenia, ale to TY bądż swoim własnym sędzią.

Suggested Topics

Want to read more? Browse other topics in Tutoriale, poradniki or view latest topics.