va_arg in c

va_arg in c
Le biblioteche C forniscono una vasta gamma di funzioni per coprire le esigenze di un programmatore e fornire anche la possibilità di creare le nostre funzioni personali per soddisfare le esigenze specifiche di ogni caso.

Tra i tipi di funzione forniti da questo linguaggio ci sono le funzioni "variadiche". Questi tipi di funzione hanno la flessibilità di contenere un numero dinamico o variabile di argomenti di input.

In questo Suggerimento Linux Articolo, il va_arg La macro, che è un componente di base di questo tipo di funzione e viene utilizzata per recuperare i dati dagli argomenti di input, è spiegata in dettaglio.

Vedremo una spiegazione dettagliata della sua operazione e sintassi. Quindi, metteremo in pratica ciò che abbiamo imparato in pratica in cui creeremo una funzione variadica passo dopo passo con frammenti di codice e immagini che mostrano come il va_arg La macro funziona in lingua C.

Sintassi macro VA_ARG

tipo va_arg (va_list AP, tipo)

Definizione di una funzione variadica

Prima di entrare più in dettaglio sulla macro va_arg, Diamo un'occhiata rapida a cos'è una funzione variadica.

Queste funzioni non hanno un numero fisso di argomenti di input ma il numero di questi argomenti è adattato a ciò che il programmatore invia con ogni chiamata.

Un esempio di ciò è la funzione variadica ampiamente utilizzata printf (), i cui argomenti di input possono essere solo una stringa, una stringa e una variabile o un puntatore o molti di essi.

Successivamente, vedremo come definire una funzione variadica:

tipo funzione (tipo variabile, ...);

Come vediamo nella definizione, quando creiamo una funzione di questo tipo, dobbiamo specificare nella sua dichiarazione almeno un argomento di input dichiarato e il suo tipo, seguito da un'ellissi separata da virgola che rappresenta gli argomenti variabili o sconosciuti.

Le variabili e le macro che utilizzano le funzioni variadiche, come va_arg, sono definiti nel "stdarg.H ”intestazione. Quindi, per usarli, dobbiamo includerli nel nostro ".Codice C "o intestazione come segue:

#includere

Successivamente, guardiamo in dettaglio a ciò che sono le macro che compongono la funzione variadica.

Argomenti di input e macro di una funzione variadica

Nelle funzioni variadiche, un numero di macro e tipi variabili vengono utilizzati per elaborare gli argomenti di input inviati con ogni chiamata. Queste macro e il loro uso all'interno della funzione sono mostrati di seguito.

va_list ap

L'oggetto AP è di tipo VA_LIST e memorizza informazioni sugli argomenti di input. Quindi, indica la posizione corrente nell'ordine di recupero dei dati di input dell'elenco.

Una volta dichiarato, l'oggetto VA_LIST deve essere inizializzato con la macro VA_START.

void va_start (va_list AP, ultimo);

La macro va_start è chiamata prima quando viene chiamata una funzione variadica. Inizializza l'oggetto AP che indica il primo argomento sconosciuto nell'elenco.

tipo Va_arg (va_list AP, tipo);

Questa macro restituisce l'argomento di input successivo indicato da AP dall'elenco degli argomenti. Il tipo di dati restituito è specificato nel tipo.

Non appena VA_ARG recupera i dati, AP aumenta il suo valore mediante riferimento all'argomento di input successivo.

Questa macro non restituisce un valore predefinito indicando che l'elenco degli argomenti di input ha raggiunto la sua fine. Quindi, il programmatore deve assicurarsi che venga generato un metodo sicuro che indica se ci sono ancora argomenti nell'elenco che possono essere estratti o meno.

Un metodo sicuro consiste nell'inclusione, in ogni chiamata alla funzione variadica, un valore costante e unico che può essere interpretato nel corpo della funzione come indicatore di "non più parametri rimasti" nell'ultimo parametro di input.

void va_end (va_list AP);

Una volta recuperati tutti gli argomenti, ogni ciclo di va_start deve essere terminato con va_end prima che la funzione variadica ritorni. Altrimenti, ci sono informazioni sullo stack con i dati della chiamata corrente, che potrebbero portare a errori nella prossima chiamata della funzione

Abbiamo già visto ciascuna delle macro che fanno parte del recupero dell'argomento in una funzione variadica. Ora, vediamo un esempio di come usare il va_arg La macro per recuperare i dati dagli argomenti di input è implementata in questo tipo di funzione.

Come creare una funzione variadica passo dopo passo e recuperare i suoi argomenti di input con il macro va_arg () nella lingua C

In questo esempio spieghiamo passo per passo come creare una funzione variadica e recuperare i suoi argomenti di input - usando la macro va_arg.

Nel primo passaggio, creiamo la funzione variadica, che chiameremo get_arguments ().

Sia l'output che l'argomento di input dichiarato arg_1 saranno di tipo doppio. L'affermazione sembrerà così:

Double get_arguments (doppio arg_1, ...);

Dopo aver dichiarato la funzione con i suoi tipi di output e di input, continuiamo con lo sviluppo del corpo della funzione.

Nel prossimo passaggio, creeremo un array di 10 elementi di tipo doppio con il nome get_arg. In questo array, memorizzeremo i dati dell'argomento di input, che recupereremo con la macro va_arg.

Creeremo anche la variabile "A", che è di tipo int e serviremo da identificatore per gli elementi dell'array GET_ARG.

Double get_arg [10];
int a = 1;

Nel passaggio successivo, creiamo un oggetto di tipo Va_list, che chiameremo "AP".

Questo oggetto viene inizializzato con la macro VA_START e passa come primo argomento, il nome dell'oggetto precedentemente creato 'AP'; e come secondo argomento il nome dell'ultima variabile di input nota, in questo caso "arg_1".

va_list AP;
va_start (AP, arg_1);

È importante notare che il primo argomento, e in questo caso l'unico noto dalla funzione, non è incluso nell'elenco "AP", quindi il suo recupero viene eseguito allo stesso modo di una funzione non variadica.

In questo caso lo memorizziamo nell'elemento numero 1 dell'array get_arg.

get_arg [a] = r1;

Successivamente, crea un ciclo while per recuperare gli argomenti di input con la macro va_arg.

In questo ciclo, ripeti fino a quando la macro VA_ARG ottiene il valore -1 o "E", che sarà l'indicatore dell '"ultimo argomento".

In ogni ciclo del ciclo, il messaggio "Argomento recuperato:" è stampato dalla funzione printf (), seguito dal valore dei dati recuperati.

Quindi, l'identificatore "A" è incrementato di 1 e la macro va_arg si chiama, che recupera l'argomento di input successivo e lo memorizza nell'elemento array get_arg a cui si fa riferimento da "a".

while (get_arg [a] != e)

printf ("RecoverEdArgument %D", a);
printf (": %f \ n", get_arg [a]);
a ++;
get_arg [a] = va_arg (AP, doppio);

Quando tutti i dati sono stati recuperati e il programma è uscito dal ciclo, dobbiamo uscire dall'oggetto elenco "AP" che abbiamo creato all'inizio della funzione con la macro va_end e passare il nome di questo oggetto come argomento di input.

va_end (AP);

Successivamente, vedremo il codice completo per la funzione variadica che abbiamo appena creato e il principale in cui chiamare la funzione e dichiarare le variabili di tipo doppio che invieremo come argomenti di input.

#includere
#includere
voidget_arguments (doppio r1, ...);
Double E = -1;
voidmain ()
doppio arg_1 = 10;
Doublearg_2 = 4700;
doppio arg_3 = 2200;
doppio arg_4 = 5800;
doppio arg_5 = 3300;
get_arguments (arg_1, arg_2, arg_3, arg_4, arg_5, e);

voidget_arguments (double r1, ...)
int a = 1;
doubleget_arg [10];
va_listap;
va_start (AP, R1);
get_arg [a] = r1;
while (get_arg [a] != e)
printf ("RecoverEdArgument %D", a);
printf (": %f \ n", get_arg [a]);
a ++;
get_arg [a] = va_arg (AP, doppio);

va_end (AP);

L'immagine seguente mostra la console di comando con gli argomenti di input recuperati. In questo caso, la funzione è stata chiamata con due argomenti di input.

I dati recuperati per una chiamata con cinque argomenti di input.

Problemi e soluzioni nel recupero dei dati di input con il va_arg Macro

Il problema principale che incontreremo nello sviluppo di una funzione variadica è che la macro va_arg Non ha metodo per informare il programmatore della fine dell'elenco degli argomenti di input. Quindi una volta recuperati tutti i dati inviati nella chiamata, questa macro restituirà risultati errati ogni volta che viene chiamato indefinitamente

Ciò significa che non solo otterrai risultati errati, ma nei casi in cui il recupero dei dati è in loop, ci sarà un overflow. Pertanto, il programmatore deve elaborare un metodo per rilevare la fine degli argomenti nell'elenco. Uno dei metodi potrebbe essere quello di utilizzare una costante come ultimo argomento che indica la fine dell'elenco.

Un altro metodo è specificare come primo argomento il numero di parametri da inviare ogni volta che viene chiamata la funzione variadica.

Conclusione

In questo lsuggerimento inux Articolo, ti abbiamo fornito una spiegazione dettagliata e completa di come funzionano le funzioni variadiche e su come utilizzare il va_arg Macro nella lingua C.

Abbiamo anche spiegato in dettaglio l'uso delle altre macro che fanno parte del recupero dei dati in questo tipo di funzione e ti hanno mostrato passo dopo passo come dichiarare e svilupparne una che è una risorsa molto importante in questo e in altri linguaggi di programmazione. Puoi trovare più articoli come questo nel motore di ricerca di Linux suggerimenti.