Podprogramy: Průběh výpočtu při volání programu, Volání parametru hodnotou a a adresou – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Podprogramy: Průběh výpočtu při volání programu, Volání parametru hodnotou a a adresou – Pascal – Fórum – Programujte.comPodprogramy: Průběh výpočtu při volání programu, Volání parametru hodnotou a a adresou – Pascal – Fórum – Programujte.com

 

Gooo0
Newbie
25. 7. 2016   #1
-
0
-

Zdravím

Řeším podprogramy a chápu tak, že dělíme na Procedury a Funkce. Myslím, že v mé úrovni stačí charakterizovat podprogramy jako části programového kódu, které se v programu opakují a programátor si tímto řešením ulehčuje práci a zlepšuje přehlednost. Proceduru použijeme v případě, že potřebujeme více než jeden výstup a v případě pouze jednoho výstupu použijeme funkci.

Mám trochu hokej v lokálních a globálních proměnných a formálních a skutečných parametrech, ale tyto informace jsem našel ve studijních podkladech, takže si to musím jen ujasnit. Bohužel jsem ale nenašel nic k dalším částem otázky (možná jen špatně chápu frázi):

  • Průběh výpočtu při volání podprogramu
  • Volání parametrů hodnotou a adresou

Uměl by mě někdo pochopitelně pro mou úroveň nasměrovat, jak byly tyto poddotazy myšleny?

Děkuji, G

Nahlásit jako SPAM
IP: 178.72.244.–
Kit+15
Guru
25. 7. 2016   #2
-
0
-

#1 Gooo
Podmínka opakování kódu dnes už neplatí. Zcela běžně se dělá podprogram, který je volán pouze jednou. Dokonce to tedy nějakou práci přidá.

Hlavním důvodem členění do podprogramů je přehlednost a uspořádání programu do logických celků. V takových programech se totiž mnohem lépe hledají chyby a programy se snáze modifikují v případě změny požadavků.

Procedury používáme v případě, kdy chceme něco udělat, jsou to tedy příkazy.

Funkce používáme tehdy, když se chceme na něco zeptat, jsou to tedy dotazy.

Používat funkce na modifikace nebo procedury na dotazování je v principu špatné. Moderní jazyky jsou pro to uzpůsobeny, Pascal poněkud zaostal a proto se to v něm občas míchá. Často to v něm ani jinak nejde.

Proměnné deklarované uvnitř podprogramů jsou lokální. Po skončení podprogramu přestanou platit.

Globální proměnné se deklarují v hlavním programu a jsou platné celou dobu jeho běhu. Je žádoucí, aby globálních proměnných bylo co nejméně.

Formální parametry jsou ty, které jsou v záhlaví podprogramu. Podprogram s nimi může pracovat jako s lokálními..

Skutečné parametry dodává kód, který tento podprogram volá. Jsou v závorkách, odděleny čárkou.

Volání hodnotou je nejběžnější. Hodnota skutečného parametru je zkopírována do formálního parametru podprogramu. Pokud ho volaný podprogram změní, tak to ve volajícím nemá žádný účinek. Tato hodnota je na konci běhu podprogramu vždy zahozena.

Při volání adresou (nebo také odkazem) se všechny změny provedené v podprogramu projeví i v datech volajícího podprogramu. V Pascalu se na to používá klíčové slovo var. Je žádoucí, aby takových parametrů bylo co nejméně.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4014 příspěvků
26. 7. 2016   #3
-
0
-

Jj, dneska to s tim opakovanim kodu neplati. Pokud chces mit prehledny program, pise se vse do class. To ale pascal jeste nepodporuje, nejspis.

Globalni promenna plati pro cely program, lokalni jen uvnitr procedury/funkce (po ukonceni funkce obsah zanika).
Dam ti priklad z php, protoze tam se pise primo slovo global. 

function aaa()
{
global $X; 
$Y = 4;
var_dump($X); // vypise 5
var_dump($Y); // vypise 4
}

function bbb()
{
$Y = 4;
var_dump($X); // $X undefined
var_dump($Y); // vypise 4
}

$X = 5;
aaa();
bbb();
var_dump($X); // vypise 5
var_dump($Y); // $Y undefined

Volani hodnotou a adresou.
Kdyz vytvoris promenou, tak pc si nekde v pameti zablokuje cast a propoji adresu pameti na promenou. Vzdy, kdyz pouzijes a := cokoliv, tak na adresu pameti ulozenou pro 'a' zapise data.
A ted, kdyz pouzijes proceduru nebo funkci a predavas ji parametry, tak ji muzes predat hodnotu ulozenou v a nebo adresu pameti, kde je ulozena hodnota pro 'a'.
Pri zadavani do procedury, procedura obvykle klonuje hodnotu promene. Coz za normalnich okolnosti nevadi. Ale kdyz treba pracujes s 1 G, tak zklonovani obsahu chvili trva a taky zabira duplicitne misto. Takze lze predat procedure jen adresu pameti.
a := 5; // a je nazev promenne, alias pro misto v pameti, 5 je hodnota

Vem si treba 1G pameti. Neco mas uz zaplnene. Pri vytvareni 'a' pres var ti prideli pozici v pameti 954331. 'a' bude typ integer, integer je 32 bitove cislo (4 byte), takze zabira pamet
954331, 954332, 954333,  954334
Kdyz to procedura zklonuje, tak mas
a: 954331 .. 954334
procedura promenna x: 974331 .. 974334 (nejake jine misto v pameti, 4 byte)
Klonovani je ale vyhodne, protoze prepsanim 'x' v procedure neprepise 'a' v jine casti programu. Viz globalni a lokalni promene. Prima adresa je jako globalni, klonovani je lokalni promena.

Jak se to resi v pascalu nevim, ale pro php to vypada takto

function xxx($x) {$x=7;} hodnota, lokalni
function yyy(&$y) {$y=8;} adresa, globalni
$a = 6;
var_dump($a); // vypise 6
xxx($a);
var_dump($a); // vypise 6
yyy($a);
var_dump($a); // vypise 8
Nahlásit jako SPAM
IP: 2001:718:2601:26c:5017:81...–
Kit+15
Guru
26. 7. 2016   #4
-
0
-

#3 peter
Myslím si, že není příliš vhodné mu motat hlavu s PHP, protože hodně věcí se v něm řeší jinak. Bude lépe se držet Pascalu, jinak tu zkoušku neudělá.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gooo0
Newbie
26. 7. 2016   #5
-
0
-

Pánové, děkuji Vám za vysvětlení. Vždy se v dotazu pokouším napsat to co již mám zjištěno, abych nevypadal že narazím na problém a hned zjišťuji na fóru, ale samozřejmě i proto, aby došlo k opravě chyb.

Děkuji za pochopitelné vysvětlení.

Nahlásit jako SPAM
IP: 178.72.244.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý