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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

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

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

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

Προγραμματισμός Δομές Δεδομένων

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

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

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

Φροντιστήριο 4 Σκελετοί Λύσεων

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

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

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

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

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

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

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

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

Προγραµµατισµός Ι 1

υναµικές οµές εδοµένων

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

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

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

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

Διάλεξη 18η: Διαχείρηση Αρχείων

Φροντιστήριο 4 Σκελετοί Λύσεων

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

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

Σημειώσεις έκτης και έβδομης εβδομάδας

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

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

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

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

Η γλώσσα C. Δείκτες και Διαχείριση Μνήμης (memory management)

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

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

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

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

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

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

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

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

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

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

ΚΕΦΑΛΑΙΟ 2: Τύποι δεδομένων και εμφάνιση στοιχείων...33

ΗΥ-150. Προγραµµατισµός. υναµική ιαχείριση Μνήµης (1/2)

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

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

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

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

Στοίβες με Δυναμική Δέσμευση Μνήμης

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

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

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

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

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

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

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

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

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

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

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

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

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

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

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

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

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

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

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

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

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

Transcript:

Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου

Δυναμική Κατανομή Μνήμης Δυναμική εκχώρηση μνήμης Σωρός Συναρτήσεις malloc(), calloc(), realloc(), free() Δυναμικές δομές δεδομένων Λίστες, δέντρα Προσοχή στη διαρροή μνήμης!

Στατική Κατανομή Μνήμης Στατικά δεδομένα Καθολικές μεταβλητές Στατικές μεταβλητές συναρτήσεων Στατικές σταθερές Δεδομένα στοίβας Παράμετροι και τοπικές μεταβλητές Βοηθητικά στοιχεία για κλήσεις συναρτήσεων

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

Παράδειγμα Πίνακα Αντί της ακολουθίας: Ορίζουμε κάποιο μέγιστο μέγεθος με οδηγία #define Δηλώνουμε πίνακα αυτού του μεγέθους Ζητάμε το πραγματικό μέγεθος Χρησιμοποιούμε αυτό μόνο το μέγεθος Το υπόλοιπο δεν χρησιμοποιείται, είναι όμως δεσμευμένο!

Παράδειγμα Πίνακα Εφαρμόζουμε την ακολουθία: Δηλώνουμε ένα δείκτη στον τύπο στοιχείου του πίνακα Ζητάμε το πραγματικό μέγεθος Ζητάμε από το σύστημα να μας εκχωρήσει από το σωρό μνήμη πραγματικού μεγέθους Αν αυτή είναι διαθέσιμη εκχωρείται στο δείκτη Χρησιμοποιούμε το δείκτη ως πίνακα Δεν υπάρχει μη χρησιμοποιούμενο υπόλοιπο!

Διαχείριση Σωρού Η βιβλιοθήκη stdlib παρέχει συναρτήσεις για τη διαχείριση του σωρού Άρα το σύστημα κάνει τη διαχείριση στη δυναμική κατανομή μνήμης Εμείς όμως τις καλούμε! Άρα εμείς έχουμε την ευθύνη για τη σωστή διαχείριση στη δυναμική κατανομή μνήμης

Συνάρτηση malloc() Με τη συνάρτηση αυτή ζητάμε την εκχώρηση μνήμης από το σωρό: void * malloc(size_t); όπου size_t προκαθορισμένος τύπος, συνώνυμος του unsigned int, που χρησιμοποιείται για να εκφράσει πλήθος από bytes Η συνάρτηση επιστρέφει NULL αν δεν υπάρχει αρκετή μνήμη στο σωρό Έλεγχος τιμής επιστροφής!

Συνάρτηση malloc() Σε επιτυχή επιστροφή, λαμβάνουμε μια διεύθυνση στο σωρό με το πλήθος των bytes που ζητήσαμε Το σύστημα δε γνωρίζει τον τύπο δεδομένων για τον οποίο θα χρησιμοποιηθεί αυτός ο χώρος μνήμης, οπότε θα πρέπει εμείς να τον μετατρέψουμε! για πίνακα 100 χαρακτήρων p = (char*) malloc(100*sizeof(char)); Εδώ συνηθίζεται η χρήση του τελεστή sizeof για τον ακριβή υπολογισμό του πλήθους των bytes που θα χρειαστούμε!

Συνάρτηση free() Με τη συνάρτηση αυτή απελευθερώνουμε χώρο στο σωρό που δε χρειαζόμαστε άλλο: void free(void *); Εδώ δε χρειάζεται μετατροπή σε τύπο void* μια που κάθε δείκτης είναι συμβατός με τέτοιον τύπο Ίσως η πιο σημαντική συνάρτηση! Με τη σωστή χρήση της free() αποφεύγουμε τη διαρροή μνήμης, δηλαδή τη συνεχή δέσμευση μέχρι εξαντλήσεως του σωρού!

Συνάρτηση calloc() Η συνάρτηση αυτή χρησιμοποιείται συχνά για δέσμευση μνήμης για πίνακες: void * calloc(size_t, size_t); όπου η πρώτη παράμετρος είναι το πλήθος στοιχείων μεγέθους όση είναι η δεύτερη παράμετρος Επιπλέον της εκχώρησης, η μνήμη που επιστρέφεται αρχικοποιείται σε 0 Χρήσιμη αν επιθυμούμε το μηδενισμό

Συνάρτηση realloc() Με τη συνάρτηση αυτή τροποποιούμε τη δέσμευση που έχουμε κάνει νωρίτερα, κυρίως για αύξηση του δεσμευμένου μεγέθους: void * realloc(void *, size_t); όπου η πρώτη παράμετρος είναι η προηγούμενη δεσμευμένη μνήμη Η διεύθυνση που επιστρέφεται αν δεν είναι NULL δίνει τη νέα δεσμευμένη μνήμη, όπου έχουν μεταφερθεί τα δεδομένα μας Αν είναι NULL, δε συμβαίνει καμία αλλαγή

Δυναμικός Πίνακας Ακεραίων int main() { } int n, *pinakas; printf( Please type the number of integers: ); scanf( %d,&n); pinakas = (int *) malloc (n * sizeof(int)); if (pinakas == NULL) { } printf( No memory available!\n ); exit(1); // κώδικας επεξεργασίας του πίνακα ως int[n] free(pinakas);

Δυναμικές Δομές Δεδομένων Λίστες Απλά ή διπλά συνδεδεμένες Τυπικά τύπου struct όπου τουλάχιστον ένα πεδίο είναι δείκτης σε ίδιο τύπο struct struct lista { } int a; struct lista * next;

Ταξινομημένη Λίστα Ακεραίων struct lista * insert (struct lista * list, int n) { } struct lista *oldlist; struct lista *newlink = (struct lista *) malloc (sizeof(struct lista)); if (newlink == NULL) { printf( Sorry, no memory!\n ); exit(1); } newlink->a = n; if (list == NULL) { newlink->next = NULL; return newlink; } if (list->a >= n) { newlink->next = list; return newlink; } oldlist = list; while ((list->next!= NULL) && (list->next->a < n)) list = list->next; newlink->next = list->next; list->next = newlink; return oldlist;

Ταξινομημένη Λίστα Ακεραίων void print_and_delete_list (struct lista * list) { struct lista * oldlist = list; while (list!= NULL) { printf( %d\n, list->a); oldlist = list->next; free(list); list = oldlist; } }

Ταξινομημένη Λίστα Ακεραίων int main(int argc, char *argv[]) { FILE * intfile = fopen(argv[1], r ); struct lista * intlist = NULL; int x; if (!intfile) { printf( File does not exist!\n ); exit(1); } while (!feof(intfile)) { } fscanf(intfile, %d, &x); intlist = insert(intlist, x); print_and_delete_list (intlist); fclose(intfile); }

Άλλες Δυναμικές Δομές Παραπλήσιες με τη λίστα: Δομή ουράς (FIFO) Δομή στοίβας (LIFO) Δομές γραφημάτων: Δέντρα Γενικά γραφήματα

Τι Μάθαμε Σήμερα Δυναμική κατανομή μνήμης Σωρός και συναρτήσεις διαχείρισης σωρού Δέσμευση και αποδέσμευση μνήμης Δυναμικοί πίνακες Δυναμικές δομές δεδομένων Λίστες Άλλες δυναμικές δομές

Παράρτημα: Τελεστές της C