www.amapro.cz & David Bazala [Programování]

Otevře webové stránky AmaPro


Otevře hlavní stránku společnosti AmaPro
Internetové stránky určené pro studenty středních a vysokých odborných škol.


amapro.cz/odkazy Projekt eliminuje vyhledávání klíčových slov na komerčních stránkách a v e-schopech.



Nový projekt AmaPro

 

goto

 

Příkaz goto je standardním příkazem Céčka, ale jen velmi málo používaný. Příkaz goto je svou funkční podstatou velmi silný a nebezpečný nástroj. Jeho úkolem jsou nepodmíněné skoky. Dosah skoku goto je téměř neomezený a tím se právě stává použití goto velmi nebezpečným. Za příkazem goto je vypsán identifikátor (návěstí), který může být umístěn kdekoliv v zdrojovém textu.

 

goto navest;

navest:

 

Návěst je symbolické jméno ukončené dvojtečkou, které nemusí být dopředu deklarováno, ale musí být někde ve zdrojovém textu definováno. Narazí-li běh programu na příkaz goto navest, přejde cely běh programu okamžitě do bodu, kde je definován bod navest. V takovém případě musí programátor respektovat poslední return, break, while apod. Je to velmi riskantní a může to vnášet velký zmatek.

 

PŘÍKLAD: goto_1

NAVEST:                                                             //návěstní bod (adresa)

if(getchar()=='k')goto VYSKOK;                      //jestliže 'k' pak goto VYSKOK

goto NAVEST;                                                   //vždy a jedině goto na NAVEST

VYSKOK:                                                             //návěstní bod (adresa)

cout<<"proveden výskok";                             //informační výpis:výstup ze smyčky

while(getchar()!='e');                          //čekání na 'e'

return 0;                                                               //výskok z konzolové aplikace

 

Tento program je pouze symbolický a ještě částečně bezpečný. Počátek celého programu je definován návěstím NAVEST. Dále běh programu pokračuje testem podmínky znaku získaného voláním funkce getchar() na rovnost se znakem ‘k‘. Při splnění podmínky dojde ke skoku typu goto na návěstí VYSKOK, které má již svou adresu, což zajistil překladač. Dosažením adresy bodu VYSKOK se běh programu dostává na cout a čekání stisku ‘e‘. Pak program končí. V případě, že z klávesnice přijde jiný znak než ‘e‘ pokračuje běh programu na příkaz goto NAVEST. Běh programu se okamžitě přesune na bod (adresu) NAVEST (což je začátek) a vše se opakuje. Jde tedy o smyčku, ze které lze se dostat pomocí klávesy ‘k‘.

POZNÁMKA: while(getchar()!='e') jsme museli použít místo getchar() (čekání na entr), neboť první příkaz char getchar()==‘k‘ je ukončen entrem a to by způsobilo i průchod při čekání na entr. Díky tomu, by jsme neviděli výsledky na obrazovce.

 

 

Specifické a nebezpečné konstrukce goto:

 

NAVEST: goto NAVEST;

 

Zde je znázorněná nejjednodušší konstrukce nekonečné smyčky. Program definuje NAVEST a tam je příkaz skoč NAVEST a tak pořád dokola. Protože příkaz goto je v podstatě instrukce strojového kódu JMP (skoč na adresu), dojde v systémech DOS a níže k tzv. kousnutí (zmrznutí PC). U W95 lze tento proces ještě přerušit.

 

PŘIKLAD: goto_2

NAVEST:                              //návěstní bod (adresa)

putchar('a');                          //vypiš znak na obrazovku

goto NAVEST;                    //skoč do bodu NAVEST

return 0;                                //k tomuto opuštění aplikace nikdy nedojde

 

Tento program je pouze symbolický ale již nebezpečný. Počátek celého programu je definován návěstím NAVEST. Dále běh programu pokračuje voláním funkce pro výstup na obrazovku. Další instrukce je goto s navěstím v podstatě na začátek programu. Díky této skutečnosti bude program nepřetržitě generovat na obrazovku písmeno ‘a‘. Mezi bodem NAVEST a goto NAVEST neexistuje žádná možnost přerušení. Pokud program spustíte v DOSu, můžete PC jen restartovat. U W95 a víš je i takováto smyčka sice aplikačně nekonečná, ale je přerušována rezidentem jádra systému,  která dokáže smyčku přerušit. Aplikace nikdy nevrátí return 0, neboť tam se běh programu nikdy nedostane. Return provede jádro systému a vrátí nějakou nenulovou hodnotu, která informuje toho, kdo tu aplikaci spustil o chabě. Číslo hodnoty v returnu může specifikovat i druh chyby.

 

 

 

4021fe0a : JMP$ 4021fe0a

 

Tato konstrukce je příkladem nekonečné smyčky, která je vytvořená v asembleru. Téměř obdobnou konstrukci vytvoří jak klasický C kompiler, tak i Builder C pro objektové programování. JMP je instrukce strojového kódu procesoru. Na tu když běh programu narazí, provede okamžitě skok na uvedenou adresu a běh programu pokračuje dále od této adresy. CPU si neukládá adresu ze které odskočil a běh programu je plně v moci dalších instrukcí.

 

PŘÍKLAD: goto_3

void __fastcall TForm1::Button1Click(TObject *Sender)

{

NAVEST:

goto NAVEST;

}

 

Zde je znázorněná část zdrojového kódu z příkladu goto_3 (Project1.bpr), který je již součástí objektového programování za použití vizuálních i nevizuálních objektů. V projektu jsou dva časovače, které po půl a celé vteřině čítají proměnnou x a y a to nezávisle na stavech jiných částí objektů. Celková konstrukce projektu je objektová a linker seskládá vhodně veškeré programové bloky, které působí jako že pracují paralelně. Ovšem ale pracují časově kontinuálně. My jsme vytvořili událost Button1Click, která se vyvolá stiskem tlačítka ve formuláři. Dojde k běhu programu na goto NAVEST a nekonečná smyčka je vytvořená. Aplikace je nenávratně zablokovaná. Vyzkoušejte si.

 

 



Abecední seznam všech článků Vyhledání pojmů ve článcích




Zapojení kabelů
Popis vývodů a křížení různých propojovacích kabelů
konektory.php
PHP práce s poli
Práce s poli a položkamy v PHP.
stranky/php_array
Procesory a mikroprocesory
Obecný úvod do základů mikroprocesorové techniky, architektury počítačů
knihy/mikroprocesory/obsah_mikro2.php
Animované obrázky
Animované gify a malé obrázky pro všeobecné využití.
datove_zdroje/animace
Mikropočítače
Seznámení s obecnou problematikou počítačů a mikropočítačů.
programovani/mikropocitace
CSS html vlasnosti
Přehled CSS vlastností pro tvorbu webu
datove_zdroje/stranky/css
Popis jazaka C
Průvodce příkazy programovacího jazyka C.
programovani/jazyk_c
Programování PHP
Články o programování webových stránek pomocí PHP.
internet/katalog_programovani_php
Popis HTML formátu
Velikost textu, barva textu, rozvržení stránky, obrázky, barva pozadí se zapisuje pomocí HTML příkazů.
stranky/html_tag
Otevře stránky Fulltextové vyhledávání na celém serveru
Digitalizované odborné knihy
Velká encyklopedie pojmů a zkratek
Česko - anglicko - německý technický slovník
Klasický katalog firem, služeb a stránek
OnLine překladač  vět a textů (nepoužívá Google)
Stránky pro chvíle oddechu od studia, relaxace
Katalog českých firem dle technologií
Internetový odkazník
Otevře hlavní stranu pro oddíl programování




 Wikipedie   Seznam stránek   Kapitoly témat   Významné servery   Klíčová slova 








Otevře hlavní stranu společnosti AmaPro

Všechna práva vyhrazena. Určeno jen pro osobní využití. Bez předchozího písemného souhlasu správce www.amapro.cz je zakázána jakákoli další publikace, přetištění nebo distribuce jakéhokoli materiálu nebo části materiálu zveřejněného na www.amapro.cz a to včetně šíření prostřednictvím elektronické pošty. Články, jejichž přímým autorem není amapro.cz lze publikovat pouze se souhlasem jejich majitelů či administrátoru příslušného webu.