<< | NXC základy | Proměnné a datové typy >>

Části programu

  • NXC program se skládá z bloků kódu a proměnných
  • typy kódových bloků
    • Úlohy
    • Funkce
    • Makra a definice
  • maximální úloh a funkcí je 256

Úlohy - tasky

  • úloha je samostatný program definovaný klíčovým slovem task a pojmenovaný libovolným identifikátorem
  • úloha může běžet samostatně a zároveň souběžně s jinou úlohou (vícevláknové zpracování dat)
  • program musí obsahovat hlavní úlohu main, která se spustí při každém spuštění programu
  • tělo úlohy se skládá ze seznamu příkazů

Zápis úlohy

task jmeno()
{
  // seznam příkazů
} 

Řízení úloh

  • jedna z úloh (například main) může řídit běh jiných úloh pomocí speciálních příkazů
    • Spuštění úlohy - StartTask(jmeno_ulohy)
    • Ukončení úlohy - automaticky dosažením konce těla úlohy
    • Postupné spuštění úloh - Follows(uloha_1, uloha_2,…, uloha_N)
    • Současné spuštění úloh - Precedes(uloha_1, uloha_2,…, uloha_N)
    • Zastavení běžící úlohy - StopTask(jmeno_ulohy)
    • Zastavení aktuální úlohy a spuštění jiné - ExitTo(jmeno_dalsi_ulohy)
    • Zastavení všech úloh - StopAllTasks()
    • Zastavení celého programu - Stop()
  • Ukázka víceúlohového programu
task zvuk() {                   // definuj úlohu zvuk
  while (true) {                // opakuj dokola
    PlayTone(TONE_A4, MS_500);  // generuj zvuk A4 o délce 500 ms
    Wait(MS_600);               // čekej 600 ms
  }
}
task pohyb() {                  // definuj úlohu pohyb
  while (true) {                // opakuj dokola
    OnFwd(OUT_A, Random(100));  // nastav různý výkon motoru na portu A (0-100 %)
    Wait(Random(SEC_1));        // nastav různý čas pohybu motoru (0-1 sekunda)
  }
}
task rizeni() {                 // definuj úlohu rizeni
  Wait(SEC_10);                 // po 10-ti sekundách
  StopTask(zvuk);               // zastav úlohu zvuk
  Wait(SEC_5);                  // po dalších 5-ti sekundách
  StopAllTasks();               // zastav všechny běžící úlohy
}
task main() {                   // spusť hlavní úlohu po spuštění programu 
  Precedes(zvuk, pohyb, rizeni);// souběžně spusť tři úlohy
} 

Funkce

Definice funkce

  • funkce - část programu, kterou je možné opakovaně volat z různých míst kódu
  • umožní zjednodušení programu a zvýšení rychlosti programu
  • jazyky Pascal, Fortran, Ada... rozlišují funkce (vracejí hodnotu) a podprogramy - procedury (nevracejí hodnotu)
  • "Céčkové" jazyky nerozlišují pojem funkce a podprogram
  • v objektovém programování se funkce dané třídy nazývá metoda
  • NXC podporuje funkce s argumenty (parametry) a návratovými hodnotami

Zápis funkce

[typ_funkce] navratovy_typ jmenoFunkce(seznam_argumentu)
{
   // tělo funkce
}

Typy funkcí

  • běžná funkce - bez označení typu funkce
    • nutná definice návratové hodnoty
    • jediná definice kódu funkce šetří paměť
    • opakované volání funkce může zpomalit běh programu
    • omezení počtu funkcí a úloh na 256
  • Použití běžné funkce
int mocnina(int x = 2)// definice běžné funkce včetně nastavení hodnoty argumentu
{
  return x*x;         // tělo funkce
}
task main()
{
  NumOut(0, LCD_LINE1, mocnina(10)); // volání funkce a zobrazení vrácené hodnoty
  NumOut(0, LCD_LINE1, mocnina());   // volání funkce a zobrazení výchozí hodnoty
  Wait(SEC_10);                      // čekání 10 s před ukončením programu
}
  • funkce bez návratové hodnoty - void nebo sub
    • obdoba podprogramu v Pascalu
    • odpadá definice návratového typu
    • omezení počtu funkcí a úloh na 256
    • s ohledem na zvyklosti "Céčkových" programů se preferuje použití klíčového slova void
  • Použití podprogramu
void zpet(int vykon)
{
  OnRev(OUT_C, vykon); Wait(900);
  OnFwd(OUT_BC, vykon);
}
task main()
{
  OnFwd(OUT_BC, 75);
  Wait(1000);
  zpet(75);
  Wait(2000);
  zpet(75);
  Wait(1000);
  zpet(75);
  Off(OUT_BC);
}
  • inline funkce - inline
    • kód funkce nahradí při kompilaci její volání
    • vhodné pro krátké kódy s požadavkem na rychlost zpracování
    • použití neomezeného počtu funkcí
  • chráněná funkce - safecall
    • zabezpečí synchronizaci volání funkce ze souběžných úloh
    • kód funkce v úloze bude vykonán po ukončení funkce v jiné úloze

Makra a definice

Byte kód