va_arg i c

va_arg i c
C -bibliotekene gir et bredt spekter av funksjoner for å dekke behovene til en programmerer og gir også muligheten til å lage våre egne personlige funksjoner for å imøtekomme de spesifikke behovene til hvert tilfelle.

Blant funksjonstypene levert av dette språket er de "variadiske" funksjonene. Disse funksjonstypene har fleksibilitet til å inneholde et dynamisk eller variabelt antall inngangsargumenter.

I dette Linux hint Artikkel, The va_arg Makro, som er en grunnleggende komponent av denne funksjonstypen og brukes til å hente dataene fra inngangsargumentene, blir forklart i detalj.

Vi vil se en detaljert forklaring på dens drift og syntaks. Deretter vil vi utføre det vi har lært i praksis i et praktisk eksempel der vi vil lage en variadisk funksjon trinn for trinn med kodefragmenter og bilder som viser hvordan va_arg Makro fungerer på C -språket.

VA_ARG MACRO SYNTAX

type va_arg (va_list ap, type)

Definisjon av en variadisk funksjon

Før vi går nærmere inn på makroen va_arg, La oss se raskt på hva en variadisk funksjon er.

Disse funksjonene har ikke et fast antall inngangsargumenter, men antallet av disse argumentene er tilpasset hva programmereren sender med hver samtale.

Et eksempel på dette er den mye brukte variadiske funksjonen printf (), hvis inngangsargumenter bare kan være en streng, en streng og en variabel, eller en peker, eller flere av dem.

Deretter vil vi se hvordan du kan definere en variadisk funksjon:

typefunksjon (type variabel, ...);

Som vi ser i definisjonen, må vi i sin erklæring minst ett erklært inngangsargument og dens type, etterfulgt av en komma-separat ellips som representerer en erklærte inndata og dens type, etterfulgt av en komma-separert ellips som representerer de variable eller ukjente argumentene.

Variablene og makroene som bruker de variadiske funksjonene, for eksempel va_arg, er definert i “stdarg.h ”header. Så for å bruke dem, må vi inkludere dem i ".C ”-kode eller dens overskrift som følger:

#inkludere

Deretter, la oss se i detalj på hva makroene som utgjør den variadiske funksjonen handler om.

Inputargumenter og makroer av en variadisk funksjon

I variadiske funksjoner brukes en rekke makroer og variable typer til å behandle inngangsargumentene som programmereren sender med hver samtale. Disse makroene og deres bruk i funksjonen er vist nedenfor.

VA_LIST AP

AP -objektet er av Type VA_LIST og lagrer informasjon om inngangsargumentene. Deretter peker det på den nåværende posisjonen i hentingsrekkefølgen på listeinndataene.

Når den er erklært, må VA_LIST -objektet initialiseres med VA_Start -makroen.

void va_start (va_list ap, sist);

Makro VA_Start kalles først når en variadisk funksjon kalles. Den initialiserer objektet AP som peker på det første ukjente argumentet på listen.

type va_arg (va_list ap, type);

Denne makroen returnerer neste inngangsargument som AP peker på av AP fra argumentlisten. Den returnerte datatypen er spesifisert i type.

Så snart VA_ARG henter dataene, øker AP sin verdi med henvisning til neste inngangsargument.

Denne makroen returnerer ikke en standardverdi som indikerer at listen over inngangsargumenter har nådd sin slutt. Så programmereren må sørge for at det blir generert en sikker metode som indikerer om det fremdeles er argumenter på listen som kan trukket ut eller ikke.

En sikker metode består av å inkludere, i hver samtale til den variadiske funksjonen, en konstant og unik verdi som kan tolkes i funksjonen til funksjonen som en indikator på "ikke flere parametere igjen" i den siste inngangsparameteren.

void va_end (va_list ap);

Når alle argumenter er hentet, må hver syklus av VA_Start avsluttes med VA_end før variadisk funksjon kommer tilbake. Ellers er det informasjon om stabelen med dataene fra den aktuelle samtalen, noe som kan føre til feil i neste samtale av funksjonen

Vi har allerede sett hver av makroene som er en del av argumentet henting i en variadisk funksjon. La oss nå se et eksempel på hvordan bruk av va_arg Makro for å hente data fra inngangsargumentene implementeres i denne typen funksjoner.

Hvordan lage en variadisk funksjon trinn for trinn og hente inngangsargumentene med makroen va_arg () på C -språket

I dette eksemplet forklarer vi trinn for trinn hvordan du lager en variadisk funksjon og henter inngangsargumentene - ved hjelp av makroen va_arg.

I det første trinnet lager vi den variadiske funksjonen, som vi vil kalle get_argumenter ().

Både utgangen og det deklarerte inngangsargumentet arg_1 vil være av typen dobbel. Uttalelsen vil se slik ut:

doble get_argumenter (dobbel arg_1, ...);

Etter å ha erklært funksjonen med utdata- og inngangstyper, fortsetter vi med utviklingen av funksjonskroppen.

I neste trinn vil vi lage en rekke 10 elementer av type dobbelt med navnet get_arg. I denne matrisen lagrer vi dataene fra inngangsargumentet, som vi vil hente med makroen va_arg.

Vi vil også lage variabelen “A”, som er av Type Int og vil tjene som en identifikator for elementene i Get_Arg -matrisen.

dobbel get_arg [10];
int a = 1;

I neste trinn lager vi et objekt av Type VA_List, som vi vil kalle “AP”.

Dette objektet initialiseres med makro VA_Start og passerer som første argument, navnet på det tidligere opprettede objektet 'AP'; Og som andre argument navnet på den siste kjente inngangsvariabelen, i dette tilfellet “ARG_1”.

VA_LIST AP;
va_start (ap, arg_1);

Det er viktig å merke seg at det første argumentet, og i dette tilfellet det eneste som er kjent under funksjonen, ikke er inkludert i "AP" -listen, så utvinningen gjøres på samme måte som for en ikke-variadisk funksjon.

I dette tilfellet lagrer vi det i element nummer 1 i get_arg -arrayen.

get_arg [a] = r1;

Neste, lag en stundsløyfe for å hente inngangsargumentene med makroen va_arg.

I denne sløyfen, gjenta dette til makro VA_ARG får verdien -1 eller “E”, som vil være indikatoren for det “siste argumentet”.

I hver syklus av løkken er meldingen “Argument hentet:” skrevet ut av printf () -funksjonen, etterfulgt av verdien av de hentede dataene.

Deretter økes identifikatoren “A” med 1 og makroen va_arg kalles, som henter neste inngangsargument og lagrer det i matriselementet get_arg referert av “a”.

mens (get_arg [a] != e)

printf ("RecoverEdArgument %d", a);
printf (": %f \ n", get_arg [a]);
A ++;
get_arg [a] = va_arg (ap, dobbel);

Når alle dataene er hentet og programmet har forlatt sløyfen, må vi forlate listeobjektet "AP" som vi opprettet i begynnelsen av funksjonen med makro VA_end og passerer navnet på dette objektet som inngangsargumentet.

va_end (ap);

Deretter vil vi se hele koden for den variadiske funksjonen vi nettopp opprettet, og det viktigste for å kalle funksjonen og erklære variablene av typen dobbelt som vi vil sende som inngangsargumenter.

#inkludere
#inkludere
voidget_argumenter (dobbel r1, ...);
dobbel e = -1;
voidmain ()
dobbel arg_1 = 10;
DOUBLEARG_2 = 4700;
dobbel arg_3 = 2200;
dobbel arg_4 = 5800;
dobbel arg_5 = 3300;
get_argumenter (arg_1, arg_2, arg_3, arg_4, arg_5, e);

voidget_arguments (dobbel r1, ...)
int a = 1;
DoubleGet_Arg [10];
va_listap;
VA_Start (AP, R1);
get_arg [a] = r1;
mens (get_arg [a] != e)
printf ("RecoverEdArgument %d", a);
printf (": %f \ n", get_arg [a]);
A ++;
get_arg [a] = va_arg (ap, dobbel);

va_end (ap);

Bildet nedenfor viser kommandokonsollen med inngangsargumentene hentet. I dette tilfellet ble funksjonen kalt med to inngangsargumenter.

Dataene hentet for en samtale med fem inngangsargumenter.

Problemer og løsninger ved å hente inndata med va_arg Makro

Hovedproblemet vi vil møte når vi utvikler en variadisk funksjon er at makroen va_arg har ingen metode for å informere programmereren om slutten av listen over inngangsargumenter. Så når alle dataene som er sendt i samtalen er hentet, vil denne makroen returnere feilaktige resultater hver gang den kalles på ubestemt tid

Dette betyr at du ikke bare vil få feil resultater, men i tilfeller der datainnhenting er loopet, vil det være et overløp. Derfor må programmereren komme med en metode for å oppdage slutten av argumentene på listen. En av metodene kan være å bruke en konstant som det siste argumentet som indikerer slutten av listen.

En annen metode er å spesifisere som det første argumentet antall parametere som skal sendes hver gang den variadiske funksjonen kalles.

Konklusjon

I denne linux hint Artikkel, vi har gitt deg en detaljert og fullstendig forklaring på hvordan variadiske funksjoner fungerer og hvordan du bruker va_arg Makro på C -språket.

Vi forklarte også i detalj bruken av de andre makroene som er en del av datagjenoppretting i denne typen funksjoner og viste deg trinn for trinn hvordan du skal erklære og utvikle en av dem som er en veldig viktig ressurs i dette og andre programmeringsspråk. Du kan finne flere artikler som dette i Linux -hint -søkemotoren.