Showing posts with label transfer prin referinta. Show all posts
Showing posts with label transfer prin referinta. Show all posts

Saturday, January 23, 2016

Limbajul PHP. Functii cu numar variabil de argumente

Inca un enunt din categoria "practica individuala" asociata unui curs de PHP procedural:

"1.Sa se scrie o functie cu numar variabil de argumente care afiseaza valorile argumentelor primite sub forma unei liste HTML.
Ex: f(1,2,3) va afisa un bulleted (unordered) list cu valorile 1, 2 si 3);2. Aceeasi cerinta ca mai sus, dar functia va afisa argumentele ordonate crescator.3. Aceeasi cerinta, dar functia va avea un prim argument obligatoriu, care specifica sensul ordonarii (crescator sau descrescator)."

Intrucat ultima cerinta la inglobeaza pe anterioarele, solutia propusa o va trata pe aceasta din urma.

S-a definit functia funcTest($asc), care poate fi apelata cu un numar n>= 1 oricat de mare de argumente, apelarea fara argumente generand warning.

In corpul lui funcTest(…) este apelata functia predefinita func_num_ags(). Aceasta intoarce numarul de argumente pasate functiei funcTest(…). Daca numarul este mai mare decat 1, este apelata o alta functie predefinita, func_get_args(),  care intoarce ca rezultat un array cu argumentele pasate.

In continuare, este afisata lista cu argumente nesortate apoi se trece la sortarea acestora cu bubble sort, sensul sortarii fiind stabilit pe baza parametrului $asc(0 = crescator, 1 = descrescator). Pentru o duplicare mai redusa a codului, au fost definite functiile ascSort(…) si descSort(…), apelate din funcTest(…) in vederea sortarii efective. Doi din trei parametri sunt transferati prin referinta intrucat se doreste modificarea variabilelor respective: $count, care semnaleaza prezenta inversiunilor intre elementele listei de argumente, si, respectiv, $arr, tabloul care stocheaza argumentele.

funcTest(…) este apelata prima data cu valorile unui array initializat pseudoaleator, apoi direct cu apeluri ale functiei rand()  plasate in lista de argumente.

Codul si prinscreenul:

Sunday, December 20, 2015

Limbajul C++. Functii. Transfer prin valoare, referinta, adresa


Stim ca la transmiterea prin valoare a argumentelor unei functii, prelucrarea nu se face asupra variabilelor-argument, ci asupra unor copii. Copiile sunt variabile interne blocului functiei, de aceea durata lor de viata este limitata la blocul functiei. Reguli:

1) nu folosim transmisia prin valoare in cazul unor variabile de mari dimensiuni, pentru ca dimensiunea trebuie replicata pentru copiile folosite in corpul functiei;

2) nu folosim transferul prin valoare cand vrem ca variabilele transmise ca argument sa fie modificate.

Pentru cazurile mentionate anterior putem folosi transferul prin referinta (alias al variabilei-argument, permis doar in C++) sau transferul prin adresa (cu pointeri, permis in C/C++). 

Transferul prin adresa este, de fapt, tot un transfer prin valoare.