SlideShare a Scribd company logo
1 of 29
Download to read offline
Δείκτες σε συναρτήσεις
και δομές δεδομένων
Δομημένος Προγραμματισμός
Τσαγκατάκης Ιωάννης
2
Περιεχόμενα
●
Δείκτες σε συναρτήσεις
●
Ψευδώνυμα τύπων με typedef
●
Διαβάζοντας δηλώσεις της C και το πρόγραμμα cdecl
●
Παραδείγματα
– Χειρισμών σημάτων του UNIX
– Ταξινόμηση πίνακα σε δομή με πολλαπλά κριτήρια
– Ένα σύστημα μενού επιλογών
●
Πίνακας σε δομή που περιέχει δείκτη σε συνάρτηση
3
Δείκτες σε συναρτήσεις
●
Ένας δείκτης σε μια συνάρτηση (function pointer) function pointer) )
είναι ένας δείκτης που δείχνει στην διεύθυνση της
μνήμης που είναι ο κώδικας της συνάρτησης.
●
Ένας τέτοιος δείκτης μπορεί να αποθηκευτεί, να γίνει
όρισμα συνάρτησης, καθώς και να χρησιμοποιηθεί
σαν να ήταν η ίδια η συνάρτηση.
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
Κλήση συνάρτησης
με χρήση δείκτη
5Image cr) edit https://www.nor) wegiancr) eations.com/2017/10/getting-star) ted-with-pr) ogr) amming-par) t-8-typedef-and-str) ucts/
6
Η δεσμευμένη λέξη typedef
●
Δημιουργεί ψευδώνυμα για υπάρχοντες τύπους
typedef char *string_t;
typedef int money_t;
typedef struct {
string_t title;
string_t author;
money_t cost;
} book_t;
string_t name = "Vasilakis";
money_t sum = 0;
book_t bestSciFiBooks[] = {
{"The Dispossessed","Ursula K. Le Guin", 1490},
{"Dune", "Frank Herbert", 1990},
{"Stranger in a strange land", "Robert Heinlein", 500},
{"Foundation", "Isaac Asimov", 999},
{"Solaris", "Stanislaw Lem", 1250}
};
7
Δείκτες σε συναρτήσεις (function pointer) typedef)
typedef double (*compute_fn)(double);
int main() {
compute_fn pFunc = squareFunc;
double res = (*pFunc)(4.0);
printf("res = %lfn", res); // prints 16.00
return 0;
}
Κλήση συνάρτησης
με χρήση δείκτη
Ορισμός τύπου
δείκτη σε συνάρτηση που
double -> double
// double (*pFunc)(double);
8
Πως να διαβάζω δηλώσεις
9
Η σπείρα των δηλώσεων
● str is
● str is an array 10 of
● ... pointers to
● ... pointers to char
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
11
Η σπείρα των δηλώσεων :3
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
13
Το πρόγραμμα cdecl
ή στο web στην διεύθυνση https://cdecl.or) g/
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
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;
16
Παραδείγματα χρήσης
Δείκτες σε συναρτήσεις
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
Παράδειγμα: Ταξινόμηση
●
Να ταξινομηθεί ένας πίνακας που περιέχει μια δομή, με
αύξουσα η φθίνουσα σειρά με βάση κάποιο στοιχείο του ή
κάποιο συνδυασμό των στοιχείων της δομής
●
Να ταξινομηθούν τα στοιχεία των βιβλίων
– Κατά κόστος (function pointer) αύξουσα σειρά ταξινόμησης)
– Κατά όνομα συγγραφέα
– Κατά έτος έκδοσής (function pointer) τα ποιο καινούργια πρώτα)
19
Η δομή στην μνήμη
20
Ταξινόμηση πινάκων με δομές :1
#include <stdlib.h>
#include <string.h>
// Compare 2 books by price
int compare_price(const void *a, const void *b){
const book_t *pA = (const book_t *) a;
const book_t *pB = (const book_t *) b;
return (pA->cost) < (pB->cost);
}
// Compare 2 books by author name
int compare_author(const void *a, const void *b){
const book_t *pA = (const book_t *) a;
const book_t *pB = (const book_t *) b;
return strcmp(pA->author, pB->author);
}
21
Ταξινόμηση πινάκων με δομές :2
int main() {
size_t books_len = sizeof(bestSciFiBooks) / sizeof(book_t);
qsort(bestSciFiBooks, books_len, sizeof(book_t), compare_author);
// Print books
for(int i=0; i != books_len; ++i) {
book_t *book = &bestSciFiBooks[i];
printf("%i: %s, cost: %.2f€ n", i, book->title, book->cost/100.0 );
}
}
22
Ένα σύστημα μενού
23
Ένα σύστημα μενού
#include <stdbool.h>
#include <stdio.h>
typedef bool (*menuFnc_t)(double *data);
typedef char *string_t;
typedef struct {
const string_t text;
const menuFnc_t action;
} menuLine_t;
int main() {
double dummy = 42;
const menuLine_t menuLines[] = {
{"Sort by Price", sortPriceAction},
{"Sort by Author", sortAuthorAction},
{"Print books", printAction},
{"Exit program", exitAction},
{NULL, NULL} // End guard
};
while (1) {
printMenu(menuLines);
int selection = getSelection(menuLines);
bool exit = (menuLines[selection].action)(&dummy);
if (exit)
break;
}
}
24
Οι ενέργειες
bool exitAction(double *data) {
// TODO: Ask for yes/no
puts("Bye!");
return true;
};
bool sortPriceAction(double *data) {
puts("TODO: sort by price");
return false;
};
bool sortAuthorAction(double
*data) {
puts("TODO: sort by author");
return false;
};
bool printAction(double *data) {
puts("TODO: print table");
return false;
};
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
Επιλογή μενού
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
Γιατί τόσο πολύπλοκο;
●
Για να δούμε μια ποιο πολύπλοκη δομή
– Δείκτης σε συνάρτηση, μέσα σε δομή, μέσα σε πίνακα
●
Επαναχρησιμοποιήσιμος κώδικας
●
Ευκολία επέκτασης και δημιουργίας υπομενού
●
Ευκολία μετατροπής σε άλλες αλληλεπιδράσεις χρήστη
– Σε ένα γραφικό περιβάλλον GUI
– Σε μια σελίδα HTML
28
Ανακεφαλαίωση
●
Φτιάξαμε μια δομή δεδομένων και μεθόδους που
δρουν πάνω στην δομή.
●
Δηλαδή φτιάξαμε ένα αντικείμενο και κάναμε
προγραμματισμό με αντικείμενα
●
Ο αντικειμενοστραφής προγραμματισμός είναι κάτι
περισσότερο (function pointer) πχ πολυμορφισμός και κληρονομικότητα )
●
Ότι μπορείς να κάνεις με αντικειμενοστραφή
προγραμματισμό, μπορείς να τον κάνεις με απλή C,
με την βοήθεια πινάκων με δείκτες σε συναρτήσεις.
29
Ήταν δύσκολο;

More Related Content

What's hot

Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣDimitris Psounis
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 11
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 11ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 11
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 11Dimitris Psounis
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥDimitris Psounis
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18 ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18 Dimitris Psounis
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑDimitris Psounis
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣDimitris Psounis
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣDimitris Psounis
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12Dimitris Psounis
 
Η Γλώσσα C - Μάθημα 2
Η Γλώσσα C - Μάθημα 2Η Γλώσσα C - Μάθημα 2
Η Γλώσσα C - Μάθημα 2Dimitris Psounis
 
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣDimitris Psounis
 
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑ
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑ
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑDimitris Psounis
 
Η Γλώσσα C - Μάθημα 1
Η Γλώσσα C - Μάθημα 1Η Γλώσσα C - Μάθημα 1
Η Γλώσσα C - Μάθημα 1Dimitris Psounis
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥDimitris Psounis
 

What's hot (20)

Python Κεφ. 1.6.1 Πίνακες
Python Κεφ. 1.6.1 ΠίνακεςPython Κεφ. 1.6.1 Πίνακες
Python Κεφ. 1.6.1 Πίνακες
 
ΠΛΗ10 ΤΕΣΤ 15
ΠΛΗ10 ΤΕΣΤ 15ΠΛΗ10 ΤΕΣΤ 15
ΠΛΗ10 ΤΕΣΤ 15
 
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 11
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 11ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 11
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 11
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 15 - ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ
 
ΠΛΗ10 ΤΕΣΤ 21
ΠΛΗ10 ΤΕΣΤ 21ΠΛΗ10 ΤΕΣΤ 21
ΠΛΗ10 ΤΕΣΤ 21
 
Python Κεφ. 1.5 συναρτήσεις
Python Κεφ. 1.5 συναρτήσειςPython Κεφ. 1.5 συναρτήσεις
Python Κεφ. 1.5 συναρτήσεις
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18 ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 18
 
ΠΛΗ10 ΤΕΣΤ 31
ΠΛΗ10 ΤΕΣΤ 31ΠΛΗ10 ΤΕΣΤ 31
ΠΛΗ10 ΤΕΣΤ 31
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ
 
Python - Bασικές Aρχές Προγραμματισμού - Κεφ. 3
Python - Bασικές Aρχές Προγραμματισμού - Κεφ. 3Python - Bασικές Aρχές Προγραμματισμού - Κεφ. 3
Python - Bασικές Aρχές Προγραμματισμού - Κεφ. 3
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 7 - ΠΙΝΑΚΕΣ
 
Python Programming, 1st Test 2016-17
Python Programming, 1st Test 2016-17Python Programming, 1st Test 2016-17
Python Programming, 1st Test 2016-17
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣΗ ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 8 - ΔΕΙΚΤΕΣ
 
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12
Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 12
 
Η Γλώσσα C - Μάθημα 2
Η Γλώσσα C - Μάθημα 2Η Γλώσσα C - Μάθημα 2
Η Γλώσσα C - Μάθημα 2
 
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 4 - ΚΛΑΣΕΙΣ ΚΑΙ ΑΝΑΦΟΡΕΣ
 
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑ
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑ
ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 1 - ΔΙΑΠΕΡΑΣΗ ΠΙΝΑΚΑ
 
Η Γλώσσα C - Μάθημα 1
Η Γλώσσα C - Μάθημα 1Η Γλώσσα C - Μάθημα 1
Η Γλώσσα C - Μάθημα 1
 
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥ
ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 4 - ΤΕΛΕΣΤΕΣ και η ΔΟΜΗ ΕΛΕΓΧΟΥ
 

Similar to Function pointers in C

Advanced Notes on Pointers
Advanced Notes on PointersAdvanced Notes on Pointers
Advanced Notes on Pointersjtsagata
 
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...Panagiotis Kanavos
 
Κωνσταντίνος Σιδέρης 7254
Κωνσταντίνος Σιδέρης 7254Κωνσταντίνος Σιδέρης 7254
Κωνσταντίνος Σιδέρης 7254ISSEL
 
Kef10 a synartiseis
Kef10 a synartiseisKef10 a synartiseis
Kef10 a synartiseismnikol
 
Eισαγωγή στο TDD
Eισαγωγή στο TDDEισαγωγή στο TDD
Eισαγωγή στο TDDjtsagata
 
5.1 python γενικά - υπολογισμοί & μεταβλητές
5.1 python γενικά - υπολογισμοί & μεταβλητές5.1 python γενικά - υπολογισμοί & μεταβλητές
5.1 python γενικά - υπολογισμοί & μεταβλητέςPanagiotis Mastrapas
 
C_01122023.pdf
C_01122023.pdfC_01122023.pdf
C_01122023.pdfargideli1
 
Πρόγραμμα υπολογισμού εμβαδού σε C - 1
Πρόγραμμα υπολογισμού εμβαδού σε C - 1Πρόγραμμα υπολογισμού εμβαδού σε C - 1
Πρόγραμμα υπολογισμού εμβαδού σε C - 1Stathis Gourzis
 
13 Προγράμματα Pascal
13 Προγράμματα Pascal13 Προγράμματα Pascal
13 Προγράμματα PascalStathis Gourzis
 
C_24112023.pdf
C_24112023.pdfC_24112023.pdf
C_24112023.pdfargideli1
 
κεφάλαιο 02 anaptixi-2
κεφάλαιο 02 anaptixi-2κεφάλαιο 02 anaptixi-2
κεφάλαιο 02 anaptixi-2evaplyta
 

Similar to Function pointers in C (18)

Advanced Notes on Pointers
Advanced Notes on PointersAdvanced Notes on Pointers
Advanced Notes on Pointers
 
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
 
Lecture 1
Lecture 1Lecture 1
Lecture 1
 
ΛΣ2THREADSv2
ΛΣ2THREADSv2ΛΣ2THREADSv2
ΛΣ2THREADSv2
 
Κωνσταντίνος Σιδέρης 7254
Κωνσταντίνος Σιδέρης 7254Κωνσταντίνος Σιδέρης 7254
Κωνσταντίνος Σιδέρης 7254
 
Processes
ProcessesProcesses
Processes
 
ΛΣ2_IPC
ΛΣ2_IPCΛΣ2_IPC
ΛΣ2_IPC
 
Kef10 a synartiseis
Kef10 a synartiseisKef10 a synartiseis
Kef10 a synartiseis
 
ΛΣ1FILES2v0
ΛΣ1FILES2v0ΛΣ1FILES2v0
ΛΣ1FILES2v0
 
Eισαγωγή στο TDD
Eισαγωγή στο TDDEισαγωγή στο TDD
Eισαγωγή στο TDD
 
5.1 python γενικά - υπολογισμοί & μεταβλητές
5.1 python γενικά - υπολογισμοί & μεταβλητές5.1 python γενικά - υπολογισμοί & μεταβλητές
5.1 python γενικά - υπολογισμοί & μεταβλητές
 
C_01122023.pdf
C_01122023.pdfC_01122023.pdf
C_01122023.pdf
 
Πρόγραμμα υπολογισμού εμβαδού σε C - 1
Πρόγραμμα υπολογισμού εμβαδού σε C - 1Πρόγραμμα υπολογισμού εμβαδού σε C - 1
Πρόγραμμα υπολογισμού εμβαδού σε C - 1
 
13 Προγράμματα Pascal
13 Προγράμματα Pascal13 Προγράμματα Pascal
13 Προγράμματα Pascal
 
Avouris teaching python
Avouris teaching pythonAvouris teaching python
Avouris teaching python
 
Parousiash
ParousiashParousiash
Parousiash
 
C_24112023.pdf
C_24112023.pdfC_24112023.pdf
C_24112023.pdf
 
κεφάλαιο 02 anaptixi-2
κεφάλαιο 02 anaptixi-2κεφάλαιο 02 anaptixi-2
κεφάλαιο 02 anaptixi-2
 

More from jtsagata

GPGPU Computation
GPGPU ComputationGPGPU Computation
GPGPU Computationjtsagata
 
Linux and C
Linux and CLinux and C
Linux and Cjtsagata
 
Greek utf8
Greek utf8Greek utf8
Greek utf8jtsagata
 
Why computers can' compute
Why computers can' computeWhy computers can' compute
Why computers can' computejtsagata
 
Τι είναι υπολογισμός
Τι είναι υπολογισμόςΤι είναι υπολογισμός
Τι είναι υπολογισμόςjtsagata
 
IEEE 754 Floating point
IEEE 754 Floating pointIEEE 754 Floating point
IEEE 754 Floating pointjtsagata
 
Η Τέχνη του TeX/LaTeX
Η Τέχνη του TeX/LaTeXΗ Τέχνη του TeX/LaTeX
Η Τέχνη του TeX/LaTeXjtsagata
 
Unikernels
UnikernelsUnikernels
Unikernelsjtsagata
 
FPGA on the Cloud
FPGA on the Cloud FPGA on the Cloud
FPGA on the Cloud jtsagata
 
Evolutionary keyboard Layout
Evolutionary keyboard LayoutEvolutionary keyboard Layout
Evolutionary keyboard Layoutjtsagata
 
Το εργαλείο
Το εργαλείοΤο εργαλείο
Το εργαλείοjtsagata
 

More from jtsagata (14)

C locales
C localesC locales
C locales
 
GPGPU Computation
GPGPU ComputationGPGPU Computation
GPGPU Computation
 
Linux and C
Linux and CLinux and C
Linux and C
 
Git intro
Git introGit intro
Git intro
 
Greek utf8
Greek utf8Greek utf8
Greek utf8
 
Why computers can' compute
Why computers can' computeWhy computers can' compute
Why computers can' compute
 
Τι είναι υπολογισμός
Τι είναι υπολογισμόςΤι είναι υπολογισμός
Τι είναι υπολογισμός
 
IEEE 754 Floating point
IEEE 754 Floating pointIEEE 754 Floating point
IEEE 754 Floating point
 
Η Τέχνη του TeX/LaTeX
Η Τέχνη του TeX/LaTeXΗ Τέχνη του TeX/LaTeX
Η Τέχνη του TeX/LaTeX
 
Unikernels
UnikernelsUnikernels
Unikernels
 
FPGA on the Cloud
FPGA on the Cloud FPGA on the Cloud
FPGA on the Cloud
 
Evolutionary keyboard Layout
Evolutionary keyboard LayoutEvolutionary keyboard Layout
Evolutionary keyboard Layout
 
Omilia
OmiliaOmilia
Omilia
 
Το εργαλείο
Το εργαλείοΤο εργαλείο
Το εργαλείο
 

Function pointers in C

  • 1. Δείκτες σε συναρτήσεις και δομές δεδομένων Δομημένος Προγραμματισμός Τσαγκατάκης Ιωάννης
  • 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 Κλήση συνάρτησης με χρήση δείκτη
  • 5. 5Image cr) edit https://www.nor) wegiancr) eations.com/2017/10/getting-star) ted-with-pr) ogr) amming-par) t-8-typedef-and-str) ucts/
  • 6. 6 Η δεσμευμένη λέξη typedef ● Δημιουργεί ψευδώνυμα για υπάρχοντες τύπους typedef char *string_t; typedef int money_t; typedef struct { string_t title; string_t author; money_t cost; } book_t; string_t name = "Vasilakis"; money_t sum = 0; book_t bestSciFiBooks[] = { {"The Dispossessed","Ursula K. Le Guin", 1490}, {"Dune", "Frank Herbert", 1990}, {"Stranger in a strange land", "Robert Heinlein", 500}, {"Foundation", "Isaac Asimov", 999}, {"Solaris", "Stanislaw Lem", 1250} };
  • 7. 7 Δείκτες σε συναρτήσεις (function pointer) typedef) typedef double (*compute_fn)(double); int main() { compute_fn pFunc = squareFunc; double res = (*pFunc)(4.0); printf("res = %lfn", res); // prints 16.00 return 0; } Κλήση συνάρτησης με χρήση δείκτη Ορισμός τύπου δείκτη σε συνάρτηση που double -> double // double (*pFunc)(double);
  • 8. 8 Πως να διαβάζω δηλώσεις
  • 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
  • 11. 11 Η σπείρα των δηλώσεων :3
  • 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
  • 13. 13 Το πρόγραμμα cdecl ή στο web στην διεύθυνση https://cdecl.or) g/
  • 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) τα ποιο καινούργια πρώτα)
  • 20. 20 Ταξινόμηση πινάκων με δομές :1 #include <stdlib.h> #include <string.h> // Compare 2 books by price int compare_price(const void *a, const void *b){ const book_t *pA = (const book_t *) a; const book_t *pB = (const book_t *) b; return (pA->cost) < (pB->cost); } // Compare 2 books by author name int compare_author(const void *a, const void *b){ const book_t *pA = (const book_t *) a; const book_t *pB = (const book_t *) b; return strcmp(pA->author, pB->author); }
  • 21. 21 Ταξινόμηση πινάκων με δομές :2 int main() { size_t books_len = sizeof(bestSciFiBooks) / sizeof(book_t); qsort(bestSciFiBooks, books_len, sizeof(book_t), compare_author); // Print books for(int i=0; i != books_len; ++i) { book_t *book = &bestSciFiBooks[i]; printf("%i: %s, cost: %.2f€ n", i, book->title, book->cost/100.0 ); } }
  • 23. 23 Ένα σύστημα μενού #include <stdbool.h> #include <stdio.h> typedef bool (*menuFnc_t)(double *data); typedef char *string_t; typedef struct { const string_t text; const menuFnc_t action; } menuLine_t; int main() { double dummy = 42; const menuLine_t menuLines[] = { {"Sort by Price", sortPriceAction}, {"Sort by Author", sortAuthorAction}, {"Print books", printAction}, {"Exit program", exitAction}, {NULL, NULL} // End guard }; while (1) { printMenu(menuLines); int selection = getSelection(menuLines); bool exit = (menuLines[selection].action)(&dummy); if (exit) break; } }
  • 24. 24 Οι ενέργειες bool exitAction(double *data) { // TODO: Ask for yes/no puts("Bye!"); return true; }; bool sortPriceAction(double *data) { puts("TODO: sort by price"); return false; }; bool sortAuthorAction(double *data) { puts("TODO: sort by author"); return false; }; bool printAction(double *data) { puts("TODO: print table"); return false; };
  • 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, με την βοήθεια πινάκων με δείκτες σε συναρτήσεις.