Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Apelul functiilor avand ca argumente tablouri

c



+ Font mai mare | - Font mai mic



Apelul functiilor avand ca argumente tablouri

Cand se apeleaza o functie avand ca argument un tablou, acesteia i se va transmite un pointer la primul element al tabloului. Reamintim ca in C numele unui tablou fara nici un indice este un pointer la primul element al tabloului. Deci, un argument de tipul T[ ] (vector de tipul T) va fi convertit la T * (pointer de tipul T). Rezulta ca vectorii, ca si tablourile multidimensionale, nu pot fi transmise prin valoare. Aceasta inseamna ca declararea parametrului formal trebuie sa fie compatibila tipului pointer. Exista trei moduri de a declara un parametru care va primi un pointer la un tablou (vector).



a) Parametrul formal poate fi declarat ca un tablou, astfel:

# include <stdio.h>

display(); // Prototipul functiei display()

void main(void)

display(num) // Se defineste functia display()

int num[10];

Chiar daca acest program declara parametrul num ca pe un vector de 10 intregi, compilatorul C va converti automat pe num la un pointer la intreg, deoarece parametrul nu poate primi intregul tablou (vector).

b) O a doua cale de a declara un parametru vector (tablou), consta in a specifica parametrul ca pe un vector fara dimensiune:

display(int num[])

Aceasta functie declara pe num ca fiind un vector de intregi cu dimensiune necunoscuta. Deoarece limbajul C nu verifica dimensiunea vectorilor, dimensiunea actuala a vectorului este irelevanta ca parametru al functiei. i de aceasta data, num va fi convertit la un pointer la intreg.

c) Ultima metoda prin care se poate declara un parametru tablou este ca pointer, astfel:

display(int *num)

Limbajul C permite acest tip de declaratie deoarece putem indexa orice pointer utilizand [].

Toate cele trei metode de declarare a unui tablou ca parametru produc acelasi rezultat: un pointer. Cu toate acestea, un element al unui tablou folosit ca argument al unei functii va fi tratat ca orice alta variabila. Astfel, programul de mai sus poate fi rescris sub forma:

# include <stdio.h>

void main (void)

display(int num)

De data aceasta, parametrul din display() este de tip int, deoarece programul utilizeaza numai valoarea elementului tabloului.

Exemplu: Vom prezenta un program pentru afisarea tuturor numerelor prime cuprinse intre doua limite intregi. Programul principal apeleaza doua functii: nr_prim() returneaza 1 daca argumentul sau intreg este prim si 0 daca nu este prim; numerele prime sunt grupate intr-un vector, care se afiseaza ulterior cu functia display().

# include <stdio.h>

int nr_prim(); // Se declara prototipul

void display();

void main (void)

display(v,j);}

int nr_prim(int i) // Decide daca i este prim

void display(int *p, int j) /* Tipareste un vector

de intregi */

Din cele de mai sus, trebuie retinut ca atunci cand un tablou se utilizeaza ca argument al unei functii, calculatorul transmite functiei adresa de inceput a tabloului. Acest lucru constituie o exceptie a limbajului C in conventia de transmitere a parametrilor prin valoare. Astfel, codul functiei poate actiona asupra continutului tabloului si il poate altera.

Exemplu: Programul urmator va modifica continutul vectorului sir din functia main() dupa apelul functiei afis_litmari().

# include <stdio.h>

# include <ctype.h>

afis_litmari();

void main (void)

// Se defineste functia afis_litmari()

afis_litmari(char *s)

}

Rezultatul rularii programului va fi:

abcdefghijklmnoprstuvxyzw

ABCDEFGHIJKLMNOPRSTUVXYZW

ABCDEFGHIJKLMNOPRSTUVXYZW

Exemplu: Daca nu dorim sa se intample acest lucru, programul de mai sus se poate rescrie sub forma:

# include <stdio.h>

# include <ctype.h>

afis_litmari();

void main (void)

afis_litmari(char *s)

/* Se defineste functia afis_litmari() */

//Nu se modifica continutul sirului sir

Rezultatul rularii va fi de aceasta data:

abcbdefghijklmnoprstuvxyzw

ABCBDEFGHIJKLMNOPRSTUVXYZW

abcbdefghijklmnoprstuvxyzw

In aceasta varianta continutul tabloului ramane nemodificat, deoarece programul nu-i schimba valoarea.

Un exemplu clasic de transmitere a tablourilor intr-o functie il constituie functia gets() din biblioteca C standard. Prezentam o varianta simplificata a acestei functii numita xgets().

xgets(s)

char *s; }

s[80] ='0'; }

Functia xgets() trebuie apelata avand ca argument un tablou de caractere, care, prin definitie, este un pointer la caracter. Numarul caracterelor introduse de la tastatura, prin functia for este de 80. Daca se introduc mai mult de 80 de caractere, functia se incheie cu return. Daca se introduce un spatiu, contorul t este redus cu 1. Cand se apasa CR, xgets() introduce terminatorul de sir.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 637
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