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.
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
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.
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.
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
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ą.
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ą.
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 .
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
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).
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).
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
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.
Ale caly czas (Symfonia i Pasja) mowimy o C++ czyli pisaniu programow na "duze" procesory, a nie uC.
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
być moze, ale kontenery i biblioteka STL to jednak rzecz bardzo przydatna każdemudla srednio ambitnych programistow material Symfonii starczy az nadto.
Są też kompilatory C++ na uC, ale trzeba przyznać że sensowność pisania aplikacji w językach obiektowych na uC jest wciąż wątpliwa.Ale caly czas (Symfonia i Pasja) mowimy o C++ czyli pisaniu programow na "duze" procesory, a nie uC.
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.
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.
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
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.
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.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości