Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

czwartek, 10 lutego 2011

Kurs języka C: Stałe


Autor: Dondu

Kurs języka C: Spis treści

Stała to "jakby" zmienna, ale bez możliwości zmiany wpisanej do niej wartości.

Stałe definiuje się tak samo jak zmienne podając jej typ, nazwę i wartość, co pozwala kompilatorowi na kontrolowanie poprawności jej używania w pisanym kodzie. Szczegółowe zasady są takie same jak dla zmiennych (czytaj w dziale o zmiennych).


Stałe definiujemy jak zmienną poprzedzając słowem const.

Przykład 1 (w kompilatorze)
  //definiujemy stałe
  const char   ilosc_koni =23;
  const int    ilosc_krow = 5;
  const float  ciezar =170.5f; //f - ponieważ domyślnie ułamkowa liczba to double,
                              //a zmienna ciezar ma być typu float
  const double dlugosc =12344.17;   

Przekonajmy się co się stanie, gdy spróbujemy zwiększyć stałą o jeden.
Załaduj przykład nr 2 w kompilatorze CManiak i dokonaj kompilacji.

Przykład 2 (w kompilatorze)
  //definicja stałej
  const int  ilosc_krow = 5;

  //próba zwiększenia o jeden wartości stałej 
  ilosc_krow++;

Podobnie, gdy spróbujemy ponownie zdefiniować stałą.
Zobacz w kompilatorze CManiak. co się stanie po skompilowaniu przykładu nr 3.

Przykład 3 (w kompilatorze)
  //definiujemy stałą
  const int  ilosc_krow = 5;

  //próba ponownego zdefiniowania stałej
  const int  ilosc_krow = 67;


Stałe globalne

Tak jak w przypadku zmiennych stałe mogą być zdefiniowane jako globalne, przez co stają się dostępne w dowolnej części programu.

Przykład 4 (w kompilatorze)
//definicja stałej globalnej
const char  ilosc_koni;

void jakas_funkcja(void){
  //stałe globalne są dostępne w tej funkcji  
  printf("w funkcji ilosc_koni = %d \n", ilosc_koni);     
}

int main(void)
{
  
  jakas_funkcja();  //wywołaj funkcję

  //stałe globalne są dostępne w main()
  printf("w main() ilosc_koni = %d \n", ilosc_koni);     
  
  return 0;
}


Stałe lokalne

Tak samo jak w przypadku zmiennych definiowana lokalnie stała, przykrywa stałą zdefiniowaną globalnie. Sprawdź w kompilatorze CManiak przykład nr 5.

Przykład 5 (w kompilatorze)
//definicja stałej globalnej
const char  ilosc_koni = 23;

void jakas_funkcja(void){

  //definicja stałej lokalnej w funkcji 
  //przykrywa definicję stałej globalnej o tej samej nazwie
  const char  ilosc_koni = 100;
  
  //stałe globalne są dostępne w tej funkcji  
  printf("w funkcji ilosc_koni = %d \n", ilosc_koni);     

}

int main(void)
{
  
  jakas_funkcja();  //wywołaj funkcję

  //stałe globalne są dostępne w main()
  printf("w main() ilosc_koni = %d \n", ilosc_koni);     
  
  return 0;
  
}


Kurs języka C: Spis treści

18
Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

6 komentarzy:

  1. A co z #define? Można tak definiować stałe wartości? Również nie da się ich zmieniać podczas programu. Są tego jakieś konsekwencje?

    OdpowiedzUsuń
    Odpowiedzi
    1. W moim odczuciu stosowanie np. "#define JAKAS_NAZWA 14" ma wady i zalety. Zaletą jest to, że stała nie jest wtedy typową zmienną, bo to preprocesor podmienia każde wystąpienie JAKAS_NAZWA w kodzie na przypisaną stałą o wartości 14. Jeśli więc kod da się przetłumaczyć na instrukcje nie odwołujące się do komórki pamięci, tylko mające wpisaną wprost wartość, to tak to chyba jest robione (może obecnie kompilatory są takie mądre, że i przy stałych tak robią, jeśli sytuacja pozwala?), co oszczędza konieczność odczytu z RAM. Kolejna sprawa, jeśli wartość zaszywana jest w instrukcji, to nie zajmuje niepotrzebnie RAMu, do którego kopiowane są domyślnie zmienne.
      Wadą natomiast jest gorsza kontrola nad rozmiarem / typem zmiennej oraz, co czasem jest nie do przeskoczenia, utrata standardowych mechanizmów dotyczących zmiennych, czyli przekazywanie adresów, wskaźników, inkrementacja/dekrementacja adresów i skakanie jak po tablicy zmiennych...

      Usuń
    2. Z wymienionymi przez ciebie wadami się zgodzę, ale z zaletami jużnie. Obecnie kompilatory są sprytne, a właściwie zawsze były. Problem w tym, że wiele osób nie informuje kompilatora o swoich zamiarach. Wystarczy zdefiniować stałą w C jako np. static const i już nie będzie potrzeby użycia w tym kontekście #define.

      Usuń
  2. Define omówię (w przyszłości) osobno, bo dot. preprocesora.

    OdpowiedzUsuń
  3. I jak? Może by coś skrobnąć na temat dyrektywy #define ?

    OdpowiedzUsuń
    Odpowiedzi
    1. ... tylko ten czas ... dlaczego nie jest z gumy? :-)

      Usuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.