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



Σχετικά έγγραφα
Εισαγωγή στον δομημένο προγραμματισμό

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

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

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

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

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

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εισαγωγή στον Προγραμματισμό (με. τη C)

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Περιεχόμενα. Πρόλογος... 21

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

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 12: υναµική έσµευση Μνήµης. ηµήτρης Ψούνης

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

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

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Ενδεικτική περιγραφή μαθήματος

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

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

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

Ασκήσεις - Μελέτες περίπτωσης για το μάθημα Προγραμματισμός II

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

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

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

10 η Διάλεξη C++ - Πίνακες. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

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

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

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

Μεθόδων Επίλυσης Προβλημάτων

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

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

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

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

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

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Συναρτήσεις και διαδικασίες

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

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

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

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

Μεθόδων Επίλυσης Προβλημάτων

ιαφάνειες παρουσίασης #5 (β)

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

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

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

Περιεχόμενα. Πρόλογος... 17

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

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

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

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

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

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

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

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

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

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

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

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

Sheet2 Α.Μ FAIL. οριακό PASS. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h

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

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

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

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

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

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

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

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

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

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

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

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

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

Μεθόδων Επίλυσης Προβλημάτων

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

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

B. Ενσωμάτωση Ιθαγενών Μεθόδων

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

Δομές δεδομένων (2) Αλγόριθμοι

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

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

Transcript:

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

Στατική δέσμευση μνήμης Με τη δήλωση απλών μεταβλητών ο χώρος μνήμης που τους αποδίδεται παραμένει δεσμευμένος μέχρι το τέλος του προγράμματος ή μέχρι το τέλος του μπλοκ εντολών στο οποίο δηλώθηκαν Η πρακτική αυτή ονομάζεται στατική δέσμευση μνήμης Παρουσιάζει ιδιαίτερα προβλήματα εκμετάλλευσης της υπάρχουσας μνήμης καθώς δεν είναι πάντα εκ των προτέρων γνωστός ο όγκος της μνήμης τον οποίο θα κληθεί το κάθε πρόγραμμα να διαχειριστεί 2

Παράδειγμα Εκτιμούμε ότι ένα πρόγραμμα απαιτεί 100 πίνακες, διαστάσεων ο καθένας 10x10 το πολύ Άρα χρειαζόμαστε αποθηκευτικό χώρο για 10.000 στοιχεία Δηλώνουμε 100 διακριτούς πίνακες 10x10 Κατά την διάρκεια της εκτέλεσης αποδεικνύεται ότι χρειαζόμαστε μόνο 10 πίνακες 11x10 Το πρόγραμμά αποτυγχάνει παρότι επιθυμούμε να εκμεταλλευτούμε μόνο 1.100 στοιχεία από τα 10.000 που έχουμε ήδη δεσμεύσει Αντιθέτως, εάν είχαμε δεσμεύσει χώρο για 10.000 στοιχεία σε μια «αποθηκευτική δομή», θα μπορούσαμε πολύ εύκολα να αναθέσουμε τους 10 πίνακες 11x10 3

Δυναμικές μεταβλητές Οι μεταβλητές που δημιουργούνται κατά τη διάρκεια της εκτέλεσης ενός προγράμματος ονομάζονται δυναμικές μεταβλητές Δημιουργούνται με κλήση στην συνάρτηση malloc για την ανάθεση συγκεκριμένου όγκου μνήμης η malloc βρίσκεται στο βασικό αρχείο stdlib.h Οι δυναμικές μεταβλητές ισχύουν μέχρι να δοθεί εντολή καταστροφής τους ή τον τερματισμό του προγράμματος Οι δυναμικές μεταβλητές εκμεταλλεύονται πιο ευέλικτα τον διαθέσιμο χώρο μνήμης 4

Δέσμευση μνήμης <µεταβλητή-δείκτης> = malloc(χώρος µνήµης); Η malloc επιστρέφει τη διεύθυνση της μνήμης που δέσμευσε ή NULL αν αποτύχει Πριν την κλήση της malloc πρέπει να: αποφασισθεί ο τύπος των δεδομένων τα οποία πρόκειται να αποθηκεύσουμε στη μεταβλητή δηλωθεί μια μεταβλητή δείκτης τύπου δεδομένων όμοιου με τον τύπο της δυναμικής μεταβλητής Μετά την κλήση της malloc: αποδίδεται στη μεταβλητή δείκτη η διεύθυνση της τοποθεσίας της μνήμης η οποία έχει δεσμευθεί για την αποθήκευση της δυναμικής μεταβλητής Για την εύρεση του ζητούμενου χώρου μνήμης συνήθως καλείται η συνάρτηση sizeof() 5

Παράδειγμα /* ήλωση ενός δείκτη σε χαρακτήρα */ char *x; /* έσµευση χώρου µνήµης y χαρακτήρων */ x = malloc(sizeof(char)*y); /* Στο δείκτη x αποθηκεύεται η διεύθυνση της µνήµης που δεσµεύτηκε */ if (x == NULL) /* η δέσµευση απέτυχε */ printf( Η δέσµευση απέτυχε\n ); 6

Τype cast Παρότι αρκετοί compilers δεν το απαιτούν θα μπορούσε επίσης να υπάρχει η δήλωση μετατροπής (char*)για τον επιστρεφόμενο τύπο της malloc x = (char*)malloc(sizeof(char)*y); η malloc επιστρέφει ένα δείκτη τύπου void ο οποίος για να αποδοθεί σε ένα δείκτη τύπου char πρέπει να μετατραπεί 7

Αποδέσμευση μνήμης Όταν η διαθέσιμη μνήμη είναι περιορισμένη ή οι δυναμικές αναθέσεις που ζητάμε είναι μεγάλων απαιτήσεων σε όγκο απαιτείται η ρητή ελευθέρωση των κομματιών της μνήμης που αποδόθηκαν δυναμικά και δεν είναι πλέον χρήσιμα στο πρόγραμμα Για να αποδεσμεύσουμε τη μνήμη που δεσμεύτηκε με την κλήση της mallocχρησιμοποιούμε τη συνάρτηση free Βρίσκεται στο βασικό αρχείο stdlib.h free(<µεταβλητή-δείκτης>); Μετά την κλήση της free συνίσταται η καταχώρηση της τιμής NULL στην μεταβλητή-δείκτης ο δείκτης συνεχίζει να υφίσταται και περιέχει μια διεύθυνση η οποία όμως δε μπορεί να χρησιμοποιηθεί <µεταβλητή-δείκτης> = NULL; 8

Παράδειγμα /* έσµευση µνήµης y χαρακτήρων */ char *x; x = malloc(sizeof(char)*y); /* Αποδέσµευση µνήµης y χαρακτήρων */ free(x); x = NULL; 9

Επανακαθορισμός δέσμευσης μνήμης Όταν έχουμε δεσμεύσει ένα χώρο μνήμης με κλήση της malloc, μπορούμε να επανακαθορίσουμε το μέγεθος της δεσμευμένης μνήμης με την συνάρτηση realloc Βρίσκεται στο βασικό αρχείο <stdlib.h> <νέος δείκτης> = realloc(<παλιός δείκτης>, <νέο µέγεθος>); Αν ζητάμε αύξηση του χώρου μνήμης και υπάρχει δυνατότητα να γίνει στην παλιά θέση, επιστρέφεται η παλιά διεύθυνση πάλι, αλλιώς επιστρέφεται νέα διεύθυνση Συνιστάται η αποθήκευση του νέου δείκτη σε νέα μεταβλητή ώστε να μην υπάρχει κίνδυνος να χαθεί ο παλιός χώρος μνήμης (αν η realloc επιστρέψει NULL) 10

Παράδειγμα /* έσµευση µνήµης y χαρακτήρων */ char *x, *x1; x = malloc(sizeof(char)*y); /* Επανακαθορισµός δεσµευµένης µνήµης */ y1=y*2; x1 = realloc(x,sizeof(char)*y1); if (x1!= NULL) x = x1; else printf("den uparxei arketi diathesimi mnimi\n"); 11

Δυναμική δέσμευση μνήμης για μονοδιάστατο πίνακα /* ιάβασµα µεγέθους πίνακα */ int megethos; scanf( %d,&megethos); /* έσµευση ανάλογου χώρου µνήµης */ int *pinakas; pinakas = malloc(megethos*sizeof(int)); /* Απόδοση τιµών σε στοιχεία του πίνακα */ pinakas[0]=5; scanf( %d, &pinakas[1]); /* Υπενθύµιση: pinakas[i]==*(pinakas+i) */ 12

Άσκηση Να γραφεί πρόγραμμα σε Cπου να ζητά από το χρήστη να καθορίσει ένα αριθμό nκαι να διαβάζει nπραγματικούς αριθμούς από την standardείσοδο. Στη συνέχεια, υπολογίζει το μέσο όρο των αριθμών αυτών και μετά για τον καθένα αριθμό το τετράγωνο της διαφοράς μεταξύ του αριθμού και του μέσου όρου (τυπική απόκλιση). Αν υποθέσουμε ότι το n είναι 3 και οι αριθμοί είναι 10, 5 και 3: Ο μέσος όρος είναι18/3 = 6. Τα τετράγωνα των διαφορών είναι: (10-6)(10-6) = 16, (5-6)(5-6) = 1, and(3-6)(3-6) = 9. Έτσι, η τυπική απόκλιση είναι (16+1+9)/3 = 26/3 = 8.6667. 13

#include <stdio.h> #include <stdlib.h> main() { int n, i; double *values, avg, variance; printf( Set the amount of values: ); scanf( %d, &n); if (n >= 0) values = (double *) malloc(sizeof(double)*n); for (i = 0; i < n; i++) scanf("%lf", &values[i]); avg = 0; for (i = 0; i < n; i++) avg += values[i]; avg /= n; variance = 0; for (i = 0; i < n; i++) variance += ((values[i]-avg)*(values[i]-avg)); variance /= n; printf("average: %lf\n", avg); printf("variance: %lf\n", variance); free(values); } 14

Παράδειγμα: Δέσμευση Μνήμης Πίνακα Δομών struct book { char *title; /* Τίτλος */ char *writer; /* Συγγραφέας */ int isbn; /* Αριθµός ISBN */ int code; /* Κωδικός βιβλιοθήκης */ }; typedef struct book BOOK; BOOK *books; int amount; printf( ώσε πλήθος βιβλίων: ); scanf( %d, &amount); books = (BOOK *) malloc(amount*(sizeof(book)); if (books == NULL) printf( Η δέσµευση µνήµης απέτυχε\n ); 15

Ερωτήσεις; 16