DAVID MALAN: Εντάξει, να καλωσορίσω πίσω. Αυτό είναι CS50. Αυτή είναι η αρχή της εβδομάδας επτά. Γι 'αυτό είναι μια στιγμή, έτσι σκέφτηκα ότι θα λάβει μια ανεμοστρόβιλος περιοδεία του όπου σταμάτησε και πού είμαστε τώρα σε εξέλιξη. Έτσι, αυτό το πράγμα εδώ θα μπορούσε να έχει προκάλεσε κάποια αγωνία την πρώτη. Αλλά ελπίζουμε, είστε αρχίζουν να εγκλιματιστεί με ό, τι αυτό σημαίνει εδώ - αστέρι αντιπροσωπεύει ένα δείκτη, η οποία είναι ακριβώς αυτό, όσον αφορά την πιο απλή γλώσσα; Έτσι είναι μια διεύθυνση. Έτσι είναι η διεύθυνση της κάτι στη μνήμη. Και αρχίσαμε να φλούδα πίσω τα στρώματα μια-δυο εβδομάδες πριν, τα πράγματα όπως GetString και άλλων τέτοιων λειτουργιών όλο αυτό το διάστημα έχουν επιστρέψει διευθύνσεις των πραγμάτων στη μνήμη, όπως η διεύθυνση του πρώτου χαρακτήρα κάποια αλληλουχία. Γι 'αυτό και εισήγαγε επίσης valgrind, η οποία θα αρχίσετε να χρησιμοποιείτε για αυτό το πρόβλημα που, ιδίως για την επόμενη πρόβλημα που, όπως καλά. Και valgrind κάνει ό, τι για μας; Ελέγχει για διαρροές μνήμης, και Επίσης, ελέγχει για κατάχρηση της μνήμης. Μπορεί, με κάποια πιθανότητα, ανιχνεύει αν κωδικό σας πρόκειται να αγγίξει τη μνήμη ότι απλώς δεν θα έπρεπε. Έτσι, δεν είναι απαραίτητα μια διαρροή, αλλά αν υπερβαίνουν τα όρια ορισμένων array, και μπορείτε πραγματικά να τρέξει Valgrind και προκαλούν αυτή τη συμπεριφορά, ενώ valgrind τρέχει στο πρόγραμμά σας είναι τρέχει μέσα από αυτό, θα πάρετε μηνύματα όπως αυτό - «άκυρο γράφουν μέγεθος 4 ", το οποίο, υπενθυμίζουν ένα ζευγάρι των εβδομάδες πριν σήμαινε ότι είχα λάθος όπως σε ένα int πολύ πέρα από τα όρια του πίνακα. Και έτσι το μέγεθος 4 σημαίνει εδώ το μέγεθος του συγκεκριμένου Int. Πάρτε λοιπόν διαβεβαίωση για το γεγονός ότι εξόδου valgrind, η μορφή του, είναι απλά άθλιες. Είναι πραγματικά δύσκολο να δει μέσα από το χάος για τον ενδιαφέρουσες πληροφορίες. Έτσι, αυτό που έχουμε κάνει εδώ είναι μόνο απόσπασμα μερικά από το ζευγάρι των περισσότερων ενδιαφέρουσες γραμμές. Αλλά συνειδητοποιούν ότι το 80% των εξαγωγών του valgrind εξόδου πρόκειται να είναι ένα κομμάτι ενός απόσπαση της προσοχής. Απλά κοιτάξτε για τα πρότυπα, όπως αυτά - άκυρο το δικαίωμα, άκυρο διαβάσετε, 40 bytes και κάποια αριθμός των μπλοκ είναι σίγουρα χαθεί, λέξεις-κλειδιά όπως αυτό. Και τι θα ελπίζουμε δείτε είναι μερικά είδος ίχνος ποια λειτουργία το λάθος είναι στην πραγματικότητα μέσα Στην περίπτωση αυτή, εδώ, σε ποια γραμμή κωδικό μου ήταν το λάθος προφανώς; 26 σε ένα αρχείο που ονομάζεται memory.c, η οποία ήταν το παράδειγμα παίζαμε με κατά τη χρονική στιγμή. Έτσι, είναι πιθανόν να μην το malloc. Ήταν ίσως το κωδικό μου αντ 'αυτού. Έτσι, θα δούμε πάλι αυτό και πάλι πριν από καιρό. Έτσι, scanf, αυτό ήρθε σε ένα ζευγάρι των εντύπων μέχρι στιγμής. Είδαμε sscanf σύντομα. Ήταν κάτι ένας αριθμός που βουτούσαν σε σας προετοιμασίες για το κουίζ. Και scanf είναι στην πραγματικότητα αυτό το CS50 βιβλιοθήκης χρησιμοποιεί κάτω από την κουκούλα για αρκετό καιρό, ώστε για να πάρετε είσοδο από το χρήστη. Για παράδειγμα, αν μπορώ να μεταπηδήσουν στην CS50 συσκευή εδώ, επιτρέψτε μου να ανοίξει ένα παράδειγμα που σήμερα λέγεται scanf-0.c Και είναι εξαιρετικά απλό. Είναι μόνο λίγες γραμμές κώδικα. Αλλά αυτό δείχνει πραγματικά πόσο getInt έχει εργαστεί όλη αυτήν την περίοδο. Σε αυτό το πρόγραμμα εδώ, στη γραμμή 16 , Ανακοινώνει ότι δηλώνω ένα int. Έτσι, δεν υπάρχουν δείκτες, κάτι μαγικό , υπάρχει μόνο ένας int. Στη συνέχεια, γραμμή 17, θα ζητήσει η χρήστη για έναν αριθμό, παρακαλώ. Στη συνέχεια, στα τέλη του 18, μπορώ να χρησιμοποιήσω scanf εδώ. Και έχω καθορίσει, κάτι σαν printf, ότι Περιμένω παράθεση unquote i τοις εκατό. Έτσι τοις εκατό Ι, φυσικά, υποδηλώνει μια int. Αλλά παρατηρήστε τι το δεύτερο επιχείρημα για να scanf είναι. Πώς θα περιγράφατε τη δεύτερη επιχείρημα μετά το κόμμα; Τι είναι αυτό; Είναι η διεύθυνση του x. Έτσι, αυτό είναι χρήσιμο, επειδή με την παροχή scanf με τη διεύθυνση του x, τι κάνει που ενισχύουν τη λειτουργία αυτή για να κάνει; Όχι μόνο εκεί, αλλά και να κάνει τι; Κάντε μια αλλαγή σε αυτό. Επειδή μπορείτε να πάτε εκεί, αυτό είναι το είδος της σαν ένα χάρτη σε μια θέση στη μνήμη. Και εφ 'όσον παρέχουν scanf, ή οποιαδήποτε λειτουργία με ένα τέτοιο χάρτη, αυτό λειτουργία μπορεί να πάει εκεί, και όχι μόνο δούμε την αξία, αλλά μπορεί επίσης να αλλάξετε αυτή την τιμή, η οποία είναι χρήσιμη αν ο σκοπός της ζωής του είναι να scanf ανιχνεύσει είσοδο από το χρήστη, ειδικά από το πληκτρολόγιο. Και το f υποδηλώνει σχηματοποιημένη, όπως ακριβώς printf, το f υποδηλώνει ένα μορφοποιημένο κορδόνι που θέλετε να εκτυπώσετε. Έτσι, με λίγα λόγια, αυτή η γραμμή 18 λέει απλά, προσπαθώ να διαβάσω έναν int από το χρήστη πληκτρολόγιο και να το αποθηκεύσετε στο εσωτερικό του x, σε ανεξάρτητα από τη διεύθυνση x τυχαίνει να ζουν στο. Και στη συνέχεια, τέλος, γραμμή 19 λέει ακριβώς, ευχαριστίες για το int, σε αυτή την περίπτωση. Έτσι, επιτρέψτε μου να πάει μπροστά και να κάνουν αυτό. Έτσι κάνουν scanf 0. Επιτρέψτε μου να πάω μπροστά και να μεγεθύνετε Θα πάω και να τρέξει αυτό με τελείες κάθετο scanf 0. Αριθμός, παρακαλώ; 50. Ευχαριστώ για την 50. Έτσι, είναι πολύ απλό. Τώρα τι είναι αυτό που δεν κάνει; Δεν κάνει ένα σωρό τον έλεγχο σφαλμάτων. Για παράδειγμα, αν δεν συνεργαστούν, και δεν πληκτρολογήσετε έναν αριθμό, αλλά αντί να γράφω κάτι σαν "γεια" Αυτό είναι ακριβώς το είδος της παράξενο. Και έτσι ένα από τα πράγματα που το CS50 βιβλιοθήκη έχει κάνει για εμάς για κάποιους τη στιγμή είναι ότι reprompting και reprompting. Η ξαναδοκιμάσετε ανάκληση φράση ήταν σε cs50.c, και αυτός είναι ο λόγος που getInt σε η βιβλιοθήκη CS50 είναι στην πραγματικότητα ένα σύνολο μάτσο γραμμές καιρό, γιατί είμαστε έλεγχο για ηλίθια πράγματα όπως αυτό. Μήπως δεν είναι ο χρήστης να μας, στην πραγματικότητα, ένας int; Μήπως αυτός ή αυτή να μας δώσει κάτι σαν ένα αλφαβητικό γράμμα; Αν ναι, θέλουμε να ανιχνεύσει ότι και να φωνάζουν σε αυτούς. Όμως, τα πράγματα γίνονται πιο ενδιαφέροντα σε αυτό το επόμενο παράδειγμα. Αν πάω στην scanf-1.γ, τι είναι το ένα πράγμα που έχει αλλάξει ριζικά σε αυτό το επόμενο παράδειγμα; Είμαι χρησιμοποιώντας char *, φυσικά, αντί για int. Έτσι, αυτό είναι ενδιαφέρον, γιατί char *, θυμάστε, είναι πραγματικά μόνο η ίδιο πράγμα όπως string. Γι 'αυτό αισθάνεται όπως ίσως αυτό είναι ένα σούπερ απλή εφαρμογή των GetString. Αλλά έχω τραβηχτεί προς τα πίσω το στρώμα της βιβλιοθήκης CS50, έτσι είμαι καλώντας αυτό το char * τώρα. Έτσι, ας δούμε πού, εάν οπουδήποτε, θα πάει στραβά. Γραμμή 17 - Θα ήθελα και πάλι να πω, παρακαλώ να μου δώσει κάτι, σε αυτή την περίπτωση, ένα string. Και στη συνέχεια, στην επόμενη γραμμή, καλώ scanf, και πάλι, δίνοντας έναν κωδικό μορφή, αλλά αυτή τη φορά s τοις εκατό. Και τότε αυτή τη φορά, είμαι δίνοντας buffer. Τώρα, προσέξτε, δεν είμαι χρησιμοποιώντας Το εμπορικό. Αλλά γιατί είναι ότι μάλλον ΟΚ εδώ; Γιατί ό, τι είναι ήδη buffer; Είναι ήδη ένας δείκτης. Είναι ήδη μια διεύθυνση. Και ας είναι αυτή η λέξη "σύγχυση", επιτρέψτε μου να αποκαλούν απλώς s, για παράδειγμα, για απλότητα. Αλλά έχω την αποκάλεσε buffer διότι σε Γενικά, στον προγραμματισμό, αν έχετε ένα κομμάτι της μνήμης, η οποία είναι πραγματικά μια σειρά ακριβώς είναι, θα μπορούσαμε να πούμε ότι ένα ρυθμιστικό. Είναι ένα μέρος για να αποθηκεύουν πληροφορίες. Παρόμοια με τα πράγματα όπως το YouTube, όταν από όπου και αν buffering, να το πω έτσι, ότι απλά σημαίνει ότι είναι το κατέβασμα κομμάτια από το διαδίκτυο και την αποθήκευση τους σε ένα τοπική ποικιλία, ένα τοπικό κομμάτι της μνήμης, ώστε ότι μπορείτε να το παρακολουθήσετε αργότερα χωρίς να παρακάμπτοντας ή να κρέμεται σας κατά την αναπαραγωγή. Έτσι, υπάρχει ένα πρόβλημα εδώ όμως, γιατί λέω scanf, αναμένουμε μια συμβολοσειρά από το χρήστη. Εδώ είναι η διεύθυνση του ένα μεγάλο κομμάτι της μνήμης. Βάλτε αυτό το αλφαριθμητικό εκεί. Γιατί είναι ότι δεσμεύεται να μας πρόβλημα, όμως; Τι είναι αυτό; Μου επιτρέπεται να έχουν πρόσβαση ότι ένα μέρος της μνήμης; Ξέρεις, δεν ξέρω. Επειδή έχει ρυθμιστικό γίνει προετοιμασία σε τίποτα; Όχι πραγματικά. Και γι 'αυτό είναι ό, τι έχουμε καλώντας μια τιμή σκουπίδια, ο οποίος δεν είναι μια τυπική λέξη. Σημαίνει απλώς δεν έχουμε ιδέα ποια κομμάτια είναι μέσα από τα τέσσερα bytes που Έχω κατανέμονται ως buffer. Δεν έχω ονομάζεται malloc. Έχω σίγουρα δεν λέγεται GetString. Έτσι, ποιος ξέρει τι είναι πραγματικότητα εσωτερικό του buffer; Και όμως λέει scanf τυφλά, εκεί και να θέσει ό, τι ο χρήστης πληκτρολογήσει. Έτσι, αυτό που είναι πιθανό να προκαλέσει στον κώδικά μας, αν θα το τρέξει; Πιθανώς segfault. Ίσως όχι, αλλά μάλλον segfault. Και λέω ίσως όχι επειδή μερικές φορές κάνετε, μερικές φορές δεν έχετε μια segfault. Μερικές φορές, μπορείτε απλά να πάρετε τυχεροί, αλλά είναι, ωστόσο, πρόκειται να είναι ένα bug στο πρόγραμμά μας. Επιτρέψτε μου λοιπόν να προχωρήσει και η συγκέντρωση αυτών. Πάω να κάνω τον παλιό τρόπο σχολείο. Έτσι παύλα κλαγγή 0, scanf-1, scanf-1.γ, Enter. Ωχ, πολύ παλιό σχολείο. Ας δούμε. Πού να πάω; Ω, char buffer *. Αχ, σας ευχαριστώ - Αποθήκευση, OK - πολύ παλιό σχολείο. Εντάξει, αυτό είναι λίγο. Έτσι έχω σωθεί μόνο το αρχείο μετά για την εν λόγω προσωρινή αλλάξει πριν από λίγο. Και τώρα έχω καταρτίζονται με το χέρι με Clang. Και τώρα είμαι πρόκειται να πάει μπροστά και να τρέξει scanf-1, Enter. String παρακαλώ. Θα πληκτρολογήσετε "γεια". Και τώρα, εδώ είναι όπου, ειλικρινά, printf μπορεί να είναι λίγο ενοχλητικό. Δεν είναι πραγματικά πρόκειται να segfault σε αυτή την περίπτωση. Printf είναι λίγο ιδιαίτερη, διότι είναι τόσο σούπερ που χρησιμοποιούνται συνήθως ότι ουσιαστικά printf κάνει μας κάνει τη χάρη και την υλοποίηση, αυτό δεν είναι ένα έγκυρο δείκτη. Επιτρέψτε μου να το πάρετε επάνω στον εαυτό μου να εκτυπώσετε μόνο έξω σε παρένθεση null, ακόμη αν και δεν είναι απαραίτητα αυτό που εμείς οι ίδιοι περιμέναμε. Έτσι, δεν μπορούμε πολύ εύκολα να προκαλέσει μια segfault με αυτό, αλλά προφανώς αυτό δεν είναι η συμπεριφορά που ήθελα. Έτσι, ποια είναι η απλή λύση; Λοιπόν, στην scanf-2, επιτρέψτε μου να προτείνω αντί πραγματικά κατανομής μόνο ένα char *, επιτρέψτε μου να είμαι λίγο πιο έξυπνοι σχετικά με αυτό, και επιτρέψτε μου να διαθέσει buffer ως μια ακολουθία από 16 χαρακτήρες. Έτσι μπορώ να το κάνετε αυτό σε μια-δυο τρόπους. Θα μπορούσα να χρησιμοποιήσω απολύτως malloc. Αλλά μπορώ να πάω πίσω στην εβδομάδα, όταν δύο Χρειαζόμουν ένα σωρό χαρακτήρων. Αυτό είναι απλά μια σειρά. Επιτρέψτε μου λοιπόν να επαναπροσδιορίσουμε αντί ρυθμιστικού να είναι μια συστοιχία 16 χαρακτήρων. Και τώρα, όταν περάσει ρυθμιστικού - και αυτό είναι κάτι που δεν μιλάμε για την εβδομάδα δύο - αλλά μπορείτε να τη θεραπεία μιας σειράς, όπως αν και είναι μια διεύθυνση. Τεχνικά, όπως έχουμε δει, είναι λίγο διαφορετικό. Αλλά scanf δεν θα πείραζε αν το περάσετε το όνομα ενός πίνακα, γιατί αυτό Clang θα κάνει για μας είναι κατ 'ουσίαν αντιμετωπίζουν το όνομα του εν λόγω πίνακα, όπως η διεύθυνση του κομμάτι των 16 bytes. Έτσι, αυτό είναι η καλύτερη. Αυτό σημαίνει ότι τώρα μπορώ να ελπίζουμε κάντε τα εξής. Επιτρέψτε μου σμίκρυνση για μια στιγμή και κάνουν scanf-2, καταρτίζονται OK. Τώρα, επιτρέψτε μου να κάνω πήρε slash scanf-2. String παρακαλώ. "Hello". Και φάνηκε να λειτουργεί αυτή τη φορά. Αλλά μπορεί κάποιος να προτείνει ένα σενάριο στην οποία μπορεί να μην εξακολουθούν να εργάζονται; Ναι; Κάτι περισσότερο από 16 χαρακτήρες. Και στην πραγματικότητα, μπορούμε να λίγο πιο ακριβή. Κάτι περισσότερο από τους 15 χαρακτήρες, γιατί πραγματικά πρέπει να έχουμε κατά νου ότι χρειαζόμαστε αυτό το backslash μηδέν σιωπηρά στο τέλος του string, η οποία αποτελεί μέρος scanf θα είναι τυπικά να φροντίσει για μας. Έτσι, επιτρέψτε μου να κάνω κάτι σαν - Μερικές φορές μπορούμε απλά αφήσουμε έτσι. Εντάξει, έτσι έχουμε τώρα προκαλείται σφάλμα κατάτμησης μας. Γιατί; Επειδή έχω πληκτρολογήσει σε περισσότερες από 15 χαρακτήρες, και έτσι έχουμε στην πραγματικότητα άγγιξε μνήμη που έχω πραγματικά Δεν θα πρέπει να έχουν. Έτσι, αυτό που είναι πραγματικά η λύση εδώ; Λοιπόν, τι θα γίνει αν χρειαζόμαστε μια μεγαλύτερη σειρά; Λοιπόν, ίσως να είναι 32 bytes. Λοιπόν, τι θα γίνει αν αυτό δεν είναι αρκετό; Πόσο περίπου 64 bytes; Τι θα συμβεί αν αυτό δεν είναι αρκετό; Τι θα λέγατε για 128 ή 200 bytes; Ποια είναι πραγματικά η λύση εδώ στο γενική περίπτωση, αν δεν γνωρίζουμε σε εκ των προτέρων αυτό που ο χρήστης πρόκειται να πληκτρολογήσετε; Είναι ακριβώς το είδος της μια μεγάλη πόνος στο γάιδαρο, για να είμαι ειλικρινής, η οποία είναι ο λόγος για τον CS50 βιβλιοθήκη έχει μερικές ντουζίνες γραμμές κώδικα που συλλογικά την εφαρμογή GetString σειρά με έναν τρόπο που δεν το κάνουμε πρέπει να γνωρίζουμε εκ των προτέρων ποια είναι η χρήστης πρόκειται να πληκτρολογήσετε. Ειδικότερα, αν κοιτάξουμε πίσω στο cs50.c από πριν από δύο εβδομάδες, θα δείτε ότι GetString κάνει στην πραγματικότητα δεν χρησιμοποιεί scanf με αυτόν τον τρόπο. Αντίθετα, διαβάζει ένα χαρακτήρα σε μια στιγμή. Επειδή το ένα ωραίο πράγμα για Διάβαζα ένα χαρακτήρα είναι ότι μπορούμε να εγγυώνται τον εαυτό μας να είναι πάντα έχουν τουλάχιστον ένα char. Μπορώ να δηλώσω μόνο μια χαρα, και στη συνέχεια να λάβει αυτές οι πραγματικά το μωρό βήματα σε μόλις διαβάστε ένα χαρακτήρα μέσα σε ένα φορά από το πληκτρολόγιο. Και τότε, τι θα δείτε GetString δεν είναι κάθε φορά που τρέχει από, ας πούμε, 16 bytes της μνήμης, χρησιμοποιεί malloc, ή μια ξαδέλφη τους, για να διαθέσει περισσότερη μνήμη, αντιγράφοντας το παλιό μνήμης στο νέο, και στη συνέχεια να σέρνεται μαζί, να πάρει ένα χαρακτήρα κάθε φορά, και όταν τρέχει έξω από αυτό κομμάτι της μνήμης, πετάει μακριά, αρπαγές ένα μεγαλύτερο κομμάτι της μνήμης, αντιγράφει παλιά σε νέες και επαναλήψεις. Και είναι πραγματικά ένας πόνος πραγματικά εφαρμόσουν κάτι τόσο απλό όσο να πάρει είσοδο από το χρήστη. Έτσι, μπορείτε να χρησιμοποιήσετε το scanf. Μπορείτε να χρησιμοποιήσετε και άλλες παρόμοιες λειτουργίες. Και πολλά βιβλία και σε απευθείας σύνδεση παραδείγματα αυτά, αλλά είναι όλα ευάλωτο σε προβλήματα όπως αυτό. Και, τελικά, να πάρει ένα segfault είναι ενοχλητικό είδος της. Δεν είναι καλό για τον χρήστη. Όμως, στη χειρότερη περίπτωση, αυτό που κάνει να θέσει ουσιαστικά σας κώδικα σε κίνδυνο; Κάποιο είδος της επίθεσης, ενδεχομένως. Μιλήσαμε για μια τέτοια επίθεση - υπερχείλιση της στοίβας. Αλλά σε γενικές γραμμές, αν σας επιτρέπεται να υπερχείλιση ένα ρυθμιστικό, όπως κάναμε πριν από μερικές εβδομάδες, με μόνο γραπτώς περισσότερο από το "γεια" στη στοίβα, θα μπορεί πράγματι να αναλάβει, ενδεχομένως, ένα υπολογιστή, ή τουλάχιστον να πάρει στα δεδομένα που δεν ανήκουν σε σας. Έτσι, με λίγα λόγια, αυτός είναι ο λόγος που έχουμε οι βοηθητικές ρόδες. Αλλά τώρα, αρχίζουμε να τα πάρει μακριά, τα προγράμματα μας, δεν χρειάζεται πλέον, κατ 'ανάγκην, είσοδο από το χρήστη. Αλλά στην περίπτωση του προβλήματος που έχει έξι, συμβολή σας θα προέλθει από μια τεράστια αρχείο λεξικού με 150 μερικές περίεργο χίλιες λέξεις. Έτσι δεν θα έχετε να ανησυχείτε για αυθαίρετη είσοδο του χρήστη. Εμείς θα σας δώσει κάποιες παραδοχές σχετικά με αυτό το αρχείο. Οποιεσδήποτε ερωτήσεις σχετικά με δείκτες ή scanf ή την είσοδο του χρήστη σε γενικές γραμμές; Εντάξει, έτσι μια γρήγορη ματιά στη συνέχεια σε ένα πίσω από το θέμα πριν από δύο εβδομάδες. Και αυτό ήταν η έννοια του struct. Όχι ότι - αυτή η έννοια μιας struct, το οποίο ήταν αυτό; Τι έκανε struct κάνει για μας; Ορισμός - Ορίστε; Ορίστε μια μεταβλητή τύπου. Έτσι ταξινομήσετε του. Είμαστε συνδυάζουν στην πραγματικότητα δύο θέματα. Έτσι, με typedef, υπενθυμίζουν ότι μπορούμε κηρύξει ένα είδος δική μας, σαν συνώνυμο, όπως και κορδόνι για το char *. Αλλά χρησιμοποιώντας typedef struct και, μπορούμε να δημιουργούν πραγματικά τις δικές μας δομές δεδομένων. Για παράδειγμα, εάν πάω πίσω στο gedit εδώ μόνο για μια στιγμή, και να πάω μπροστά και να κάνουμε κάτι σαν, επιτρέψτε μου να αποθηκεύσετε Αυτό, όπως, ας πούμε, structs.c προσωρινά, είμαι απλώς πρόκειται να προχωρήσει και να συμπεριλάβει standardio.h, int main κενό. Και στη συνέχεια, εδώ, ας υποθέσουμε ότι θέλω να γράψει ένα πρόγραμμα που αποθηκεύει πολλαπλές μαθητές από πολλαπλές σπίτια, για παράδειγμα. Έτσι είναι σαν ένα registrarial βάση δεδομένων κάποιου είδους. Έτσι, αν χρειάζομαι το όνομα ενός φοιτητή, μπορεί να κάνει κάτι σαν char * name, και θα κάνω κάτι σαν - στην πραγματικότητα, ας χρησιμοποιήσουμε την CS50 βιβλιοθήκη για μια στιγμή για να κάνουν αυτό ένα λίγο πιο απλό, ώστε να μπορούμε να δανειστούν οι δεκάδες γραμμές κώδικα. Και ας κρατήσει μόνο το απλό. Θα συνεχίσουμε να το string, και τώρα GetString. Γι 'αυτό και ισχυρίζονται τώρα που έχω αποθηκεύσει το όνομα κάποιου μαθητή, και το σπίτι του κάποια φοιτητής, απλά με τη χρήση μεταβλητών όπως κάναμε και στην εβδομάδα. Αλλά υποθέτω ότι τώρα θέλουμε να υποστηρίξουμε πολλαπλές φοιτητές. Εντάξει, έτσι ώστε το ένστικτό μου είναι να κάνω κορδόνι όνομα2, παίρνει GetString, string house2 παίρνει GetString. Και τότε τριτοετής φοιτητής μας, ας κάνουμε NAME3 GetString. Εντάξει, έτσι αυτό είναι αισίως εντυπωσιακό σας ως ηλίθια, επειδή αυτή η διαδικασία είναι πραγματικά ποτέ πρόκειται να τελειώσει, και είναι ακριβώς πρόκειται να κάνουν τον κωδικό μου φαίνονται χειρότερα και χειρότερα και χειρότερα. Αλλά θα λυθεί κι αυτό σε δύο την εβδομάδα. Τι ήταν σχετικά καθαρό λύση μας όταν είχαμε πολλαπλές μεταβλητές του ίδιο τύπο δεδομένων που είναι όλα συνδέονται μεταξύ τους, αλλά εμείς δεν θέλουμε αυτό το φρικτό χάος από παρόμοιο όνομα μεταβλητές; Τι να κάνουμε αντ 'αυτού; Θεωρώ, λοιπόν, άκουσα μερικές θέσεις. Είχαμε μια σειρά. Αν θέλετε πολλαπλές παρουσίες του κάτι, γιατί δεν έχουμε καθαρίσει αυτό όλα και απλώς να πω, να μου δώσει array ονομάζεται ονόματα; Και για τώρα, ας σκληρό 3 κώδικα. Και τότε να μου δώσει μια άλλη σειρά ονομάζονται σπίτια, και επιτρέψτε μου για πλέον δύσκολο κωδικό 3. Και έχω μαζικά καθαριστεί η χάος που μόλις δημιουργήσατε. Τώρα, έχω ακόμα κωδικοποιημένα σκληρό 3, αλλά ακόμη και το 3 θα μπορούσε δυναμικά να προέρχονται από την χρήστη ή argv, ή τα παρόμοια. Έτσι, αυτό είναι ήδη καθαρότερα. Αλλά αυτό που είναι ενοχλητικό για αυτό είναι ότι τώρα, ακόμα κι αν το όνομα είναι κάπως ουσιαστικά συνδέεται με σπίτι ενός μαθητή - Είναι ένας φοιτητής που πραγματικά θέλουν να εκπροσωπεί - Τώρα έχω δύο πίνακες που είναι παράλληλες υπό την έννοια ότι είναι η ίδιο μέγεθος, και τα ονόματα βραχίονα 0 προφανώς χάρτες σε σπίτια βραχίονα 0, και τα ονόματα βραχίονα 1 χάρτες στα σπίτια βραχίονα 1. Με άλλα λόγια, ο φοιτητής ζει στο ότι το σπίτι, και ότι άλλο μαθητή ζει σε άλλο σπίτι. Αλλά σίγουρα αυτό θα μπορούσε να γίνεται ακόμα πιο καθαρό τρόπο. Λοιπόν, μπορεί, στην πραγματικότητα. Και επιτρέψτε μου να προχωρήσει και να ανοίξει μέχρι structs.h, και θα δείτε αυτήν την ιδέα εδώ. Παρατηρήστε ότι έχω χρησιμοποιήσει typedef, όπως αναφέρθηκε σε μια στιγμή πριν να δηλώσει μας δικό τύπο δεδομένων. Αλλά είμαι με τη χρήση κι άλλη λέξη-κλειδί ονομάζεται struct που μου δίνει μια νέα δομή δεδομένων. Και αυτή η δομή δεδομένων που ισχυρίζονται πρόκειται να έχουν δύο πράγματα στο εσωτερικό του αυτό - μια σειρά που ονομάζεται το όνομα, και μια σειρά που ονομάζεται σπίτι. Και το όνομα Πάω να δώσει Αυτή η δομή δεδομένων πρόκειται να ονομάζεται μαθητή. Θα μπορούσα να το ονομάσουμε ό, τι θέλω, αλλά αυτό σημασιολογικά κάνει νόημα για μένα στο μυαλό μου. Έτσι τώρα, αν ανοίξει μια καλύτερη έκδοση του προγράμματος άρχισα να γράφω εκεί, επιτρέψτε μου να μετακινηθείτε προς τα πάνω. Και υπάρχει κάποια περισσότερες γραμμές κώδικα εδώ, αλλά επιτρέψτε μου να επικεντρωθεί για τη στιγμή σε ένα. Έχω δηλώσει μια σταθερά που ονομάζεται φοιτητές και κωδικοποιούνται σκληρά 3 για τώρα. Αλλά τώρα, παρατηρήστε πόσο καθαρό τον κωδικό μου αρχίζει να παίρνει. Στη γραμμή 22, δηλώνω σειρά των φοιτητών. Και παρατηρήσετε ότι μαθητής είναι προφανώς τώρα ένας τύπος δεδομένων. Επειδή στην κορυφή αυτού του αρχείου, παρατηρήστε Έχω συμπεριληφθεί το αρχείο header ότι τράβηξα μέχρι πριν από λίγο. Και αυτό το αρχείο header πολύ απλά είχε Αυτός ο ορισμός ενός φοιτητή. Μέχρι τώρα, έχω δημιουργήσει τη δική σας προσαρμοσμένη στα δεδομένα μου τύπου ότι οι συγγραφείς της C ετών Πριν δεν σκέφτομαι εκ των προτέρων. Αλλά δεν υπάρχει πρόβλημα. Μπορώ να κάνω μόνος μου. Έτσι, αυτό είναι ένας πίνακας που ονομάζεται φοιτητές, καθένα από τα μέλη των οποίων είναι μια δομή σπουδαστών. Και θέλω τρεις από αυτούς στη συστοιχία. Και τώρα, τι κάνει το υπόλοιπο αυτού του προγράμματος να κάνω; Χρειαζόμουν κάτι λίγο αυθαίρετο. Έτσι, από το online 24 και μετά, Ι επαναλέγω από 0 έως 3. Έχω ζητήσει από το χρήστη για την το όνομα του μαθητή. Και τότε μπορώ να χρησιμοποιήσω GetString όπως πριν. Στη συνέχεια, ζητώ για το σπίτι του μαθητή, και μπορώ να χρησιμοποιήσω GetString όπως πριν. Αλλά προσέξτε - ελαφρώς νέα κομμάτι της σύνταξης - Μπορώ ακόμα δείκτη για το μαθητή i-ου, αλλά πώς μπορώ να πάρω στα συγκεκριμένα δεδομένα στο εσωτερικό πεδίο του struct; Λοιπόν, αυτό είναι προφανώς το νέο κομμάτι της σύνταξης; Είναι απλά ο χειριστής dot. Εμείς δεν έχουμε πραγματικά δει αυτό πριν. Έχετε δει στο PSET πέντε, αν έχετε βούτηξε ήδη με αρχεία bitmap. Αλλά η τελεία σημαίνει ακριβώς μέσα από αυτό struct ή πολλαπλά πεδία, δίνουν dot το όνομα, ή να μου δώσει dot σπίτι. Αυτό σημαίνει ότι πάει μέσα του struct και να πάρει εκείνους τους συγκεκριμένους τομείς. Τι σημαίνει το υπόλοιπο αυτού του προγράμματος να κάνω; Δεν είναι όλα ότι η σέξι. Παρατηρήστε ότι έχω επαναλάβει 0-3 και πάλι, και εγώ απλά να δημιουργήσετε ένα αγγλικό φράση όπως έτσι και έτσι είναι σε τέτοια και ένα τέτοιο σπίτι, περνώντας dot όνομα το i-οστό των φοιτητών και τους σπίτι, καθώς και. Και στη συνέχεια, τέλος, τώρα θα αρχίσουν να παίρνουν πρωκτικό γι 'αυτό, τώρα που είμαστε εξοικειωμένοι με το τι malloc και άλλες λειτουργίες έχουν κάνει όλο αυτό το διάστημα. Γιατί έχω να απελευθερώσει τόσο το όνομα και το σπίτι, ακόμα κι αν δεν θέτει malloc; GetString έκανε. Και αυτό ήταν το βρώμικο μικρό μυστικό για αρκετές εβδομάδες, αλλά έχει GetString έχει διαρροή μνήμης σε όλη τη τοποθετήστε όλες τις εξάμηνο μέχρι στιγμής. Και Valgrand τελικά θα αποκαλύψει αυτό για εμάς. Αλλά δεν είναι μια μεγάλη υπόθεση, γιατί ξέρω ότι μπορώ να απελευθερώσει απλά το όνομα και το σπίτι, αν και τεχνικά, για να είναι σούπερ, σούπερ ασφαλές, θα πρέπει να είναι κάνει κάποιο λάθος έλεγχο εδώ. Τι είναι το ένστικτό σας σας λέει; Τι θα πρέπει να είναι ο έλεγχος για πριν απελευθερωθούν τι είναι ένα string, γνωστός και ως που μια χαρα *; Θα ήθελα πραγματικά να ελέγξει αν οι μαθητές βραχίονα i dot όνομα δεν ίση null. Στη συνέχεια, αυτό θα είναι εντάξει για να πάει μπροστά και δωρεάν ότι δείκτη, και το ίδιο ή το άλλο ένα επίσης. Αν οι μαθητές βραχίονα i dot σπίτι δεν είναι ίση με null, αυτό τώρα θα προστατεύσει κατά περίπτωση γωνία στην οποία GetString επιστρέφει κάτι σαν null. Και είδαμε πριν από λίγο, printf θα προστασία μας εδώ με απλά λέγοντας null, η οποία πρόκειται να φαίνεται παράξενο. Αλλά τουλάχιστον δεν θα segfault, όπως έχουμε δει. Λοιπόν, επιτρέψτε μου να κάνω κάτι άλλο εδώ. structs-0 είναι το είδος ενός ηλίθιου προγράμματος γιατί μπαίνω όλα αυτά τα δεδομένα, και στη συνέχεια είναι μια φορά έχασε τη λήξη του προγράμματος. Αλλά επιτρέψτε μου να προχωρήσει και να το κάνουμε αυτό. Επιτρέψτε μου να κάνω το τερματικό παράθυρο είναι λίγο μεγαλύτερο. Επιτρέψτε μου να κάνω structs-1, η οποία είναι μια νέα έκδοση του αυτό. Θα κάνετε ζουμ σε λίγο. Και τώρα επιτρέψτε μου να τρέξει dot κάθετο structs-1. Όνομα Μαθητή - David Mather, ας κάνουμε Rob Kirkland, ας κάνουμε Lauren Leverett. Αυτό που είναι ενδιαφέρον είναι τώρα προειδοποίηση - και ξέρω μόνο αυτό, διότι Έγραψα το πρόγραμμα - υπάρχει ένα αρχείο τώρα για τις τρέχουσες μου κατάλογο που ονομάζεται students.csv. Κάποιοι από εσάς μπορεί να έχετε δει Αυτά στον πραγματικό κόσμο. Τι είναι ένα αρχείο CSV; Τιμές διαχωρισμένες με κόμμα. Είναι το είδος του σαν ένα φτωχού έκδοση ενός αρχείου Excel. Είναι ένα πίνακα γραμμών και στηλών που μπορείτε να ανοίξετε σε ένα πρόγραμμα όπως το Excel, ή αριθμών σε έναν υπολογιστή Mac. Και αν ανοίξω αυτό το αρχείο εδώ στο gedit, Ανακοίνωση - και οι αριθμοί δεν είναι εκεί. Αυτό ακριβώς λέει το gedit με αριθμούς γραμμών. Ανακοίνωση σχετικά με την πρώτη γραμμή αυτής της το αρχείο είναι ο David και Mather. Η επόμενη γραμμή είναι Rob κόμμα Kirkland. Και η τρίτη γραμμή είναι Lauren κόμμα Leverett. Έτσι, αυτό που έχω δημιουργήσει; Έχω γράψει τώρα ένα πρόγραμμα C που αποτελεσματικά μπορεί να δημιουργήσει φύλλα που μπορεί να ανοίξει σε μια πρόγραμμα όπως το Excel. Δεν είναι όλα αυτά συναρπαστικό ένα σύνολο δεδομένων, αλλά αν έχετε πολύ μεγαλύτερα κομμάτια της δεδομένα που θέλετε πραγματικά να χειραγωγήσουν και να κάνουν γραφικές παραστάσεις και τις αρέσει, αυτό είναι ίσως ένα τρόπος για να δημιουργήσετε τα δεδομένα. Επιπλέον, CSVS είναι πραγματικά εξαιρετικά κοινά μόνο για την αποθήκευση απλά δεδομένα - Yahoo Finance, για παράδειγμα, αν έχετε τιμές των μετοχών τους, μέσω του λεγόμενου API, η δωρεάν υπηρεσία που σας επιτρέπει να πάρει ρεύμα up-to-the-ημερομηνία απόθεμα εισαγωγικά για τις επιχειρήσεις, που δώσει τα δεδομένα πίσω στην super απλή μορφή CSV. Λοιπόν, πώς θα το κάνουμε αυτό; Καλά παρατηρήσετε, τα περισσότερα από το πρόγραμμα της σχεδόν το ίδιο. Να σημειωθεί όμως εδώ κάτω, αντί για εκτύπωση οι φοιτητές έξω, on line 35 και μετά, εγώ ισχυρίζομαι ότι είμαι η εξοικονόμηση μαθητές στο δίσκο, έτσι την αποθήκευση ενός αρχείου. Έτσι παρατηρήσετε είμαι δηλώνοντας ένα αρχείο * - τώρα, αυτό είναι το είδος της μια ανωμαλία στη C. Για οποιοδήποτε λόγο, το αρχείο είναι όλα τα καπάκια, το οποίο δεν είναι όπως τα περισσότερα άλλα είδη δεδομένων στο C. Αλλά αυτό είναι ένα ενσωματωμένο τύπο δεδομένων, το αρχείο *. Και είμαι δηλώνοντας ένα δείκτη σε ένα αρχείο, είναι το πώς μπορείτε να σκεφτείτε αυτό. fopen σημαίνει ανοικτό αρχείο. Ποιο αρχείο θέλετε να ανοίξετε; Θέλω να ανοίξω ένα αρχείο το οποίο θα αυθαίρετα καλέσετε students.csv. Θα μπορούσαμε να πούμε ότι κάτι που θέλω. Και στη συνέχεια να λάβει μια εικασία. Τι κάνει το δεύτερο επιχείρημα με fopen πιθανότατα σημαίνει; Δεξιά, w για write, θα μπορούσε να είναι r για ανάγνωση. Υπάρχει ένα για προσάρτησης, αν θέλετε να προσθέσετε γραμμές και όχι αντικαταστήσετε το όλο θέμα. Αλλά εγώ απλά θέλετε να δημιουργήσετε αυτό το αρχείο μία φορά, γι 'αυτό θα χρησιμοποιήσει απόσπασμα unquote w. Και ξέρω ότι μόνο από το να έχουν διαβάσει τα έγγραφα, ή η σελίδα man. Αν το αρχείο δεν είναι null - με άλλα λόγια, αν τίποτα δεν πήγε στραβά εκεί - επιτρέψτε μου να επαναλάβει πάνω από το φοιτητές από 0 έως 3. Και τώρα παρατηρήσετε ότι υπάρχει κάτι πάντα τόσο ελαφρώς διαφορετική περίπου στη γραμμή 41 εδώ. Δεν είναι printf. Είναι fprintf για αυτό το αρχείο printf. Έτσι, πρόκειται να γράψει στο αρχείο. Ποιο αρχείο; Το ένα του οποίου δείκτη που καθορίζετε ως το πρώτο επιχείρημα. Στη συνέχεια ορίζουμε ένα string format. Στη συνέχεια, ορίζουμε τί σειρά που θέλουμε να plug in για το πρώτο s τοις εκατό, και τότε μια άλλη μεταβλητή ή το δεύτερο s τοις εκατό. Στη συνέχεια, κλείστε το αρχείο με fclose. Than I ελευθερώσετε τη μνήμη όπως και πριν, αν και Θα πρέπει να πάμε πίσω και να προσθέσετε κάποιοι έλεγχοι για το null. Και αυτό είναι όλο. fopen, fprintf, fclose μου δίνει το δυνατότητα να δημιουργήσετε αρχεία κειμένου. Τώρα, θα δείτε το σύνολο πρόβλημα πέντε, το οποίο περιλαμβάνει τις εικόνες, θα πρέπει να χρησιμοποιείτε δυαδικά αρχεία αντ 'αυτού. Όμως, ουσιαστικά, η ιδέα είναι η ίδια, ακόμη και αν οι λειτουργίες που θα δείτε είναι λίγο διαφορετικό. Έτσι ανεμοστρόβιλος περιοδεία, αλλά θα πάρετε όλοι πάρα πολύ εξοικειωμένοι με το αρχείο I/O-- εισόδου και εξόδου - με το chipset πέντε. Και οποιεσδήποτε ερωτήσεις σχετικά με το αρχική βασικά εδώ; Ναι; Τι θα συμβεί αν προσπαθήσετε να ελευθερώσετε μια μηδενική τιμή; Πιστεύω ότι, αν δωρεάν έχει πάρει λίγο πιο φιλική προς το χρήστη, μπορείτε να δυνητικά segfault. Περνώντας το null είναι άσχημα γιατί δεν Πιστεύω δωρεάν μπαίνει στον κόπο να ελέγξει για σας, διότι θα μπορούσε δυνητικά να είναι μια σπατάλη του χρόνου για να κάνει η ίδια για ο καθένας στον κόσμο. Καλή ερώτηση, όμως. Εντάξει, έτσι αυτό το είδος της παίρνει μας σε ένα ενδιαφέρον θέμα. Το θέμα της παύσης προβλήματος πέντε είναι εγκληματολογίας. Τουλάχιστον αυτό είναι ένα τμήμα του συνόλου προβλήματος. Ιατροδικαστικών αναφέρεται γενικά στο ανάκτηση των πληροφοριών που μπορεί να είναι ή μπορεί να μην έχουν διαγραφεί εσκεμμένα. Και έτσι σκέφτηκα να σας δώσω μια γρήγορη γεύση του τι πραγματικά συμβαίνει σε όλα αυτή τη φορά κάτω από την κουκούλα του υπολογιστή σας. Για παράδειγμα, αν έχετε μέσα σας φορητό ή επιτραπέζιο υπολογιστή σας ένα σκληρό δίσκο, είναι είτε ένα μηχανικό συσκευή που στην πραγματικότητα γυρίζει - υπάρχει εγκύκλιος πράγματα που λέγονται platters που μοιάζουν αρκετά αρέσει αυτό που μόλις είχε στην οθόνη εδώ, αν και Αυτό είναι όλο και πιο παλιό σχολείο. Αυτό είναι ένα τρεις-και-α-μισό-ιντσών σκληρό δίσκο. Και τρεισήμισι ίντσες αναφέρεται από με του πράγματος, όταν μπορείτε να το εγκαταστήσετε σε έναν υπολογιστή. Πολλοί από εσάς παιδιά σε φορητούς υπολογιστές σας τώρα έχουν solid-state drives ή SSDs, τα οποία δεν έχουν κινούμενα μέρη. Είναι περισσότερο σαν RAM και λιγότερο σαν αυτές οι μηχανικές συσκευές. Αλλά οι ιδέες είναι ακόμα το ίδιο, βεβαίως που αφορούν για το πρόβλημα που έχει πέντε. Και αν σκεφτείτε τώρα ένα σκληρό δίσκο αντιπροσωπεύει είναι ένας κύκλος, ο οποίος Θα επιστήσω σαν αυτό εδώ. Όταν δημιουργείτε ένα αρχείο στον υπολογιστή σας, είτε πρόκειται για ένα SSD, ή Στην περίπτωση αυτή, ένα παλαιότερο σχολείο σκληρό δίσκο, ότι το αρχείο περιλαμβάνει πολλαπλά κομμάτια. Ας πούμε ότι είναι αυτό 0 και 1, ένα σωρό από 0 και 1. Έτσι, αυτό είναι ολόκληρο το σκληρό δίσκο μου. Αυτό είναι προφανώς ένα αρκετά μεγάλο αρχείο. Και χρησιμοποιεί το 0s και 1s σε αυτό τμήμα της φυσικής πιατέλα. Λοιπόν, αυτό είναι ότι η φυσική μερίδα; Λοιπόν, αποδεικνύεται ότι σε έναν σκληρό δίσκο, τουλάχιστον αυτού του τύπου, δεν υπάρχει αυτά τα μικροσκοπικά μαγνητικά σωματίδια. Και έχουν ουσιαστικά βόρεια και νότια πόλους τους, έτσι ώστε αν μετατρέψει ένα από αυτά τα μαγνητικά σωματίδια Με αυτό τον τρόπο, θα μπορούσαμε να πούμε ότι είναι αντιπροσωπεύουν 1. Και αν είναι ανάποδα νότια έως βόρεια, θα μπορούσαμε να πούμε ότι είναι αντιπροσωπεύει μια 0. Έτσι, στον πραγματικό φυσικό κόσμο, αυτό είναι πώς θα μπορούσε να αποτελέσει κάτι δυαδική κατάσταση του 0 και 1. Έτσι, αυτό είναι όλο ένα αρχείο είναι. Υπάρχει μια ολόκληρη δέσμη των μαγνητικών σωματίδια που είναι με αυτό τον τρόπο τους ή Με αυτό τον τρόπο, η δημιουργία προτύπων από 0 και 1. Αλλά τελικά, όταν αποθηκεύετε ένα αρχείο, κάποιες πληροφορίες αποθηκεύονται ξεχωριστά. Έτσι, αυτό είναι ένα μικρό τραπέζι, έναν κατάλογο, να το πω έτσι. Και εγώ θα καλέσει αυτό το όνομα στήλης, και Θα πάρω αυτή τη θέση της στήλης. Και Πάω να πω, ας υποθέσουμε Αυτό είναι το βιογραφικό μου. Resume.doc μου αποθηκεύεται στους θέση, ας πούμε 123. Πάντα πάμε για το συγκεκριμένο αριθμό. Αλλά αρκεί να πούμε ότι ακριβώς όπως στη μνήμη RAM, μπορείτε να πάρετε ένα σκληρό δίσκο Αυτό είναι ένα gigabyte gigabytes ή 200 ή ένα terabyte, και μπορείτε να Αριθμός όλα τα bytes. Μπορείτε να αριθμηθούν όλα τα κομμάτια των 8 bits. Έτσι, εμείς θα πούμε ότι αυτή η είναι 123 θέση. Έτσι, αυτό το εσωτερικό κατάλογο της λειτουργίας μου σύστημα θυμάται ότι μου βιογραφικό είναι στη θέση 123. Αλλά αυτό παίρνει ενδιαφέρον όταν διαγράφετε ένα αρχείο. Έτσι, για παράδειγμα - και ευτυχώς, το μεγαλύτερο μέρος του κόσμου έχει αλιεύονται σε αυτό - αυτό συμβαίνει όταν σύρετε ένα αρχείο στο Mac OS Trash σας ή Windows Recycle Bin σας; Ποιος είναι ο σκοπός της να κάνει αυτό; Είναι προφανές ότι για να απαλλαγούμε από το αρχείο, αλλά τι κάνει η πράξη της μεταφοράς και πτώση σε κάδο απορριμμάτων σας ή Recycle Bin κάνετε σε έναν υπολογιστή; Απολύτως τίποτα, πραγματικά. Είναι ακριβώς όπως ένα φάκελο. Είναι ένας ειδικός φάκελος, να είστε σίγουροι. Αλλά μήπως αυτό πραγματικά να διαγράψετε το αρχείο; Λοιπόν, όχι, γιατί κάποιοι από εσάς ίσως ήταν όπως, OH βλασφημία, δεν έχετε σημαίνει να το κάνουμε αυτό. Έτσι, κάνετε διπλό κλικ στο Άχρηστα ή Recycle Bin. Έχετε έσπρωξε γύρω και έχετε ανακτηθεί το αρχείο απλά σύροντάς από εκεί. Έτσι, σαφώς, δεν είναι κατ 'ανάγκην διαγράψετε. Εντάξει, είστε πιο έξυπνοι από αυτό. Γνωρίζετε ότι απλά σύροντας το ποντίκι στο Άχρηστα ή Recycle Bin δεν σημαίνει είστε άδειασμα του κάδου απορριμμάτων. Έτσι θα πάμε μέχρι το μενού, και λέτε Empty Trash ή Άδειασμα του κάδου ανακύκλωσης. Τότε τι συμβαίνει; Ναι, γι 'αυτό διαγράφεται περισσότερο. Αλλά το μόνο που συμβαίνει είναι το εξής. Ο υπολογιστής ξεχνά, όπου resume.doc ήταν. Αλλά αυτό που δεν έχει αλλάξει προφανώς στην εικόνα; Τα bits, το 0 και 1 που ισχυρίζονται ότι είναι στο χώρο του κάποια φυσική πτυχή της το υλικό. Είναι ακόμα εκεί. Είναι ακριβώς ο υπολογιστής έχει ξεχάσει τι είναι. Έτσι είναι ουσιαστικά απελευθερωθεί το αρχείο του bits έτσι ώστε να μπορούν να επαναχρησιμοποιηθούν. Αλλά όχι μέχρι να δημιουργήσετε περισσότερα αρχεία, και περισσότερα αρχεία, και τα περισσότερα αρχεία θα probabilistically, τα 0 και 1, τα μαγνητικά σωματίδια, να επαναχρησιμοποιηθούν, ανάποδα ή δεξιά πλευρά προς τα πάνω, για άλλα αρχεία, 0 και 1. Έτσι έχετε αυτό το παράθυρο του χρόνου. Και δεν είναι προβλέψιμης μήκος, πραγματικά. Εξαρτάται από το μέγεθος του σκληρού σας δίσκο και πόσα αρχεία που έχετε και πόσο γρήγορα μπορείτε να κάνετε νέες. Αλλά υπάρχει αυτό το παράθυρο του χρόνου κατά τη διάρκεια της οποία η εν λόγω αρχείο είναι ακόμα απόλυτα αποδίδονται. Έτσι, αν χρησιμοποιείτε ποτέ προγράμματα όπως το McAfee ή το Norton για να προσπαθήσει να ανακτήσει δεδομένων, το μόνο που κάνετε προσπαθεί να ανακτήσει το λεγόμενο κατάλογο σε καταλάβω πού το αρχείο σας ήταν. Και μερικές φορές Norton και θα πουν, το αρχείο είναι 93% αποδίδονται. Λοιπόν, τι σημαίνει αυτό; Αυτό απλά σημαίνει ότι κάποιο άλλο αρχείο συμπτωματικά κατέληξαν χρησιμοποιώντας, για παράδειγμα, τα κομμάτια από το αρχικό σας αρχείο. Έτσι, αυτό που είναι πραγματικά εμπλέκονται στην ανάκτηση των δεδομένων; Λοιπόν, αν δεν έχετε κάτι σαν Norton προ-εγκατεστημένο στον υπολογιστή σας, το καλύτερο που μπορεί μερικές φορές να κάνουμε είναι να κοιτάξουμε σε ολόκληρο τον σκληρό δίσκο που αναζητούν μοτίβα των bits. Και ένα από τα θέματα της σειράς προβλήματος πέντε είναι ότι θα ψάξει το ισοδύναμο ενός σκληρού δίσκου, η ιατροδικαστική εικόνα ενός συμπαγή κάρτα λάμψης από μια ψηφιακή φωτογραφική μηχανή, που ψάχνουν για το 0s και 1s ότι συνήθως, με την υψηλή πιθανότητα, αντιπροσωπεύουν το έναρξη μιας εικόνας JPEG. Και εσείς μπορεί να ανακτήσει αυτές τις εικόνες από υποθέτοντας, αν δείτε αυτό το πρότυπο της bits για την εγκληματολογική εικόνα, με μεγάλη πιθανότητα, που σηματοδοτεί η αρχή μιας JPEG. Και αν δω το ίδιο μοτίβο, που σηματοδοτεί ίσως την έναρξη της άλλο JPEG, και ένα άλλο JPEG, και ένα άλλο JPEG. Και αυτό είναι ακριβώς το πώς ανάκτηση δεδομένων θα λειτουργήσει. Τι ωραία για αρχεία JPEG είναι ακόμη και αν Η μορφή του αρχείου είναι κάπως πολύπλοκη, η αρχή κάθε τέτοια το αρχείο είναι στην πραγματικότητα αρκετά αναγνωρίσιμο και απλό, όπως θα δείτε, Εάν δεν έχετε ήδη. Έτσι, ας ρίξουμε μια πιο προσεκτική ματιά από κάτω Η κουκούλα ως προς το τι ακριβώς ήταν συμβαίνει, και ποια είναι αυτά τα 0 και 1 είναι, για να σας δώσει λίγο περισσότερο από ένα πλαίσιο για τη συγκεκριμένη πρόκληση. [PLAYBACK VIDEO] -Σε περίπτωση που το PC σας αποθηκεύει περισσότερο των μόνιμων στοιχείων του. Για να γίνει αυτό, τα δεδομένα ταξιδεύει από RAM μαζί με τα σήματα του λογισμικού που λένε ο σκληρός δίσκος Πώς να αποθηκεύσετε τα δεδομένα. Το σκληρό δίσκο κυκλώματα μεταφράσει αυτά τα σήματα σε τάση διακυμάνσεις. Αυτά, με τη σειρά της, τον έλεγχο του σκληρού δίσκου κινούμενα μέρη, μερικά από τα λίγα κινούμενα μέρη αριστερά στην σύγχρονο υπολογιστή. Μερικά από τα σήματα που ελέγχουν ένα μοτέρ το οποίο περιστρέφεται επικαλυμμένα με μέταλλο platters. Τα δεδομένα σας είναι πραγματικά αποθηκεύονται σε αυτά τα platters. Άλλα σήματα κινούνται την ανάγνωση / εγγραφή κεφάλια για να διαβάσετε ή να εγγραφή δεδομένων στο platters. Αυτά τα μηχανήματα τόσο ακριβής που ένας άνθρωπος μαλλιά δεν θα μπορούσε ακόμη και να περάσει μεταξύ των κεφάλια και νηματοποίηση platters. Ωστόσο, λειτουργεί όλα σε καταπληκτική ταχύτητα. [PLAYBACK VIDEO END] DAVID MALAN: Zoom σε λίγο βαθύτερη τώρα σε ό, τι είναι στην πραγματικότητα σε αυτές τις πιατέλες. [PLAYBACK VIDEO] -Ας δούμε τι ακριβώς είδε σε αργή κίνηση. Όταν μια σύντομη παλμό της ηλεκτρικής ενέργειας είναι αποστέλλονται στην κεφαλή ανάγνωσης / εγγραφής, εάν flips σε ένα μικροσκοπικό ηλεκτρομαγνητικές ένα κλάσμα του δευτερολέπτου. Ο μαγνήτης δημιουργεί ένα πεδίο, το οποίο αλλάζει η πολικότητα του ένα μικρό, πολύ μικρό τμήμα των σωματιδίων μετάλλου τα οποία παλτό κάθε επιφάνεια πιατέλα. Μια σειρά μοτίβο αυτών των μικροσκοπικών, φορτισμένη-up περιοχές στο δίσκο αντιπροσωπεύει ένα μόνο κομμάτι της δεδομένα στο δυαδικό αριθμό σύστημα που χρησιμοποιείται από τους υπολογιστές. Τώρα, εάν το ρεύμα στέλνεται ένας τρόπος μέσω της ανάγνωσης / εγγραφής κεφάλι, η περιοχή είναι πολωμένο σε μια κατεύθυνση. Αν το ρεύμα στέλνεται στο αντίθετη κατεύθυνση, η πόλωση αντιστρέφεται. Πώς μπορείτε να πάρετε τα δεδομένα από το σκληρό δίσκο; Απλά αντιστραφεί η διαδικασία. Έτσι είναι τα σωματίδια στο δίσκο που παίρνουν το ρεύμα στο ανάγνωσης / εγγραφής κεφάλι κινείται. Βάλτε μαζί τα εκατομμύρια από αυτά μαγνητισμένα τμήματα, και έχετε ένα αρχείο. Τώρα, τα κομμάτια από ένα ενιαίο αρχείο μπορεί να είναι διάσπαρτα σε όλο το αυτοκίνητο του platters, κάτι σαν το χάος των εγγράφων στο γραφείο σας. Έτσι, μια ειδική πρόσθετη αρχείο παρακολουθεί από όπου τα πάντα είναι. Μην επιθυμείτε είχατε κάτι τέτοιο; [PLAYBACK VIDEO END] DAVID MALAN: Εντάξει, ίσως όχι. Έτσι, πόσοι από εσάς παιδιά μεγάλωσε με αυτά; Εντάξει, έτσι είναι όλο και λιγότεροι χέρια κάθε χρόνο. Αλλά είμαι ευτυχής να είστε τουλάχιστον εξοικειωμένοι με αυτούς, επειδή αυτό και το δικό μας demo βιβλίο, δυστυχώς, πεθαίνουν πολύ αργό θάνατο εδώ οικειότητας. Αλλά αυτό είναι ό, τι εγώ, τουλάχιστον, πίσω στο γυμνάσιο, το οποίο χρησιμοποιείται για τη χρήση αντιγράφων ασφαλείας. Και ήταν εκπληκτικό, γιατί θα μπορούσε να αποθηκεύσει 1,4 megabytes για αυτό το συγκεκριμένο δίσκο. Και αυτή ήταν η έκδοση υψηλής πυκνότητας, όπως υποδεικνύεται από το HD, η οποία έχει δηλαδή πριν από τα βίντεο HD σήμερα. Πρότυπο πυκνότητα ήταν 800 kilobytes. Και πριν από αυτό, υπήρχαν 400 kilobyte δίσκους. Και πριν από αυτό, υπήρχαν 5 και 1/4 ιντσών δίσκους, που ήταν πραγματικά δισκέτα, και λίγο μεγαλύτερο και ψηλότερο από αυτά τα πράγματα εδώ. Αλλά μπορείτε να δείτε πραγματικά το λεγόμενο δισκέτα πτυχή αυτών των δίσκων. Και λειτουργικά, είναι στην πραγματικότητα αρκετά παρόμοια με σκληρούς δίσκους σε τουλάχιστον αυτό το είδος. Και πάλι, SSDs σε νεότερα υπολογιστές λειτουργούν λίγο διαφορετικά. Αλλά αν μετακινήσετε αυτό το μικρό μεταλλικό πτερύγιο, μπορείτε πραγματικά να δείτε ένα μικρό μπισκότο, ή πιατέλα. Δεν είναι μέταλλο, όπως αυτό. Αυτό και μόνο είναι πραγματικά κάποια φθηνότερη πλαστικό υλικό. Και μπορείτε να το είδος της κουνάω αυτό. Και έχετε trully μόλις σβηστεί κάποια αριθμός των bits ή μαγνητικών σωματιδίων από αυτό το δίσκο. Έτσι, ευτυχώς, δεν υπάρχει τίποτα σε αυτό. Αν αυτό το πράγμα είναι στον τρόπο - και καλύπτουν τα μάτια σας και αυτές του πλησίον σου - μπορείτε ακριβώς το είδος των τραβήξει αυτό σύνολο off θήκη έτσι. Αλλά υπάρχει ένα μικρό ελατήριο, ώστε να είναι γνωρίζει ότι με τα μάτια σας. Έτσι τώρα έχετε πραγματικά μια δισκέτα. Και αυτό που είναι αξιοσημείωτο για αυτό είναι ότι σε όσο αυτό είναι ένα μικρής κλίμακας αναπαράσταση ενός μεγαλύτερου σκληρό δίσκο, αυτά τα πράγματα είναι super, εξαιρετικά απλή. Αν τσιμπήσετε το κάτω μέρος του, τώρα που αυτό το πράγμα μέταλλο είναι μακριά, και τη φλούδα τα ανοίξετε, όλα είναι εκεί είναι δύο κομμάτια αισθητή και η λεγόμενη δισκέτα με ένα κομμάτι του μετάλλου στο εσωτερικό. Και εκεί πηγαίνει το ήμισυ του περιεχόμενα του δίσκου μου. Πάει άλλο τα μισά από αυτά. Αλλά αυτό είναι το μόνο που περιστρέφεται μέσα σε του υπολογιστή σας στο χτες. Και πάλι, για να το θέσουμε σε προοπτική, πόσο μεγάλο είναι οι περισσότεροι από σας σκληρούς δίσκους αυτές τις μέρες; 500 gigabytes, ένα terabyte, ίσως Ένας επιτραπέζιος υπολογιστής, 2 terabytes, 3 terabytes, 4 terabytes, έτσι δεν είναι; Αυτό είναι ένα megabyte, ή να δώσει, η οποία δεν μπορεί να χωρέσει ακόμα και ένα τυπικό MP3 πια αυτές τις μέρες, ή κάποια παρόμοιου αρχείου μουσικής. Έτσι, ένα μικρό ενθύμιο για σας σήμερα, και και για να βοηθήσει contextualize τι θα πρέπει να λαμβάνουν ως δεδομένο τώρα στο πρόβλημα που έχει πέντε. Έτσι, αυτά είναι δικά σας για να κρατήσει. Επιτρέψτε μου λοιπόν να μετάβαση στο σημείο όπου θα είναι δαπάνες το επόμενο PSET, καθώς και. Έτσι έχουμε θέσει τώρα αυτή τη σελίδα για - ω, ένα ζευγάρι των ανακοινώσεων γρήγορα. Αυτή την Παρασκευή, αν θα θέλατε ενταχθούν CS50 για το μεσημεριανό γεύμα, πηγαίνετε στο συνήθη τόπο, cs50.net/rsvp. Και τελικό σχέδιο - οπότε σύμφωνα με το αναλυτικό πρόγραμμα, έχουμε δημοσιεύτηκε το τελικές προδιαγραφές του έργου έχουν ήδη. Συνειδητοποίησε ότι αυτό δεν σημαίνει ότι Είναι οφείλεται ιδιαίτερα σύντομα. Είναι δημοσιεύτηκε, πραγματικά, μόνο και μόνο για να πάρει εσείς το σκέφτομαι. Και πράγματι, ένα σούπερ σημαντική το ποσοστό αυτών που θα ασχοληθεί τελικών σχεδίων για το υλικό που δεν έχουν πάρει ακόμη και στην τάξη, αλλά θα είναι ήδη από την επόμενη εβδομάδα. Ανακοίνωση, όμως, ότι το spec ζητά μερικές διαφορετικές συνιστώσες της τελικό σχέδιο. Η πρώτη, σε μερικές εβδομάδες, είναι ένα προ-πρόταση, ένα αρκετά απλό email στο TF σας για να του πω ή τι είστε σκεφτόμαστε για το έργο σας, με την καμία δέσμευση. Η πρόταση θα είναι ιδιαίτερα σας δέσμευση, λέγοντας, εδώ, αυτό είναι ό, τι Θα ήθελα να κάνω για το έργο μου. Τι νομίζετε; Πάρα πολύ μεγάλο; Πάρα πολύ μικρό; Είναι εύχρηστο; Και θα δείτε το spec για περισσότερες λεπτομέρειες. Δυο εβδομάδες μετά από αυτό το καθεστώς έκθεση, η οποία είναι μια παρόμοια απλό email στο TF σας για να πω πόσο πολύ πίσω σας βρίσκονται στο τελικό σας υλοποίησης του έργου, που ακολουθείται από η CS50 Hackathon την οποία καθένας καλείται, το οποίο θα είναι ένα γεγονός από 20:00 σε ένα βράδυ μέχρι τις 7:00 Π.μ. το επόμενο πρωί. Pizza, όπως μπορεί να αναφέρεται στην εβδομάδα μηδέν, wil να εξυπηρετούνται στις 9:00 μμ, Κινέζικο φαγητό στις 1:00 AM. Και αν είστε ακόμα ξύπνιοι στις 5:00 π.μ., θα σας πάρει για να IHop για πρωινό. Έτσι, η Hackathon είναι μια από τις πιο αξέχαστες εμπειρίες στην τάξη. Στη συνέχεια, η εφαρμογή οφείλεται, και τότε η κλιμακούμενη CS50 Fair. Περισσότερες λεπτομέρειες σχετικά με όλα αυτά στις εβδομάδες που έρχονται. Αλλά ας πάμε πίσω σε κάτι old school - πάλι, μία συστοιχία. Έτσι, μια σειρά ήταν ωραίο, διότι λύνει προβλήματα, όπως είδαμε μόλις πριν από λίγο με τις δομές των φοιτητών να πάρει λίγο έξω από τον έλεγχο, αν θέλουν να έχουν ένα μαθητή, φοιτητή δύο, φοιτητής τρεις, φοιτητής dot dot dot, κάποιο αυθαίρετο αριθμό των φοιτητών. Έτσι συστοιχίες, πριν από λίγες εβδομάδες, όρμησε μέσα και να επιλυθούν όλα τα προβλήματα μας δεν γνωρίζει εκ των προτέρων πόσα πράγματα από κάποιο είδος θα μπορούσαμε να θέλουμε. Και έχουμε δει ότι structs μπορεί να μας βοηθήσει περαιτέρω οργανώσει τον κωδικό μας και να κρατήσει εννοιολογικά παρόμοιες μεταβλητές, όπως η όνομα και ένα σπίτι, από κοινού, έτσι ώστε να μπορεί να τους αντιμετωπίσουμε ως μία οντότητα, μέσα από τα οποία υπάρχουν μικρότερα κομμάτια. Αλλά συστοιχίες έχουν κάποια μειονεκτήματα. Ποια είναι μερικά από τα μειονεκτήματα έχουμε αντιμετωπίσει με συστοιχίες μέχρι στιγμής; Τι είναι αυτό; Σταθερό μέγεθος - έτσι ακόμα κι αν ίσως να είναι σε θέση να διαθέσει μνήμης για μια array, μόλις ξέρετε πόσοι φοιτητές έχετε, πόσους χαρακτήρες έχετε από το χρήστη, αφού έχετε διατεθεί η σειρά, έχετε το είδος της ζωγραφισμένα τον εαυτό σας σε μια γωνία. Επειδή δεν μπορείτε να εισάγετε νέα στοιχεία στη μέση ενός πίνακα. Δεν μπορείτε να τοποθετήσετε περισσότερα στοιχεία στο τέλος του πίνακα. Πραγματικά, θα πρέπει να καταφύγουν για τη δημιουργία ενός ολόκληρη νέα σειρά, όπως είπαμε, αντιγράφοντας το παλιό στο νέο. Και πάλι, αυτό είναι ότι ο πονοκέφαλος GetString ασχολείται με σας. Αλλά και πάλι, δεν μπορείτε καν να εισάγετε κάτι στη μέση της συστοιχίας Εάν το επιτόκιο δεν είναι εντελώς γεμάτο. Για παράδειγμα, εάν αυτή η συστοιχία εδώ μεγέθους έξι έχει μόνο πέντε πράγματα σε αυτό, Καλά, θα μπορούσατε απλά καρφί κάτι πάνω στο άκρο. Τι γίνεται όμως αν θέλετε να εισαγάγετε κάτι στη μέση του array, έστω και αν θα μπορούσε να έχει πέντε από τα έξι πράγματα σε αυτό; Λοιπόν, τι κάναμε εμείς όταν είχαμε όλοι των εθελοντών μας επί σκηνής στο εβδομάδες παρελθόν; Αν θέλαμε να θέσει κάποιος εδώ, είτε αυτοί οι άνθρωποι πώς να προχωρήσει αυτό τρόπο, ή αυτοί οι άνθρωποι πώς να προχωρήσει αυτό τρόπο, και αυτό έγινε ακριβό. Η μετατόπιση των ατόμων εντός ενός array κατέληξε προσθέτοντας και κοστολόγησης μας χρόνο, ως εκ τούτου, πολύ n τετράγωνο μας χρόνους εκτέλεσης, όπως ταξινόμηση με εισαγωγή, για παράδειγμα, στη χειρότερη περίπτωση. Έτσι συστοιχίες είναι μεγάλη, αλλά θα πρέπει να γνωρίζουν εκ των προτέρων πόσο μεγάλο θέλετε. Έτσι Εντάξει, εδώ είναι μια λύση. Αν δεν γνωρίζει εκ των προτέρων πόσα οι μαθητές θα μπορούσα να έχω, και ξέρω φορά Έχω αποφασίσει, όμως, έχω κολλήσει με αυτό πολλοί φοιτητές, γιατί δεν μπορώ απλά πάντα διαθέσει διπλάσιο χώρο όπως θα μπορούσε κανείς να σκεφτεί χρειάζομαι; Δεν είναι ότι μια λογική λύση; Ρεαλιστικά, δεν νομίζω ότι είμαστε θα χρειαστεί περισσότερα από 50 slots σε μια σειρά για μια κατηγορία μεσαίου μεγέθους, οπότε ας στρογγυλοποιεί προς τα πάνω. Θα κάνω 100 θέσεις στη σειρά μου, απλά έτσι ώστε να μπορούμε να πάρουμε σίγουρα το αριθμός των φοιτητών που περιμένω να να είναι σε κάποια κατηγορία μεσαίου μεγέθους. Γιατί λοιπόν να μην απλά στρογγυλοποιεί προς τα πάνω και να διαθέσει περισσότερη μνήμη, τυπικά, για μία συστοιχία από ό, τι νομίζετε ότι μπορεί να χρειαστεί ακόμη και; Τι είναι αυτή η απλή pushback σε αυτή την ιδέα; Χάνεις απλά μνήμη. Κυριολεκτικά κάθε πρόγραμμα που γράφετε στη συνέχεια χρησιμοποιεί ίσως διπλάσια μνήμη που πραγματικά χρειάζεστε. Και αυτό ακριβώς δεν αισθάνεται σαν μια ιδιαίτερα κομψή λύση. Επιπλέον, μειώνεται μόνο η πιθανότητα ενός προβλήματος. Αν συμβαίνει να έχουν ένα δημοφιλές μάθημα ένα εξάμηνο και έχετε 101 φοιτητές, το πρόγραμμα σας είναι ακόμα ουσιαστικά αντιμετωπίζει το ίδιο θέμα. Έτσι, ευτυχώς, υπάρχει μια λύση για την αυτή η διαφήμιση όλα τα προβλήματά μας με τη μορφή των δομών δεδομένων που είναι πιο πολύπλοκη από αυτά έχουμε δει μέχρι στιγμής. Αυτό, ισχυρίζονται, είναι μια συνδεδεμένη λίστα. Αυτή είναι μια λίστα των αριθμών - 9, 17, 22, 26, και 34 - που έχουν συνδεθεί μεταξύ τους με τρόπο από ό, τι έχω σχεδιάσει ως βέλη. Με άλλα λόγια, αν ήθελα να εκπροσωπεί μια σειρά, θα μπορούσα να κάνω κάτι σαν αυτό. Και θα βάλω αυτό στην εναέρια ακριβώς σε μια στιγμή. Θα μπορούσα να κάνω - γεια, εντάξει. Αναμείνατε. Νέο υπολογιστή εδώ, σαφές - Εντάξει. Έτσι, αν έχω αυτούς τους αριθμούς σε σειρά - 9, 17, 22, 26, 24 - όχι κατ 'ανάγκη σε κλίμακα. Εντάξει, τόσο εδώ είναι η σειρά μου - oh my god. Εντάξει, τόσο εδώ είναι η σειρά μου. Oh my god. [Γέλια] DAVID MALAN: υποκρινόμαστε. Είναι πάρα πολλή προσπάθεια για να πάει πίσω και να διορθώσετε αυτό, ώστε εκεί - 26. Έτσι έχουμε αυτή την σειρά των 9, 17, 22, 26, και 34. Για όσους από εσάς μπορεί να δει το ενοχλητικό λάθος που μόλις έκανε, εκεί που είναι. Γι 'αυτό και ισχυρίζονται ότι αυτό είναι ένα πολύ αποτελεσματική λύση. Έχω κατανέμονται ως πολλά ints ως Χρειάζομαι - ένα, δύο, τρία, τέσσερα, πέντε, ή έξι - και έχω συνέχεια αποθηκεύονται στους αριθμούς εσωτερικό αυτού του πίνακα. Αλλά ας υποθέσουμε, λοιπόν, θέλετε να εισαγάγετε μια τιμή, όπως τον αριθμό 8; Λοιπόν, πού να πάει; Ας υποθέσουμε ότι θέλετε να εισαγάγετε ένας αριθμός όπως 20. Λοιπόν, πού να πάει; Κάπου εκεί στη μέση, ή ο αριθμός 35 έχει για να πάει κάπου στο τέλος. Αλλά είμαι όλοι έξω του χώρου. Και έτσι αυτή είναι μια θεμελιώδης πρόκληση των πινάκων που δεν είναι η λύση. I υποστήριξε πριν από λίγο, GetString λύνει αυτό το πρόβλημα. Εάν θέλετε να εισαγάγετε ένα έκτο αριθμό σε αυτή την σειρά, τι είναι τουλάχιστον ένα λύση που μπορεί να πέσει πίσω για σίγουρα, ακριβώς όπως κάνουμε με GetString; Τι είναι αυτό; Λοιπόν, το κάνει μεγαλύτερο είναι πιο εύκολο στα λόγια παρά στην πράξη. Δεν μπορούμε να κάνουμε κατ 'ανάγκη την συστοιχία μεγαλύτερο, αλλά τι μπορούμε να κάνουμε; Κάντε μια νέα σειρά που είναι μεγαλύτερο, το μέγεθος 6, ή ίσως το μέγεθος 10, αν θέλουμε να πάρει μπροστά από τα πράγματα, και στη συνέχεια να αντιγράψετε το παλιό συστοιχία στο νέο, και κατόπιν ελευθερώσει την παλιά σειρά. Αλλά τι είναι ο χρόνος εκτέλεσης τώρα από αυτή τη διαδικασία; Είναι μεγάλη O Ν, διότι η αντιγραφή πρόκειται να σας κοστίσει μερικές μονάδες χρόνο, οπότε δεν είναι τόσο ιδανική, αν πρέπει να διαθέσει ένα νέο πίνακα, η οποία θα να καταναλώνουν διπλάσια μνήμη προσωρινά. Αντιγράψτε τα παλιά σε νέα - Θέλω να πω, είναι απλώς ένας πονοκέφαλος, που είναι, και πάλι, γιατί γράψαμε GetString για σας. Λοιπόν, τι θα μπορούσαμε να κάνουμε αντ 'αυτού; Λοιπόν, τι θα γίνει αν η δομή δεδομένων μας στην πραγματικότητα έχει κενά σε αυτό; Ας υποθέσουμε ότι έχω χαλαρώσει ο στόχος μου να έχουν συνεχόμενα κομμάτια της μνήμης, όπου το 9 Είναι ακριβώς δίπλα στο 17, το οποίο είναι δίπλα στο 22, και ούτω καθεξής. Και ας υποθέσουμε ότι 9 μπορεί να είναι εδώ στην RAM, και 17 μπορούν να εδώ στη RAM, και 22 μπορούν να εδώ στη RAM. Με άλλα λόγια, εγώ δεν τα χρειάζεστε ακόμη και πίσω στο πίσω πια. Απλά πρέπει να το νήμα με κάποιο τρόπο μια βελόνα μέσω καθενός από αυτούς τους αριθμούς, ή κάθε από αυτούς τους κόμβους, όπως θα καλέσετε τον ορθογώνια, όπως τους έχω που να θυμηθείτε πώς να φτάσουμε στην τελευταία τέτοια κόμβο από την πρώτη. Έτσι, ποια είναι η δομή προγραμματισμού έχουμε δει αρκετά πρόσφατα, με το οποίο μπορούν να εφαρμόσουν αυτό το νήμα, ή που εδώ, με την οποία μπορώ να εφαρμόσουν τα βέλη αυτά; Έτσι, δείκτες, έτσι δεν είναι; Αν έχω διαθέσει δεν είναι απλώς μια Int, αλλά ένας κόμβος - και από κόμβο, εννοώ μόνο το δοχείο. Και οπτικά, εννοώ ένα ορθογώνιο. Έτσι, ένας κόμβος χρειάζεται προφανώς να περιέχει δύο τιμές - int η ίδια και, στη συνέχεια, όπως υπονοείται από το κάτω μισό του ορθογωνίου, αρκετό χώρο για ένα int. Έτσι ακριβώς σκέφτεται το μέλλον εδώ, πόσο μεγάλος είναι αυτός ο κόμβος, αυτό δοχείο ερώτηση; Πόσα bytes για int; Πιθανώς 4, αν είναι το ίδιο με το συνηθισμένο. Και τότε πόσα bytes για το δείκτη; 4. Έτσι, αυτό το δοχείο ή ο κόμβος, είναι πρόκειται να είναι ένα 8-byte δομή. Ω, και αυτό είναι μια ευτυχής σύμπτωση το γεγονός ότι παρουσιάσαμε ακριβώς αυτή την ιδέα της ένα struct ή μια δομή C. Γι 'αυτό και ισχυρίζονται ότι θέλω να πάρω ένα βήμα προς αυτή την πιο εξελιγμένη εφαρμογή του καταλόγου των αριθμών, μια συνδεδεμένη λίστα των αριθμών, πρέπει να κάνω μια λίγο περισσότερο τη σκέψη μπροστά και δηλώνει όχι μόνο ένα int, αλλά ένα struct πως θα καλέσετε, συμβατικά εδώ, ο κόμβος. Θα μπορούσαμε να το ονομάσουμε κάτι που θέλουμε, αλλά κόμβος πρόκειται να είναι θεματικά σε μια παρτίδα από τα πράγματα να αρχίσουμε να εξετάζουμε τώρα. Στο εσωτερικό αυτού του κόμβου είναι ένα int n. Και τότε αυτό το συντακτικό, λίγο παράξενο με την πρώτη ματιά - struct node * επόμενο. Λοιπόν, εικονογραφικά, τι είναι αυτό; Αυτό είναι το κάτω μισό της το ορθογώνιο που είδαμε μόλις πριν από λίγο. Αλλά γιατί λέω struct node * σε αντίθεση με μόνο κόμβο *; Διότι, αν η δείκτης δείχνει σε έναν άλλο κόμβο, είναι ακριβώς το διεύθυνση ενός κόμβου. Αυτό είναι σύμφωνο με αυτό που έχουμε συζήτησαν για δείκτες μέχρι σήμερα. Αλλά γιατί, αν ισχυρίζονται αυτή η δομή είναι που ονομάζεται κόμβος, μπορώ να πω struct κόμβο εδώ μέσα; Ακριβώς. Είναι ένα είδος ηλίθια πραγματικότητα C. Το typedef, να το πω έτσι, δεν έχει συμβεί ακόμα. C είναι εξαιρετικά κυριολεκτική. Διαβάζει κορυφή τον κωδικό σας κάτω, αριστερά προς τα δεξιά. Και μέχρι να χτυπήσει αυτό το ερωτηματικό σχετικά με την κατώτατη γραμμή, μάντεψε τι όχι υφίσταται ως τύπο δεδομένων; Κόμβου, παραθέτω κόμβο unquote. Όμως, λόγω της πιο φλύαρη δήλωση που έκανα στην πρώτη γραμμή - typedef struct node - γιατί αυτό ήρθε πρώτη, πριν από την άγκιστρα, που είναι περίπου όπως προ-εκπαίδευση Clang αυτό, Ξέρεις κάτι, να μου δώσει μια struct ονομάζεται κόμβος struct. Ειλικρινά, δεν μου αρέσει καλώντας τα πράγματα struct node, struct node όλα σε όλο τον κωδικό μου. Αλλά εγώ θα το χρησιμοποιήσετε μόνο μία φορά, μόνο στο εσωτερικό, έτσι ώστε να μπορεί αποτελεσματικά να να δημιουργήσει ένα είδος κυκλικής αναφοράς, δεν ένα δείκτη για τον εαυτό μου per se, αλλά ένα δείκτη σε άλλη ιδίου είδους. Έτσι, αποδεικνύεται ότι σε μια δομή δεδομένων όπως αυτό, υπάρχει μερικές ενέργειες που θα μπορούσαν να που μας ενδιαφέρουν. Θα μπορούσαμε να θέλετε να εισαγάγετε σε μια λίστα σαν αυτή. Θα μπορούσαμε να θέλετε να διαγράψετε από μια λίστα σαν αυτή. Πρέπει να θέλετε να αναζητήσετε τη λίστα για ένα αξία, ή, γενικότερα, τραβέρσα. Και ώθησης είναι μόνο ένα φανταχτερό τρόπο λέγοντας ξεκίνημα στα αριστερά και να μετακινήσετε όλα το δρόμο προς τα δεξιά. Και ειδοποίηση, ακόμα και με αυτό το ελαφρώς πιο εκλεπτυσμένη δομή δεδομένων, αφήστε Θέλω να προτείνω ότι μπορούμε να δανειστεί κάποια από οι ιδέες των τελευταίων δύο εβδομάδων και εφαρμόσουν μια λειτουργία που ονομάζεται αναζήτηση σαν αυτό. Είναι πρόκειται να επιστρέψει αλήθεια ή ψευδείς, αναφέροντας, ναι ή όχι, το η είναι στη λίστα. Το δεύτερο επιχείρημα του είναι ένας δείκτης στην ίδια τη λίστα, έτσι, ένα δείκτη σε έναν κόμβο. Όλα Πάω στη συνέχεια να κάνετε είναι να κηρύξει μια προσωρινή μεταβλητή. Θα ονομάσουμε ptr κατά συνθήκη, για το δείκτη. Και εγώ αναθέσετε ίσο με το αρχή της λίστας. Και παρατηρήσετε τώρα τον βρόχο while. Εφ 'όσον δείκτης δεν είναι ίση σε null, Πάω να ελέγξει. Είναι το βέλος του δείκτη n ίσο με το n που ψηφίστηκε; Και περιμένετε ένα λεπτό - νέα κομμάτι της σύνταξης. Τι είναι το βέλος ξαφνικά; Ναι; Ακριβώς. Έτσι, ενώ πριν από λίγα λεπτά, χρησιμοποιήσαμε ο συμβολισμός dot να αποκτήσετε πρόσβαση κάτι μέσα από ένα το struct, όταν η μεταβλητή έχετε δεν είναι η struct η ίδια, αλλά ένας δείκτης σε μια struct, Ευτυχώς, ένα κομμάτι της σύνταξης που Τέλος καθιστά διαίσθηση. Το βέλος σημαίνει να ακολουθήσει το δείκτη, σαν βέλη μας συνήθως σημαίνει εικαστικά, και να πάει σε δεδομένα στο εσωτερικό πεδίο. Έτσι, το βέλος είναι το ίδιο πράγμα με τελεία, αλλά μπορείτε να το χρησιμοποιήσετε όταν έχετε ένα δείκτη. Έτσι απλά για να ανακεφαλαιώσουμε, στη συνέχεια, αν το πεδίο n εσωτερικό του struct που ονομάζεται δείκτης ισούται ισούται με n, επιστρέφουν αλήθεια. Διαφορετικά, αυτή η γραμμή εδώ - δείκτη ισούται με δείκτη επόμενο. Έτσι τι είναι αυτό που κάνει, ανακοίνωση, είναι αν είμαι σήμερα δείχνοντας το struct που περιέχει 9, και 9 δεν είναι ο αριθμός Ψάχνω για - ας υποθέσουμε ότι ψάχνω για το n ισούται με 50 - Πάω να ενημερώσετε προσωρινή δείκτη μου όχι να επισημάνω σε αυτόν τον κόμβο πια, αλλά δείκτη βέλος δίπλα, η οποία πρόκειται να με βάλει εδώ. Τώρα, συνειδητοποίησα ότι είναι ένας ανεμοστρόβιλος εισαγωγή. Την Τετάρτη, θα κάνουμε πραγματικότητα αυτό με μερικούς ανθρώπους και με κάποια πιο κώδικα με βραδύτερο ρυθμό. Αλλά συνειδητοποιούν, κάνουμε τώρα τα δεδομένα μας δομές πιο περίπλοκη, έτσι ώστε μας αλγόριθμοι μπορούν να πάρουν πιο αποτελεσματική, η οποία πρόκειται να είναι προϋπόθεση για PSET έξι, όταν φορτώνουμε σε, και πάλι, τα 150.000 λέξεις, αλλά πρέπει να το πράξουν αποτελεσματικά, και στην ιδανική περίπτωση, να δημιουργηθεί ένα πρόγραμμα που τρέχει για τους χρήστες μας, δεν γραμμική, όχι σε n τετράγωνο, αλλά σταθερό χρόνο, στην ιδανική. Θα σας δούμε την Τετάρτη. ΟΜΙΛΗΤΗΣ: Στην επόμενη CS50, David ξεχνά βασική περίπτωση του. DAVID MALAN: Και αυτό είναι το πώς μπορείτε να στείλετε μηνύματα κειμένου με C. Ποια η - [ΔΙΑΦΟΡΑ μήνυμα κειμένου ΚΟΙΝΟΠΟΙΗΣΗ SOUNDS]