Προγραμματισμός Ι (ΗΥ120)

Σχετικά έγγραφα
Ανάπτυξη και Σχεδίαση Λογισμικού

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Προγραμματισμός Ι (ΗΥ120)

Η βασική συνάρτηση προγράμματος main()

Ηβασικήσυνάρτηση προγράμματος main()

Ανάπτυξη και Σχεδίαση Λογισμικού

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός (ΤΛ1006)

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Προγραμματισμός Ι (ΗΥ120)

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Προγραμματισμός Ι (HY120)

Προγραμματισμός Ι (ΗΥ120)

Η γλώσσα προγραμματισμού C

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Προγραμματισμός Ι (HY120)

Προγραμματισμός Υπολογιστών με C++

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι (ΗΥ120)

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΣΧΕΔΙΑΣΗ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΛΟΓΙΣΜΙΚΟΥ

Η γλώσσα προγραμματισμού C

Προγραμματισμός Η/Υ (ΤΛ2007 )

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

είκτες και Πίνακες (2)

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διάλεξη 15η: Αναδρομή, μέρος 1ο

Προγραμματισμός Συστημάτων

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Προγραμματισμός Η/Υ (ΤΛ2007 )

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

Προγραμματισμό για ΗΜΥ

Διαδικαστικός Προγραμματισμός

Προεπεξεργαστής C. Προγραμματισμός Ι 1

Προγραμματισμός Ι (ΗΥ120)

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

Διάλεξη 5: Δείκτες και Συναρτήσεις

Ενδεικτικές λύσεις και στατιστικά

Εισαγωγή στον Προγραμματισμό

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

Γλώσσα Προγραμματισμού C

Γλώσσες Προγραμματισμού

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Προγραμματισμός Ι. Συναρτήσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Μεταβλητές. Έστω η μεταβλητή

Κεφάλαιο : Επαναλήψεις (oι βρόγχοιfor, do-while) (Διάλεξη 10) Εντολές Επανάληψης που θα καλυφθούν σήμερα

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τμήμα Πληροφορικής

Προγραμματισμός Ι (ΗΥ120)

Εισαγωγή στον δομημένο προγραμματισμό

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 6 Ο. Συναρτήσεις Τοπικές, καθολικές, στατικές μεταβλητές Μεταβλητές τύπου extern και register Αναδρομή

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

Υπολογισμός - Εντολές Επανάληψης

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Επεξεργασία Αρχείων Κειµένου

Διαδικασιακός Προγραμματισμός

Κεφάλαιο 10 ο Υποπρογράµµατα

Διαδικαστικός Προγραμματισμός

Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός ΙI (E)

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Ανάπτυξη και Σχεδίαση Λογισμικού

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. Δείκτες (Διάλεξη 14)

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Transcript:

Προγραμματισμός Ι (ΗΥ120) Διάλεξη 9: Συναρτήσεις

Ορισμός συναρτήσεων <τύπος> <όνομα> (<τυπικές παράμετροι>) { /* δήλωση μεταβλητών */ /* εντολές ελέγχου/επεξεργασίας */ o Μια συνάρτηση ορίζεται δίνοντας (α) τον τύπο του αποτελέσματος που επιστρέφει (void αν δεν επιστρέφει τιμή), (β) το όνομα της, (γ) την λίστα με τις «τυπικές» παραμέτρους της, και (δ) το σώμα της. o Τα (α), (β), (γ) αποτελούν την επικεφαλίδα και το (δ) τον κώδικα / σώμα (body) της συνάρτησης. o Μια συνάρτηση μπορεί να δηλωθεί (ξεχωριστά) μέσω της επικεφαλίδας της, με την υλοποίηση της να δίνεται σε παρακάτω σημείο του κώδικα (ή ακόμα και σε διαφορετικό αρχείο). 2

Επιστροφή αποτελέσματος o Η επιστροφή αποτελέσματος μιας συνάρτησης γίνεται με την εντολή return(<τιμή>) o Αν αυτή δεν υπάρχει ή χρησιμοποιηθεί χωρίς κάποια τιμή, τότε η συνάρτηση επιστρέφει μια τυχαία τιμή. o Και ο μεταγλωττιστής εμφανίζει μια προειδοποίηση. o Όταν εκτελεσθεί η εντολή return τερματίζεται αυτόματα και η εκτέλεση της συνάρτησης. o Η εντολή return μπορεί να υπάρχει σε πολλά σημεία του σώματος της συνάρτησης o Χρειάζεται προσοχή έτσι ώστε να επιστέφεται το επιθυμητό αποτέλεσμα σε κάθε περίπτωση. o Η κυρίως συνάρτηση main επιστρέφει την τιμή της στο περιβάλλον εκτέλεσης (λειτουργικό σύστημα). 3

Κλήση συνάρτησης o Η κλήση μιας συνάρτησης πραγματοποιείται δίνοντας το όνομα της συνάρτησης, και σε παρενθέσεις μια τιμή για κάθε μια από τις τυπικές παραμέτρους της, χρησιμοποιώντας το, ως διαχωριστικό. o Αν μια συνάρτηση επιστρέφει αποτέλεσμα, τότε η κλήση της συνάρτησης αποτελεί έκφραση αποτίμησης που δίνει τιμή του αντίστοιχου τύπου. o Μια κλήση συνάρτησης μπορεί να χρησιμοποιηθεί για την ανάθεση τιμής σε μεταβλητή o ή/και σαν τμήμα έκφρασης σε συνδυασμό με κατάλληλο τελεστή o που μπορεί να χρησιμοποιηθεί για τιμές του τύπου που επιστρέφει η συνάρτηση. 4

/* υπολογισμός μέγιστης τιμής 2 ακεραίων */ #include <stdio.h> int max2(int x, int y) { if (x > y) { return(x); else { return(y); 5 int main(int argc, char *argv[]) { int in1, in2, max; printf("enter 2 ints: "); scanf("%d %d", &in1, &in2); max = max2(in1, in2); printf( max = %d\n", max); return(0);

/* υπολογισμός μέγιστης τιμής 2 ακεραίων */ #include <stdio.h> 6 int max2(int x, int y) { if (x > y) { return(x); return(y); int main(int argc, char *argv[]) { int in1, in2, max; printf("enter 2 int: "); scanf("%d %d", &in1, &in2); max = max2(in1, in2); printf( max = %d\n", max); return(0);

/* υπολογισμός μέγιστης τιμής 2 ακεραίων */ #include <stdio.h> int max2(int x, int y) { int z; 7 if (x > y) { z = x; else { z = y; return(z); int main(int argc, char *argv[]) { int in1,in2, max; printf("enter 2 int: "); scanf("%d %d", &in1, &in2); max = max2(in1, in2); printf( max = %d\n", max); return(0);

Παράμετροι συνάρτησης 8 o Οι παράμετροι που ορίζονται κατά την υλοποίηση μιας συνάρτησης ονομάζονται τυπικές παράμετροι. o Τα ονόματα τους είναι συμβολικά, έτσι ώστε ο κώδικας της συνάρτησης να μπορεί να επεξεργαστεί τις τιμές που περνιούνται στην κλήση, και ο τύπος τους απλά προσδιορίζει τον τύπο των τιμών που πρέπει να δοθούν σαν παράμετροι κατά την κλήση. o Οι τιμές που δίνονται όταν καλείται μια συνάρτηση, για κάθε μια από τις τυπικές παραμέτρους της ονομάζοται πραγματικές παράμετροι. o Για κάθε κλήση, η ίδια συνάρτηση μπορεί να δέχεται διαφορετικές πραγματικές παραμέτρους για τις ίδιες τυπικές παραμέτρους.

Πέρασμα παραμέτρων καθ αποτίμηση o Για κάθε τυπική παράμετρο τύπου Τ μιας συνάρτησης μπορεί κατά την κλήση να δοθεί σαν πραγματική παράμετρος μια οποιαδήποτε τιμή τύπου Τ. o Αν σαν παράμετρος κλήσης, αντί για συγκεκριμένη τιμή, δοθεί μια έκφραση, τότε αυτή θα αποτιμηθεί και σαν πραγματική παράμετρος της κλήσης θα περαστεί το αποτέλεσμα της έκφρασης. o Πιθανές παράμετροι κλήσης για τυπική παράμετρο Τ: o o κυριολεκτικό τύπου Τ o μεταβλητή τύπου Τ o έκφραση που αποτιμάται σε τιμή Τ Σαν παράμετρος κλήσης μιας συνάρτησης μπορεί να δοθεί μια κλήση συνάρτησης τύπου Τ. 9

/* υπολογισμός μέγιστης τιμής 2 ακεραίων */ #include <stdio.h> int max2(int x, int y) { if (x > y) { return(x); else { return(y); τυπικές παράμετροι, τα ονόματα των οποίων χρησιμοποιούνται για να γίνεται αναφορά στις τιμές που θα περαστούν όταν κληθεί η συγκεκριμένη συνάρτηση επιστρεφόμενη τιμή 10 int main(int argc, char *argv[]) { int in1, in2, max; printf("enter 2 int: "); scanf("%d %d", &in1, &in2); max = max2(in1, in2); printf( max = %d\n", max); return(0); πραγματικές παράμετροι, που είναι οι τιμές που περνιούνται στην κλήση συνάρτησης αποθήκευση Τμήμα Ηλεκτρολόγων τιμής που Μηχανικών επιστρέφεται και Μηχανικών για τις τιμές που Υπολογιστών, περάστηκαν Πανεπιστήμιο ως παράμετροι Θεσσαλίας

#include <stdio.h> int max2(int x, int y) { if (x > y) { return(x); else { return(y); 11 int main(int argc, char* argv[]) { int in1, in2, in3; printf("enter 3 int: "); scanf("%d %d %d", &in1, &in2, &in3); printf("%d\n", max2(in1, in2)); printf("%d\n", max2(in1 + in2, 25)); printf("%d\n", max2(in1, max2(in2, in3))); return(0);

Παράμετροι και τοπικές μεταβλητές 12 o Κάθε συνάρτηση μπορεί να δηλώνει νέες δικές της (τοπικές) μεταβλητές που χρησιμοποιεί για τους δικούς της σκοπούς (επιθυμητή επεξεργασία). o Οι τυπικές παράμετροι αντιστοιχούν σε ειδικές τοπικές μεταβλητές που χρησιμοποιούνται για την αποθήκευση (και πρόσβαση) των πραγματικών παραμέτρων κατά την κλήση της συνάρτησης. o Στις αρχικές εκδόσεις της γλώσσας C, η δήλωση των τυπικών παραμέτρων μιας συνάρτησης γινόταν (σχεδόν) όπως για τις τοπικές μεταβλητές. o Οι τυπικές παράμετροι δεν μπορεί να έχουν το ίδιο όνομα με τοπικές μεταβλητές ούτε το αντίστροφο (διαφορετικά δεν θα υπήρχε τρόπος διαχωρισμού ανάμεσα στην τυπική παράμετρο και την τοπική μεταβλητή με το ίδιο όνομα μέσα από τον κώδικα της συνάρτησης).

Εμβέλεια μεταβλητών o Οι τοπικές μεταβλητές (και τυπικές παράμετροι) ορίζονται στα πλαίσια μιας συνάρτησης και είναι προσπελάσιμες (ορατές) μόνο από τον κώδικα της. o Οι καθολικές μεταβλητές ορίζονται στην αρχή του κειμένου του προγράμματος έξω από τις συναρτήσεις (και έξω από την main) και είναι προσπελάσιμες (ορατές) μέσα από κάθε συνάρτηση. o Αν μια τοπική μεταβλητή (ή τυπική παράμετρος) μιας συνάρτησης έχει το ίδιο όνομα με μια καθολική μεταβλητή, τότε; o Αποκρύπτει την καθολική μεταβλητή και την καθιστά μη προσπελάσιμη για τον κώδικα της συνάρτησης. 13

int a, b, c; 14 void f(int b) { int a, d;...... int main(int argc, char *argv[]) { int c;......

#include <stdio.h> int a = 0, b = 0, c = 0; void f(int b) { int a, d; a = b--; c = a*b; d = c-1; printf("f: a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); 15 int main(int argc, char *argv[]) { int c = 1, d = 1; c = a + b; b = b + 1; printf("main: a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); f(c); printf("main: a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); c = a + b; b = b + 1; f(a); printf("main: a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); return(0);

Συναρτήσεις και καθολικές μεταβλητές o Η αλλαγή μιας καθολικής μεταβλητής μέσα από μια συνάρτηση συνιστά μια (κλασική) παρενέργεια. o Αυτή η αλλαγή δεν μπορεί να εντοπιστεί χωρίς να διαβάσουμε τον κώδικα της συνάρτησης. o Φυσικά οι καθολικές μεταβλητές υπάρχουν ακριβώς για αυτό το λόγο, δηλαδή για να επιτρέπουν την επικοινωνία ανάμεσα σε διαφορετικές συναρτήσεις. o Αυτή η λύση πρέπει να επιλέγεται με σύνεση (και να τεκμηριώνεται κατάλληλα, π.χ. σύντομο σχόλιο) o όταν το επιθυμητό αποτέλεσμα δεν μπορεί να επιτευχθεί (με απλό τρόπο) με πέρασμα κατάλληλων παραμέτρων και επιστροφή αποτελεσμάτων. 16

προγραμματισμός με παρενέργειες void f() { καθολικές μεταβλητές 17 προγραμματισμός χωρίς παρενέργειες int f() { τοπικές μεταβλητές return(); 17

Διάρκεια ζωής μεταβλητών o Οι καθολικές μεταβλητές είναι μόνιμες, δηλαδή υφίστανται και κρατάνε τις τιμές τους καθ όλη την διάρκεια της εκτέλεσης του προγράμματος. o Οι τοπικές μεταβλητές είναι προσωρινές, δηλαδή υφίστανται και κρατάνε τις τιμές τους μόνο όσο κρατά η εκάστοτε εκτέλεση της συνάρτησης. o Εξαίρεση: τοπικές μεταβλητές με τον προσδιορισμό static είναι μόνιμες, δηλαδή κρατούν την τιμή τους ανάμεσα στις εκτελέσεις της συνάρτησης. o Οι static τοπικές μεταβλητές πρέπει πάντα να αρχικοποιούνται o Η εντολή αρχικοποίησης εκτελείται μια φορά όταν η συνάρτηση κληθεί για πρώτη φορά. 18

#include <stdio.h> void f() { 19 static int a = 0; a++; printf("f: a=%d\n", a); int main(int argc, char *argv[]) { f(); f(); f(); return(0);

Eκτέλεση συνάρτησης Όταν μια συνάρτηση Α καλεί μια άλλη συνάρτηση Β, η εκτέλεση του κώδικα της «καλούσας» συνάρτησης σταματά μέχρι να ολοκληρωθεί η εκτέλεση του κώδικα της «κληθείσας» συνάρτησης: 1. Η εκτέλεση της συνάρτησης Α σταματά στο σημείο όπου γίνεται η κλήση της συνάρτησης Β. 2. Αρχικοποιούνται οι παράμετροι και τοπικές μεταβλητές της συνάρτησης Β. 3. Αρχίζει η εκτέλεση του κώδικα της συνάρτησης Β (που μπορεί να καλέσει και άλλες συναρτήσεις). 4. Όταν τερματίζεται η εκτέλεση της συνάρτησης Β, η εκτέλεση συνεχίζεται στην συνάρτηση Α με την αμέσως επόμενη εντολή, μετά την κλήση της Β. 20

Πλαίσιο εκτέλεσης συνάρτησης Ο ίδιος κώδικας της συνάρτησης εκτελείται κάθε φορά σε ένα διαφορετικό πλαίσιο εκτέλεσης (σε έναν ξεχωριστό «μικρόκοσμο»). Το πλαίσιο εκτέλεσης δημιουργείται (εκ νέου) πριν αρχίσει η εκτέλεση του κώδικα της συνάρτησης και καταστρέφεται όταν ολοκληρωθεί η εκτέλεση της. Για κάθε κλήση, δημιουργείται ένα καινούργιο και ξεχωριστό πλαίσιο εκτέλεσης, που δεν έχει σχέση με προηγούμενα πλαίσια εκτέλεσης. 21 Το πλαίσιο εκτέλεσης χρησιμεύει για την αποθήκευση των τοπικών μεταβλητών και των πραγματικών παραμέτρων για την συγκεκριμένη κλήση.

void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main 22

void f1() { <A> void foo2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D 23

void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 24

void f1() { <A> void foo2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B 25

void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 26

void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A 27

void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστροφή 28

void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστροφή εκτέλεση C 29

void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστροφή εκτέλεση C επιστροφή 30

void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστροφή εκτέλεση C επιστροφή εκτέλεση Ε 31

void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστροφή εκτέλεση C επιστροφή εκτέλεση Ε επιστροφή 32

Δέσμευση μνήμης μεταβλητών Η μνήμη των μόνιμων (καθολικών και τοπικών) μεταβλητών είναι στατική, και δεσμεύεται για όλη την διάρκεια της εκτέλεσης του προγράμματος. Η μνήμη των προσωρινών (τοπικών) μεταβλητών μιας συνάρτησης είναι δυναμική Δεσμεύεται / αποδεσμεύεται μαζί με το αντίστοιχο πλαίσιο εκτέλεσης. Η διαχείριση της τοπικής μνήμης των συναρτήσεων γίνεται μέσω του μηχανισμού της στοίβας. Υποστηρίζεται η εναλλάξ ή/και αλυσιδωτή εκτέλεση συναρτήσεων με τους λιγότερους δυνατούς πόρους και την μεγαλύτερη δυνατή ταχύτητα εκτέλεσης. 33

Στοίβα Δεσμεύεται ένα (μεγάλο) συνεχόμενο τμήμα μνήμης, που χρησιμοποιείται σύμφωνα με την λογική της στοίβας (Last In First Out - LIFO queue) για την αποθήκευση των τιμών των παραμέτρων και τοπικών μεταβλητών των συναρτήσεων. Kαι των καταχωρητών της CPU μεταξύ κλήσεων διαφορετικών συναρτήσεων Το όριο της μνήμης της στοίβας που χρησιμοποιείται ανά πάσα στιγμή υποδεικνύεται από ένα ειδικό δείκτη (που διαχειρίζεται το περιβάλλον εκτέλεσης) που ονομάζεται stack pointer. Κάθε φορά που γίνεται μια νέα κλήση και κάθε φορά που τερματίζεται μια κλήση, η τιμή του stack pointer αλλάζει ώστε να δείχνει στο τρέχων πλαίσιο εκτέλεσης. 34

int v1; κλήση main void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); στατική μνήμη v1 στοίβα 35 int main(){ int v6; f2(); SP v6 πλαίσιο main

int v1; εκτέλεση main void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); στατική μνήμη v1 στοίβα 36 int main(){ int v6; f2(); SP v6 πλαίσιο main

int v1; κλήση f2 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v5 v4 v6 37 πλαίσιο f2 πλαίσιο main

int v1; εκτέλεση f2 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v5 v4 v6 38 πλαίσιο f2 πλαίσιο main

int v1; κλήση f1 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 39 πλαίσιο f1 πλαίσιο f2 πλαίσιο main

int v1; εκτέλεση f1 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 40 πλαίσιο f1 πλαίσιο f2 πλαίσιο main

int v1; επιστροφή f1 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 41 πλαίσιο f2 πλαίσιο main

int v1; εκτέλεση f2 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 42 πλαίσιο f2 πλαίσιο main

int v1; επιστροφή f2 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 43 πλαίσιο main

int v1; εκτέλεση main void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 44 πλαίσιο main

Υπερχείλιση στοίβας Tο μέγεθος της στοίβας ενός προγράμματος είναι (συνήθως) περιορισμένο Γιατί; Υπάρχει περίπτωση ένα πρόγραμμα να εξαντλήσει την μνήμη της στοίβας του, με αποτέλεσμα αυτή να υπερχειλίσει (stack overflow): 1. Γίνονται πολλές αλυσιδωτές κλήσεις συνάρτησης. 2. Το μέγεθος των τοπικών μεταβλητών μιας συνάρτησης είναι μεγάλο, και δεν χωρά στην στοίβα. Τότε το πρόγραμμα τερματίζεται με μήνυμα λάθους Παρόμοιο με αυτό στην περίπτωση της πρόσβασης σε μη επιτρεπτή θέση μνήμη, π.χ. μέσω δείκτη. 45