Functie cu numar variabil de parametri - C/C++
Ok, am realizat acest lucru in C#, am vazut cat de simplu se poate realiza, intrebarea se pune in felul urmator: mai putem realiza la fel de usor acest lucru si in C/C++ ?
Putina teorie , pentru inceput. Atunci cand apelam o functie cu anumiti parametri, acestia sunt luati de pe stiva. Daca avem 2 parametri, luam 2 parametri de pe stiva, daca avem 3, luam 3, dar daca avem un numar variabil de parametri , cati vom lua de pe stiva? Se profileaza astfel urmatoarele probleme:
1.O functie care sa ia de pe stiva exact cati parametrii cu care a fost apelata functia
2.O functie care sa stie cumva unde sa se opreasca cand cauta parametrii.
Prima problema va fi discutata separat intr-un alt topic ( fiind mai dificil de inteles ).
In primul rand, in C/C++ numarul variabil de parametri se pune in evidenta prin utilizarea "..." ( trei puncte, foarte sugestiv ). Problema este ca nu putem avea direct un numar variabil de parametri, ci neaparat un parametru care este stabil. Sa trecem in continuare la modul in care putem lua parametrii de pe stiva. Avem doua optiuni. Ori stim de dinainte cati parametri vom avea , ori stim cand sa ne oprim. De exemplum, pentru calcularea sumei a n numere, putem apela in felul urmator:
-
cout<<suma(5,1,2,3,4,7);
Primul parametru,5, reprezinta numar parametrilor ( "variabil"
) .
-
cout<<suma(1,2,3,4,7,0);
Ultimul parametru l-am pus 0 ( element neutru la adunare ) . Atunci cand dam de el, stim sa ne oprim ( putem pune absolut orice care sa se potriveasca problemei noastre , doar trebuie sa stim cand sa ne oprim ).Sa scriem doua functii care sa implementeze cele doua concepte. Sa incepem cu prima functie, cea in care cunoastem cati parametri vom avea:
-
int functie(int prim,...)
-
{
-
int contor=1,val,suma=0;
-
va_list marker;
-
va_start(marker,prim);
-
while(contor<=prim)
-
{
-
val=va_arg(marker,int);
-
suma+=val;
-
contor++;
-
}
-
return suma;
-
}
Sa scriem aceeasi functie, care de data asta se va opri cand va gasi parametrul 0 :
-
int functie(int prim,...)
-
{
-
int val=1,suma=0;
-
va_list marker;
-
va_start(marker,prim);
-
suma+=prim;
-
while(val!=0)
-
{
-
val=va_arg(marker,int);
-
suma+=val;
-
}
-
return suma;
-
}
Pentru ca functiile de mai sus sa functioneze, trebuie sa includeti linia:
-
#include <stdarg.h>