Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Eclipse - Zmienne w oddzielnym pliku - widoczność zmiennch w plikach projektu.

grisha75 22 Sie 2012 14:41 1140 6
  • #1 22 Sie 2012 14:41
    grisha75
    Poziom 12  

    Mam problem... Widoczność zmiennych w różnych plikach projektu.
    Mam wieloplikowy projekt, który chciałbym modyfikować w eclipse. Zmienne mam zadeklarowane w pliku z funkcją main. Inne pliki projetu zmiennych nie widzą.
    Czy przenieść wszystkie zmienne do oddzielnego pliku i włączyć go przez include do każdego pliku (raczej chyba nie) czy w każdym pliku powtórzyć deklaracje zmienych poprzedzając je słowem extern (monotonne)?

    0 6
  • #2 22 Sie 2012 14:51
    stanleysts
    Poziom 27  

    extern, nie możesz zaincludować kilka razy tych samych zmiennych.

    0
  • #3 22 Sie 2012 18:49
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Wystarczy dodać do nagłówka danego modułu deklarację zmiennej (typ, nazwę) poprzedzoną słówkiem extern - nie ma potrzeby robić tego ręcznie dla każdego pliku, który używa takiej zmiennej.

    Tak czy siak, jak masz dużo zmiennych globalnych, to masz dużo problemów (;

    4\/3!!

    0
  • #4 22 Sie 2012 19:42
    grisha75
    Poziom 12  

    Freddie masz na myśli to, że w np w pliku zmienne.c mam te same zmienne co w pliku z funkcją main() ale poprzedzone "extern" i to dodaję na początku każdego pliku projektu innego niż ten zawierajacy main() jako include ?
    czyli np .
    zmienną int a=0, będąca w pliku z funkcją main , przepisuję do pliku który nazwę np zmienne.c ale zadelkaruję ją jako extern int a=0;
    problem w tym że to dużo pisania jak dużo linijek ze zmiennymi.

    Dlaczego uważasz że dużo zmiennych gloalnych to dużo problemów ?

    0
  • #5 22 Sie 2012 19:55
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Masz jakiś moduł, np od i2c - plik i2c.c zawiera funkcje i zmienne, plik i2c.h zawiera prototypy funkcji i zmienne globalne z "extern". Jeśli nie masz modułów w formie .c + .h to masz jeszcze więcej problemów.

    grisha75 napisał:
    Dlaczego uważasz że dużo zmiennych gloalnych to dużo problemów ?

    To jest znana prawda. Nad zmiennymi globalnymi ciężko zapanować, bo przecież możesz sobie je zmienić gdziekolwiek chcesz, kiedykolwiek chcesz, na wartość dobrą lub złą - bez jakiejkolwiek kontroli. Przydaje się stosowanie znanych z języków obiektowych mutatorów i akcesorów (jakie fantastyczne polskie nazwy!) - wtedy program staje się prostszy do opanowania i jest narażony na mniej błędów, ponieważ dostęp przez funkcje może podlegać pewnym prawom/zasadom, których nie ma przy dostępie bezpośrednim.

    http://c2.com/cgi/wiki?GlobalVariablesAreBad

    Programowanie to sztuka - można zrobić dwa programy, które działają dokładnie tak samo, ale w zupełnie innym stylu zostały napisane (zakładamy, że w tym samym języku). Jednak gdy za jakiś czas przyjdzie rozbudować te programy, albo wykorzystać część kodu gdzieś indziej, to wtedy takie rzeczy jak zmienne globalne lubią się mocno zemścić...

    Pomijamy tutaj rzeczy takie jak mechanizmy do komunikacji między wątkami (np program główny <=> przerwania), bo to akurat w większości przypadków można zrobić zmiennymi globalnymi dobrze, ale to jednak jest bardzo specyficzne zastosowanie. Oczywiście nie należy traktować zmiennych statycznych jako globalnych.

    Dla kontrastu powiem, że mam tutaj otwarty projekt z kilkudziesięcioma plikami (moimi) i nie ma tam ani jednej zmiennej globalnej... Da się, a korzyści jest wiele...

    4\/3!!

    0
  • #6 22 Sie 2012 20:59
    gaskoin
    Poziom 38  

    grisha75 napisał:
    Czy przenieść wszystkie zmienne do oddzielnego pliku i włączyć go przez include do każdego pliku (raczej chyba nie) czy w każdym pliku powtórzyć deklaracje zmienych poprzedzając je słowem extern (monotonne)?


    Przy programowaniu nie warto oszczędzać sobie roboty :)
    Najlepszym rozwiązaniem będzie przepisanie kodu do postaci, w której nie korzysta on ze zmiennych współdzielonych w ogóle.

    --
    Trochę się spóźniłem z odpowiedzią więc dodam

    Freddie Chopin napisał:
    Przydaje się stosowanie znanych z języków obiektowych mutatorów i akcesorów (jakie fantastyczne polskie nazwy!) - wtedy program staje się prostszy do opanowania i jest narażony na mniej błędów, ponieważ dostęp przez funkcje może podlegać pewnym prawom/zasadom, których nie ma przy dostępie bezpośrednim.


    Jeśli w połowie pisania programu stwierdzisz, że przy 300 odwołaniach do bezpośredniej zmiennej chcesz ją podzielić przez 3 i dodać do niej 2 to co wtedy ? :D Odwołując się do funkcji która wyciąga/ustawia zmienną możesz to załatwić w jednym miejscu. Pamiętaj - implementacja jest nieważna ! Operuje się na abstrakcji.

    0
  • #7 23 Sie 2012 16:12
    grisha75
    Poziom 12  

    Freddie Chopin napisał:
    Masz jakiś moduł, np od i2c - plik i2c.c zawiera funkcje i zmienne, plik i2c.h zawiera prototypy funkcji i zmienne globalne z "extern".
    Tak też zrobiłem, program faktycznie stał się bardziej przejrzysty i kompiluje się bezbłędnie :-) Dzięki.

    0