1 00:00:00,000 --> 00:00:10,970 >> [Παίζει μουσική] 2 00:00:10,970 --> 00:00:12,536 >> David J. MALAN: Εντάξει. 3 00:00:12,536 --> 00:00:13,392 >> [Γέλια] 4 00:00:13,392 --> 00:00:14,240 >> Καλώς ήρθατε και πάλι. 5 00:00:14,240 --> 00:00:14,990 Αυτό είναι CS50. 6 00:00:14,990 --> 00:00:16,890 Και αυτό το τέλος της εβδομάδας πέντε. 7 00:00:16,890 --> 00:00:20,020 Και μέχρι τώρα, έχουμε λίγο πολύ ήδη λάβει ως δεδομένο ότι υπάρχει 8 00:00:20,020 --> 00:00:23,480 υπάρχει αυτή compiler, Clang, που έχετε έχουν επίκληση μέσω αυτής 9 00:00:23,480 --> 00:00:27,100 άλλο εργαλείο που ονομάζεται κάνει ότι με κάποιο τρόπο μαγικά μετατρέπει τον πηγαίο κώδικα 10 00:00:27,100 --> 00:00:31,350 σε κώδικα αντικειμένου, τα μηδενικά και μονάδες ότι οι υπολογιστές CPU σας, κεντρική 11 00:00:31,350 --> 00:00:33,410 μονάδα επεξεργασίας, στην πραγματικότητα καταλαβαίνει. 12 00:00:33,410 --> 00:00:36,770 Αλλά αποδεικνύεται ότι υπάρχει ένας αριθμός που είναι συμβαίνει κάτω από την κουκούλα 13 00:00:36,770 --> 00:00:38,690 μεταξύ εισόδου και εξόδου. 14 00:00:38,690 --> 00:00:41,800 >> Και θα ήθελα να προτείνω να σάρκας ότι σε ένα λίγο πιο αναλυτικά σε 15 00:00:41,800 --> 00:00:45,130 αυτά τα τέσσερα βήματα, έχει κάτι που ονομάζεται προ-επεξεργασία, κάτι που 16 00:00:45,130 --> 00:00:48,300 ονομάζεται μεταγλώττιση, που έχουμε δει, κάτι που ονομάζεται συναρμολόγηση, και 17 00:00:48,300 --> 00:00:49,420 κάτι που ονομάζεται σύνδεση. 18 00:00:49,420 --> 00:00:53,270 Έτσι, μέχρι σήμερα, σε ορισμένες από μας προγράμματα, είχαμε απότομη περιλαμβάνει. 19 00:00:53,270 --> 00:00:56,650 Πιο πρόσφατα είχαμε κάποια απότομη ορίζει για σταθερές. 20 00:00:56,650 --> 00:01:00,660 Έτσι αποδεικνύεται ότι αυτά τα πράγματα που Οι πρόθεμα με το hash σύμβολο ή 21 00:01:00,660 --> 00:01:04,150 το σύμβολο της λίρας είναι προ-επεξεργαστή οδηγιών. 22 00:01:04,150 --> 00:01:07,960 Αυτό είναι μόνο ένα φανταχτερό τρόπο λέγοντας ότι είναι μια γραμμή κώδικα που είναι πραγματικά 23 00:01:07,960 --> 00:01:12,280 μετατρέπεται σε κάτι άλλο πριν από την υπολογιστή, ακόμη και προσπαθείτε να μετατρέψετε σας 24 00:01:12,280 --> 00:01:13,800 πρόγραμμα σε μηδενικά και μονάδες. 25 00:01:13,800 --> 00:01:19,000 >> Για παράδειγμα, απότομη περιλαμβάνει πρότυπο I / O. H, λίγο πολύ απλά σημαίνει να πάει 26 00:01:19,000 --> 00:01:24,010 μπροστά, πιάσε τα περιεχόμενα των αρχείων stdio.h και να τις επικολλήσετε εκεί. 27 00:01:24,010 --> 00:01:25,880 Έτσι, δεν μηδενικά και μονάδες σε εκείνο το σημείο ακόμα. 28 00:01:25,880 --> 00:01:27,470 Είναι πραγματικά ακριβώς μια αντικατάσταση. 29 00:01:27,470 --> 00:01:30,790 Και αυτό γίνεται κατά τη διάρκεια της λεγόμενης προεπεξεργασίας φάση, όταν 30 00:01:30,790 --> 00:01:34,230 λειτουργεί πραγματικά Clang ή ειδικά Βεβαιωθείτε στις περισσότερες περιπτώσεις. 31 00:01:34,230 --> 00:01:36,950 Έτσι, όλα αυτά έχει συμβεί Οποιοδήποτε αυτόματα μέχρι στιγμής. 32 00:01:36,950 --> 00:01:38,800 >> Στη συνέχεια, έρχεται το στάδιο κατάρτισης. 33 00:01:38,800 --> 00:01:40,920 Αλλά έχουμε υπεραπλουστευμένη κατάρτιση. 34 00:01:40,920 --> 00:01:45,060 Χτίσιμο ενός προγράμματος σημαίνει πραγματικά να πάρετε από κάτι σαν C, η 35 00:01:45,060 --> 00:01:48,430 πηγαίο κώδικα που έχουμε γράψει, κάτω σε κάτι που ονομάζεται συνέλευση. 36 00:01:48,430 --> 00:01:52,900 Συνέλευση γλώσσα είναι ένα χαμηλότερο επίπεδο γλώσσα που, ευτυχώς, δεν θα 37 00:01:52,900 --> 00:01:55,480 έχουν μεγάλη ευκαιρία να γράψω αυτό το εξάμηνο. 38 00:01:55,480 --> 00:01:59,100 Αλλά είναι στο χαμηλότερο επίπεδο στην έννοια ότι μπορείτε κυριολεκτικά να αρχίσετε να γράφετε 39 00:01:59,100 --> 00:02:04,270 προσθέσετε και να αφαιρέσετε και να πολλαπλασιαστούν και να φορτώσει από τη μνήμη και να αποθηκεύσετε στη μνήμη, η 40 00:02:04,270 --> 00:02:08,259 πολύ βασικές οδηγίες που ένας υπολογιστής, κάτω από το καπό, 41 00:02:08,259 --> 00:02:09,639 πραγματικά καταλαβαίνει. 42 00:02:09,639 --> 00:02:14,930 >> Τέλος, συναρμολόγηση παίρνει αυτή τη γλώσσα τα μηδενικά και αυτά που έχουμε ήδη 43 00:02:14,930 --> 00:02:16,190 περιγράφουν μέχρι στιγμής. 44 00:02:16,190 --> 00:02:19,270 Και πραγματικά, τέλος, υπάρχει η λεγόμενη συνδέοντας φάση, τον οποίο και θα 45 00:02:19,270 --> 00:02:22,360 δείτε ακριβώς σε μια στιγμή, που συνδυάζει μηδενικά σας και αυτοί με μηδενικά και 46 00:02:22,360 --> 00:02:24,870 αυτά που άλλοι άνθρωποι πριν έχετε δημιουργήσει. 47 00:02:24,870 --> 00:02:26,660 >> Έτσι, θεωρούν αυτό το σούπερ απλό πρόγραμμα. 48 00:02:26,660 --> 00:02:27,560 Ήταν από την Εβδομάδα 1. 49 00:02:27,560 --> 00:02:29,610 Απλά είπε, Hello World, στην οθόνη. 50 00:02:29,610 --> 00:02:30,920 Τρέξαμε αυτό μέσω Clang. 51 00:02:30,920 --> 00:02:33,200 Ή τρέξαμε μέσα από Μάρκα η οποία έτρεξε Clang. 52 00:02:33,200 --> 00:02:36,170 Και εξάγεται κατά τη στιγμή όπου ορισμένοι μηδενικά και αυτά. 53 00:02:36,170 --> 00:02:38,100 Αλλά τελικά δεν υπάρχει ένα ενδιάμεσο βήμα. 54 00:02:38,100 --> 00:02:40,460 Αν πάω εδώ - ουπς, δεν θέλει να τον δει ακόμα. 55 00:02:40,460 --> 00:02:44,800 Αν πάω εδώ στην συσκευή μου και έχω ανοίξει hello.c, εδώ 56 00:02:44,800 --> 00:02:46,160 είναι το ίδιο το πρόγραμμα. 57 00:02:46,160 --> 00:02:48,600 Και τι Πάω να κάνουμε στο τερματικό μου παράθυρο εδώ Πάω να 58 00:02:48,600 --> 00:02:51,430 τρέχει Clang αντί να κάνουν, η οποία αυτοματοποιεί τις τέσσερις 59 00:02:51,430 --> 00:02:52,870 αυτά τα βήματα για μας. 60 00:02:52,870 --> 00:02:58,620 Και Πάω να κάνω κλαγγή-S και τότε hello.c και στη συνέχεια να εισέλθουν. 61 00:02:58,620 --> 00:03:00,590 >> Και έχω μια αναβοσβήνει εντολών και πάλι, το οποίο είναι καλό. 62 00:03:00,590 --> 00:03:05,280 Και τώρα σε ένα λίγο μεγαλύτερο παράθυρο, Πάω να ανοίξει gedit εδώ. 63 00:03:05,280 --> 00:03:09,610 Και Πάω να ανοίξει ένα αρχείο το οποίο, Αποδεικνύεται, καλείται hello.s αυτό 64 00:03:09,610 --> 00:03:11,870 περιέχει τον συμβολική γλώσσα Αναφέρθηκα προηγουμένως. 65 00:03:11,870 --> 00:03:15,060 Και αυτό είναι ό, τι λέγεται συνέλευση γλώσσας, αρκετά χαμηλό επίπεδο 66 00:03:15,060 --> 00:03:18,470 οδηγίες ότι η Intel CPU σας ή ό, τι είναι αυτό που είναι μέσα 67 00:03:18,470 --> 00:03:19,350 καταλαβαίνει. 68 00:03:19,350 --> 00:03:24,480 Και mov είναι για κίνηση. κλήση είναι για καλώντας, ένα πολύ χαμηλό επίπεδο λειτουργίας. 69 00:03:24,480 --> 00:03:26,380 sub είναι για την αφαίρεση. 70 00:03:26,380 --> 00:03:30,370 >> Έτσι, όταν έχετε ένα συγκεκριμένο CPU μέσα του υπολογιστή σας, ό, τι κάνει 71 00:03:30,370 --> 00:03:34,300 διακριτή, σε σχέση με άλλες CPUs για το της αγοράς, η οποία οδηγίες που 72 00:03:34,300 --> 00:03:39,460 κατανοεί και συχνά πόσο αποτελεσματικό είναι, πόσο γρήγορα είναι στην εκτέλεση ορισμένων 73 00:03:39,460 --> 00:03:40,380 των εν λόγω οδηγιών. 74 00:03:40,380 --> 00:03:45,150 Τώρα για περισσότερα σχετικά με αυτό, μπορείτε να πάρετε επόμενη CS61 Πτώση στο κολέγιο. 75 00:03:45,150 --> 00:03:48,170 Αλλά εδώ έχουμε, για παράδειγμα, μερικές αναγνωριστικά που μπορεί να φανεί οικείο. 76 00:03:48,170 --> 00:03:50,150 hello.c είναι το όνομα του προγράμματος. 77 00:03:50,150 --> 00:03:51,070 >> . Κειμένου - 78 00:03:51,070 --> 00:03:54,190 Δεν υπάρχει πολύ ενδιαφέρον υπάρχει μόλις τώρα, υπενθυμίζουν ότι το κείμενο 79 00:03:54,190 --> 00:03:59,190 τμήμα, από τη Δευτέρα, είναι αυτή όπου σε μνήμη προγράμματος σας τελειώνει πραγματικά επάνω. 80 00:03:59,190 --> 00:04:01,330 Έτσι, αυτό είναι τουλάχιστον αόριστα εξοικειωμένοι εκεί. 81 00:04:01,330 --> 00:04:03,730 Εδώ, φυσικά, είναι μια αναφορά από κύρια λειτουργία μας. 82 00:04:03,730 --> 00:04:07,220 Κύλιση προς τα κάτω, αυτά αναφέρονται σε πράγματα αποκαλούμενη μητρώα, πολύ μικρά κομμάτια 83 00:04:07,220 --> 00:04:09,190 στο εσωτερικό της μνήμης των πραγματικών CPU σας. 84 00:04:09,190 --> 00:04:12,930 Και αν μετακινηθείτε προς τα κάτω, ακόμη και περαιτέρω, βλέπω κάποιο είδος 85 00:04:12,930 --> 00:04:14,240 έμμεση αναφορά του ASCII. 86 00:04:14,240 --> 00:04:17,120 Και, πράγματι, είναι ότι το string, Γεια σας, κόμμα, τον κόσμο. 87 00:04:17,120 --> 00:04:20,079 >> Έτσι, τα πολυλογώ, αυτό έχει συμβαίνει για σας, αυτόματα, 88 00:04:20,079 --> 00:04:22,140 κάτω από την κουκούλα όλη αυτήν την περίοδο. 89 00:04:22,140 --> 00:04:26,450 Και αυτό που συμβαίνει είναι πραγματικά μια φορά έχετε τρέξει Clang, είτε μέσω της 90 00:04:26,450 --> 00:04:29,150 Κάντε, είστε να πάρει το πρώτο, από τον πηγαίο κώδικα, η 91 00:04:29,150 --> 00:04:30,700 λεγόμενη συμβολική γλώσσα. 92 00:04:30,700 --> 00:04:35,210 Στη συνέχεια Clang είναι η μετατροπή αυτής της συναρμολόγησης γλώσσα κάτω σε μηδενικά και μονάδες. 93 00:04:35,210 --> 00:04:38,340 Και αυτή είναι η διαφάνεια που αρχίσαμε συζήτησή μας στην Εβδομάδα 0 για - 94 00:04:38,340 --> 00:04:39,840 και στη συνέχεια για 1 εβδομάδα. 95 00:04:39,840 --> 00:04:44,030 Και τελικά, οι εν λόγω μηδενικά και μονάδες συνδυάζονται με τα μηδενικά και μονάδες 96 00:04:44,030 --> 00:04:47,190 από τις βιβλιοθήκες που έχουμε ήδη λάβει για δεδομένο, όπως Standard I / O ή 97 00:04:47,190 --> 00:04:50,010 Βιβλιοθήκη String ή ακόμα και η CS50 βιβλιοθήκη. 98 00:04:50,010 --> 00:04:54,200 >> Έτσι για να ζωγραφίσει αυτή την εικόνα πιο οπτικά, έχουμε hello.c. 99 00:04:54,200 --> 00:04:57,220 Και αυτό, φυσικά, χρησιμοποιεί την printf λειτουργία να πω, hello world. 100 00:04:57,220 --> 00:05:01,810 Το βήμα σύνταξη παίρνει κάτω για να Αυτό το αρχείο είδαμε hello.s, ακόμη 101 00:05:01,810 --> 00:05:04,290 αν και αυτό είναι συνήθως διαγράφεται αυτόματα για σας. 102 00:05:04,290 --> 00:05:06,050 Αλλά αυτό είναι ο κώδικας συναρμολόγησης στη μέση βαθμίδα. 103 00:05:06,050 --> 00:05:09,750 Και στη συνέχεια, όταν θα συγκεντρώσει το συγκρότημα γλώσσα, να το πω έτσι, που είναι όταν 104 00:05:09,750 --> 00:05:10,830 πάρει εκείνα τα μηδενικά και μονάδες. 105 00:05:10,830 --> 00:05:13,920 Έτσι έχουμε μεγεθύνεται αποτελεσματικά σήμερα αυτό που έχουμε ήδη λάβει ως δεδομένο, 106 00:05:13,920 --> 00:05:16,430 σημαίνει να πηγαίνεις πηγαίο κώδικα από τον αντικειμενικό κώδικα. 107 00:05:16,430 --> 00:05:18,850 >> Αλλά, τέλος, τώρα που η ίδια εικόνα - ας το σπρώξιμο πάνω στο 108 00:05:18,850 --> 00:05:20,020 η αριστερή πλευρά. 109 00:05:20,020 --> 00:05:22,880 Και σημειώστε ότι στην κορυφή υπάρχει Ανέφερα stdio.h. 110 00:05:22,880 --> 00:05:25,030 Αυτό είναι ένα αρχείο που έχουμε συμπεριλάβει σχεδόν σε όλα από τα 111 00:05:25,030 --> 00:05:26,250 προγράμματα που έχουμε γράψει. 112 00:05:26,250 --> 00:05:28,830 Και αυτό είναι το αρχείο του οποίου το περιεχόμενο να επικολληθεί αντίγραφο, 113 00:05:28,830 --> 00:05:30,350 αποτελεσματικά στην κορυφή τον κωδικό σας. 114 00:05:30,350 --> 00:05:34,170 Αλλά αποδεικνύεται ότι, σε έναν υπολογιστή σύστημα κάπου, υπάρχει πιθανώς μια 115 00:05:34,170 --> 00:05:39,150 stdio.c αρχείο που κάποιος έγραψε χρόνια Πριν από αυτό εφαρμόζει όλα τα 116 00:05:39,150 --> 00:05:41,870 λειτουργίες που δηλώθηκαν στο stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Τώρα, στην πραγματικότητα, είναι πιθανόν να μην είναι σε Mac ή το PC σας ή ακόμη και στο 118 00:05:45,465 --> 00:05:47,660 CS50 συσκευή είναι ένα καθαρό κώδικα C. 119 00:05:47,660 --> 00:05:52,710 Κάποιος καταρτίζονται ήδη και περιλαμβάνονται . O αρχείο για τον κωδικό αντικείμενο ή. Ένα 120 00:05:52,710 --> 00:05:56,020 αρχείο, το οποίο αναφέρεται σε μια κοινή βιβλιοθήκη που είναι ήδη προ-εγκατεστημένο και 121 00:05:56,020 --> 00:05:57,240 προ-συγκεντρώθηκε για εσάς. 122 00:05:57,240 --> 00:06:01,950 Αλλά ας υποθέσουμε ότι υπάρχει πράγματι υπάρχει για stdio.c υπολογιστή μας παράλληλα 123 00:06:01,950 --> 00:06:02,650 με Clang. 124 00:06:02,650 --> 00:06:04,960 Ο κωδικός σας είναι καταρτίζονται και συναρμολογούνται. 125 00:06:04,960 --> 00:06:09,200 stdio.c 's code είναι να συγκεντρώνονται και συναρμολογούνται, έτσι ώστε αυτή η τελευταία 126 00:06:09,200 --> 00:06:13,730 βήμα, εδώ κάτω, θα πρέπει με κάποιο τρόπο σύνδεσμο, να το πω έτσι, μηδενικά και μονάδες σας 127 00:06:13,730 --> 00:06:18,430 με του ή της μηδενικά και μονάδες σε ένα απλό πρόγραμμα που είναι τελικά 128 00:06:18,430 --> 00:06:20,540 ονομάζεται απλά Hello. 129 00:06:20,540 --> 00:06:23,340 >> Έτσι, αυτό είναι όλο της μαγείας που είναι έχει συμβεί μέχρι στιγμής. 130 00:06:23,340 --> 00:06:26,430 Και θα συνεχίσει να λαμβάνει αυτά διαδικασίες για δεδομένος, αλλά συνειδητοποιούν 131 00:06:26,430 --> 00:06:28,750 υπάρχει μια πολύ ζουμερές λεπτομέρειες συμβαίνει κάτω από εκεί. 132 00:06:28,750 --> 00:06:31,920 Και αυτό είναι που κάνει σας υπολογιστή με Intel στο εσωτερικό 133 00:06:31,920 --> 00:06:33,940 ιδιαίτερα ξεχωριστή. 134 00:06:33,940 --> 00:06:37,020 >> Έτσι, σε αυτό το σημείωμα, αν θα θέλατε να επικοινωνήστε μαζί μας για μεσημεριανό γεύμα αυτή την Παρασκευή, πηγαίνουν 135 00:06:37,020 --> 00:06:41,570 με τη συνήθη cs50.net/rsvp τόπο, 13:15 αυτή την Παρασκευή. 136 00:06:41,570 --> 00:06:43,400 Και τώρα μερικές ανακοινώσεις. 137 00:06:43,400 --> 00:06:44,670 Έτσι, έχουμε κάποια καλά νέα. 138 00:06:44,670 --> 00:06:45,970 Και έχουμε κάποια άσχημα νέα. 139 00:06:45,970 --> 00:06:47,260 Ξεκινήστε με κάποια καλά νέα εδώ. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Στενάζουν] 142 00:06:54,510 --> 00:06:54,710 >> Εντάξει. 143 00:06:54,710 --> 00:06:56,670 Λοιπόν, αυτό είναι τεχνικά ένα αργία, οπότε δεν είναι τόσο πολύ ένα δώρο από μας. 144 00:06:56,670 --> 00:06:58,030 Στη συνέχεια, όμως τα κακά νέα, φυσικά. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Στενάζουν] 147 00:07:01,880 --> 00:07:03,530 >> Ξόδεψα πολύ χρόνο σε αυτά τα κινούμενα σχέδια. 148 00:07:03,530 --> 00:07:04,690 >> [Γέλια] 149 00:07:04,690 --> 00:07:07,000 >> Θα υπάρξει μια σύνοδος κριτική την προσεχή Δευτέρα. 150 00:07:07,000 --> 00:07:08,340 Είναι πρόκειται να είναι στις 17:30. 151 00:07:08,340 --> 00:07:11,210 Εμείς θα σας θυμίσει όλα αυτά τα στοιχεία μέσω e-mail σχετικά με την πορεία του 152 00:07:11,210 --> 00:07:13,470 website μέσα σε μόλις μια-δυο μέρες. 153 00:07:13,470 --> 00:07:16,610 Θα γυριστεί και διατίθενται λίγο αργότερα. 154 00:07:16,610 --> 00:07:19,200 Έτσι, αν δεν μπορείτε να κάνετε ότι η Δευτέρα υποδοχή βράδυ, μην ανησυχείτε. 155 00:07:19,200 --> 00:07:22,270 Ενότητες την ερχόμενη εβδομάδα θα είναι επίσης επικεντρωθεί στην αναθεώρηση για το κουίζ. 156 00:07:22,270 --> 00:07:25,670 Αν το τμήμα σας είναι τη Δευτέρα, η οποία είναι Πράγματι πανεπιστήμιο διακοπές, θα είμαστε 157 00:07:25,670 --> 00:07:26,920 εξακολουθούν να ανταποκρίνονται στο τμήμα. 158 00:07:26,920 --> 00:07:28,890 Αν απλά δεν μπορεί να κάνει ότι τμήμα, επειδή θα πάμε 159 00:07:28,890 --> 00:07:29,860 μακριά, αυτό είναι εντάξει. 160 00:07:29,860 --> 00:07:33,710 Παρακολουθείστε την Κυριακή ή την Τρίτη τμήματος ή συντονιστείτε-in για το τμήμα του Ιάσονα, η οποία είναι 161 00:07:33,710 --> 00:07:35,110 διαθέσιμα στο διαδίκτυο. 162 00:07:35,110 --> 00:07:37,490 >> Έτσι, περισσότερες κακές ειδήσεις. 163 00:07:37,490 --> 00:07:41,960 Έτσι, σύμφωνα με το αναλυτικό πρόγραμμα, έχουμε διάλεξη την επόμενη Παρασκευή. 164 00:07:41,960 --> 00:07:43,690 Αλλά τα καλά νέα - 165 00:07:43,690 --> 00:07:44,860 σαφώς, πέρασα πάρα πολύ χρόνο σε αυτό. 166 00:07:44,860 --> 00:07:45,280 >> [Γέλια] 167 00:07:45,280 --> 00:07:47,140 >> Θα ακυρώσετε την επόμενη διαλέξεις της Παρασκευής. 168 00:07:47,140 --> 00:07:50,590 Έτσι, αυτό θα είναι ένα δώρο για εμάς, έτσι ώστε να μπορούν πραγματικά να έχουν μια ωραία ανάπαυλα 169 00:07:50,590 --> 00:07:52,990 μεταξύ αυτή την εβδομάδα και δύο εβδομάδες μετά, ως εκ τούτου. 170 00:07:52,990 --> 00:07:57,460 Έτσι, δεν διαλέξεις την επόμενη εβδομάδα, μόνο ένα μικρό μικρό κουίζ, για την οποία θα πρέπει να 171 00:07:57,460 --> 00:07:59,030 όλο και πιο ενθουσιασμένοι. 172 00:07:59,030 --> 00:08:03,870 >> Ας στρέψουμε τώρα την προσοχή μας στο κάτι που είναι πράγματι πιο οπτική 173 00:08:03,870 --> 00:08:06,990 και το πιο συναρπαστικό και να θέσει τις βάσεις για ό, τι πρόκειται να είναι στον ορίζοντα 174 00:08:06,990 --> 00:08:08,420 σε μόλις δύο εβδομάδες. 175 00:08:08,420 --> 00:08:12,160 Μετά το πρώτο κουίζ, θα μετατρέψει το εστίαση των συνόλων πρόβλημά μας σε ένα άλλο 176 00:08:12,160 --> 00:08:16,710 συγκεκριμένους τομείς πρόβλημα, αυτό της εγκληματολογίας και της ασφάλειας γενικότερα. 177 00:08:16,710 --> 00:08:19,550 >> Στην πραγματικότητα, η παράδοση με αυτό το πρόβλημα που είναι για μένα ένα από τα 178 00:08:19,550 --> 00:08:24,850 διδασκαλία τους συναδέλφους ή ΑΠ να περπατήσει σε όλη την πανεπιστημιούπολη, λαμβάνοντας μερικές φωτογραφίες της 179 00:08:24,850 --> 00:08:29,450 αναγνωρίσιμο αλλά όχι προφανείς ανθρώπους, τόπων, πραγμάτων, στη συνέχεια, κάθε χρόνο I 180 00:08:29,450 --> 00:08:34,520 με κάποιο τρόπο καταφέρνουν να διαγράψει κατά λάθος ή να αλλοιώσει το περιεχόμενο της ψηφιακής κάρτας πολυμέσων 181 00:08:34,520 --> 00:08:35,720 αυτό είναι εσωτερικό της φωτογραφικής μηχανής μας. 182 00:08:35,720 --> 00:08:36,860 Αλλά δεν είναι μεγάλη υπόθεση. 183 00:08:36,860 --> 00:08:39,200 Μπορώ να πάω μπροστά και να συνδέσετε ότι στον υπολογιστή μου. 184 00:08:39,200 --> 00:08:43,010 Μπορώ να κάνω μια ιατροδικαστική εικόνα της, έτσι να μιλήσει, αντιγράφοντας τα μηδενικά και 185 00:08:43,010 --> 00:08:46,830 αυτά μακριά από την κάρτα μνήμης, αν μια κάρτα SD ή συμπαγή κάρτα λάμψης ή 186 00:08:46,830 --> 00:08:48,100 ό, τι είστε εξοικειωμένοι με. 187 00:08:48,100 --> 00:08:49,300 Και τότε μπορούμε να χέρι που έξω. 188 00:08:49,300 --> 00:08:53,190 >> Και έτσι η πρόκληση για το μέλλον, μεταξύ άλλων, πράγματα για σας, θα είναι να γράψει 189 00:08:53,190 --> 00:08:58,630 C κώδικα που ανακτά ένα σωρό Αρχεία JPEG για μένα και αποκάλυψε θα είναι 190 00:08:58,630 --> 00:09:00,190 αυτοί οι άνθρωποι, οι τόποι, ή τα πράγματα. 191 00:09:00,190 --> 00:09:03,340 Και θα μιλήσουμε επίσης, σε αυτό το πρόβλημα που και στις μέρες που έρχονται, για 192 00:09:03,340 --> 00:09:04,440 γραφικά γενικότερα. 193 00:09:04,440 --> 00:09:06,140 Έχουμε χρησιμοποιήσει, μια πορεία, για να ξεσπάσει. 194 00:09:06,140 --> 00:09:09,080 Αλλά έχετε είδος θεωρείται δεδομένη υπάρχει αυτές οι υψηλές έννοιες επιπέδου 195 00:09:09,080 --> 00:09:10,680 ορθογώνια και οβάλ. 196 00:09:10,680 --> 00:09:12,450 Αλλά κάτω από το καπό υπάρχουν εικονοστοιχεία. 197 00:09:12,450 --> 00:09:14,370 Και θα έπρεπε να ξεκινήσει σκεφτόμαστε αυτά. 198 00:09:14,370 --> 00:09:18,800 Ή θα είναι για p-set 4 πρέπει να σκεφτούμε για το χάσμα μεταξύ των τούβλων σας, πώς 199 00:09:18,800 --> 00:09:21,990 γρήγορα είστε μπάλα κινείται σε η οθόνη για να ξεσπάσει. 200 00:09:21,990 --> 00:09:24,830 Έτσι, δεν υπάρχει η έννοια της κουκίδες στην οθόνη σας, που είναι 201 00:09:24,830 --> 00:09:26,290 μπαίνουν στο παιχνίδι ήδη. 202 00:09:26,290 --> 00:09:29,430 >> Τώρα τι βλέπετε, όμως, είναι ό, τι μπορείτε να πάρετε σε μια οθόνη υπολογιστή. 203 00:09:29,430 --> 00:09:33,680 Αν έχετε παρακολουθήσει ποτέ κάποια καλή ή κακή τηλεόραση, οι πιθανότητες είναι ότι λίγο πολύ 204 00:09:33,680 --> 00:09:36,280 αντιμετωπίζει το κοινό, όπως technophobes που κάνουν δεν είναι πραγματικά 205 00:09:36,280 --> 00:09:37,630 γνωρίζει πολλά για υπολογιστές. 206 00:09:37,630 --> 00:09:40,840 Και γι 'αυτό είναι πολύ εύκολο για την αστυνομία ντετέκτιβ να πω, μπορεί να σας 207 00:09:40,840 --> 00:09:41,710 καθαρίσει ότι για μένα; 208 00:09:41,710 --> 00:09:42,710 Ή να ενισχύσει, έτσι δεν είναι; 209 00:09:42,710 --> 00:09:45,550 Ενίσχυση είναι σαν το buzz λέξη στον πλέον κάθε έγκλημα που σχετίζονται show. 210 00:09:45,550 --> 00:09:49,240 Και η πραγματικότητα είναι ότι αν πάρετε ένα πολύ θολή εικόνα ενός υπόπτου κάνει 211 00:09:49,240 --> 00:09:51,620 κάτι κακό, δεν μπορείτε να απλά να ενισχυθεί. 212 00:09:51,620 --> 00:09:53,080 Δεν μπορείτε να κάνετε ζουμ σε απείρως. 213 00:09:53,080 --> 00:09:56,350 Δεν μπορείτε να δείτε στη λάμψη του ατόμου ματιών που δεσμεύτηκε ότι 214 00:09:56,350 --> 00:09:59,860 συγκεκριμένο έγκλημα, παρά το γεγονός ότι επικράτηση αυτό στην τηλεόραση. 215 00:09:59,860 --> 00:10:04,110 >> Και έτσι με αυτό ας παρακινήσει ότι επερχόμενη πρόβλημα που με μια ματιά 216 00:10:04,110 --> 00:10:05,765 κάποιες συναυλίες με την οποία θα Ίσως να είναι εξοικειωμένος. 217 00:10:05,765 --> 00:10:06,500 >> [PLAYBACK VIDEO] 218 00:10:06,500 --> 00:10:07,835 >> -Εντάξει. 219 00:10:07,835 --> 00:10:09,956 Τώρα, ας πάρει μια καλή ματιά σε σας. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> It-Hold. 222 00:10:17,766 --> 00:10:18,658 Εκτελέστε ότι πίσω. 223 00:10:18,658 --> 00:10:19,550 >> -Περίμενε ένα λεπτό. 224 00:10:19,550 --> 00:10:21,580 Πηγαίνετε δεξιά. 225 00:10:21,580 --> 00:10:21,800 >> -Υπάρχει. 226 00:10:21,800 --> 00:10:22,690 Πάγωμα αυτό. 227 00:10:22,690 --> 00:10:23,692 >> -Πλήρης οθόνη. 228 00:10:23,692 --> 00:10:23,846 >> -Εντάξει. 229 00:10:23,846 --> 00:10:24,154 Πάγωμα αυτό. 230 00:10:24,154 --> 00:10:25,140 >> -Σφίξτε πάνω σε αυτό, θα ya; 231 00:10:25,140 --> 00:10:27,090 >> -Vector μέσα σε εκείνο τον τύπο από τον πίσω τροχό. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom στο δεξί εδώ σε αυτό το σημείο. 233 00:10:29,730 --> 00:10:33,700 >> -Με το σωστό εξοπλισμό, το είδωλό μπορεί να διευρυνθεί και ακονισμένα. 234 00:10:33,700 --> 00:10:34,490 >> -Τι είναι αυτό; 235 00:10:34,490 --> 00:10:35,870 >> -Είναι ένα πρόγραμμα βελτίωσης. 236 00:10:35,870 --> 00:10:36,793 >> -Μπορείς να σαφές ότι μέχρι κάποια; 237 00:10:36,793 --> 00:10:38,560 >> -Δεν ξέρω. 238 00:10:38,560 --> 00:10:39,090 Ας το ενισχύσει. 239 00:10:39,090 --> 00:10:41,690 >> -Ενίσχυση του τμήματος Α-6. 240 00:10:41,690 --> 00:10:43,510 >> -Θα ενισχυθεί η λεπτομέρεια και - 241 00:10:43,510 --> 00:10:44,456 >> -Νομίζω ότι υπάρχει αρκετή για να ενισχύσει. 242 00:10:44,456 --> 00:10:45,402 Αφήστε το στην οθόνη μου. 243 00:10:45,402 --> 00:10:47,300 >> -Να ενισχυθεί η αντανάκλαση στο μάτι της. 244 00:10:47,300 --> 00:10:49,330 >> -Ας τρέξουμε αυτό μέσω βελτίωσης βίντεο. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, μπορείτε να βελτιώσετε αυτό; 246 00:10:50,340 --> 00:10:52,320 >> -Περίμενε. 247 00:10:52,320 --> 00:10:54,290 >> -Έχω εργαστεί σε αυτό τον προβληματισμό. 248 00:10:54,290 --> 00:10:55,560 >> -Κάποιος τον προβληματισμό του. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Υπάρχει μια αντανάκλαση του προσώπου του ανθρώπου. 251 00:10:57,940 --> 00:10:58,860 >> -Η αντανάκλαση. 252 00:10:58,860 --> 00:10:59,710 >> -Υπάρχει μια αντανάκλαση. 253 00:10:59,710 --> 00:11:00,900 >> -Ζουμ σε καθρέφτη. 254 00:11:00,900 --> 00:11:03,500 >> -Μπορείτε να δείτε μια αντανάκλαση. 255 00:11:03,500 --> 00:11:04,700 >> -Μπορείς να ενισχύσει την εικόνα από εδώ; 256 00:11:04,700 --> 00:11:05,700 >> -Μπορείς να τον ενισχύσει εδώ; 257 00:11:05,700 --> 00:11:06,500 >> -Μπορείς να το ενισχύσει; 258 00:11:06,500 --> 00:11:07,380 >> -Μπορείς να το ενισχύσει; 259 00:11:07,380 --> 00:11:08,190 >> -Μπορούμε να ενισχύσουμε αυτό; 260 00:11:08,190 --> 00:11:08,940 >> -Μπορείς να το ενισχύσει; 261 00:11:08,940 --> 00:11:10,280 >> -Περίμενε ένα δεύτερο, θα ενισχυθεί. 262 00:11:10,280 --> 00:11:11,570 >> -Ζουμ σε πόρτα. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Γέλια] 266 00:11:13,197 --> 00:11:14,360 >> -Μετακίνηση μέσα 267 00:11:14,360 --> 00:11:15,100 >> -Περίμενε, να σταματήσει. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> It-Παύση. 270 00:11:16,290 --> 00:11:19,390 >> -Περιστροφή 75 μοίρες γύρω από η κατακόρυφη παρακαλώ. 271 00:11:19,390 --> 00:11:19,886 >> [Γέλια] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, και πίσω στο τμήμα για την πόρτα και πάλι. 273 00:11:24,350 --> 00:11:26,330 >> -Έχεις μια εικόνα ενισχυτή που μπορεί να bitmap; 274 00:11:26,330 --> 00:11:28,990 >> -Ίσως μπορούμε να χρησιμοποιήσουμε το Pradeep Sen μέθοδος για να δείτε μέσα από τα παράθυρα. 275 00:11:28,990 --> 00:11:30,680 >> -Αυτό το λογισμικό είναι state of the art. 276 00:11:30,680 --> 00:11:31,676 >> -Η αξία εικονίδιο είναι μακριά. 277 00:11:31,676 --> 00:11:34,166 >> -Με το σωστό συνδυασμό των αλγορίθμων. 278 00:11:34,166 --> 00:11:38,399 >> -Έχει ληφθεί αλγόριθμοι φωτισμού σε το επόμενο επίπεδο και μπορώ να τα χρησιμοποιούν για να 279 00:11:38,399 --> 00:11:38,648 να ενισχύσει αυτήν την φωτογραφία. 280 00:11:38,648 --> 00:11:42,050 >> -Lock και να διευρύνει το z-άξονα. 281 00:11:42,050 --> 00:11:42,760 >> -Ενίσχυση της. 282 00:11:42,760 --> 00:11:43,060 >> -Ενίσχυση της. 283 00:11:43,060 --> 00:11:43,760 >> -Ενίσχυση της. 284 00:11:43,760 --> 00:11:45,010 >> -Πάγωμα και να ενισχυθεί. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [PLAYBACK VIDEO END] 287 00:11:47,910 --> 00:11:51,470 >> David J. MALAN: Έτσι Set Πρόβλημα 5 είναι ό, τι βρίσκεται μπροστά μας εκεί. 288 00:11:51,470 --> 00:11:55,260 Έτσι, θα πάρει σύντομα μια καλύτερη κατανόηση από πότε και γιατί μπορείτε να 289 00:11:55,260 --> 00:11:57,300 και μας δεν μπορεί να ενισχύσει με αυτόν τον τρόπο. 290 00:11:57,300 --> 00:12:00,090 Αλλά πρώτα, ας επιστρέψουν την προσοχή μας σε μερικά από τα δομικά στοιχεία που θα 291 00:12:00,090 --> 00:12:02,250 πρέπει να είναι σε θέση να πει την ιστορία. 292 00:12:02,250 --> 00:12:05,580 >> Έτσι, υπενθυμίζουν ότι επέστησε αυτή την εικόνα για Δευτέρας και λίγο την περασμένη εβδομάδα. 293 00:12:05,580 --> 00:12:09,970 Και αυτό περιγράφει τη διάταξη των πραγμάτων στη μνήμη του υπολογιστή σας όταν 294 00:12:09,970 --> 00:12:11,000 τρέχει κάποιο πρόγραμμα. 295 00:12:11,000 --> 00:12:14,310 Η τεχνολογία τμήμα επάνω στην κορυφή, ανάκληση, αναφέρεται με τις πραγματικές μηδενικά και μονάδες 296 00:12:14,310 --> 00:12:16,000 που συνθέτουν το πρόγραμμά σας. 297 00:12:16,000 --> 00:12:19,340 Εκεί, κάτω από αυτό, ορισμένοι προετοιμαστεί ή Αγνωστο δεδομένα, τα οποία κατά κανόνα 298 00:12:19,340 --> 00:12:22,910 αναφέρεται σε πράγματα όπως σταθερές ή χορδές ή καθολικές μεταβλητές που έχουν 299 00:12:22,910 --> 00:12:24,200 έχουν δηλωθεί εκ των προτέρων. 300 00:12:24,200 --> 00:12:26,500 Υπάρχει το σωρό, αλλά θα έρθει επανέλθω σε αυτό σε λίγο. 301 00:12:26,500 --> 00:12:27,410 >> Και έπειτα υπάρχει η στοίβα. 302 00:12:27,410 --> 00:12:30,660 Σαν μια στοίβα των δίσκων στην καφετέρια, αυτό είναι όπου η μνήμη παίρνει 303 00:12:30,660 --> 00:12:33,610 στρώσεις και στρώσεις όποτε θα κάνουμε ό, τι σε ένα πρόγραμμα; 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Ποια είναι η στοίβα χρήση; 306 00:12:37,730 --> 00:12:39,320 >> Ναι; 307 00:12:39,320 --> 00:12:40,000 >> Πρόσκληση της λειτουργίας. 308 00:12:40,000 --> 00:12:42,890 Κάθε φορά που θα καλέσετε μια συνάρτηση, είναι δοθεί στην λωρίδα της μνήμης της 309 00:12:42,890 --> 00:12:45,020 τοπικές μεταβλητές ή τις παραμέτρους της. 310 00:12:45,020 --> 00:12:48,810 Και εικονογραφικά, βλέπουμε ότι με κάθε διαδοχική λειτουργία που ονομάζεται, όταν το Α 311 00:12:48,810 --> 00:12:52,520 κλήσεις καλεί τον Β Γ Δ κλήσεις, που παίρνουν στρώσεις πάνω στη στοίβα. 312 00:12:52,520 --> 00:12:55,630 Και σε καθεμία από τις φέτες μνήμη είναι ουσιαστικά ένα μοναδικό πεδίο 313 00:12:55,630 --> 00:12:58,590 για την εν λόγω λειτουργία, η οποία, φυσικά, είναι προβληματική, αν θέλετε να το χέρι 314 00:12:58,590 --> 00:13:01,850 από τη μία λειτουργία στην άλλη Ένα κομμάτι των δεδομένων που θέλετε 315 00:13:01,850 --> 00:13:03,500 να μεταλλαχθεί ή να αλλάξετε. 316 00:13:03,500 --> 00:13:08,060 >> Λοιπόν, τι ήταν η λύση μας να μπορέσει Μια λειτουργία αντιπροσωπεύεται από ένα stack 317 00:13:08,060 --> 00:13:11,390 πλαίσιο για να αλλάξετε τη μνήμη μέσα άλλου πλαισίου στοίβας; 318 00:13:11,390 --> 00:13:14,590 Πώς να κάνει αυτά τα δύο μιλάμε ο ένας στον άλλο; 319 00:13:14,590 --> 00:13:18,510 Έτσι, μέσω των δεικτών ή διευθύνσεις, η οποία, και πάλι, απλά περιγράφουν όπου 320 00:13:18,510 --> 00:13:22,280 μνήμη, μέσω ενός ειδικού Αριθμός δάγκωμα, το συγκεκριμένο 321 00:13:22,280 --> 00:13:23,830 αξία μπορεί να βρεθεί. 322 00:13:23,830 --> 00:13:26,860 Έτσι θυμηθούμε την τελευταία φορά πάρα πολύ συνεχίσαμε την ιστορία και κοίταξε ένα 323 00:13:26,860 --> 00:13:28,280 αρκετά λάθη πρόγραμμα. 324 00:13:28,280 --> 00:13:32,900 Και αυτό το πρόγραμμα είναι buggy για λίγους λόγους, αλλά το πιο ανησυχητικό είναι το ένα 325 00:13:32,900 --> 00:13:34,620 επειδή αποτυγχάνει να ελέγξει τι; 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ναι, αποτυγχάνει να ελέγξει την είσοδο. 328 00:13:40,450 --> 00:13:41,870 Συγγνώμη; 329 00:13:41,870 --> 00:13:43,880 >> Αν είναι πάνω από 12 χαρακτήρες. 330 00:13:43,880 --> 00:13:47,260 Έτσι, πολύ έξυπνα, όταν καλείτε memcopy, η οποία, όπως υποδηλώνει το όνομα, απλά 331 00:13:47,260 --> 00:13:50,630 αντίγραφα μνήμης από το δεύτερο επιχείρημά της στο πρώτο επιχείρημά της. 332 00:13:50,630 --> 00:13:54,730 Το τρίτο επιχείρημα, πολύ έξυπνα, είναι ελέγχονται για να βεβαιωθείτε ότι δεν έχετε 333 00:13:54,730 --> 00:13:59,400 αντιγράψετε περισσότερα από ό, τι, σε αυτή την περίπτωση, το μήκος του μπαρ, τον αριθμό των χαρακτήρων, 334 00:13:59,400 --> 00:14:03,810 στο προορισμού, η οποία είναι αυτή συστοιχία C. Αλλά το πρόβλημα είναι ότι ό, τι 335 00:14:03,810 --> 00:14:07,230 αν C μόνη της δεν είναι αρκετά μεγάλη να χειριστεί αυτό; 336 00:14:07,230 --> 00:14:09,900 Θα πάμε να αντιγράψετε τον αριθμό των bytes που σας έχει δοθεί. 337 00:14:09,900 --> 00:14:13,040 Αλλά τι στην πραγματικότητα έχουν περισσότερο bytes από ό, τι έχετε χώρο για; 338 00:14:13,040 --> 00:14:16,770 >> Λοιπόν, αυτό το πρόγραμμα είναι πολύ ανόητα μόνο τυφλά προχωρά να πάρει ό, τι είναι 339 00:14:16,770 --> 00:14:20,650 δεδομένη, γεια backslash 0 είναι μεγάλη, αν string είναι μικρή 340 00:14:20,650 --> 00:14:22,040 αρκετά, όπως και πέντε χαρακτήρες. 341 00:14:22,040 --> 00:14:26,470 Αλλά αν είναι πραγματικά ή 12 χαρακτήρες 1.200 χαρακτήρες, είδαμε την τελευταία φορά 342 00:14:26,470 --> 00:14:29,380 ότι είστε ακριβώς πρόκειται να εντελώς αντικαταστήσετε τη μνήμη που 343 00:14:29,380 --> 00:14:30,470 δεν ανήκουν σε σας. 344 00:14:30,470 --> 00:14:34,390 Και χειρότερη περίπτωση, αν αντικαταστήσετε ότι κόκκινο τμήμα εκεί που ονομάζεται 345 00:14:34,390 --> 00:14:35,380 διεύθυνση επιστροφής - 346 00:14:35,380 --> 00:14:38,370 Αυτό είναι ακριβώς όπου ο υπολογιστής αυτόματα, για σένα, πίσω από το 347 00:14:38,370 --> 00:14:43,130 σκηνές, σβήνει τα 32-bit, η οποία υπενθυμίζει ότι σε ό, τι διεύθυνση θα έπρεπε 348 00:14:43,130 --> 00:14:47,080 επιστρέψει όταν foo, αυτή η άλλη λειτουργία, γίνεται εκτέλεσης. 349 00:14:47,080 --> 00:14:49,320 Είναι μια ψίχα ψωμιού των ειδών στο οποίο επιστρέφει. 350 00:14:49,320 --> 00:14:52,490 Αν αντικαταστήσετε ότι, ενδεχομένως, αν είσαι ο κακός, θα μπορούσε να 351 00:14:52,490 --> 00:14:54,750 ενδεχομένως να αναλάβει υπολογιστή κάποιου. 352 00:14:54,750 --> 00:14:58,020 Και θα είστε πιο σίγουρα συντριβή που στις περισσότερες περιπτώσεις. 353 00:14:58,020 --> 00:15:01,690 >> Τώρα αυτό το πρόβλημα επιτείνεται περαιτέρω όπως αρχίσαμε να μιλάμε για τη μνήμη 354 00:15:01,690 --> 00:15:03,010 διαχείρισης γενικότερα. 355 00:15:03,010 --> 00:15:07,150 Και malloc, για την κατανομή της μνήμης, είναι μια λειτουργία που μπορούμε να χρησιμοποιήσουμε για να διαθέσει 356 00:15:07,150 --> 00:15:11,260 μνήμη όταν δεν γνωρίζουμε εκ των προτέρων ότι ίσως χρειαστεί κάποια. 357 00:15:11,260 --> 00:15:13,960 Έτσι, για παράδειγμα, αν πάω πίσω στη συσκευή εδώ. 358 00:15:13,960 --> 00:15:21,010 Και έχω ανοίξει από τον περασμένο hello2.c φορά, θυμηθούμε αυτό το πρόγραμμα εδώ, η οποία εξέτασε 359 00:15:21,010 --> 00:15:23,500 λίγο κάτι σαν αυτό, μόλις τρεις γραμμές - 360 00:15:23,500 --> 00:15:27,940 αναφέρετε το όνομά σας, τότε το όνομα string, στα αριστερά, ισούται GetString. 361 00:15:27,940 --> 00:15:29,690 Και τότε μπορούμε να το εκτυπώσετε, το όνομα του χρήστη. 362 00:15:29,690 --> 00:15:31,170 >> Έτσι, αυτό ήταν ένα εξαιρετικά απλό πρόγραμμα. 363 00:15:31,170 --> 00:15:34,870 Για να είμαι σαφής, επιτρέψτε μου να πάμε μπροστά και να κάνει γεια-2. 364 00:15:34,870 --> 00:15:36,680 Πάω να κάνω dot κάθετος γεια-2. 365 00:15:36,680 --> 00:15:37,750 Δηλώστε το όνομά σας - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Γεια σου David. 369 00:15:39,540 --> 00:15:41,060 Φαίνεται να λειτουργεί ΟΚ. 370 00:15:41,060 --> 00:15:43,140 Αλλά τι πραγματικά συμβαίνει κάτω από το καπό εδώ; 371 00:15:43,140 --> 00:15:44,670 Πρώτα ας φλούδα πίσω ορισμένων στρωμάτων. 372 00:15:44,670 --> 00:15:48,380 String είναι απλά ένα συνώνυμο έχουμε συνειδητοποιήσει για τι; 373 00:15:48,380 --> 00:15:49,110 Char αστέρων. 374 00:15:49,110 --> 00:15:52,740 Ας κάνουμε λίγο πιο απόκρυφες αλλά πιο τεχνικά σωστό ότι αυτό 375 00:15:52,740 --> 00:15:55,570 είναι μια χαρα αστέρι, πράγμα που σημαίνει ότι το όνομα, ναι, είναι μια μεταβλητή. 376 00:15:55,570 --> 00:15:59,920 Αλλά τι αποθηκεύει το όνομα είναι η διεύθυνση του μια χαρα, το οποίο αισθάνεται λίγο περίεργα 377 00:15:59,920 --> 00:16:01,050 επειδή είμαι πάρει πίσω ένα string. 378 00:16:01,050 --> 00:16:03,580 Είμαι πάρει πίσω πολλαπλά χαρακτήρες δεν είναι μια χαρα. 379 00:16:03,580 --> 00:16:07,400 >> Αλλά φυσικά, θα χρειαστείτε μόνο το πρώτο Διεύθυνση char να θυμάστε, όπου η 380 00:16:07,400 --> 00:16:08,870 ολόκληρη σειρά είναι επειδή ο λόγος; 381 00:16:08,870 --> 00:16:12,700 Πώς θα καταλάβω πού το τέλος του το string είναι να γνωρίζουμε την αρχή; 382 00:16:12,700 --> 00:16:13,630 Το μηδέν backslash. 383 00:16:13,630 --> 00:16:17,260 Έτσι, με τις δύο αυτές ενδείξεις θα καταλάβω πριν από την έναρξη και το τέλος της 384 00:16:17,260 --> 00:16:20,280 οποιαδήποτε σειρά είναι, εφ 'όσον είναι κατάλληλα διαμορφωμένο με το null 385 00:16:20,280 --> 00:16:22,110 τερματισμού, ότι η μηδενική backslash. 386 00:16:22,110 --> 00:16:24,520 >> Αλλά αυτό είναι καλώντας GetString. 387 00:16:24,520 --> 00:16:28,020 Και αποδεικνύεται ότι GetString όλο αυτό το διάστημα ήταν το είδος της 388 00:16:28,020 --> 00:16:28,820 εξαπάτηση για εμάς. 389 00:16:28,820 --> 00:16:32,460 Είναι ήδη κάνει αυτή την εργασία, να είστε σίγουροι, να πάρει μια σειρά από το χρήστη. 390 00:16:32,460 --> 00:16:34,580 Αλλά πού είναι ότι η μνήμη έχουν προέρχονται από; 391 00:16:34,580 --> 00:16:38,440 Αν πάμε πίσω στην εικόνα που εδώ και εφαρμόσουν τον ορισμό από ακριβώς ένα 392 00:16:38,440 --> 00:16:42,610 πριν από λίγο, ότι η στοίβα είναι εκεί όπου μνήμη πηγαίνει όταν οι λειτουργίες καλούνται, 393 00:16:42,610 --> 00:16:45,370 από αυτή τη λογική, όταν καλείτε GetString, και στη συνέχεια να πληκτρολογήσετε 394 00:16:45,370 --> 00:16:50,900 Ϋ-Α-V-Ι-ϋ Enter, όπου είναι D-Α-V-Ι-ϋ backslash μηδέν αποθηκεύονται, με βάση το 395 00:16:50,900 --> 00:16:53,480 την ιστορία που έχουμε μας είπε τώρα; 396 00:16:53,480 --> 00:16:55,190 >> Φαίνεται να είναι σε η στοίβα, έτσι δεν είναι; 397 00:16:55,190 --> 00:16:58,120 Όταν καλείτε να πάρει σειρά σας να πάρετε μια μικρό κομμάτι της μνήμης στη στοίβα. 398 00:16:58,120 --> 00:17:01,630 Έτσι στέκεται στο λόγο ότι η D-A-V-I-D backslash μηδέν αποθηκεύεται 399 00:17:01,630 --> 00:17:02,770 εκεί στη στοίβα. 400 00:17:02,770 --> 00:17:07,680 Αλλά περιμένετε ένα λεπτό, GetString αποδόσεις ότι string, να το πω έτσι, που σημαίνει 401 00:17:07,680 --> 00:17:11,700 Είναι δίσκο από την καφετέρια έχει ληφθεί από τη στοίβα. 402 00:17:11,700 --> 00:17:14,560 Και είπαμε και την προηγούμενη φορά ότι μόλις ένα συνάρτηση επιστρέφει, και παίρνετε ότι 403 00:17:14,560 --> 00:17:20,109 δίσκο, να το πω έτσι, από τη στοίβα, ποιο μπορείτε να υποθέσουμε για τα απομεινάρια του 404 00:17:20,109 --> 00:17:21,819 ότι η μνήμη; 405 00:17:21,819 --> 00:17:25,160 I είδος τους επανασχεδίαζε ως ερωτηματικά επειδή ουσιαστικά γίνει 406 00:17:25,160 --> 00:17:26,250 άγνωστες τιμές. 407 00:17:26,250 --> 00:17:29,500 Μπορούν να επαναχρησιμοποιηθούν όταν κάποια επόμενη λειτουργία ονομάζεται. 408 00:17:29,500 --> 00:17:31,870 >> Με άλλα λόγια, αν συμβεί να αποθήκευση - 409 00:17:31,870 --> 00:17:34,350 Θα τραβήξω μια γρήγορη εικόνα εδώ της στοίβας. 410 00:17:34,350 --> 00:17:38,690 Αν τυχαίνει να εφιστά την κάτω του τμήματος μνήμη μου, και εμείς θα πούμε 411 00:17:38,690 --> 00:17:42,230 ότι αυτό είναι το μέρος της μνήμης καταλαμβάνεται από τους κύριους και ίσως arg c και 412 00:17:42,230 --> 00:17:46,790 arg v και οτιδήποτε άλλο στο πρόγραμμα, όταν GetString ονομάζεται, 413 00:17:46,790 --> 00:17:51,120 προφανώς GetString παίρνει ένα μεγάλο κομμάτι της μνήμης εδώ. 414 00:17:51,120 --> 00:17:53,940 Και στη συνέχεια, ϋ-Α-V-Ι-ϋ κάπως καταλήγει σε αυτή τη λειτουργία. 415 00:17:53,940 --> 00:17:55,320 Και Πάω να υπεραπλουστεύσω. 416 00:17:55,320 --> 00:18:00,050 Αλλά ας υποθέσουμε ότι της D-A-V-I-D backslash μηδέν. 417 00:18:00,050 --> 00:18:03,500 Έτσι είναι αυτό το πολλά bytes που χρησιμοποιούνται σε το πλαίσιο για την GetString. 418 00:18:03,500 --> 00:18:08,270 >> Αλλά το συντομότερο GetString αποδόσεις, εμείς είπα την τελευταία φορά που αυτή η μνήμη πάνω 419 00:18:08,270 --> 00:18:11,340 εδώ όλα γίνεται - woops! - 420 00:18:11,340 --> 00:18:14,270 όλα γίνεται αποτελεσματικά διαγράφονται. 421 00:18:14,270 --> 00:18:17,220 Και μπορούμε να σκεφτούμε αυτό τώρα ως ερώτημα σημάτων, διότι ποιος ξέρει 422 00:18:17,220 --> 00:18:18,720 τι πρόκειται να γίνει από αυτήν τη μνήμη. 423 00:18:18,720 --> 00:18:22,130 Πράγματι, πολύ συχνά καλούν συναρτήσεις εκτός από GetString. 424 00:18:22,130 --> 00:18:24,750 Και μόλις καλώ κάποια άλλη λειτουργία από GetString, ίσως όχι σε 425 00:18:24,750 --> 00:18:28,860 το συγκεκριμένο πρόγραμμα που μόλις είδαμε αλλά σε κάποια άλλη, σίγουρα κάποιο άλλο 426 00:18:28,860 --> 00:18:34,180 η λειτουργία θα μπορούσε να καταλήξει να δοθεί Αυτό το επόμενο σημείο στη στοίβα. 427 00:18:34,180 --> 00:18:39,410 >> Γι 'αυτό δεν μπορεί να είναι ότι GetString καταστήματα D-Α-V-I-D στη στοίβα, γιατί θα 428 00:18:39,410 --> 00:18:41,040 αμέσως χάσετε την πρόσβαση σε αυτό. 429 00:18:41,040 --> 00:18:43,720 Αλλά ξέρουμε ότι GetString επιστρέφει μόνο τι; 430 00:18:43,720 --> 00:18:47,220 Δεν είναι επιστρέφουν με έξι χαρακτήρες. 431 00:18:47,220 --> 00:18:51,090 Τι είναι αυτό που πραγματικά έκανε την επιστροφή καταλήγουμε στο συμπέρασμα τελευταία φορά; 432 00:18:51,090 --> 00:18:52,480 Η διεύθυνση του πρώτου. 433 00:18:52,480 --> 00:18:56,650 Έτσι, κατά κάποιο τρόπο, όταν καλείται GetString, είναι κατανομή ένα κομμάτι της μνήμης για 434 00:18:56,650 --> 00:18:59,620 η σειρά που ο τύπος τους χρήστες και στη συνέχεια επιστρέφει τη διεύθυνση του. 435 00:18:59,620 --> 00:19:02,930 Και αποδεικνύεται ότι όταν θέλετε να λειτουργούν για την εκχώρηση μνήμης σε αυτό 436 00:19:02,930 --> 00:19:08,390 τρόπο και την επιστροφή προς το πρόσωπο που καλείται ότι η λειτουργία, η διεύθυνση της 437 00:19:08,390 --> 00:19:11,870 αυτό το κομμάτι της μνήμης, θα πρέπει οπωσδήποτε δεν μπορεί να τεθεί σε στοίβας του 438 00:19:11,870 --> 00:19:14,750 κάτω, γιατί λειτουργικά είναι απλά πρόκειται να μην γίνει δική σας πολύ 439 00:19:14,750 --> 00:19:17,800 γρήγορα, ώστε να μπορείτε να μαντέψετε, όπου θα πρόκειται πιθανώς για να το πετάξετε 440 00:19:17,800 --> 00:19:20,130 Αντ 'αυτού, η λεγόμενη σωρού. 441 00:19:20,130 --> 00:19:25,290 >> Έτσι, μεταξύ του πυθμένα της μνήμης σας διάταξη και η κορυφή της μνήμης σας 442 00:19:25,290 --> 00:19:26,820 διάταξης είναι ένα σωρό τμήματα. 443 00:19:26,820 --> 00:19:29,270 Η μία είναι η στοίβα, και δεξιά παραπάνω, είναι ο σωρός. 444 00:19:29,270 --> 00:19:33,680 Και σωρού είναι απλά ένα διαφορετικό κομμάτι της μνήμης που δεν χρησιμοποιείται για τις λειτουργίες 445 00:19:33,680 --> 00:19:34,770 όταν το λένε. 446 00:19:34,770 --> 00:19:38,100 Είναι χρησιμοποιείται για τη μακροπρόθεσμη μνήμη, όταν θέλετε μια λειτουργία για να αρπάξει μερικά 447 00:19:38,100 --> 00:19:42,700 μνήμη και να είναι σε θέση να κρεμάσει προς το χωρίς να χάσει τον έλεγχό του. 448 00:19:42,700 --> 00:19:45,550 >> Τώρα, θα μπορούσατε ίσως αμέσως δούμε ότι αυτό δεν είναι 449 00:19:45,550 --> 00:19:48,060 απαραιτήτως ένα τέλειο σχεδιασμό. 450 00:19:48,060 --> 00:19:51,350 Καθώς το πρόγραμμά σας τη μνήμη κατανέμεται εξ η στοίβα, ή να καλέσετε περισσότερες και 451 00:19:51,350 --> 00:19:55,540 περισσότερες λειτουργίες, ή να διαθέσουν μνήμη στο σωρό με τη malloc μακριά ως 452 00:19:55,540 --> 00:20:00,690 GetString κάνει, ό, τι σαφώς φαίνεται να είναι αναπόφευκτο πρόβλημα; 453 00:20:00,690 --> 00:20:00,860 >> Δεξιά. 454 00:20:00,860 --> 00:20:03,150 Όπως και το γεγονός ότι αυτά τα βέλη βλέπουν η μία την άλλη 455 00:20:03,150 --> 00:20:04,380 δεν αποτελεί καλό οιωνό. 456 00:20:04,380 --> 00:20:08,630 Και πράγματι, θα μπορούσε πολύ γρήγορα να καταρρεύσει ένα πρόγραμμα σε οποιοδήποτε αριθμό από τρόπους. 457 00:20:08,630 --> 00:20:12,050 Στην πραγματικότητα, πιστεύω ότι μπορεί να έχουμε κάνει αυτό το λάθος μια φορά. 458 00:20:12,050 --> 00:20:14,020 Ή αν όχι, ας το κάνουμε σκόπιμα τώρα. 459 00:20:14,020 --> 00:20:21,330 Επιτρέψτε μου να πάμε μπροστά και να γράφουν σούπερ γρήγορα ένα πρόγραμμα που ονομάζεται dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Και τώρα θα πάω εδώ και δεν απότομη περιλαμβάνουν stdio.h. 461 00:20:26,730 --> 00:20:32,620 Ας δηλώσει συνάρτηση foo παίρνει δεν υπάρχουν επιχειρήματα, τα οποία είναι 462 00:20:32,620 --> 00:20:34,040 συμβολίζεται καθώς και από άκυρα. 463 00:20:34,040 --> 00:20:37,830 >> Και το μόνο πράγμα foo πρόκειται να κάνουμε είναι να κλήση foo, ο οποίος κατά πάσα πιθανότητα δεν είναι η 464 00:20:37,830 --> 00:20:39,100 πιο έξυπνο ιδέα, αλλά ας είναι. 465 00:20:39,100 --> 00:20:40,490 Ent κύριο κενό. 466 00:20:40,490 --> 00:20:45,270 Τώρα το μόνο πράγμα κύρια πρόκειται να κάνετε είναι να καλέσετε foo, καθώς και. 467 00:20:45,270 --> 00:20:51,050 Και μόνο για πλάκα, είμαι πρόκειται να πάει μπροστά εδώ και να πω printf "Γεια σας από 468 00:20:51,050 --> 00:20:52,340 foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Έτσι, αν δεν είχα κάνει κάποια λάθη, Κάντε dontdothis dot κάθετος. 471 00:21:00,160 --> 00:21:01,960 Και ας το κάνουμε σε ένα μεγαλύτερο παράθυρο - 472 00:21:01,960 --> 00:21:03,210 dot κάθετος, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Έλα. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Προφανώς, μπορείτε να το κάνετε αυτό. 478 00:21:13,100 --> 00:21:15,190 Γαμώτο. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Περιμένετε. 481 00:21:16,580 --> 00:21:17,370 Αναμείνατε. 482 00:21:17,370 --> 00:21:18,270 Μήπως εμείς - 483 00:21:18,270 --> 00:21:20,110 Κάναμε το χρησιμοποιήσετε με κάνει. 484 00:21:20,110 --> 00:21:22,050 >> [Αναστενάζει] 485 00:21:22,050 --> 00:21:25,110 >> Το ξέρω, αλλά πιστεύω ότι εμείς Μόλις διέγραψα αυτό. 486 00:21:25,110 --> 00:21:28,410 Χμ, ναι. 487 00:21:28,410 --> 00:21:30,660 Γαμώτο. 488 00:21:30,660 --> 00:21:32,640 Λύστε αυτό Rob. 489 00:21:32,640 --> 00:21:34,678 Τι; 490 00:21:34,678 --> 00:21:35,928 Είναι πολύ απλό. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ναι, γυρίσαμε τη βελτιστοποίηση off. 493 00:21:47,360 --> 00:21:48,970 OK, στέκονται αντίο. 494 00:21:48,970 --> 00:21:49,950 Τώρα νιώθω καλύτερα. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Εντάξει. 497 00:21:51,780 --> 00:21:53,430 >> Οπότε ας μεταγλωττίσετε αυτό - 498 00:21:53,430 --> 00:21:55,880 Να σας dontdothis. 499 00:21:55,880 --> 00:22:00,090 Ίσως χρειαστεί να μετονομάσετε αυτό dothis.c ακριβώς σε μια στιγμή. 500 00:22:00,090 --> 00:22:00,710 Εκεί πάμε. 501 00:22:00,710 --> 00:22:01,240 Σας ευχαριστώ. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Έτσι, το γεγονός ότι ήμουν εκτύπωση κάτι ήταν στην πραγματικότητα μόνο 504 00:22:05,480 --> 00:22:08,150 επιβραδύνουν τη διαδικασία με την οποία θα έχουμε φτάσει σε αυτό το σημείο. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Φτου! 507 00:22:08,870 --> 00:22:11,180 >> Έτσι, αυτό που πραγματικά συμβαίνει; 508 00:22:11,180 --> 00:22:14,440 Ο λόγος που υπάρχει, ακριβώς όπως ένα μέρος, είναι κάνει τίποτα όσον αφορά τις εισροές και 509 00:22:14,440 --> 00:22:17,270 παραγωγή τείνει να είναι πιο αργή, επειδή πρέπει να γράψετε τους χαρακτήρες στο 510 00:22:17,270 --> 00:22:18,600 οθόνη, θα πρέπει να μετακινηθείτε. 511 00:22:18,600 --> 00:22:21,720 Έτσι, τα πολυλογώ, είχα πραγματικά συνέβη τόσο ανυπόμονος, θα έχουμε 512 00:22:21,720 --> 00:22:23,260 δει αυτό το τελικό αποτέλεσμα, καθώς και. 513 00:22:23,260 --> 00:22:26,220 Τώρα που πήρα βόλτα του print-ups, θα το δείτε αμέσως. 514 00:22:26,220 --> 00:22:28,410 Γιατί λοιπόν συμβαίνει αυτό. 515 00:22:28,410 --> 00:22:31,300 Λοιπόν, η απλή εξήγηση, φυσικά, είναι ότι foo κατά πάσα πιθανότητα δεν θα πρέπει να 516 00:22:31,300 --> 00:22:32,500 να είναι η ίδια κλήση. 517 00:22:32,500 --> 00:22:34,470 >> Τώρα, σε γενικούς όρους, αυτή είναι η αναδρομή. 518 00:22:34,470 --> 00:22:36,970 Και σκεφτήκαμε μερικές εβδομάδες Πριν από αναδρομικές είναι καλό. 519 00:22:36,970 --> 00:22:40,330 Αναδρομή είναι αυτό το μαγικό τρόπο εκφράζοντας τον εαυτό σας super λακωνικά. 520 00:22:40,330 --> 00:22:41,400 Και απλά λειτουργεί. 521 00:22:41,400 --> 00:22:45,060 Αλλά υπάρχει ένα βασικό χαρακτηριστικό όλων των οι αναδρομικές προγράμματα έχουμε μιλήσει 522 00:22:45,060 --> 00:22:48,260 περίπου και κοίταξε μέχρι σήμερα, η οποία ήταν ότι είχαν τι; 523 00:22:48,260 --> 00:22:52,610 Μια περίπτωση βάση, η οποία ήταν κάποια σκληρά κωδικοποιημένους περίπτωση που αναφέρουν ότι σε ορισμένες περιπτώσεις 524 00:22:52,610 --> 00:22:56,210 δεν θέτουν foo, η οποία είναι σαφώς δεν συμβαίνει εν προκειμένω. 525 00:22:56,210 --> 00:22:58,920 >> Έτσι, αυτό που πραγματικά συμβαίνει όσον αφορά αυτή την εικόνα; 526 00:22:58,920 --> 00:23:01,790 Λοιπόν, όταν το βασικό καλεί foo, θα παίρνει ένα κομμάτι της μνήμης. 527 00:23:01,790 --> 00:23:04,150 Όταν foo foo καλεί, παίρνει ένα κομμάτι της μνήμης. 528 00:23:04,150 --> 00:23:06,430 Όταν foo foo καλεί, παίρνει ένα κομμάτι. 529 00:23:06,430 --> 00:23:07,080 Παίρνει ένα κομμάτι. 530 00:23:07,080 --> 00:23:08,120 Παίρνει ένα κομμάτι. 531 00:23:08,120 --> 00:23:09,460 Επειδή foo ποτέ δεν επιστρέφουν. 532 00:23:09,460 --> 00:23:12,160 Εμείς ποτέ δεν είμαστε διαγράφοντας ένα από αυτά καρέ από τη στοίβα. 533 00:23:12,160 --> 00:23:15,930 Έτσι είμαστε φυσάει μέσα από το σωρό, δεν να αναφέρουμε ποιος ξέρει τι άλλο, και 534 00:23:15,930 --> 00:23:19,600 είμαστε υπερέβαιναν τα όρια της μας λεγόμενη τμήμα της μνήμης. 535 00:23:19,600 --> 00:23:21,790 Σφάλμα πάει κατάτμηση ψευδείς. 536 00:23:21,790 --> 00:23:24,110 >> Έτσι, η λύση υπάρχει προφανώς δεν το κάνουμε αυτό. 537 00:23:24,110 --> 00:23:28,830 Αλλά η μεγαλύτερη επίπτωση είναι ότι, ναι, απολύτως υπάρχει κάποια ορίου, 538 00:23:28,830 --> 00:23:32,470 ακόμη και αν δεν είναι σαφώς καθορισμένες, ως προς το πώς πολλές λειτουργίες που μπορείτε να καλέσετε σε ένα 539 00:23:32,470 --> 00:23:34,970 πρόγραμμα, πόσες φορές μια συνάρτηση μπορεί να ζητήσει η ίδια. 540 00:23:34,970 --> 00:23:38,430 Έτσι, ακόμα κι αν κάναμε κήρυγμα αναδρομή όπως αυτό ενδεχομένως μαγικό πράγμα που ένας 541 00:23:38,430 --> 00:23:41,870 πριν από μερικές εβδομάδες για το σίγμα λειτουργία, και όταν παίρνουμε τα δεδομένα 542 00:23:41,870 --> 00:23:45,270 δομών και CS50, θα δείτε άλλους εφαρμογές για αυτό, δεν είναι 543 00:23:45,270 --> 00:23:46,500 κατ 'ανάγκην το καλύτερο πράγμα. 544 00:23:46,500 --> 00:23:50,070 Διότι, αν μια συνάρτηση καλεί τον εαυτό της, αυτοαποκαλείται, ακόμα κι αν υπάρχει μια βάση 545 00:23:50,070 --> 00:23:54,860 περίπτωση, αν δεν χτυπήσει το βασικό σενάριο για 1.000 κλήσεις ή 10.000 κλήσεις, από 546 00:23:54,860 --> 00:23:58,800 Εκείνη τη στιγμή μπορείτε να έχετε ξεμείνει από χώρο στις λεγόμενες stack σας και πατήστε 547 00:23:58,800 --> 00:24:00,400 κάποια άλλα τμήματα της μνήμης. 548 00:24:00,400 --> 00:24:03,950 Γι 'αυτό είναι πάρα πολύ ένα σχέδιο trade-off μεταξύ κομψότητα και μεταξύ 549 00:24:03,950 --> 00:24:06,920 ευρωστία συγκεκριμένων σας εφαρμογή. 550 00:24:06,920 --> 00:24:10,780 >> Έτσι, υπάρχει ένα άλλο μειονέκτημα ή άλλο πέτυχα σε ό, τι έχουμε 551 00:24:10,780 --> 00:24:11,720 έχει κάνει μέχρι στιγμής. 552 00:24:11,720 --> 00:24:12,980 Όταν ζήτησα GetString - 553 00:24:12,980 --> 00:24:15,120 επιτρέψτε μου να πάω πίσω στο γεια-2. 554 00:24:15,120 --> 00:24:18,170 Παρατηρήστε ότι είμαι καλώντας GetString, η οποία επιστρέφει μια διεύθυνση. 555 00:24:18,170 --> 00:24:20,730 Και εμείς ισχυρίζονται σήμερα ότι η διεύθυνση είναι από το σωρό. 556 00:24:20,730 --> 00:24:24,480 Και τώρα είμαι εκτύπωση από το κορδόνι σε αυτή τη διεύθυνση. 557 00:24:24,480 --> 00:24:27,000 Αλλά ποτέ δεν έχω ονομάζεται αντίθετο της GetString. 558 00:24:27,000 --> 00:24:30,850 Εμείς ποτέ δεν είχα να calll μια λειτουργία, όπως ungetstring, όπου μπορείτε να το χέρι πίσω 559 00:24:30,850 --> 00:24:31,610 ότι η μνήμη. 560 00:24:31,610 --> 00:24:33,250 Αλλά ειλικρινά πιθανότατα θα έπρεπε να είναι. 561 00:24:33,250 --> 00:24:37,390 Διότι, αν συνεχίζουμε να ρωτάμε τον υπολογιστή για τη μνήμη, με κάποιον σαν 562 00:24:37,390 --> 00:24:40,830 GetString αλλά ποτέ δεν το δώσει πίσω, σίγουρα ότι πάρα πολύ είναι βέβαιο ότι θα οδηγήσει σε 563 00:24:40,830 --> 00:24:42,970 προβλήματα με την οποία έχουμε ξεμείνει από μνήμη. 564 00:24:42,970 --> 00:24:46,140 >> Και στην πραγματικότητα, μπορούμε να αναζητήσουμε αυτά προβλήματα με το νέο εργαλείο του οποίου η χρήση 565 00:24:46,140 --> 00:24:47,640 είναι λίγο αινιγματικό να πληκτρολογήσετε. 566 00:24:47,640 --> 00:24:50,960 Αλλά επιτρέψτε μου να πάω μπροστά και splash επάνω στην οθόνη ακριβώς σε μια στιγμή. 567 00:24:50,960 --> 00:24:56,940 Πάω να πάει μπροστά και να τρέξει Valgrind με την παράμετρο της οποίας η πρώτη εντολή 568 00:24:56,940 --> 00:25:00,260 επιχείρημα γραμμή είναι το όνομα του εν λόγω προγράμματος γεια-2. 569 00:25:00,260 --> 00:25:02,650 Και δυστυχώς, είναι εξόδου είναι atrociously 570 00:25:02,650 --> 00:25:04,290 πολύπλοκο για κανέναν καλό λόγο. 571 00:25:04,290 --> 00:25:06,280 Έτσι βλέπουμε όλα αυτά τα χάλια. 572 00:25:06,280 --> 00:25:07,530 Ο David είναι αναφέρετε το όνομά μου. 573 00:25:07,530 --> 00:25:09,760 Έτσι, αυτό είναι το πρόγραμμα στην πραγματικότητα λειτουργεί. 574 00:25:09,760 --> 00:25:11,180 Και τώρα έχουμε αυτήν την έξοδο. 575 00:25:11,180 --> 00:25:13,400 >> Έτσι Valgrind είναι παρόμοια στο πνεύμα με GDB. 576 00:25:13,400 --> 00:25:14,950 Δεν είναι ένα πρόγραμμα εντοπισμού σφαλμάτων per se. 577 00:25:14,950 --> 00:25:16,270 Αλλά είναι ένα πούλι μνήμης. 578 00:25:16,270 --> 00:25:20,140 Είναι ένα πρόγραμμα που θα τρέξει σας προγραμματίσετε και να σας πω αν ζητηθεί μια 579 00:25:20,140 --> 00:25:23,860 υπολογιστή για τη μνήμη και ποτέ δεν το παρέδωσε πίσω, έτσι σημαίνει ότι έχετε 580 00:25:23,860 --> 00:25:24,570 μια διαρροή μνήμης. 581 00:25:24,570 --> 00:25:26,240 Και διαρροές μνήμης τείνουν να είναι κακό. 582 00:25:26,240 --> 00:25:29,120 Και θα είναι οι χρήστες των υπολογιστών έχουν πιθανότατα θεώρησαν αυτό, αν έχετε ένα 583 00:25:29,120 --> 00:25:30,300 Mac ή PC. 584 00:25:30,300 --> 00:25:33,730 Έχετε ποτέ χρησιμοποιήσει τον υπολογιστή σας για ενώ δεν είναι και επανεκκίνηση σε αρκετές 585 00:25:33,730 --> 00:25:36,820 ημέρες, ή έχετε μόνο ένα πολύ προγράμματα που τρέχουν, και το καταραμένο πράγμα 586 00:25:36,820 --> 00:25:42,360 επιβραδύνει σε μια λείανση σταματήσει, ή τουλάχιστον Είναι εξαιρετικά ενοχλητικό να χρησιμοποιήσετε, επειδή 587 00:25:42,360 --> 00:25:44,350 ό, τι ακριβώς έχεις σούπερ αργή. 588 00:25:44,350 --> 00:25:46,260 >> Τώρα που μπορεί να είναι οποιοσδήποτε αριθμός λόγων. 589 00:25:46,260 --> 00:25:49,600 Θα μπορούσε να είναι ένα άπειρο βρόχο, ένα σφάλμα κώδικα κάποιου, ή, πιο απλά, 590 00:25:49,600 --> 00:25:53,250 θα μπορούσε να σημαίνει ότι χρησιμοποιείτε περισσότερο μνήμης, ή να προσπαθεί να, από ό, τι σας 591 00:25:53,250 --> 00:25:54,920 υπολογιστής έχει στην πραγματικότητα. 592 00:25:54,920 --> 00:25:57,770 Και ίσως υπάρχει ένα bug σε κάποιο πρόγραμμα που διατηρούν ζητώντας τη μνήμη. 593 00:25:57,770 --> 00:26:02,480 Browsers για χρόνια ήταν διαβόητος για Αυτό, ζητώντας όλο και περισσότερη μνήμη 594 00:26:02,480 --> 00:26:03,870 αλλά ποτέ δεν παράδοση πίσω. 595 00:26:03,870 --> 00:26:07,220 Σίγουρα, αν έχετε μόνο ένα πεπερασμένο ποσό της μνήμης, δεν μπορείτε να ζητήσετε 596 00:26:07,220 --> 00:26:09,990 απείρως πολλές φορές για μερικές από εκείνη μνήμης. 597 00:26:09,990 --> 00:26:13,070 >> Και έτσι αυτό που βλέπετε εδώ, ακόμη και αν και πάλι η παραγωγή Valgrind είναι 598 00:26:13,070 --> 00:26:17,490 άνευ λόγου πολύπλοκο να ρίξετε μια ματιά σε Πρώτον, αυτό είναι το ενδιαφέρον κομμάτι. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 σε χρήση κατά την έξοδο. 601 00:26:20,060 --> 00:26:22,810 Τόσο εδώ είναι πόση μνήμη ήταν σε χρήση στο σωρό κατά τη 602 00:26:22,810 --> 00:26:24,300 χρόνο το πρόγραμμά μου βγήκε - 603 00:26:24,300 --> 00:26:27,280 προφανώς έξι bytes σε ένα μπλοκ. 604 00:26:27,280 --> 00:26:28,710 Έτσι, Πάω να κυματίσει στα χέρια μου σε ό, τι ένα μπλοκ είναι. 605 00:26:28,710 --> 00:26:31,270 Σκεφτείτε ότι είναι απλά ένα κομμάτι, μια πιο τεχνικός όρος για το κομμάτι. 606 00:26:31,270 --> 00:26:33,140 Όμως, έξι bytes - 607 00:26:33,140 --> 00:26:36,870 ποιες είναι οι έξι που bytes ήταν ακόμα σε χρήση; 608 00:26:36,870 --> 00:26:37,390 >> Ακριβώς. 609 00:26:37,390 --> 00:26:41,520 D-Α-V-I-D backslash μηδέν, πέντε επιστολή Όνομα συν το null τερματισμού. 610 00:26:41,520 --> 00:26:46,350 Έτσι, το πρόγραμμα αυτό Valgrind παρατηρήσει ότι έχω ζήτησε για έξι bytes, προφανώς, από 611 00:26:46,350 --> 00:26:48,950 τρόπος GetString, αλλά ποτέ τους έδωσε πίσω. 612 00:26:48,950 --> 00:26:52,030 Και στην πραγματικότητα, αυτό μπορεί να μην είναι τόσο προφανές αν το πρόγραμμά μου δεν είναι τρία 613 00:26:52,030 --> 00:26:53,590 γραμμές, αλλά είναι 300 γραμμές. 614 00:26:53,590 --> 00:26:56,920 Έτσι, μπορούμε πραγματικά να δώσει άλλη εντολή επιχείρημα γραμμή για να Valgrind να 615 00:26:56,920 --> 00:26:58,290 να γίνει πιο φλύαρη. 616 00:26:58,290 --> 00:26:59,760 Είναι λίγο ενοχλητικό να θυμόμαστε. 617 00:26:59,760 --> 00:27:01,580 Αλλά αν το κάνω - 618 00:27:01,580 --> 00:27:01,930 ας δούμε. 619 00:27:01,930 --> 00:27:03,540 Διαρροή - 620 00:27:03,540 --> 00:27:05,030 Ήταν να διαρρεύσει - 621 00:27:05,030 --> 00:27:07,580 ακόμα δεν θυμάμαι τι είναι αυτό το χέρι. 622 00:27:07,580 --> 00:27:08,550 >> - Διαρροή-check ίσον πλήρης. 623 00:27:08,550 --> 00:27:10,180 Ναι, σας ευχαριστώ. 624 00:27:10,180 --> 00:27:12,520 - Διαρροή-check ίσον πλήρης. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Το ίδιο πρόγραμμα εκτελείται. 627 00:27:14,940 --> 00:27:16,180 Πληκτρολογήστε David και πάλι. 628 00:27:16,180 --> 00:27:17,660 Τώρα βλέπω λίγο πιο αναλυτικά. 629 00:27:17,660 --> 00:27:20,890 Αλλά κάτω από την περίληψη σωρού, ο οποίος είναι πανομοιότυπο με τέσσερις - αχ, 630 00:27:20,890 --> 00:27:22,120 Αυτό είναι το είδος της Νίκαιας. 631 00:27:22,120 --> 00:27:25,460 Τώρα Valgrind είναι πραγματικά ψάχνει λίγο πιο δύσκολο στον κώδικά μου. 632 00:27:25,460 --> 00:27:29,580 Και λέει ότι, προφανώς, malloc στη γραμμή - 633 00:27:29,580 --> 00:27:30,580 έχουμε σμίκρυνση. 634 00:27:30,580 --> 00:27:31,980 Στη γραμμή - 635 00:27:31,980 --> 00:27:32,930 δεν βλέπουμε ποια γραμμή είναι. 636 00:27:32,930 --> 00:27:35,110 Αλλά malloc είναι ο πρώτος ένοχος. 637 00:27:35,110 --> 00:27:38,630 Υπάρχει ένα blog στο malloc. 638 00:27:38,630 --> 00:27:39,810 >> Εντάξει; 639 00:27:39,810 --> 00:27:40,450 Εντάξει, όχι. 640 00:27:40,450 --> 00:27:40,940 Σωστά; 641 00:27:40,940 --> 00:27:42,520 Κάλεσα GetString. 642 00:27:42,520 --> 00:27:44,460 GetString καλεί προφανώς malloc. 643 00:27:44,460 --> 00:27:47,800 Λοιπόν, τι γραμμή κώδικα είναι προφανώς σε υπαιτιότητά του για το γεγονός ότι 644 00:27:47,800 --> 00:27:49,050 διατίθενται αυτή τη μνήμη; 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Ας υποθέσουμε ότι όποιος έγραψε malloc έχει εδώ και αρκετό καιρό ότι είναι 647 00:27:55,540 --> 00:27:56,390 δεν είναι δικό τους σφάλμα. 648 00:27:56,390 --> 00:27:57,520 Έτσι είναι μάλλον δικό μου. 649 00:27:57,520 --> 00:28:02,000 GetString σε cs50.c - έτσι ώστε να είναι ένα αρχείο κάπου στον υπολογιστή - 650 00:28:02,000 --> 00:28:05,210 στη γραμμή 286 φαίνεται να είναι ο ένοχος. 651 00:28:05,210 --> 00:28:08,140 Τώρα ας υποθέσουμε ότι CS50 έχει γύρω για αξιοπρεπές χρονικό διάστημα, έτσι ώστε 652 00:28:08,140 --> 00:28:09,720 εμείς είναι αλάθητος. 653 00:28:09,720 --> 00:28:14,080 Και γι 'αυτό είναι πιθανόν να μην είναι σε GetString ότι το σφάλμα έγκειται, αλλά σε 654 00:28:14,080 --> 00:28:17,810 γεια-2.γ γραμμή 18. 655 00:28:17,810 --> 00:28:20,670 >> Έτσι, ας ρίξουμε μια ματιά στο τι γραμμή 18 ήταν. 656 00:28:20,670 --> 00:28:21,130 Αχ. 657 00:28:21,130 --> 00:28:27,130 Κατά κάποιο τρόπο αυτή η γραμμή δεν είναι απαραίτητα αμαξάκι, per se, αλλά είναι ο λόγος 658 00:28:27,130 --> 00:28:28,630 πίσω από αυτή τη διαρροή μνήμης. 659 00:28:28,630 --> 00:28:32,140 Έτσι super απλά, τι θα ήταν διαισθητικά είναι η λύση εδώ; 660 00:28:32,140 --> 00:28:34,710 Αν ζητάμε για τη μνήμη, δεν ήταν ποτέ δίνοντας πίσω, και αυτό φαίνεται να είναι ένα 661 00:28:34,710 --> 00:28:37,940 πρόβλημα, διότι την πάροδο του χρόνου ο υπολογιστής μου μπορεί να τρέξει έξω από τη μνήμη, θα μπορούσε να επιβραδύνει 662 00:28:37,940 --> 00:28:42,110 κάτω, κακά πράγματα μπορούν να συμβούν, αλλά, ποια είναι η απλή διαισθητική λύση; 663 00:28:42,110 --> 00:28:43,140 Απλά το δώσει πίσω. 664 00:28:43,140 --> 00:28:44,770 >> Πώς μπορείτε να ελευθερώσετε έτσι τη μνήμη; 665 00:28:44,770 --> 00:28:49,970 Λοιπόν, ευτυχώς είναι πολύ απλό να πω χωρίς όνομα. 666 00:28:49,970 --> 00:28:51,260 Και ποτέ δεν έχω ξανακάνει αυτό. 667 00:28:51,260 --> 00:28:55,890 Αλλά μπορείτε να σκεφτείτε κατ 'ουσίαν δωρεάν ως το αντίθετο της malloc. 668 00:28:55,890 --> 00:28:58,030 δωρεάν είναι το αντίθετο της εκχώρηση μνήμης. 669 00:28:58,030 --> 00:28:59,540 Έτσι, τώρα επιτρέψτε μου να μεταγλωττίσετε αυτό. 670 00:28:59,540 --> 00:29:02,050 Κάντε γεια-2. 671 00:29:02,050 --> 00:29:04,620 Επιτρέψτε μου να τρέχει και πάλι. γεια-2 David. 672 00:29:04,620 --> 00:29:07,290 Έτσι, φαίνεται να εργαστούν σε τον ίδιο ακριβώς τρόπο. 673 00:29:07,290 --> 00:29:11,180 Αλλά αν πάμε πίσω στο Valgrind και την εκ νέου τρέχει ότι η ίδια εντολή σε νέα μου 674 00:29:11,180 --> 00:29:14,720 καταρτίζονται πρόγραμμα, πληκτρολογώντας στο όνομά μου όπως και πριν - 675 00:29:14,720 --> 00:29:15,370 Νίκαια. 676 00:29:15,370 --> 00:29:16,760 Περίληψη Heap - 677 00:29:16,760 --> 00:29:17,740 σε χρήση στην έξοδο - 678 00:29:17,740 --> 00:29:19,370 μηδέν bytes στο μηδέν μπλοκ. 679 00:29:19,370 --> 00:29:21,840 Και αυτό είναι πολύ ωραία, όλα μπλοκ σωρού αφέθηκαν ελεύθεροι. 680 00:29:21,840 --> 00:29:23,480 Δεν είναι δυνατές διαρροές. 681 00:29:23,480 --> 00:29:27,200 >> Έτσι, έρχονται, όχι με Set Πρόβλημα 4, αλλά με Set Πρόβλημα 5, οι εγκληματολογίας 682 00:29:27,200 --> 00:29:30,740 και έπειτα, κι αυτό θα γίνει μέτρο της ορθότητας σας 683 00:29:30,740 --> 00:29:33,630 πρόγραμμα, ανεξάρτητα αν έχετε ή όχι ή δεν έχουν διαρροές μνήμης. 684 00:29:33,630 --> 00:29:36,900 Αλλά ευτυχώς, όχι μόνο μπορείτε να αιτιολογήσει μέσω αυτών διαισθητικά, τα οποία 685 00:29:36,900 --> 00:29:40,430 είναι, αναμφισβήτητα, εύκολο για τα μικρά προγράμματα αλλά και πιο δύσκολο για τα μεγαλύτερα προγράμματα, 686 00:29:40,430 --> 00:29:43,860 Valgrind, για τα μεγαλύτερα προγράμματα, μπορεί να σας βοηθήσει να προσδιορίσετε 687 00:29:43,860 --> 00:29:45,360 το συγκεκριμένο πρόβλημα. 688 00:29:45,360 --> 00:29:47,500 >> Αλλά υπάρχει ένα άλλο πρόβλημα που ενδέχεται να προκύψουν. 689 00:29:47,500 --> 00:29:51,245 Επιτρέψτε μου να ανοίξει το αρχείο αυτό εδώ, το οποίο είναι, πάλι, μια κάπως απλό παράδειγμα. 690 00:29:51,245 --> 00:29:53,760 Αλλά ας επικεντρωθεί σε αυτό που αυτό το πρόγραμμα. 691 00:29:53,760 --> 00:29:55,190 Αυτό ονομάζεται memory.c. 692 00:29:55,190 --> 00:29:58,380 Θα δημοσιεύσετε αυτό αργότερα σήμερα στην zip του πηγαίου κώδικα του σήμερα. 693 00:29:58,380 --> 00:30:01,610 Και παρατηρήσετε ότι έχω μια λειτουργία που ονομάζεται f που δεν παίρνει ορίσματα και 694 00:30:01,610 --> 00:30:02,800 επιστρέφει τίποτα. 695 00:30:02,800 --> 00:30:07,240 Στη γραμμή 20, είμαι δηλώνοντας προφανώς δείκτη σε int και αποκαλώντας x. 696 00:30:07,240 --> 00:30:09,570 Είμαι ανάθεση είναι η επιστροφή αξία της malloc. 697 00:30:09,570 --> 00:30:14,590 Και ακριβώς για να είναι σαφές, πόσα bytes am Εγώ κατά πάσα πιθανότητα να πάρει πίσω από την malloc 698 00:30:14,590 --> 00:30:17,080 σε αυτή την κατάσταση; 699 00:30:17,080 --> 00:30:18,040 >> Πιθανώς 40. 700 00:30:18,040 --> 00:30:18,840 Πού μπορείτε να πάρετε ότι από; 701 00:30:18,840 --> 00:30:22,410 Λοιπόν, αν θυμηθούμε ότι ένας int είναι συχνά 4 bytes, τουλάχιστον είναι στην 702 00:30:22,410 --> 00:30:25,110 συσκευή, 10 φορές 4 είναι προφανώς 40. 703 00:30:25,110 --> 00:30:28,920 Έτσι malloc επιστρέφει μια διεύθυνση ένα μεγάλο κομμάτι της μνήμης και την αποθήκευση που 704 00:30:28,920 --> 00:30:30,800 αντιμετωπίσει τελικά στο x. 705 00:30:30,800 --> 00:30:32,570 Έτσι για να είναι σαφής, αυτό που τότε συμβαίνει; 706 00:30:32,570 --> 00:30:34,990 Λοιπόν, επιτρέψτε μου να επιστρέψετε στην εικόνα μας εδώ. 707 00:30:34,990 --> 00:30:38,150 Επιτρέψτε μου να επιστήσω μόνο το κάτω μέρος του μου μνήμη του υπολογιστή, επιτρέψτε μου να προχωρήσει και 708 00:30:38,150 --> 00:30:42,990 σύρει ολόκληρο το ορθογώνιο που αντιπροσωπεύει το σύνολο της μνήμης RAM μου. 709 00:30:42,990 --> 00:30:44,790 >> Θα πούμε ότι η στοίβα είναι στο κάτω μέρος. 710 00:30:44,790 --> 00:30:47,010 Και υπάρχει ένα τμήμα κειμένου τα στοιχεία που έχει προετοιμαστεί. 711 00:30:47,010 --> 00:30:49,880 Αλλά είμαι απλώς πρόκειται να αφηρημένες αυτές άλλα πράγματα μακριά, όπως τελεία, τελεία dot. 712 00:30:49,880 --> 00:30:53,470 Είμαι ακριβώς πρόκειται να αναφερθώ σε αυτό ως του σωρού στην κορυφή. 713 00:30:53,470 --> 00:30:57,070 Και στη συνέχεια, στο κάτω μέρος αυτής της εικόνας, να εκπροσωπεί κυρίως, Πάω 714 00:30:57,070 --> 00:30:59,880 για να του δώσει μια μνήμη φέτες στη στοίβα. 715 00:30:59,880 --> 00:31:03,150 Για f, Πάω να του δώσει μια φέτα της μνήμης στη στοίβα. 716 00:31:03,150 --> 00:31:05,140 Τώρα, έχω να συμβουλευτείτε μου πηγαίο κώδικα και πάλι. 717 00:31:05,140 --> 00:31:07,170 Ποιες είναι οι τοπικές μεταβλητές για την κύρια; 718 00:31:07,170 --> 00:31:10,710 Προφανώς τίποτα, έτσι ώστε να είναι φέτα αποτελεσματικά άδειο ή δεν είναι καν τόσο μεγάλη 719 00:31:10,710 --> 00:31:11,600 όπως έχω σχεδιάσει. 720 00:31:11,600 --> 00:31:15,730 Αλλά στην f, έχω μια τοπική μεταβλητή, που ονομάζεται x. 721 00:31:15,730 --> 00:31:20,410 Έτσι, Πάω να πάει μπροστά και να δώσει στ ένα μεγάλο κομμάτι της μνήμης, καλώντας το x. 722 00:31:20,410 --> 00:31:24,680 >> Και τώρα malloc από 10 φορές 4, Έτσι malloc 40, όπου είναι ότι 723 00:31:24,680 --> 00:31:25,430 μνήμη προέρχονται από; 724 00:31:25,430 --> 00:31:27,530 Δεν έχουν τραβήξει μια φωτογραφία όπως αυτό πριν. 725 00:31:27,530 --> 00:31:31,140 Αλλά ας υποθέσουμε ότι είναι αποτελεσματικά έρχονται από εδώ, έτσι ώστε ένα, 726 00:31:31,140 --> 00:31:33,170 δύο, τρία, τέσσερα, πέντε. 727 00:31:33,170 --> 00:31:34,680 Και τώρα χρειάζομαι 40 από αυτά. 728 00:31:34,680 --> 00:31:37,540 Έτσι, θα το κάνω μόνο τελεία, τελεία, τελεία να προτείνει ότι υπάρχει ακόμα περισσότερη μνήμη 729 00:31:37,540 --> 00:31:39,350 έρχονται πίσω από το σωρό. 730 00:31:39,350 --> 00:31:40,710 Τώρα, ποια είναι η διεύθυνση; 731 00:31:40,710 --> 00:31:42,620 Ας επιλέξουν αυθαίρετες μας αντιμετώπιση όπως πάντα - 732 00:31:42,620 --> 00:31:46,310 Ox123, ακόμα κι αν είναι κατά πάσα πιθανότητα θα να είναι κάτι εντελώς διαφορετικό. 733 00:31:46,310 --> 00:31:50,420 Αυτή είναι η διεύθυνση του πρώτου byte μνήμης που ζητάω malloc για. 734 00:31:50,420 --> 00:31:53,630 >> Έτσι, με λίγα λόγια, από τη στιγμή γραμμή 20 εκτελεί, Τι είναι κυριολεκτικά 735 00:31:53,630 --> 00:31:57,170 αποθηκεύονται στο εσωτερικό του x εδώ; 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 Και το βόδι δεν έχει ενδιαφέρον. 739 00:32:01,550 --> 00:32:03,200 Σημαίνει απλώς εδώ είναι ένα δεκαεξαδικό αριθμό. 740 00:32:03,200 --> 00:32:06,490 Αλλά αυτό που είναι βασικό είναι ότι αυτό που έχω κατάστημα στο Χ, το οποίο είναι μια τοπική μεταβλητή. 741 00:32:06,490 --> 00:32:10,260 Αλλά ο τύπος δεδομένων της, και πάλι, είναι μια διεύθυνση ενός int. 742 00:32:10,260 --> 00:32:12,710 Λοιπόν, είμαι πρόκειται να αποθηκεύσετε Ox123. 743 00:32:12,710 --> 00:32:16,610 Αλλά και πάλι, αν αυτό είναι λίγο πολύ περίπλοκη χωρίς λόγο, αν μετακινηθείτε 744 00:32:16,610 --> 00:32:21,490 πίσω, μπορούμε αφηρημένο αυτό μακριά αρκετά λογικά και να πω ότι το x είναι ένα 745 00:32:21,490 --> 00:32:23,910 δείκτης σε αυτό το κομμάτι της μνήμης. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Τώρα το ερώτημα στο χέρι είναι τα ακόλουθα: - 748 00:32:26,230 --> 00:32:29,910 γραμμή 21, αποδεικνύεται, είναι προβληματική. 749 00:32:29,910 --> 00:32:31,160 Γιατί; 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Συγγνώμη; 752 00:32:36,930 --> 00:32:38,640 Δεν έχει - 753 00:32:38,640 --> 00:32:40,390 πούμε ότι για μια ακόμη φορά. 754 00:32:40,390 --> 00:32:41,240 Λοιπόν, αυτό δεν γίνεται δωρεάν. 755 00:32:41,240 --> 00:32:42,350 Έτσι, αυτό είναι το δεύτερο, αλλά. 756 00:32:42,350 --> 00:32:45,000 Έτσι, υπάρχει ένα άλλο, αλλά ειδικά στη γραμμή 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Ακριβώς. 759 00:32:50,040 --> 00:32:54,980 Αυτή η απλή γραμμή κώδικα είναι μόνο ένα υπερχείλιση μνήμης, υπέρβαση του buffer. 760 00:32:54,980 --> 00:32:57,050 Ένα ρυθμιστικό σημαίνει απλά ένα κομμάτι της μνήμης. 761 00:32:57,050 --> 00:33:01,520 Αλλά αυτό το κομμάτι της μνήμης έχει μέγεθος 10, 10 ακέραιοι αριθμοί, το οποίο σημαίνει ότι αν έχουμε 762 00:33:01,520 --> 00:33:05,350 δείκτη σε αυτό χρησιμοποιώντας το συντακτικό της ζάχαρης συμβολισμός array, η πλατεία 763 00:33:05,350 --> 00:33:09,220 παρένθεση, έχετε πρόσβαση σε x βραχίονα 0 x 1 x στήριγμα, 764 00:33:09,220 --> 00:33:10,390 βραχίονα τελεία, τελεία, τελεία. 765 00:33:10,390 --> 00:33:13,270 x βραχίονα 9 είναι το μεγαλύτερο. 766 00:33:13,270 --> 00:33:17,680 Έτσι, αν κάνω x βραχίονα 10, όπου Είμαι πραγματικά συμβαίνει στη μνήμη; 767 00:33:17,680 --> 00:33:19,120 >> Λοιπόν, αν έχω 10 int - 768 00:33:19,120 --> 00:33:21,070 ας ζωγραφίσουμε όλα από αυτά εδώ. 769 00:33:21,070 --> 00:33:22,700 Έτσι, αυτό ήταν το πρώτο πέντε. 770 00:33:22,700 --> 00:33:24,660 Εδώ είναι οι άλλες πέντε ints. 771 00:33:24,660 --> 00:33:29,580 Έτσι x βραχίονα 0 είναι εδώ. x στήριγμα 1 είναι εδώ. x βραχίονα 9 είναι εδώ. x στήριγμα 772 00:33:29,580 --> 00:33:37,960 10 είναι εδώ, πράγμα που σημαίνει λέω, στη γραμμή 21, ο υπολογιστής για να θέσει το 773 00:33:37,960 --> 00:33:39,400 αριθμό, όπου; 774 00:33:39,400 --> 00:33:42,010 Ο αριθμός 0, όπου; 775 00:33:42,010 --> 00:33:43,380 Λοιπόν, αυτό είναι 0, ναι. 776 00:33:43,380 --> 00:33:45,460 Αλλά ακριβώς το γεγονός ότι 0 της είναι το είδος της μια σύμπτωση. 777 00:33:45,460 --> 00:33:47,140 Θα μπορούσε να είναι ο αριθμός 50, για όλους μας νοιάζει. 778 00:33:47,140 --> 00:33:50,480 Αλλά προσπαθούμε να το θέσει σε x βραχίονα 10, η οποία είναι όπου αυτό το 779 00:33:50,480 --> 00:33:53,700 ερωτηματικό έχει συνταχθεί, η οποία δεν είναι ένα καλό πράγμα. 780 00:33:53,700 --> 00:33:57,070 Το πρόγραμμα αυτό θα μπορούσε κάλλιστα να συντριβή, ως αποτέλεσμα. 781 00:33:57,070 --> 00:33:59,400 >> Τώρα, ας πάμε μπροστά και να δούμε αν αυτό Είναι, πράγματι, τι συμβαίνει. 782 00:33:59,400 --> 00:34:02,600 Πραγματοποίηση μνήμης, επειδή το αρχείο ονομάζεται memory.c. 783 00:34:02,600 --> 00:34:05,950 Ας πάμε μπροστά και να τρέξει η μνήμη του προγράμματος. 784 00:34:05,950 --> 00:34:08,239 Έτσι σταθήκαμε τυχεροί, στην πραγματικότητα, φαίνεται. 785 00:34:08,239 --> 00:34:09,340 Σταθήκαμε τυχεροί. 786 00:34:09,340 --> 00:34:11,060 Αλλά ας δούμε αν τρέξουμε τώρα Valgrind. 787 00:34:11,060 --> 00:34:14,170 Με την πρώτη ματιά, το πρόγραμμα μου θα μπορούσε να φαίνεται να είναι απολύτως σωστό. 788 00:34:14,170 --> 00:34:18,010 Αλλά επιτρέψτε μου να τρέξει Valgrind με το - Διαρροή-check ίσον πλήρης στη μνήμη. 789 00:34:18,010 --> 00:34:20,110 >> Και τώρα όταν τρέχω αυτό - 790 00:34:20,110 --> 00:34:21,030 ενδιαφέρουσα. 791 00:34:21,030 --> 00:34:26,800 Άκυρα γράφουν μεγέθους 4 στο γραμμή 21 του memory.c. 792 00:34:26,800 --> 00:34:29,284 Γραμμή 21 του memory.c είναι ποια; 793 00:34:29,284 --> 00:34:30,340 Ω, ενδιαφέρον. 794 00:34:30,340 --> 00:34:31,080 Αλλά περιμένετε. 795 00:34:31,080 --> 00:34:32,389 Μέγεθος 4, τι είναι αυτό αναφέρεστε; 796 00:34:32,389 --> 00:34:34,969 Το μόνο που είχε να γράψει κάποιος, αλλά είναι μεγέθους 4. 797 00:34:34,969 --> 00:34:36,889 Γιατί είναι 4; 798 00:34:36,889 --> 00:34:39,280 Είναι επειδή είναι ένα int, η οποία είναι, και πάλι, τέσσερις ψηφιολέξεις. 799 00:34:39,280 --> 00:34:42,510 Έτσι Valgrind βρήκε ένα bug που έχω, Ματιές στον κώδικα μου, δεν το έκανε. 800 00:34:42,510 --> 00:34:45,040 Και ίσως TF σας ενδέχεται ή όχι. 801 00:34:45,040 --> 00:34:48,469 Τι Αλλά Valgrind σίγουρα διαπίστωσε ότι έχουμε κάνει ένα λάθος εκεί, ακόμα και 802 00:34:48,469 --> 00:34:52,719 αν και σταθήκαμε τυχεροί, και ο υπολογιστής αποφάσισε, ε, εγώ δεν πρόκειται να καταρρεύσει 803 00:34:52,719 --> 00:34:57,470 μόνο και μόνο επειδή αγγίξατε ένα byte, ένα Αξίζει int της μνήμης που δεν 804 00:34:57,470 --> 00:34:58,550 στην πραγματικότητα δική. 805 00:34:58,550 --> 00:35:00,380 >> Λοιπόν, τι άλλο είναι προβληματικό εδώ. 806 00:35:00,380 --> 00:35:01,180 Διεύθυνση - 807 00:35:01,180 --> 00:35:03,190 Αυτό είναι ένα τρελό διεύθυνση αναζητούν σε δεκαεξαδικό. 808 00:35:03,190 --> 00:35:06,890 Αυτό απλά σημαίνει ότι κάπου στο σωρό είναι μηδέν bytes μετά από ένα μπλοκ του μεγέθους 40 809 00:35:06,890 --> 00:35:07,620 κατανέμεται. 810 00:35:07,620 --> 00:35:10,610 Επιτρέψτε μου σμίκρυνση εδώ και να δούμε αν Αυτό είναι λίγο πιο χρήσιμη. 811 00:35:10,610 --> 00:35:11,410 Ενδιαφέρουσες. 812 00:35:11,410 --> 00:35:15,600 Τα 40 bytes χαθεί οριστικά στο αρχείο απώλειας 1 από 1. 813 00:35:15,600 --> 00:35:17,840 Και πάλι, από ό, τι περισσότερες λέξεις είναι χρήσιμο εδώ. 814 00:35:17,840 --> 00:35:21,350 Όμως, με βάση τις μαυρισμένες γραμμές, όπου θα πρέπει να εστιάσει πιθανότατα μου 815 00:35:21,350 --> 00:35:24,070 την προσοχή για άλλη bug; 816 00:35:24,070 --> 00:35:26,570 Μοιάζει με μια γραμμή 20 του memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Έτσι, αν πάμε πίσω στη γραμμή 20, που είναι η που σας εντοπιστεί νωρίτερα. 818 00:35:30,990 --> 00:35:33,030 Και αυτό δεν είναι απαραίτητα λάθη. 819 00:35:33,030 --> 00:35:35,160 Αλλά έχουμε αυτό αντιστραφεί τα αποτελέσματά της. 820 00:35:35,160 --> 00:35:38,790 Λοιπόν, πώς μπορώ να διορθώσω τουλάχιστον ένα από αυτά τα λάθη; 821 00:35:38,790 --> 00:35:42,240 Τι μπορώ να κάνω μετά την γραμμή 21; 822 00:35:42,240 --> 00:35:47,110 Θα μπορούσα να κάνω χωρίς x, οπότε είναι να δώσει πίσω ότι μνήμης. 823 00:35:47,110 --> 00:35:49,230 Και πώς μπορώ να διορθώσω αυτό το σφάλμα; 824 00:35:49,230 --> 00:35:52,120 Θα πρέπει σίγουρα να πάτε δεν μακρύτερα από 0. 825 00:35:52,120 --> 00:35:53,670 Έτσι, επιτρέψτε μου να προσπαθήσω και να επαναληφθεί αυτό. 826 00:35:53,670 --> 00:35:56,080 Δυστυχώς, σίγουρα πάει δεν μακρύτερα από 9. 827 00:35:56,080 --> 00:35:57,510 Κάντε μνήμη. 828 00:35:57,510 --> 00:36:00,650 Επιτρέψτε μου επανάληψη Valgrind σε ένα μεγαλύτερο παράθυρο. 829 00:36:00,650 --> 00:36:01,580 Και τώρα να δείτε. 830 00:36:01,580 --> 00:36:02,250 Νίκαια. 831 00:36:02,250 --> 00:36:03,270 Όλα τα μπλοκ σωρού αφέθηκαν ελεύθεροι. 832 00:36:03,270 --> 00:36:04,270 Δεν είναι δυνατές διαρροές. 833 00:36:04,270 --> 00:36:07,520 Και μέχρι εδώ πάνω, δεν υπάρχει καμία αναφορά πια της άκυρης δικαιώματος. 834 00:36:07,520 --> 00:36:09,820 >> Ακριβώς για να πάρει άπληστοι, και ας δείτε αν κάποιος άλλος επίδειξης 835 00:36:09,820 --> 00:36:11,050 δεν πάει όπως θα έπρεπε - 836 00:36:11,050 --> 00:36:12,560 Είχα πάρει τυχερός πριν από λίγο. 837 00:36:12,560 --> 00:36:15,530 Και το γεγονός ότι αυτό είναι μηδέν είναι ίσως άσκοπα παραπλανητική. 838 00:36:15,530 --> 00:36:20,650 Ας κάνουμε μόλις 50, μια κάπως αυθαίρετη αριθμό, κάνει τη μνήμη dot κάθετος μνήμης - 839 00:36:20,650 --> 00:36:21,410 ακόμα να πάρετε τυχεροί. 840 00:36:21,410 --> 00:36:22,510 Τίποτα δεν συντρίβεται. 841 00:36:22,510 --> 00:36:26,150 Ας υποθέσουμε ότι κάνω κάτι πραγματικά ανόητο, και το κάνω 100. 842 00:36:26,150 --> 00:36:30,360 Επιτρέψτε μου να ανακατασκευάσει τη μνήμη, dot κάθετος μνήμη - 843 00:36:30,360 --> 00:36:31,075 στάθηκε τυχερός και πάλι. 844 00:36:31,075 --> 00:36:32,800 Πόσο περίπου 1.000; 845 00:36:32,800 --> 00:36:35,370 ints πέρα ​​από, περίπου, όπου θα πρέπει να είναι; 846 00:36:35,370 --> 00:36:37,410 Κάντε τη μνήμη - 847 00:36:37,410 --> 00:36:38,570 γαμώτο. 848 00:36:38,570 --> 00:36:39,920 >> [Γέλια] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Ας μην χάος γύρω πια. 851 00:36:43,920 --> 00:36:45,120 Εκτελέστε ξανά τη μνήμη. 852 00:36:45,120 --> 00:36:45,840 Εκεί πάμε. 853 00:36:45,840 --> 00:36:46,410 Εντάξει. 854 00:36:46,410 --> 00:36:52,500 Έτσι, προφανώς, θα index 100.000 ints πέρα από όπου θα πρέπει να έχουν έρθει σε 855 00:36:52,500 --> 00:36:54,410 μνήμη, άσχημα πράγματα συμβαίνουν. 856 00:36:54,410 --> 00:36:56,430 Έτσι, αυτό δεν είναι προφανώς ένα σκληρό, απαράβατο κανόνα. 857 00:36:56,430 --> 00:36:58,190 Ήμουν το είδος της χρήσης δίκης και το λάθος για να φτάσει εκεί. 858 00:36:58,190 --> 00:37:02,230 Αλλά αυτό οφείλεται στο γεγονός ότι, τα πολυλογώ, μνήμη του υπολογιστή σας είναι επίσης χωρίζεται 859 00:37:02,230 --> 00:37:03,580 σε αυτά τα πράγματα που ονομάζονται τμήματα. 860 00:37:03,580 --> 00:37:07,260 Και μερικές φορές, ο υπολογιστής στην πραγματικότητα έχει δώσει λίγο περισσότερη μνήμη 861 00:37:07,260 --> 00:37:08,400 από ό, τι ζητάς. 862 00:37:08,400 --> 00:37:12,170 Αλλά για την αποτελεσματικότητα, είναι απλά πιο εύκολο να πάρετε περισσότερη μνήμη, αλλά μόνο να σας πω 863 00:37:12,170 --> 00:37:13,780 ότι παίρνετε ένα τμήμα του. 864 00:37:13,780 --> 00:37:16,370 >> Και αν μπορείτε να πάρετε τυχεροί μερικές φορές, Επομένως, ίσως να είναι σε θέση να αγγίξει 865 00:37:16,370 --> 00:37:17,795 Η μνήμη που δεν ανήκει σε εσάς. 866 00:37:17,795 --> 00:37:21,860 Δεν έχετε καμία εγγύηση ότι αυτό αξία βάζετε θα μείνει εκεί, γιατί 867 00:37:21,860 --> 00:37:25,080 ο υπολογιστής εξακολουθεί να πιστεύει ότι δεν είναι δικά σας, αλλά δεν είναι κατ 'ανάγκη θα 868 00:37:25,080 --> 00:37:29,910 να χτυπήσει ένα άλλο τμήμα της μνήμης του υπολογιστή και να προκαλέσουν ένα τέτοιο λάθος 869 00:37:29,910 --> 00:37:31,710 αυτό εδώ. 870 00:37:31,710 --> 00:37:32,060 Εντάξει. 871 00:37:32,060 --> 00:37:37,240 Οποιεσδήποτε ερωτήσεις, στη συνέχεια στη μνήμη; 872 00:37:37,240 --> 00:37:37,590 >> Εντάξει. 873 00:37:37,590 --> 00:37:40,610 Ας ρίξουμε μια ματιά εδώ, στη συνέχεια, σε κάτι που έχουμε ήδη λάβει για 874 00:37:40,610 --> 00:37:48,361 χορηγείται για αρκετό καιρό, το οποίο Είναι σε αυτό το αρχείο με το όνομα cs50.h. 875 00:37:48,361 --> 00:37:49,420 Έτσι, αυτό είναι ένα αρχείο. 876 00:37:49,420 --> 00:37:51,130 Αυτά είναι μόνο ένα σωρό των παρατηρήσεων επάνω στην κορυφή. 877 00:37:51,130 --> 00:37:53,900 Και ίσως να έχουν εξετάσει αυτό, αν που έσπρωξε γύρω από τη συσκευή. 878 00:37:53,900 --> 00:37:57,000 Αλλά αποδεικνύεται ότι όλη την ώρα, όταν χρησιμοποιείται για να χρησιμοποιήσουν σειρά ως 879 00:37:57,000 --> 00:38:01,130 συνώνυμο, το μέσο με το οποίο δηλώνεται που ήταν συνώνυμο με αυτό 880 00:38:01,130 --> 00:38:03,990 λέξη-κλειδί typedef, για τον ορισμό του τύπου. 881 00:38:03,990 --> 00:38:07,500 Και είμαστε ουσιαστικά λέει, να χορδή ένα συνώνυμο για char αστέρι. 882 00:38:07,500 --> 00:38:11,190 Ότι τα μέσα με τα οποία η στοίβα δημιούργησε αυτά ρόδες γνωστή ως 883 00:38:11,190 --> 00:38:12,040 το string. 884 00:38:12,040 --> 00:38:14,830 >> Τώρα εδώ είναι απλά ένα πρωτότυπο για getchar. 885 00:38:14,830 --> 00:38:17,350 Μπορεί να έχετε δει πριν, αλλά αυτό είναι πράγματι, αυτό που κάνει. getchar 886 00:38:17,350 --> 00:38:19,070 δεν παίρνει ορίσματα, επιστρέφει μια χαρα. 887 00:38:19,070 --> 00:38:21,340 getdouble δεν παίρνει ορίσματα, επιστρέφει ένα διπλό. 888 00:38:21,340 --> 00:38:24,440 getfloat δεν παίρνει ορίσματα, επιστρέφει ένας πλωτήρας, και ούτω καθεξής. 889 00:38:24,440 --> 00:38:27,270 getint είναι εδώ. getlonglong είναι εδώ. 890 00:38:27,270 --> 00:38:28,820 Και GetString είναι εδώ. 891 00:38:28,820 --> 00:38:29,420 Και αυτό είναι όλο. 892 00:38:29,420 --> 00:38:33,080 Αυτή η μωβ γραμμή είναι ένα άλλο προεπεξεργαστή οδηγίας, λόγω της 893 00:38:33,080 --> 00:38:35,550 hashtag κατά την έναρξη του. 894 00:38:35,550 --> 00:38:35,870 >> Εντάξει. 895 00:38:35,870 --> 00:38:38,380 Έτσι, τώρα επιτρέψτε μου να μπω σε cs50.c. 896 00:38:38,380 --> 00:38:40,400 Και εμείς δεν θα μιλήσουμε πάρα πολύ καιρό σε αυτό. 897 00:38:40,400 --> 00:38:43,280 Αλλά για να σας δώσει μια γεύση του τι είναι συνεχίζεται για όλα αυτά 898 00:38:43,280 --> 00:38:46,434 χρόνο, επιτρέψτε μου να πάω σε - 899 00:38:46,434 --> 00:38:48,250 ας κάνουμε getchar. 900 00:38:48,250 --> 00:38:51,050 Έτσι getchar είναι ως επί το πλείστον σχόλια. 901 00:38:51,050 --> 00:38:52,060 Αλλά μοιάζει με αυτό. 902 00:38:52,060 --> 00:38:54,800 Έτσι, αυτή είναι η πραγματική λειτουργία getchar που έχουμε πάει 903 00:38:54,800 --> 00:38:56,055 λαμβάνοντας ως δεδομένο υπάρχει. 904 00:38:56,055 --> 00:38:59,370 Και ακόμα κι αν δεν έχουμε χρησιμοποιήσει αυτό το ένα ότι συχνά, αν όχι ποτέ, είναι τουλάχιστον 905 00:38:59,370 --> 00:39:00,470 σχετικά απλή. 906 00:39:00,470 --> 00:39:02,580 Γι 'αυτό αξίζει να ρίξουμε μια γρήγορη ματιά εδώ. 907 00:39:02,580 --> 00:39:06,540 >> Έτσι getchar έχει έναν άπειρο βρόχο, σκόπιμα έτσι προφανώς. 908 00:39:06,540 --> 00:39:10,050 Καλεί στη συνέχεια - και αυτό είναι το είδος της μια ωραίο επαναχρησιμοποίηση του κώδικα που μας έγραψε. 909 00:39:10,050 --> 00:39:11,220 Καλεί GetString. 910 00:39:11,220 --> 00:39:12,460 Διότι αυτό που κάνει σημαίνει να πάρετε μια χαρα; 911 00:39:12,460 --> 00:39:14,730 Καλά, ίσως και να προσπαθήσει να πάρει ένα ολόκληρη γραμμή κειμένου από το χρήστη και 912 00:39:14,730 --> 00:39:16,940 στη συνέχεια, μόλις δούμε ένα από αυτούς τους χαρακτήρες. 913 00:39:16,940 --> 00:39:19,170 Στη γραμμή 60, εδώ είναι ένα μικρό bit του ελέγχου λογικής. 914 00:39:19,170 --> 00:39:21,610 Αν GetString επέστρεψε null, ας μην προχωρήσει. 915 00:39:21,610 --> 00:39:22,820 Κάτι πήγε στραβά. 916 00:39:22,820 --> 00:39:28,120 >> Τώρα αυτό είναι κάπως ενοχλητικό, αλλά συμβατικά σε C. char max πιθανώς 917 00:39:28,120 --> 00:39:29,960 αντιπροσωπεύει ό, τι ακριβώς με βάση το όνομά του; 918 00:39:29,960 --> 00:39:31,670 Είναι μια σταθερά. 919 00:39:31,670 --> 00:39:36,040 Είναι σαν την αριθμητική τιμή της μεγαλύτερο char μπορείτε να εκπροσωπεί με 920 00:39:36,040 --> 00:39:40,370 ένα δάγκωμα, το οποίο είναι πιθανώς ο αριθμός 255, η οποία είναι ο μεγαλύτερος αριθμός που 921 00:39:40,370 --> 00:39:42,720 αντιπροσωπεύουν οκτώ bits, ξεκινώντας από το μηδέν. 922 00:39:42,720 --> 00:39:47,460 Έτσι έχω χρησιμοποιήσει αυτό, σε αυτή τη λειτουργία, όταν γράφοντας τον κωδικό αυτό, μόνο και μόνο επειδή 923 00:39:47,460 --> 00:39:51,753 αν κάτι πάει στραβά στην getchar, αλλά Σκοπός της ζωής είναι να επιστρέψει ένα 924 00:39:51,753 --> 00:39:54,830 char, θα πρέπει με κάποιο τρόπο να είναι σε θέση να ειδοποιήσει το χρήστη ότι 925 00:39:54,830 --> 00:39:55,840 κάτι πήγε στραβά. 926 00:39:55,840 --> 00:39:56,970 Δεν μπορεί να επιστρέψει null. 927 00:39:56,970 --> 00:39:58,480 Αποδεικνύεται ότι το null είναι ένας δείκτης. 928 00:39:58,480 --> 00:40:01,030 Και πάλι, getchar έχει να επιστρέψει μια χαρα. 929 00:40:01,030 --> 00:40:04,760 >> Έτσι, η σύμβαση, αν κάτι πάει λάθος, είστε εσείς, ο προγραμματιστής, ή 930 00:40:04,760 --> 00:40:08,160 Στην περίπτωση αυτή, εγώ με τη βιβλιοθήκη, είχα μια δίκαιη αποφασίσει αυθαίρετα, εάν 931 00:40:08,160 --> 00:40:12,230 κάτι πάει στραβά, Πάω να επιστρέφει τον αριθμό 255, το οποίο είναι πραγματικά 932 00:40:12,230 --> 00:40:17,240 σημαίνει ότι δεν μπορεί, ο χρήστης δεν μπορεί να πληκτρολογήσετε ο χαρακτήρας αντιπροσωπεύεται από την 933 00:40:17,240 --> 00:40:21,410 αριθμός 255, γιατί είχαμε ένα το κλέψει όπως το λεγόμενο αξία δεικτών για την 934 00:40:21,410 --> 00:40:23,410 αντιπροσωπεύουν ένα πρόβλημα. 935 00:40:23,410 --> 00:40:27,010 Τώρα αποδεικνύεται ότι ο χαρακτήρας 255 δεν είναι κάτι που μπορείτε να πληκτρολογήσετε σε 936 00:40:27,010 --> 00:40:28,380 πληκτρολογίου σας, έτσι δεν είναι καμία μεγάλη υπόθεση. 937 00:40:28,380 --> 00:40:30,910 Ο χρήστης δεν παρατηρήσετε ότι Έχω κλέψει αυτό το χαρακτήρα. 938 00:40:30,910 --> 00:40:34,620 Αλλά αν ποτέ δείτε στις σελίδες άνθρωπος σε μια το σύστημα του υπολογιστή κάποια αναφορά σε ένα 939 00:40:34,620 --> 00:40:38,560 όλα τα καπάκια σταθερή, όπως αυτό που λέει, σε περιπτώσεις σφάλματος Αυτή η σταθερή δύναμη 940 00:40:38,560 --> 00:40:42,720 να επιστραφούν, αυτό είναι όλο κάποια ανθρώπινη έκανε χρόνια πριν είχε αποφασίσει αυθαίρετα να 941 00:40:42,720 --> 00:40:45,680 επιστρέψετε αυτό ιδιαίτερη αξία και ονομάσουμε μια σταθερά σε περίπτωση 942 00:40:45,680 --> 00:40:46,840 κάτι πάει στραβά. 943 00:40:46,840 --> 00:40:48,580 >> Τώρα η μαγεία συμβαίνει εδώ κάτω. 944 00:40:48,580 --> 00:40:52,600 Πρώτον, είμαι δηλώνοντας στην γραμμή 67 δύο χαρακτήρες, C1 και C2. 945 00:40:52,600 --> 00:40:57,080 Και τότε στη γραμμή 68, δεν υπάρχει στην πραγματικότητα μια γραμμή κώδικα που είναι θυμίζει 946 00:40:57,080 --> 00:41:01,140 ο φίλος μας printf, δεδομένου ότι έχει τοις εκατό Cs σε εισαγωγικά. 947 00:41:01,140 --> 00:41:06,490 Αλλά παρατηρήστε τι συμβαίνει εδώ. sscanf σημαίνει σάρωση εγχόρδων - 948 00:41:06,490 --> 00:41:11,690 σημαίνει σαρώσετε ένα μορφοποιημένο string, sscanf ergo. 949 00:41:11,690 --> 00:41:12,590 Τι σημαίνει αυτό; 950 00:41:12,590 --> 00:41:16,310 Αυτό σημαίνει ότι μπορείτε να περάσετε sscanf ένα string. 951 00:41:16,310 --> 00:41:18,420 Και η γραμμή είναι ό, τι πληκτρολογεί ο χρήστης μέσα 952 00:41:18,420 --> 00:41:23,520 Περνάτε να sscanf ένα string format όπως Αυτό που λέει scanf ποια είναι 953 00:41:23,520 --> 00:41:25,870 Είστε ελπίζοντας ο χρήστης έχει πληκτρολογήσει μέσα 954 00:41:25,870 --> 00:41:29,730 Μπορείτε στη συνέχεια να περάσει-στις διευθύνσεις των δύο κομμάτια της μνήμης, στην περίπτωση αυτή, 955 00:41:29,730 --> 00:41:31,150 γιατί έχω δύο δείκτες τοποθέτησης. 956 00:41:31,150 --> 00:41:34,610 Έτσι, Πάω να του δώσει τη διεύθυνση του C1 και τη διεύθυνση του C2. 957 00:41:34,610 --> 00:41:37,700 >> Και υπενθυμίζουν ότι δίνετε μια λειτουργία η διεύθυνση κάποιας μεταβλητής, τι είναι 958 00:41:37,700 --> 00:41:38,950 η επίπτωση; 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Τι μπορεί να κάνει αυτή η λειτουργία, ως αποτέλεσμα του δίνει τη διεύθυνση μιας 961 00:41:45,050 --> 00:41:48,170 μεταβλητή, σε αντίθεση με η μεταβλητή είναι η ίδια; 962 00:41:48,170 --> 00:41:49,450 Μπορεί να αλλάξει, έτσι δεν είναι; 963 00:41:49,450 --> 00:41:53,250 Αν είχε κάποιος ένα χάρτη για μια φυσική διεύθυνση, μπορούν να πάνε εκεί και να κάνουμε 964 00:41:53,250 --> 00:41:54,750 ό, τι θέλουν σε αυτή τη διεύθυνση. 965 00:41:54,750 --> 00:41:55,800 Ίδια ιδέα εδώ. 966 00:41:55,800 --> 00:41:59,950 Αν περνάμε στην sscanf, η διεύθυνση του δύο κομμάτια της μνήμης, ακόμα και αυτά τα μικροσκοπικά 967 00:41:59,950 --> 00:42:03,585 μικρά κομμάτια της μνήμης, C1 και C2, αλλά έχουμε πει ότι τη διεύθυνση τους, 968 00:42:03,585 --> 00:42:05,170 sscanf μπορεί να το αλλάξει. 969 00:42:05,170 --> 00:42:08,530 >> Έτσι, σκοπός sscanf στη ζωή, αν διαβάσουμε η σελίδα man, είναι να διαβάσετε αυτό το 970 00:42:08,530 --> 00:42:13,420 χρήστης πληκτρολογήσει σε, ελπίδα για το χρήστη που έχει δακτυλογραφημένο σε ένα χαρακτήρα και ίσως 971 00:42:13,420 --> 00:42:16,470 ένας άλλος χαρακτήρας, και ανεξάρτητα από το χρήστη πληκτρολογήσει, ο πρώτος χαρακτήρας πηγαίνει 972 00:42:16,470 --> 00:42:19,310 εδώ, ο δεύτερος χαρακτήρας πηγαίνει εδώ. 973 00:42:19,310 --> 00:42:22,470 Τώρα, ως ένα μέρος, αυτό, και θα κάνατε Το μόνο που ξέρω αυτό από την τεκμηρίωση, 974 00:42:22,470 --> 00:42:25,570 το γεγονός ότι έβαλα ένα κενό εκεί απλά σημαίνει ότι δεν με νοιάζει αν 975 00:42:25,570 --> 00:42:28,440 ο χρήστης πατήσει το πλήκτρο διαστήματος για μερικά φορές πριν αυτός ή αυτή παίρνει ένα 976 00:42:28,440 --> 00:42:30,400 χαρακτήρα, Πάω να αγνοήσει κάθε κενό χώρο. 977 00:42:30,400 --> 00:42:32,510 Έτσι ώστε, γνωρίζω από η τεκμηρίωση. 978 00:42:32,510 --> 00:42:36,570 >> Το γεγονός ότι υπάρχει ένα δεύτερο γ% ακολουθούμενη από λευκό διάστημα είναι στην πραγματικότητα 979 00:42:36,570 --> 00:42:37,410 σκόπιμη. 980 00:42:37,410 --> 00:42:41,190 Θέλω να είμαι σε θέση να ανιχνεύσει αν ο χρήστης μαντάρα ή δεν συνεργάστηκαν. 981 00:42:41,190 --> 00:42:45,630 Έτσι, ελπίζω ότι ο χρήστης πληκτρολογήσει μόνο σε ένα χαρακτήρα, ως εκ τούτου είμαι ελπίζοντας 982 00:42:45,630 --> 00:42:50,640 ότι sscanf είναι μόνο πρόκειται να επιστρέψει το τιμή 1, επειδή, και πάλι, αν διάβαζα 983 00:42:50,640 --> 00:42:55,400 την τεκμηρίωση, σκοπός sscanf σε ζωή είναι να επιστρέψει προς τον αριθμό των 984 00:42:55,400 --> 00:42:59,170 μεταβλητές που πληρώθηκαν με την είσοδο του χρήστη. 985 00:42:59,170 --> 00:43:02,270 >> Πέρασα σε δύο μεταβλητές διευθύνσεις, C1 και C2. 986 00:43:02,270 --> 00:43:06,420 Ελπίζω, όμως, ότι μόνο ένας από τους τους σκοτώνεται γιατί αν sscanf 987 00:43:06,420 --> 00:43:11,130 επιστρέφει 2, Τι είναι προφανώς η επίπτωση λογικά; 988 00:43:11,130 --> 00:43:14,600 Αυτός ο χρήστης δεν δώσε μου ένα χαρακτήρα, όπως είπα ή αυτήν. 989 00:43:14,600 --> 00:43:17,860 Πιθανώς πληκτρολογήσει σε τουλάχιστον δύο χαρακτήρες. 990 00:43:17,860 --> 00:43:22,430 Έτσι, αν, αντί δεν έχουν τη δεύτερη Γ%, είχα μόνο ένα, το οποίο 991 00:43:22,430 --> 00:43:25,370 ειλικρινά θα ήταν πιο έξυπνο προσέγγιση, πιστεύω ότι μια πρώτη ματιά, 992 00:43:25,370 --> 00:43:30,220 δεν πρόκειται να είναι σε θέση να ανιχνεύσει εάν ο χρήστης έχει δίνοντάς σας περισσότερο 993 00:43:30,220 --> 00:43:31,780 εισροών από ό, τι πραγματικά ήθελε. 994 00:43:31,780 --> 00:43:34,100 Έτσι, αυτό είναι μια έμμεση μορφή τον έλεγχο σφαλμάτων. 995 00:43:34,100 --> 00:43:35,640 >> Αλλά παρατηρήστε τι κάνω εδώ. 996 00:43:35,640 --> 00:43:39,970 Μόλις είμαι σίγουρος ότι ο χρήστης μου έδωσε ένα χαρακτήρα, θα ελευθερώσει τη γραμμή, να κάνει 997 00:43:39,970 --> 00:43:44,450 το αντίθετο της GetString, που με τη σειρά χρησιμοποιεί malloc, και στη συνέχεια θα επιστρέψει 998 00:43:44,450 --> 00:43:51,030 C1, ο χαρακτήρας που ήλπιζα η χρήστη που παρέχονται και παρέχεται μόνο. 999 00:43:51,030 --> 00:43:54,680 Έτσι, μια γρήγορη είδαμε μόνο, αλλά οποιεσδήποτε ερωτήσεις σχετικά με getchar; 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Θα επανέλθω σε ορισμένα από τα άλλα. 1002 00:43:59,590 --> 00:44:03,770 >> Λοιπόν, επιτρέψτε μου να προχωρήσει και να το κάνουμε αυτό - ας υποθέσουμε τώρα, μόνο και μόνο για να παρακινήσει μας 1003 00:44:03,770 --> 00:44:08,910 συζήτηση σε μια εβδομάδα συν το χρόνο, αυτό είναι ένα αρχείο που ονομάζεται structs.h. 1004 00:44:08,910 --> 00:44:11,440 Και πάλι, αυτό είναι μόνο μια γεύση κάτι που βρίσκεται μπροστά μας. 1005 00:44:11,440 --> 00:44:13,090 Αλλά προσέξτε ότι πολλά αυτού είναι σχόλια. 1006 00:44:13,090 --> 00:44:17,440 Έτσι, επιτρέψτε μου να επισημάνω μόνο το ενδιαφέρον μέρος για τώρα. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 υπάρχει η ίδια λέξη-κλειδί ξανά. 1009 00:44:19,700 --> 00:44:23,100 typedef που χρησιμοποιούμε για να δηλώσει εγχόρδων ως έναν ειδικό τύπο δεδομένων. 1010 00:44:23,100 --> 00:44:27,490 Μπορείτε να χρησιμοποιήσετε το typedef για να δημιουργήσετε καινούργιο τύπους δεδομένων που δεν υπήρχε όταν 1011 00:44:27,490 --> 00:44:28,570 C εφευρέθηκε. 1012 00:44:28,570 --> 00:44:32,520 Για παράδειγμα, int έρχεται με C. char έρχεται με C. διπλό έρχεται με C. Αλλά 1013 00:44:32,520 --> 00:44:34,000 δεν υπάρχει η έννοια του φοιτητή. 1014 00:44:34,000 --> 00:44:37,230 Και όμως θα ήταν πολύ χρήσιμο να είναι σε θέση να γράψει ένα πρόγραμμα που αποθηκεύει 1015 00:44:37,230 --> 00:44:40,440 σε μια μεταβλητή, τον αριθμό ταυτότητας του μαθητή, το όνομά τους, και το σπίτι τους. 1016 00:44:40,440 --> 00:44:42,890 Με άλλα λόγια, τρία τεμάχια δεδομένων, όπως μια int και 1017 00:44:42,890 --> 00:44:44,420 string και ένα άλλο string. 1018 00:44:44,420 --> 00:44:48,220 >> Με typedef, τι είναι αρκετά ισχυρό γι 'αυτό και η λέξη-κλειδί για sturct 1019 00:44:48,220 --> 00:44:53,660 δομή, εσείς, ο προγραμματιστής το 2013, μπορεί να καθορίσει πραγματικά το δικό σας 1020 00:44:53,660 --> 00:44:57,530 τύπους δεδομένων που δεν υπήρχε χρόνος πριν, αλλά ότι ταιριάζουν στους σκοπούς σας. 1021 00:44:57,530 --> 00:45:01,910 Και έτσι εδώ, στις γραμμές 13 έως 19, είμαστε δηλώνοντας ένα νέο τύπο δεδομένων, όπως 1022 00:45:01,910 --> 00:45:04,320 ένα int, αλλά αποκαλώντας μαθητή. 1023 00:45:04,320 --> 00:45:09,310 Και μέσα από αυτή τη μεταβλητή πρόκειται να είναι τρία πράγματα - ένα int, string, 1024 00:45:09,310 --> 00:45:09,930 και ένα σκοινί. 1025 00:45:09,930 --> 00:45:13,040 Έτσι, μπορείτε να σκεφτείτε τι πραγματικά συνέβη εδώ, έστω και αν αυτό είναι ένα 1026 00:45:13,040 --> 00:45:17,160 bit της απλοποίησης για σήμερα, ένας μαθητής ουσιαστικά θα 1027 00:45:17,160 --> 00:45:19,450 να μοιάζει με αυτό. 1028 00:45:19,450 --> 00:45:22,580 Του πρόκειται να είναι ένα μεγάλο κομμάτι της μνήμης με μια ταυτότητα, ένα όνομα 1029 00:45:22,580 --> 00:45:25,580 πεδίο, και ένα πεδίο σπίτι. 1030 00:45:25,580 --> 00:45:30,670 Και θα είμαστε σε θέση να χρησιμοποιήσει τα κομμάτια της μνήμη και την πρόσβαση σε αυτές ως εξής. 1031 00:45:30,670 --> 00:45:38,870 >> Αν πάω σε struct0.c, εδώ είναι μια σχετικά μεγάλη, αλλά μετά από μια 1032 00:45:38,870 --> 00:45:42,630 μοτίβο, του κώδικα που χρησιμοποιεί αυτό το νέο κόλπο. 1033 00:45:42,630 --> 00:45:45,790 Έτσι, η πρώτη, επιτρέψτε μου να επιστήσω την προσοχή σας με τα ενδιαφέροντα μέρη επάνω στην κορυφή. 1034 00:45:45,790 --> 00:45:49,670 Sharp ορίζει φοιτητές 3, δηλώνει μια σταθερά που ονομάζεται φοιτητές και εκδοχείς 1035 00:45:49,670 --> 00:45:53,450 αυθαίρετα τον αριθμό 3, ακριβώς έτσι έχω τρεις μαθητές που χρησιμοποιούν 1036 00:45:53,450 --> 00:45:54,830 το πρόγραμμα αυτό για τώρα. 1037 00:45:54,830 --> 00:45:55,960 Εδώ έρχεται Main. 1038 00:45:55,960 --> 00:45:58,860 Και προειδοποίηση, πώς μπορώ να δηλώνουν μια σειρά από φοιτητές; 1039 00:45:58,860 --> 00:46:00,480 Λοιπόν, μπορώ να χρησιμοποιήσω ακριβώς την ίδια σύνταξη. 1040 00:46:00,480 --> 00:46:02,110 Ο μαθητής λέξη είναι προφανώς νέος. 1041 00:46:02,110 --> 00:46:04,790 Αλλά μαθητή, τάξη, οι μαθητές βραχίονα. 1042 00:46:04,790 --> 00:46:06,720 >> Έτσι, δυστυχώς, υπάρχει πολύ της επαναχρησιμοποίησης των όρων εδώ. 1043 00:46:06,720 --> 00:46:07,660 Αυτό είναι απλά ένας αριθμός. 1044 00:46:07,660 --> 00:46:09,040 Έτσι, αυτό είναι σαν να λέμε τρεις. 1045 00:46:09,040 --> 00:46:11,430 Class είναι ακριβώς αυτό που θέλω να καλέσει τη μεταβλητή. 1046 00:46:11,430 --> 00:46:12,840 Θα μπορούσα να το ονομάσουμε φοιτητές. 1047 00:46:12,840 --> 00:46:15,880 Αλλά τάξη, αυτό δεν είναι μια τάξη σε ένα αντικειμενοστραφή είδος Java από το δρόμο. 1048 00:46:15,880 --> 00:46:17,220 Είναι απλά μια τάξη μαθητών. 1049 00:46:17,220 --> 00:46:20,590 Και ο τύπος δεδομένων του κάθε στοιχείου στην εν λόγω σειρά είναι φοιτητής. 1050 00:46:20,590 --> 00:46:23,040 Έτσι, αυτό είναι λίγο διαφορετικό και από το να πει κάτι 1051 00:46:23,040 --> 00:46:25,250 όπως αυτό, είναι απλά - 1052 00:46:25,250 --> 00:46:29,500 Λέω να μου δώσει τρεις μαθητές και να καλέσει αυτή την κλάση array. 1053 00:46:29,500 --> 00:46:29,800 >> Εντάξει. 1054 00:46:29,800 --> 00:46:30,680 Τώρα εδώ είναι τέσσερις βρόχο. 1055 00:46:30,680 --> 00:46:33,480 Εξοικειωμένοι Αυτός ο τύπος - επαναλάβει από το μηδέν σε μέχρι τρεις. 1056 00:46:33,480 --> 00:46:35,160 Και εδώ είναι το νέο κομμάτι της σύνταξης. 1057 00:46:35,160 --> 00:46:37,710 Το πρόγραμμα πρόκειται να μου ζητήσει, ο άνθρωπος, για να του δώσει ένα μαθητή 1058 00:46:37,710 --> 00:46:39,200 ID, το οποίο είναι ένα int. 1059 00:46:39,200 --> 00:46:44,650 Και εδώ είναι η σύνταξη με το οποίο μπορείτε να αποθηκεύουν κάτι το ID πεδίου σε 1060 00:46:44,650 --> 00:46:48,630 θέση κατηγορίας βραχίονα Ι. Έτσι Η σύνταξη αυτή δεν είναι νέα. 1061 00:46:48,630 --> 00:46:51,450 Αυτό σημαίνει απλά να μου δώσει την όγδοη μαθητής στην τάξη. 1062 00:46:51,450 --> 00:46:52,940 Αλλά αυτό το σύμβολο είναι νέα. 1063 00:46:52,940 --> 00:46:56,320 Μέχρι τώρα, έχουμε δεν μπορεί να χρησιμοποιηθεί τελεία, τουλάχιστον στον κώδικα όπως αυτό. 1064 00:46:56,320 --> 00:47:01,490 Αυτό σημαίνει πηγαίνετε στο struct είναι γνωστή ως ένας φοιτητής και να βάλει κάτι εκεί. 1065 00:47:01,490 --> 00:47:05,670 Ομοίως, σε αυτό το επόμενο γραμμή, 31, πηγαίνουν μπροστά και να βάλετε ό, τι πληκτρολογεί ο χρήστης 1066 00:47:05,670 --> 00:47:10,530 για ένα όνομα εδώ και τι κάνουν για μια σπίτι, το ίδιο πράγμα, να προχωρήσει και να 1067 00:47:10,530 --> 00:47:13,230 το βάζουμε σε. σπίτι. 1068 00:47:13,230 --> 00:47:15,955 >> Έτσι, αυτό που κάνει αυτό το πρόγραμμα τελικά να κάνουμε; 1069 00:47:15,955 --> 00:47:17,220 Μπορείτε να δείτε ένα μικρό teaser εκεί. 1070 00:47:17,220 --> 00:47:24,780 Επιτρέψτε μου να πάω μπροστά και να κάνουν structs 0 dot κάθετος struct 0, φοιτητική ταυτότητα του 1, 1071 00:47:24,780 --> 00:47:28,250 λένε David Mather, φοιτητής ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, φοιτητής ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 και το μόνο πράγμα που αυτό το πρόγραμμα το έκανε, το οποίο είναι ακριβώς εντελώς αυθαίρετη, είναι 1075 00:47:38,380 --> 00:47:40,980 Ήθελα να κάνω κάτι με αυτά τα δεδομένα, τώρα που έχω μας δίδαξε πώς να 1076 00:47:40,980 --> 00:47:43,450 χρησιμοποιήσετε structs, είναι απλά έπρεπε Αυτό το επιπλέον βρόχο εδώ. 1077 00:47:43,450 --> 00:47:45,260 Έχω επαναλάβει πάνω από τη συστοιχία των μαθητών. 1078 00:47:45,260 --> 00:47:49,170 Θα χρησιμοποιηθεί, μας ίσως τώρα γνώριμη φίλος, σύγκρισης συμβολοσειράς, stircomp να 1079 00:47:49,170 --> 00:47:53,780 Έλεγχος είναι το σπίτι 8ο μαθητή ίση με Mather; 1080 00:47:53,780 --> 00:47:56,760 Και αν ναι, μπορείτε να τυπώσετε κάτι αυθαίρετα ήθελα, ναι, είναι. 1081 00:47:56,760 --> 00:47:59,430 Αλλά και πάλι, απλά μου δίνει ευκαιρίες στη χρήση και επαναχρησιμοποίηση και 1082 00:47:59,430 --> 00:48:02,270 επαναχρησιμοποίηση αυτό το νέο συμβολισμό dot. 1083 00:48:02,270 --> 00:48:03,250 >> Έτσι, ποιος νοιάζεται, έτσι δεν είναι; 1084 00:48:03,250 --> 00:48:06,270 Έρχεται με ένα πρόγραμμα σπουδαστών είναι κάπως αυθαίρετη, αλλά αποδεικνύεται 1085 00:48:06,270 --> 00:48:09,800 που μπορούμε να κάνουμε χρήσιμα πράγματα με Αυτό, για παράδειγμα, ως ακολούθως. 1086 00:48:09,800 --> 00:48:14,600 Αυτό είναι ένα πολύ πιο πολύπλοκο struct στο C. Είναι πήρε μια δωδεκάδα ή περισσότερα πεδία, 1087 00:48:14,600 --> 00:48:15,880 κάπως μυστική ονομασία. 1088 00:48:15,880 --> 00:48:20,110 Αλλά αν έχετε ποτέ ακούσει για ένα γραφικών μορφή αρχείου που ονομάζεται bitmap, BMP, το 1089 00:48:20,110 --> 00:48:22,830 Αποδεικνύεται ότι η μορφή αρχείου bitmap λίγο πολύ μοιάζει με αυτό. 1090 00:48:22,830 --> 00:48:24,200 Είναι μια ηλίθια λίγο πρόσωπο Smiley. 1091 00:48:24,200 --> 00:48:27,840 Είναι μια μικρή εικόνα που έχω μεγεθύνεται για αρκετά μεγάλο έτσι ώστε θα μπορούσα να δω το καθένα 1092 00:48:27,840 --> 00:48:30,410 των μεμονωμένων κουκκίδων ή εικονοστοιχεία. 1093 00:48:30,410 --> 00:48:33,800 Τώρα, αποδεικνύεται ότι μπορούμε να αναπαραστήσουμε μια μαύρη κουκκίδα με, ας πούμε, τον αριθμό 0. 1094 00:48:33,800 --> 00:48:35,520 Και ένα λευκό τελεία με τον αριθμό 1. 1095 00:48:35,520 --> 00:48:39,140 >> Έτσι, με άλλα λόγια, εάν θέλετε να σχεδιάσετε ένα Χαμογελαστό πρόσωπο και να αποθηκεύσετε την εικόνα σε ένα 1096 00:48:39,140 --> 00:48:42,680 υπολογιστή, αρκεί να αποθηκεύουν και μηδενικά αυτοί που μοιάζει με αυτό, όπου, 1097 00:48:42,680 --> 00:48:45,250 και πάλι, αυτά είναι λευκά και μηδενικά είναι μαύρα. 1098 00:48:45,250 --> 00:48:48,290 Και μαζί, αν έχουν πράγματι ζώνομαι από μονάδες και μηδενικά, έχετε ένα 1099 00:48:48,290 --> 00:48:51,030 πλέγμα των pixels, και αν θέλετε να παίξετε τους έξω, έχετε ένα χαριτωμένο 1100 00:48:51,030 --> 00:48:52,560 λίγο πρόσωπο Smiley. 1101 00:48:52,560 --> 00:48:58,150 Τώρα, bitmap μορφή αρχείου, BMP, είναι ουσιαστικά ότι κάτω από το καπό, 1102 00:48:58,150 --> 00:49:00,970 αλλά με περισσότερα pixel sot που μπορεί να αντιπροσωπεύει πραγματικά χρώματα. 1103 00:49:00,970 --> 00:49:05,170 >> Αλλά όταν έχεις πιο εξελιγμένα μορφές αρχείων όπως BMP, JPEG και GIF 1104 00:49:05,170 --> 00:49:09,360 με τα οποία ίσως να είναι εξοικειωμένοι, εκείνοι αρχείων στο δίσκο συνήθως όχι μόνο 1105 00:49:09,360 --> 00:49:13,760 έχουν μηδενικά και αυτά γιά τα εικονοστοιχεία, αλλά έχουν κάποια μεταδεδομένα, καθώς και - 1106 00:49:13,760 --> 00:49:16,960 meta με την έννοια ότι δεν είναι πραγματικά δεδομένα, αλλά είναι χρήσιμο να έχουν. 1107 00:49:16,960 --> 00:49:21,370 Έτσι, αυτά τα πεδία εδώ υπονοείς, και θα δούμε αυτό με περισσότερες λεπτομέρειες στο P-set 1108 00:49:21,370 --> 00:49:25,810 5, ότι πριν από τα μηδενικά και αυτά που αντιπροσωπεύουν τα pixels σε μια εικόνα, 1109 00:49:25,810 --> 00:49:29,110 υπάρχει μια δέσμη των μεταδεδομένων, όπως το μέγεθος της εικόνας και η 1110 00:49:29,110 --> 00:49:30,250 πλάτος της εικόνας. 1111 00:49:30,250 --> 00:49:32,910 Και παρατηρήσετε είμαι μάδημα μακριά μερικά αυθαίρετες πράγματα εδώ - 1112 00:49:32,910 --> 00:49:34,260 πλάτος και ύψος. 1113 00:49:34,260 --> 00:49:36,160 Μετράνε bit και κάποια άλλα πράγματα. 1114 00:49:36,160 --> 00:49:37,840 Έτσι, υπάρχει κάποια μεταδεδομένα σε ένα αρχείο. 1115 00:49:37,840 --> 00:49:41,470 >> Αλλά με την κατανόηση πώς τα αρχεία που με αυτόν τον τρόπο, μπορείτε πραγματικά 1116 00:49:41,470 --> 00:49:45,890 στη συνέχεια να χειριστούν τις εικόνες, την ανάκτηση εικόνων από το δίσκο, το μέγεθος των εικόνων. 1117 00:49:45,890 --> 00:49:47,560 Αλλά δεν μπορείς απαραίτητα ενισχύσουν τους. 1118 00:49:47,560 --> 00:49:48,480 Χρειαζόμουν μια φωτογραφία. 1119 00:49:48,480 --> 00:49:52,840 Έτσι, πήγα πίσω στο RJ εδώ, που είδατε στην οθόνη πριν από αρκετό καιρό. 1120 00:49:52,840 --> 00:49:57,160 Κι αν ανοίξει Keynote εδώ, αυτό είναι Τι θα συμβεί αν προσπαθήσετε να κάνετε ζουμ μέσα και 1121 00:49:57,160 --> 00:49:59,380 ενίσχυση της RJ. 1122 00:49:59,380 --> 00:50:01,480 Δεν παίρνει καθόλου καλύτερα πραγματικά. 1123 00:50:01,480 --> 00:50:06,240 Τώρα Keynote είναι το είδος του θολώματος ένα λίγο, μόνο για να αποσιωπήσει το 1124 00:50:06,240 --> 00:50:11,040 γεγονός ότι RJ δεν παίρνει ιδιαίτερα ενισχυμένη όταν μεγεθύνετε 1125 00:50:11,040 --> 00:50:13,310 Και αν το κάνετε με αυτό τον τρόπο, δείτε τα τετράγωνα; 1126 00:50:13,310 --> 00:50:15,490 Ναι, μπορείτε σίγουρα να δείτε οι πλατείες σε ένα προβολέα. 1127 00:50:15,490 --> 00:50:17,690 >> Αυτό είναι αυτό που παίρνετε, όταν θα ενισχυθεί. 1128 00:50:17,690 --> 00:50:22,570 Αλλά στην κατανόηση του τρόπου RJ μας ή το Χαμογελαστό πρόσωπο υλοποιείται θα μας επιτρέψει να 1129 00:50:22,570 --> 00:50:24,950 στην πραγματικότητα γράφουν κώδικα που χειρίζεται αυτά τα πράγματα. 1130 00:50:24,950 --> 00:50:29,970 Και σκέφτηκα να τελειώσω με αυτό, με 55 δευτερόλεπτα από μια ενίσχυση που είναι, 1131 00:50:29,970 --> 00:50:31,230 Τολμώ, ας πούμε μάλλον παραπλανητικό. 1132 00:50:31,230 --> 00:50:32,990 >> [PLAYBACK VIDEO] 1133 00:50:32,990 --> 00:50:34,790 >> -Λέει ψέματα. 1134 00:50:34,790 --> 00:50:38,310 Σχετικά με αυτό, δεν ξέρω. 1135 00:50:38,310 --> 00:50:41,200 >> -Λοιπόν, τι ξέρουμε; 1136 00:50:41,200 --> 00:50:45,280 >> -Ότι στις 9:15 Ray Santoya ήταν στο ΑΤΜ. 1137 00:50:45,280 --> 00:50:47,830 >> -Έτσι, το ερώτημα είναι τι κάνει αυτός στις 9:16; 1138 00:50:47,830 --> 00:50:50,750 >> -Σκοποβολή η εννέα χιλιοστών σε κάτι. 1139 00:50:50,750 --> 00:50:52,615 Ίσως είδε τον ελεύθερο σκοπευτή. 1140 00:50:52,615 --> 00:50:54,760 >> -Ή δούλευε μαζί του. 1141 00:50:54,760 --> 00:50:56,120 >> -Περίμενε. 1142 00:50:56,120 --> 00:50:57,450 Πήγαινε πίσω ένα. 1143 00:50:57,450 --> 00:50:58,700 >> -Τι βλέπεις; 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Φέρτε το πρόσωπό του, την πλήρη οθόνη. 1146 00:51:09,490 --> 00:51:09,790 >> -Του γυαλιά. 1147 00:51:09,790 --> 00:51:11,040 >> -Υπάρχει μια αντανάκλαση. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Αυτή είναι η ομάδα μπέιζμπολ Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 Αυτό είναι το λογότυπο τους. 1151 00:51:24,530 --> 00:51:27,040 >> -Και μιλάει σε όποιον είναι ότι φοράει σακάκι. 1152 00:51:27,040 --> 00:51:27,530 >> [PLAYBACK VIDEO END] 1153 00:51:27,530 --> 00:51:29,180 >> David J. MALAN: Αυτό θα να οριστεί Πρόβλημα 5. 1154 00:51:29,180 --> 00:51:30,720 Θα σας δούμε την επόμενη εβδομάδα. 1155 00:51:30,720 --> 00:51:32,330 >> MALE ΟΜΙΛΗΤΗΣ: Στην επόμενη CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Τριζόνια κελαηδούν] 1157 00:51:39,240 --> 00:51:41,270 >> [Παίζει μουσική]