Διαβάζω για τους function pointers και ότι είναι χρήσιμοι λέει όταν θες callback. Μετά από αυτό το παράδειγμα μπερδεύτηκα ακόμα παραπανω.
Και οι 2 συναρτήσεις τρέχουν και παράγουν το ίδιο αποτέλεσμα. Με ποιον τρόπο διαφέρει η μία από την άλλη και που χρησιμεύουν σε απλά ελληνικά;Κώδικας:#include <iostream> // An example of a callback function bool update_progress( int pct ) { std::cout << pct << "% complete...\n"; return true; } // A function that runs for a while void some_long_operation( bool (*update_progress)(int) ) { for ( long l = 0; l < 100000000; l++ ) { if ( l % 10000000 == 0 ) { update_progress( l / 1000000 ); } } } void some_long_operation2() { for ( long l = 0; l < 100000000; l++ ) { if ( l % 10000000 == 0 ) { update_progress( l / 1000000 ); } } } int main( int argc, char **argv ) { some_long_operation( update_progress ); // ok some_long_operation2(); }
Εμφάνιση 1-5 από 5
-
18-11-18, 12:44 Τι είναι ένα callback και πως διαφέρει από μια κανονική κλήση συνάρτησης; #1Με ΜΑΤ και βία δεν βγαίνει πανδημία, Μιχαλάκη και Κούλη.
-
18-11-18, 16:39 Απάντηση: Τι είναι ένα callback και πως διαφέρει από μια κανονική κλήση συνάρτησης; #2
Ενα απλό παράδειγμα είναι οταν θέλεις να τρέξεις κατι σε διαφορετικό thread και να σε ενημερώσει ότι τελειωσε. Όταν γράφεις εσυ τον κώδικα και έχεις ενα αποτέλεσμα ειναι εύκολο να γράψεις ποια συνάρτηση θα καλέσει στο τέλος.
Όταν χρησιμοποιείς μια βιβλιοθήκη όμως και τρέξει κατι σε άλλο thread, πώς θα σε ενημερώσει ότι αυτό που έκανε τελείωσε; εκει του περνάς σαν παράμετρο τη συνάρτηση που θέλεις να καλέσει οταν τελειώσει (callback). Έτσι και το προγραμμα σου συνεχίζει να λειτουργεί κανονικά (πχ ένα gui παραμένει responsive) και ξέρεις πότε τελείωσε αυτό που έκανες.
Στο παράδειγμα που έχεις χρησιμοποιεί την callback για να ενημερώσει για το ποσοστό ολοκλήρωσης. Μπορεί να έχεις μια συνάρτηση που ειναι "βαριά" και 2 συναρτήσεις που ενημερώνουν για το ποσοστό ολοκληρωσης (πχ console και gui). Ανάλογα με το ποια θέλεις να χρησιμοποιήσεις την περνάς στη συνάρτηση ώστε να ενημερώνει τη σωστή.
- - - Updated - - -
Ίσως σε μπερδεύει ότι και στις δύο περιπτώσεις καλεί την update_progress.
Κώδικας:#include <iostream> // An example of a callback function bool update_progress( int pct ) { std::cout << pct << "% complete...\n"; return true; } // A function that runs for a while void some_long_operation( bool (*update_function)(int) ) { for ( long l = 0; l < 100000000; l++ ) { if ( l % 10000000 == 0 ) { update_function( l / 1000000 ); } } } void some_long_operation2() { for ( long l = 0; l < 100000000; l++ ) { if ( l % 10000000 == 0 ) { update_progress( l / 1000000 ); } } } int main( int argc, char **argv ) { some_long_operation( update_progress ); // ok some_long_operation2(); }
Η some_long_operation2 την καλεί με το όνομά της, ενώ η some_long_operation καλεί την συνάρτηση που κάποιος του δίνει σαν παράμετρο. Δηλαδή το void some_long_operation( bool (*update_function)(int) ) δηλώνει μία συνάρτηση που παίρνει σαν παράμετρο μία συνάρτηση που επιστρέφει bool και δέχεται σαν παράμετρο ένα int.
Κώδικας:#include <iostream> // An example of a callback function bool update_progress( int pct ) { std::cout << pct << "% complete...\n"; return true; } bool update_progress2( int pct ) { for(int i=0; i< pct; ++i) std::cout << '.'; std::cout << endl; return true; } // A function that runs for a while void some_long_operation( bool (*update_function)(int) ) { for ( long l = 0; l < 100000000; l++ ) { if ( l % 10000000 == 0 ) { update_function( l / 1000000 ); } } } void some_long_operation2() { for ( long l = 0; l < 100000000; l++ ) { if ( l % 10000000 == 0 ) { update_progress( l / 1000000 ); } } } int main( int argc, char **argv ) { some_long_operation( update_progress ); some_long_operation( update_progress2 ); some_long_operation2(); }
Με το some_long_operation2 δεν μπορείς να το πετύχεις χωρίς να αλλάξεις τον κώδικά του.
-
19-11-18, 15:55 Απάντηση: Τι είναι ένα callback και πως διαφέρει από μια κανονική κλήση συνάρτησης; #3
Στο πρώτο παράδειγμα χρησιμοποίησες την update_function και όχι *_progress. Ψάχνοντας το γιατί, βρήκα ότι δεν χρειάζεται να γνωρίζει ποια συνάρτηση (όνομα) θα καλέσει. Έχεις όμως στο δευτερο παράδειγμα, μια δεύτερη συνάρτηση με την ίδια υπογραφή. Πως αποφασίζει ποια συνάρτηση θα καλέσει με βάση τον function pointer;
Με ΜΑΤ και βία δεν βγαίνει πανδημία, Μιχαλάκη και Κούλη.
-
19-11-18, 16:48 Απάντηση: Τι είναι ένα callback και πως διαφέρει από μια κανονική κλήση συνάρτησης; #4
Αν δεις στην main, όταν καλούμε την some_long_operation του περνάμε σαν παράμετρο τη συνάρτηση που θα καλέσει όταν φτάσει στο update_function( l / 1000000 );. Οπότε την πρώτη φορά του δίνουμε το update_progress ενώ την δεύτερη το update_progress2. Δεν βρίσκει μόνο του μία συνάρτηση με αυτή την υπογραφή. Όποιος τον καλεί είναι υποχρεωμένος να του δώσει σαν παράμετρο μία συνάρτηση με αυτή την υπογραφή.
Είναι σαν να είχες μία συνάρτηση bool test(int x){, όποιος την καλεί πρέπει να περάσει σαν παράμετρο μία int μεταβλητή. Αν δεν την περάσει θα σκάσει στο compile. Μέσα στη συνάρτηση χρησιμοποιείς την μεταβλητή x σαν int.
Αντίστοιχα στην some_long_operation όποιος την καλέσει πρέπει να περάσει μία μεταβλητή με αυτή την υπογραφή (function ουσιαστικά). Αν δεν την περάσει θα σκάσει στο compile. Μέσα στη συνάρτηση χρησιμοποιείς την μεταβλητή update_function σαν (ένα δείκτη σε) μία συνάρτηση που παίρνει έναν ακέραιο και επιστρέφει ένα bool.
-
19-11-18, 23:18 Απάντηση: Τι είναι ένα callback και πως διαφέρει από μια κανονική κλήση συνάρτησης; #5
Έβγαζε μάτι τώρα που το λες
Αύριο θα μελετήσω και πως στο 1.2 αντικαθιστά την κλήση διαφορετικών συναρτήσεων με switch/multiple ifs, με την χρήση function pointers και ίσως επανέλθω. Ευχαριστώ για τον χρόνο σουΜε ΜΑΤ και βία δεν βγαίνει πανδημία, Μιχαλάκη και Κούλη.
Παρόμοια Θέματα
-
Πως γίνεται από 127mbit (fiber plus 100) να πέφτει στα 63mbit max rate;
Από psolord στο φόρουμ Wind VDSLΜηνύματα: 31Τελευταίο Μήνυμα: 24-11-20, 12:37 -
Πώς να συνδέσω μια ISDN γραμμή σε Freepbx κέντρο;
Από mechpanos στο φόρουμ Voice over IP (VoIP) Sip/Iax HardwareΜηνύματα: 44Τελευταίο Μήνυμα: 11-01-18, 19:25 -
Ευρωπαϊκό Δικαστήριο: το κόστος κλήσης στην εξυπηρέτηση πελατών δεν πρέπει να είναι μεγαλύτερο από μια τυπική κλήση
Από nnn στο φόρουμ ΕιδήσειςΜηνύματα: 30Τελευταίο Μήνυμα: 21-12-17, 18:16
Bookmarks