sta?e warto?ci w pliku c czy h

Apr 22, 2012 12 Replies

Cześć. Proszę powiedzcie mi czy jak mam tablicę np z wartościami funkcji sinus to te wartości powinienem umieścić w pliku .c czy .h (czy w pliku sin.c czy w pliku sin.h)? Jaka jest różnica jak umieszczę w jednym a w drugim? W kursie w EdW STM32 wartości umieszczono w sin.c natomiast w kursie AVR takie dane były w plikach .h



Przy okazji, spotkałem się z definicją funkcji która miała taki zapis. volatile unsigned char FUNKCJA(.....) {...}



Chodzi mi o użycie volatile w funkcji a nie w zmiennej. Po co i dlaczego?


slawek7 snipped-for-privacy@wp.pl napisał(a):

Odpowiedz sobie na pytanie, po co Ci w ogóle pliki .h. Jeśli masz plik. h. includowany tylko przez jeden plik .c to nie ma znaczenia, czy deklaracje zawarte w pliku .h będą w nim, czy w pliku .c. Pliki .h stosujemy, gdy chcemy funkcje z pliku .c udostępnić na zewnątrz. Wtedy inny plik .c może sobie includować taki plik .h żeby dostać deklaracje funkcji zdefiniowanych w tamtym pierwszym .c

Masz racje. Problem w tym ze informacji na temat jak poprawnie budowac program na uC nie ma, przy najmniej ja nie znam. Jeśli wiesz gdzie mozna o tym poczytacto bede wdzieczny

Masz racje. Problem w tym ze informacji na temat jak poprawnie budowac program na uC nie ma, przy najmniej ja nie znam. Jeśli wiesz gdzie mozna o tym poczytacto bede wdzieczny

przecież jest elektroda...

slawek7 snipped-for-privacy@wp.pl napisał(a):

Problem, który poruszyłeś nie jest specyficzny dla uC. Jest to jedna z podstawowych rzeczy w C ogólnie i możesz o tym poczytać w dowolnej książce/kursie na temat C. Nie ma tu z resztą jakiejś wielkiej filozofii. To, na co ewentualnie należy zwrócić uwagę, to czy przypadkiem jeden plik nie jest includowany kilka razy i nie ma błędu redefinicji. Stosuje się wtedy konstrukcje typu #ifndef żeby sprawdzić, czy dane makro nie było już definiowane.

Co do volatile to nie wiem, nie spotkałem się z tym w kontekście funkcji. Google zwraca niewiele i to w stosunku do metod klas a nie samodzielnych funkcji. Podejrzewam, że to akurat może być coś specyficznego dla uC.

Rozszerzenie to tylko konwencja, ALE w standardowym podejściu jeżeli zdefiniujesz zmienne w pliku nagłówkowym to będą one powielone dla każdego pliku .c który go dołączy. Jeżeli zdefiniujesz w .h jako extern a potem zdefiniujesz w .c to w wyniku będzie tylko raz.

Afaik volatile odnosi się do typu zwracanego (unsigned char) a nie do funkcji i jest w tym kontekście bez sensu.

The volatile statement tells the compiler that the variable is constantly changing.

Chodzi o optymalizację kodu przez kompilator. Zapobiega przenoszeniu kopii zmiennej do rejestru i wykonywaniu dalszych operacji na kopii. Potrzene np przy obsłudze przerwań.

kk snipped-for-privacy@a.pl napisał(a):

To ja wiem i stosuję, chodziło o volatile w kontekście typu funkcji.

Odppowiadając temu kto twierdzi ze zrodlwem wiedzy moze byc elektroda. To jakies nieporozumine. Sa tam super ludzie ktorzy potrafia zrozumiec poczatkujacego ale w kazdym dziale jest moderator ktory sami wiecie co robi albo pojawiaja sie inni uzykownicy. Potem jak sie zapytasz to az krew zalewa czytajac niektore nie na temat odpowiedzi

slawek7 snipped-for-privacy@wp.pl napisał(a):

Odpowiadasz mi, czy to znaczy, że ja kiedyś tak stwierdziłem?

Do mnie się nikt nie czepiał a odpowiedzi dostawałem, ale ja się mało tam udzielam. W każdym razie nie wiem po co piszesz o tym w tym wątku, on nie jest o Elektrodzie.

fakt .. może tu coś jest :

formatting link
Przykład deklaracji w funkcji jest, ale wyjaśnienia konkretnego przypadku nie widzę.

No i znowu lipa. Za szybko wkleiłem link. Nie ma tam odpowiedzi na zadane pytanie.

Ale sami przyznacie że uzycie volatile do funkcji jest "dziwne" Znalazlem to w tym programie mp3 pleyer:

formatting link

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required