[Powered by Google Translate] [Εβδομάδα 5] [David J. Malan - Πανεπιστήμιο του Χάρβαρντ] [Αυτό είναι CS50. - CS50.TV] Αυτό είναι CS50, Εβδομάδα 5. Σήμερα και αυτή την εβδομάδα, έχουμε εισαγάγει ένα μικρό κομμάτι του κόσμου της εγκληματολογίας στο πλαίσιο του προβλήματος Σετ 4. Σήμερα θα είναι μια συνοπτική διάλεξη, επειδή υπάρχει μια ειδική εκδήλωση εδώ στη συνέχεια. Έτσι, θα ρίξουμε μια ματιά και να δώσουμε έμφαση τόσο οι μαθητές όσο και οι γονείς σήμερα με μερικά από τα πράγματα που είναι στον ορίζοντα. Ανάμεσά τους, από τη Δευτέρα, θα έχετε μερικές ακόμα συμμαθητές. EDX, του Χάρβαρντ και των νέων επιγραμμικών πρωτοβουλία του MIT για OpenCourseWare και περισσότερο, ξεκινά στην πανεπιστημιούπολη του Χάρβαρντ, τη Δευτέρα, γεγονός που σημαίνει ότι έρχονται Δευτέρα θα έχετε, ήδη από την προηγούμενη μέτρηση, 86.000 επιπλέον συμμαθητές ο οποίος θα παρακολουθεί μαζί με διαλέξεις και τμήματα του CS50 και walkthroughs και σύνολα πρόβλημα. Και στο πλαίσιο αυτό, θα γίνουν μέλη της εναρκτήριας κατηγορίας του CS50 και τώρα CS50x. Στο πλαίσιο αυτό τώρα, να συνειδητοποιήσουν ότι θα υπάρξουν κάποιες upsides, καθώς και. Για να ετοιμαστείτε για αυτό, για τον τεράστιο αριθμό των φοιτητών, αρκεί να πούμε ότι ακόμα κι αν έχουμε 108 TFs και ΑΠ, δεν είναι αρκετά η καλύτερη αναλογία μαθητή-δασκάλου τη στιγμή που θα χτυπήσει 80.000 από τους μαθητές. Εμείς δεν πρόκειται να ταξινόμησης τόσα πολλά θέτει πρόβλημα χειροκίνητα, έτσι εισήγαγε αυτή την εβδομάδα στο σύνολο πρόβλημα θα είναι CS50 Έλεγχος, η οποία πρόκειται να είναι ένα βοηθητικό πρόγραμμα γραμμής εντολών εντός της συσκευής ότι θα πάρετε τη στιγμή που θα ενημερώσετε αργότερα αυτό το Σαββατοκύριακο. Θα είστε σε θέση να εκτελέσετε μια εντολή, check50, με δική σας PSET, και θα έχετε άμεση ανατροφοδότηση ως προς το αν το πρόγραμμά σας είναι σωστή ή λανθασμένη σύμφωνα με διάφορες προδιαγραφές σχεδιασμού που έχουμε παράσχει. Περισσότερα επ 'αυτού στο σύνολο προδιαγραφών πρόβλημα. Οι συμμαθητές CS50x θα πρέπει να χρησιμοποιούν αυτό ως καλά. Σετ Πρόβλημα 4 είναι όλα σχετικά με εγκληματολογίας, και αυτό PSET ήταν πραγματικά εμπνευσμένη από κάποια πραγματική ζωή τα πράγματα σύμφωνα με την οποία όταν ήμουν μεταπτυχιακή φοιτήτρια I εγκλεισθούν για λίγο με το γραφείο του εισαγγελέα του Middlesex County της εγκληματολογικής κάνει την εργασία με επικεφαλής ερευνητής ιατροδικαστική τους. Αυτό ανήλθαν σε, όπως ανέφερα νομίζω λίγες εβδομάδες το παρελθόν, είναι η κρατική αστυνομία ή άλλοι Μαζικής θα έρθει, θα πέσει από τα πράγματα όπως σκληρούς δίσκους και CD και δισκέτες και παρόμοια, και στη συνέχεια ο στόχος του γραφείου εγκληματολογίας ήταν να εξακριβωθεί αν υπήρχε ή δεν ήταν απόδειξη κάποιου είδους. Αυτή ήταν η Μονάδα Ειδικών Ερευνών, γι 'αυτό ήταν υπαλληλικό έγκλημα. Ήταν πιο ανησυχητικό είδος των εγκλημάτων, κάτι που περιλαμβάνει κάποιο είδος των ψηφιακών μέσων. Αποδεικνύεται ότι δεν είναι ότι πολλοί άνθρωποι γράφουν ένα e-mail λέγοντας, "το έκανα." Έτσι, πολύ συχνά, αυτές οι ιατροδικαστικές έρευνες δεν εμφανίζονται και τόσο πολύ τα φρούτα, αλλά μερικές φορές οι άνθρωποι θα έγραφε τέτοια emails. Έτσι, μερικές φορές, οι προσπάθειες ανταμείβονται. Αλλά για να οδηγήσει μέχρι αυτό το ιατροδικαστική PSET, εμείς θα πρέπει να εισάγει στην pset4 ένα κομμάτι των γραφικών. Μπορείτε να πάρετε αυτά τα πράγματα μάλλον δεδομένο - JPEG, GIF, και τα παρόμοια - αυτές τις μέρες. Αλλά αν πραγματικά το σκέφτομαι, μια εικόνα, μοιάζει πολύ με το πρόσωπο του Rob, θα μπορούσε να απεικονιστεί ως μια ακολουθία των κουκκίδων ή των εικονοστοιχείων. Στην περίπτωση του προσώπου του Rob, υπάρχει κάθε λογής χρώματα, και αρχίσαμε να βλέπουμε τις μεμονωμένες κουκίδες, αλλιώς γνωστή ως pixel, τη στιγμή που θα αρχίσει να μεγεθύνετε Αλλά αν έχουμε απλοποιήσει τον κόσμο λίγο και να πω ότι αυτό είναι εδώ Rob σε μαύρο και άσπρο, να εκπροσωπεί μαύρο και άσπρο, μπορούμε να χρησιμοποιήσουμε μόνο δυαδικό. Και αν θα πάμε να χρησιμοποιούν δυαδικό, 1 ή 0, μπορούμε να εκφράσουμε την ίδια εικόνα χαμογελαστό πρόσωπο του Rob με αυτό το μοτίβο των bits. 11000011 αντιπροσωπεύει το λευκό, λευκό, μαύρο, μαύρο, μαύρο, μαύρο, λευκό, λευκό. Και γι 'αυτό δεν είναι ένα τεράστιο άλμα στη συνέχεια να αρχίσουμε να μιλάμε για έγχρωμες φωτογραφίες, πράγματα που θα βλέπατε στο Facebook ή να με μια ψηφιακή φωτογραφική μηχανή. Αλλά βεβαίως, όταν πρόκειται για τα χρώματα, θα πρέπει να έχετε περισσότερα bits. Και αρκετά κοινό στον κόσμο των φωτογραφιών είναι να χρησιμοποιήσετε δεν 1-bit χρώματος, όπως αυτό προτείνει, αλλά 24-bit χρώμα, όπου μπορείτε να πάρετε πραγματικά εκατομμύρια χρώματα. Έτσι, όπως στην περίπτωση όταν μεγεθύνεται στο μάτι του Rob, που ήταν οποιοσδήποτε αριθμός εκατομμυρίων διαφορετικών δυνατοτήτων πολύχρωμα. Γι 'αυτό και θα εισαγάγει αυτό το πρόβλημα Σετ 4, καθώς και στην περιδιάβαση, η οποία θα είναι σήμερα στις 3:30 αντί της συνήθους 2:30 λόγω διάλεξη της Παρασκευής εδώ. Όμως, το βίντεο θα είναι σε απευθείας σύνδεση, ως συνήθως, αύριο. Θα σας παρουσιάσουμε επίσης σε άλλη μορφή αρχείου. Αυτό σήμαινε σκόπιμα να δούμε τον εκφοβισμό κατά την πρώτη, αλλά αυτό είναι μόνο μερικά έγγραφα για struct C. Αποδεικνύεται ότι η Microsoft χρόνια βοήθησε να διαδώσει αυτή τη μορφή ονομάζεται η μορφή αρχείου bitmap, bmp, και αυτό ήταν μια εξαιρετικά απλή, πολύχρωμα γραφικά μορφή αρχείου που χρησιμοποιήθηκε για αρκετό καιρό και μερικές φορές ακόμα για ταπετσαρίες για επιτραπέζιους υπολογιστές. Αν νομίζετε ότι πίσω στα Windows XP και τους λόφους και το γαλάζιο του ουρανού, που ήταν συνήθως μια εικόνα bitmap ή bmp. Bitmaps είναι διασκέδαση για μας, επειδή έχουν ένα λίγο πιο περίπλοκο. Δεν είναι αρκετά τόσο απλό όσο αυτό το πλέγμα των 0s και 1s. Αντ 'αυτού, έχετε τα πράγματα όπως μια κεφαλίδα στην αρχή ενός αρχείου. Έτσι με άλλα λόγια, μέσα από ένα αρχείο. Bmp είναι ένα σωρό 0s και 1s, αλλά υπάρχει κάποια επιπλέον 0s και 1s εκεί. Και αποδεικνύεται ότι αυτό που έχουμε κατά πάσα πιθανότητα θεωρείται δεδομένη για τα επόμενα χρόνια - μορφές αρχείων όπως. doc ή. xls ή. mp3,. mp4, όποια και αν είναι οι μορφές αρχείων ότι είστε εξοικειωμένοι με - τι σημαίνει αυτό ακόμα να είναι μια μορφή αρχείου, διότι στο τέλος της ημέρας, όλα αυτά τα αρχεία που χρησιμοποιούμε έχουν μόνο 0s και 1s. Και ίσως αυτά 0s και 1s αντιπροσωπεύουν ABC μέσω ASCII ή τα παρόμοια, αλλά στο τέλος της ημέρας, είναι ακόμα μόνο 0s και 1s. Έτσι, οι άνθρωποι απλώς περιστασιακά αποφασίσει να εφεύρει μια νέα μορφή αρχείου όπου τυποποίηση τι σχέδια των bits θα σημαίνει πραγματικά. Και σε αυτή την περίπτωση εδώ, οι λαοί που σχεδίασε το bitmap μορφή αρχείου είπε ότι στο πρώτο byte σε ένα αρχείο bitmap, όπως υποδηλώνεται από αντιστάθμιση 0 εκεί, υπάρχει μετάβαση να είναι κάποια μυστική ονομασία μεταβλητή που ονομάζεται bfType, το οποίο σημαίνει απλά bitmap τύπο αρχείου, τον τύπο του αρχείου bitmap είναι αυτό. Μπορείτε να συμπεράνουμε ίσως από τη δεύτερη γραμμή που αντισταθμίζεται 2, αριθμός byte 2, έχει ένα σχέδιο 0s και 1s που αντιπροσωπεύει ό, τι; Το μέγεθος του κάτι. Και συνεχίζει από εκεί. Έτσι, στο σύνολο Πρόβλημα 4, θα πρέπει να περάσει μέσα από κάποια από αυτά τα πράγματα. Εμείς δεν θα καταλήξουν να νοιάζονται για όλα αυτά. Αλλά παρατηρήσετε ότι αρχίζει να παίρνει ενδιαφέρον γύρω από byte 54: rgbtBlue, πράσινο και κόκκινο. Αν έχετε ποτέ ακούσει το ακρωνύμιο RGB - κόκκινο, πράσινο, μπλε - αυτή είναι μια αναφορά στο ότι γιατί βγάζει μπορείτε να ζωγραφίσει όλα τα χρώματα του ουράνιου τόξου με κάποιο συνδυασμό του κόκκινου και του μπλε και του πράσινου. Και στην πραγματικότητα, οι γονείς στο δωμάτιο θα μπορούσε να υπενθυμίσουμε μερικά από τα πρώτα προβολείς. Αυτές τις μέρες, μπορείτε απλά να δείτε ένα λαμπρό φως που βγαίνει από ένα φακό, αλλά πίσω στην ημέρα που είχε το κόκκινο φακό, το μπλε φακό, και το πράσινο φακό, και μαζί με στόχο την οθόνη και σχηματίζεται μια πολύχρωμη εικόνα. Και αρκετά συχνά, γυμνάσια και λύκεια θα έχουν αυτές οι φακοί πάντα τόσο ελαφρώς στραβό, έτσι ώστε να ήταν το είδος του βλέποντας δίκλινα ή τρίκλινα εικόνες. Αλλά αυτό ήταν η ιδέα. Είχες κόκκινο και πράσινο και μπλε φως ζωγραφική μια εικόνα. Και ότι η ίδια αρχή χρησιμοποιείται σε υπολογιστές. Έτσι, μεταξύ των προκλήσεων τότε για εσάς σε πρόβλημα Σύνολο 4 πρόκειται να είναι μερικά πράγματα. Η μία είναι να αλλάξετε το μέγεθος μιας εικόνας στην πραγματικότητα, να λάβει σε ένα μοτίβο των 0 και 1, καταλάβω ποια κομμάτια του 0s και 1s αντιπροσωπεύουν ό, τι σε μια δομή όπως αυτή, και στη συνέχεια να καταλάβω πώς να αναπαράγουν τα pixels - τα κόκκινα, τα μπλε, τα πράσινα - εσωτερικό έτσι ώστε όταν μια εικόνα μοιάζει με αυτό αρχικά, θα μπορούσε να μοιάζει με αυτό αντί μετά από αυτό. Μεταξύ των άλλων προκλήσεων που πολύ θα είναι ότι θα πρέπει να δοθεί μια εικόνα ιατροδικαστική από ένα πραγματικό αρχείο από μια ψηφιακή φωτογραφική μηχανή. Και σε αυτή φωτογραφική μηχανή, μια φορά κι έναν καιρό, ήταν ένα σωρό φωτογραφίες. Το πρόβλημα είναι ότι διαγραφούν κατά λάθος ή η εικόνα είχε καταστραφεί κατά κάποιο τρόπο. Κακά πράγματα συμβαίνουν με τις ψηφιακές φωτογραφικές μηχανές. Και γι 'αυτό αντιγράφονται γρήγορα όλα τα 0s και 1s μακριά από αυτή την κάρτα για σας, αποθηκεύσει όλα αυτά σε ένα μεγάλο αρχείο, και στη συνέχεια θα τα παραδώσουμε σε σας πρόβλημα Σετ 4 έτσι ώστε να μπορείτε να γράψετε ένα πρόγραμμα σε C με την οποία να ανακτήσει όλα αυτά τα αρχεία JPEG, ιδανικά. Και αποδεικνύεται ότι τα αρχεία JPEG, ακόμα κι αν είστε κάπως μιας σύνθετης μορφής αρχείου - ότι είναι πολύ πιο περίπλοκη από ό, τι αυτό το χαμογελαστό πρόσωπο εδώ - αποδεικνύεται ότι κάθε JPEG ξεκινά με τα ίδια πρότυπα της 0s και 1s. Έτσι, χρησιμοποιώντας, εν τέλει, ένα βρόχο while ή ένα βρόχο for ή παρόμοια, μπορείτε να επαναλάβει πάνω από όλα την 0s και 1s σε αυτή την ιατροδικαστική εικόνα, και κάθε φορά που θα δείτε το ειδικό σχέδιο που έχει προσδιοριστεί στο σύνολο προδιαγραφές πρόβλημα, μπορείτε να υποθέσετε είναι εδώ, με πολύ μεγάλη πιθανότητα, η έναρξη μιας JPEG. Και το συντομότερο μπορείτε να βρείτε το ίδιο μοτίβο κάποια αριθμός των bytes ή kilobytes ή megabytes αργότερα, μπορείτε να υποθέσετε εδώ είναι ένα δεύτερο JPEG, η φωτογραφία πήρα μετά την πρώτη. Επιτρέψτε μου να σταματήσετε να διαβάζετε αυτό το πρώτο αρχείο, αρχίσει να γράψω αυτό το νέο, και η έξοδος του προγράμματος σας για pset4 πρόκειται να είναι όσο το 50 αρχεία JPEG. Και αν δεν είναι 50 αρχεία JPEG, έχετε ένα κομμάτι ενός βρόχου. Εάν έχετε έναν άπειρο αριθμό των αρχεία JPEG, έχετε ένα άπειρο βρόχο. Έτσι, ότι πολύ θα είναι αρκετά μια κοινή υπόθεση. Έτσι, αυτό είναι αυτό που είναι στον ορίζοντα. Quiz 0 πίσω μας, συνειδητοποιούν ανά e-mail μου ότι πάντα υπάρχουν λαοί που είναι τόσο χαρούμενος, είδος του ουδέτερου, και λυπημένος γύρω κουίζ χρόνο 0. Και παρακαλώ να φτάσει σε μένα, το κεφάλι TF Zamyla, τη δική σας TF, ή μία από τις αρμόδιες αρχές ότι γνωρίζετε αν θέλετε να συζητήσουμε για το πώς πήγαν τα πράγματα. Έτσι για να εντυπωσιάσουν τους γονείς εδώ στην αίθουσα, ποια είναι η CS50 βιβλιοθήκη; [Γέλια] Καλή δουλειά. Ποια είναι η CS50 βιβλιοθήκη; Ναι. >> [Φοιτητής] Είναι ένα προ-γραπτό σύνολο του κώδικα [δεν ακούγεται] Εντάξει, καλά. Είναι ένα προ-γραπτό σύνολο του κώδικα που έγραψε το προσωπικό, σας παρέχουμε, που παρέχει κάποια κοινή λειτουργικότητα, πράγματα όπως η πάρτε μια σειρά, φέρε μου ένα int - όλες τις λειτουργίες που αναφέρονται εδώ. Ξεκινώντας τώρα, αρχίζουμε να πάρει πραγματικά αυτές τις ρόδες μακριά. Εμείς πάμε για να ξεκινήσει να πάρει μια σειρά από εσάς, που ανάκληση ήταν απλά ένα συνώνυμο για το τι πραγματικά τύπο δεδομένων; >> [Πολλαπλές φοιτητές] * Χαρ. * Χαρ. Για τους γονείς, η οποία ήταν κατά πάσα πιθανότητα [κάνει whooshing ήχου]. Αυτό είναι καλό. Char * θα αρχίσουμε να βλέπουμε στην οθόνη όλα τα πιο όπως έχουμε αφαιρέσει από το λεξιλόγιό σειρά μας, τουλάχιστον όταν πρόκειται για την πραγματικότητα γράφοντας κώδικα. Ομοίως, θα σταματήσει να χρησιμοποιεί κάποια από αυτές τις λειτουργίες, όπως πολύ επειδή τα προγράμματά μας πρόκειται να πάρει πιο εξελιγμένα. Αντί να γράφουν απλά προγράμματα που κάθονται εκεί με μια προτροπή να αναβοσβήνει, περιμένει το χρήστη να τυπώσει κάτι, θα πάρετε τις εισροές σας από κάπου αλλού. Για παράδειγμα, θα τα πάρετε από μια σειρά από bits στον τοπικό σκληρό δίσκο. Θα τους πάρει αντ 'αυτού στο μέλλον από μια σύνδεση δικτύου, κάποια ιστοσελίδα κάπου. Ας φλούδα πίσω αυτό το στρώμα για πρώτη φορά και τραβήξτε το CS50 Appliance και αυτό το αρχείο ονομάζεται cs50.h, που έχετε # συμπεριλαμβανομένου για εβδομάδες, αλλά ας δούμε τι πραγματικά είναι μέσα από αυτό. Η κορυφή του αρχείου στο μπλε είναι απλώς ένα σωρό σχόλια: πληροφορίες εγγύησης και τη χορήγηση αδειών. Αυτό είναι ένα είδος κοινό παράδειγμα στον τομέα του λογισμικού επειδή πολλά από λογισμικό αυτές τις μέρες είναι ό, τι λέγεται open source, πράγμα που σημαίνει ότι κάποιος έχει γράψει τον κώδικα και το έκανε ελεύθερα διαθέσιμο όχι μόνο για να τρέξει και να χρησιμοποιήσει, αλλά στην πραγματικότητα για να διαβάσετε και να αλλάξει και να ενσωματώσει στο δικό σας έργο. Έτσι, αυτό είναι ό, τι έχετε χρησιμοποιήσει, το λογισμικό ανοιχτού κώδικα, αν και σε πολύ μικρή μορφή. Αν μετακινηθείτε προς τα κάτω μετά από τα σχόλια, όμως, θα αρχίσουμε να βλέπουμε κάποια πράγματα πιο οικεία. Ανακοίνωση στην κορυφή εδώ ότι το αρχείο cs50.h περιλαμβάνει ένα σωρό αρχεία κεφαλίδας. Οι περισσότερες από αυτές, δεν έχουμε δει πριν, αλλά ένα είναι εξοικειωμένοι. Ποια από αυτά έχουμε δει, έστω και για λίγο, μέχρι στιγμής; >> [Φοιτητής] Βασική βιβλιοθήκη. Ναι, πρότυπη βιβλιοθήκη. stdlib.h έχει malloc. Μόλις αρχίσαμε να μιλάμε για δυναμική κατανομή μνήμης, το οποίο θα επανέλθουμε την επόμενη εβδομάδα, καθώς, όπως αρχίσαμε αυτό το αρχείο. Αποδεικνύεται ότι bool και αληθινό και το ψεύτικο, δεν υπάρχει στην πραγματικότητα σε C per se εκτός και αν έχετε συμπεριλάβει αυτό το αρχείο εδώ. Έχουμε εδώ και εβδομάδες έχουν συμπεριλαμβανομένης stdbool.h έτσι ώστε να μπορείτε να χρησιμοποιήσετε την έννοια του ένα bool, αληθής ή ψευδής. Χωρίς αυτό, θα πρέπει να ταξινομήσετε από το ψεύτικο και να χρησιμοποιήσετε ένα int και μόλις αυθαίρετα υποθέσουμε ότι 0 είναι ψευδής και 1 είναι αλήθεια. Αν μετακινηθείτε προς τα κάτω, εδώ είναι ο ορισμός μας από μια σειρά. Αποδεικνύεται, όπως έχουμε ξαναπεί, ότι όταν αυτό το αστέρι είναι δεν πειράζει πραγματικά. Μπορείτε να έχετε ακόμη χώρο γύρω. Έχουμε αυτό το εξάμηνο έχουν την προώθηση και αυτό να καταστεί σαφές ότι το αστέρι έχει να κάνει με το είδος, αλλά αντιλαμβάνονται κάτι πολύ κοινό, αν όχι λίγο πιο κοινή, είναι να το βάλετε εκεί, αλλά λειτουργικά είναι το ίδιο πράγμα. Τώρα, όμως, αν διαβάσουμε μειωθεί περαιτέρω, ας ρίξουμε μια ματιά στο GetInt επειδή χρησιμοποιήσαμε ότι ίσως η πρώτη πριν από οτιδήποτε άλλο αυτό το εξάμηνο. Εδώ είναι GetInt. Αυτό είναι ό, τι; >> [Φοιτητής] Ένα πρωτότυπο. >> Αυτό είναι μόνο ένα πρωτότυπο. Συχνά, έχουμε θέσει πρωτότυπα στις κορυφές των μας. Γ αρχεία, αλλά μπορείτε να βάλετε επίσης σε πρωτότυπα αρχεία κεφαλίδας, αρχεία. h, όπως αυτό εδώ έτσι ώστε όταν γράφετε σε ορισμένες λειτουργίες που θέλετε άλλους ανθρώπους για να είναι σε θέση να χρησιμοποιήσει, η οποία είναι ακριβώς η περίπτωση με τη βιβλιοθήκη CS50, μπορείτε όχι μόνο να εφαρμόσουν τις λειτουργίες σας σε κάτι σαν cs50.c, βάζετε επίσης τα πρωτότυπα όχι στην κορυφή του εν λόγω φακέλου, αλλά στην κορυφή ενός αρχείου κεφαλίδας. Στη συνέχεια, το αρχείο κεφαλίδας είναι αυτό που περιλαμβάνει τους φίλους και τους συναδέλφους # include με το δικό τους κώδικα. Έτσι, όλο αυτό το διάστημα, έχετε συμπεριλαμβανομένων όλων αυτών των πρωτοτύπων, αποτελεσματικά στην κορυφή του αρχείου σας, αλλά με τον τρόπο του αυτό περιλαμβάνει # μηχανισμό, η οποία ουσιαστικά αντίγραφα και πάστες αυτό το αρχείο στο δικό σας. Εδώ είναι μερικές αρκετά λεπτομερή τεκμηρίωση. Έχουμε λίγο πολύ δεδομένο ότι GetInt παίρνει μια int, αλλά αποδεικνύεται ότι υπάρχουν ορισμένες περιπτώσεις γωνία. Τι θα συμβεί αν ο χρήστης πληκτρολογεί σε έναν αριθμό που είναι πάρα πολύ μεγάλο, ένα τετράκις εκατομμύρια, που απλά δεν μπορεί να χωρέσει μέσα του έναν int; Ποια είναι η αναμενόμενη συμπεριφορά; Ιδανικά, αυτό είναι προβλέψιμη. Έτσι, σε αυτή την περίπτωση, αν διαβάσει πραγματικά τα ψιλά γράμματα, θα δείτε πραγματικά ότι, αν η γραμμή δεν μπορεί να διαβάσει, αυτό το INT_MAX επιστρέφει. Εμείς ποτέ δεν έχω μιλήσει για αυτό, αλλά με βάση την κεφαλαιοποίησή της, ποιο είναι κατά πάσα πιθανότητα; [Φοιτητής] Μια σταθερή. >> Είναι μια σταθερά. Είναι κάποια ειδική σταθερά που είναι πιθανόν να δηλώνονται σε μία από αυτά τα αρχεία κεφαλίδας αυτό είναι ψηλότερα στο αρχείο, και INT_MAX είναι πιθανώς κάτι σαν 2 δισεκατομμύρια περίπου, η ιδέα είναι ότι επειδή πρέπει να δηλώσουν κατά κάποιο τρόπο ότι κάτι πήγε στραβά, εμείς, ναι, έχουν 4 δισεκατομμύρια αριθμούς στη διάθεσή μας: -2 δισεκατομμύρια ευρώ έως 2 δισ. ευρώ, ή να δώσει. Λοιπόν, αυτό που είναι κοινό στον προγραμματισμό είναι να κλέψει ένα μόνο από αυτούς τους αριθμούς, ίσως 0, ίσως 2 δισ. ευρώ, ίσως -2 δισεκατομμύρια, έτσι ώστε να περάσετε μία από τις πιθανές τιμές σας, έτσι ώστε να μπορείτε να δεσμευτούν για τον κόσμο ότι αν κάτι πάει στραβά, θα επιστρέψει αυτή την εξαιρετικά μεγάλη αξία. Αλλά δεν θέλετε ο χρήστης πληκτρολογώντας κάτι αινιγματικά σαν 234 ..., ένα πολύ μεγάλο αριθμό. Μπορείτε να το γενικεύσουμε, αντί ως σταθερή. Έτσι, πραγματικά, αν ήταν να πρωκτικό τις τελευταίες εβδομάδες, κάθε φορά που καλείται GetInt, θα πρέπει να έχουν τον έλεγχο με μια κατάσταση, αν έκανε τον τύπο του χρήστη σε INT_MAX, ή, πιο συγκεκριμένα, έκανε GetInt INT_MAX επιστροφή, γιατί αν το έκανε, αυτό σημαίνει ότι στην πραγματικότητα δεν το πληκτρολογήσετε. Κάτι πήγε στραβά σε αυτήν την περίπτωση. Έτσι, αυτό είναι ό, τι είναι γενικά γνωστό ως αξία φρουρός, που σημαίνει ακριβώς το ιδιαίτερο. Ας στραφούμε τώρα στο αρχείο. C. Το αρχείο C υπήρχε στη συσκευή για κάποιο χρονικό διάστημα. Και στην πραγματικότητα, η συσκευή έχει το προ-συγκεντρώθηκε για εσάς σε αυτό το πράγμα που ονομάζεται αντικειμενικό κώδικα, αλλά αυτό ακριβώς δεν έχει σημασία για εσάς, όπου είναι γιατί το σύστημα ξέρει στην περίπτωση αυτή, όπου είναι: η συσκευή. Ας μετακινηθείτε προς τα κάτω για να GetInt τώρα και να δούμε πώς GetInt έχει εργαστεί όλο αυτό το διάστημα. Εδώ έχουμε παρόμοια σχόλια από πριν. Επιτρέψτε μου να μεγεθύνετε μόνο το τμήμα κώδικα. Και ό, τι έχουμε για GetInt είναι η ακόλουθη. Δεν λαμβάνει είσοδο. Δεν επιστρέφει int, ενώ η (πραγματική), έτσι έχουμε μια εσκεμμένη άπειρο βρόχο, αλλά κατά πάσα πιθανότητα θα σπάσει από αυτό με κάποιο τρόπο ή να επιστρέψουν μέσα από αυτό. Ας δούμε πώς αυτό λειτουργεί. Εμείς φαίνεται να χρησιμοποιούν GetString σε αυτή την πρώτη γραμμή στο εσωτερικό του βρόγχου, 166. Αυτό τώρα είναι καλή πρακτική, διότι κάτω από ποιες συνθήκες θα μπορούσε να επιστρέψει GetString το ειδικό κλειδί NULL; >> [Φοιτητής] Αν κάτι πάει στραβά. Αν κάτι πάει στραβά. Και τι θα μπορούσε να πάει στραβά, όταν σας καλούν κάτι σαν GetString; Ναι. >> [Φοιτητής] malloc αποτύχει να δώσει τα χαρακτηριστικά της. Ναι. Ίσως malloc αποτύχει. Κάπου κάτω από την κουκούλα, GetString καλεί malloc, η οποία διαθέτει μνήμη, η οποία επιτρέπει το κατάστημα ηλεκτρονικών υπολογιστών όλους τους χαρακτήρες ότι ο χρήστης πληκτρολογεί στο πληκτρολόγιο. Και ας υποθέσουμε ότι ο χρήστης είχε ένα πάρα πολύ ελεύθερο χρόνο και δακτυλογραφημένες περισσότερο, για παράδειγμα, από 2 δισεκατομμύρια χαρακτήρες, περισσότερους χαρακτήρες από τον υπολογιστή έχει ακόμη RAM. GetString πρέπει να είναι σε θέση να δηλώσουν ότι σε εσάς. Ακόμη και αν αυτό είναι μια σούπερ, σούπερ ασυνήθιστη περίπτωση γωνία, πρέπει με κάποιο τρόπο να είναι σε θέση να χειριστεί το θέμα, και έτσι GetString, αν πήγαμε πίσω και να διαβάσετε τα έγγραφα του, κάνει την επιστροφή στην NULL γεγονός. Έτσι τώρα, αν δεν GetString με την επιστροφή NULL, GetInt πρόκειται να αποτύχει με την επιστροφή INT_MAX μόνο ως φρουρός. Αυτά είναι μόνο τα ανθρώπινα. Ο μόνος τρόπος που θα το γνωρίζουν αυτό είναι η υπόθεση με την ανάγνωση των εγγράφων. Ας μετακινηθείτε προς τα κάτω στο σημείο όπου ο int είναι πραγματικά πάρει. Αν μετακινηθείτε προς τα κάτω λίγο περισσότερο, σε γραμμή 170, έχουμε ένα σχόλιο πάνω από αυτές τις γραμμές. Δηλώνουμε σε 172 ένα int, n, και ένα char, γ, και στη συνέχεια η νέα αυτή λειτουργία, μερικά από τα οποία έχετε σκοντάψει σε όλη πριν, sscanf. Αυτό σημαίνει scanf εγχόρδων. Με άλλα λόγια, να μου δώσει μια σειρά και θα το σαρώσει για κομμάτια των πληροφοριών που παρουσιάζουν ενδιαφέρον. Τι σημαίνει αυτό; Ας υποθέσουμε ότι εγώ πληκτρολογήσετε, κυριολεκτικά, 123 στο πληκτρολόγιο και στη συνέχεια πατήστε Enter. Ποιος είναι ο τύπος δεδομένων από 123, όταν επέστρεψε από GetString; >> [Φοιτητής] String. Είναι προφανώς μια σειρά, έτσι δεν είναι; Πήρα ένα string. Έτσι, 123 είναι πραγματικά, παραθέτω-unquote, 123 με το \ 0 στο τέλος της. Αυτό δεν είναι ένα int. Αυτό δεν είναι ένας αριθμός. Μοιάζει με έναν αριθμό αλλά δεν είναι πραγματικά. Έτσι, αυτό που κάνει GetInt πρέπει να κάνω; Πρέπει να σαρώσει ότι η σειρά αριστερά προς τα δεξιά - 123 \ 0 - και κατά κάποιο τρόπο μετατρέψει σε πραγματική ακέραιο. Θα μπορούσα να καταλάβω πώς να το κάνουμε αυτό. Αν νομίζετε ότι πίσω στο pset2, που κατά πάσα πιθανότητα πήρε λίγο άνετα με Καίσαρα ή Vigenere, ώστε να μπορείτε να επαναλάβει σε μια σειρά, μπορείτε να μετατρέψετε σε χαρακτήρες ints. Αλλά καλό, αυτό είναι ένα πάρα πολύ δουλειά. Γιατί να μην καλέσετε μια συνάρτηση όπως sscanf που το κάνει αυτό για σας; Έτσι sscanf αναμένει ένα επιχείρημα - σε αυτή την περίπτωση ονομάζεται γραμμή, η οποία είναι μια συμβολοσειρά. Μπορείτε στη συνέχεια, καθορίστε σε εισαγωγικά, πολύ παρόμοιες με τις printf, τι θα περιμένατε να δείτε σε αυτή την σειρά. Και αυτό που λέω εδώ είναι περιμένω να δω ένα δεκαδικό αριθμό και ίσως ένα χαρακτήρα. Και θα δούμε γιατί συμβαίνει αυτό σε μια στιγμή. Και αποδεικνύεται ότι αυτή η σημείωση είναι πλέον θυμίζει πράγματα αρχίσαμε να μιλάμε για μόλις πάνω από μία εβδομάδα πριν. Τι είναι & n & c και κάνει για μας εδώ; >> [Φοιτητής] Διεύθυνση του n και τη διεύθυνση του c. Ναι. Είναι που μου δίνετε τη διεύθυνση του n και τη διεύθυνση του c. Γιατί είναι αυτό σημαντικό; Γνωρίζετε ότι με τις λειτουργίες σε C, μπορείτε να επιστρέψετε πάντα μια τιμή ή καμία αξία σε όλα. Μπορείτε να επιστρέψετε ένα int, μια σειρά, μια float, ένα char, ο, τιδήποτε, ή μπορείτε να επιστρέψετε κενό, αλλά μπορείτε να επιστρέψετε μόνο ένα πράγμα μέγιστο βαθμό. Αλλά εδώ θέλουμε sscanf να μου επιστρέψει ίσως ένα int, ένας δεκαδικός αριθμός, και επίσης μια χαρα, και θα εξηγήσω γιατί το char σε μια στιγμή. Μπορείτε πραγματικά θέλουν να επιστρέψουν sscanf δύο πράγματα, αλλά αυτό δεν είναι μόνο δυνατή σε C. Μπορείτε να επιλύσετε ότι με το πέρασμα σε δύο διευθύνσεις επειδή μόλις ένα χέρι λειτουργία δύο διευθύνσεις, τι μπορεί να κάνει με τη λειτουργία τους; >> [Φοιτητής] Γράψτε σε αυτές τις διευθύνσεις. Δεν μπορεί να γράψει σε αυτές τις διευθύνσεις. Μπορείτε να χρησιμοποιήσετε τη λειτουργία αστέρι και να πάει εκεί, για κάθε μία από αυτές τις διευθύνσεις. Είναι αυτό το είδος του πίσω πόρτα μηχανισμός, αλλά πολύ κοινό για αλλαγή των τιμών των μεταβλητών κάτι περισσότερο από ένα μέρος - σε αυτή την περίπτωση, δύο. Τώρα παρατηρήσετε Φεύγω για == 1 και στη συνέχεια επιστρέφει n αν αυτό σημαίνει, στην πραγματικότητα, να αξιολογήσει αλήθεια. Λοιπόν, τι συμβαίνει; Τεχνικά, όλοι θέλουμε πραγματικά να συμβεί σε GetInt είναι αυτό. Θέλουμε να αναλύσει, να το πω έτσι, θέλουμε να διαβάσετε το string - απόσπασμα-unquote 123 - και αν φαίνεται σαν να υπάρχει ένας αριθμός εκεί, αυτό που λέμε να κάνουμε sscanf τίθεται ότι ο αριθμός - 123 - σε αυτή τη μεταβλητή n για μένα. Επομένως, γιατί τότε εγώ πραγματικά έχουν αυτό, καθώς; Ποιος είναι ο ρόλος του sscanf λέγοντας μπορείτε να πάρετε επίσης ένα χαρακτήρα εδώ; [Ακούγεται ανταπόκριση των φοιτητών] >> Μια υποδιαστολή στην πραγματικότητα θα μπορούσε να λειτουργήσει. Ας κρατήσει ότι σκέφτηκε για μια στιγμή. Τι άλλο; [Φοιτητής] Θα μπορούσε να είναι NULL. >> Καλή σκέψη. Θα μπορούσε να είναι η μηδενική χαρακτήρα. Είναι πραγματικά δεν είναι σε αυτήν την περίπτωση. Ναι. >> [Φοιτητής] ASCII. ASCII. Ή επιτρέψτε μου να γενικεύσουμε ακόμη περισσότερο. Το γ% δεν είναι μόνο για τον έλεγχο σφαλμάτων. Δεν θέλουμε να υπάρχει ένας χαρακτήρας μετά από τον αριθμό, αλλά αυτό που μου επιτρέπει να κάνω είναι το εξής. Αποδεικνύεται ότι sscanf, εκτός από την αποθήκευση των τιμών σε n και c στο παράδειγμα αυτό εδώ, ό, τι δεν είναι, επίσης, να επιστρέφει τον αριθμό των μεταβλητών έθεσε αξίες μέσα Έτσι, αν πληκτρολογήσετε μόνο σε 123, τότε το μόνο% d πρόκειται να ταιριάζει, και μόνο n παίρνει αποθηκεύονται με αξία, όπως 123, και τίποτα δεν παίρνει θέσει σε c. Γ παραμένει μια αξία σκουπίδια, να το πω έτσι - σκουπίδια, διότι ποτέ δεν έχει προετοιμαστεί για κάποια αξία. Έτσι, στην περίπτωση αυτή, sscanf επιστρέφει 1, γιατί κατοικείται 1 των εν λόγω δείκτες, περίπτωση κατά την οποία μεγάλος, έχω ένα int έτσι ελευθερώσει τη γραμμή για να ελευθερώσετε τη μνήμη GetString ότι πράγματι διατεθεί, και στη συνέχεια θα επιστρέψει n, αλλιώς αν ποτέ αναρωτηθεί όπου Επανάληψη δήλωση ότι προέρχεται από, έρχεται από τα δεξιά εδώ. Έτσι, αν, αντίθετα, θα πληκτρολογήσετε 123foo - μερικά μόνο τυχαία ακολουθία του κειμένου - sscanf πρόκειται να δείτε τον αριθμό, τον αριθμό, τον αριθμό, στ, και πρόκειται να θέσει το 123 σε n? πρόκειται να θέσει το f σε c και στη συνέχεια επιστρέφουν 2. Έτσι έχουμε, απλά χρησιμοποιώντας το βασικό ορισμό της συμπεριφοράς sscanf, ένα πολύ απλό τρόπο - καλά, σύμπλοκο με την πρώτη ματιά, αλλά στο τέλος της ημέρας αρκετά απλό μηχανισμό - του λέγοντας ότι είναι ένας int εκεί και αν ναι, είναι ότι το μόνο πράγμα που βρήκα; Και το κενό εδώ είναι σκόπιμη. Αν διαβάσετε την τεκμηρίωση για sscanf, σας λέει ότι αν έχετε συμπεριλάβει ένα κομμάτι του whitespace στην αρχή ή στο τέλος, sscanf επίσης θα επιτρέψει στο χρήστη, για οποιονδήποτε λόγο, χώρο για να χτυπήσει 123 bar και αυτό θα είναι νόμιμο. Δεν θα φωνάζω στο χρήστη μόνο και μόνο επειδή χτύπησε το πλήκτρο διαστήματος στην αρχή ή το τέλος, το οποίο είναι λίγο πιο φιλική προς το χρήστη. Οποιεσδήποτε ερωτήσεις σχετικά με GetInt τότε; Ναι. >> [Φοιτητής] Τι γίνεται αν έχετε μόλις τεθεί σε ένα char; Καλή ερώτηση. Τι γίνεται αν έχετε μόλις πληκτρολογήσατε σε ένα char όπως f και πατήστε Enter χωρίς ποτέ να πληκτρολογήσετε 123; Τι νομίζετε ότι η συμπεριφορά της αυτή τη γραμμή του κώδικα θα είναι τότε; [Ακούγεται ανταπόκριση των φοιτητών] Ναι, έτσι sscanf μπορεί να καλύψει ότι πάρα πολύ, διότι σε αυτή την περίπτωση, δεν πρόκειται να γεμίσει n ή γ. Είναι πρόκειται να επιστρέψει αντί 0, οπότε είμαι αλίευση επίσης ότι το σενάριο επειδή η αναμενόμενη αξία που θέλω είναι 1. Θέλω μόνο ένα και μόνο ένα πράγμα που πρέπει να πληρωθεί. Καλή ερώτηση. Άλλοι; Εντάξει. Ας μην πάμε μέσα από όλες τις λειτουργίες εδώ, αλλά αυτό που φαίνεται να είναι ίσως από τους υπόλοιπους ενδιαφέρον είναι GetString γιατί αποδεικνύεται ότι GetFloat, GetInt, GetDouble, GetLongLong όλα κλωτσιά πολλές λειτουργίες τους σε GetString. Έτσι, ας ρίξουμε μια ματιά στο πώς εφαρμόζεται εδώ. Αυτός φαίνεται λίγο πολύπλοκη, αλλά χρησιμοποιεί τα ίδια βασικά ότι αρχίσαμε να μιλάμε για την τελευταία εβδομάδα. Σε GetString, η οποία λαμβάνει κανένα επιχείρημα σύμφωνα με το κενό μέχρι εδώ και επιστρέφει μια συμβολοσειρά, προφανώς εγώ είμαι που κηρύσσει μια σειρά που ονομάζεται buffer. Πραγματικά, δεν ξέρω τι πρόκειται να χρησιμοποιηθεί για ακόμα, αλλά θα δούμε. Μοιάζει με ικανότητα είναι από προεπιλογή 0. Δεν είναι σίγουρος εάν αυτό δεν συμβαίνει, βέβαιοι για το τι πρόκειται ν να χρησιμοποιηθεί για ακόμα, αλλά τώρα είναι να πάρει λίγο πιο ενδιαφέρουσα. Στη γραμμή 243, δηλώνουμε έναν int, γ. Αυτό είναι το είδος της μια ηλίθια λεπτομέρεια. Μια χαρα είναι 8 bit, 8 bits και μπορεί να αποθηκεύσει πόσες διαφορετικές τιμές; >> [Φοιτητής] 256. >> 256. Το πρόβλημα είναι, αν θέλετε να έχετε 256 διαφορετικά χαρακτήρες ASCII, τα οποία υπάρχουν αν νομίζετε ότι πίσω - και αυτό δεν είναι κάτι για να απομνημονεύσουν. Αλλά αν νομίζετε ότι πίσω σε εκείνη την μεγάλη ASCII διάγραμμα είχαμε εβδομάδες πριν, υπήρχαν σε αυτή την περίπτωση 128 ή 256 χαρακτήρες ASCII. Χρησιμοποιήσαμε όλα τα μοντέλα της 0s και 1s επάνω. Αυτό είναι ένα πρόβλημα, αν θέλετε να είναι σε θέση να ανιχνεύσει ένα σφάλμα γιατί αν χρησιμοποιείτε ήδη 256 τιμές για τους χαρακτήρες σας, δεν έχετε πραγματικά προγραμματίσουν το μέλλον, διότι τώρα δεν έχετε κανέναν τρόπο να πούμε, αυτό δεν είναι μια legit χαρακτήρας, αυτό είναι κάποια εσφαλμένη μήνυμα. Έτσι, αυτό που κάνει ο κόσμος είναι να χρησιμοποιήσετε την επόμενη μεγαλύτερη αξία, κάτι σαν int, έτσι ώστε να έχετε ένα τρελό αριθμό των bits, 32, για 4 δισεκατομμύρια πιθανές τιμές έτσι ώστε να μπορείτε απλά να καταλήγουν να χρησιμοποιούν κατ 'ουσίαν, 257 από αυτούς, 1 εκ των οποίων έχει κάποια ιδιαίτερη σημασία ως σφάλμα. Ας δούμε λοιπόν πώς αυτό λειτουργεί. Στη γραμμή 246, έχω αυτό το μεγάλο βρόχο while που ζητά fgetc, στ αρχείο έννοια, έτσι getc, και στη συνέχεια stdin. Βγάζει αυτό είναι μόνο η πιο ακριβής τρόπος για να πούμε διαβάσουμε είσοδο από το πληκτρολόγιο. Πρότυπο πληκτρολόγιο μέσο εισόδου, εξόδου σημαίνει πρότυπο οθόνη, και τυπικό σφάλμα, το οποίο θα δούμε σε pset4, σημαίνει την οθόνη αλλά ένα ειδικό μέρος της οθόνης έτσι ώστε να είναι δεν συγχέεται με την πραγματική παραγωγή που προορίζεται για την εκτύπωση. Αλλά περισσότερα για αυτό στο μέλλον. Έτσι fgetc σημαίνει απλώς διαβάσει ένα χαρακτήρα από το πληκτρολόγιο και το κατάστημα όπου; Αποθηκεύστε το στο γ. Και στη συνέχεια, ελέγξτε - έτσι είμαι χρησιμοποιώντας μόνο κάποια Boolean συνδέσμων εδώ - βεβαιωθείτε ότι δεν ισούται - \ n, έτσι ώστε ο χρήστης έχει πατήστε Enter, θέλουμε να σταματήσει σε εκείνο το σημείο, τέλος του βρόχου - και θέλουμε επίσης να ελέγξετε για το ειδικό σταθερό ΕΟΦ, η οποία, αν γνωρίζετε ή να μαντέψει, τι ηρεμήσει; >> [Φοιτητής] Τέλος του αρχείου. Τέλος >> του αρχείου. Αυτό είναι το είδος της νόημα, γιατί αν είμαι πληκτρολογώντας στο πληκτρολόγιο, πραγματικά δεν υπάρχει αρχείο που συμμετέχουν σε αυτό, αλλά αυτό είναι ακριβώς το είδος της γενικός όρος που χρησιμοποιείται για να σημάνει ότι τίποτα άλλο δεν έρχεται από τα δάχτυλα του ανθρώπου. ΕΟΦ - τέλος του αρχείου. Παρεμπιπτόντως, αν έχετε χτυπήσει ποτέ Ελέγχου D στο πληκτρολόγιο σας, όχι ότι θα έχετε ακόμα - έχετε χτυπήσει Ελέγχου Γ - Δ ελέγχου στέλνει αυτή την ειδική σταθερά που ονομάζεται ΕΟΦ. Μέχρι τώρα έχουμε μόνο κάποια δυναμική κατανομή μνήμης. Έτσι, αν (n + 1> ικανότητα). Τώρα θα εξηγήσω n. Ν είναι ακριβώς πόσα bytes είναι επί του παρόντος στο ρυθμιστικό, η σειρά που είστε σήμερα δημιουργία από το χρήστη. Εάν έχετε περισσότερους χαρακτήρες στο ρυθμιστικό σας από ό, τι έχετε την ικανότητα στο ρυθμιστικό, διαισθητικά τι πρέπει να κάνουμε στη συνέχεια διαθέτουν μεγαλύτερη χωρητικότητα. Έτσι, Πάω να προσπεράσει μερικές από τις αριθμητικές εδώ και να επικεντρωθεί μόνο σε αυτήν την λειτουργία εδώ. Ξέρεις τι είναι malloc ή είναι τουλάχιστον γενικά εξοικειωμένοι. Πάρτε μια εικασία τι κάνει realloc. >> [Φοιτητής] Προσθέτει μνήμη. Δεν είναι αρκετά προσθέτοντας μνήμη. Είναι αναδιανέμει μνήμης ως εξής. Αν υπάρχει ακόμα περιθώριο στο τέλος του string για να σας δώσουμε περισσότερες της μνήμης από ό, τι σας δίνει αρχικά, τότε θα πάρετε αυτό το επιπλέον μνήμη. Έτσι, μπορείτε απλά να κρατήσει τη θέση τους χαρακτήρες της σειράς είναι πλάτη με πλάτη με πλάτη με πλάτη. Αλλά αν αυτό δεν είναι η περίπτωση, γιατί περίμενε πολύ καιρό και κάτι τυχαία πήρε plopped στη μνήμη υπάρχει αλλά υπάρχει επιπλέον μνήμη εδώ κάτω, αυτό είναι εντάξει. Realloc πρόκειται να κάνει όλη τη δύσκολη δουλειά για εσάς, μετακινήσετε τη σειρά που έχετε διαβάσει στο έτσι μακριά από εδώ, να το βάλετε εκεί κάτω, και στη συνέχεια να σας δώσει κάποιες περισσότερες διαδρόμου σε εκείνο το σημείο. Έτσι, με μια κίνηση του χεριού, επιτρέψτε μου να πω ότι αυτό που κάνει GetString είναι αυτό που αρχίζει με ένα μικρό ρυθμιστικό, ίσως ένα ενιαίο χαρακτήρα, και αν ο χρήστης πληκτρολογεί σε δύο χαρακτήρες, GetString καταλήγει καλώντας realloc και λέει ένα χαρακτήρα δεν ήταν αρκετό? να μου δώσει δύο χαρακτήρες. Στη συνέχεια, αν μπορείτε να διαβάσετε μέσα από τη λογική του βρόχου, πρόκειται να πούμε ο χρήστης πληκτρολογήσει 3 χαρακτήρες? δώσω τώρα όχι 2, αλλά 4 χαρακτήρες, τότε να μου δώσει 8, τότε δώσε μου 16 και 32. Το γεγονός ότι είμαι ο διπλασιασμός της χωρητικότητας κάθε φορά σημαίνει ότι το ρυθμιστικό δεν πρόκειται να αυξηθεί σιγά-σιγά, πρόκειται να αυξηθεί γρήγορα σούπερ. Και τι θα μπορούσε να είναι το πλεονέκτημα του ότι; Γιατί είμαι διπλασιάζοντας το μέγεθος του buffer ακόμα κι αν ο χρήστης μπορεί να χρειαστεί μόνο ένα επιπλέον χαρακτήρα από το πληκτρολόγιο; [Ακούγεται ανταπόκριση των φοιτητών] >> Τι είναι αυτό; >> [Φοιτητής] Δεν χρειάζεται να αναπτυχθεί τόσο συχνά. Ακριβώς. Δεν χρειάζεται να αναπτυχθεί τόσο συχνά. Και αυτό είναι ακριβώς το είδος της αντιστάθμισης είστε στοιχήματά σας εδώ, με το σκεπτικό ότι δεν θέλετε να καλέσετε realloc πολλά, επειδή τείνει να είναι αργή. Κάθε φορά που θα ζητήσει από το λειτουργικό σύστημα για τη μνήμη, όπως θα δούμε σύντομα σε ένα μελλοντικό πρόβλημα σύνολο, τείνει να πάρει κάποιο χρόνο. Έτσι, ελαχιστοποιώντας το ποσό του χρόνου, ακόμα και αν χάνουμε κάποιο διάστημα, τείνει να είναι ένα καλό πράγμα. Αλλά αν διαβάσετε το τελευταίο μέρος της GetString εδώ - και πάλι την κατανόηση κάθε γραμμή εδώ δεν είναι τόσο σημαντικό σήμερα - παρατηρήσετε ότι τελικά malloc καλεί και πάλι και διαθέτει ακριβώς όπως πολλά bytes όσο χρειάζεται για το string και στη συνέχεια ρίχνει μακριά καλώντας δωρεάν το υπερβολικά μεγάλο ρυθμιστικό αν πράγματι πήρε διπλασίασε πάρα πολλές φορές. Έτσι, με λίγα λόγια, αυτό είναι το πώς GetString έχει εργαστεί όλο αυτό το διάστημα. Το μόνο που κάνει είναι να διαβάσει ένα χαρακτήρα σε μια στιγμή ξανά και ξανά και ξανά, και κάθε φορά που χρειάζεται κάποια επιπλέον μνήμη, ζητεί από το λειτουργικό σύστημα για να καλώντας realloc. Οποιεσδήποτε ερωτήσεις; Εντάξει. Μια επίθεση. Τώρα που καταλαβαίνουμε δείκτες ή τουλάχιστον είναι όλο και πιο εξοικειωμένοι με δείκτες, ας αναλογιστούμε πως όλος ο κόσμος αρχίζει να καταρρέει αν δεν είναι αρκετά υπερασπιστεί κατά αντιμωλία των χρηστών, οι άνθρωποι που προσπαθούν να χαράξει στο σύστημά σας, οι άνθρωποι που προσπαθούν να κλέψουν το λογισμικό σας με κάποια παράκαμψη κωδικό εγγραφής ότι θα μπορούσαν διαφορετικά να πληκτρολογήσετε μέσα Ρίξτε μια ματιά σε αυτό το παράδειγμα εδώ, το οποίο είναι απλά κώδικας C που έχει μια κύρια λειτουργία στο κάτω μέρος που καλεί μια συνάρτηση foo. Και τι είναι αυτό που περνά για foo; [Φοιτητής] Ένα μοναδικό επιχείρημα. >> [Malan] Ένα μοναδικό επιχείρημα. Έτσι, argv [1], το οποίο σημαίνει ότι η πρώτη λέξη που ο χρήστης πληκτρολογήσει στη γραμμή εντολών μετά a.out ή οτιδήποτε άλλο, το πρόγραμμα ονομάζεται. Έτσι foo στην κορυφή παίρνει σε ένα char *. Αλλά char * είναι ακριβώς αυτό; >> [Φοιτητής] Μια συμβολοσειρά. [Malan] Μια συμβολοσειρά, έτσι δεν υπάρχει τίποτα νέο εδώ. Ότι η σειρά είναι αυθαίρετα που ονομάζεται μπαρ. Σε αυτή τη γραμμή εδώ, char c [12]? Σε είδος ημι-τεχνικά Αγγλικά, τι είναι αυτή η γραμμή να κάνει; [Φοιτητής] Μια σειρά από - >> Array της; >> [Φοιτητής] Χαρακτήρες. Χαρακτήρες >>. Δώσε μου μια σειρά από 12 χαρακτήρες. Έτσι, θα μπορούσαμε να ονομάσουμε αυτό ένα ρυθμιστικό. Είναι τεχνικά ονομάζεται c, αλλά ένα ρυθμιστικό στον προγραμματισμό σημαίνει απλά ένα μάτσο χώρου ότι μπορείτε να βάλετε κάποια πράγματα μέσα Στη συνέχεια, τέλος, memcpy έχουμε δεν χρησιμοποιήθηκαν στο παρελθόν, αλλά μπορείτε να μαντέψετε τι κάνει. Αυτό αντιγράφει τη μνήμη. Τι κάνει; Είναι προφανώς αντιγράφει μπαρ, εισόδου, σε c αλλά μόνο μέχρι το μήκος της ράβδου. Αλλά υπάρχει ένα bug εδώ. >> [Φοιτητής] Χρειάζεται το sizeof χαρακτήρα. Εντάξει >>. Τεχνικά, θα πρέπει να κάνουμε πραγματικά strlen (bar) * sizeof (char)). Αυτό είναι σωστό. Όμως, στη χειρότερη περίπτωση εδώ, ας υποθέσουμε ότι that's - Εντάξει. Στη συνέχεια υπάρχουν δύο σφάλματα. Έτσι, sizeof (char))? Ας κάνουμε αυτό το λίγο μεγαλύτερο. Έτσι τώρα υπάρχει ακόμα ένα bug, το οποίο είναι αυτό; >> [Ακούγεται ανταπόκριση των φοιτητών] Δείτε για ποιο λόγο; >> [Φοιτητής] Check for null. Θα πρέπει γενικά να είναι ο έλεγχος για NULL γιατί συμβαίνουν κακά πράγματα όταν ο δείκτης είναι NULL σας, επειδή μπορεί να καταλήξουν εκεί, και δεν θα πρέπει ποτέ να πρόκειται να NULL από εύρεση τιμών με το χειριστή αστέρι. Έτσι, αυτό είναι καλό. Και ό, τι άλλο κάνουμε; Λογικά, υπάρχει ένα ελάττωμα εδώ. [Φοιτητής] Ελέγξτε αν argc είναι> = έως 2. Έτσι, ελέγξτε αν argc είναι> = 2. Εντάξει, έτσι είναι τρία σφάλματα σε αυτό το πρόγραμμα εδώ. Είμαστε τώρα τον έλεγχο αν ο χρήστης πληκτρολογήσει πραγματικά σε οτιδήποτε σε argv [1]. Καλή. Έτσι, αυτό που είναι το τρίτο σφάλμα; Ναι. >> [Φοιτητής] C μπορεί να μην είναι αρκετά μεγάλη. Καλή. Ελέγξαμε ένα σενάριο. Θα ελέγχεται εμμέσως μην αντιγράψετε περισσότερη μνήμη από ό, τι θα υπερβαίνει το μήκος της ράβδου. Έτσι, αν το string ο χρήστης πληκτρολογήσει είναι 10 χαρακτήρες, αυτό λέει μόνο αντιγράψετε 10 χαρακτήρες. Και αυτό είναι εντάξει. Αλλά τι θα γινόταν αν ο χρήστης πληκτρολογήσει σε μια λέξη στη γραμμή εντολών σαν μια λέξη 20-χαρακτήρων; Αυτό που λέει αντίγραφο 20 χαρακτήρες από τη γραμμή σε ό, τι; C, αλλιώς γνωστή ως ρυθμιστικό μας, το οποίο σημαίνει ότι έγραψε μόνο τα δεδομένα έως 8 θέσεις byte που δεν έχουν στην ιδιοκτησία τους, και δεν τα κατέχουν, με την έννοια ότι ποτέ δεν τους διατίθενται. Έτσι, αυτό είναι ό, τι είναι γενικά γνωστή ως επίθεση ή υπερχείλιση buffer επίθεση υπέρβασης. Και είναι μια επίθεση με την έννοια ότι, αν ο χρήστης ή το πρόγραμμα που σας καλεί η λειτουργία σας κάνει αυτό κακόβουλα, τι πραγματικά θα συμβεί στη συνέχεια θα μπορούσε πραγματικά να είναι αρκετά κακό. Έτσι, ας ρίξουμε μια ματιά σε αυτή την εικόνα εδώ. Αυτή η εικόνα αντιπροσωπεύει το stack σας μνήμη. Θυμηθείτε ότι κάθε φορά που θα καλέσετε μια συνάρτηση μπορείτε να πάρετε αυτό το μικρό πλαίσιο στη στοίβα και στη συνέχεια ένα άλλο και στη συνέχεια ένα άλλο και άλλο. Και μέχρι στιγμής, έχουμε ακριβώς το είδος του αντλούμενου αυτά ως ορθογώνια είτε στο ταμπλό ή στην οθόνη εδώ. Αλλά αν κάνετε ζουμ σε ένα από αυτά τα ορθογώνια, όταν καλείτε μια συνάρτηση foo, αποδεικνύεται ότι υπάρχει κάτι περισσότερο στο εσωτερικό της στοίβας αυτό το πλαίσιο σε αυτό το ορθογώνιο από ό, τι ακριβώς x και y και α και β, όπως κάναμε μιλάμε για swap. Αποδεικνύεται ότι υπάρχει κάποια χαμηλότερο επίπεδο λεπτομέρειες, μεταξύ των οποίων Διεύθυνση επιστροφής. Έτσι αποδεικνύεται όταν η κύρια καλεί foo, κυρίως έχει να ενημερώσει foo ποια διεύθυνση είναι κύριος στη μνήμη του υπολογιστή γιατί διαφορετικά, το συντομότερο foo γίνεται εκτέλεση, όπως στην προκειμένη περίπτωση εδώ, μόλις φτάσετε σε αυτό το κλειστό άγκιστρο στο τέλος του foo, πώς στο καλό δεν ξέρει πού foo ο έλεγχος του προγράμματος υποτίθεται ότι θα πάει; Αποδεικνύεται ότι η απάντηση στο ερώτημα αυτό είναι σε αυτό το κόκκινο ορθογώνιο εδώ. Αυτό αντιπροσωπεύει ένα δείκτη, και είναι στο χέρι του υπολογιστή για την προσωρινή αποθήκευση για το λεγόμενο στοίβα τη διεύθυνση της κύριας έτσι ώστε το συντομότερο foo γίνεται εκτέλεση, ο υπολογιστής ξέρει πού και τι γραμμή στην κύρια να πάει πίσω. Αποθηκεύτηκε δείκτη Frame σχετίζεται παρομοίως προς αυτό. Char μπαρ * εδώ τι αντιπροσωπεύει; Τώρα, αυτό το μπλε τμήμα είναι εδώ πλαίσιο του foo. Τι είναι το μπαρ; Bar είναι ακριβώς το επιχείρημα για τη λειτουργία foo. Έτσι τώρα είμαστε πίσω στο είδος του οικείου εικόνα. Υπάρχουν κι άλλα πράγματα και περισσότερο περισπασμούς στην οθόνη, αλλά αυτό το γαλάζιο τμήμα είναι ακριβώς αυτό που έχουμε με βάση την μαυροπίνακα για κάτι σαν swap. Αυτό είναι το πλαίσιο για foo. Και το μόνο πράγμα που αυτή τη στιγμή είναι το μπαρ, το οποίο είναι αυτή η παράμετρος. Αλλά τι άλλο θα πρέπει να είναι στη στοίβα, σύμφωνα με αυτόν τον κώδικα εδώ; [Φοιτητής] char c [12]. >> [Malan] char c [12]. Θα πρέπει να δούμε επίσης 12 πλατείες της μνήμης που εκχωρείται σε μια μεταβλητή που ονομάζεται γ, και μάλιστα έχουμε ότι στην οθόνη. Η κορυφή δεν υπάρχει c [0], και στη συνέχεια, ο συγγραφέας αυτού του διαγράμματος δεν ενοχλεί την κατάρτιση όλων των τετραγώνων, αλλά υπάρχουν πράγματι υπάρχουν 12 γιατί αν κοιτάξετε στο κάτω δεξιό μέρος, γ [11], αν μετράνε από το 0 είναι η 12η τέτοια byte. Αλλά εδώ είναι το πρόβλημα. Σε ποια κατεύθυνση γ αυξάνεται; Ταξινόμηση των άνω προς τα κάτω, αν ξεκινά από την κορυφή και μεγαλώνει προς τα κάτω. Δεν μοιάζει αφήσαμε τους εαυτούς μας πολύ διάδρομο εδώ καθόλου. Έχουμε το είδος του εαυτού μας ζωγράφισε σε μια γωνιά, και ότι c [11] είναι σωστό επάνω ενάντια μπαρ, το οποίο βρίσκεται ακριβώς επάνω ενάντια Αποθηκευμένες δείκτη Πλαίσιο, το οποίο είναι σωστό επάνω ενάντια Διεύθυνση επιστροφής. Δεν υπάρχει μεγαλύτερο περιθώριο. Έτσι ποια είναι η επίπτωση στη συνέχεια, αν τα κάνεις θάλασσα και θα προσπαθήσουμε να διαβάσουμε 20 bytes σε ένα 12-byte buffer; Σε περίπτωση που αυτές οι 8 επιπλέον bytes πρόκειται να πάει; >> [Φοιτητής] Μέσα - Μέσα από οτιδήποτε άλλο, μερικές από τις οποίες είναι εξαιρετικά σημαντικό. Και το πιο σημαντικό πράγμα, ενδεχομένως, είναι το κόκκινο κουτί εκεί, Διεύθυνση επιστροφής, γιατί ας υποθέσουμε ότι έχετε είτε τυχαία είτε adversarially αντικαταστήσετε τα 4 bytes, ότι η διεύθυνση δείκτης, όχι μόνο με τα σκουπίδια, αλλά με έναν αριθμό αυτό συμβαίνει για να αντιπροσωπεύουν μια πραγματική διεύθυνση στη μνήμη. Ποια είναι η επίπτωση, λογικά; >> [Φοιτητής] Λειτουργία πρόκειται να επιστρέψει σε μια διαφορετική θέση. Ακριβώς. Όταν επιστρέφει foo και χτυπήματα που στήριγμα σγουρά, το πρόγραμμα πρόκειται να προχωρήσει όχι για να επιστρέψετε στο κύριο, πρόκειται να επιστρέψει στην διεύθυνση ό, τι είναι σε αυτό το κόκκινο κουτί. Σε περίπτωση καταστρατήγησης εγγραφής λογισμικού, τι θα γινόταν αν η διεύθυνση που είναι να επιστραφεί στο είναι η λειτουργία που συνήθως παίρνει ονομάζεται αφού έχετε πληρώσει για το λογισμικό και εισάγεται κωδικό εγγραφής σας; Μπορείτε να ταξινομήσετε του τέχνασμα ο υπολογιστής δεν πρόκειται σε εδώ, αλλά αντ 'αυτού θα αυξηθεί μέχρι εδώ. Ή αν είστε πραγματικά έξυπνος, ένας αντίπαλος μπορεί πραγματικά να πληκτρολογήσετε στο πληκτρολόγιο, για παράδειγμα, δεν είναι μια πραγματική λέξη, δεν 20 χαρακτήρες, αλλά ας υποθέσουμε ότι αυτός ή αυτή πραγματικά σε τύπους ορισμένοι χαρακτήρες που αντιπροσωπεύουν κώδικα. Και αυτό δεν πρόκειται να είναι C κώδικα, αυτό είναι πραγματικά πρόκειται να είναι οι χαρακτήρες που αντιπροσωπεύουν το δυαδικό κώδικα μηχανής, 0s και 1s. Αλλά ας υποθέσουμε ότι είσαι αρκετά έξυπνος για να το κάνουμε αυτό, με κάποιο τρόπο να επικολλήσετε την άμεση GetString κάτι που είναι ουσιαστικά μεταγλωττισμένο κώδικα, και τα τελευταία 4 bytes αντικαταστήσετε αυτή τη διεύθυνση επιστροφής. Και τι σημαίνει ότι η διεύθυνση εισόδου κάνουμε; Αποθηκεύει πράγματι σε αυτό το κόκκινο ορθογώνιο η διεύθυνση του πρώτου byte του ρυθμιστικού διαλύματος. Έτσι, θα πρέπει να είναι πραγματικά έξυπνος, και αυτό είναι ένα πολύ δοκιμής και λάθους για τους κακούς ανθρώπους εκεί έξω, αλλά αν μπορείτε να καταλάβετε πόσο μεγάλη είναι αυτή η ρυθμιστικού έτσι ώστε τα τελευταία λίγα bytes στην είσοδο που παρέχει στο πρόγραμμα τυχαίνει να είναι ισοδύναμη με την διεύθυνση της έναρξης του ρυθμιστικού σας, μπορείτε να το κάνετε αυτό. Αν πούμε κανονικά γεια και \ 0, αυτό είναι ό, τι καταλήγει στο ρυθμιστικό. Αλλά αν είμαστε πιο έξυπνοι και έχουμε γεμίσει το buffer με το τι θα καλέσουμε γενικά κώδικα επίθεσης - ΑΑΑ, επίθεση, επίθεση, επίθεση - όπου αυτό είναι κάτι που κάνει κάτι κακό, τι θα συμβεί αν είστε πραγματικά έξυπνο, μπορείτε να το κάνετε αυτό. Στο κόκκινο κουτί εδώ είναι μια ακολουθία αριθμών - 80, C0, 35, 08. Παρατηρήστε ότι ταιριάζει με τον αριθμό που είναι εδώ. Είναι σε αντίστροφη σειρά, αλλά περισσότερο για αυτό κάποια άλλη στιγμή. Σημειώστε ότι αυτή η διεύθυνση επιστροφής έχει σκόπιμα μεταβληθεί να ισούται με τη διεύθυνση εδώ, δεν είναι η διεύθυνση της κύριας. Έτσι, αν ο κακός είναι εξαιρετικά έξυπνος, αυτός ή αυτή πρόκειται να περιληφθούν στο εν λόγω κώδικα επίθεσης κάτι σαν να διαγράψετε όλα τα αρχεία του χρήστη ή να αντιγράψετε τους κωδικούς πρόσβασης ή να δημιουργήσετε ένα λογαριασμό χρήστη που μπορεί στη συνέχεια να συνδεθείτε στο - οτιδήποτε. Και αυτό είναι τόσο ο κίνδυνος και η δύναμη του C. Επειδή έχετε πρόσβαση στη μνήμη μέσω των δεικτών και μπορείτε να γράψετε ως εκ τούτου ό, τι θέλετε στη μνήμη ενός υπολογιστή, μπορείτε να κάνετε έναν υπολογιστή κάνει ό, τι θέλετε απλά με το να το ρίξουν μια ματιά στο δικό του χώρο μνήμης του. Και έτσι σε αυτήν την ημέρα τόσα πολλά προγράμματα και τόσες πολλές ιστοσελίδες που είναι σε κίνδυνο συνοψίζεται στους ανθρώπους να επωφεληθούν από αυτό. Και αυτό μπορεί να φαίνεται σαν ένα σούπερ εξελιγμένα επίθεση, αλλά δεν ξεκινά πάντα με αυτόν τον τρόπο. Η πραγματικότητα είναι ότι ό, τι κακοί άνθρωποι θα κάνουν συνήθως είναι, είτε πρόκειται για ένα πρόγραμμα σε μια γραμμή εντολών ή ένα πρόγραμμα GUI ή μια ιστοσελίδα, μόλις ξεκινήσει την παροχή ανοησίες. Πληκτρολογείτε σε μια πραγματικά μεγάλη λέξη στο πεδίο αναζήτησης και πατήστε Enter, και σας περιμένουμε για να δούμε αν η ιστοσελίδα συντρίβει ή θα περιμένουμε να δούμε αν το πρόγραμμα εκδηλώνεται κάποιο μήνυμα σφάλματος γιατί αν πάρετε τυχεροί ως ο κακός και σας παρέχει κάποια τρελή εισόδου που κολλάει το πρόγραμμα, αυτό σημαίνει ότι ο προγραμματιστής δεν πρόλαβε την κακή συμπεριφορά σας, το οποίο σημαίνει ότι μπορείτε να πιθανώς με αρκετή προσπάθεια, ώστε δοκιμής και του λάθους, καταλάβω πώς να ξεκινήσουν έναν πιο ακριβή επίθεση. Έτσι, τόσο ένα μέρος της ασφάλειας δεν είναι απλώς αποφεύγοντας τις επιθέσεις αυτές συνολικά αλλά και την ανίχνευση τους και πραγματικά κοιτάζοντας κούτσουρα και να δει τι τρελό είσοδοι έχουν πληκτρολογήσει τους ανθρώπους στην ιστοσελίδα σας, τι όρους αναζήτησης έχουν οι άνθρωποι πληκτρολογήσει στην ιστοσελίδα σας με την ελπίδα κάποια υπερχείλιση buffer. Και αυτό όλα βράζει κάτω στην απλή βασικά του τι είναι ένας πίνακας και τι σημαίνει αυτό για την κατανομή και τη χρήση της μνήμης. Σχετικά με αυτό, τότε είναι πάρα πολύ αυτό. Ας ρίξουμε μια ματιά στο εσωτερικό του σκληρού δίσκου και πάλι. Θυμάστε από μια εβδομάδα ή δύο πριν ότι όταν μεταφέρετε αρχεία στο κάδο ανακύκλωσης ή σκουπίδια σας μπορεί, τι συμβαίνει; >> [Φοιτητής] Τίποτα. >> Απολύτως τίποτα, έτσι δεν είναι; Τελικά, αν είναι χαμηλό χώρο στο δίσκο, Windows ή Mac OS θα ξεκινήσει τη διαγραφή των αρχείων για εσάς. Αλλά αν σύρετε κάτι εκεί μέσα, αυτό δεν είναι καθόλου ασφαλή. Όλα συγκάτοικό σας ή φίλο ή μέλος της οικογένειας που έχει να κάνει είναι διπλό κλικ και, voila, υπάρχει όλοι οι πρόχειρες αρχεία που προσπαθήσατε να διαγράψετε. Οι περισσότεροι από εμάς γνωρίζουν τουλάχιστον ότι θα πρέπει να κάνετε δεξί κλικ ή κάντε κλικ στο κουμπί ελέγχου και αδειάστε το κάδο απορριμμάτων ή κάτι τέτοιο. Αλλά ακόμα και τότε που δεν κάνει αρκετά το τέχνασμα γιατί ό, τι συμβαίνει όταν έχετε ένα αρχείο στο σκληρό σας δίσκο που αντιπροσωπεύει περίπου το έγγραφο του Word ή κάποιο JPEG, και αυτό αντιπροσωπεύει τον σκληρό σας δίσκο, και ας πούμε ότι αυτή η σχίζα εδώ αντιπροσωπεύει αυτό το αρχείο, και αυτό είναι που αποτελείται από ένα σωρό 0s και 1s. Τι συμβαίνει όταν δεν μπορείτε να σύρετε μόνο το αρχείο στον κάδο απορριμμάτων μπορεί ή κάδο ανακύκλωσης αλλά επίσης αδειάσει; Ταξινόμηση του τίποτα. Δεν είναι απολύτως τίποτα τώρα. Τώρα είναι ακριβώς επειδή δεν είναι λίγο κάτι που συμβαίνει με τη μορφή του πίνακα αυτού. Έτσι, υπάρχει κάποιο είδος της βάσης δεδομένων ή πίνακα στο εσωτερικό της μνήμης ενός υπολογιστή που έχει ουσιαστικά μία στήλη για τα αρχεία τα ονόματα και μία στήλη για τα αρχεία "τοποθεσία, όπου αυτό θα μπορούσε να θέση 123, μόνο ένα τυχαίο αριθμό. Έτσι, θα μπορούσαμε να έχουμε κάτι σαν x.jpeg και τη θέση 123. Τι θα συμβεί στη συνέχεια, όταν έχετε αδειάσει πραγματικά σκουπίδια σας; Αυτό πηγαίνει μακριά. Αλλά ό, τι δεν πάει μακριά είναι η 0s και 1s. Λοιπόν, τι είναι τότε η σύνδεση με pset4; Λοιπόν, με pset4, μόνο και μόνο επειδή έχουμε διαγραφεί κατά λάθος την κάρτα Compact Flash που είχε όλα αυτά τα φωτογραφίες ή απλά επειδή είναι από κακή τύχη έγινε κατεστραμμένο δεν σημαίνει ότι η 0s και 1s δεν είναι ακόμα εκεί. Ίσως μερικά από αυτά χάνονται επειδή κάτι έχει καταστραφεί με την έννοια ότι ορισμένες 0s και 1s έγινε 1s έγινε 0s. Κακά πράγματα μπορούν να συμβούν λόγω της προβληματικό λογισμικό ή ελαττωματικό υλικό. Αλλά πολλά από αυτά τα κομμάτια, ίσως ακόμη και 100% από αυτούς, είναι ακόμα εκεί. Είναι απλά ότι ο υπολογιστής ή η φωτογραφική μηχανή δεν ξέρει πού ξεκίνησε JPEG1 όπου και ξεκίνησε JPEG2. Αλλά αν, ο προγραμματιστής, ξέρετε με λίγο καταλαβαίνω πού είναι αυτά τα αρχεία JPEG ή τι μοιάζουν, έτσι ώστε να μπορεί να αναλύσει το 0s και 1s και να πω JPEG, JPEG, μπορείτε να γράψετε ένα πρόγραμμα με ουσιαστικά μόνο ένα βρόχο for ή while που ανακτά κάθε ένα από αυτά τα αρχεία. Έτσι, το μάθημα είναι στη συνέχεια να ξεκινήσει με ασφάλεια τη διαγραφή αρχείων σας αν θέλετε να το αποφύγετε αυτό εντελώς. Ναι. [Φοιτητής] Πώς γίνεται να λέει στον υπολογιστή σας ότι έχετε περισσότερη μνήμη από ό, τι κάνατε πριν; Έχουν περισσότερη μνήμη από ό, τι κάνατε πριν - >> [φοιτητής] Περισσότερα διαθέσιμη μνήμη. Αχ. Καλή ερώτηση. Γιατί, λοιπόν, στη συνέχεια, μετά το άδειασμα του κάδου απορριμμάτων ο υπολογιστής σας να σας πω ότι έχετε περισσότερο ελεύθερο χώρο από ό, τι κάνατε πριν; Με λίγα λόγια, επειδή είναι ψέματα. Περισσότερα τεχνικά, έχετε περισσότερο χώρο, γιατί τώρα είπατε μπορείτε να βάλετε άλλα πράγματα όταν το αρχείο ήταν κάποτε. Αλλά αυτό δεν σημαίνει ότι τα bits πρόκειται μακριά, και αυτό δεν σημαίνει ότι τα δυαδικά ψηφία που αλλάζουν σε όλες 0s, για παράδειγμα, για την προστασία σας. Έτσι, αντίθετα, αν διαγράψετε με ασφάλεια τα αρχεία ή φυσικά καταστρέψει τη συσκευή, αυτό είναι πραγματικά ο μόνος τρόπος μερικές φορές γύρω από αυτό. Γιατί λοιπόν να μην αφήσουμε σε αυτό το ημι-τρομακτικό σημείωμα, και εμείς θα σας δούμε τη Δευτέρα. [Χειροκροτήματα] [CS50.TV]