Extras din curs
1. Macroinstructiuni pentru functii cu numar variabil de parametri.
Functiile C pot fi apelate cu numar variabil de parametri actuali. (un exemplu îl constituie functiile printf() si scanf() ).
Programatorul îsi poate scrie propriile functii cu numar variabil de parametri, folosind macroinstructiunile din fisierul antet <stdarg.h>.
O functie cu numar variabil de parametri va avea prototipul:
tip nume (lista_fixa_parametri, …);
Lista fixa de parametri trebuie sa fie nevida, deci numarul de parametri va fi mai mare sau egal cu numarul de parametri ficsi.
Parametrii care sunt în numar variabil sunt convertiti implicit ca tip, si anume:
• toti întregii la int
• toti realii la double
Fisierul antet <stdarg.h> contine definitii pentru tipul va_list. Argumentele variabile vor fi accesate printr-o variabila pointer pa, declarata astfel:
va_list pa;
Initializarea pointerului de acces la argumentele variabile -pa se face folosind macroinstructiunea va_start() , indicând adresa ultimului parametru fix lastarg:
va_start(pa, lastarg);
Pentru parcurgerea listei de argumente variabile se va folosi macroinstructiunea va_arg(), care actualizeaza pointerul de acces la argumente pa, pentru a indica urmatorul argument int sau double, si întoarce ca rezultat argumentul curent din lista de parametri variabili:
vint=va_arg(pa, int);
sau
vreal=va_arg(pa, double);
Oprirea procesului repetitiv se face folosind informatiile despre parametrii ficsi (în vârful stivei se va afla pointerul la format). Dupa ultimul parametru variabil extras se apeleaza macroinstructiunea:
va_end(pa);
Exemplul: Scrieti o functie care afiseaza un numar variabil de siruri de caractere (cel mult max).
#include <stdio.h>
#include <stdarg.h>
int printvar(int max, …);
void main(void)
{ printvar(3,”Ion”,”Vasile”,”Mihai”);
printf(“n”);
printvar(5,”marti”,”joi”,”luni”,”vineri”,”duminica”);
printf(“n”);
}
void printvar(int max,…)
{ va_list pa;
int narg=0;
char *siruri[10];
va_start(pa,max);
while(narg < max) {
siruri[narg]=va_arg(pa, char*);
printf(“%s n”, siruri[narg++]);
}
va_end(pa);
}
Extragerea argumentelor variabile, poate fi facuta, si cu alte functii, în loc de va_arg(). În acest scop se folosesc functiile: vprintf(), vfprintf() si vsprintf(). Acestea au prototipurile:
int vprintf(char * format, va_list pa);
• afiseaza, sub controlul formatului, la iesirea standard, un numar variabil de argumente, accesate prin pointerul pa
• întoarce numarul de octeti afisati (rezultat negativ la eroare)
Exemplu:
#include <stdio.h>
#include <stdarg.h>
int printvar(char* fmt, …);
void main(void)
{ fmt1[]=”%s %s %sn”;
printvar(fmt1,”Ion”,”Vasile”,”Mihai”);
}
void printvar(char* fmt,…)
{ va_list pa;
va_start(pa,fmt);
vprintf(fmt,pa);
va_end(pa);
}
int vfprintf(FILE * fis, char * format, va_list pa);
• afiseaza, sub controlul formatului, în fisierul fis, un numar variabil de argumente, accesate prin pointerul pa
• întoarce numarul de octeti afisati (rezultat negativ la eroare)
Preview document
Conținut arhivă zip
- Parametrii liniei de comanda in C si C++.doc