2. 2
Περιεχόμενα
●
Δείκτες σε συναρτήσεις
●
Ψευδώνυμα τύπων με typedef
●
Διαβάζοντας δηλώσεις της C και το πρόγραμμα cdecl
●
Παραδείγματα
– Χειρισμών σημάτων του UNIX
– Ταξινόμηση πίνακα σε δομή με πολλαπλά κριτήρια
– Ένα σύστημα μενού επιλογών
●
Πίνακας σε δομή που περιέχει δείκτη σε συνάρτηση
3. 3
Δείκτες σε συναρτήσεις
●
Ένας δείκτης σε μια συνάρτηση (function pointer) function pointer) )
είναι ένας δείκτης που δείχνει στην διεύθυνση της
μνήμης που είναι ο κώδικας της συνάρτησης.
●
Ένας τέτοιος δείκτης μπορεί να αποθηκευτεί, να γίνει
όρισμα συνάρτησης, καθώς και να χρησιμοποιηθεί
σαν να ήταν η ίδια η συνάρτηση.
4. 4
Ένα παράδειγμα
#include <stdio.h>
double squareFunc(double in) {
return in * in;
}
int main() {
double (*pFunc)(double);
pFunc = squareFunc;
double res = (*pFunc)(4.0);
printf("res = %lfn", res); // prints 16.00
return 0;
}
Συνάρτηση
double -> double
Δείκτης σε συνάρτηση που
double-> double
Κλήση συνάρτησης
με χρήση δείκτη
9. 9
Η σπείρα των δηλώσεων
● str is
● str is an array 10 of
● ... pointers to
● ... pointers to char
10. 10
Η σπείρα των δηλώσεων :2
● fp is ...
● fp is a pointer to ...
● ... to a function ...
● ... passing an int and a
pointer to float ..
● ... returning a pointer to char
12. 12
Είναι εντάξει
αν δεν το
καταλαβαίνεις
Η σπείρα των δηλώσεων :3
signal is a function, passing an int and a
pointer to a function passing and int and return nothing
returning
a pointer to a function passing and int returning nothing
14. 14
Ασκήσεις
●
Με διαφορά το ποιο δύσκολο κομμάτι
της σύνταξης της γλωσσάς C
– αλλά δεν είναι τόσο δύσκολο όσο μοιάζει
●
Διαβάστε
https://cskill.wor) dpr) ess.com/2010/06/09/the-clockwisespir) al-r) ule-by-david-ander) son/
int * const * p;
int * const * (* p)();
char ( * ( * x ( ) ) [ ] ) ( );
char ( * ( * x [3] ) ( ) ) [5];
15. 15
The C++ ‘using’ keywor) d
Ποια διαβάζετε ευκολότερα;
(function pointer) σημείωση: η δεσμευμένη λέξη ‘using’ έχει πολλές άλλες χρήσεις)
// Old C
#define counter long
// C Syntax
typedef long counter;
typedef void (*fPtrA)();
typedef void (*fPtrB)(int);
// New C++11 Syntax
using counter = long;
using fPtrA = void (*)();
using fPtrB = void(*)(int);
// New C++14 syntax
using FunctionPtr = auto (*)(int*) -> void;
17. 17
Ομαλός τερματισμός με Ctr) l+C
●
Τα fuction pointers τα λέμε και signal
handlers ή callbacks
●
Όταν η ροή του προγράμματος δεν είναι
χρονικά καθορισμένη (function pointer) ασύγχρονος
προγραμματισμός)
●
Η ιδέα πίσω από τον προγραμματισμό
με γραφικά περιβάλλοντα GUI.
●
Παράδειγμα: Ασύγχρονος χειρισμός
σημάτων στο UNIX
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
void trapHandler(int dummy) {
puts("Bye bye cruel word!");
exit(1);
}
int main(void) {
signal(SIGINT, trapHandler);
puts("I take your computer forever!");
// run forever
for(;;) {
// Do nothing
}
puts("You will never see this text");
}
18. 18
Παράδειγμα: Ταξινόμηση
●
Να ταξινομηθεί ένας πίνακας που περιέχει μια δομή, με
αύξουσα η φθίνουσα σειρά με βάση κάποιο στοιχείο του ή
κάποιο συνδυασμό των στοιχείων της δομής
●
Να ταξινομηθούν τα στοιχεία των βιβλίων
– Κατά κόστος (function pointer) αύξουσα σειρά ταξινόμησης)
– Κατά όνομα συγγραφέα
– Κατά έτος έκδοσής (function pointer) τα ποιο καινούργια πρώτα)
25. 25
Τυπώνοντας το μενού
void printMenu(const menuLine_t *menuLines) {
int idx = 1;
const menuLine_t *menuLine = menuLines;
while (menuLine->text != NULL) {
string_t const text = menuLine->text;
printf("%i : %sn", idx, text);
idx++;
menuLine++;
}
}
26. 26
Επιλογή μενού
int getSelection(const menuLine_t *menuLines) {
int items = 0;
const menuLine_t *menuLine = menuLines;
while (menuLine->text != NULL) {
items++;
menuLine++;
}
int selectedNo = -1;
while (1) {
printf("Select menu action between %i and %i:", 1, items);
scanf("%d", &selectedNo);
if (selectedNo < 1 || selectedNo > items) {
printf("Not a valid no !!n");
printMenu(menuLines);
} else {
// printf("Entered number is valid.n");
return selectedNo - 1;
}
}
}
27. 27
Γιατί τόσο πολύπλοκο;
●
Για να δούμε μια ποιο πολύπλοκη δομή
– Δείκτης σε συνάρτηση, μέσα σε δομή, μέσα σε πίνακα
●
Επαναχρησιμοποιήσιμος κώδικας
●
Ευκολία επέκτασης και δημιουργίας υπομενού
●
Ευκολία μετατροπής σε άλλες αλληλεπιδράσεις χρήστη
– Σε ένα γραφικό περιβάλλον GUI
– Σε μια σελίδα HTML
28. 28
Ανακεφαλαίωση
●
Φτιάξαμε μια δομή δεδομένων και μεθόδους που
δρουν πάνω στην δομή.
●
Δηλαδή φτιάξαμε ένα αντικείμενο και κάναμε
προγραμματισμό με αντικείμενα
●
Ο αντικειμενοστραφής προγραμματισμός είναι κάτι
περισσότερο (function pointer) πχ πολυμορφισμός και κληρονομικότητα )
●
Ότι μπορείς να κάνεις με αντικειμενοστραφή
προγραμματισμό, μπορείς να τον κάνεις με απλή C,
με την βοήθεια πινάκων με δείκτες σε συναρτήσεις.