Suna inapoi

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În programare , un apel invers (sau, în italiană, rechemare ) este, în general, o funcție sau un „bloc de cod” care este transmis ca parametru unei alte funcții. În special, atunci când se referă la apelul invers invocat de o funcție, apelul invers este transmis ca argument la un parametru al funcției apelante. În acest fel, apelantul poate efectua o sarcină specifică (cea efectuată de apelul invers) care nu este, foarte des, cunoscută în momentul scrierii codului.

Dacă, pe de altă parte, ne referim la apelare ca o funcție apelată de sistemul de operare, aceasta este de obicei utilizată pentru a gestiona anumite evenimente: de la apăsarea unui buton cu mouse - ul , până la scrierea de caractere într-un câmp de text. Acest lucru permite apoi unui program de nivel inferior să apeleze o funcție (sau serviciu) definită la un nivel superior.

Exemple

Callback-urile au multe domenii de aplicare. Un exemplu practic al unei funcții care necesită un apel invers între parametri este funcția qsort a bibliotecii C standard . qsort implementează algoritmul de sortare Quicksort și poate fi folosit pentru a sorta o matrice care conține orice tip de date, atâta timp cât matricea se află complet în memorie.

Următorul fragment de cod sortează o listă ipotetică de soldați după rang și nume. În acest exemplu:

  • funcția de apel invers este ConfrontaSoldati care știe să compare soldații, dar nu știe nimic despre sortare
  • funcția generică este qsort care nu știe ce comandă, dar cunoscând dimensiunea matricei și apelând în mod repetat funcția de apel invers, reușește să facă swap-urile potrivite pentru a pune matricea în ordine.
 #include <stdlib.h>
#include <string.h>

#define CÂTE MULTE_SOLD 100

struct TSoldier {
    grad int ;
    numele char [ 80 ];
} Armată [ CÂȚI SOLDATI ];

int ConfrontaSoldati (const void * ptr1, const void * ptr2)
{
    const TSoldier * s1 = ( const TSoldier * ) ptr1 ; // GNU GCC Compiler are nevoie de cuvântul cheie „const” înainte de TSoldier
                                              // atât la stânga cât și la dreapta operatorului de atribuire
    const TSoldier * s2 = ( const TSoldier * ) ptr2 ; // ca mai sus

    if ( s1 -> grad ! = s2 -> grad )
        retur s1 -> grad - s2 -> grad ;

    return strcmp ( s1 -> nume , s2 -> nume );
}

nul Armata Ordinului ()
{
    qsort (Army, QUANTI_SOLDATI, sizeof (const TSoldato), ConfrontaSoldati); // ca mai sus, în interiorul „sizeof” înainte de TSoldier
                                                                         // scrieți cuvântul cheie „const”
}

Trebuie remarcat faptul că parametrii qsort sunt respectiv: baza matricei, cantitățile de elemente prezente, dimensiunea fiecărui element și funcția de apel invers ConfrontaSoldati .

Al doilea exemplu este un cod în C care ilustrează utilizarea apelurilor pentru a afișa 2 numere:

 #include <stdio.h>
#include <stdlib.h>

/ * Funcția de apelare primește un singur apel invers ca parametru * /
void PrintTwoNumbers ( int ( * numberSource ) ( void )) {
    printf ( "% d și% d \ n " , numberSource (), numberSource ());
}
 
/ * Un posibil apel invers * /
int overNineThousand ( nul ) {
    return ( rand () % 1000 ) + 9000 ;
}

/ * Alt posibil apel invers * /
int patruzeci și două ( nul ) {
    retur 42 ;
}
 
/ * Funcția PrintTwoNumbers () este apelată cu 3 apeluri de apel diferite * /
int main ( nul ) {
    PrintTwoNumbers ( rand );
    PrintTwoNumbers ( overNineThand );
    PrintTwoNumbers ( patruzeciDouă );
}

Rezultatul ar trebui să arate cam așa:

 125185 și 89188225
 9084 și 9441
 42 și 42

Observați cum este mai util să treceți funcția de apel invers către apelant, PrintTwoNumbers() , decât să imprimați întotdeauna aceeași valoare. PrintTwoNumbers apelează apelul de câte ori este necesar. Acesta este unul dintre cele două avantaje ale apelurilor de apel.

Al doilea avantaj este că funcția de apelare poate transmite orice parametru funcțiilor de apelare apelată. Aceasta implementează ascunderea corectă a informațiilor : codul clientului care transmite un apel de apel către funcția de apel nu trebuie să cunoască parametrii de apel de apel. Dacă, pe de altă parte, numai return value a apelului de apel ar fi transmis apelantului, aceasta ar fi expusă public. În acest caz, ascunderea informațiilor înseamnă că apelurile de apel pot fi folosite pentru a comunica mesaje și date între procese, sau între fire , sau pentru a trimite comunicații serializate, prin rețea etc.

Elemente conexe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT