[Παίζει μουσική] David J. MALAN: Εντάξει. [Γέλια] Καλώς ήρθατε και πάλι. Αυτό είναι CS50. Και αυτό το τέλος της εβδομάδας πέντε. Και μέχρι τώρα, έχουμε λίγο πολύ ήδη λάβει ως δεδομένο ότι υπάρχει υπάρχει αυτή compiler, Clang, που έχετε έχουν επίκληση μέσω αυτής άλλο εργαλείο που ονομάζεται κάνει ότι με κάποιο τρόπο μαγικά μετατρέπει τον πηγαίο κώδικα σε κώδικα αντικειμένου, τα μηδενικά και μονάδες ότι οι υπολογιστές CPU σας, κεντρική μονάδα επεξεργασίας, στην πραγματικότητα καταλαβαίνει. Αλλά αποδεικνύεται ότι υπάρχει ένας αριθμός που είναι συμβαίνει κάτω από την κουκούλα μεταξύ εισόδου και εξόδου. Και θα ήθελα να προτείνω να σάρκας ότι σε ένα λίγο πιο αναλυτικά σε αυτά τα τέσσερα βήματα, έχει κάτι που ονομάζεται προ-επεξεργασία, κάτι που ονομάζεται μεταγλώττιση, που έχουμε δει, κάτι που ονομάζεται συναρμολόγηση, και κάτι που ονομάζεται σύνδεση. Έτσι, μέχρι σήμερα, σε ορισμένες από μας προγράμματα, είχαμε απότομη περιλαμβάνει. Πιο πρόσφατα είχαμε κάποια απότομη ορίζει για σταθερές. Έτσι αποδεικνύεται ότι αυτά τα πράγματα που Οι πρόθεμα με το hash σύμβολο ή το σύμβολο της λίρας είναι προ-επεξεργαστή οδηγιών. Αυτό είναι μόνο ένα φανταχτερό τρόπο λέγοντας ότι είναι μια γραμμή κώδικα που είναι πραγματικά μετατρέπεται σε κάτι άλλο πριν από την υπολογιστή, ακόμη και προσπαθείτε να μετατρέψετε σας πρόγραμμα σε μηδενικά και μονάδες. Για παράδειγμα, απότομη περιλαμβάνει πρότυπο I / O. H, λίγο πολύ απλά σημαίνει να πάει μπροστά, πιάσε τα περιεχόμενα των αρχείων stdio.h και να τις επικολλήσετε εκεί. Έτσι, δεν μηδενικά και μονάδες σε εκείνο το σημείο ακόμα. Είναι πραγματικά ακριβώς μια αντικατάσταση. Και αυτό γίνεται κατά τη διάρκεια της λεγόμενης προεπεξεργασίας φάση, όταν λειτουργεί πραγματικά Clang ή ειδικά Βεβαιωθείτε στις περισσότερες περιπτώσεις. Έτσι, όλα αυτά έχει συμβεί Οποιοδήποτε αυτόματα μέχρι στιγμής. Στη συνέχεια, έρχεται το στάδιο κατάρτισης. Αλλά έχουμε υπεραπλουστευμένη κατάρτιση. Χτίσιμο ενός προγράμματος σημαίνει πραγματικά να πάρετε από κάτι σαν C, η πηγαίο κώδικα που έχουμε γράψει, κάτω σε κάτι που ονομάζεται συνέλευση. Συνέλευση γλώσσα είναι ένα χαμηλότερο επίπεδο γλώσσα που, ευτυχώς, δεν θα έχουν μεγάλη ευκαιρία να γράψω αυτό το εξάμηνο. Αλλά είναι στο χαμηλότερο επίπεδο στην έννοια ότι μπορείτε κυριολεκτικά να αρχίσετε να γράφετε προσθέσετε και να αφαιρέσετε και να πολλαπλασιαστούν και να φορτώσει από τη μνήμη και να αποθηκεύσετε στη μνήμη, η πολύ βασικές οδηγίες που ένας υπολογιστής, κάτω από το καπό, πραγματικά καταλαβαίνει. Τέλος, συναρμολόγηση παίρνει αυτή τη γλώσσα τα μηδενικά και αυτά που έχουμε ήδη περιγράφουν μέχρι στιγμής. Και πραγματικά, τέλος, υπάρχει η λεγόμενη συνδέοντας φάση, τον οποίο και θα δείτε ακριβώς σε μια στιγμή, που συνδυάζει μηδενικά σας και αυτοί με μηδενικά και αυτά που άλλοι άνθρωποι πριν έχετε δημιουργήσει. Έτσι, θεωρούν αυτό το σούπερ απλό πρόγραμμα. Ήταν από την Εβδομάδα 1. Απλά είπε, Hello World, στην οθόνη. Τρέξαμε αυτό μέσω Clang. Ή τρέξαμε μέσα από Μάρκα η οποία έτρεξε Clang. Και εξάγεται κατά τη στιγμή όπου ορισμένοι μηδενικά και αυτά. Αλλά τελικά δεν υπάρχει ένα ενδιάμεσο βήμα. Αν πάω εδώ - ουπς, δεν θέλει να τον δει ακόμα. Αν πάω εδώ στην συσκευή μου και έχω ανοίξει hello.c, εδώ είναι το ίδιο το πρόγραμμα. Και τι Πάω να κάνουμε στο τερματικό μου παράθυρο εδώ Πάω να τρέχει Clang αντί να κάνουν, η οποία αυτοματοποιεί τις τέσσερις αυτά τα βήματα για μας. Και Πάω να κάνω κλαγγή-S και τότε hello.c και στη συνέχεια να εισέλθουν. Και έχω μια αναβοσβήνει εντολών και πάλι, το οποίο είναι καλό. Και τώρα σε ένα λίγο μεγαλύτερο παράθυρο, Πάω να ανοίξει gedit εδώ. Και Πάω να ανοίξει ένα αρχείο το οποίο, Αποδεικνύεται, καλείται hello.s αυτό περιέχει τον συμβολική γλώσσα Αναφέρθηκα προηγουμένως. Και αυτό είναι ό, τι λέγεται συνέλευση γλώσσας, αρκετά χαμηλό επίπεδο οδηγίες ότι η Intel CPU σας ή ό, τι είναι αυτό που είναι μέσα καταλαβαίνει. Και mov είναι για κίνηση. κλήση είναι για καλώντας, ένα πολύ χαμηλό επίπεδο λειτουργίας. sub είναι για την αφαίρεση. Έτσι, όταν έχετε ένα συγκεκριμένο CPU μέσα του υπολογιστή σας, ό, τι κάνει διακριτή, σε σχέση με άλλες CPUs για το της αγοράς, η οποία οδηγίες που κατανοεί και συχνά πόσο αποτελεσματικό είναι, πόσο γρήγορα είναι στην εκτέλεση ορισμένων των εν λόγω οδηγιών. Τώρα για περισσότερα σχετικά με αυτό, μπορείτε να πάρετε επόμενη CS61 Πτώση στο κολέγιο. Αλλά εδώ έχουμε, για παράδειγμα, μερικές αναγνωριστικά που μπορεί να φανεί οικείο. hello.c είναι το όνομα του προγράμματος. . Κειμένου - Δεν υπάρχει πολύ ενδιαφέρον υπάρχει μόλις τώρα, υπενθυμίζουν ότι το κείμενο τμήμα, από τη Δευτέρα, είναι αυτή όπου σε μνήμη προγράμματος σας τελειώνει πραγματικά επάνω. Έτσι, αυτό είναι τουλάχιστον αόριστα εξοικειωμένοι εκεί. Εδώ, φυσικά, είναι μια αναφορά από κύρια λειτουργία μας. Κύλιση προς τα κάτω, αυτά αναφέρονται σε πράγματα αποκαλούμενη μητρώα, πολύ μικρά κομμάτια στο εσωτερικό της μνήμης των πραγματικών CPU σας. Και αν μετακινηθείτε προς τα κάτω, ακόμη και περαιτέρω, βλέπω κάποιο είδος έμμεση αναφορά του ASCII. Και, πράγματι, είναι ότι το string, Γεια σας, κόμμα, τον κόσμο. Έτσι, τα πολυλογώ, αυτό έχει συμβαίνει για σας, αυτόματα, κάτω από την κουκούλα όλη αυτήν την περίοδο. Και αυτό που συμβαίνει είναι πραγματικά μια φορά έχετε τρέξει Clang, είτε μέσω της Κάντε, είστε να πάρει το πρώτο, από τον πηγαίο κώδικα, η λεγόμενη συμβολική γλώσσα. Στη συνέχεια Clang είναι η μετατροπή αυτής της συναρμολόγησης γλώσσα κάτω σε μηδενικά και μονάδες. Και αυτή είναι η διαφάνεια που αρχίσαμε συζήτησή μας στην Εβδομάδα 0 για - και στη συνέχεια για 1 εβδομάδα. Και τελικά, οι εν λόγω μηδενικά και μονάδες συνδυάζονται με τα μηδενικά και μονάδες από τις βιβλιοθήκες που έχουμε ήδη λάβει για δεδομένο, όπως Standard I / O ή Βιβλιοθήκη String ή ακόμα και η CS50 βιβλιοθήκη. Έτσι για να ζωγραφίσει αυτή την εικόνα πιο οπτικά, έχουμε hello.c. Και αυτό, φυσικά, χρησιμοποιεί την printf λειτουργία να πω, hello world. Το βήμα σύνταξη παίρνει κάτω για να Αυτό το αρχείο είδαμε hello.s, ακόμη αν και αυτό είναι συνήθως διαγράφεται αυτόματα για σας. Αλλά αυτό είναι ο κώδικας συναρμολόγησης στη μέση βαθμίδα. Και στη συνέχεια, όταν θα συγκεντρώσει το συγκρότημα γλώσσα, να το πω έτσι, που είναι όταν πάρει εκείνα τα μηδενικά και μονάδες. Έτσι έχουμε μεγεθύνεται αποτελεσματικά σήμερα αυτό που έχουμε ήδη λάβει ως δεδομένο, σημαίνει να πηγαίνεις πηγαίο κώδικα από τον αντικειμενικό κώδικα. Αλλά, τέλος, τώρα που η ίδια εικόνα - ας το σπρώξιμο πάνω στο η αριστερή πλευρά. Και σημειώστε ότι στην κορυφή υπάρχει Ανέφερα stdio.h. Αυτό είναι ένα αρχείο που έχουμε συμπεριλάβει σχεδόν σε όλα από τα προγράμματα που έχουμε γράψει. Και αυτό είναι το αρχείο του οποίου το περιεχόμενο να επικολληθεί αντίγραφο, αποτελεσματικά στην κορυφή τον κωδικό σας. Αλλά αποδεικνύεται ότι, σε έναν υπολογιστή σύστημα κάπου, υπάρχει πιθανώς μια stdio.c αρχείο που κάποιος έγραψε χρόνια Πριν από αυτό εφαρμόζει όλα τα λειτουργίες που δηλώθηκαν στο stdio.h. Τώρα, στην πραγματικότητα, είναι πιθανόν να μην είναι σε Mac ή το PC σας ή ακόμη και στο CS50 συσκευή είναι ένα καθαρό κώδικα C. Κάποιος καταρτίζονται ήδη και περιλαμβάνονται . O αρχείο για τον κωδικό αντικείμενο ή. Ένα αρχείο, το οποίο αναφέρεται σε μια κοινή βιβλιοθήκη που είναι ήδη προ-εγκατεστημένο και προ-συγκεντρώθηκε για εσάς. Αλλά ας υποθέσουμε ότι υπάρχει πράγματι υπάρχει για stdio.c υπολογιστή μας παράλληλα με Clang. Ο κωδικός σας είναι καταρτίζονται και συναρμολογούνται. stdio.c 's code είναι να συγκεντρώνονται και συναρμολογούνται, έτσι ώστε αυτή η τελευταία βήμα, εδώ κάτω, θα πρέπει με κάποιο τρόπο σύνδεσμο, να το πω έτσι, μηδενικά και μονάδες σας με του ή της μηδενικά και μονάδες σε ένα απλό πρόγραμμα που είναι τελικά ονομάζεται απλά Hello. Έτσι, αυτό είναι όλο της μαγείας που είναι έχει συμβεί μέχρι στιγμής. Και θα συνεχίσει να λαμβάνει αυτά διαδικασίες για δεδομένος, αλλά συνειδητοποιούν υπάρχει μια πολύ ζουμερές λεπτομέρειες συμβαίνει κάτω από εκεί. Και αυτό είναι που κάνει σας υπολογιστή με Intel στο εσωτερικό ιδιαίτερα ξεχωριστή. Έτσι, σε αυτό το σημείωμα, αν θα θέλατε να επικοινωνήστε μαζί μας για μεσημεριανό γεύμα αυτή την Παρασκευή, πηγαίνουν με τη συνήθη cs50.net/rsvp τόπο, 13:15 αυτή την Παρασκευή. Και τώρα μερικές ανακοινώσεις. Έτσι, έχουμε κάποια καλά νέα. Και έχουμε κάποια άσχημα νέα. Ξεκινήστε με κάποια καλά νέα εδώ. [Στενάζουν] Εντάξει. Λοιπόν, αυτό είναι τεχνικά ένα αργία, οπότε δεν είναι τόσο πολύ ένα δώρο από μας. Στη συνέχεια, όμως τα κακά νέα, φυσικά. [Στενάζουν] Ξόδεψα πολύ χρόνο σε αυτά τα κινούμενα σχέδια. [Γέλια] Θα υπάρξει μια σύνοδος κριτική την προσεχή Δευτέρα. Είναι πρόκειται να είναι στις 17:30. Εμείς θα σας θυμίσει όλα αυτά τα στοιχεία μέσω e-mail σχετικά με την πορεία του website μέσα σε μόλις μια-δυο μέρες. Θα γυριστεί και διατίθενται λίγο αργότερα. Έτσι, αν δεν μπορείτε να κάνετε ότι η Δευτέρα υποδοχή βράδυ, μην ανησυχείτε. Ενότητες την ερχόμενη εβδομάδα θα είναι επίσης επικεντρωθεί στην αναθεώρηση για το κουίζ. Αν το τμήμα σας είναι τη Δευτέρα, η οποία είναι Πράγματι πανεπιστήμιο διακοπές, θα είμαστε εξακολουθούν να ανταποκρίνονται στο τμήμα. Αν απλά δεν μπορεί να κάνει ότι τμήμα, επειδή θα πάμε μακριά, αυτό είναι εντάξει. Παρακολουθείστε την Κυριακή ή την Τρίτη τμήματος ή συντονιστείτε-in για το τμήμα του Ιάσονα, η οποία είναι διαθέσιμα στο διαδίκτυο. Έτσι, περισσότερες κακές ειδήσεις. Έτσι, σύμφωνα με το αναλυτικό πρόγραμμα, έχουμε διάλεξη την επόμενη Παρασκευή. Αλλά τα καλά νέα - σαφώς, πέρασα πάρα πολύ χρόνο σε αυτό. [Γέλια] Θα ακυρώσετε την επόμενη διαλέξεις της Παρασκευής. Έτσι, αυτό θα είναι ένα δώρο για εμάς, έτσι ώστε να μπορούν πραγματικά να έχουν μια ωραία ανάπαυλα μεταξύ αυτή την εβδομάδα και δύο εβδομάδες μετά, ως εκ τούτου. Έτσι, δεν διαλέξεις την επόμενη εβδομάδα, μόνο ένα μικρό μικρό κουίζ, για την οποία θα πρέπει να όλο και πιο ενθουσιασμένοι. Ας στρέψουμε τώρα την προσοχή μας στο κάτι που είναι πράγματι πιο οπτική και το πιο συναρπαστικό και να θέσει τις βάσεις για ό, τι πρόκειται να είναι στον ορίζοντα σε μόλις δύο εβδομάδες. Μετά το πρώτο κουίζ, θα μετατρέψει το εστίαση των συνόλων πρόβλημά μας σε ένα άλλο συγκεκριμένους τομείς πρόβλημα, αυτό της εγκληματολογίας και της ασφάλειας γενικότερα. Στην πραγματικότητα, η παράδοση με αυτό το πρόβλημα που είναι για μένα ένα από τα διδασκαλία τους συναδέλφους ή ΑΠ να περπατήσει σε όλη την πανεπιστημιούπολη, λαμβάνοντας μερικές φωτογραφίες της αναγνωρίσιμο αλλά όχι προφανείς ανθρώπους, τόπων, πραγμάτων, στη συνέχεια, κάθε χρόνο I με κάποιο τρόπο καταφέρνουν να διαγράψει κατά λάθος ή να αλλοιώσει το περιεχόμενο της ψηφιακής κάρτας πολυμέσων αυτό είναι εσωτερικό της φωτογραφικής μηχανής μας. Αλλά δεν είναι μεγάλη υπόθεση. Μπορώ να πάω μπροστά και να συνδέσετε ότι στον υπολογιστή μου. Μπορώ να κάνω μια ιατροδικαστική εικόνα της, έτσι να μιλήσει, αντιγράφοντας τα μηδενικά και αυτά μακριά από την κάρτα μνήμης, αν μια κάρτα SD ή συμπαγή κάρτα λάμψης ή ό, τι είστε εξοικειωμένοι με. Και τότε μπορούμε να χέρι που έξω. Και έτσι η πρόκληση για το μέλλον, μεταξύ άλλων, πράγματα για σας, θα είναι να γράψει C κώδικα που ανακτά ένα σωρό Αρχεία JPEG για μένα και αποκάλυψε θα είναι αυτοί οι άνθρωποι, οι τόποι, ή τα πράγματα. Και θα μιλήσουμε επίσης, σε αυτό το πρόβλημα που και στις μέρες που έρχονται, για γραφικά γενικότερα. Έχουμε χρησιμοποιήσει, μια πορεία, για να ξεσπάσει. Αλλά έχετε είδος θεωρείται δεδομένη υπάρχει αυτές οι υψηλές έννοιες επιπέδου ορθογώνια και οβάλ. Αλλά κάτω από το καπό υπάρχουν εικονοστοιχεία. Και θα έπρεπε να ξεκινήσει σκεφτόμαστε αυτά. Ή θα είναι για p-set 4 πρέπει να σκεφτούμε για το χάσμα μεταξύ των τούβλων σας, πώς γρήγορα είστε μπάλα κινείται σε η οθόνη για να ξεσπάσει. Έτσι, δεν υπάρχει η έννοια της κουκίδες στην οθόνη σας, που είναι μπαίνουν στο παιχνίδι ήδη. Τώρα τι βλέπετε, όμως, είναι ό, τι μπορείτε να πάρετε σε μια οθόνη υπολογιστή. Αν έχετε παρακολουθήσει ποτέ κάποια καλή ή κακή τηλεόραση, οι πιθανότητες είναι ότι λίγο πολύ αντιμετωπίζει το κοινό, όπως technophobes που κάνουν δεν είναι πραγματικά γνωρίζει πολλά για υπολογιστές. Και γι 'αυτό είναι πολύ εύκολο για την αστυνομία ντετέκτιβ να πω, μπορεί να σας καθαρίσει ότι για μένα; Ή να ενισχύσει, έτσι δεν είναι; Ενίσχυση είναι σαν το buzz λέξη στον πλέον κάθε έγκλημα που σχετίζονται show. Και η πραγματικότητα είναι ότι αν πάρετε ένα πολύ θολή εικόνα ενός υπόπτου κάνει κάτι κακό, δεν μπορείτε να απλά να ενισχυθεί. Δεν μπορείτε να κάνετε ζουμ σε απείρως. Δεν μπορείτε να δείτε στη λάμψη του ατόμου ματιών που δεσμεύτηκε ότι συγκεκριμένο έγκλημα, παρά το γεγονός ότι επικράτηση αυτό στην τηλεόραση. Και έτσι με αυτό ας παρακινήσει ότι επερχόμενη πρόβλημα που με μια ματιά κάποιες συναυλίες με την οποία θα Ίσως να είναι εξοικειωμένος. [PLAYBACK VIDEO] -Εντάξει. Τώρα, ας πάρει μια καλή ματιά σε σας. It-Hold. Εκτελέστε ότι πίσω. -Περίμενε ένα λεπτό. Πηγαίνετε δεξιά. -Υπάρχει. Πάγωμα αυτό. -Πλήρης οθόνη. -Εντάξει. Πάγωμα αυτό. -Σφίξτε πάνω σε αυτό, θα ya; -Vector μέσα σε εκείνο τον τύπο από τον πίσω τροχό. -Zoom στο δεξί εδώ σε αυτό το σημείο. -Με το σωστό εξοπλισμό, το είδωλό μπορεί να διευρυνθεί και ακονισμένα. -Τι είναι αυτό; -Είναι ένα πρόγραμμα βελτίωσης. -Μπορείς να σαφές ότι μέχρι κάποια; -Δεν ξέρω. Ας το ενισχύσει. -Ενίσχυση του τμήματος Α-6. -Θα ενισχυθεί η λεπτομέρεια και - -Νομίζω ότι υπάρχει αρκετή για να ενισχύσει. Αφήστε το στην οθόνη μου. -Να ενισχυθεί η αντανάκλαση στο μάτι της. -Ας τρέξουμε αυτό μέσω βελτίωσης βίντεο. -Edgar, μπορείτε να βελτιώσετε αυτό; -Περίμενε. -Έχω εργαστεί σε αυτό τον προβληματισμό. -Κάποιος τον προβληματισμό του. -Reflection. -Υπάρχει μια αντανάκλαση του προσώπου του ανθρώπου. -Η αντανάκλαση. -Υπάρχει μια αντανάκλαση. -Ζουμ σε καθρέφτη. -Μπορείτε να δείτε μια αντανάκλαση. -Μπορείς να ενισχύσει την εικόνα από εδώ; -Μπορείς να τον ενισχύσει εδώ; -Μπορείς να το ενισχύσει; -Μπορείς να το ενισχύσει; -Μπορούμε να ενισχύσουμε αυτό; -Μπορείς να το ενισχύσει; -Περίμενε ένα δεύτερο, θα ενισχυθεί. -Ζουμ σε πόρτα. -X10. -Zoom. [Γέλια] -Μετακίνηση μέσα -Περίμενε, να σταματήσει. -Stop. It-Παύση. -Περιστροφή 75 μοίρες γύρω από η κατακόρυφη παρακαλώ. [Γέλια] -Stop, και πίσω στο τμήμα για την πόρτα και πάλι. -Έχεις μια εικόνα ενισχυτή που μπορεί να bitmap; -Ίσως μπορούμε να χρησιμοποιήσουμε το Pradeep Sen μέθοδος για να δείτε μέσα από τα παράθυρα. -Αυτό το λογισμικό είναι state of the art. -Η αξία εικονίδιο είναι μακριά. -Με το σωστό συνδυασμό των αλγορίθμων. -Έχει ληφθεί αλγόριθμοι φωτισμού σε το επόμενο επίπεδο και μπορώ να τα χρησιμοποιούν για να να ενισχύσει αυτήν την φωτογραφία. -Lock και να διευρύνει το z-άξονα. -Ενίσχυση της. -Ενίσχυση της. -Ενίσχυση της. -Πάγωμα και να ενισχυθεί. [PLAYBACK VIDEO END] David J. MALAN: Έτσι Set Πρόβλημα 5 είναι ό, τι βρίσκεται μπροστά μας εκεί. Έτσι, θα πάρει σύντομα μια καλύτερη κατανόηση από πότε και γιατί μπορείτε να και μας δεν μπορεί να ενισχύσει με αυτόν τον τρόπο. Αλλά πρώτα, ας επιστρέψουν την προσοχή μας σε μερικά από τα δομικά στοιχεία που θα πρέπει να είναι σε θέση να πει την ιστορία. Έτσι, υπενθυμίζουν ότι επέστησε αυτή την εικόνα για Δευτέρας και λίγο την περασμένη εβδομάδα. Και αυτό περιγράφει τη διάταξη των πραγμάτων στη μνήμη του υπολογιστή σας όταν τρέχει κάποιο πρόγραμμα. Η τεχνολογία τμήμα επάνω στην κορυφή, ανάκληση, αναφέρεται με τις πραγματικές μηδενικά και μονάδες που συνθέτουν το πρόγραμμά σας. Εκεί, κάτω από αυτό, ορισμένοι προετοιμαστεί ή Αγνωστο δεδομένα, τα οποία κατά κανόνα αναφέρεται σε πράγματα όπως σταθερές ή χορδές ή καθολικές μεταβλητές που έχουν έχουν δηλωθεί εκ των προτέρων. Υπάρχει το σωρό, αλλά θα έρθει επανέλθω σε αυτό σε λίγο. Και έπειτα υπάρχει η στοίβα. Σαν μια στοίβα των δίσκων στην καφετέρια, αυτό είναι όπου η μνήμη παίρνει στρώσεις και στρώσεις όποτε θα κάνουμε ό, τι σε ένα πρόγραμμα; Ποια είναι η στοίβα χρήση; Ναι; Πρόσκληση της λειτουργίας. Κάθε φορά που θα καλέσετε μια συνάρτηση, είναι δοθεί στην λωρίδα της μνήμης της τοπικές μεταβλητές ή τις παραμέτρους της. Και εικονογραφικά, βλέπουμε ότι με κάθε διαδοχική λειτουργία που ονομάζεται, όταν το Α κλήσεις καλεί τον Β Γ Δ κλήσεις, που παίρνουν στρώσεις πάνω στη στοίβα. Και σε καθεμία από τις φέτες μνήμη είναι ουσιαστικά ένα μοναδικό πεδίο για την εν λόγω λειτουργία, η οποία, φυσικά, είναι προβληματική, αν θέλετε να το χέρι από τη μία λειτουργία στην άλλη Ένα κομμάτι των δεδομένων που θέλετε να μεταλλαχθεί ή να αλλάξετε. Λοιπόν, τι ήταν η λύση μας να μπορέσει Μια λειτουργία αντιπροσωπεύεται από ένα stack πλαίσιο για να αλλάξετε τη μνήμη μέσα άλλου πλαισίου στοίβας; Πώς να κάνει αυτά τα δύο μιλάμε ο ένας στον άλλο; Έτσι, μέσω των δεικτών ή διευθύνσεις, η οποία, και πάλι, απλά περιγράφουν όπου μνήμη, μέσω ενός ειδικού Αριθμός δάγκωμα, το συγκεκριμένο αξία μπορεί να βρεθεί. Έτσι θυμηθούμε την τελευταία φορά πάρα πολύ συνεχίσαμε την ιστορία και κοίταξε ένα αρκετά λάθη πρόγραμμα. Και αυτό το πρόγραμμα είναι buggy για λίγους λόγους, αλλά το πιο ανησυχητικό είναι το ένα επειδή αποτυγχάνει να ελέγξει τι; Ναι, αποτυγχάνει να ελέγξει την είσοδο. Συγγνώμη; Αν είναι πάνω από 12 χαρακτήρες. Έτσι, πολύ έξυπνα, όταν καλείτε memcopy, η οποία, όπως υποδηλώνει το όνομα, απλά αντίγραφα μνήμης από το δεύτερο επιχείρημά της στο πρώτο επιχείρημά της. Το τρίτο επιχείρημα, πολύ έξυπνα, είναι ελέγχονται για να βεβαιωθείτε ότι δεν έχετε αντιγράψετε περισσότερα από ό, τι, σε αυτή την περίπτωση, το μήκος του μπαρ, τον αριθμό των χαρακτήρων, στο προορισμού, η οποία είναι αυτή συστοιχία C. Αλλά το πρόβλημα είναι ότι ό, τι αν C μόνη της δεν είναι αρκετά μεγάλη να χειριστεί αυτό; Θα πάμε να αντιγράψετε τον αριθμό των bytes που σας έχει δοθεί. Αλλά τι στην πραγματικότητα έχουν περισσότερο bytes από ό, τι έχετε χώρο για; Λοιπόν, αυτό το πρόγραμμα είναι πολύ ανόητα μόνο τυφλά προχωρά να πάρει ό, τι είναι δεδομένη, γεια backslash 0 είναι μεγάλη, αν string είναι μικρή αρκετά, όπως και πέντε χαρακτήρες. Αλλά αν είναι πραγματικά ή 12 χαρακτήρες 1.200 χαρακτήρες, είδαμε την τελευταία φορά ότι είστε ακριβώς πρόκειται να εντελώς αντικαταστήσετε τη μνήμη που δεν ανήκουν σε σας. Και χειρότερη περίπτωση, αν αντικαταστήσετε ότι κόκκινο τμήμα εκεί που ονομάζεται διεύθυνση επιστροφής - Αυτό είναι ακριβώς όπου ο υπολογιστής αυτόματα, για σένα, πίσω από το σκηνές, σβήνει τα 32-bit, η οποία υπενθυμίζει ότι σε ό, τι διεύθυνση θα έπρεπε επιστρέψει όταν foo, αυτή η άλλη λειτουργία, γίνεται εκτέλεσης. Είναι μια ψίχα ψωμιού των ειδών στο οποίο επιστρέφει. Αν αντικαταστήσετε ότι, ενδεχομένως, αν είσαι ο κακός, θα μπορούσε να ενδεχομένως να αναλάβει υπολογιστή κάποιου. Και θα είστε πιο σίγουρα συντριβή που στις περισσότερες περιπτώσεις. Τώρα αυτό το πρόβλημα επιτείνεται περαιτέρω όπως αρχίσαμε να μιλάμε για τη μνήμη διαχείρισης γενικότερα. Και malloc, για την κατανομή της μνήμης, είναι μια λειτουργία που μπορούμε να χρησιμοποιήσουμε για να διαθέσει μνήμη όταν δεν γνωρίζουμε εκ των προτέρων ότι ίσως χρειαστεί κάποια. Έτσι, για παράδειγμα, αν πάω πίσω στη συσκευή εδώ. Και έχω ανοίξει από τον περασμένο hello2.c φορά, θυμηθούμε αυτό το πρόγραμμα εδώ, η οποία εξέτασε λίγο κάτι σαν αυτό, μόλις τρεις γραμμές - αναφέρετε το όνομά σας, τότε το όνομα string, στα αριστερά, ισούται GetString. Και τότε μπορούμε να το εκτυπώσετε, το όνομα του χρήστη. Έτσι, αυτό ήταν ένα εξαιρετικά απλό πρόγραμμα. Για να είμαι σαφής, επιτρέψτε μου να πάμε μπροστά και να κάνει γεια-2. Πάω να κάνω dot κάθετος γεια-2. Δηλώστε το όνομά σας - David. Enter. Γεια σου David. Φαίνεται να λειτουργεί ΟΚ. Αλλά τι πραγματικά συμβαίνει κάτω από το καπό εδώ; Πρώτα ας φλούδα πίσω ορισμένων στρωμάτων. String είναι απλά ένα συνώνυμο έχουμε συνειδητοποιήσει για τι; Char αστέρων. Ας κάνουμε λίγο πιο απόκρυφες αλλά πιο τεχνικά σωστό ότι αυτό είναι μια χαρα αστέρι, πράγμα που σημαίνει ότι το όνομα, ναι, είναι μια μεταβλητή. Αλλά τι αποθηκεύει το όνομα είναι η διεύθυνση του μια χαρα, το οποίο αισθάνεται λίγο περίεργα επειδή είμαι πάρει πίσω ένα string. Είμαι πάρει πίσω πολλαπλά χαρακτήρες δεν είναι μια χαρα. Αλλά φυσικά, θα χρειαστείτε μόνο το πρώτο Διεύθυνση char να θυμάστε, όπου η ολόκληρη σειρά είναι επειδή ο λόγος; Πώς θα καταλάβω πού το τέλος του το string είναι να γνωρίζουμε την αρχή; Το μηδέν backslash. Έτσι, με τις δύο αυτές ενδείξεις θα καταλάβω πριν από την έναρξη και το τέλος της οποιαδήποτε σειρά είναι, εφ 'όσον είναι κατάλληλα διαμορφωμένο με το null τερματισμού, ότι η μηδενική backslash. Αλλά αυτό είναι καλώντας GetString. Και αποδεικνύεται ότι GetString όλο αυτό το διάστημα ήταν το είδος της εξαπάτηση για εμάς. Είναι ήδη κάνει αυτή την εργασία, να είστε σίγουροι, να πάρει μια σειρά από το χρήστη. Αλλά πού είναι ότι η μνήμη έχουν προέρχονται από; Αν πάμε πίσω στην εικόνα που εδώ και εφαρμόσουν τον ορισμό από ακριβώς ένα πριν από λίγο, ότι η στοίβα είναι εκεί όπου μνήμη πηγαίνει όταν οι λειτουργίες καλούνται, από αυτή τη λογική, όταν καλείτε GetString, και στη συνέχεια να πληκτρολογήσετε Ϋ-Α-V-Ι-ϋ Enter, όπου είναι D-Α-V-Ι-ϋ backslash μηδέν αποθηκεύονται, με βάση το την ιστορία που έχουμε μας είπε τώρα; Φαίνεται να είναι σε η στοίβα, έτσι δεν είναι; Όταν καλείτε να πάρει σειρά σας να πάρετε μια μικρό κομμάτι της μνήμης στη στοίβα. Έτσι στέκεται στο λόγο ότι η D-A-V-I-D backslash μηδέν αποθηκεύεται εκεί στη στοίβα. Αλλά περιμένετε ένα λεπτό, GetString αποδόσεις ότι string, να το πω έτσι, που σημαίνει Είναι δίσκο από την καφετέρια έχει ληφθεί από τη στοίβα. Και είπαμε και την προηγούμενη φορά ότι μόλις ένα συνάρτηση επιστρέφει, και παίρνετε ότι δίσκο, να το πω έτσι, από τη στοίβα, ποιο μπορείτε να υποθέσουμε για τα απομεινάρια του ότι η μνήμη; I είδος τους επανασχεδίαζε ως ερωτηματικά επειδή ουσιαστικά γίνει άγνωστες τιμές. Μπορούν να επαναχρησιμοποιηθούν όταν κάποια επόμενη λειτουργία ονομάζεται. Με άλλα λόγια, αν συμβεί να αποθήκευση - Θα τραβήξω μια γρήγορη εικόνα εδώ της στοίβας. Αν τυχαίνει να εφιστά την κάτω του τμήματος μνήμη μου, και εμείς θα πούμε ότι αυτό είναι το μέρος της μνήμης καταλαμβάνεται από τους κύριους και ίσως arg c και arg v και οτιδήποτε άλλο στο πρόγραμμα, όταν GetString ονομάζεται, προφανώς GetString παίρνει ένα μεγάλο κομμάτι της μνήμης εδώ. Και στη συνέχεια, ϋ-Α-V-Ι-ϋ κάπως καταλήγει σε αυτή τη λειτουργία. Και Πάω να υπεραπλουστεύσω. Αλλά ας υποθέσουμε ότι της D-A-V-I-D backslash μηδέν. Έτσι είναι αυτό το πολλά bytes που χρησιμοποιούνται σε το πλαίσιο για την GetString. Αλλά το συντομότερο GetString αποδόσεις, εμείς είπα την τελευταία φορά που αυτή η μνήμη πάνω εδώ όλα γίνεται - woops! - όλα γίνεται αποτελεσματικά διαγράφονται. Και μπορούμε να σκεφτούμε αυτό τώρα ως ερώτημα σημάτων, διότι ποιος ξέρει τι πρόκειται να γίνει από αυτήν τη μνήμη. Πράγματι, πολύ συχνά καλούν συναρτήσεις εκτός από GetString. Και μόλις καλώ κάποια άλλη λειτουργία από GetString, ίσως όχι σε το συγκεκριμένο πρόγραμμα που μόλις είδαμε αλλά σε κάποια άλλη, σίγουρα κάποιο άλλο η λειτουργία θα μπορούσε να καταλήξει να δοθεί Αυτό το επόμενο σημείο στη στοίβα. Γι 'αυτό δεν μπορεί να είναι ότι GetString καταστήματα D-Α-V-I-D στη στοίβα, γιατί θα αμέσως χάσετε την πρόσβαση σε αυτό. Αλλά ξέρουμε ότι GetString επιστρέφει μόνο τι; Δεν είναι επιστρέφουν με έξι χαρακτήρες. Τι είναι αυτό που πραγματικά έκανε την επιστροφή καταλήγουμε στο συμπέρασμα τελευταία φορά; Η διεύθυνση του πρώτου. Έτσι, κατά κάποιο τρόπο, όταν καλείται GetString, είναι κατανομή ένα κομμάτι της μνήμης για η σειρά που ο τύπος τους χρήστες και στη συνέχεια επιστρέφει τη διεύθυνση του. Και αποδεικνύεται ότι όταν θέλετε να λειτουργούν για την εκχώρηση μνήμης σε αυτό τρόπο και την επιστροφή προς το πρόσωπο που καλείται ότι η λειτουργία, η διεύθυνση της αυτό το κομμάτι της μνήμης, θα πρέπει οπωσδήποτε δεν μπορεί να τεθεί σε στοίβας του κάτω, γιατί λειτουργικά είναι απλά πρόκειται να μην γίνει δική σας πολύ γρήγορα, ώστε να μπορείτε να μαντέψετε, όπου θα πρόκειται πιθανώς για να το πετάξετε Αντ 'αυτού, η λεγόμενη σωρού. Έτσι, μεταξύ του πυθμένα της μνήμης σας διάταξη και η κορυφή της μνήμης σας διάταξης είναι ένα σωρό τμήματα. Η μία είναι η στοίβα, και δεξιά παραπάνω, είναι ο σωρός. Και σωρού είναι απλά ένα διαφορετικό κομμάτι της μνήμης που δεν χρησιμοποιείται για τις λειτουργίες όταν το λένε. Είναι χρησιμοποιείται για τη μακροπρόθεσμη μνήμη, όταν θέλετε μια λειτουργία για να αρπάξει μερικά μνήμη και να είναι σε θέση να κρεμάσει προς το χωρίς να χάσει τον έλεγχό του. Τώρα, θα μπορούσατε ίσως αμέσως δούμε ότι αυτό δεν είναι απαραιτήτως ένα τέλειο σχεδιασμό. Καθώς το πρόγραμμά σας τη μνήμη κατανέμεται εξ η στοίβα, ή να καλέσετε περισσότερες και περισσότερες λειτουργίες, ή να διαθέσουν μνήμη στο σωρό με τη malloc μακριά ως GetString κάνει, ό, τι σαφώς φαίνεται να είναι αναπόφευκτο πρόβλημα; Δεξιά. Όπως και το γεγονός ότι αυτά τα βέλη βλέπουν η μία την άλλη δεν αποτελεί καλό οιωνό. Και πράγματι, θα μπορούσε πολύ γρήγορα να καταρρεύσει ένα πρόγραμμα σε οποιοδήποτε αριθμό από τρόπους. Στην πραγματικότητα, πιστεύω ότι μπορεί να έχουμε κάνει αυτό το λάθος μια φορά. Ή αν όχι, ας το κάνουμε σκόπιμα τώρα. Επιτρέψτε μου να πάμε μπροστά και να γράφουν σούπερ γρήγορα ένα πρόγραμμα που ονομάζεται dontdothis.c. Και τώρα θα πάω εδώ και δεν απότομη περιλαμβάνουν stdio.h. Ας δηλώσει συνάρτηση foo παίρνει δεν υπάρχουν επιχειρήματα, τα οποία είναι συμβολίζεται καθώς και από άκυρα. Και το μόνο πράγμα foo πρόκειται να κάνουμε είναι να κλήση foo, ο οποίος κατά πάσα πιθανότητα δεν είναι η πιο έξυπνο ιδέα, αλλά ας είναι. Ent κύριο κενό. Τώρα το μόνο πράγμα κύρια πρόκειται να κάνετε είναι να καλέσετε foo, καθώς και. Και μόνο για πλάκα, είμαι πρόκειται να πάει μπροστά εδώ και να πω printf "Γεια σας από foo. " OK. Έτσι, αν δεν είχα κάνει κάποια λάθη, Κάντε dontdothis dot κάθετος. Και ας το κάνουμε σε ένα μεγαλύτερο παράθυρο - dot κάθετος, dontdothis. Έλα. Uh oh. Προφανώς, μπορείτε να το κάνετε αυτό. Γαμώτο. OK. Περιμένετε. Αναμείνατε. Μήπως εμείς - Κάναμε το χρησιμοποιήσετε με κάνει. [Αναστενάζει] Το ξέρω, αλλά πιστεύω ότι εμείς Μόλις διέγραψα αυτό. Χμ, ναι. Γαμώτο. Λύστε αυτό Rob. Τι; Είναι πολύ απλό. Ναι, γυρίσαμε τη βελτιστοποίηση off. OK, στέκονται αντίο. Τώρα νιώθω καλύτερα. OK. Εντάξει. Οπότε ας μεταγλωττίσετε αυτό - Να σας dontdothis. Ίσως χρειαστεί να μετονομάσετε αυτό dothis.c ακριβώς σε μια στιγμή. Εκεί πάμε. Σας ευχαριστώ. OK. Έτσι, το γεγονός ότι ήμουν εκτύπωση κάτι ήταν στην πραγματικότητα μόνο επιβραδύνουν τη διαδικασία με την οποία θα έχουμε φτάσει σε αυτό το σημείο. OK. Φτου! Έτσι, αυτό που πραγματικά συμβαίνει; Ο λόγος που υπάρχει, ακριβώς όπως ένα μέρος, είναι κάνει τίποτα όσον αφορά τις εισροές και παραγωγή τείνει να είναι πιο αργή, επειδή πρέπει να γράψετε τους χαρακτήρες στο οθόνη, θα πρέπει να μετακινηθείτε. Έτσι, τα πολυλογώ, είχα πραγματικά συνέβη τόσο ανυπόμονος, θα έχουμε δει αυτό το τελικό αποτέλεσμα, καθώς και. Τώρα που πήρα βόλτα του print-ups, θα το δείτε αμέσως. Γιατί λοιπόν συμβαίνει αυτό. Λοιπόν, η απλή εξήγηση, φυσικά, είναι ότι foo κατά πάσα πιθανότητα δεν θα πρέπει να να είναι η ίδια κλήση. Τώρα, σε γενικούς όρους, αυτή είναι η αναδρομή. Και σκεφτήκαμε μερικές εβδομάδες Πριν από αναδρομικές είναι καλό. Αναδρομή είναι αυτό το μαγικό τρόπο εκφράζοντας τον εαυτό σας super λακωνικά. Και απλά λειτουργεί. Αλλά υπάρχει ένα βασικό χαρακτηριστικό όλων των οι αναδρομικές προγράμματα έχουμε μιλήσει περίπου και κοίταξε μέχρι σήμερα, η οποία ήταν ότι είχαν τι; Μια περίπτωση βάση, η οποία ήταν κάποια σκληρά κωδικοποιημένους περίπτωση που αναφέρουν ότι σε ορισμένες περιπτώσεις δεν θέτουν foo, η οποία είναι σαφώς δεν συμβαίνει εν προκειμένω. Έτσι, αυτό που πραγματικά συμβαίνει όσον αφορά αυτή την εικόνα; Λοιπόν, όταν το βασικό καλεί foo, θα παίρνει ένα κομμάτι της μνήμης. Όταν foo foo καλεί, παίρνει ένα κομμάτι της μνήμης. Όταν foo foo καλεί, παίρνει ένα κομμάτι. Παίρνει ένα κομμάτι. Παίρνει ένα κομμάτι. Επειδή foo ποτέ δεν επιστρέφουν. Εμείς ποτέ δεν είμαστε διαγράφοντας ένα από αυτά καρέ από τη στοίβα. Έτσι είμαστε φυσάει μέσα από το σωρό, δεν να αναφέρουμε ποιος ξέρει τι άλλο, και είμαστε υπερέβαιναν τα όρια της μας λεγόμενη τμήμα της μνήμης. Σφάλμα πάει κατάτμηση ψευδείς. Έτσι, η λύση υπάρχει προφανώς δεν το κάνουμε αυτό. Αλλά η μεγαλύτερη επίπτωση είναι ότι, ναι, απολύτως υπάρχει κάποια ορίου, ακόμη και αν δεν είναι σαφώς καθορισμένες, ως προς το πώς πολλές λειτουργίες που μπορείτε να καλέσετε σε ένα πρόγραμμα, πόσες φορές μια συνάρτηση μπορεί να ζητήσει η ίδια. Έτσι, ακόμα κι αν κάναμε κήρυγμα αναδρομή όπως αυτό ενδεχομένως μαγικό πράγμα που ένας πριν από μερικές εβδομάδες για το σίγμα λειτουργία, και όταν παίρνουμε τα δεδομένα δομών και CS50, θα δείτε άλλους εφαρμογές για αυτό, δεν είναι κατ 'ανάγκην το καλύτερο πράγμα. Διότι, αν μια συνάρτηση καλεί τον εαυτό της, αυτοαποκαλείται, ακόμα κι αν υπάρχει μια βάση περίπτωση, αν δεν χτυπήσει το βασικό σενάριο για 1.000 κλήσεις ή 10.000 κλήσεις, από Εκείνη τη στιγμή μπορείτε να έχετε ξεμείνει από χώρο στις λεγόμενες stack σας και πατήστε κάποια άλλα τμήματα της μνήμης. Γι 'αυτό είναι πάρα πολύ ένα σχέδιο trade-off μεταξύ κομψότητα και μεταξύ ευρωστία συγκεκριμένων σας εφαρμογή. Έτσι, υπάρχει ένα άλλο μειονέκτημα ή άλλο πέτυχα σε ό, τι έχουμε έχει κάνει μέχρι στιγμής. Όταν ζήτησα GetString - επιτρέψτε μου να πάω πίσω στο γεια-2. Παρατηρήστε ότι είμαι καλώντας GetString, η οποία επιστρέφει μια διεύθυνση. Και εμείς ισχυρίζονται σήμερα ότι η διεύθυνση είναι από το σωρό. Και τώρα είμαι εκτύπωση από το κορδόνι σε αυτή τη διεύθυνση. Αλλά ποτέ δεν έχω ονομάζεται αντίθετο της GetString. Εμείς ποτέ δεν είχα να calll μια λειτουργία, όπως ungetstring, όπου μπορείτε να το χέρι πίσω ότι η μνήμη. Αλλά ειλικρινά πιθανότατα θα έπρεπε να είναι. Διότι, αν συνεχίζουμε να ρωτάμε τον υπολογιστή για τη μνήμη, με κάποιον σαν GetString αλλά ποτέ δεν το δώσει πίσω, σίγουρα ότι πάρα πολύ είναι βέβαιο ότι θα οδηγήσει σε προβλήματα με την οποία έχουμε ξεμείνει από μνήμη. Και στην πραγματικότητα, μπορούμε να αναζητήσουμε αυτά προβλήματα με το νέο εργαλείο του οποίου η χρήση είναι λίγο αινιγματικό να πληκτρολογήσετε. Αλλά επιτρέψτε μου να πάω μπροστά και splash επάνω στην οθόνη ακριβώς σε μια στιγμή. Πάω να πάει μπροστά και να τρέξει Valgrind με την παράμετρο της οποίας η πρώτη εντολή επιχείρημα γραμμή είναι το όνομα του εν λόγω προγράμματος γεια-2. Και δυστυχώς, είναι εξόδου είναι atrociously πολύπλοκο για κανέναν καλό λόγο. Έτσι βλέπουμε όλα αυτά τα χάλια. Ο David είναι αναφέρετε το όνομά μου. Έτσι, αυτό είναι το πρόγραμμα στην πραγματικότητα λειτουργεί. Και τώρα έχουμε αυτήν την έξοδο. Έτσι Valgrind είναι παρόμοια στο πνεύμα με GDB. Δεν είναι ένα πρόγραμμα εντοπισμού σφαλμάτων per se. Αλλά είναι ένα πούλι μνήμης. Είναι ένα πρόγραμμα που θα τρέξει σας προγραμματίσετε και να σας πω αν ζητηθεί μια υπολογιστή για τη μνήμη και ποτέ δεν το παρέδωσε πίσω, έτσι σημαίνει ότι έχετε μια διαρροή μνήμης. Και διαρροές μνήμης τείνουν να είναι κακό. Και θα είναι οι χρήστες των υπολογιστών έχουν πιθανότατα θεώρησαν αυτό, αν έχετε ένα Mac ή PC. Έχετε ποτέ χρησιμοποιήσει τον υπολογιστή σας για ενώ δεν είναι και επανεκκίνηση σε αρκετές ημέρες, ή έχετε μόνο ένα πολύ προγράμματα που τρέχουν, και το καταραμένο πράγμα επιβραδύνει σε μια λείανση σταματήσει, ή τουλάχιστον Είναι εξαιρετικά ενοχλητικό να χρησιμοποιήσετε, επειδή ό, τι ακριβώς έχεις σούπερ αργή. Τώρα που μπορεί να είναι οποιοσδήποτε αριθμός λόγων. Θα μπορούσε να είναι ένα άπειρο βρόχο, ένα σφάλμα κώδικα κάποιου, ή, πιο απλά, θα μπορούσε να σημαίνει ότι χρησιμοποιείτε περισσότερο μνήμης, ή να προσπαθεί να, από ό, τι σας υπολογιστής έχει στην πραγματικότητα. Και ίσως υπάρχει ένα bug σε κάποιο πρόγραμμα που διατηρούν ζητώντας τη μνήμη. Browsers για χρόνια ήταν διαβόητος για Αυτό, ζητώντας όλο και περισσότερη μνήμη αλλά ποτέ δεν παράδοση πίσω. Σίγουρα, αν έχετε μόνο ένα πεπερασμένο ποσό της μνήμης, δεν μπορείτε να ζητήσετε απείρως πολλές φορές για μερικές από εκείνη μνήμης. Και έτσι αυτό που βλέπετε εδώ, ακόμη και αν και πάλι η παραγωγή Valgrind είναι άνευ λόγου πολύπλοκο να ρίξετε μια ματιά σε Πρώτον, αυτό είναι το ενδιαφέρον κομμάτι. Heap - σε χρήση κατά την έξοδο. Τόσο εδώ είναι πόση μνήμη ήταν σε χρήση στο σωρό κατά τη χρόνο το πρόγραμμά μου βγήκε - προφανώς έξι bytes σε ένα μπλοκ. Έτσι, Πάω να κυματίσει στα χέρια μου σε ό, τι ένα μπλοκ είναι. Σκεφτείτε ότι είναι απλά ένα κομμάτι, μια πιο τεχνικός όρος για το κομμάτι. Όμως, έξι bytes - ποιες είναι οι έξι που bytes ήταν ακόμα σε χρήση; Ακριβώς. D-Α-V-I-D backslash μηδέν, πέντε επιστολή Όνομα συν το null τερματισμού. Έτσι, το πρόγραμμα αυτό Valgrind παρατηρήσει ότι έχω ζήτησε για έξι bytes, προφανώς, από τρόπος GetString, αλλά ποτέ τους έδωσε πίσω. Και στην πραγματικότητα, αυτό μπορεί να μην είναι τόσο προφανές αν το πρόγραμμά μου δεν είναι τρία γραμμές, αλλά είναι 300 γραμμές. Έτσι, μπορούμε πραγματικά να δώσει άλλη εντολή επιχείρημα γραμμή για να Valgrind να να γίνει πιο φλύαρη. Είναι λίγο ενοχλητικό να θυμόμαστε. Αλλά αν το κάνω - ας δούμε. Διαρροή - Ήταν να διαρρεύσει - ακόμα δεν θυμάμαι τι είναι αυτό το χέρι. - Διαρροή-check ίσον πλήρης. Ναι, σας ευχαριστώ. - Διαρροή-check ίσον πλήρης. Enter. Το ίδιο πρόγραμμα εκτελείται. Πληκτρολογήστε David και πάλι. Τώρα βλέπω λίγο πιο αναλυτικά. Αλλά κάτω από την περίληψη σωρού, ο οποίος είναι πανομοιότυπο με τέσσερις - αχ, Αυτό είναι το είδος της Νίκαιας. Τώρα Valgrind είναι πραγματικά ψάχνει λίγο πιο δύσκολο στον κώδικά μου. Και λέει ότι, προφανώς, malloc στη γραμμή - έχουμε σμίκρυνση. Στη γραμμή - δεν βλέπουμε ποια γραμμή είναι. Αλλά malloc είναι ο πρώτος ένοχος. Υπάρχει ένα blog στο malloc. Εντάξει; Εντάξει, όχι. Σωστά; Κάλεσα GetString. GetString καλεί προφανώς malloc. Λοιπόν, τι γραμμή κώδικα είναι προφανώς σε υπαιτιότητά του για το γεγονός ότι διατίθενται αυτή τη μνήμη; Ας υποθέσουμε ότι όποιος έγραψε malloc έχει εδώ και αρκετό καιρό ότι είναι δεν είναι δικό τους σφάλμα. Έτσι είναι μάλλον δικό μου. GetString σε cs50.c - έτσι ώστε να είναι ένα αρχείο κάπου στον υπολογιστή - στη γραμμή 286 φαίνεται να είναι ο ένοχος. Τώρα ας υποθέσουμε ότι CS50 έχει γύρω για αξιοπρεπές χρονικό διάστημα, έτσι ώστε εμείς είναι αλάθητος. Και γι 'αυτό είναι πιθανόν να μην είναι σε GetString ότι το σφάλμα έγκειται, αλλά σε γεια-2.γ γραμμή 18. Έτσι, ας ρίξουμε μια ματιά στο τι γραμμή 18 ήταν. Αχ. Κατά κάποιο τρόπο αυτή η γραμμή δεν είναι απαραίτητα αμαξάκι, per se, αλλά είναι ο λόγος πίσω από αυτή τη διαρροή μνήμης. Έτσι super απλά, τι θα ήταν διαισθητικά είναι η λύση εδώ; Αν ζητάμε για τη μνήμη, δεν ήταν ποτέ δίνοντας πίσω, και αυτό φαίνεται να είναι ένα πρόβλημα, διότι την πάροδο του χρόνου ο υπολογιστής μου μπορεί να τρέξει έξω από τη μνήμη, θα μπορούσε να επιβραδύνει κάτω, κακά πράγματα μπορούν να συμβούν, αλλά, ποια είναι η απλή διαισθητική λύση; Απλά το δώσει πίσω. Πώς μπορείτε να ελευθερώσετε έτσι τη μνήμη; Λοιπόν, ευτυχώς είναι πολύ απλό να πω χωρίς όνομα. Και ποτέ δεν έχω ξανακάνει αυτό. Αλλά μπορείτε να σκεφτείτε κατ 'ουσίαν δωρεάν ως το αντίθετο της malloc. δωρεάν είναι το αντίθετο της εκχώρηση μνήμης. Έτσι, τώρα επιτρέψτε μου να μεταγλωττίσετε αυτό. Κάντε γεια-2. Επιτρέψτε μου να τρέχει και πάλι. γεια-2 David. Έτσι, φαίνεται να εργαστούν σε τον ίδιο ακριβώς τρόπο. Αλλά αν πάμε πίσω στο Valgrind και την εκ νέου τρέχει ότι η ίδια εντολή σε νέα μου καταρτίζονται πρόγραμμα, πληκτρολογώντας στο όνομά μου όπως και πριν - Νίκαια. Περίληψη Heap - σε χρήση στην έξοδο - μηδέν bytes στο μηδέν μπλοκ. Και αυτό είναι πολύ ωραία, όλα μπλοκ σωρού αφέθηκαν ελεύθεροι. Δεν είναι δυνατές διαρροές. Έτσι, έρχονται, όχι με Set Πρόβλημα 4, αλλά με Set Πρόβλημα 5, οι εγκληματολογίας και έπειτα, κι αυτό θα γίνει μέτρο της ορθότητας σας πρόγραμμα, ανεξάρτητα αν έχετε ή όχι ή δεν έχουν διαρροές μνήμης. Αλλά ευτυχώς, όχι μόνο μπορείτε να αιτιολογήσει μέσω αυτών διαισθητικά, τα οποία είναι, αναμφισβήτητα, εύκολο για τα μικρά προγράμματα αλλά και πιο δύσκολο για τα μεγαλύτερα προγράμματα, Valgrind, για τα μεγαλύτερα προγράμματα, μπορεί να σας βοηθήσει να προσδιορίσετε το συγκεκριμένο πρόβλημα. Αλλά υπάρχει ένα άλλο πρόβλημα που ενδέχεται να προκύψουν. Επιτρέψτε μου να ανοίξει το αρχείο αυτό εδώ, το οποίο είναι, πάλι, μια κάπως απλό παράδειγμα. Αλλά ας επικεντρωθεί σε αυτό που αυτό το πρόγραμμα. Αυτό ονομάζεται memory.c. Θα δημοσιεύσετε αυτό αργότερα σήμερα στην zip του πηγαίου κώδικα του σήμερα. Και παρατηρήσετε ότι έχω μια λειτουργία που ονομάζεται f που δεν παίρνει ορίσματα και επιστρέφει τίποτα. Στη γραμμή 20, είμαι δηλώνοντας προφανώς δείκτη σε int και αποκαλώντας x. Είμαι ανάθεση είναι η επιστροφή αξία της malloc. Και ακριβώς για να είναι σαφές, πόσα bytes am Εγώ κατά πάσα πιθανότητα να πάρει πίσω από την malloc σε αυτή την κατάσταση; Πιθανώς 40. Πού μπορείτε να πάρετε ότι από; Λοιπόν, αν θυμηθούμε ότι ένας int είναι συχνά 4 bytes, τουλάχιστον είναι στην συσκευή, 10 φορές 4 είναι προφανώς 40. Έτσι malloc επιστρέφει μια διεύθυνση ένα μεγάλο κομμάτι της μνήμης και την αποθήκευση που αντιμετωπίσει τελικά στο x. Έτσι για να είναι σαφής, αυτό που τότε συμβαίνει; Λοιπόν, επιτρέψτε μου να επιστρέψετε στην εικόνα μας εδώ. Επιτρέψτε μου να επιστήσω μόνο το κάτω μέρος του μου μνήμη του υπολογιστή, επιτρέψτε μου να προχωρήσει και σύρει ολόκληρο το ορθογώνιο που αντιπροσωπεύει το σύνολο της μνήμης RAM μου. Θα πούμε ότι η στοίβα είναι στο κάτω μέρος. Και υπάρχει ένα τμήμα κειμένου τα στοιχεία που έχει προετοιμαστεί. Αλλά είμαι απλώς πρόκειται να αφηρημένες αυτές άλλα πράγματα μακριά, όπως τελεία, τελεία dot. Είμαι ακριβώς πρόκειται να αναφερθώ σε αυτό ως του σωρού στην κορυφή. Και στη συνέχεια, στο κάτω μέρος αυτής της εικόνας, να εκπροσωπεί κυρίως, Πάω για να του δώσει μια μνήμη φέτες στη στοίβα. Για f, Πάω να του δώσει μια φέτα της μνήμης στη στοίβα. Τώρα, έχω να συμβουλευτείτε μου πηγαίο κώδικα και πάλι. Ποιες είναι οι τοπικές μεταβλητές για την κύρια; Προφανώς τίποτα, έτσι ώστε να είναι φέτα αποτελεσματικά άδειο ή δεν είναι καν τόσο μεγάλη όπως έχω σχεδιάσει. Αλλά στην f, έχω μια τοπική μεταβλητή, που ονομάζεται x. Έτσι, Πάω να πάει μπροστά και να δώσει στ ένα μεγάλο κομμάτι της μνήμης, καλώντας το x. Και τώρα malloc από 10 φορές 4, Έτσι malloc 40, όπου είναι ότι μνήμη προέρχονται από; Δεν έχουν τραβήξει μια φωτογραφία όπως αυτό πριν. Αλλά ας υποθέσουμε ότι είναι αποτελεσματικά έρχονται από εδώ, έτσι ώστε ένα, δύο, τρία, τέσσερα, πέντε. Και τώρα χρειάζομαι 40 από αυτά. Έτσι, θα το κάνω μόνο τελεία, τελεία, τελεία να προτείνει ότι υπάρχει ακόμα περισσότερη μνήμη έρχονται πίσω από το σωρό. Τώρα, ποια είναι η διεύθυνση; Ας επιλέξουν αυθαίρετες μας αντιμετώπιση όπως πάντα - Ox123, ακόμα κι αν είναι κατά πάσα πιθανότητα θα να είναι κάτι εντελώς διαφορετικό. Αυτή είναι η διεύθυνση του πρώτου byte μνήμης που ζητάω malloc για. Έτσι, με λίγα λόγια, από τη στιγμή γραμμή 20 εκτελεί, Τι είναι κυριολεκτικά αποθηκεύονται στο εσωτερικό του x εδώ; Ox123. Ox123. Και το βόδι δεν έχει ενδιαφέρον. Σημαίνει απλώς εδώ είναι ένα δεκαεξαδικό αριθμό. Αλλά αυτό που είναι βασικό είναι ότι αυτό που έχω κατάστημα στο Χ, το οποίο είναι μια τοπική μεταβλητή. Αλλά ο τύπος δεδομένων της, και πάλι, είναι μια διεύθυνση ενός int. Λοιπόν, είμαι πρόκειται να αποθηκεύσετε Ox123. Αλλά και πάλι, αν αυτό είναι λίγο πολύ περίπλοκη χωρίς λόγο, αν μετακινηθείτε πίσω, μπορούμε αφηρημένο αυτό μακριά αρκετά λογικά και να πω ότι το x είναι ένα δείκτης σε αυτό το κομμάτι της μνήμης. OK. Τώρα το ερώτημα στο χέρι είναι τα ακόλουθα: - γραμμή 21, αποδεικνύεται, είναι προβληματική. Γιατί; Συγγνώμη; Δεν έχει - πούμε ότι για μια ακόμη φορά. Λοιπόν, αυτό δεν γίνεται δωρεάν. Έτσι, αυτό είναι το δεύτερο, αλλά. Έτσι, υπάρχει ένα άλλο, αλλά ειδικά στη γραμμή 21. Ακριβώς. Αυτή η απλή γραμμή κώδικα είναι μόνο ένα υπερχείλιση μνήμης, υπέρβαση του buffer. Ένα ρυθμιστικό σημαίνει απλά ένα κομμάτι της μνήμης. Αλλά αυτό το κομμάτι της μνήμης έχει μέγεθος 10, 10 ακέραιοι αριθμοί, το οποίο σημαίνει ότι αν έχουμε δείκτη σε αυτό χρησιμοποιώντας το συντακτικό της ζάχαρης συμβολισμός array, η πλατεία παρένθεση, έχετε πρόσβαση σε x βραχίονα 0 x 1 x στήριγμα, βραχίονα τελεία, τελεία, τελεία. x βραχίονα 9 είναι το μεγαλύτερο. Έτσι, αν κάνω x βραχίονα 10, όπου Είμαι πραγματικά συμβαίνει στη μνήμη; Λοιπόν, αν έχω 10 int - ας ζωγραφίσουμε όλα από αυτά εδώ. Έτσι, αυτό ήταν το πρώτο πέντε. Εδώ είναι οι άλλες πέντε ints. Έτσι x βραχίονα 0 είναι εδώ. x στήριγμα 1 είναι εδώ. x βραχίονα 9 είναι εδώ. x στήριγμα 10 είναι εδώ, πράγμα που σημαίνει λέω, στη γραμμή 21, ο υπολογιστής για να θέσει το αριθμό, όπου; Ο αριθμός 0, όπου; Λοιπόν, αυτό είναι 0, ναι. Αλλά ακριβώς το γεγονός ότι 0 της είναι το είδος της μια σύμπτωση. Θα μπορούσε να είναι ο αριθμός 50, για όλους μας νοιάζει. Αλλά προσπαθούμε να το θέσει σε x βραχίονα 10, η οποία είναι όπου αυτό το ερωτηματικό έχει συνταχθεί, η οποία δεν είναι ένα καλό πράγμα. Το πρόγραμμα αυτό θα μπορούσε κάλλιστα να συντριβή, ως αποτέλεσμα. Τώρα, ας πάμε μπροστά και να δούμε αν αυτό Είναι, πράγματι, τι συμβαίνει. Πραγματοποίηση μνήμης, επειδή το αρχείο ονομάζεται memory.c. Ας πάμε μπροστά και να τρέξει η μνήμη του προγράμματος. Έτσι σταθήκαμε τυχεροί, στην πραγματικότητα, φαίνεται. Σταθήκαμε τυχεροί. Αλλά ας δούμε αν τρέξουμε τώρα Valgrind. Με την πρώτη ματιά, το πρόγραμμα μου θα μπορούσε να φαίνεται να είναι απολύτως σωστό. Αλλά επιτρέψτε μου να τρέξει Valgrind με το - Διαρροή-check ίσον πλήρης στη μνήμη. Και τώρα όταν τρέχω αυτό - ενδιαφέρουσα. Άκυρα γράφουν μεγέθους 4 στο γραμμή 21 του memory.c. Γραμμή 21 του memory.c είναι ποια; Ω, ενδιαφέρον. Αλλά περιμένετε. Μέγεθος 4, τι είναι αυτό αναφέρεστε; Το μόνο που είχε να γράψει κάποιος, αλλά είναι μεγέθους 4. Γιατί είναι 4; Είναι επειδή είναι ένα int, η οποία είναι, και πάλι, τέσσερις ψηφιολέξεις. Έτσι Valgrind βρήκε ένα bug που έχω, Ματιές στον κώδικα μου, δεν το έκανε. Και ίσως TF σας ενδέχεται ή όχι. Τι Αλλά Valgrind σίγουρα διαπίστωσε ότι έχουμε κάνει ένα λάθος εκεί, ακόμα και αν και σταθήκαμε τυχεροί, και ο υπολογιστής αποφάσισε, ε, εγώ δεν πρόκειται να καταρρεύσει μόνο και μόνο επειδή αγγίξατε ένα byte, ένα Αξίζει int της μνήμης που δεν στην πραγματικότητα δική. Λοιπόν, τι άλλο είναι προβληματικό εδώ. Διεύθυνση - Αυτό είναι ένα τρελό διεύθυνση αναζητούν σε δεκαεξαδικό. Αυτό απλά σημαίνει ότι κάπου στο σωρό είναι μηδέν bytes μετά από ένα μπλοκ του μεγέθους 40 κατανέμεται. Επιτρέψτε μου σμίκρυνση εδώ και να δούμε αν Αυτό είναι λίγο πιο χρήσιμη. Ενδιαφέρουσες. Τα 40 bytes χαθεί οριστικά στο αρχείο απώλειας 1 από 1. Και πάλι, από ό, τι περισσότερες λέξεις είναι χρήσιμο εδώ. Όμως, με βάση τις μαυρισμένες γραμμές, όπου θα πρέπει να εστιάσει πιθανότατα μου την προσοχή για άλλη bug; Μοιάζει με μια γραμμή 20 του memory.c. Έτσι, αν πάμε πίσω στη γραμμή 20, που είναι η που σας εντοπιστεί νωρίτερα. Και αυτό δεν είναι απαραίτητα λάθη. Αλλά έχουμε αυτό αντιστραφεί τα αποτελέσματά της. Λοιπόν, πώς μπορώ να διορθώσω τουλάχιστον ένα από αυτά τα λάθη; Τι μπορώ να κάνω μετά την γραμμή 21; Θα μπορούσα να κάνω χωρίς x, οπότε είναι να δώσει πίσω ότι μνήμης. Και πώς μπορώ να διορθώσω αυτό το σφάλμα; Θα πρέπει σίγουρα να πάτε δεν μακρύτερα από 0. Έτσι, επιτρέψτε μου να προσπαθήσω και να επαναληφθεί αυτό. Δυστυχώς, σίγουρα πάει δεν μακρύτερα από 9. Κάντε μνήμη. Επιτρέψτε μου επανάληψη Valgrind σε ένα μεγαλύτερο παράθυρο. Και τώρα να δείτε. Νίκαια. Όλα τα μπλοκ σωρού αφέθηκαν ελεύθεροι. Δεν είναι δυνατές διαρροές. Και μέχρι εδώ πάνω, δεν υπάρχει καμία αναφορά πια της άκυρης δικαιώματος. Ακριβώς για να πάρει άπληστοι, και ας δείτε αν κάποιος άλλος επίδειξης δεν πάει όπως θα έπρεπε - Είχα πάρει τυχερός πριν από λίγο. Και το γεγονός ότι αυτό είναι μηδέν είναι ίσως άσκοπα παραπλανητική. Ας κάνουμε μόλις 50, μια κάπως αυθαίρετη αριθμό, κάνει τη μνήμη dot κάθετος μνήμης - ακόμα να πάρετε τυχεροί. Τίποτα δεν συντρίβεται. Ας υποθέσουμε ότι κάνω κάτι πραγματικά ανόητο, και το κάνω 100. Επιτρέψτε μου να ανακατασκευάσει τη μνήμη, dot κάθετος μνήμη - στάθηκε τυχερός και πάλι. Πόσο περίπου 1.000; ints πέρα ​​από, περίπου, όπου θα πρέπει να είναι; Κάντε τη μνήμη - γαμώτο. [Γέλια] OK. Ας μην χάος γύρω πια. Εκτελέστε ξανά τη μνήμη. Εκεί πάμε. Εντάξει. Έτσι, προφανώς, θα index 100.000 ints πέρα από όπου θα πρέπει να έχουν έρθει σε μνήμη, άσχημα πράγματα συμβαίνουν. Έτσι, αυτό δεν είναι προφανώς ένα σκληρό, απαράβατο κανόνα. Ήμουν το είδος της χρήσης δίκης και το λάθος για να φτάσει εκεί. Αλλά αυτό οφείλεται στο γεγονός ότι, τα πολυλογώ, μνήμη του υπολογιστή σας είναι επίσης χωρίζεται σε αυτά τα πράγματα που ονομάζονται τμήματα. Και μερικές φορές, ο υπολογιστής στην πραγματικότητα έχει δώσει λίγο περισσότερη μνήμη από ό, τι ζητάς. Αλλά για την αποτελεσματικότητα, είναι απλά πιο εύκολο να πάρετε περισσότερη μνήμη, αλλά μόνο να σας πω ότι παίρνετε ένα τμήμα του. Και αν μπορείτε να πάρετε τυχεροί μερικές φορές, Επομένως, ίσως να είναι σε θέση να αγγίξει Η μνήμη που δεν ανήκει σε εσάς. Δεν έχετε καμία εγγύηση ότι αυτό αξία βάζετε θα μείνει εκεί, γιατί ο υπολογιστής εξακολουθεί να πιστεύει ότι δεν είναι δικά σας, αλλά δεν είναι κατ 'ανάγκη θα να χτυπήσει ένα άλλο τμήμα της μνήμης του υπολογιστή και να προκαλέσουν ένα τέτοιο λάθος αυτό εδώ. Εντάξει. Οποιεσδήποτε ερωτήσεις, στη συνέχεια στη μνήμη; Εντάξει. Ας ρίξουμε μια ματιά εδώ, στη συνέχεια, σε κάτι που έχουμε ήδη λάβει για χορηγείται για αρκετό καιρό, το οποίο Είναι σε αυτό το αρχείο με το όνομα cs50.h. Έτσι, αυτό είναι ένα αρχείο. Αυτά είναι μόνο ένα σωρό των παρατηρήσεων επάνω στην κορυφή. Και ίσως να έχουν εξετάσει αυτό, αν που έσπρωξε γύρω από τη συσκευή. Αλλά αποδεικνύεται ότι όλη την ώρα, όταν χρησιμοποιείται για να χρησιμοποιήσουν σειρά ως συνώνυμο, το μέσο με το οποίο δηλώνεται που ήταν συνώνυμο με αυτό λέξη-κλειδί typedef, για τον ορισμό του τύπου. Και είμαστε ουσιαστικά λέει, να χορδή ένα συνώνυμο για char αστέρι. Ότι τα μέσα με τα οποία η στοίβα δημιούργησε αυτά ρόδες γνωστή ως το string. Τώρα εδώ είναι απλά ένα πρωτότυπο για getchar. Μπορεί να έχετε δει πριν, αλλά αυτό είναι πράγματι, αυτό που κάνει. getchar δεν παίρνει ορίσματα, επιστρέφει μια χαρα. getdouble δεν παίρνει ορίσματα, επιστρέφει ένα διπλό. getfloat δεν παίρνει ορίσματα, επιστρέφει ένας πλωτήρας, και ούτω καθεξής. getint είναι εδώ. getlonglong είναι εδώ. Και GetString είναι εδώ. Και αυτό είναι όλο. Αυτή η μωβ γραμμή είναι ένα άλλο προεπεξεργαστή οδηγίας, λόγω της hashtag κατά την έναρξη του. Εντάξει. Έτσι, τώρα επιτρέψτε μου να μπω σε cs50.c. Και εμείς δεν θα μιλήσουμε πάρα πολύ καιρό σε αυτό. Αλλά για να σας δώσει μια γεύση του τι είναι συνεχίζεται για όλα αυτά χρόνο, επιτρέψτε μου να πάω σε - ας κάνουμε getchar. Έτσι getchar είναι ως επί το πλείστον σχόλια. Αλλά μοιάζει με αυτό. Έτσι, αυτή είναι η πραγματική λειτουργία getchar που έχουμε πάει λαμβάνοντας ως δεδομένο υπάρχει. Και ακόμα κι αν δεν έχουμε χρησιμοποιήσει αυτό το ένα ότι συχνά, αν όχι ποτέ, είναι τουλάχιστον σχετικά απλή. Γι 'αυτό αξίζει να ρίξουμε μια γρήγορη ματιά εδώ. Έτσι getchar έχει έναν άπειρο βρόχο, σκόπιμα έτσι προφανώς. Καλεί στη συνέχεια - και αυτό είναι το είδος της μια ωραίο επαναχρησιμοποίηση του κώδικα που μας έγραψε. Καλεί GetString. Διότι αυτό που κάνει σημαίνει να πάρετε μια χαρα; Καλά, ίσως και να προσπαθήσει να πάρει ένα ολόκληρη γραμμή κειμένου από το χρήστη και στη συνέχεια, μόλις δούμε ένα από αυτούς τους χαρακτήρες. Στη γραμμή 60, εδώ είναι ένα μικρό bit του ελέγχου λογικής. Αν GetString επέστρεψε null, ας μην προχωρήσει. Κάτι πήγε στραβά. Τώρα αυτό είναι κάπως ενοχλητικό, αλλά συμβατικά σε C. char max πιθανώς αντιπροσωπεύει ό, τι ακριβώς με βάση το όνομά του; Είναι μια σταθερά. Είναι σαν την αριθμητική τιμή της μεγαλύτερο char μπορείτε να εκπροσωπεί με ένα δάγκωμα, το οποίο είναι πιθανώς ο αριθμός 255, η οποία είναι ο μεγαλύτερος αριθμός που αντιπροσωπεύουν οκτώ bits, ξεκινώντας από το μηδέν. Έτσι έχω χρησιμοποιήσει αυτό, σε αυτή τη λειτουργία, όταν γράφοντας τον κωδικό αυτό, μόνο και μόνο επειδή αν κάτι πάει στραβά στην getchar, αλλά Σκοπός της ζωής είναι να επιστρέψει ένα char, θα πρέπει με κάποιο τρόπο να είναι σε θέση να ειδοποιήσει το χρήστη ότι κάτι πήγε στραβά. Δεν μπορεί να επιστρέψει null. Αποδεικνύεται ότι το null είναι ένας δείκτης. Και πάλι, getchar έχει να επιστρέψει μια χαρα. Έτσι, η σύμβαση, αν κάτι πάει λάθος, είστε εσείς, ο προγραμματιστής, ή Στην περίπτωση αυτή, εγώ με τη βιβλιοθήκη, είχα μια δίκαιη αποφασίσει αυθαίρετα, εάν κάτι πάει στραβά, Πάω να επιστρέφει τον αριθμό 255, το οποίο είναι πραγματικά σημαίνει ότι δεν μπορεί, ο χρήστης δεν μπορεί να πληκτρολογήσετε ο χαρακτήρας αντιπροσωπεύεται από την αριθμός 255, γιατί είχαμε ένα το κλέψει όπως το λεγόμενο αξία δεικτών για την αντιπροσωπεύουν ένα πρόβλημα. Τώρα αποδεικνύεται ότι ο χαρακτήρας 255 δεν είναι κάτι που μπορείτε να πληκτρολογήσετε σε πληκτρολογίου σας, έτσι δεν είναι καμία μεγάλη υπόθεση. Ο χρήστης δεν παρατηρήσετε ότι Έχω κλέψει αυτό το χαρακτήρα. Αλλά αν ποτέ δείτε στις σελίδες άνθρωπος σε μια το σύστημα του υπολογιστή κάποια αναφορά σε ένα όλα τα καπάκια σταθερή, όπως αυτό που λέει, σε περιπτώσεις σφάλματος Αυτή η σταθερή δύναμη να επιστραφούν, αυτό είναι όλο κάποια ανθρώπινη έκανε χρόνια πριν είχε αποφασίσει αυθαίρετα να επιστρέψετε αυτό ιδιαίτερη αξία και ονομάσουμε μια σταθερά σε περίπτωση κάτι πάει στραβά. Τώρα η μαγεία συμβαίνει εδώ κάτω. Πρώτον, είμαι δηλώνοντας στην γραμμή 67 δύο χαρακτήρες, C1 και C2. Και τότε στη γραμμή 68, δεν υπάρχει στην πραγματικότητα μια γραμμή κώδικα που είναι θυμίζει ο φίλος μας printf, δεδομένου ότι έχει τοις εκατό Cs σε εισαγωγικά. Αλλά παρατηρήστε τι συμβαίνει εδώ. sscanf σημαίνει σάρωση εγχόρδων - σημαίνει σαρώσετε ένα μορφοποιημένο string, sscanf ergo. Τι σημαίνει αυτό; Αυτό σημαίνει ότι μπορείτε να περάσετε sscanf ένα string. Και η γραμμή είναι ό, τι πληκτρολογεί ο χρήστης μέσα Περνάτε να sscanf ένα string format όπως Αυτό που λέει scanf ποια είναι Είστε ελπίζοντας ο χρήστης έχει πληκτρολογήσει μέσα Μπορείτε στη συνέχεια να περάσει-στις διευθύνσεις των δύο κομμάτια της μνήμης, στην περίπτωση αυτή, γιατί έχω δύο δείκτες τοποθέτησης. Έτσι, Πάω να του δώσει τη διεύθυνση του C1 και τη διεύθυνση του C2. Και υπενθυμίζουν ότι δίνετε μια λειτουργία η διεύθυνση κάποιας μεταβλητής, τι είναι η επίπτωση; Τι μπορεί να κάνει αυτή η λειτουργία, ως αποτέλεσμα του δίνει τη διεύθυνση μιας μεταβλητή, σε αντίθεση με η μεταβλητή είναι η ίδια; Μπορεί να αλλάξει, έτσι δεν είναι; Αν είχε κάποιος ένα χάρτη για μια φυσική διεύθυνση, μπορούν να πάνε εκεί και να κάνουμε ό, τι θέλουν σε αυτή τη διεύθυνση. Ίδια ιδέα εδώ. Αν περνάμε στην sscanf, η διεύθυνση του δύο κομμάτια της μνήμης, ακόμα και αυτά τα μικροσκοπικά μικρά κομμάτια της μνήμης, C1 και C2, αλλά έχουμε πει ότι τη διεύθυνση τους, sscanf μπορεί να το αλλάξει. Έτσι, σκοπός sscanf στη ζωή, αν διαβάσουμε η σελίδα man, είναι να διαβάσετε αυτό το χρήστης πληκτρολογήσει σε, ελπίδα για το χρήστη που έχει δακτυλογραφημένο σε ένα χαρακτήρα και ίσως ένας άλλος χαρακτήρας, και ανεξάρτητα από το χρήστη πληκτρολογήσει, ο πρώτος χαρακτήρας πηγαίνει εδώ, ο δεύτερος χαρακτήρας πηγαίνει εδώ. Τώρα, ως ένα μέρος, αυτό, και θα κάνατε Το μόνο που ξέρω αυτό από την τεκμηρίωση, το γεγονός ότι έβαλα ένα κενό εκεί απλά σημαίνει ότι δεν με νοιάζει αν ο χρήστης πατήσει το πλήκτρο διαστήματος για μερικά φορές πριν αυτός ή αυτή παίρνει ένα χαρακτήρα, Πάω να αγνοήσει κάθε κενό χώρο. Έτσι ώστε, γνωρίζω από η τεκμηρίωση. Το γεγονός ότι υπάρχει ένα δεύτερο γ% ακολουθούμενη από λευκό διάστημα είναι στην πραγματικότητα σκόπιμη. Θέλω να είμαι σε θέση να ανιχνεύσει αν ο χρήστης μαντάρα ή δεν συνεργάστηκαν. Έτσι, ελπίζω ότι ο χρήστης πληκτρολογήσει μόνο σε ένα χαρακτήρα, ως εκ τούτου είμαι ελπίζοντας ότι sscanf είναι μόνο πρόκειται να επιστρέψει το τιμή 1, επειδή, και πάλι, αν διάβαζα την τεκμηρίωση, σκοπός sscanf σε ζωή είναι να επιστρέψει προς τον αριθμό των μεταβλητές που πληρώθηκαν με την είσοδο του χρήστη. Πέρασα σε δύο μεταβλητές διευθύνσεις, C1 και C2. Ελπίζω, όμως, ότι μόνο ένας από τους τους σκοτώνεται γιατί αν sscanf επιστρέφει 2, Τι είναι προφανώς η επίπτωση λογικά; Αυτός ο χρήστης δεν δώσε μου ένα χαρακτήρα, όπως είπα ή αυτήν. Πιθανώς πληκτρολογήσει σε τουλάχιστον δύο χαρακτήρες. Έτσι, αν, αντί δεν έχουν τη δεύτερη Γ%, είχα μόνο ένα, το οποίο ειλικρινά θα ήταν πιο έξυπνο προσέγγιση, πιστεύω ότι μια πρώτη ματιά, δεν πρόκειται να είναι σε θέση να ανιχνεύσει εάν ο χρήστης έχει δίνοντάς σας περισσότερο εισροών από ό, τι πραγματικά ήθελε. Έτσι, αυτό είναι μια έμμεση μορφή τον έλεγχο σφαλμάτων. Αλλά παρατηρήστε τι κάνω εδώ. Μόλις είμαι σίγουρος ότι ο χρήστης μου έδωσε ένα χαρακτήρα, θα ελευθερώσει τη γραμμή, να κάνει το αντίθετο της GetString, που με τη σειρά χρησιμοποιεί malloc, και στη συνέχεια θα επιστρέψει C1, ο χαρακτήρας που ήλπιζα η χρήστη που παρέχονται και παρέχεται μόνο. Έτσι, μια γρήγορη είδαμε μόνο, αλλά οποιεσδήποτε ερωτήσεις σχετικά με getchar; Θα επανέλθω σε ορισμένα από τα άλλα. Λοιπόν, επιτρέψτε μου να προχωρήσει και να το κάνουμε αυτό - ας υποθέσουμε τώρα, μόνο και μόνο για να παρακινήσει μας συζήτηση σε μια εβδομάδα συν το χρόνο, αυτό είναι ένα αρχείο που ονομάζεται structs.h. Και πάλι, αυτό είναι μόνο μια γεύση κάτι που βρίσκεται μπροστά μας. Αλλά προσέξτε ότι πολλά αυτού είναι σχόλια. Έτσι, επιτρέψτε μου να επισημάνω μόνο το ενδιαφέρον μέρος για τώρα. typedef - υπάρχει η ίδια λέξη-κλειδί ξανά. typedef που χρησιμοποιούμε για να δηλώσει εγχόρδων ως έναν ειδικό τύπο δεδομένων. Μπορείτε να χρησιμοποιήσετε το typedef για να δημιουργήσετε καινούργιο τύπους δεδομένων που δεν υπήρχε όταν C εφευρέθηκε. Για παράδειγμα, int έρχεται με C. char έρχεται με C. διπλό έρχεται με C. Αλλά δεν υπάρχει η έννοια του φοιτητή. Και όμως θα ήταν πολύ χρήσιμο να είναι σε θέση να γράψει ένα πρόγραμμα που αποθηκεύει σε μια μεταβλητή, τον αριθμό ταυτότητας του μαθητή, το όνομά τους, και το σπίτι τους. Με άλλα λόγια, τρία τεμάχια δεδομένων, όπως μια int και string και ένα άλλο string. Με typedef, τι είναι αρκετά ισχυρό γι 'αυτό και η λέξη-κλειδί για sturct δομή, εσείς, ο προγραμματιστής το 2013, μπορεί να καθορίσει πραγματικά το δικό σας τύπους δεδομένων που δεν υπήρχε χρόνος πριν, αλλά ότι ταιριάζουν στους σκοπούς σας. Και έτσι εδώ, στις γραμμές 13 έως 19, είμαστε δηλώνοντας ένα νέο τύπο δεδομένων, όπως ένα int, αλλά αποκαλώντας μαθητή. Και μέσα από αυτή τη μεταβλητή πρόκειται να είναι τρία πράγματα - ένα int, string, και ένα σκοινί. Έτσι, μπορείτε να σκεφτείτε τι πραγματικά συνέβη εδώ, έστω και αν αυτό είναι ένα bit της απλοποίησης για σήμερα, ένας μαθητής ουσιαστικά θα να μοιάζει με αυτό. Του πρόκειται να είναι ένα μεγάλο κομμάτι της μνήμης με μια ταυτότητα, ένα όνομα πεδίο, και ένα πεδίο σπίτι. Και θα είμαστε σε θέση να χρησιμοποιήσει τα κομμάτια της μνήμη και την πρόσβαση σε αυτές ως εξής. Αν πάω σε struct0.c, εδώ είναι μια σχετικά μεγάλη, αλλά μετά από μια μοτίβο, του κώδικα που χρησιμοποιεί αυτό το νέο κόλπο. Έτσι, η πρώτη, επιτρέψτε μου να επιστήσω την προσοχή σας με τα ενδιαφέροντα μέρη επάνω στην κορυφή. Sharp ορίζει φοιτητές 3, δηλώνει μια σταθερά που ονομάζεται φοιτητές και εκδοχείς αυθαίρετα τον αριθμό 3, ακριβώς έτσι έχω τρεις μαθητές που χρησιμοποιούν το πρόγραμμα αυτό για τώρα. Εδώ έρχεται Main. Και προειδοποίηση, πώς μπορώ να δηλώνουν μια σειρά από φοιτητές; Λοιπόν, μπορώ να χρησιμοποιήσω ακριβώς την ίδια σύνταξη. Ο μαθητής λέξη είναι προφανώς νέος. Αλλά μαθητή, τάξη, οι μαθητές βραχίονα. Έτσι, δυστυχώς, υπάρχει πολύ της επαναχρησιμοποίησης των όρων εδώ. Αυτό είναι απλά ένας αριθμός. Έτσι, αυτό είναι σαν να λέμε τρεις. Class είναι ακριβώς αυτό που θέλω να καλέσει τη μεταβλητή. Θα μπορούσα να το ονομάσουμε φοιτητές. Αλλά τάξη, αυτό δεν είναι μια τάξη σε ένα αντικειμενοστραφή είδος Java από το δρόμο. Είναι απλά μια τάξη μαθητών. Και ο τύπος δεδομένων του κάθε στοιχείου στην εν λόγω σειρά είναι φοιτητής. Έτσι, αυτό είναι λίγο διαφορετικό και από το να πει κάτι όπως αυτό, είναι απλά - Λέω να μου δώσει τρεις μαθητές και να καλέσει αυτή την κλάση array. Εντάξει. Τώρα εδώ είναι τέσσερις βρόχο. Εξοικειωμένοι Αυτός ο τύπος - επαναλάβει από το μηδέν σε μέχρι τρεις. Και εδώ είναι το νέο κομμάτι της σύνταξης. Το πρόγραμμα πρόκειται να μου ζητήσει, ο άνθρωπος, για να του δώσει ένα μαθητή ID, το οποίο είναι ένα int. Και εδώ είναι η σύνταξη με το οποίο μπορείτε να αποθηκεύουν κάτι το ID πεδίου σε θέση κατηγορίας βραχίονα Ι. Έτσι Η σύνταξη αυτή δεν είναι νέα. Αυτό σημαίνει απλά να μου δώσει την όγδοη μαθητής στην τάξη. Αλλά αυτό το σύμβολο είναι νέα. Μέχρι τώρα, έχουμε δεν μπορεί να χρησιμοποιηθεί τελεία, τουλάχιστον στον κώδικα όπως αυτό. Αυτό σημαίνει πηγαίνετε στο struct είναι γνωστή ως ένας φοιτητής και να βάλει κάτι εκεί. Ομοίως, σε αυτό το επόμενο γραμμή, 31, πηγαίνουν μπροστά και να βάλετε ό, τι πληκτρολογεί ο χρήστης για ένα όνομα εδώ και τι κάνουν για μια σπίτι, το ίδιο πράγμα, να προχωρήσει και να το βάζουμε σε. σπίτι. Έτσι, αυτό που κάνει αυτό το πρόγραμμα τελικά να κάνουμε; Μπορείτε να δείτε ένα μικρό teaser εκεί. Επιτρέψτε μου να πάω μπροστά και να κάνουν structs 0 dot κάθετος struct 0, φοιτητική ταυτότητα του 1, λένε David Mather, φοιτητής ID 2. Rob Kirkland, φοιτητής ID 3. Lauren Leverit - και το μόνο πράγμα που αυτό το πρόγραμμα το έκανε, το οποίο είναι ακριβώς εντελώς αυθαίρετη, είναι Ήθελα να κάνω κάτι με αυτά τα δεδομένα, τώρα που έχω μας δίδαξε πώς να χρησιμοποιήσετε structs, είναι απλά έπρεπε Αυτό το επιπλέον βρόχο εδώ. Έχω επαναλάβει πάνω από τη συστοιχία των μαθητών. Θα χρησιμοποιηθεί, μας ίσως τώρα γνώριμη φίλος, σύγκρισης συμβολοσειράς, stircomp να Έλεγχος είναι το σπίτι 8ο μαθητή ίση με Mather; Και αν ναι, μπορείτε να τυπώσετε κάτι αυθαίρετα ήθελα, ναι, είναι. Αλλά και πάλι, απλά μου δίνει ευκαιρίες στη χρήση και επαναχρησιμοποίηση και επαναχρησιμοποίηση αυτό το νέο συμβολισμό dot. Έτσι, ποιος νοιάζεται, έτσι δεν είναι; Έρχεται με ένα πρόγραμμα σπουδαστών είναι κάπως αυθαίρετη, αλλά αποδεικνύεται που μπορούμε να κάνουμε χρήσιμα πράγματα με Αυτό, για παράδειγμα, ως ακολούθως. Αυτό είναι ένα πολύ πιο πολύπλοκο struct στο C. Είναι πήρε μια δωδεκάδα ή περισσότερα πεδία, κάπως μυστική ονομασία. Αλλά αν έχετε ποτέ ακούσει για ένα γραφικών μορφή αρχείου που ονομάζεται bitmap, BMP, το Αποδεικνύεται ότι η μορφή αρχείου bitmap λίγο πολύ μοιάζει με αυτό. Είναι μια ηλίθια λίγο πρόσωπο Smiley. Είναι μια μικρή εικόνα που έχω μεγεθύνεται για αρκετά μεγάλο έτσι ώστε θα μπορούσα να δω το καθένα των μεμονωμένων κουκκίδων ή εικονοστοιχεία. Τώρα, αποδεικνύεται ότι μπορούμε να αναπαραστήσουμε μια μαύρη κουκκίδα με, ας πούμε, τον αριθμό 0. Και ένα λευκό τελεία με τον αριθμό 1. Έτσι, με άλλα λόγια, εάν θέλετε να σχεδιάσετε ένα Χαμογελαστό πρόσωπο και να αποθηκεύσετε την εικόνα σε ένα υπολογιστή, αρκεί να αποθηκεύουν και μηδενικά αυτοί που μοιάζει με αυτό, όπου, και πάλι, αυτά είναι λευκά και μηδενικά είναι μαύρα. Και μαζί, αν έχουν πράγματι ζώνομαι από μονάδες και μηδενικά, έχετε ένα πλέγμα των pixels, και αν θέλετε να παίξετε τους έξω, έχετε ένα χαριτωμένο λίγο πρόσωπο Smiley. Τώρα, bitmap μορφή αρχείου, BMP, είναι ουσιαστικά ότι κάτω από το καπό, αλλά με περισσότερα pixel sot που μπορεί να αντιπροσωπεύει πραγματικά χρώματα. Αλλά όταν έχεις πιο εξελιγμένα μορφές αρχείων όπως BMP, JPEG και GIF με τα οποία ίσως να είναι εξοικειωμένοι, εκείνοι αρχείων στο δίσκο συνήθως όχι μόνο έχουν μηδενικά και αυτά γιά τα εικονοστοιχεία, αλλά έχουν κάποια μεταδεδομένα, καθώς και - meta με την έννοια ότι δεν είναι πραγματικά δεδομένα, αλλά είναι χρήσιμο να έχουν. Έτσι, αυτά τα πεδία εδώ υπονοείς, και θα δούμε αυτό με περισσότερες λεπτομέρειες στο P-set 5, ότι πριν από τα μηδενικά και αυτά που αντιπροσωπεύουν τα pixels σε μια εικόνα, υπάρχει μια δέσμη των μεταδεδομένων, όπως το μέγεθος της εικόνας και η πλάτος της εικόνας. Και παρατηρήσετε είμαι μάδημα μακριά μερικά αυθαίρετες πράγματα εδώ - πλάτος και ύψος. Μετράνε bit και κάποια άλλα πράγματα. Έτσι, υπάρχει κάποια μεταδεδομένα σε ένα αρχείο. Αλλά με την κατανόηση πώς τα αρχεία που με αυτόν τον τρόπο, μπορείτε πραγματικά στη συνέχεια να χειριστούν τις εικόνες, την ανάκτηση εικόνων από το δίσκο, το μέγεθος των εικόνων. Αλλά δεν μπορείς απαραίτητα ενισχύσουν τους. Χρειαζόμουν μια φωτογραφία. Έτσι, πήγα πίσω στο RJ εδώ, που είδατε στην οθόνη πριν από αρκετό καιρό. Κι αν ανοίξει Keynote εδώ, αυτό είναι Τι θα συμβεί αν προσπαθήσετε να κάνετε ζουμ μέσα και ενίσχυση της RJ. Δεν παίρνει καθόλου καλύτερα πραγματικά. Τώρα Keynote είναι το είδος του θολώματος ένα λίγο, μόνο για να αποσιωπήσει το γεγονός ότι RJ δεν παίρνει ιδιαίτερα ενισχυμένη όταν μεγεθύνετε Και αν το κάνετε με αυτό τον τρόπο, δείτε τα τετράγωνα; Ναι, μπορείτε σίγουρα να δείτε οι πλατείες σε ένα προβολέα. Αυτό είναι αυτό που παίρνετε, όταν θα ενισχυθεί. Αλλά στην κατανόηση του τρόπου RJ μας ή το Χαμογελαστό πρόσωπο υλοποιείται θα μας επιτρέψει να στην πραγματικότητα γράφουν κώδικα που χειρίζεται αυτά τα πράγματα. Και σκέφτηκα να τελειώσω με αυτό, με 55 δευτερόλεπτα από μια ενίσχυση που είναι, Τολμώ, ας πούμε μάλλον παραπλανητικό. [PLAYBACK VIDEO] -Λέει ψέματα. Σχετικά με αυτό, δεν ξέρω. -Λοιπόν, τι ξέρουμε; -Ότι στις 9:15 Ray Santoya ήταν στο ΑΤΜ. -Έτσι, το ερώτημα είναι τι κάνει αυτός στις 9:16; -Σκοποβολή η εννέα χιλιοστών σε κάτι. Ίσως είδε τον ελεύθερο σκοπευτή. -Ή δούλευε μαζί του. -Περίμενε. Πήγαινε πίσω ένα. -Τι βλέπεις; -Φέρτε το πρόσωπό του, την πλήρη οθόνη. -Του γυαλιά. -Υπάρχει μια αντανάκλαση. -Αυτή είναι η ομάδα μπέιζμπολ Neuvitas. Αυτό είναι το λογότυπο τους. -Και μιλάει σε όποιον είναι ότι φοράει σακάκι. [PLAYBACK VIDEO END] David J. MALAN: Αυτό θα να οριστεί Πρόβλημα 5. Θα σας δούμε την επόμενη εβδομάδα. MALE ΟΜΙΛΗΤΗΣ: Στην επόμενη CS50. [Τριζόνια κελαηδούν] [Παίζει μουσική]