Atzvanīšanas funkcija C ++

Callback Function C



Atzvanīšanas funkcija ir funkcija, kas ir arguments, nevis parametrs citā funkcijā. Citu funkciju var saukt par galveno funkciju. Tātad ir iesaistītas divas funkcijas: galvenā funkcija un pati atzvanīšanas funkcija. Galvenās funkcijas parametru sarakstā ir atzvanīšanas funkcijas deklarācija bez tās definīcijas, tāpat kā objekta deklarācijas bez piešķiršanas. Galvenā funkcija tiek izsaukta ar argumentiem (in main ()). Viens no argumentiem galvenās funkcijas izsaukumā ir efektīva atzvanīšanas funkcijas definīcija. C ++ šis arguments ir atsauce uz atzvanīšanas funkcijas definīciju; tā nav faktiskā definīcija. Pati atzvanīšanas funkcija faktiski tiek izsaukta galvenās funkcijas definīcijas ietvaros.

C ++ pamata atzvanīšanas funkcija negarantē asinhronu darbību programmā. Asinhronā uzvedība ir patiesais atzvanīšanas funkciju shēmas ieguvums. Asinhronās atzvanīšanas funkciju shēmā galvenās funkcijas rezultāts programmai jāiegūst pirms atzvanīšanas funkcijas rezultāta iegūšanas. To ir iespējams izdarīt C ++; tomēr C ++ ir bibliotēka ar nosaukumu nākotne, lai garantētu asinhronās atzvanīšanas funkciju shēmas darbību.







Šajā rakstā ir izskaidrota atzvanīšanas pamata shēma. Daudz kas ir ar tīru C ++. Kas attiecas uz atzvanīšanu, tiek izskaidrota arī topošās bibliotēkas pamata uzvedība. Pamatzināšanas par C ++ un tā norādēm ir nepieciešamas šī raksta izpratnei.



Raksta saturs

Atzvanīšanas pamata shēma

Atzvanīšanas funkciju shēmai ir nepieciešama galvenā funkcija un pati atzvanīšanas funkcija. Atzvanīšanas funkcijas deklarācija ir daļa no galvenās funkcijas parametru saraksta. Atzvanīšanas funkcijas definīcija ir norādīta galvenās funkcijas funkcijas izsaukumā. Atzvanīšanas funkcija faktiski tiek izsaukta galvenās funkcijas definīcijas ietvaros. Šī programma to ilustrē:



#iekļaut

izmantojot vārda telpastundas;



intmainFn(charch[],int (*ptr)(int))

{

intid1= 1;

intid2= 2;

intparasti= (*ptr)(id2);

izmaksas<<'galvenā funkcija:'<<id1<<''<<ch<<''<<parasti<<' n';

atgrieztiesid1;

}


intcb(intidentif)

{

izmaksas<<'atzvanīšanas funkcija'<<' n';

atgrieztiesidentif;

}


intgalvenais()

{

int (*ptr)(int) = &cb;

char[] = 'un';

mainFn(tēvs, cb);



atgriezties 0;

}

Rezultāts ir šāds:





atzvanīšanas funkcija

galvenā funkcija: 1 un 2

Galveno funkciju identificē ar principFF (). Atzvanīšanas funkciju identificē ar cb (). Atzvanīšanas funkcija ir definēta ārpus galvenās funkcijas, bet faktiski tiek izsaukta galvenajā funkcijā.

Ievērojiet atzvanīšanas funkcijas deklarāciju kā parametru galvenās funkcijas deklarācijas parametru sarakstā. Atzvanīšanas funkcijas deklarācija ir int (*ptr) (int). Ievērojiet atzvanīšanas funkcijas izteiksmi, piemēram, funkcijas izsaukumu, galvenās funkcijas definīcijā; tur tiek nodots jebkurš atzvanīšanas funkcijas izsaukšanas arguments. Šīs funkcijas izsaukuma paziņojums ir šāds:



intparasti= (*ptr)(id2);

Kur id2 ir arguments. ptr ir daļa no parametra, rādītājs, kas tiks saistīts ar atzvanīšanas funkcijas atsauci galvenajā () funkcijā.

Ievērojiet izteicienu:

int (*ptr)(int) = &cb;

Galvenajā () funkcijā, kas saista atzvanīšanas funkcijas deklarāciju (bez definīcijas) ar tās pašas atzvanīšanas funkcijas definīcijas nosaukumu.

Galveno funkciju galvenajā () funkcijā sauc par:

mainFn(tēvs, cb);

Kur cha ir virkne un cb ir atzvanīšanas funkcijas nosaukums bez neviena tās argumenta.

Atzvanīšanas funkcijas sinhronā darbība

Apsveriet šādu programmu:

#iekļaut

izmantojot vārda telpastundas;



spēkā neesošsmainFn(spēkā neesošs (*ptr)())

{

izmaksas<<'galvenā funkcija'<<' n';

(*ptr)();

}


spēkā neesošscb()

{

izmaksas<<'atzvanīšanas funkcija'<<' n';

}


spēkā neesošsfn()

{

izmaksas<<'redzēts'<<' n';

}


intgalvenais()

{

spēkā neesošs (*ptr)() = &cb;

mainFn(cb);

fn();



atgriezties 0;

}

Rezultāts ir šāds:

galvenā funkcija

atzvanīšanas funkcija

redzēts

Šeit ir jauna funkcija. Viss, ko jaunā funkcija dara, ir parādīt redzamo izvadi. Galvenajā () funkcijā tiek izsaukta galvenā funkcija, pēc tam tiek izsaukta jaunā funkcija fn (). Rezultāts parāda, ka tika izpildīts galvenās funkcijas kods, pēc tam atzvanīšanas funkcijas kods un visbeidzot fn () funkcija. Tā ir sinhrona (viena pavediena) darbība.

Ja tā būtu asinhrona darbība, kad tiek izsaukti trīs koda segmenti, pēc pirmā koda segmenta izpildes var tikt izpildīts pirmais koda segments, kam seko trešā koda segmenta izpilde.

Funkciju fn () var izsaukt no galvenās funkcijas definīcijas, nevis no galvenās () funkcijas:

#iekļaut

izmantojot vārda telpastundas;



spēkā neesošsfn()

{

izmaksas<<'redzēts'<<' n';

}


spēkā neesošsmainFn(spēkā neesošs (*ptr)())

{

izmaksas<<'galvenā funkcija'<<' n';

fn();

(*ptr)();

}


spēkā neesošscb()

{

izmaksas<<'atzvanīšanas funkcija'<<' n';

}


intgalvenais()

{

spēkā neesošs (*ptr)() = &cb;

mainFn(cb);



atgriezties 0;

}

Rezultāts ir šāds:

galvenā funkcija

redzēts

atzvanīšanas funkcija

Šī ir asinhronas uzvedības imitācija. Tā nav asinhrona uzvedība. Tā joprojām ir sinhrona uzvedība.

Tāpat galvenās funkcijas definīcijā var tikt mainīta galvenās funkcijas koda segmenta un atzvanīšanas funkcijas koda segmenta izpildes secība. Šī programma to ilustrē:

#iekļaut

izmantojot vārda telpastundas;



spēkā neesošsmainFn(spēkā neesošs (*ptr)())

{

(*ptr)();

izmaksas<<'galvenā funkcija'<<' n';

}


spēkā neesošscb()

{

izmaksas<<'atzvanīšanas funkcija'<<' n';

}


spēkā neesošsfn()

{

izmaksas<<'redzēts'<<' n';

}


intgalvenais()

{

spēkā neesošs (*ptr)() = &cb;

mainFn(cb);

fn();



atgriezties 0;

}

Rezultāts tagad ir,

atzvanīšanas funkcija

galvenā funkcija

redzēts

Tā ir arī asinhronas uzvedības imitācija. Tā nav asinhrona uzvedība. Tā joprojām ir sinhrona uzvedība. Patiesu asinhronu uzvedību var iegūt, kā paskaidrots nākamajā sadaļā vai ar bibliotēku nākotnē.

Asinhrona uzvedība ar atzvanīšanas funkciju

Asinhronās atzvanīšanas pamata shēmas pseidokods ir šāds:

tipa izvade;

tips cb(tipa izvade)

{

//paziņojumi

}


tips principālsFn(tipa ievade, tips cb(tipa izvade))

{

//paziņojumi

}

Ievērojiet ievades un izvades datu pozīcijas dažādās pseidokoda vietās. Atzvanīšanas funkcijas ievade ir tās izvade. Galvenās funkcijas parametri ir vispārējā koda ievades parametrs un atzvanīšanas funkcijas parametrs. Izmantojot šo shēmu, galvenajā () funkcijā var izpildīt (izsaukt) trešo funkciju, pirms tiek nolasīta atzvanīšanas funkcijas izvade (joprojām atrodas galvenajā () funkcijā). To ilustrē šāds kods:

#iekļaut

izmantojot vārda telpastundas;

char *izvade;


spēkā neesošscb(charārā[])

{

izvade=ārā;

}



spēkā neesošsmainFn(charievadi[],spēkā neesošs (*ptr)(char[piecdesmit]))

{

(*ptr)(ievadi);

izmaksas<<'galvenā funkcija'<<' n';

}


spēkā neesošsfn()

{

izmaksas<<'redzēts'<<' n';

}


intgalvenais()

{

charievadi[] = 'atzvanīšanas funkcija';

spēkā neesošs (*ptr)(char[]) = &cb;

mainFn(ievade, cb);

fn();

izmaksas<<izvade<<' n';



atgriezties 0;

}

Programmas iznākums ir šāds:

galvenā funkcija

redzēts

atzvanīšanas funkcija

Šajā konkrētajā kodā izejas un ievades atskaites punkts ir viens un tas pats. Trešās funkcijas izsaukuma rezultāts galvenajā () funkcijā ir parādīts pirms atzvanīšanas funkcijas rezultāta. Atzvanīšanas funkcija izpildīja, pabeidza un piešķīra tās rezultātu (vērtību) mainīgajam izvadam, ļaujot programmai turpināties bez iejaukšanās. Galvenajā () funkcijā atzvanīšanas funkcijas izvads tika izmantots (lasīts un parādīts), kad tas bija nepieciešams, izraisot asinhronu darbību visā shēmā.

Tas ir vienvirziena veids, kā iegūt atzvanīšanas funkcijas asinhrono darbību ar tīru C ++.

Topošās bibliotēkas pamata izmantošana

Asinhronās atzvanīšanas funkciju shēmas ideja ir tāda, ka galvenā funkcija atgriežas pirms atzvanīšanas funkcijas atgriešanās. Tas tika darīts netieši, efektīvi, izmantojot iepriekš minēto kodu.

Ievērojiet no iepriekš minētā koda, ka atzvanīšanas funkcija saņem galveno koda ievadi un rada koda galveno izvadi. Nākotnes C ++ bibliotēkai ir funkcija sinhronizācija (). Pirmais šīs funkcijas arguments ir atzvanīšanas funkcijas atsauce; otrs arguments ir atzvanīšanas funkcijas ievade. Funkcija sinhronizācija () atgriežas, negaidot atzvanīšanas funkcijas izpildi, bet ļauj atzvanīšanas funkcijai pabeigt. Tas nodrošina asinhronu uzvedību. Kamēr atzvanīšanas funkcija turpina darboties, jo sinhronizācijas () funkcija jau ir atgriezusies, tālāk esošie paziņojumi tiek izpildīti. Tas ir kā ideāla asinhrona uzvedība.

Iepriekš minētā programma ir pārrakstīta zemāk, ņemot vērā turpmāko bibliotēku un tās sinhronizācijas () funkciju:

#iekļaut

#iekļaut

#iekļaut

izmantojot vārda telpastundas;

nākotne<virkne>izvade;

virkne cb(virkne stri)

{

atgrieztiesstri;

}



spēkā neesošsmainFn(virknes ievade)

{

izvade=asinhronizēt(cb, ievade);

izmaksas<<'galvenā funkcija'<<' n';

}


spēkā neesošsfn()

{

izmaksas<<'redzēts'<<' n';

}


intgalvenais()

{

virknes ievade=virkne('atzvanīšanas funkcija');

mainFn(ievadi);

fn();

virkne ret=izvade.gūt(); // gaida, kad atzvanīs, ja nepieciešams

izmaksas<<taisnība<<' n';



atgriezties 0;

}

Funkcija sinhronizācija () beidzot saglabā atzvanīšanas funkcijas izvadi nākotnes objektā. Paredzēto izvadi var iegūt galvenajā () funkcijā, izmantojot nākamā objekta dalībnieka funkciju get ().

Secinājums

Atzvanīšanas funkcija ir funkcija, kas ir arguments, nevis parametrs citā funkcijā. Atzvanīšanas funkciju shēmai ir nepieciešama galvenā funkcija un pati atzvanīšanas funkcija. Atzvanīšanas funkcijas deklarācija ir daļa no galvenās funkcijas parametru saraksta. Atzvanīšanas funkcijas definīcija ir norādīta galvenās funkcijas funkcijas izsaukumā (galvenajā ()). Atzvanīšanas funkcija faktiski tiek izsaukta galvenās funkcijas definīcijas ietvaros.

Atzvanīšanas funkciju shēma nav obligāti asinhrona. Lai pārliecinātos, ka atzvanīšanas funkciju shēma ir asinhrona, ievadiet galveno kodu, ievadiet atzvanīšanas funkciju; veikt koda galveno izvadi, atzvanīšanas funkcijas izvadi; saglabāt atzvanīšanas funkcijas izvadi mainīgā vai datu struktūrā. Galvenajā () funkcijā pēc galvenās funkcijas izsaukšanas izpildiet citus lietojumprogrammas paziņojumus. Ja ir nepieciešama atzvanīšanas funkcijas izvade, galvenajā () funkcijā izmantojiet to (lasiet un parādiet) tur un tad.