Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Pointeri la functii. Supraincarcarea functiilor. Functii cu numar variabil de parametrii

calculatoare



+ Font mai mare | - Font mai mic



Pointeri la functii. Supraincarcarea functiilor. Functii cu numar variabil de parametrii

Motto : Maicuta batrana



Cu braul de lana

Pe campi alergand,

Din ochi lacramand,

De mine-ntreband:

- L-ati vazut cumva pe Zdreanta

Cel cu ochii de faianta ?

- Da-mparate !

1. Pointeri (cam pe) la functii

Daca acest studiu s-ar dori exhaustiv, ar trebui sa precizam ca la inceput a fost haosul. Cu riscul de a parea superficiali, vom sari insa peste unele etape ce nu fac obiectul prezentei lucrari, pentru a surprinde gestul omului de cromagnon care, vizibil afectat de urmarile transformarii energiei cinetice in energie potentiala de deformare la interactiunea dintre propria regiune lombara si instrumentul complementar al vecinului de grota (bata), isi indreapta mana spre zona precedentului contact, acuzand astfel sursa senzatiei de disconfort. Asa a luat nastere conceptul de pointer.

Mai tarziu ajungem in anul 1853 cand se implineau deja cinci ani de la Revolutia din 1848.

Facand o paranteza, putem preciza ca in informatica (in limbajele de programare de nivel mediu si inalt) pointerii, ca notiune, au fost introdusi din necesitatea de a controla pozitia efectiva in memorie atat a datelor (varibile, vectori, structuri etc.) cat si a codului (functii si proceduri). Pentru a intelege ce este un pointer la o functie trebuie stiut intai si intai ca, pentru calculator, intre date si cod nu exista nici o diferenta (la fel cum pentru personajul nostru prezentat mai sus nu exista nici o diferenta intre sunetele emise, dintre care spicuim : "aaarrrg","aaaaaa","uuuuuu","a"). Astfel, daca niste variabile declarate ca

int  a = 10;

char b = 65;

char c = 'a';

vor fi reprezentate in memorie sub forma a 4 octeti cu valorile respectiv 10,0,65,97, o functie precum

void NuAmShtiutCeNumeSaDauFunctzieiAsteiaAsaCaAmScrisChestiaAsta()

va fi mai intai tradusa in instructiunea primara pentru atribuire a procesorului (mov) , linia

a = 2;

devenind :

mov [a],2

care va fi apoi codificata in 6 octeti cu valorile respectiv 199, 6, XL, XH, 2, 0, unde XL este octetul cel mai putin semnificativ al adresei lui a iar XH este octetul cel mai semnificativ al aceleiasi adrese (presupunand un model de memorie in care adresa se reprezinta pe 2 octeti). Un pointer la functia aratata mai sus va fi o variabila care va contine adresa octetului cu valoarea 192. Generalizand, un pointer la o functie oarecare este adresa primului octet al reprezentarii in memorie a codului acelei functii. Acestea fiind spuse, nu ne ramane decat sa aratam cum se pot folosi acesti pointeri la functii intr-un program C :

#include <stdio.h>

// Asha se declara un pointer la o functzie :

void (AstaEUnPointerLaOFunctzieCareAcceptaUnParametruIntreg*)(int a);

void AstaEOFunctzieCareScriePeEcranParametrulIntregPrimit( int a )

void main()

2. Efectul de supraincarcare (intrucatva) a functiilor

Apelul functiilor intr-un program nu este foarte diferit de metoda rustica prin care atentia unui individ este solicitata dupa sistemul : "Ba Ghorgheeeeeee !!!!!!'. La fel si o functie este chemata sa se execute dupa numele sau. Problema apare insa cand mai multe functii au acelasi nume si nu se poate decide care dintre ele trebuie chemata. In aceasta situatie geniul popular isi dovedeste inca o data, daca mai era nevoie, valoarea sa incontestabila prin gasirea unui expedient ce face ca aceasta problema sa para eminamente facila, eludand astfel de o maniera existential categorica impasul initial. Solutia creatorului anonim consta in unicizarea obiectului apelului sau prin suplimentarea interpelarii cu o serie de entitati intrinsec informationale si coerent formale. Astfel, in momentul in care o solicitare isi pierde comprehensibilitatea devenind echivoca (precum ar face precedentul nostru exemplu in prezumtia aparitiei unui al doilea Gheorghe), aceasta este instinctual transfigurata si coercitiv reformata pentru a reflecta in mod irefutabil elocvent intentionalitatea initiala a apelantului, numelui adresatului fiindu-i aditionate o serie de atribute a caror juxtapunere ii confera acestuia o unicitate relational cognitiva : "Gheorghe a Marii Gherghinii lu' nea Fane tractoristu' d-a tinut p-aia lu' Marin a lu' Gheorghe-al Janii dan capu' satului".

Pornind de la ideea geniului popular, compilatorul de C va reusi sa faca diferenta intre doua functii cu acelasi nume doar folosind unele informatii auxiliare. Concret, aceste informatii sunt reprezentate de tipul si respectiv de numarul parametrilor acceptati. Putem spune, deci, ca exista o diferenta fundamental irecuzabila intre functia

char Functzie( int a );

si functia

void Functzie( char a );

deoarece, chiar daca numarul de parametrii acceptati coincide, tipul acestora difera in mod indubitabil. Deasemenea compilatorul de C nu intalneste nici un impediment de ordin major in a deosebi functiile

void Functzie( int a ); 

si respectiv

int Functzie( int a, int b );

intrucat acestea accepta numere axiomatic distincte de parametrii ( 1 si respectiv 2 ). Intern, aceasta abilitate a compilatorului este posibila datorita redenumirii oricarei functii intalnite dupa numarul si tipul parametrilor fiecareia. Astfel, functiile din exemplele precedente vor fi recunoscute intern si eventual exportate in alte module sub numele :

- @Functzie$qi

- @Functzie$qzc

- @Functzie$qii

Se impune sa precizam aici ca, desi doua functii cu acelasi nume se pot deosebi dupa tipul si respectiv numarul parametrilor primiti, aceasta diferenta nu se poate realiza si in functie de tipul rezultatului intors, caz in care compilatorul va semnala o erorare. Mai concret, functiile

char Functzie();

si respectiv

int  Functzie();

nu pot coexista in acelasi fisier sursa.

In incheiere prezentam o sursa C care va evidentia modul in care se pot folosi in acelasi program doua functii cu acelasi nume si totusi fundamental si irefutabil distincte :

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void Medie( char a, char b, int& rezultat )

int Medie( char a, char b )

void main()

3. Functii cu numar (oarecum) variabil de parametrii

Dupa cum am aratat in sectiunea prcedenta a prezentei lucrari, intre apelul functiilor in C si o interpelare traditionala nu apare nici o discrepanta de fond. Vom vedea in cele ce urmeaza cum se aplica aceasta situatiilor in care apelului propriu-zis ii este aditivat un numar nedefinit de anexe informationale, precum parametrii, cu scop in instantierea categorica a functiei pe baza valorilor existential concrete ale datelor de intrare si respectiv iesire.

Un exemplu de cerere rupt din genialitate providential exhaustiva a creatorului anonim si frecvent intalnit in lumea instinctual empirica a satului ar fi : "Gheorgheeeeee, du', ba, da ia si tu o sticla da votca !". Transpare din fiecare cuvant al acestei fraze impacarea transcedentala a omului cu sentimentul inexorabilitatii sucombarii prin actiunea nociva a gruparii radical-hidroxil asupra celulelor hepatice, fapt ce exacerbeaza luciditatea intrinsec matematica inerenta intelectului geniului popular care sintetizeaza aceasta solicitatre unind laolata structuri profund informationale ce confera propozitiei exactitatea logica dorita. Se intelge, asadar, ca obiectul apelului nu poate fi altul decat Gheorghe, scopul fiind clar, procurarea unui bun esential pentru dezvoltarea biologica a locuitorilor spatiului rustic mai sus amintit. Continuand asemanarea inceputa mai devreme, putem spune ca si la chemarea unei functii C, trebuie bine precizate obiectul apelului (functia) si scopul lui (parametrii). Mergand mai departe cu analiza noastra asupra comunicarii informationale in universul rustic, vom realiza ca geniul anonim descoperise cu mult inainte de inventarea calculatorului o metoda intrinsec folositoare, introdusa in tehnologia informationala de limbajul de preogramare C, o metoda de formatare a unei cereri astfel incat numarul de parametrii trimisi sa poata diferi de la apel la apel. Astfel, creatorul popular poate exprima fara teama de echivoc urmatoarea solicitare aceluiasi Gheorghe : "Gheorgheeee, du', ba, si tu da ia cinci sticle da bautura : patru da votca si trei da rom !" (se poate observa ca numarul anexelor informationale sufixate cererii a crescut simtitor fata de primul apel desi obiectul a ramas neschimbat).

Vizibil fondat pe geniul autorului popular, compilatorul C va putea genera functii care accepta un numar variabil de parametrii. In pseudocod, un prototip de astfel de functie ar fi :

tip_intors NumeFunctzie( lista_normala_de_parametrii, );

unde lista_normala_de_parametrii este un sir normal de declaratii de parametrii, ca de exemplu

int a, char c

caz in care prototipul de mai sus devine :

tip_intors NumeFunctzie( int a, char c, );

Ca si in cazul autorului anonim, analiza parametrilor optionali se va face, in general, pe baza parametrilor ficsi. Prin urmare, o functie ca

long Medie( int n, );

va sti cati parametrii primeste la un anumit apel dupa valoarea din parametrul fix, n, un apel corect al acestei functii precizand in acest intreg, numarul de parametrii optionali, asa cum face codul :

m = Medie( 3,a,b,c );

Este cazul sa precizam ca o functie cu parametrii optionali nu poate fi declarata decat folosind standardul cdecl (implicit in compilatorul C), adica parametrul cel mai din dreapta va fi impins primul in stiva iar cel mai din stanga ultimul, apelantul golind stiva dupa executia functiei. Din cele spuse mai sus, este usor de observat ca, la intrarea intr-o astfel de functie, primul parametru optional se va gasi in memorie imediat dupa ultimul parametru fix iar urmatorii in continuare, liniar. Stiind acestea, putem scrie acum corpul functiei Medie

long Medie( int n, )

S-ar mai putea aminti aici cele 4 functii ale bibliotecii C special concepute pentru folosirea in functii cu numar variabil de parametrii care insa sunt mult mai greoi de folosit decat accesarea directa a memoriei si nu ar face altceva decat sa sporeasca inutil consumul de foi si cerneala necesar pentru tiparirea acestei lucrari, si asa inutile.

In incheiere prezentam un program care uneste toate toate functiile definite pana acum in prezentul studiu, demonstrandu-le modul de folosire :

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void Medie( char a, char b, int& rezultat )

int Medie( char a, char b )

long Medie( int n, )

void main()

Nota : Pentru facilitarea analizei textului subiectele au fost subliniate cu cate o linie iar predicatele cu cate doua, tema impartirii frazelor in propozitii fiind lasata de autor ca tema de gandire cititorului.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2030
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved