Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Funkcje i zmienne static.

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:
Funkcje i zmienne static.

Postautor: Sławek5 » 11 paź 2005, o 06:04

Cześć.

Co oznacza zadeklarowanie funkcji jako static np static void Delay(void);

oraz jeżeli zmienną globalną (na samym początku programu przed wszystimi funkcjami) zadeklaruje jako static.

Rozumiem użycie static w jakiejś funkcji (we wnątrz) ale na samym początku.

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 11 paź 2005, o 07:54

funkcja lub zmienna globalna static to funkcja lub zmienna która jest widoczna tylko wewnątrz modułu (pliku) w którym jest zadeklarowana. To coś zupełnie innego niż static wewnątrz funkcji, gdy chodzi o to aby zmienna zachowywała swą wartość pomiędzy kolejnymi wywołaniami tej funkcji. Niestety, używane jest tu to samo słowo static.

Nie na początku programu, ale pliku (modułu). Program w C składa się z wielu plików. Wrzucanie wszystkigo do 1 pliku to robienie grochu z kapustą.

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 12 paź 2005, o 09:42

Mówiąc bardziej obrazowo, używając "static" w deklaracji funkcji możesz ją wywoływać wyłącznie w obrębie modułu w którym została ona zadeklarowana. Taka "lokalność" funkcji powoduje że w innych modułach mogą być zadeklarowane funkcje o tej samej nazwie. Jeżeli są deklarowane jako "static" to nie ma żadnego problemu. Trzeba jednak pamiętać że funkcje dostęne globalnie są "przykrywane" funkcjami zadeklarowanymi "static" w obrebie modułu. W większości kompilatorów C moduł to wszystkie funkcje i pozostałe zasoby zdefiniowane w pojedynczym pliku żródłowym .

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 13 paź 2005, o 04:16

Dzięki za odpowiedz. Dzięki Wam zrozumiałem o co chodzi.

A możecie mi doradzić jakąś dobrą książkę o c++ opisującą właśnie takie rzeczy.
Mam kilka opisujących c++, ale w żadnej takiego opisu nie znalazłem.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 13 paź 2005, o 12:22

3 tomowka Jerzego Grebosza - Symfonia C++, a jak zasmakujesz w programowaniu to kolejna ksiazka tego samego autora, ale juz 'tylko' 2 tomy - Pasja C++.

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 13 paź 2005, o 12:51

Grębosza polecam, ale tylko symfonię. Pasja jest moim zdaniem "przesłodzona".
Autor ma niewątpliwy talent do przystępnego tłumaczenia na trafnych przykładach, ale czasem (gł. w Pasji) przesadza i zamiast powiedzieć konkretnie snuje fabułę przykładu, której zrozumienie wymaga więcej wysiłku niż zrozumienie tego co przykład ma wyjaśniać.

Poza tym, Sławek (raczej) programuje uP w C a nie w C++, a symfonia opisuje C++ i tylko jej pierwszy tom się tu nada (mniej więcej).

Przyda się więc "Język ANSI C" panów Kernighana i Ritchie (twórcy języka).

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 13 paź 2005, o 14:29

A no moze i tak... nie przegladalem ponownie watku od poczatku, tylko ostetnie nieczytane posty. rzucilo mi sie w oczy C++, stad sugerowalem symfonie. Pasja.. no coz, moze troche, ale i tak niezla ksiazka.

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 13 paź 2005, o 18:13

Zła z pewnością nie jest :)

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 14 paź 2005, o 16:16

Przeglądałem obie pozycje Pasję i Symfonię. Mogę sobie pozwolić niestety tylko na jedną z tych pozycji. Jezeli moglibyscie wybrac to ktora jest lepsza.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 14 paź 2005, o 19:06

Nie ma lepsze... Pasja jest kontynuacja Symfonii.. i bez opanowania tego co jest w Symfonii (czy to przy jej lakturze czy samodzielnie, czy jeszcze innych zrodel) nie masz sie co za nia brac... btw. dla srednio ambitnych programistow material Symfonii starczy az nadto.

Ale caly czas (Symfonia i Pasja) mowimy o C++ czyli pisaniu programow na "duze" procesory, a nie uC.

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 paź 2005, o 19:35

dla srednio ambitnych programistow material Symfonii starczy az nadto.
być moze, ale kontenery i biblioteka STL to jednak rzecz bardzo przydatna każdemu
Ale caly czas (Symfonia i Pasja) mowimy o C++ czyli pisaniu programow na "duze" procesory, a nie uC.
Są też kompilatory C++ na uC, ale trzeba przyznać że sensowność pisania aplikacji w językach obiektowych na uC jest wciąż wątpliwa.

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 15 paź 2005, o 09:22

proszę o jeszcze jedną pomoc.
Mam dwa pliki. Jeden LCDLib.c z funkcjami opbsługi LCD, a drugi main.c z programem głównym. W pliku LCDLib.c jest zadeklarowana zmnienna na samym początku pliku jako globalna :
static char LCDUpdate;

natomiast w pliku main.c jest deklaracja też na samym początku jako extern:

extern char LCDUpdate;

i używam jej w programie głównym.

Próba kompilacji powoduje błąd typu undefined symbol LCDUpdate.

Nie wiem jak to naprawic.
Podejrzewam, że jest to zwiazane z tym co pisalicie wczesniej tzn zmienna LCDUpdate jest widziana tylko w tym module, ale czy uzycie extern nie powoduje uzyskanie dostepu do niej oraz jak zmienie deklaracje bez static to nie spowoduje to nieokreslonych i inicjalizacji tej zmiennej.

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 15 paź 2005, o 09:55

A po co Ci ta zmienna w programie głównym? Skoro ktoś zadeklarował ja jako static to znaczy że masz jej nie ruszać. I możesz sobie zrobić swoją zmienną o trj samej nazwie w swoim module, tez statyczną - dzięki "statyczności" nie będzie konfliktu.

Patrzysz za daleko, a trzeba czytac tylko to co jest napisane i nic więcej. extern używasz w pliku main, jak może on zmieniać cokolwiek w deklaracji (i definicji - to nie to samo!) tej zmeinnej w lib?? On tylko mówi kompilatorowi, żeby traktował nazwe jako zmienną tego a tego typu i nie przejmował się gdzie ona jest zdefiniowana (nie zadeklarowana). To zadanie dla konsolidatora.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 28 gości