1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [ΤΜΗΜΑ 5: λιγότερο άνετα] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Πανεπιστήμιο Χάρβαρντ] 3 00:00:05,180 --> 00:00:08,260 [Αυτό είναι CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Έτσι, καλώς ήρθατε πίσω, παιδιά. 5 00:00:11,690 --> 00:00:16,320 Καλώς ήρθατε στο τμήμα 5. 6 00:00:16,320 --> 00:00:20,220 Σε αυτό το σημείο, έχοντας ολοκληρώσει κουίζ 0 και έχοντας δει πώς έχετε κάνει, 7 00:00:20,220 --> 00:00:25,770 ελπίζω να αισθάνεστε πολύ καλά, γιατί ήμουν πολύ εντυπωσιασμένος από τα αποτελέσματα σε αυτή την ενότητα. 8 00:00:25,770 --> 00:00:28,050 Για τους θεατές σε απευθείας σύνδεση μας, είχαμε μερικές ερωτήσεις 9 00:00:28,050 --> 00:00:33,680 για τα τελευταία δύο προβλήματα για το σύνολο πρόβλημα - ή στο κουίζ, μάλλον. 10 00:00:33,680 --> 00:00:39,690 Έτσι θα πάμε για να πάει πέρα ​​από τα πραγματικά γρήγορα, έτσι ώστε ο καθένας βλέπει ό, τι συνέβη 11 00:00:39,690 --> 00:00:45,060 και πώς να περάσει μέσα από την πραγματική λύση και όχι μόνο την προβολή της ίδιας λύση. 12 00:00:45,060 --> 00:00:50,330 Εμείς πάμε για να πάει πέρα ​​από το τελευταίο ζεύγος των προβλημάτων πραγματικά γρήγορα, 32 και 33. 13 00:00:50,330 --> 00:00:53,240 Ακριβώς, και πάλι, έτσι ώστε οι τηλεθεατές σε απευθείας σύνδεση μπορούν να δουν αυτό. 14 00:00:53,240 --> 00:00:59,080 >> Εάν ενεργοποιήσετε το πρόβλημά σας 32, η οποία βρίσκεται στη σελίδα 13, 15 00:00:59,080 --> 00:01:02,730 13 από 16, 32 είναι πρόβλημα για όλες τις ανταλλαγές. 16 00:01:02,730 --> 00:01:05,010 Ήταν όλα σχετικά με την εναλλαγή δύο ακέραιοι. 17 00:01:05,010 --> 00:01:08,740 Είναι το πρόβλημα που είχαμε περάσει πάνω από μια-δυο φορές σε διάλεξη. 18 00:01:08,740 --> 00:01:13,590 Και εδώ, αυτό που ζητούσαν να κάνετε είναι μια γρήγορη ίχνος μνήμης. 19 00:01:13,590 --> 00:01:17,000 Για να συμπληρώσουμε τα τιμές των μεταβλητών όπως είναι στη στοίβα 20 00:01:17,000 --> 00:01:20,250 όπως ο κώδικας περνάει μέσα από αυτή τη λειτουργία swap. 21 00:01:20,250 --> 00:01:24,500 Συγκεκριμένα, αυτό που ψάχνουμε σε - Πάω να θέσει αυτό το iPad κάτω - 22 00:01:24,500 --> 00:01:29,650 ειδικότερα, αυτό που ψάχνουμε είναι σε αυτή τη γραμμή αριθμό 6 δεξιά εδώ. 23 00:01:29,650 --> 00:01:36,740 Και αυτό είναι αριθμημένα 6 για λίγο γειτνίαση με το προηγούμενο πρόβλημα. 24 00:01:36,740 --> 00:01:41,720 Αυτό που θέλουμε να κάνουμε είναι να εμφανίσετε ή να επισημαίνουν την κατάσταση της μνήμης 25 00:01:41,720 --> 00:01:46,090 όπως είναι κατά τη στιγμή εκτελούμε αυτό τον αριθμό της γραμμής 6, 26 00:01:46,090 --> 00:01:52,540 το οποίο είναι ουσιαστικά μια επιστροφή από την λειτουργία ανταλλαγής μας εδώ. 27 00:01:52,540 --> 00:01:59,450 Αν μετακινηθείτε προς τα κάτω εδώ, είδαμε ότι οι διευθύνσεις των πάντων στη μνήμη δόθηκε για μας. 28 00:01:59,450 --> 00:02:02,540 Αυτό είναι πολύ βασικό? Θα επανέλθουμε σε αυτό σε λίγο. 29 00:02:02,540 --> 00:02:09,240 Και τότε εδώ κάτω στο κάτω μέρος, είχαμε ένα μικρό διάγραμμα μνήμης που θα πάμε να αναφερθώ. 30 00:02:09,240 --> 00:02:12,490 Έχω κάνει πραγματικά αυτό έξω στο iPad μου. 31 00:02:12,490 --> 00:02:20,720 Έτσι, Πάω να εναλλάσσονται εμπρός και πίσω μεταξύ του iPad και αυτόν τον κώδικα μόνο για αναφορά. 32 00:02:20,720 --> 00:02:26,540 >> Ας ξεκινήσει. Κατ 'αρχάς, ας επικεντρωθεί στο πρώτο ζευγάρι των γραμμών του κύριου εδώ. 33 00:02:26,540 --> 00:02:30,220 Για να ξεκινήσετε, θα πάμε να προετοιμαστεί για x 1 και y για να 2. 34 00:02:30,220 --> 00:02:33,040 Έτσι έχουμε δύο ακέραιες μεταβλητές, από όπου και αν και οι δύο πρόκειται να τοποθετηθούν στη στοίβα. 35 00:02:33,040 --> 00:02:36,050 Εμείς πάμε για να βάλετε ένα 1 και ένα 2 σε αυτούς. 36 00:02:36,050 --> 00:02:43,150 Έτσι, αν flip πάνω στο iPad μου, ελπίζω, ας δούμε - 37 00:02:43,150 --> 00:02:48,660 Apple TV mirroring, και εκεί πάμε. Εντάξει. 38 00:02:48,660 --> 00:02:51,670 Έτσι, αν flip πάνω στο iPad μου, 39 00:02:51,670 --> 00:02:56,220 Θέλω να προετοιμαστεί για x 1 και y για να 2. 40 00:02:56,220 --> 00:03:00,580 Εμείς το κάνουμε αυτό πολύ απλά γράφοντας ένα 1 στο κουτί με την ένδειξη x 41 00:03:00,580 --> 00:03:07,730 και 2 στο κουτί με την ένδειξη y. Αρκετά απλό. 42 00:03:07,730 --> 00:03:11,620 Έτσι τώρα ας πάμε πίσω στο φορητό υπολογιστή, να δούμε τι θα συμβεί στη συνέχεια. 43 00:03:11,620 --> 00:03:15,810 Έτσι, αυτή η επόμενη γραμμή είναι όπου τα πράγματα παίρνουν δύσκολο. 44 00:03:15,810 --> 00:03:28,110 Περνάμε τη διεύθυνση του x και τη διεύθυνση του y ως τις παραμέτρους a και b με τη λειτουργία ανταλλαγής. 45 00:03:28,110 --> 00:03:32,380 Η διεύθυνση του x και τη διεύθυνση του y είναι πράγματα που δεν μπορούμε να υπολογίσουμε 46 00:03:32,380 --> 00:03:36,360 χωρίς να αναφερθεί σε αυτά τα σημεία δεξιά σφαίρα εδώ κάτω. 47 00:03:36,360 --> 00:03:39,750 Και ευτυχώς, οι δύο πρώτες κουκκίδες να μας πει τι ακριβώς είναι οι απαντήσεις. 48 00:03:39,750 --> 00:03:44,740 Η διεύθυνση του χ είναι στη μνήμη 10, και η διεύθυνση του y στη μνήμη είναι 14. 49 00:03:44,740 --> 00:03:51,870 Έτσι, αυτές είναι οι αξίες που παίρνουν πέρασε στην ως α και β επάνω στην κορυφή σε λειτουργία ανταλλαγής μας. 50 00:03:51,870 --> 00:04:00,760 Έτσι, και πάλι, η μετάβαση πίσω στο διάγραμμα μας, μπορώ να γράψω ένα 10 σε μια 51 00:04:00,760 --> 00:04:07,400 και 14 στο β. 52 00:04:07,400 --> 00:04:11,610 Τώρα, αυτό είναι το σημείο όπου έχουμε προχωρήσει με τη συμφωνία ανταλλαγής. 53 00:04:11,610 --> 00:04:14,520 Έτσι το κτύπημα πίσω στο laptop και πάλι, 54 00:04:14,520 --> 00:04:21,079 βλέπουμε ότι ο τρόπος που λειτουργεί η ανταλλαγή είναι για πρώτη φορά dereference ένα κατάστημα και το αποτέλεσμα στο tmp. 55 00:04:21,079 --> 00:04:27,650 Έτσι, ο χειριστής dereference λέει, "Hey. Αντιμετωπίστε τα περιεχόμενα της μεταβλητής ως μια διεύθυνση. 56 00:04:27,650 --> 00:04:33,830 Μετάβαση σε ό, τι είναι αποθηκευμένο σε αυτή τη διεύθυνση, και το φορτίο αυτό. " 57 00:04:33,830 --> 00:04:41,720 Τι τοποθετήσετε έξω από τη μεταβλητή πρόκειται να αποθηκευτούν σε μεταβλητή tmp μας. 58 00:04:41,720 --> 00:04:45,150 Flipping πίσω στο iPad. 59 00:04:45,150 --> 00:04:51,690 Αν πάμε να αντιμετωπίσει 10, γνωρίζουμε ότι η διεύθυνση 10 είναι το μεταβλητό x 60 00:04:51,690 --> 00:04:55,480 γιατί μας είπαν από την κουκίδα μας ότι η διεύθυνση του x στη μνήμη είναι 10. 61 00:04:55,480 --> 00:05:00,180 Έτσι, μπορούμε να πάμε εκεί, να πάρει την αξία του, η οποία είναι 1, όπως βλέπουμε στο iPad μας, 62 00:05:00,180 --> 00:05:06,300 και να φορτώσετε ότι σε tmp. 63 00:05:06,300 --> 00:05:08,250 Και πάλι, αυτό δεν είναι το τελικό περιεχόμενο. 64 00:05:08,250 --> 00:05:14,350 Εμείς πάμε για να περπατήσει μέσα και θα φτάσουμε στον τελικό μας κατάσταση του προγράμματος στο τέλος. 65 00:05:14,350 --> 00:05:17,210 Αλλά αυτή τη στιγμή, έχουμε την τιμή 1 αποθηκεύονται σε tmp. 66 00:05:17,210 --> 00:05:19,210 >> Και υπάρχει μια γρήγορη ερώτηση εδώ. 67 00:05:19,210 --> 00:05:23,980 [Αλέξανδρος] Είναι ο χειριστής dereference - αυτό είναι ακριβώς το σωστό αστέρι μπροστά από τη μεταβλητή; 68 00:05:23,980 --> 00:05:27,600 Ναι >>. Έτσι, ο χειριστής dereference, όπως κτύπημα πίσω στο laptop μας για άλλη μια φορά, 69 00:05:27,600 --> 00:05:33,780 είναι αυτό το αστέρι μπροστά. 70 00:05:33,780 --> 00:05:37,460 Υπό αυτή την έννοια, είναι - να το αντιπαραβάλει με το διαχειριστή του πολλαπλασιασμού 71 00:05:37,460 --> 00:05:42,400 η οποία απαιτεί δύο πράγματα? ο χειριστής dereference είναι ένας μοναδιαίος τελεστής. 72 00:05:42,400 --> 00:05:46,130 Μόλις εφαρμοστεί σε μία τιμή, σε αντίθεση με ένα φορέα δυαδικό 73 00:05:46,130 --> 00:05:48,810 όπου θα ισχύουν για δύο διαφορετικές τιμές. 74 00:05:48,810 --> 00:05:52,080 Έτσι, αυτό είναι ό, τι συμβαίνει σε αυτή τη γραμμή. 75 00:05:52,080 --> 00:05:58,390 Φορτώσαμε την τιμή 1 και να αποθηκεύονται προσωρινά σε ακέραια μεταβλητή μας. 76 00:05:58,390 --> 00:06:05,800 Η επόμενη γραμμή, αποθηκεύουμε το περιεχόμενο του β σε - 77 00:06:05,800 --> 00:06:12,630 ή, μάλλον, έχουμε αποθηκεύσει τα περιεχόμενα που β δείχνει να σε τόπο όπου δείχνει να. 78 00:06:12,630 --> 00:06:17,690 Αν αναλύσουμε αυτό από τα δεξιά προς τα αριστερά, πρόκειται να dereference β, 79 00:06:17,690 --> 00:06:23,580 πρόκειται να αντιμετωπίσει 14, πρόκειται να αρπάξει την ακέραιος που είναι εκεί, 80 00:06:23,580 --> 00:06:26,900 και στη συνέχεια πρόκειται να πάει στην διεύθυνση 10, 81 00:06:26,900 --> 00:06:34,240 και πρόκειται να ρίξει το αποτέλεσμα της dereference μας του β σε αυτό το χώρο. 82 00:06:34,240 --> 00:06:40,080 Flipping πίσω στο iPad μας, όπου μπορούμε να κάνουμε αυτό το λίγο πιο συγκεκριμένο, 83 00:06:40,080 --> 00:06:44,070 θα μπορούσε να βοηθήσει αν γράφω αριθμούς σε όλες τις διευθύνσεις εδώ. 84 00:06:44,070 --> 00:06:53,820 Έτσι, γνωρίζουμε ότι στο y, είμαστε στη διεύθυνση 14, x είναι στη διεύθυνση 10. 85 00:06:53,820 --> 00:07:00,180 Όταν ξεκινούν β, εμείς dereference β, θα πάμε να αρπάξει την τιμή 2. 86 00:07:00,180 --> 00:07:08,320 Θα αρπάξει αυτή την τιμή, διότι αυτή είναι η αξία που ζει στην διεύθυνση 14. 87 00:07:08,320 --> 00:07:15,700 Και θα πάμε για να το θέσω στη μεταβλητή που ζει στην διεύθυνση 10, 88 00:07:15,700 --> 00:07:19,160 το οποίο είναι ακριβώς εκεί, που αντιστοιχεί σε μια μεταβλητή x μας. 89 00:07:19,160 --> 00:07:21,810 Έτσι, μπορούμε να κάνουμε ένα μικρό κομμάτι από την αντικατάσταση εδώ 90 00:07:21,810 --> 00:07:35,380 όπου μπορούμε να απαλλαγούμε από 1 μας και αντί να γράφουμε ένα 2. 91 00:07:35,380 --> 00:07:39,560 Έτσι, όλα είναι ωραία και καλά στον κόσμο, ακόμα κι αν έχουμε αντικατασταθούν x τώρα. 92 00:07:39,560 --> 00:07:44,890 Έχουμε αποθηκεύονται παλιά τιμή του x σε μεταβλητή tmp μας. 93 00:07:44,890 --> 00:07:50,210 Έτσι, θα μπορέσουμε να ολοκληρώσουμε τη συμφωνία ανταλλαγής με την επόμενη γραμμή. 94 00:07:50,210 --> 00:07:53,030 Flipping πίσω στο φορητό υπολογιστή μας. 95 00:07:53,030 --> 00:07:58,150 Τώρα το μόνο που απομένει είναι να λάβει το περιεχόμενο από την προσωρινή μεταβλητή ακέραιου μας 96 00:07:58,150 --> 00:08:05,630 και να τις αποθηκεύσετε στην μεταβλητή που ζει στην διεύθυνση που κρατά b. 97 00:08:05,630 --> 00:08:10,230 Έτσι θα πάμε για την αποτελεσματική β dereference για να αποκτήσετε πρόσβαση στη μεταβλητή 98 00:08:10,230 --> 00:08:14,340 δηλαδή στη διεύθυνση που κατέχει β σε αυτό, 99 00:08:14,340 --> 00:08:19,190 και θα πάμε για να γεμίσει την αξία που tmp κρατά σε αυτό. 100 00:08:19,190 --> 00:08:23,280 Flipping πίσω στο iPad για μια ακόμη φορά. 101 00:08:23,280 --> 00:08:31,290 Μπορώ να διαγράψετε αυτή την τιμή, εδώ 2, 102 00:08:31,290 --> 00:08:41,010 και αντ 'αυτού θα αντιγράψει το 1 δικαίωμα σε αυτό. 103 00:08:41,010 --> 00:08:43,059 Στη συνέχεια, η επόμενη γραμμή που εκτελεί, φυσικά - 104 00:08:43,059 --> 00:08:47,150 αν γυρίσετε πίσω στο φορητό υπολογιστή - αυτό είναι το σημείο 6, 105 00:08:47,150 --> 00:08:52,500 το οποίο είναι το σημείο στο οποίο θέλουμε να έχουμε διάγραμμα μας συμπληρωμένη. 106 00:08:52,500 --> 00:08:58,940 Έτσι το κτύπημα πίσω στο iPad για μια ακόμη φορά, ακριβώς έτσι μπορείτε να δείτε το ολοκληρωμένο διάγραμμα, 107 00:08:58,940 --> 00:09:06,610 μπορείτε να δείτε ότι έχουμε ένα 10 σε μια, σε ένα 14 β, σε αναλογία 1 προς tmp, 2 σε x, και 1 στο y. 108 00:09:06,610 --> 00:09:11,000 Υπάρχουν ερωτήσεις σχετικά με αυτό; 109 00:09:11,000 --> 00:09:14,640 Μήπως αυτό κάνει πιο λογικό, αφού περπάτησαν μέσα από αυτό; 110 00:09:14,640 --> 00:09:24,850 Κάντε λιγότερο νόημα; Ας ελπίσουμε ότι δεν είναι. Εντάξει. 111 00:09:24,850 --> 00:09:28,230 >> Οι δείκτες είναι ένα πολύ δύσκολο θέμα. 112 00:09:28,230 --> 00:09:33,420 Ένα από τα παιδιά που εργάζονται με έχει ένα πολύ κοινό ρητό: 113 00:09:33,420 --> 00:09:36,590 "Για να καταλάβουμε δείκτες, θα πρέπει πρώτα να καταλάβουμε δείκτες." 114 00:09:36,590 --> 00:09:40,530 Ποια πιστεύω ότι είναι πολύ αληθινό. Κάνει να πάρει λίγο χρόνο για να το συνηθίσεις. 115 00:09:40,530 --> 00:09:45,360 Με πολλές φωτογραφίες, κλήρωση των διαγραμμάτων μνήμης όπως αυτή είναι πολύ χρήσιμη, 116 00:09:45,360 --> 00:09:49,480 και αφού σας καθοδηγήσει παράδειγμα μετά παράδειγμα μετά παράδειγμα, 117 00:09:49,480 --> 00:09:54,450 αυτό θα αρχίσει να κάνει λίγο περισσότερο νόημα και λίγο περισσότερο νόημα και λίγο περισσότερο νόημα. 118 00:09:54,450 --> 00:10:01,560 Τέλος, μια μέρα, θα έχετε όλα πλήρως κατακτηθεί. 119 00:10:01,560 --> 00:10:13,800 Οποιεσδήποτε ερωτήσεις πριν προχωρήσουμε στο επόμενο πρόβλημα; Εντάξει. 120 00:10:13,800 --> 00:10:18,840 Έτσι, γυρίστε πίσω στο φορητό υπολογιστή. 121 00:10:18,840 --> 00:10:23,300 Το επόμενο πρόβλημα που έχουμε είναι το νούμερο 33 στο πρόβλημα αρχείο I / O. 122 00:10:23,300 --> 00:10:26,350 Μεγέθυνση σε αυτό το λίγο. 123 00:10:26,350 --> 00:10:28,710 Πρόβλημα 33 - Ναι; 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Είχα μόλις μια γρήγορη ερώτηση. Αυτό το αστέρι, ή ο αστερίσκος, 125 00:10:32,110 --> 00:10:35,590 λέγεται εύρεση τιμών, όταν χρησιμοποιείτε έναν αστερίσκο πριν. 126 00:10:35,590 --> 00:10:38,820 Τι είναι αυτό που ονομάζεται όταν χρησιμοποιείτε το εμπορικό και πριν; 127 00:10:38,820 --> 00:10:43,140 >> Το εμπορικό είναι πριν από την διεύθυνση του-χειριστή. 128 00:10:43,140 --> 00:10:45,880 Ας μετακινηθείτε προς τα πίσω επάνω. 129 00:10:45,880 --> 00:10:49,310 Ωχ. Είμαι σε λειτουργία ζουμ, έτσι δεν μπορώ πραγματικά κύλισης. 130 00:10:49,310 --> 00:10:52,780 Αν κοιτάξουμε αυτόν τον κώδικα πολύ γρήγορα εδώ, 131 00:10:52,780 --> 00:10:54,980 και πάλι, το ίδιο πράγμα συμβαίνει. 132 00:10:54,980 --> 00:10:59,180 Αν κοιτάξουμε αυτόν τον κώδικα ακριβώς εδώ, σε αυτή τη γραμμή, όπου θα γίνει η κλήση για να ανταλλάξουν, 133 00:10:59,180 --> 00:11:10,460 Το εμπορικό είναι ακριβώς λέγοντας "να πάρει τη διεύθυνση στην οποία ζει μεταβλητή x." 134 00:11:10,460 --> 00:11:14,460 Όταν μεταγλωττιστή σας μεταγλωττίζει τον κωδικό σας, 135 00:11:14,460 --> 00:11:20,590 πρέπει να σηματοδοτήσει πραγματικά φυσικά μια θέση στη μνήμη για όλες τις μεταβλητές σας για να ζήσουν. 136 00:11:20,590 --> 00:11:24,910 Και έτσι αυτό που ο μεταγλωττιστής μπορεί να κάνει τότε τη στιγμή που θα καταρτίζονται τα πάντα, 137 00:11:24,910 --> 00:11:31,110 γνωρίζει, "Ω, έβαλα στη διεύθυνση x 10. έβαλα στη διεύθυνση y 14." 138 00:11:31,110 --> 00:11:34,640 Μπορεί στη συνέχεια να συμπληρώσετε σε αυτές τις τιμές για εσάς. 139 00:11:34,640 --> 00:11:44,740 Έτσι, μπορείτε στη συνέχεια - μπορεί να περάσει στη συνέχεια σε αυτό και να περάσει και στο y, καθώς και. 140 00:11:44,740 --> 00:11:50,730 Αυτοί οι τύποι παίρνουν τη διεύθυνση, αλλά επίσης, όταν τα περάσει στη λειτουργία ανταλλαγής, 141 00:11:50,730 --> 00:11:55,690 αυτό το είδος πληροφοριών, αυτό int * δικαίωμα εδώ, λέει ο compiler, 142 00:11:55,690 --> 00:12:01,350 «Εντάξει, θα πάμε να την ερμηνεία αυτή ως διεύθυνση τη διεύθυνση της μεταβλητής ακεραίου." 143 00:12:01,350 --> 00:12:05,900 Ως μια διεύθυνση ενός int, η οποία είναι διαφορετική από τη διεύθυνση μιας μεταβλητής χαρακτήρα 144 00:12:05,900 --> 00:12:09,930 επειδή ένας int καταλαμβάνει, σε 32-bit μηχανή, καταλαμβάνει 4 bytes του χώρου, 145 00:12:09,930 --> 00:12:13,310 ενώ ένας χαρακτήρας παίρνει μόνο το 1 byte του χώρου. 146 00:12:13,310 --> 00:12:17,310 Γι 'αυτό είναι σημαντικό να γνωρίζουμε τι είναι, επίσης, - ό, τι ζει, το είδος της αξίας 147 00:12:17,310 --> 00:12:20,340 ζει στη διεύθυνση που έχεις περάσει μέσα 148 00:12:20,340 --> 00:12:22,020 Ή η διεύθυνση ότι έχουμε να κάνουμε με. 149 00:12:22,020 --> 00:12:29,020 Με αυτόν τον τρόπο, ξέρεις πόσα bytes πληροφοριών πραγματικά να φορτώσει από RAM σας. 150 00:12:29,020 --> 00:12:31,780 Και τότε, ναι, αυτό το χειριστή dereference, σαν να ζητούσαν, 151 00:12:31,780 --> 00:12:37,200 πηγαίνει και πρόσβαση στις πληροφορίες σε μια συγκεκριμένη διεύθυνση. 152 00:12:37,200 --> 00:12:42,820 Έτσι, λέει, με αυτό εδώ μια μεταβλητή, τη θεραπεία των περιεχομένων του ως μια διεύθυνση, 153 00:12:42,820 --> 00:12:47,880 μεταβεί στη συγκεκριμένη διεύθυνση, και τραβήξτε προς τα έξω, τοποθετήστε στον επεξεργαστή, το φορτίο σε ένα μητρώο 154 00:12:47,880 --> 00:12:56,340 οι πραγματικές τιμές ή τα περιεχόμενα που ζουν σε αυτή τη διεύθυνση. 155 00:12:56,340 --> 00:12:59,620 Κάθε άλλες ερωτήσεις; Αυτές είναι καλές ερωτήσεις. 156 00:12:59,620 --> 00:13:01,650 Είναι πολλά νέα ορολογία πάρα πολύ. 157 00:13:01,650 --> 00:13:09,800 Είναι επίσης το είδος του funky, βλέποντας & * και σε διαφορετικά μέρη. 158 00:13:09,800 --> 00:13:13,180 >> Εντάξει. 159 00:13:13,180 --> 00:13:18,530 Έτσι, πίσω στο πρόβλημα 33, file I / O. 160 00:13:18,530 --> 00:13:22,540 Αυτό ήταν ένα από εκείνα τα προβλήματα που πιστεύω ότι μερικά πράγματα συνέβησαν. 161 00:13:22,540 --> 00:13:25,400 Ένας, είναι ένα αρκετά νέο θέμα. 162 00:13:25,400 --> 00:13:30,590 Παρουσιάστηκε πολύ σύντομα πριν από τη κουίζ, 163 00:13:30,590 --> 00:13:33,400 και τότε νομίζω ότι ήταν κάτι σαν ένα από αυτά τα προβλήματα λέξη μαθηματικά σε 164 00:13:33,400 --> 00:13:39,720 όπου θα σας δώσει πολλές πληροφορίες, αλλά στην πραγματικότητα δεν καταλήγουν να χρειάζεται να χρησιμοποιούν έναν τόνο του. 165 00:13:39,720 --> 00:13:44,060 Το πρώτο μέρος αυτού του προβλήματος που περιγράφει τι είναι αρχείο CSV. 166 00:13:44,060 --> 00:13:50,620 Τώρα, ένα αρχείο CSV, σύμφωνα με την περιγραφή, είναι διαχωρισμένες με κόμμα αρχείο αξίες. 167 00:13:50,620 --> 00:13:55,300 Ο λόγος που αυτές είναι καθόλου ενδιαφέρουσα, και ο λόγος που τα χρησιμοποιούν ποτέ, 168 00:13:55,300 --> 00:14:00,800 είναι, γιατί, πόσοι από σας έχουν χρησιμοποιήσει ποτέ τα πράγματα όπως το Excel; 169 00:14:00,800 --> 00:14:03,240 Εικόνα οι περισσότεροι από εσάς έχουν, κατά πάσα πιθανότητα, ή θα χρησιμοποιήσει σε κάποιο σημείο στη ζωή σας. 170 00:14:03,240 --> 00:14:06,430 Θα χρησιμοποιήσετε κάτι όπως το Excel. 171 00:14:06,430 --> 00:14:10,940 Για να πάρετε τα δεδομένα από ένα υπολογιστικό φύλλο Excel ή να κάνετε οποιοδήποτε είδος της επεξεργασίας με αυτό, 172 00:14:10,940 --> 00:14:17,240 αν θέλετε να γράψετε ένα πρόγραμμα C ή Python πρόγραμμα, Java πρόγραμμα, 173 00:14:17,240 --> 00:14:20,070 να ασχοληθεί με τα δεδομένα που έχετε αποθηκεύσει εκεί, 174 00:14:20,070 --> 00:14:23,170 ένας από τους πιο κοινούς τρόπους για να βγούμε είναι σε ένα αρχείο CSV. 175 00:14:23,170 --> 00:14:26,850 Και μπορείτε να ανοίξετε το Excel και όταν θα πάτε στο "Save As" διαλόγου, 176 00:14:26,850 --> 00:14:32,840 μπορείτε να πάρετε από ένα πραγματικό αρχείο CSV. 177 00:14:32,840 --> 00:14:35,890 >> Handy για να μάθετε πώς να ασχοληθεί με αυτά τα πράγματα. 178 00:14:35,890 --> 00:14:42,010 Ο τρόπος που λειτουργεί είναι ότι είναι παρόμοια με - Θέλω να πω, αυτό είναι ουσιαστικά μιμείται ένα υπολογιστικό φύλλο, 179 00:14:42,010 --> 00:14:47,590 όπου, όπως βλέπουμε εδώ, σε πολύ πιο αριστερά-κομμάτι, 180 00:14:47,590 --> 00:14:49,910 έχουμε όλα τα τελευταία ονόματα. 181 00:14:49,910 --> 00:14:54,670 Έτσι έχουμε Malan, τότε Hardison, και στη συνέχεια Bowden, MacWilliam, και στη συνέχεια Chan. 182 00:14:54,670 --> 00:14:59,470 Όλα τα τελευταία ονόματα. Και τότε ένα κόμμα διαχωρίζει τα τελευταία ονόματα από τα πρώτα ονόματα. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, και Zamyla. 184 00:15:02,970 --> 00:15:06,850 Πάντα ανακατεύουμε μέχρι Robby και Τομ. 185 00:15:06,850 --> 00:15:10,940 Και τότε, τελικά, η τρίτη στήλη είναι οι διευθύνσεις ηλεκτρονικού ταχυδρομείου. 186 00:15:10,940 --> 00:15:18,500 Μόλις καταλάβετε ότι, το υπόλοιπο του προγράμματος είναι αρκετά απλή στην εφαρμογή της. 187 00:15:18,500 --> 00:15:23,850 Αυτό που κάναμε, προκειμένου να μιμηθεί την ίδια δομή στο Γ πρόγραμμα μας 188 00:15:23,850 --> 00:15:27,510 το έχουμε χρησιμοποιήσει μια δομή. 189 00:15:27,510 --> 00:15:30,520 Θα αρχίσετε να παίζετε με αυτά λίγο περισσότερο, καθώς και. 190 00:15:30,520 --> 00:15:35,790 Τους είδαμε για πρώτη λίγο πρόβλημα στο σύνολο 3, όταν είχαμε να κάνουμε με τα λεξικά. 191 00:15:35,790 --> 00:15:40,290 Αλλά αυτό το struct προσωπικό αποθηκεύει ένα επώνυμο, το όνομα, και ένα email. 192 00:15:40,290 --> 00:15:44,500 Ακριβώς όπως CSV αρχείο μας αποθήκευση. 193 00:15:44,500 --> 00:15:47,950 Έτσι, αυτό είναι απλά τη μετατροπή από τη μία μορφή στην άλλη. 194 00:15:47,950 --> 00:15:54,630 Πρέπει να μετατρέψετε, σε αυτή την περίπτωση, ένα struct προσωπικό σε μια γραμμή, 195 00:15:54,630 --> 00:15:59,060 μια διαχωρισμένη με κόμματα γραμμή, έτσι απλά. 196 00:15:59,060 --> 00:16:01,500 Μήπως αυτό έχει νόημα; Εσείς έχετε πάρει όλα τα κουίζ, 197 00:16:01,500 --> 00:16:07,680 έτσι φαντάζομαι έχετε τουλάχιστον είχε λίγο χρόνο για να σκεφτεί για αυτό. 198 00:16:07,680 --> 00:16:16,410 >> Σε λειτουργία μίσθωση, το πρόβλημα μας ζητά να λάβει - we'll ζουμ σε αυτό το λίγο - 199 00:16:16,410 --> 00:16:22,480 να λάβει σε μια δομή του προσωπικού, ένα struct προσωπικό, με το όνομα s, 200 00:16:22,480 --> 00:16:30,900 επισυνάπτει και το περιεχόμενό της να staff.csv αρχείο μας. 201 00:16:30,900 --> 00:16:34,230 Αποδεικνύεται ότι αυτό είναι αρκετά απλό στη χρήση. 202 00:16:34,230 --> 00:16:37,430 Θα είδος του παίζουν με αυτές τις λειτουργίες λίγο περισσότερο σήμερα. 203 00:16:37,430 --> 00:16:44,510 Αλλά στην περίπτωση αυτή, η συνάρτηση fprintf είναι πραγματικά το κλειδί. 204 00:16:44,510 --> 00:16:51,960 Έτσι, με fprintf, μπορούμε να εκτυπώσετε, όπως ακριβώς εσείς έχουν χρησιμοποιήσει printf όλο αυτό το διάστημα. 205 00:16:51,960 --> 00:16:55,050 Μπορείτε να printf μια γραμμή σε ένα αρχείο. 206 00:16:55,050 --> 00:16:59,030 Έτσι, αντί να κάνουμε απλώς τη συνήθη κλήση printf όπου δίνετε τη συμβολοσειρά μορφοποίησης 207 00:16:59,030 --> 00:17:05,380 και τότε θα αντικαταστήσει όλες τις μεταβλητές με τα ακόλουθα επιχειρήματα, 208 00:17:05,380 --> 00:17:11,290 με fprintf, το πρώτο επιχείρημά σας είναι αντ 'αυτού το αρχείο που θέλετε να γράψετε. 209 00:17:11,290 --> 00:17:21,170 Αν θέλαμε να δούμε αυτό στη συσκευή, για παράδειγμα, ο άνθρωπος fprintf, 210 00:17:21,170 --> 00:17:25,980 μπορούμε να δούμε τη διαφορά μεταξύ printf και fprintf. 211 00:17:25,980 --> 00:17:28,960 Θα μεγέθυνση εδώ λίγο. 212 00:17:28,960 --> 00:17:33,140 Έτσι, με την printf, δίνουμε μια συμβολοσειρά μορφής, και στη συνέχεια τα επόμενα επιχειρήματα 213 00:17:33,140 --> 00:17:37,580 είναι όλες οι μεταβλητές για την αντικατάσταση ή υποκατάσταση σε συμβολοσειρά μορφής μας. 214 00:17:37,580 --> 00:17:47,310 Ότι, με fprintf, το πρώτο επιχείρημα είναι πράγματι αυτό το αρχείο * ονομάζεται ρεύμα. 215 00:17:47,310 --> 00:17:51,800 >> Μετακίνηση πίσω εδώ για ενοικίαση μας, 216 00:17:51,800 --> 00:17:54,550 έχουμε ήδη πήρε το αρχείο μας ρεύμα * άνοιξε για μας. 217 00:17:54,550 --> 00:17:57,810 Αυτό είναι ό, τι αυτή η πρώτη γραμμή κάνει? Ανοίγει το αρχείο staff.csv, 218 00:17:57,810 --> 00:18:01,690 αυτό ανοίγει σε λειτουργία προσάρτησης, και το μόνο που μένει να κάνουμε είναι 219 00:18:01,690 --> 00:18:08,640 γράψετε τη δομή του προσωπικού του αρχείου. 220 00:18:08,640 --> 00:18:10,870 Και, ας δούμε, μπορώ να θέλετε να χρησιμοποιήσετε το iPad; 221 00:18:10,870 --> 00:18:17,900 Θα χρησιμοποιήσω το iPad. Έχουμε κενό - ας βάλουμε αυτό στο τραπέζι ώστε να μπορώ να γράψω λίγο καλύτερα - 222 00:18:17,900 --> 00:18:33,680 ακυρώσουν την ενοικίαση και παίρνει σε ένα επιχείρημα, μια δομή που ονομάζεται s προσωπικό. 223 00:18:33,680 --> 00:18:44,120 Πήρε τιράντες μας, έχουμε * αρχείο που ονομάζεται αρχείο μας, 224 00:18:44,120 --> 00:18:48,380 έχουμε γραμμή fopen μας που μας δόθηκαν, 225 00:18:48,380 --> 00:18:51,890 και θα γράψω ακριβώς όπως τελείες, δεδομένου ότι είναι ήδη στην ΠΑΙΔΙΑ. 226 00:18:51,890 --> 00:19:00,530 Και στη συνέχεια, στην επόμενη γραμμή μας, θα πάμε για να πραγματοποιήσετε μια κλήση με fprintf 227 00:19:00,530 --> 00:19:03,700 και θα πάμε να περάσει στο αρχείο που θέλετε να εκτυπώσετε σε, 228 00:19:03,700 --> 00:19:10,290 και στη συνέχεια συμβολοσειρά μορφής μας, η οποία - 229 00:19:10,290 --> 00:19:14,300 Θα σας αφήσω να μου πείτε ρε παιδιά τι μοιάζει. 230 00:19:14,300 --> 00:19:20,500 Εσύ τι λες, Στέλλα; Ξέρετε ποιο είναι το πρώτο μέρος του string format μοιάζει; 231 00:19:20,500 --> 00:19:24,270 [Στέλλα] Δεν είμαι σίγουρος. >> Διστάσετε να ρωτήσετε τον Jimmy. 232 00:19:24,270 --> 00:19:27,690 Ξέρετε, ο Jimmy; 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Θα ήταν απλώς να είναι η τελευταία; Δεν ξέρω. Δεν είμαι απόλυτα σίγουρος. 234 00:19:31,000 --> 00:19:39,020 Εντάξει >>. Τι θα λέγατε, έκανε κανέναν να πάρει αυτό το σωστό για τις εξετάσεις; 235 00:19:39,020 --> 00:19:41,770 Όχι Εντάξει. 236 00:19:41,770 --> 00:19:47,920 Αποδεικνύεται ότι εδώ το μόνο που έχουμε να κάνουμε είναι να θέλουμε κάθε μέρος της δομής του προσωπικού μας 237 00:19:47,920 --> 00:19:53,290 να εκτυπωθεί ως συμβολοσειρά στο αρχείο μας. 238 00:19:53,290 --> 00:19:59,900 Εμείς απλά χρησιμοποιήστε το χαρακτήρα υποκατάστασης σειρά τρεις διαφορετικές φορές, γιατί έχουμε ένα επώνυμο 239 00:19:59,900 --> 00:20:07,160 ακολουθείται από κόμμα, τότε το πρώτο όνομα που ακολουθείται από ένα κόμμα, 240 00:20:07,160 --> 00:20:12,430 και στη συνέχεια, τελικά η διεύθυνση ηλεκτρονικού ταχυδρομείου που ακολουθείται - η οποία δεν είναι 241 00:20:12,430 --> 00:20:15,140 τοποθέτηση στην οθόνη μου - αλλά αυτό είναι που ακολουθείται από ένα χαρακτήρα νέας γραμμής. 242 00:20:15,140 --> 00:20:20,060 Έτσι, Πάω να το γράψετε ακριβώς κάτω από εκεί. 243 00:20:20,060 --> 00:20:23,560 Και μετά από τότε συμβολοσειρά μορφής μας, 244 00:20:23,560 --> 00:20:27,880 έχουμε μόνο τις αντικαταστάσεις, το οποίο έχουμε πρόσβαση χρησιμοποιώντας το συμβολισμό dot 245 00:20:27,880 --> 00:20:31,370 που είδαμε στο σύνολο προβλήματος 3. 246 00:20:31,370 --> 00:20:48,820 Μπορούμε να χρησιμοποιήσουμε s.last, s.first, και s.email 247 00:20:48,820 --> 00:20:58,990 να υποκαταστήσει σε αυτές τις τρεις τιμές σε μορφή συμβολοσειράς μας. 248 00:20:58,990 --> 00:21:06,190 Λοιπόν, πώς πήγε; Κάντε νόημα; 249 00:21:06,190 --> 00:21:09,700 Ναι; Όχι; Ενδεχομένως; Εντάξει. 250 00:21:09,700 --> 00:21:14,180 >> Το τελευταίο πράγμα που κάνουμε μετά έχουμε τυπωμένο και μετά ανοίξαμε το αρχείο μας: 251 00:21:14,180 --> 00:21:17,370 κάθε φορά που έχουμε ανοίξει ένα αρχείο, πρέπει πάντα να θυμόμαστε για να το κλείσετε. 252 00:21:17,370 --> 00:21:19,430 Γιατί αλλιώς θα καταλήξετε διαρροή της μνήμης, 253 00:21:19,430 --> 00:21:22,500 χρησιμοποιώντας μέχρι και περιγραφείς αρχείων. 254 00:21:22,500 --> 00:21:25,950 Έτσι, για να το κλείσετε, που λειτουργούν χρησιμοποιούμε; Daniel; 255 00:21:25,950 --> 00:21:30,120 [Daniel] Αδυναμία εγγραφής αρχείου; >> Fclose, ακριβώς. 256 00:21:30,120 --> 00:21:37,520 Έτσι, το τελευταίο μέρος του προβλήματος αυτού ήταν να έχετε κλείσει σωστά το αρχείο, χρησιμοποιώντας τη λειτουργία fclose, 257 00:21:37,520 --> 00:21:40,370 το οποίο μοιάζει με αυτό. 258 00:21:40,370 --> 00:21:43,880 Δεν είναι πολύ τρελό. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Έτσι, αυτό είναι πρόβλημα 33 στο κουίζ. 261 00:21:49,520 --> 00:21:52,480 Θα έχουμε σίγουρα πιο αρχείο I / O ανεβαίνει. 262 00:21:52,480 --> 00:21:55,130 Θα κάνουμε λίγο περισσότερο σε διάλεξη σήμερα, ή στο τμήμα σήμερα, 263 00:21:55,130 --> 00:22:01,710 γιατί αυτό είναι που πρόκειται να αποτελέσουν το μεγαλύτερο μέρος του αυτό το επερχόμενο PSET. 264 00:22:01,710 --> 00:22:05,020 Ας περάσουμε από το κουίζ σε αυτό το σημείο. Ναι; 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Γιατί Αδυναμία εγγραφής αρχείου (αρχείο) αντί του fclose (staff.csv); 266 00:22:10,880 --> 00:22:19,100 >> Ah. Επειδή αποδεικνύεται ότι - έτσι το ερώτημα, το οποίο είναι ένα μεγάλο, 267 00:22:19,100 --> 00:22:27,800 Γι 'αυτό, όταν γράφουμε fclose, είμαστε εγγράφως Αδυναμία εγγραφής αρχείου (αρχείο) μεταβλητό αστέρι 268 00:22:27,800 --> 00:22:33,680 σε αντίθεση με το όνομα του αρχείου, staff.csv; Είναι αυτό σωστό; Ναι. 269 00:22:33,680 --> 00:22:39,570 Έτσι, ας ρίξουμε μια ματιά. Αν επιστρέψετε στο laptop μου, 270 00:22:39,570 --> 00:22:45,040 και ας δούμε την λειτουργία Αδυναμία εγγραφής αρχείου. 271 00:22:45,040 --> 00:22:51,460 Έτσι, η λειτουργία fclose κλείνει ένα ρεύμα και παίρνει το δείκτη στο ρεύμα που θέλουμε να κλείσει, 272 00:22:51,460 --> 00:22:57,010 σε αντίθεση με το πραγματικό όνομα του αρχείου που θέλουμε να κλείσουμε. 273 00:22:57,010 --> 00:23:01,620 Και αυτό οφείλεται στο γεγονός ότι πίσω από τις σκηνές, όταν πραγματοποιείτε μια κλήση με fopen, 274 00:23:01,620 --> 00:23:12,020 όταν ανοίγετε ένα αρχείο, είστε πραγματικά κατανομή μνήμης για την αποθήκευση πληροφοριών σχετικά με το αρχείο. 275 00:23:12,020 --> 00:23:16,380 Έτσι έχετε δείκτης αρχείο που περιέχει πληροφορίες σχετικά με το αρχείο, 276 00:23:16,380 --> 00:23:23,080 όπως είναι ανοικτό, το μέγεθός του, όπου κι αν βρίσκεστε σήμερα στο αρχείο, 277 00:23:23,080 --> 00:23:29,100 έτσι ώστε να μπορείτε να κάνετε ανάγνωση και τη γραφή κλήσεις για τη συγκεκριμένη θέση μέσα στο αρχείο. 278 00:23:29,100 --> 00:23:38,060 Θα καταλήξετε το κλείσιμο του δείκτη αντί να κλείνουν το όνομα του αρχείου. 279 00:23:38,060 --> 00:23:48,990 >> Ναι; [Δανιήλ] Έτσι, προκειμένου να χρησιμοποιήσει ενοικίασης, θα σας πω - πώς να πάρει την είσοδο του χρήστη; 280 00:23:48,990 --> 00:23:53,830 Μήπως fprintf ενεργούν σαν GetString, υπό την έννοια ότι θα πρέπει ακριβώς να περιμένει για την είσοδο χρήστη 281 00:23:53,830 --> 00:23:57,180 και να σας ζητήσει να πληκτρολογήσετε αυτό - ή να περιμένετε για να πληκτρολογήσετε αυτά τα τρία πράγματα; 282 00:23:57,180 --> 00:24:00,480 Ή μήπως θα πρέπει να χρησιμοποιήσετε κάτι για την εφαρμογή ενοικίαση; 283 00:24:00,480 --> 00:24:04,100 Ναι >>. Έτσι δεν είμαστε - το ερώτημα, πώς μπορούμε να πάρει την είσοδο του χρήστη 284 00:24:04,100 --> 00:24:09,220 για την εφαρμογή της ενοικίασης; Και αυτό που έχουμε εδώ είναι ο καλών της μίσθωσης, 285 00:24:09,220 --> 00:24:17,690 πέρασε στην παρούσα struct προσωπικού με το σύνολο των δεδομένων που αποθηκεύονται στο struct ήδη. 286 00:24:17,690 --> 00:24:22,990 Έτσι fprintf είναι σε θέση να γράψει απλά ότι τα δεδομένα απευθείας στο αρχείο. 287 00:24:22,990 --> 00:24:25,690 Δεν υπάρχει καμία αναμονή για την είσοδο του χρήστη. 288 00:24:25,690 --> 00:24:32,110 Ο χρήστης είναι ήδη από την είσοδο σωστά το θέτει σε αυτό το struct του προσωπικού. 289 00:24:32,110 --> 00:24:36,510 Και τα πράγματα, βέβαια, θα σπάσει αν οποιαδήποτε από αυτές τις υποδείξεις ήταν μηδενική, 290 00:24:36,510 --> 00:24:40,370 έτσι ώστε να μετακινηθείτε προς τα πίσω μέχρι εδώ και κοιτάμε struct μας. 291 00:24:40,370 --> 00:24:43,640 Έχουμε τελευταία σειρά, σειρά πρώτη, e-mail string. 292 00:24:43,640 --> 00:24:48,530 Γνωρίζουμε τώρα ότι όλα αυτά τα πραγματικά, κάτω από την κουκούλα, είναι char μεταβλητές *. 293 00:24:48,530 --> 00:24:53,470 Αυτό μπορεί ή δεν μπορεί να δείχνει σε null. 294 00:24:53,470 --> 00:24:55,800 Μπορούν να δείχνει προς τη μνήμη στο σωρό, 295 00:24:55,800 --> 00:24:59,650 ίσως μνήμης στην στοίβα. 296 00:24:59,650 --> 00:25:04,580 Εμείς πραγματικά δεν ξέρω, αλλά αν οποιαδήποτε από αυτούς τους δείκτες είναι άκυρη, ανίσχυρη ή, 297 00:25:04,580 --> 00:25:08,120 ότι αυτό θα καταρρεύσει σίγουρα λειτουργία ενοικίαση μας. 298 00:25:08,120 --> 00:25:11,050 Αυτό ήταν κάτι που ήταν το είδος της πέρα ​​από το πεδίο της εξέτασης. 299 00:25:11,050 --> 00:25:16,440 Εμείς δεν ανησυχούμε για αυτό. 300 00:25:16,440 --> 00:25:22,170 Μεγάλη. Εντάξει. Έτσι κινείται από το κουίζ. 301 00:25:22,170 --> 00:25:25,760 >> Ας κλείσει αυτός ο τύπος, και θα πάμε να δούμε PSET 4. 302 00:25:25,760 --> 00:25:34,700 Έτσι, αν εσείς δείτε το spec PSET, όταν μπορείτε να έχετε πρόσβαση, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 πρόκειται να περάσουν από μερικά από τα προβλήματα που σήμερα τμήμα. 304 00:25:42,730 --> 00:25:52,240 Είμαι κύλιση προς τα κάτω - το τμήμα των ερωτήσεων ξεκινά την τρίτη σελίδα του spec PSET. 305 00:25:52,240 --> 00:25:57,800 Και το πρώτο μέρος σας ζητά να πάτε και να δείτε το σύντομο για τον αναπροσανατολισμό και σωλήνες. 306 00:25:57,800 --> 00:26:02,820 Ποιο ήταν το είδος του ένα δροσερό λίγα λόγια, σας παρουσιάζει κάποια νέα, δροσερά κόλπα γραμμής εντολών που μπορείτε να χρησιμοποιήσετε. 307 00:26:02,820 --> 00:26:06,050 Και μετά έχουμε μερικές ερωτήσεις για σας επίσης. 308 00:26:06,050 --> 00:26:10,860 Η πρώτη ερώτηση σχετικά με ρεύματα, με την οποία printf γράφει από προεπιλογή, 309 00:26:10,860 --> 00:26:15,920 έχουμε το είδος της άγγιξε μόλις λίγο πριν από λίγο. 310 00:26:15,920 --> 00:26:22,380 Αυτή η fprintf ότι συζητούσαμε παίρνει σε ένα ρεύμα * αρχείο ως επιχείρημα. 311 00:26:22,380 --> 00:26:26,580 Αδυναμία εγγραφής αρχείου παίρνει σε ένα ρεύμα * αρχείο, καθώς, 312 00:26:26,580 --> 00:26:32,660 και η τιμή επιστροφής της fopen σας δίνει ένα ρεύμα * αρχείο, καθώς και. 313 00:26:32,660 --> 00:26:36,060 Ο λόγος που δεν έχουμε δει αυτά πριν, όταν έχουμε αντιμετωπίζονται με printf 314 00:26:36,060 --> 00:26:39,450 είναι επειδή έχει ένα ρεύμα printf προεπιλογή. 315 00:26:39,450 --> 00:26:41,810 Και το ρεύμα προεπιλογή στην οποία γράφει 316 00:26:41,810 --> 00:26:45,190 θα μάθετε για το μικρό. 317 00:26:45,190 --> 00:26:50,080 Έτσι οπωσδήποτε να ρίξετε μια ματιά σε αυτό. 318 00:26:50,080 --> 00:26:53,010 >> Στο τμήμα του σήμερα, θα πάμε να μιλήσουμε λίγο για την GDB, 319 00:26:53,010 --> 00:26:57,720 αφού η πιο εξοικειωμένοι είστε με αυτό, η πιο πρακτική μπορείτε να πάρετε με αυτό, 320 00:26:57,720 --> 00:27:01,390 η καλύτερη θέση θα είστε πραγματικά να κυνηγήσουν κάτω από σφάλματα στο δικό σας κώδικα. 321 00:27:01,390 --> 00:27:05,540 Αυτό επιταχύνει τη διαδικασία του debugging μέχρι δραματικά. 322 00:27:05,540 --> 00:27:09,230 Έτσι, με τη χρήση printf, κάθε φορά που το κάνουμε αυτό θα πρέπει να μεταγλωττίσετε τον κωδικό σας, 323 00:27:09,230 --> 00:27:13,000 θα πρέπει να το τρέξει και πάλι, μερικές φορές θα πρέπει να μετακινήσετε το printf κλήση γύρω, 324 00:27:13,000 --> 00:27:17,100 σε σχόλιο κώδικα, χρειάζεται μόνο μια στιγμή. 325 00:27:17,100 --> 00:27:20,850 Στόχος μας είναι να προσπαθήσουμε και να σας πείσει ότι με το GDB, μπορείτε ουσιαστικά 326 00:27:20,850 --> 00:27:26,810 printf οτιδήποτε σε οποιοδήποτε σημείο του κώδικα σας και ποτέ δεν πρέπει να το μεταγλωττίσετε. 327 00:27:26,810 --> 00:27:35,120 Ποτέ δεν πρέπει να ξεκινήσει και να μαντέψουν πού να printf επόμενο. 328 00:27:35,120 --> 00:27:40,910 Το πρώτο πράγμα που πρέπει να κάνετε είναι να αντιγράψετε αυτή τη γραμμή και να πάρετε τον κώδικα από το τμήμα του ιστού. 329 00:27:40,910 --> 00:27:47,530 Είμαι αντιγραφή αυτή τη γραμμή του κώδικα που λέει, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Πάω να το αντιγράψετε. 331 00:27:49,510 --> 00:27:55,950 Πάω να πάει πέρα ​​να μου συσκευή, σμίκρυνση ώστε να μπορείτε να δείτε τι κάνω, 332 00:27:55,950 --> 00:28:01,890 επικόλληση εκεί μέσα, και όταν χτύπησα το Enter, η εντολή wget είναι κυριολεκτικά ένα web πάρει. 333 00:28:01,890 --> 00:28:06,210 Είναι πρόκειται να γκρεμίσει αυτό το αρχείο από το Διαδίκτυο, 334 00:28:06,210 --> 00:28:11,790 και πρόκειται να το αποθηκεύσετε στον τρέχοντα κατάλογο. 335 00:28:11,790 --> 00:28:21,630 Τώρα, αν μου λίστα μου τρέχοντα κατάλογο μπορείτε να δείτε ότι έχω αυτό το δικαίωμα section5.zip αρχείο εκεί. 336 00:28:21,630 --> 00:28:25,260 Ο τρόπος για να ασχοληθεί με το εν λόγω τύπος είναι να το αποσυμπιέσετε, 337 00:28:25,260 --> 00:28:27,650 που μπορείτε να κάνετε στη γραμμή εντολών, ακριβώς όπως αυτό. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Αυτό θα το αποσυμπιέσετε, να δημιουργήσετε το φάκελο για μένα, 340 00:28:36,980 --> 00:28:40,410 διογκώνουν όλα τα περιεχόμενα, τους βάλει εκεί. 341 00:28:40,410 --> 00:28:47,410 Έτσι τώρα μπορώ να πάω στο τμήμα 5 κατάλογο μου χρησιμοποιώντας την εντολή cd. 342 00:28:47,410 --> 00:28:58,310 Καταργήστε την οθόνη με σαφείς. Έτσι καθαρίσετε την οθόνη. 343 00:28:58,310 --> 00:29:02,280 Τώρα έχω ένα ωραίο καθαρό τερματικό για να ασχοληθούν μαζί τους. 344 00:29:02,280 --> 00:29:06,200 >> Τώρα, αν μου λίστα με όλα τα αρχεία που βλέπω σε αυτόν τον κατάλογο, 345 00:29:06,200 --> 00:29:12,270 θα δείτε ότι έχω τέσσερα αρχεία: buggy1, buggy2, buggy3, και buggy4. 346 00:29:12,270 --> 00:29:16,180 Έχω, επίσης, αντίστοιχα. Αρχεία τους γ. 347 00:29:16,180 --> 00:29:20,400 Εμείς δεν πάμε να δούμε τα αρχεία. Γ. για τώρα. 348 00:29:20,400 --> 00:29:24,140 Αντ 'αυτού, θα πάμε να τα χρησιμοποιήσουν όταν θα ανοίξει GDB. 349 00:29:24,140 --> 00:29:28,220 Έχουμε τους κράτησε γύρω έτσι ώστε να έχουμε πρόσβαση στον πηγαίο κώδικα όταν είμαστε με GDB, 350 00:29:28,220 --> 00:29:32,740 αλλά ο στόχος του μέρους αυτού του τμήματος είναι να κολλήσουμε γύρω με GDB 351 00:29:32,740 --> 00:29:40,370 και να δούμε πώς μπορούμε να το χρησιμοποιήσουμε για να καταλάβουμε τι πηγαίνει στραβά με κάθε ένα από αυτά τα τέσσερα προγράμματα λάθη. 352 00:29:40,370 --> 00:29:43,380 Έτσι, είμαστε ακριβώς πρόκειται να γύρω από το δωμάτιο πολύ γρήγορα, 353 00:29:43,380 --> 00:29:47,000 και θα πάω να ρωτήσω κάποιον να τρέξει ένα από τα λάθη των προγραμμάτων, 354 00:29:47,000 --> 00:29:54,730 και στη συνέχεια θα πάμε ως ομάδα μέσα από GDB, και θα δούμε τι μπορούμε να κάνουμε για να διορθώσετε αυτά τα προγράμματα, 355 00:29:54,730 --> 00:29:58,460 ή τουλάχιστον να προσδιορίσει τι συμβαίνει λάθος σε κάθε μία από αυτές. 356 00:29:58,460 --> 00:30:04,760 Ας ξεκινήσουμε εδώ με τον Daniel. Θα τρέχετε buggy1; Ας δούμε τι θα συμβεί. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Είναι λέει ότι υπάρχει ένα σφάλμα εφαρμογής. Ναι >>. Ακριβώς. 358 00:30:09,470 --> 00:30:12,460 Έτσι, αν τρέξω buggy1, να πάρω ένα σφάλμα SEG. 359 00:30:12,460 --> 00:30:16,210 Σε αυτό το σημείο, θα μπορούσα να πάω και να ανοίξουν buggy1.c, 360 00:30:16,210 --> 00:30:19,450 προσπαθήσουμε και να καταλάβουμε τι πηγαίνει στραβά, 361 00:30:19,450 --> 00:30:22,000 αλλά ένα από τα πιο απεχθή πράγματα σχετικά με αυτό το σφάλμα σφάλμα seg 362 00:30:22,000 --> 00:30:27,610 είναι ότι δεν σας πω για το τι γραμμή από τα πράγματα που πραγματικά το πρόγραμμα πήγε στραβά και έσπασε. 363 00:30:27,610 --> 00:30:29,880 Μπορείτε είδους πρέπει να εξετάσουμε τον κώδικα 364 00:30:29,880 --> 00:30:33,990 και να καταλάβω τη χρήση εικασία και ελέγξτε ή printf για να δείτε τι συμβαίνει λάθος. 365 00:30:33,990 --> 00:30:37,840 Ένα από τα πιο cool πράγματα για GDB είναι ότι είναι πραγματικά, πραγματικά εύκολο 366 00:30:37,840 --> 00:30:42,170 να καταλάβουμε τη γραμμή στην οποία κολλάει το πρόγραμμά σας. 367 00:30:42,170 --> 00:30:46,160 Είναι εντελώς αξίζει τον κόπο να το χρησιμοποιήσει, ακόμη και αν μόνο για αυτό. 368 00:30:46,160 --> 00:30:56,190 Έτσι, για την εκκίνηση GDB, τύπου Ι GDB, και στη συνέχεια δίνω τη διαδρομή προς το εκτελέσιμο αρχείο που θέλετε να εκτελέσετε. 369 00:30:56,190 --> 00:31:01,960 Εδώ γράφω gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Πατήστε Enter. Μου δίνει όλες αυτές τις πληροφορίες πνευματικών δικαιωμάτων, 371 00:31:06,600 --> 00:31:13,000 και εδώ κάτω θα δείτε αυτή τη γραμμή που λέει, "Διαβάζοντας τα σύμβολα από / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 Και αν όλα πάνε καλά, θα δείτε να εκτυπώσετε ένα μήνυμα που μοιάζει με αυτό. 374 00:31:22,060 --> 00:31:25,500 Θα διαβάσετε τα σύμβολα, αυτό θα πει «Είμαι ανάγνωση συμβόλων από το εκτελέσιμο αρχείο σας," 375 00:31:25,500 --> 00:31:29,900 και στη συνέχεια θα έχει αυτό το "κάνει" μήνυμα εδώ. 376 00:31:29,900 --> 00:31:35,410 Αν δείτε κάποια άλλη παραλλαγή αυτού, ή βλέπετε ότι δεν μπορούσε να βρει τα σύμβολα 377 00:31:35,410 --> 00:31:41,460 ή κάτι τέτοιο, τι σημαίνει αυτό είναι ότι απλά δεν έχουν συνταχθεί εκτελέσιμο σας σωστά. 378 00:31:41,460 --> 00:31:49,980 Όταν καταρτίζουν προγράμματα για χρήση με το GDB, θα πρέπει να χρησιμοποιεί το εν λόγω ειδικό-g σημαία, 379 00:31:49,980 --> 00:31:54,540 και ότι έχει κάνει από προεπιλογή αν μεταγλωττίσετε τα προγράμματα σας, απλά πληκτρολογώντας make 380 00:31:54,540 --> 00:31:59,320 ή να κάνει λάθη ή να ανακτήσει, κάποια από αυτά. 381 00:31:59,320 --> 00:32:07,800 Αλλά αν είστε με το χέρι με την κατάρτιση Clang, τότε θα πρέπει να πάμε μέσα και ότι περιλαμβάνουν-g σημαία. 382 00:32:07,800 --> 00:32:10,310 >> Σε αυτό το σημείο, τώρα που έχουμε GDB προτροπή μας, 383 00:32:10,310 --> 00:32:12,310 Είναι αρκετά απλό να τρέξει το πρόγραμμα. 384 00:32:12,310 --> 00:32:19,740 Μπορούμε να πληκτρολογήσετε run, ή μπορούμε να πληκτρολογήσετε μόνο r. 385 00:32:19,740 --> 00:32:22,820 Οι περισσότερες εντολές GDB μπορεί να συντμηθεί. 386 00:32:22,820 --> 00:32:25,940 Συνήθως σε μόλις ένα ή δύο γράμματα, το οποίο είναι πολύ ωραίο. 387 00:32:25,940 --> 00:32:30,980 Έτσι Saad, αν πληκτρολογήσετε r και πατήστε Enter, τι συμβαίνει; 388 00:32:30,980 --> 00:32:39,390 [Saad] Πήρα SIGSEGV, σφάλμα κατάτμησης, και στη συνέχεια, όλη αυτή αλαμπουρνέζικα. 389 00:32:39,390 --> 00:32:43,650 Ναι >>. 390 00:32:43,650 --> 00:32:47,990 Όπως βλέπουμε στην οθόνη αυτή τη στιγμή, και όπως είπε ο Saad, 391 00:32:47,990 --> 00:32:53,430 όταν γράφουμε τρέξιμο ή r και πατήστε Enter, έχουμε ακόμα το ίδιο σφάλμα SEG. 392 00:32:53,430 --> 00:32:55,830 Έτσι, χρησιμοποιώντας GDB δεν λύσει το πρόβλημά μας. 393 00:32:55,830 --> 00:32:59,120 Αλλά αυτό μας δίνει κάποια αλαμπουρνέζικα, και αποδεικνύεται ότι αυτή η αλαμπουρνέζικα 394 00:32:59,120 --> 00:33:03,080 στην πραγματικότητα μας λέει όπου αυτό συμβαίνει. 395 00:33:03,080 --> 00:33:10,680 Για να αναλύσει αυτό το λίγο, αυτό το πρώτο κομμάτι είναι η λειτουργία κατά την οποία ό, τι συμβαίνει λάθος. 396 00:33:10,680 --> 00:33:20,270 Υπάρχει αυτή η __ strcmp_sse4_2, και μας λέει ότι αυτό συμβαίνει σε αυτό το αρχείο 397 00:33:20,270 --> 00:33:29,450 που ονομάζεται sysdeps/i386, όλα αυτά, και πάλι, το είδος της ένα χάος - αλλά γραμμή 254. 398 00:33:29,450 --> 00:33:31,670 Αυτό είναι το είδος του σκληρά για να αναλύσει. Συνήθως όταν βλέπεις τα πράγματα όπως αυτό, 399 00:33:31,670 --> 00:33:38,770 αυτό σημαίνει ότι είναι προβληματική σε διαχωρίζονται από μία από τις βιβλιοθήκες του συστήματος. 400 00:33:38,770 --> 00:33:43,220 Έτσι, κάτι που κάνει με strcmp. Εσείς έχετε δει πριν strcmp. 401 00:33:43,220 --> 00:33:52,730 Όχι πάρα πολύ τρελό, αλλά αυτό σημαίνει ότι strcmp έχει σπάσει ή ότι υπάρχει ένα πρόβλημα με strcmp; 402 00:33:52,730 --> 00:33:57,110 Τι νομίζετε, Αλέξανδρος; 403 00:33:57,110 --> 00:34:04,890 [Αλέξανδρος] είναι ότι - είναι 254 η γραμμή; Και το - δεν το δυαδικό, αλλά δεν είναι οροφές τους, 404 00:34:04,890 --> 00:34:10,590 και στη συνέχεια, υπάρχει μια άλλη γλώσσα για κάθε λειτουργία. Είναι ότι 254 σε αυτή τη λειτουργία, ή -; 405 00:34:10,590 --> 00:34:21,460 Είναι >> γραμμή 254. Μοιάζει σε αυτό το αρχείο. S, έτσι ώστε να είναι κατά πάσα πιθανότητα κώδικα assembly. 406 00:34:21,460 --> 00:34:25,949 >> Αλλά, υποθέτω ότι το πιο πιεστικό θέμα είναι, επειδή έχουμε πάρει ένα σφάλμα seg, 407 00:34:25,949 --> 00:34:29,960 και αυτό μοιάζει να έρχεται από την strcmp λειτουργία, 408 00:34:29,960 --> 00:34:38,030 σημαίνει αυτό, στη συνέχεια, ότι strcmp έχει σπάσει; 409 00:34:38,030 --> 00:34:42,290 Δεν θα πρέπει, ελπίζω. Έτσι, μόνο και μόνο επειδή έχετε ένα σφάλμα καταμερισμού 410 00:34:42,290 --> 00:34:49,480 σε μία από τις λειτουργίες του συστήματος, συνήθως αυτό σημαίνει ότι απλά δεν έχουν ονομάζεται σωστά. 411 00:34:49,480 --> 00:34:52,440 Ο πιο γρήγορος πράγμα που πρέπει να κάνετε για να καταλάβουμε τι πραγματικά συμβαίνει 412 00:34:52,440 --> 00:34:55,500 όταν βλέπεις κάτι σαν τρελό αυτό, κάθε φορά που θα δείτε ένα σφάλμα seg, 413 00:34:55,500 --> 00:34:59,800 ειδικά αν έχετε ένα πρόγραμμα που χρησιμοποιεί είναι περισσότερο από ό, τι ακριβώς κύρια, 414 00:34:59,800 --> 00:35:03,570 είναι να χρησιμοποιήσετε ένα backtrace. 415 00:35:03,570 --> 00:35:13,080 I συντομεύσει backtrace γράφοντας bt, σε αντίθεση με την πλήρη λέξη backtrace. 416 00:35:13,080 --> 00:35:16,510 Αλλά Charlotte, τι συμβαίνει όταν πληκτρολογείτε bt και πατήστε Enter; 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Δείχνει με δύο γραμμές, 0 γραμμής και της γραμμής 1. 418 00:35:23,200 --> 00:35:26,150 Ναι >>. Έτσι η γραμμή 0 και της γραμμής 1. 419 00:35:26,150 --> 00:35:34,560 Αυτές είναι οι πραγματικές πλαίσια στοίβα που είχαν σήμερα στο παιχνίδι, όταν συνετρίβη το πρόγραμμά σας. 420 00:35:34,560 --> 00:35:42,230 Ξεκινώντας από το κορυφαίο καρέ, καρέ 0, και πηγαίνοντας προς τα κάτω, οι περισσότεροι, το οποίο είναι το πλαίσιο 1. 421 00:35:42,230 --> 00:35:45,140 Κορυφαίο καρέ μας είναι η strcmp πλαίσιο. 422 00:35:45,140 --> 00:35:50,080 Μπορείτε να σκεφτείτε αυτό ως παρόμοιο με εκείνο το πρόβλημα που μόλις είχαν κάνει στο κουίζ με τους δείκτες, 423 00:35:50,080 --> 00:35:54,890 όπου είχαμε ανταλλάξει πλαίσιο στοίβα στην κορυφή του κύριου πλαισίου στοίβας, 424 00:35:54,890 --> 00:35:59,700 και είχαμε τις μεταβλητές που χρησιμοποιούσε ανταλλαγής πάνω από τις μεταβλητές που κυρίως χρησιμοποιούσε. 425 00:35:59,700 --> 00:36:08,440 Εδώ δυστύχημα συνέβη σε μας strcmp λειτουργία μας, η οποία κλήθηκε από την κύρια λειτουργία μας, 426 00:36:08,440 --> 00:36:14,370 backtrace και μας δίνει όχι μόνο τις λειτουργίες στις οποίες απέτυχε πράγματα, 427 00:36:14,370 --> 00:36:16,440 αλλά είναι, επίσης, μας λέει, όπου τα πάντα κλήθηκε από. 428 00:36:16,440 --> 00:36:18,830 Έτσι, αν μετακινηθείτε πάνω λίγο περισσότερο προς τα δεξιά, 429 00:36:18,830 --> 00:36:26,110 μπορούμε να δούμε ότι ναι, ήμασταν στην γραμμή 254 του παρόντος strcmp-sse4.s αρχείο. 430 00:36:26,110 --> 00:36:32,540 Αλλά η κλήση έγινε σε buggy1.c, γραμμή 6. 431 00:36:32,540 --> 00:36:35,960 Έτσι, αυτό σημαίνει ότι μπορούμε να κάνουμε - είναι ότι μπορεί απλά να ελέγξετε έξω και να δούμε τι συνέβαινε 432 00:36:35,960 --> 00:36:39,930 σε buggy1.c, γραμμή 6. 433 00:36:39,930 --> 00:36:43,780 Και πάλι, υπάρχουν δύο τρόποι για να γίνει αυτό. Η μία είναι να βγείτε έξω από GDB 434 00:36:43,780 --> 00:36:49,460 ή έχουν κωδικό σας ανοίξει σε άλλο παράθυρο και αναφορά σταυρό. 435 00:36:49,460 --> 00:36:54,740 Αυτό, από μόνο του, είναι αρκετά βολικό, επειδή τώρα, αν είστε σε ώρες γραφείου 436 00:36:54,740 --> 00:36:57,220 και έχετε ένα σφάλμα seg και TF σας αναρωτιέστε πού είναι ό, τι ήταν το σπάσιμο, 437 00:36:57,220 --> 00:36:59,710 μπορείτε απλώς να πω, "Ω, γραμμή 6. Δεν ξέρω τι συμβαίνει, 438 00:36:59,710 --> 00:37:03,670 αλλά κάτι σχετικά με γραμμή 6 προκαλεί το πρόγραμμά μου να σπάσει. " 439 00:37:03,670 --> 00:37:10,430 Ο άλλος τρόπος για να το κάνει είναι ότι μπορείτε να χρησιμοποιήσετε την εντολή αυτή ονομάζεται λίστα στην GDB. 440 00:37:10,430 --> 00:37:13,650 Μπορείτε να συντομεύσει επίσης με l. 441 00:37:13,650 --> 00:37:18,910 Έτσι, αν χτυπήσει l, τι έχουμε εδώ; 442 00:37:18,910 --> 00:37:21,160 Παίρνουμε ένα σωρό περίεργα πράγματα. 443 00:37:21,160 --> 00:37:26,030 Αυτός είναι ο πραγματικός κώδικας συναρμολόγησης 444 00:37:26,030 --> 00:37:29,860 δηλαδή στην strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Αυτό φαίνεται από το είδος funky, 446 00:37:32,440 --> 00:37:36,520 και ο λόγος που παίρνουμε αυτό οφείλεται στο γεγονός ότι αυτή τη στιγμή, 447 00:37:36,520 --> 00:37:40,160 GDB μας έχει στο πλαίσιο 0. 448 00:37:40,160 --> 00:37:43,070 >> Έτσι, ανά πάσα στιγμή εξετάζουμε τις μεταβλητές, κάθε φορά που θα δούμε τον πηγαίο κώδικα, 449 00:37:43,070 --> 00:37:50,530 ψάχνουμε σε πηγαίο κώδικα που αφορά το πλαίσιο στοίβας είμαστε σήμερα μέσα 450 00:37:50,530 --> 00:37:53,200 Έτσι, προκειμένου να πάρει τίποτα ουσιαστικό, θα πρέπει να 451 00:37:53,200 --> 00:37:57,070 κινούνται σε ένα πλαίσιο στοίβα που έχει περισσότερο νόημα. 452 00:37:57,070 --> 00:38:00,180 Σε αυτή την περίπτωση, το κύριο πλαίσιο στοίβας θα κάνει λίγο περισσότερο νόημα, 453 00:38:00,180 --> 00:38:02,680 γιατί αυτό ήταν στην πραγματικότητα ο κώδικας που γράψαμε. 454 00:38:02,680 --> 00:38:05,330 Δεν είναι η strcmp κώδικα. 455 00:38:05,330 --> 00:38:08,650 Ο τρόπος που μπορείτε να μετακινηθείτε μεταξύ των πλαισίων, σε αυτή την περίπτωση, επειδή έχουμε δύο, 456 00:38:08,650 --> 00:38:10,430 έχουμε 0 και 1, 457 00:38:10,430 --> 00:38:13,650 να το κάνετε αυτό με το πάνω και κάτω εντολές. 458 00:38:13,650 --> 00:38:18,480 Αν ανεβάσουμε ένα καρέ, 459 00:38:18,480 --> 00:38:21,770 τώρα είμαι στο κεντρικό πλαίσιο στοίβας. 460 00:38:21,770 --> 00:38:24,330 Μπορώ να μετακινηθείτε προς τα κάτω για να πάει πίσω όπου ήμουν, 461 00:38:24,330 --> 00:38:32,830 ανεβαίνουν και πάλι, κατεβαίνουν και πάλι, και να ανεβαίνουν και πάλι. 462 00:38:32,830 --> 00:38:39,750 Αν το κάνετε ποτέ το πρόγραμμά σας σε GDB, μπορείτε να πάρετε μια συντριβή, μπορείτε να πάρετε το backtrace, 463 00:38:39,750 --> 00:38:42,380 και θα δείτε ότι είναι σε κάποιο αρχείο που δεν ξέρεις τι συμβαίνει. 464 00:38:42,380 --> 00:38:45,460 Θα προσπαθήσουμε λίστα, ο κωδικός δεν φαίνεται γνωστό σε σας, 465 00:38:45,460 --> 00:38:48,150 ρίξτε μια ματιά στο καρέ σας και να καταλάβω όπου και αν βρίσκεστε. 466 00:38:48,150 --> 00:38:51,010 Είστε πιθανώς σε λάθος πλαίσιο στοίβας. 467 00:38:51,010 --> 00:38:58,760 Ή τουλάχιστον να είστε σε ένα πλαίσιο στοίβας που δεν είναι αυτό που μπορείτε πραγματικά να διορθώσετε. 468 00:38:58,760 --> 00:39:03,110 Τώρα που είμαστε στο κατάλληλο πλαίσιο στοίβας, είμαστε σε γενικές γραμμές, 469 00:39:03,110 --> 00:39:08,100 Τώρα μπορούμε να χρησιμοποιήσουμε την εντολή λίστας για να καταλάβω τι ήταν η γραμμή. 470 00:39:08,100 --> 00:39:13,590 Και μπορείτε να το δείτε? Αυτό το έντυπο για εμάς εδώ. 471 00:39:13,590 --> 00:39:19,470 Αλλά μπορούμε να χτυπήσει λίστα όλοι το ίδιο, και η λίστα μας δίνει αυτό το ωραίο εκτύπωση 472 00:39:19,470 --> 00:39:23,920 του πραγματικού κώδικα που συμβαίνει εδώ. 473 00:39:23,920 --> 00:39:26,420 >> Πιο συγκεκριμένα, μπορούμε να εξετάσουμε στη γραμμή 6. 474 00:39:26,420 --> 00:39:29,330 Μπορούμε να δούμε τι συμβαίνει εδώ. 475 00:39:29,330 --> 00:39:31,250 Και φαίνεται σαν να κάνετε μια σύγκριση συμβολοσειράς 476 00:39:31,250 --> 00:39:41,050 μεταξύ των χορδών "CS50 βράχους» και argv [1]. 477 00:39:41,050 --> 00:39:45,700 Κάτι σχετικά με αυτό συντρίβεται. 478 00:39:45,700 --> 00:39:54,120 Έτσι, δεσποινίς, έχετε οποιεσδήποτε σκέψεις για το τι μπορεί να συμβαίνει εδώ; 479 00:39:54,120 --> 00:39:59,400 [Missy] Δεν ξέρω γιατί αυτό είναι συντρίβεται. >> Δεν ξέρω γιατί αυτό είναι συντρίβεται; 480 00:39:59,400 --> 00:40:02,700 Jimmy, οποιεσδήποτε σκέψεις; 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Δεν είμαι απόλυτα σίγουρος, αλλά η τελευταία φορά που χρησιμοποιήθηκε σύγκρισης συμβολοσειράς, 482 00:40:06,240 --> 00:40:10,260 ή strcmp, όπως είχαμε τρεις διαφορετικές περιπτώσεις, κάτω από αυτό. 483 00:40:10,260 --> 00:40:12,800 Δεν είχαμε μια ==, δεν νομίζω, το δικαίωμα στην εν λόγω πρώτη γραμμή. 484 00:40:12,800 --> 00:40:16,700 Αντ 'αυτού, διαχωρίστηκε σε τρία, και ένας ήταν == 0, 485 00:40:16,700 --> 00:40:19,910 ο ένας ήταν <0, νομίζω, και ο ένας ήταν> 0. 486 00:40:19,910 --> 00:40:22,590 Έτσι, ίσως κάτι τέτοιο; Ναι >>. Έτσι, υπάρχει το θέμα αυτό 487 00:40:22,590 --> 00:40:27,200 του κάνουμε τη σύγκριση σωστά; 488 00:40:27,200 --> 00:40:31,660 Στέλλα; Οποιεσδήποτε σκέψεις; 489 00:40:31,660 --> 00:40:38,110 [Στέλλα] Δεν είμαι σίγουρος. >> Δεν είστε σίγουροι. Daniel; Σκέψεις; Εντάξει. 490 00:40:38,110 --> 00:40:44,770 Βγάζει ό, τι συμβαίνει εδώ είναι όταν τρέξαμε το πρόγραμμα 491 00:40:44,770 --> 00:40:48,370 και πήραμε το seg σφάλμα, όταν έτρεξε το πρόγραμμα για πρώτη φορά, Δανιήλ, 492 00:40:48,370 --> 00:40:50,800 δεν θα δώσει κανένα επιχείρημα γραμμή εντολών; 493 00:40:50,800 --> 00:40:58,420 [Daniel] Όχι Όχι >> Σε αυτή την περίπτωση, ποια είναι η αξία του argv [1]; 494 00:40:58,420 --> 00:41:00,920 >> Δεν υπάρχει καμία αξία. Δικαίωμα >>. 495 00:41:00,920 --> 00:41:06,120 Λοιπόν, δεν υπάρχει κατάλληλη τιμή συμβολοσειράς. 496 00:41:06,120 --> 00:41:10,780 Αλλά υπάρχει κάποια αξία. Ποια είναι η τιμή που παίρνει αποθηκεύονται εκεί μέσα; 497 00:41:10,780 --> 00:41:15,130 >> Μια τιμή σκουπίδια; >> Είναι είτε μια τιμή σκουπιδιών ή, στην περίπτωση αυτή, 498 00:41:15,130 --> 00:41:19,930 το τέλος του πίνακα argv είναι πάντα τερματίζεται με null. 499 00:41:19,930 --> 00:41:26,050 Έτσι, αυτό που πραγματικά έχεις αποθηκευμένα εκεί είναι μηδενική. 500 00:41:26,050 --> 00:41:30,810 Ο άλλος τρόπος να λυθεί αυτό, αντί να σκεφτόμαστε ότι μέσω, 501 00:41:30,810 --> 00:41:33,420 είναι να δοκιμάστε να εκτυπώσετε το έξω. 502 00:41:33,420 --> 00:41:35,880 Αυτό είναι όπου έλεγα ότι η χρήση GDB είναι μεγάλη, 503 00:41:35,880 --> 00:41:40,640 επειδή μπορείτε να εκτυπώσετε όλες τις μεταβλητές, όλες οι τιμές που θέλετε 504 00:41:40,640 --> 00:41:43,230 χρησιμοποιώντας αυτό το πρακτικό-δανδής εντολή p. 505 00:41:43,230 --> 00:41:48,520 Έτσι, αν πληκτρολογήσετε p και στη συνέχεια να πληκτρολογήσετε την τιμή μιας μεταβλητής ή το όνομα της μεταβλητής, 506 00:41:48,520 --> 00:41:55,320 ας πούμε, argc, βλέπω ότι argc είναι 1. 507 00:41:55,320 --> 00:42:01,830 Αν θέλετε να εκτυπώσετε argv [0], μπορώ να το κάνω έτσι ακριβώς όπως αυτό. 508 00:42:01,830 --> 00:42:04,840 Και όπως είδαμε, argv [0] είναι πάντα το όνομα του προγράμματός σας, 509 00:42:04,840 --> 00:42:06,910 πάντα το όνομα του εκτελέσιμου. 510 00:42:06,910 --> 00:42:09,740 Εδώ μπορείτε να δείτε το έχεις το πλήρες όνομα διαδρομής. 511 00:42:09,740 --> 00:42:15,920 Μπορώ επίσης να εκτυπώσετε argv [1] και να δούμε τι θα συμβεί. 512 00:42:15,920 --> 00:42:20,890 >> Εδώ έχουμε αυτό το είδος της μυστικιστική αξία. 513 00:42:20,890 --> 00:42:23,890 Πήραμε αυτό το 0x0. 514 00:42:23,890 --> 00:42:27,850 Να θυμάστε στην αρχή του όρου, όταν μιλήσαμε για δεκαεξαδικούς αριθμούς; 515 00:42:27,850 --> 00:42:34,680 Ή ότι η μικρή ερώτηση στο τέλος του PSET 0 για το πώς να αντιπροσωπεύουν το 50 στο δεκαεξαδικό; 516 00:42:34,680 --> 00:42:39,410 Ο τρόπος που γράφουμε hex αριθμούς σε CS, ακριβώς για να μην συγχέουμε τον εαυτό μας 517 00:42:39,410 --> 00:42:46,080 με δεκαδικούς αριθμούς, είναι ότι το πρόθεμα τα πάντα με 0x. 518 00:42:46,080 --> 00:42:51,420 Έτσι, αυτό το πρόθεμα 0x πάντα ακριβώς σημαίνει ερμηνεύσει τον ακόλουθο αριθμό ως δεκαεξαδικός αριθμός, 519 00:42:51,420 --> 00:42:57,400 όχι ως μια σειρά, όχι ως δεκαδικός αριθμός, όχι ως ένα δυαδικό αριθμό. 520 00:42:57,400 --> 00:43:02,820 Δεδομένου ότι ο αριθμός 5-0 είναι ένα έγκυρο αριθμό σε δεκαεξαδική. 521 00:43:02,820 --> 00:43:06,240 Και είναι ένας αριθμός στο δεκαδικό, 50. 522 00:43:06,240 --> 00:43:10,050 Έτσι, αυτό είναι ακριβώς το πώς θα αποσαφηνίζουν. 523 00:43:10,050 --> 00:43:14,860 Έτσι 0x0 σημαίνει δεκαεξαδικό 0, η οποία είναι επίσης δεκαδικό 0, δυαδικό 0. 524 00:43:14,860 --> 00:43:17,030 Είναι ακριβώς η τιμή 0. 525 00:43:17,030 --> 00:43:22,630 Αποδεικνύεται ότι αυτό είναι ό, τι είναι μηδενική, στην πραγματικότητα, στη μνήμη. 526 00:43:22,630 --> 00:43:25,940 Null είναι μόνο 0. 527 00:43:25,940 --> 00:43:37,010 Εδώ, το στοιχείο αποθηκεύεται στο argv [1] είναι μηδενική. 528 00:43:37,010 --> 00:43:45,220 Έτσι, προσπαθούμε να συγκρίνουμε "CS50 βράχια" μας σειρά με μια κενή συμβολοσειρά. 529 00:43:45,220 --> 00:43:48,130 Έτσι εύρεση τιμών null, προσπαθεί να αποκτήσει πρόσβαση σε πράγματα null, 530 00:43:48,130 --> 00:43:55,050 αυτά είναι συνήθως πρόκειται να προκαλέσει κάποια βλάβη κατάτμησης ή άλλα κακά πράγματα να συμβούν. 531 00:43:55,050 --> 00:43:59,350 Και αποδεικνύεται ότι strcmp δεν ελέγχει για να δείτε 532 00:43:59,350 --> 00:44:04,340 αν δεν έχετε περάσει σε μια τιμή που είναι null. 533 00:44:04,340 --> 00:44:06,370 Αντίθετα, πηγαίνει μόνο μπροστά, προσπαθεί να κάνει το πράγμα του, 534 00:44:06,370 --> 00:44:14,640 και αν διαχωρίζονται από λάθη, διαχωρίζονται από λάθη, και αυτό είναι το πρόβλημά σας. Θα πρέπει να πάμε να το διορθώσουμε. 535 00:44:14,640 --> 00:44:19,730 Πραγματικά γρήγορα, πώς θα μπορούσαμε να διορθώσετε αυτό το πρόβλημα; Charlotte; 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Μπορείτε να ελέγξετε αν χρησιμοποιείτε. 537 00:44:23,540 --> 00:44:32,240 Έτσι, εάν argv [1] είναι μηδενική, == 0, τότε επιστρέφει 1, ή κάτι [ακατάληπτο]. 538 00:44:32,240 --> 00:44:34,590 Ναι >>. Έτσι, αυτός είναι ένας πολύ καλός τρόπος για να το κάνουμε, όπως μπορούμε να ελέγξουμε για να δούμε, 539 00:44:34,590 --> 00:44:39,230 η αξία είμαστε έτοιμοι να περάσουν στην strcmp, argv [1], είναι το μηδέν; 540 00:44:39,230 --> 00:44:45,830 Αν αυτό είναι μηδενική, τότε μπορούμε να πούμε εντάξει, ματαίωση. 541 00:44:45,830 --> 00:44:49,450 >> Μια πιο κοινός τρόπος να γίνει αυτό είναι να χρησιμοποιήσετε το argc αξία. 542 00:44:49,450 --> 00:44:52,040 Μπορείτε να δείτε εδώ κατά την έναρξη της κύριας, 543 00:44:52,040 --> 00:44:58,040 που παρέλειψε την εν λόγω πρώτη δοκιμή που συνήθως κάνουμε όταν χρησιμοποιούν τα επιχειρήματα της γραμμής εντολών, 544 00:44:58,040 --> 00:45:05,240 η οποία είναι να εξετάσει εάν ή όχι argc αξία μας είναι αυτό που περιμένουμε. 545 00:45:05,240 --> 00:45:10,290 Σε αυτή την περίπτωση, εμείς περιμένουμε τουλάχιστον δύο επιχειρήματα, 546 00:45:10,290 --> 00:45:13,660 το όνομα του προγράμματος συν μία άλλη. 547 00:45:13,660 --> 00:45:17,140 Επειδή είμαστε έτοιμοι να χρησιμοποιήσετε το δεύτερο επιχείρημα εδώ. 548 00:45:17,140 --> 00:45:21,350 Έτσι, έχοντας κάποια δοκιμή εκ των προτέρων, πριν από την κλήση μας strcmp 549 00:45:21,350 --> 00:45:37,390 ότι οι δοκιμές ή όχι argv είναι τουλάχιστον 2, θα κάνει επίσης το ίδιο πράγμα. 550 00:45:37,390 --> 00:45:40,620 Μπορούμε να δούμε αν αυτό λειτουργεί εκτελώντας το πρόγραμμα ξανά. 551 00:45:40,620 --> 00:45:45,610 Μπορείτε να επανεκκινήσετε το πρόγραμμα σας πάντα μέσα GDB, η οποία είναι πολύ ωραία. 552 00:45:45,610 --> 00:45:49,310 Μπορείτε να τρέξετε, και όταν περνούν τα επιχειρήματα για το πρόγραμμά σας, 553 00:45:49,310 --> 00:45:53,060 μπορείτε να περάσετε σε κλήση, όταν τρέχει, όταν δεν μπότα επάνω GDB. 554 00:45:53,060 --> 00:45:57,120 Με αυτόν τον τρόπο μπορείτε να κρατήσετε την επίκληση πρόγραμμα σας με διαφορετικά επιχειρήματα κάθε φορά. 555 00:45:57,120 --> 00:46:08,080 Έτσι τρέχει, ή πάλι, μπορώ να Type R, και ας δούμε τι θα συμβεί αν πληκτρολογήσετε "γεια". 556 00:46:08,080 --> 00:46:11,140 Θα σας ρωτήσω πάντα αν θέλετε να ξεκινήσετε από την αρχή ξανά. 557 00:46:11,140 --> 00:46:17,490 Συνήθως, θέλετε να το ξεκινήσετε πάλι από την αρχή. 558 00:46:17,490 --> 00:46:25,010 Και σε αυτό το σημείο, επανεκκίνηση ξανά, το εκτυπώνει 559 00:46:25,010 --> 00:46:28,920 το πρόγραμμα που τρέχετε, buggy1, με το επιχείρημα γεια σου, 560 00:46:28,920 --> 00:46:32,720 και τυπώνει αυτό το πρότυπο έξω? λέει, "Μπορείτε να πάρετε μια D,« λυπημένο πρόσωπο. 561 00:46:32,720 --> 00:46:37,610 Αλλά δεν διαχωρίζονται από σφάλμα. Είπε ότι η διαδικασία βγήκε κανονικά. 562 00:46:37,610 --> 00:46:39,900 Έτσι, αυτό φαίνεται αρκετά καλό. 563 00:46:39,900 --> 00:46:43,050 Δεν υπάρχουν άλλα seg σφάλμα, κάναμε το παρελθόν, 564 00:46:43,050 --> 00:46:48,190 έτσι ώστε να φαίνεται σαν αυτό ήταν πράγματι το seg bug σφάλμα που είχαμε πάρει. 565 00:46:48,190 --> 00:46:51,540 Δυστυχώς, μας λέει ότι παίρνουμε μια Δ. 566 00:46:51,540 --> 00:46:54,090 >> Μπορούμε να πάμε πίσω και να δούμε τον κώδικα και να δούμε τι συμβαίνει εκεί 567 00:46:54,090 --> 00:46:57,980 να καταλάβω τι ήταν - γιατί μας έλεγε ότι έχουμε μια Δ. 568 00:46:57,980 --> 00:47:03,690 Ας δούμε, εδώ ήταν αυτό printf λέγοντας ότι έχεις ένα D. 569 00:47:03,690 --> 00:47:08,540 Αν πληκτρολογήσετε λίστα, όπως σας κρατήσει πληκτρολογώντας λίστα, κρατά επανάληψη κάτω από το πρόγραμμά σας, 570 00:47:08,540 --> 00:47:10,940 γι 'αυτό θα σας δείξω τις πρώτες γραμμές του προγράμματός σας. 571 00:47:10,940 --> 00:47:15,450 Στη συνέχεια θα σας δείξει τις επόμενες λίγες γραμμές, και το επόμενο κομμάτι και το επόμενο κομμάτι. 572 00:47:15,450 --> 00:47:18,240 Και αυτό θα συνεχίσουμε να προσπαθούμε για να πάει κάτω. 573 00:47:18,240 --> 00:47:21,180 Και τώρα θα φτάσουμε στο «γραμμή αριθμός 16 είναι εκτός εμβέλειας." 574 00:47:21,180 --> 00:47:23,940 Επειδή έχει μόνο 15 γραμμές. 575 00:47:23,940 --> 00:47:30,310 Αν φτάσετε σε αυτό το σημείο και σας αναρωτιέστε, "Τι μπορώ να κάνω;" μπορείτε να χρησιμοποιήσετε την εντολή help. 576 00:47:30,310 --> 00:47:34,340 Χρησιμοποιήστε βοηθήσει και στη συνέχεια να του δώσει το όνομα μιας εντολής. 577 00:47:34,340 --> 00:47:36,460 Και θα δείτε το GDB δίνει σε όλους μας αυτό το είδος του πράγματα. 578 00:47:36,460 --> 00:47:43,870 Λέει, "Με κανένα επιχείρημα, απαριθμεί δέκα ακόμη γραμμές μετά ή γύρω από την προηγούμενη επιχείρηση. 579 00:47:43,870 --> 00:47:47,920 Κατάλογος - απαριθμεί τις δέκα γραμμές πριν - " 580 00:47:47,920 --> 00:47:52,960 Ας δοκιμάστε να χρησιμοποιήσετε μείον λίστα. 581 00:47:52,960 --> 00:47:57,000 Και αυτό απαριθμεί τις 10 γραμμές προηγούμενο? Μπορείτε να παίξετε γύρω με λίστα λίγο. 582 00:47:57,000 --> 00:48:02,330 Μπορείτε να κάνετε λίστα, λίστα -, μπορείτε ακόμη και να εγγράψει έναν αριθμό, όπως η λίστα 8, 583 00:48:02,330 --> 00:48:07,500 και θα απαριθμεί τις 10 γραμμές γύρω από τη γραμμή 8. 584 00:48:07,500 --> 00:48:10,290 Και μπορείτε να δείτε τι συμβαίνει εδώ είναι ότι έχετε μια απλή, αν άλλο. 585 00:48:10,290 --> 00:48:13,980 Αν πληκτρολογήσετε CS50 βράχους, που εκτυπώνει "Μπορείτε να πάρετε μια Α." 586 00:48:13,980 --> 00:48:16,530 Διαφορετικά, εκτυπώνει "Μπορείτε να πάρετε μια Δ." 587 00:48:16,530 --> 00:48:23,770 Κρίμα πόλη. Εντάξει. Ναι; 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Έτσι, όταν προσπάθησα να κάνει CS50 βράχια χωρίς τα εισαγωγικά, 589 00:48:26,730 --> 00:48:29,290 λέει "Μπορείτε να πάρετε μια Δ." 590 00:48:29,290 --> 00:48:32,560 Χρειαζόμουν τα εισαγωγικά για να πάμε στη δουλειά μας? Γιατί συμβαίνει αυτό; 591 00:48:32,560 --> 00:48:38,490 Ναι >>. Αποδεικνύεται ότι όταν - αυτό είναι ένα άλλο διασκεδαστικό λίγο εκλεκτός μεζές - 592 00:48:38,490 --> 00:48:47,900 όταν εκτελείτε το πρόγραμμα, αν θέλουμε να τρέξει και να πληκτρολογήσετε CS50 βράχους, 593 00:48:47,900 --> 00:48:50,800 όπως έλεγε ο Daniel έκανε, και πατήσετε Enter, 594 00:48:50,800 --> 00:48:52,870 λέει ακόμα να πάρετε μια Δ. 595 00:48:52,870 --> 00:48:55,580 Και το ερώτημα είναι, γιατί συμβαίνει αυτό; 596 00:48:55,580 --> 00:49:02,120 Και αποδεικνύεται ότι τόσο τερματικό και GDB μας αναλύσει αυτά ως δύο ξεχωριστά επιχειρήματα. 597 00:49:02,120 --> 00:49:04,800 Διότι όταν υπάρχει ένας χώρος, που είναι σιωπηρή, όπως 598 00:49:04,800 --> 00:49:08,730 το πρώτο επιχείρημα έληξε? το επόμενο επιχείρημα είναι έτοιμο να ξεκινήσει. 599 00:49:08,730 --> 00:49:13,260 Ο τρόπος για να συνδυάσετε αυτές σε δύο, ή συγγνώμη, σε ένα επιχείρημα, 600 00:49:13,260 --> 00:49:18,510 είναι να χρησιμοποιήσετε τα εισαγωγικά. 601 00:49:18,510 --> 00:49:29,560 Έτσι τώρα, αν το βάλετε σε εισαγωγικά και να τρέξει και πάλι, έχουμε μια A. 602 00:49:29,560 --> 00:49:38,780 Έτσι απλά για να ανακεφαλαιώσουμε, δεν εισαγωγικά, CS50 και βράχια αναλύεται ως δύο ξεχωριστά επιχειρήματα. 603 00:49:38,780 --> 00:49:45,320 Με εισαγωγικά, είναι αναλύονται ως ένα επιχείρημα εντελώς. 604 00:49:45,320 --> 00:49:53,070 >> Μπορούμε να δούμε αυτό με ένα breakpoint. 605 00:49:53,070 --> 00:49:54,920 Μέχρι στιγμής έχουμε ήδη τρέχει το πρόγραμμά μας, και είναι ήδη τρέχει 606 00:49:54,920 --> 00:49:58,230 μέχρι είτε να διαχωρίζονται από λάθη ή επιτυχίες σφάλμα 607 00:49:58,230 --> 00:50:05,930 ή μέχρι να βγει και όλα ήταν μια χαρά. 608 00:50:05,930 --> 00:50:08,360 Αυτό δεν είναι απαραίτητα το πιο χρήσιμο πράγμα, επειδή μερικές φορές 609 00:50:08,360 --> 00:50:11,840 έχετε ένα σφάλμα στο πρόγραμμά σας, αλλά αυτό δεν είναι που προκαλεί ένα σφάλμα καταμερισμού. 610 00:50:11,840 --> 00:50:16,950 Δεν είναι αυτό που προκαλεί το πρόγραμμά σας για να σταματήσει ή κάτι τέτοιο. 611 00:50:16,950 --> 00:50:20,730 Ο τρόπος για να πάρετε GDB να σταματήσει το πρόγραμμά σας σε ένα συγκεκριμένο σημείο 612 00:50:20,730 --> 00:50:23,260 είναι να ορίσετε ένα breakpoint. 613 00:50:23,260 --> 00:50:26,520 Μπορείτε να το κάνετε αυτό είτε με τον καθορισμό ενός breakpoint στο όνομα της συνάρτησης 614 00:50:26,520 --> 00:50:30,770 ή μπορείτε να ορίσετε ένα breakpoint σε μια συγκεκριμένη γραμμή κώδικα. 615 00:50:30,770 --> 00:50:34,450 Μου αρέσει να ορίσετε σημεία διακοπής λειτουργίας σε ονόματα, γιατί - είναι εύκολο να θυμάστε, 616 00:50:34,450 --> 00:50:37,700 και αν πραγματικά πάνε και να αλλάξετε τον πηγαίο κώδικα σας επάνω λίγο, 617 00:50:37,700 --> 00:50:42,020 breakpoint τότε θα σας μείνει πραγματικά στην ίδια θέση στον κωδικό σας. 618 00:50:42,020 --> 00:50:44,760 Ότι, αν χρησιμοποιείτε αριθμούς γραμμών, και οι αριθμοί αλλάζουν γραμμή 619 00:50:44,760 --> 00:50:51,740 επειδή μπορείτε να προσθέσετε ή να διαγράψετε κάποιο κωδικό, τότε τα σημεία διακοπής σας όλα εντελώς μαντάρα. 620 00:50:51,740 --> 00:50:58,590 Ένα από τα πιο κοινά πράγματα που κάνετε είναι να ορίσετε ένα breakpoint στην κύρια λειτουργία. 621 00:50:58,590 --> 00:51:05,300 Συχνά Θα εκκίνηση GDB, θα πληκτρολογήσετε β κύρια, πατήστε Enter, και ότι θα ορίσετε ένα breakpoint 622 00:51:05,300 --> 00:51:10,630 για την κύρια λειτουργία που απλά λέει, "Παύση του πρόγραμμα αμέσως μόλις αρχίσουν να προβάλλονται," 623 00:51:10,630 --> 00:51:17,960 και με αυτόν τον τρόπο, όταν τρέχω το πρόγραμμα μου με, ας πούμε, CS50 βράχους ως δύο επιχειρήματα 624 00:51:17,960 --> 00:51:24,830 και πατήστε Enter, παίρνει την κύρια λειτουργία και να σταματήσει ακριβώς στην πρώτη γραμμή, 625 00:51:24,830 --> 00:51:30,620 δικαίωμα πριν αξιολογεί την strcmp λειτουργία. 626 00:51:30,620 --> 00:51:34,940 >> Επειδή είμαι παύση, τώρα μπορώ να ξεκινήσω mucking γύρω και να δει τι συμβαίνει 627 00:51:34,940 --> 00:51:40,250 με όλες τις διάφορες μεταβλητές που έχουν περάσει στο πρόγραμμά μου. 628 00:51:40,250 --> 00:51:43,670 Εδώ μπορώ να εκτυπώσετε argc και να δούμε τι συμβαίνει. 629 00:51:43,670 --> 00:51:50,030 Δείτε ότι argc είναι 3, επειδή πήρε 3 διαφορετικές τιμές σε αυτό. 630 00:51:50,030 --> 00:51:54,060 Είναι πήρε το όνομα του προγράμματος, το πήρε το πρώτο επιχείρημα και το δεύτερο επιχείρημα. 631 00:51:54,060 --> 00:52:09,330 Μπορούμε να τυπώσουμε από εκείνους που αναζητούν στο argv [0], argv [1], και argv [2]. 632 00:52:09,330 --> 00:52:12,030 Έτσι τώρα μπορείτε επίσης να δείτε γιατί αυτή η κλήση strcmp πρόκειται να αποτύχει, 633 00:52:12,030 --> 00:52:21,650 γιατί βλέπεις ότι δεν χωρίσουν τον CS50 και τους βράχους σε δύο διαφορετικά επιχειρήματα. 634 00:52:21,650 --> 00:52:27,250 Σε αυτό το σημείο, από τη στιγμή που έχετε χτυπήσει ένα σημείο διακοπής, μπορείτε να συνεχίσετε να το βήμα μέσα από το πρόγραμμα σας 635 00:52:27,250 --> 00:52:32,920 γραμμή προς γραμμή, σε αντίθεση με την έναρξη του προγράμματος σας και πάλι. 636 00:52:32,920 --> 00:52:35,520 Έτσι, αν δεν θέλετε να ξεκινήσετε το πρόγραμμά σας και πάλι και μόλις συνεχίσει από εδώ, 637 00:52:35,520 --> 00:52:41,970 μπορείτε να χρησιμοποιήσετε την εντολή continue και θα συνεχιστεί τρέξει το πρόγραμμα μέχρι το τέλος. 638 00:52:41,970 --> 00:52:45,010 Ακριβώς όπως το έκανε εδώ. 639 00:52:45,010 --> 00:52:54,880 Ωστόσο, αν επανεκκίνηση του προγράμματος, CS50 βράχια, χτυπά breakpoint μου και πάλι, 640 00:52:54,880 --> 00:52:59,670 και αυτή τη φορά, αν δεν θέλω να φύγουμε σε όλη τη διαδρομή μέσα από το υπόλοιπο του προγράμματος, 641 00:52:59,670 --> 00:53:08,040 Μπορώ να χρησιμοποιήσω την επόμενη εντολή, που θα συντομεύσει επίσης με n. 642 00:53:08,040 --> 00:53:12,960 Και αυτό θα το βήμα από τη γραμμή του προγράμματος από την γραμμή. 643 00:53:12,960 --> 00:53:17,530 Έτσι, μπορείτε να παρακολουθήσετε τα πράγματα ως εκτελέσει, όπως η αλλαγή μεταβλητών, όπως τα πράγματα λάβετε ενημέρωση. 644 00:53:17,530 --> 00:53:21,550 Ποια είναι αρκετά ωραία. 645 00:53:21,550 --> 00:53:26,570 Το άλλο δροσερό πράγμα είναι αντί να επαναλαμβάνει την ίδια εντολή ξανά και ξανά και ξανά, 646 00:53:26,570 --> 00:53:30,670 αν απλά πατήστε Enter - έτσι εδώ που βλέπετε δεν έχω πληκτρολογήσει στο τίποτα - 647 00:53:30,670 --> 00:53:33,780 αν εγώ απλά πατήστε Enter, θα επαναλάβει την προηγούμενη εντολή, 648 00:53:33,780 --> 00:53:36,900 ή η προηγούμενη εντολή GDB ότι εγώ απλά βάλτε μέσα 649 00:53:36,900 --> 00:53:56,000 Μπορώ να κρατήσει το χτύπημα Enter και θα κρατήσει την ενίσχυση μέσω της γραμμής κωδικό μου γραμμή. 650 00:53:56,000 --> 00:53:59,310 Θα ήθελα να σας ενθαρρύνω τα παιδιά να πάνε ελέγξτε έξω τα άλλα προγράμματα, καθώς και με λάθη. 651 00:53:59,310 --> 00:54:01,330 Δεν έχουμε χρόνο για να περάσει όλα αυτά σήμερα στο τμήμα. 652 00:54:01,330 --> 00:54:05,890 Ο πηγαίος κώδικας είναι εκεί, ώστε να μπορείτε να δείτε το είδος του τι συμβαίνει 653 00:54:05,890 --> 00:54:07,730 πίσω από τις σκηνές, αν έχετε κολλήσει πραγματικά, 654 00:54:07,730 --> 00:54:11,940 αλλά τουλάχιστον, ακριβώς πρακτική εκκίνηση GDB, 655 00:54:11,940 --> 00:54:13,940 την εκτέλεση του προγράμματος μέχρι να σπάσει σε σας, 656 00:54:13,940 --> 00:54:18,260 να πάρει την backtrace, υπολογίζει τι λειτουργεί η συντριβή ήταν, 657 00:54:18,260 --> 00:54:24,450 ποια γραμμή ήταν επάνω, εκτύπωση κάποιες τιμές των μεταβλητών, 658 00:54:24,450 --> 00:54:30,140 ακριβώς έτσι μπορείτε να πάρετε μια ιδέα για αυτό, γιατί αυτό πραγματικά θα σας βοηθήσει να πάμε μπροστά. 659 00:54:30,140 --> 00:54:36,340 Σε αυτό το σημείο, θα πάμε για να βγείτε από το GDB, το οποίο μπορείτε να κλείσετε τη χρήση ή απλά q. 660 00:54:36,340 --> 00:54:40,460 Εάν το πρόγραμμά σας είναι στη μέση της λειτουργίας ακόμα, και δεν έχει εγκαταλειφθεί, 661 00:54:40,460 --> 00:54:43,510 θα σας ζητήσει πάντα, "Είστε σίγουροι ότι θέλετε πραγματικά να σταματήσουν το κάπνισμα;" 662 00:54:43,510 --> 00:54:48,770 Μπορείτε απλά πατήστε ναι. 663 00:54:48,770 --> 00:54:55,250 >> Τώρα θα πάμε να δούμε το επόμενο πρόβλημα που έχουμε, το οποίο είναι το πρόγραμμα γάτα. 664 00:54:55,250 --> 00:54:59,880 Αν παρακολουθήσουμε τη σύντομη για τον αναπροσανατολισμό και σωλήνες, θα δείτε ότι ο Tommy χρησιμοποιεί αυτό το πρόγραμμα 665 00:54:59,880 --> 00:55:07,540 που τυπώνει ουσιαστικά όλη την παραγωγή ενός αρχείου στην οθόνη. 666 00:55:07,540 --> 00:55:12,660 Έτσι, αν τρέχω γάτα, αυτό είναι στην πραγματικότητα ένα ενσωματωμένο πρόγραμμα στη συσκευή, 667 00:55:12,660 --> 00:55:16,860 και αν έχετε υπολογιστές Mac, μπορείτε να το κάνετε αυτό στο Mac σας πάρα πολύ, αν ανοίξετε το τερματικό. 668 00:55:16,860 --> 00:55:25,630 Και εμείς - γάτα, ας πούμε, cp.c, και πατήστε Enter. 669 00:55:25,630 --> 00:55:29,640 Αυτό το έκανε, αν μετακινηθείτε προς τα επάνω λίγο και να δούμε πού τρέξαμε τη γραμμή, 670 00:55:29,640 --> 00:55:40,440 ή όπου τρέξαμε την εντολή cat, κυριολεκτικά μόλις εκτυπωθούν τα περιεχόμενα του cp.c στην οθόνη μας. 671 00:55:40,440 --> 00:55:44,140 Μπορούμε να το τρέξει και πάλι και μπορείτε να βάλετε σε πολλά αρχεία μαζί. 672 00:55:44,140 --> 00:55:49,880 Έτσι, μπορείτε να κάνετε cp.c γάτα, και στη συνέχεια μπορούμε να ενώσετε επίσης την cat.c αρχείο, 673 00:55:49,880 --> 00:55:53,250 το οποίο είναι το πρόγραμμα είμαστε έτοιμοι να γράψει, 674 00:55:53,250 --> 00:55:58,140 και αυτό θα εκτυπώσει και τα δύο αρχεία πλάτη με πλάτη στην οθόνη μας. 675 00:55:58,140 --> 00:56:05,490 Έτσι, αν μετακινηθείτε προς τα επάνω λίγο, βλέπουμε ότι όταν έτρεξε αυτή cp.c γάτα, cat.c, 676 00:56:05,490 --> 00:56:17,110 Αρχικά εκτυπώνεται το αρχείο cp, και στη συνέχεια, κάτω από αυτό, εκτυπώνεται το αρχείο cat.c δικαίωμα εδώ κάτω. 677 00:56:17,110 --> 00:56:19,650 Εμείς πάμε για να χρησιμοποιήσετε αυτό για να πάρει ακριβώς τα πόδια μας υγρό. 678 00:56:19,650 --> 00:56:25,930 Παίξτε με απλή εκτύπωση με το τερματικό, δείτε πώς λειτουργεί. 679 00:56:25,930 --> 00:56:39,170 Αν εσείς ανοίξει με το gedit cat.c, πατήστε Enter, 680 00:56:39,170 --> 00:56:43,760 μπορείτε να δείτε το πρόγραμμα ότι είμαστε έτοιμοι να γράψουν. 681 00:56:43,760 --> 00:56:48,980 Έχουμε συμπεριλάβει αυτό το ωραίο πλάκα λέβητα, έτσι ώστε να μην χρειάζεται να περνούν το χρόνο πληκτρολογώντας όλα αυτά τα έξω. 682 00:56:48,980 --> 00:56:52,310 Μπορούμε επίσης να ελέγξετε τον αριθμό των arguments που περνιούνται μέσα 683 00:56:52,310 --> 00:56:56,910 Εμείς εκτυπώσετε ένα ωραίο μήνυμα χρήση. 684 00:56:56,910 --> 00:57:00,950 >> Αυτό είναι το είδος των πράγμα που, και πάλι, όπως έχουμε μιλήσει για, 685 00:57:00,950 --> 00:57:04,490 Είναι σχεδόν σαν μνήμη των μυών. 686 00:57:04,490 --> 00:57:07,190 Απλά θυμηθείτε να συνεχίσει να κάνει το ίδιο είδος της ουσίας 687 00:57:07,190 --> 00:57:11,310 και πάντα την εκτύπωση από κάποιο είδος χρήσιμο μήνυμα 688 00:57:11,310 --> 00:57:17,670 έτσι ώστε οι άνθρωποι ξέρουν πώς να τρέξετε το πρόγραμμά σας. 689 00:57:17,670 --> 00:57:21,630 Με γάτα, είναι αρκετά απλή? Είμαστε ακριβώς πρόκειται να περάσουν από όλα τα διαφορετικά επιχειρήματα 690 00:57:21,630 --> 00:57:24,300 που είχαν περάσει στο πρόγραμμά μας, και θα πάμε για να εκτυπώσετε 691 00:57:24,300 --> 00:57:29,950 περιεχόμενό τους έξω στην οθόνη, ένα κάθε φορά. 692 00:57:29,950 --> 00:57:35,670 Για να εκτυπώσετε αρχεία από την οθόνη, θα πάμε να κάνουμε κάτι πολύ παρόμοιο 693 00:57:35,670 --> 00:57:38,120 για ό, τι κάναμε στο τέλος του κουίζ. 694 00:57:38,120 --> 00:57:45,350 Στο τέλος του κουίζ, που προσλαμβάνουν πρόγραμμα, θα έπρεπε να ανοίξουμε ένα αρχείο, 695 00:57:45,350 --> 00:57:48,490 και τότε θα έπρεπε να εκτυπώσουν σε αυτό. 696 00:57:48,490 --> 00:57:54,660 Σε αυτή την περίπτωση, θα πάμε για να ανοίξει ένα αρχείο, και θα πάμε να διαβάσετε από αυτό αντ 'αυτού. 697 00:57:54,660 --> 00:58:00,630 Στη συνέχεια θα πάμε να εκτυπώσετε, αντί σε ένα αρχείο, θα πάμε για να εκτυπώσετε στην οθόνη. 698 00:58:00,630 --> 00:58:05,830 Έτσι, εκτύπωση στην οθόνη που έχετε κάνει πριν από όλα με printf. 699 00:58:05,830 --> 00:58:08,290 Έτσι, αυτό δεν είναι πάρα πολύ τρελό. 700 00:58:08,290 --> 00:58:12,190 Όμως, την ανάγνωση ενός αρχείου είναι το είδος της παράξενο. 701 00:58:12,190 --> 00:58:17,300 Θα πάμε μέσα από αυτό ένα μικρό κομμάτι σε έναν χρόνο. 702 00:58:17,300 --> 00:58:20,560 Αν εσείς πάτε πίσω σε εκείνη την τελευταία πρόβλημα με κουίζ σας, πρόβλημα 33, 703 00:58:20,560 --> 00:58:27,280 η πρώτη γραμμή που θα πάμε να κάνουμε εδώ, το άνοιγμα του αρχείου, είναι πολύ παρόμοιο με αυτό που κάναμε εκεί. 704 00:58:27,280 --> 00:58:36,370 Έτσι, Στέλλα, τι κάνει αυτό το βλέμμα σαν γραμμή, όταν ανοίγουμε ένα αρχείο; 705 00:58:36,370 --> 00:58:47,510 [Στέλλα] * ΑΡΧΕΙΟ Capital, αρχείο - >> Εντάξει. >> - Είναι ίσο με fopen. Yup >>. 706 00:58:47,510 --> 00:58:55,980 Που στην προκειμένη περίπτωση είναι; Είναι το σχόλιο. 707 00:58:55,980 --> 00:59:06,930 >> Είναι το σχόλιο; argv [i] και r; 708 00:59:06,930 --> 00:59:11,300 Ακριβώς >>. Δεξιά επάνω. Έτσι Στέλλα είναι εντελώς σωστό. 709 00:59:11,300 --> 00:59:13,720 Αυτό είναι ό, τι η γραμμή μοιάζει. 710 00:59:13,720 --> 00:59:19,670 Εμείς πάμε για να πάρει μια μεταβλητή ροή αρχείο, αποθηκεύστε το σε ένα αρχείο *, έτσι ώστε όλα τα καλύμματα, 711 00:59:19,670 --> 00:59:25,720 FILE, *, και το όνομα αυτής της μεταβλητής θα είναι το αρχείο. 712 00:59:25,720 --> 00:59:32,250 Θα μπορούσαμε να το ονομάσουμε ό, τι μας αρέσει. Θα μπορούσαμε να το ονομάσουμε first_file, ή file_i, ό, τι θα θέλαμε. 713 00:59:32,250 --> 00:59:37,590 Και τότε το όνομα του αρχείου ψηφίστηκε στη γραμμή εντολών σε αυτό το πρόγραμμα. 714 00:59:37,590 --> 00:59:44,450 Έτσι είναι αποθηκευμένο στο argv [i,] και στη συνέχεια θα πάμε για να ανοίξει αυτό το αρχείο σε κατάσταση ανάγνωσης. 715 00:59:44,450 --> 00:59:48,100 Τώρα που έχουμε ανοίξει το αρχείο, αυτό είναι το πράγμα που πρέπει πάντα να θυμάστε να κάνετε 716 00:59:48,100 --> 00:59:52,230 κάθε φορά που έχουμε ανοίξει ένα αρχείο; Κλείστε αυτό. 717 00:59:52,230 --> 00:59:57,220 Έτσι, δεσποινίς, πώς μπορούμε να κλείσει ένα αρχείο; 718 00:59:57,220 --> 01:00:01,020 [Missy] Αδυναμία εγγραφής αρχείου (αρχείο) >> Αδυναμία εγγραφής αρχείου (αρχείο). Ακριβώς. 719 01:00:01,020 --> 01:00:05,340 Μεγάλη. Εντάξει. Αν κοιτάξουμε να κάνουμε αυτό το σχόλιο εδώ, 720 01:00:05,340 --> 01:00:11,940 λέει, "Open argv [i] και να εκτυπώσετε το περιεχόμενό του στο stdout." 721 01:00:11,940 --> 01:00:15,460 >> Πρότυπο έξω είναι ένα παράξενο όνομα. Stdout είναι ακριβώς ο τρόπος μας για να πούμε 722 01:00:15,460 --> 01:00:22,880 θέλουμε να το εκτυπώσετε στο τερματικό? θέλουμε να το εκτυπώσετε με το πρότυπο ρεύμα εξόδου. 723 01:00:22,880 --> 01:00:26,450 Μπορούμε πραγματικά να απαλλαγούμε από αυτό το σχόλιο εδώ. 724 01:00:26,450 --> 01:00:36,480 Πάω να το αντιγράψετε και να επικολλήσετε αυτό δεδομένου ότι είναι ό, τι κάναμε. 725 01:00:36,480 --> 01:00:41,290 Σε αυτό το σημείο, τώρα έχουμε να διαβάσει το αρχείο κομμάτι από το κομμάτι. 726 01:00:41,290 --> 01:00:46,300 Έχουμε συζητήσει ένα ζευγάρι των τρόπων ανάγνωσης αρχείων. 727 01:00:46,300 --> 01:00:51,830 Ποια είναι τα αγαπημένα σας μέχρι τώρα; 728 01:00:51,830 --> 01:00:57,960 Ποια τρόπους έχετε δει ή να θυμάστε, να διαβάσετε τα αρχεία; 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread; >> Fread; Έτσι fread είναι ένα. Jimmy, ξέρετε κάποια άλλα; 730 01:01:04,870 --> 01:01:12,150 [Jimmy] Όχι >> Εντάξει. Όχι. Charlotte; Αλέξανδρος; Τυχόν άλλοι; Εντάξει. 731 01:01:12,150 --> 01:01:20,740 Έτσι, οι υπόλοιπες είναι fgetc, είναι αυτή που θα χρησιμοποιήσουμε πολλά. 732 01:01:20,740 --> 01:01:26,410 Υπάρχει επίσης fscanf? Εσείς δείτε ένα μοτίβο εδώ; 733 01:01:26,410 --> 01:01:29,170 Όλοι ξεκινούν με f. Ό, τι να κάνει με ένα αρχείο. 734 01:01:29,170 --> 01:01:35,260 Υπάρχει fread, fgetc, fscanf. Αυτά είναι όλα τα λειτουργίες ανάγνωσης. 735 01:01:35,260 --> 01:01:49,120 Για γραφή έχουμε fwrite, έχουμε fputc αντί του fgetc. 736 01:01:49,120 --> 01:01:58,250 Έχουμε επίσης fprintf όπως είδαμε στο κουίζ. 737 01:01:58,250 --> 01:02:01,680 Δεδομένου ότι αυτό είναι ένα πρόβλημα που περιλαμβάνει την ανάγνωση από ένα αρχείο, 738 01:02:01,680 --> 01:02:04,940 θα πάμε να χρησιμοποιήσετε μία από αυτές τις τρεις λειτουργίες. 739 01:02:04,940 --> 01:02:10,890 Εμείς δεν πρόκειται να χρησιμοποιήσετε τις λειτουργίες αυτές εδώ κάτω. 740 01:02:10,890 --> 01:02:14,880 Αυτές οι λειτουργίες που βρίσκονται όλα στο πρότυπο I / O βιβλιοθήκη. 741 01:02:14,880 --> 01:02:17,510 Έτσι, αν κοιτάξουμε την κορυφή αυτού του προγράμματος, 742 01:02:17,510 --> 01:02:24,110 μπορείτε να δείτε ότι έχουμε ήδη συμπεριλάβει το αρχείο κεφαλίδα για το πρότυπο I / O βιβλιοθήκη. 743 01:02:24,110 --> 01:02:27,120 Αν θέλουμε να καταλάβουμε ποια θέλουμε να χρησιμοποιήσουμε, 744 01:02:27,120 --> 01:02:29,690 μπορούμε πάντα να ανοίξει τις σελίδες man. 745 01:02:29,690 --> 01:02:34,350 Έτσι μπορούμε να πληκτρολογήσετε stdio άνθρωπος 746 01:02:34,350 --> 01:02:43,180 και να διαβάσετε όλα τα σχετικά με την είσοδο και stdio λειτουργίες εξόδου στον Γ. 747 01:02:43,180 --> 01:02:49,870 Και μπορούμε να δούμε ήδη oh, κοίτα. Είναι που παραπέμπουν fgetc, αυτό είναι που παραπέμπουν fputc. 748 01:02:49,870 --> 01:02:57,220 Έτσι, μπορείτε να εμβαθύνετε λίγο και να δούμε, ας πούμε, fgetc 749 01:02:57,220 --> 01:03:00,060 και να κοιτάξουμε σελίδα man της. 750 01:03:00,060 --> 01:03:03,430 Μπορείτε να δείτε ότι πηγαίνει μαζί με ένα σωρό άλλες λειτουργίες: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, παίρνει, ungetc, και η συμβολή του χαρακτήρες και έγχορδα. 752 01:03:12,640 --> 01:03:19,180 Έτσι, αυτό είναι το πώς διαβάζουμε σε χαρακτήρες και έγχορδα από τα αρχεία από την κανονική είσοδο, 753 01:03:19,180 --> 01:03:21,990 η οποία είναι κατ 'ουσίαν από το χρήστη. 754 01:03:21,990 --> 01:03:24,780 Και αυτό είναι το πώς το κάνουμε στην πραγματική C. 755 01:03:24,780 --> 01:03:30,850 Έτσι, αυτό που δεν χρησιμοποιούν το GetString getchar και λειτουργίες 756 01:03:30,850 --> 01:03:36,840 ότι χρησιμοποιείται από τη βιβλιοθήκη CS50. 757 01:03:36,840 --> 01:03:39,710 Εμείς πάμε για να κάνουμε αυτό το πρόβλημα σε μια-δυο τρόπους 758 01:03:39,710 --> 01:03:43,430 έτσι ώστε να μπορείτε να δείτε δύο διαφορετικούς τρόπους για να γίνει αυτό. 759 01:03:43,430 --> 01:03:48,490 Τόσο η λειτουργία fread ότι ο Δανιήλ αναφέρει και fgetc είναι καλοί τρόποι για να το κάνει. 760 01:03:48,490 --> 01:03:53,790 Νομίζω fgetc είναι λίγο πιο εύκολο, γιατί έχει μόνο, όπως βλέπετε, 761 01:03:53,790 --> 01:03:59,660 ένα όρισμα, το αρχείο * ότι προσπαθούμε να διαβάσετε το χαρακτήρα από, 762 01:03:59,660 --> 01:04:02,740 και η τιμή επιστροφής της είναι ένα int. 763 01:04:02,740 --> 01:04:05,610 Και αυτό είναι μια μικρή σύγχυση, έτσι δεν είναι; 764 01:04:05,610 --> 01:04:11,450 >> Επειδή είμαστε να πάρει ένα χαρακτήρα, οπότε γιατί να μην επιστρέψει μια χαρα; 765 01:04:11,450 --> 01:04:18,700 Εσείς έχετε κάποιες ιδέες σχετικά με το γιατί αυτό δεν θα μπορούσε να επιστρέψει μια χαρα; 766 01:04:18,700 --> 01:04:25,510 [Απαντήσεις Missy, ακατάληπτο] >> Ναι. Έτσι, Missy είναι εντελώς σωστό. 767 01:04:25,510 --> 01:04:31,570 Αν είναι ASCII, τότε αυτό θα μπορούσε να είναι ακέραιος αντιστοιχίζονται με μία πραγματική char. 768 01:04:31,570 --> 01:04:33,520 Θα μπορούσε να είναι ένα ASCII χαρακτήρα, και αυτό είναι σωστό. 769 01:04:33,520 --> 01:04:36,220 Αυτό είναι ακριβώς τι συμβαίνει. 770 01:04:36,220 --> 01:04:39,190 Είμαστε χρησιμοποιώντας ένα int απλά επειδή έχει περισσότερα bit. 771 01:04:39,190 --> 01:04:44,750 Είναι μεγαλύτερο από ένα char? Char μας έχει μόνο 8 bits, ότι 1 byte για 32-bit μηχανές μας. 772 01:04:44,750 --> 01:04:48,520 Και μια int έχει αξία όλων των 4 bytes του χώρου. 773 01:04:48,520 --> 01:04:50,940 Και αποδεικνύεται ότι ο τρόπος που λειτουργεί fgetc, 774 01:04:50,940 --> 01:04:53,940 αν μετακινηθείτε προς τα κάτω στη σύνοψη μας σε αυτή τη σελίδα άνθρωπο λίγο, 775 01:04:53,940 --> 01:05:05,000 μετακινηθείτε σε όλη τη διαδρομή προς τα κάτω. Αποδεικνύεται ότι χρησιμοποιούν αυτή την ιδιαίτερη αξία που ονομάζεται ΕΟΦ. 776 01:05:05,000 --> 01:05:09,640 Είναι μια ειδική σταθερά ως τιμή επιστροφής της συνάρτησης fgetc 777 01:05:09,640 --> 01:05:14,570 κάθε φορά που θα χτυπήσει το τέλος του αρχείου ή εάν παίρνετε ένα λάθος. 778 01:05:14,570 --> 01:05:18,170 Και αποδεικνύεται ότι για να κάνουμε αυτές τις συγκρίσεις με τον ΕΟΦ σωστά, 779 01:05:18,170 --> 01:05:24,060 θέλετε να έχετε αυτό το επιπλέον ποσό των πληροφοριών που έχετε σε μια int 780 01:05:24,060 --> 01:05:28,420 σε αντίθεση με τη χρήση ενός απανθρακώματος μεταβλητή. 781 01:05:28,420 --> 01:05:32,130 Ακόμα κι αν fgetc είναι να πάρει αποτελεσματικά ένα χαρακτήρα από ένα αρχείο, 782 01:05:32,130 --> 01:05:38,450 θέλετε να θυμάστε ότι επιστρέφει κάτι που είναι του τύπου int σε εσάς. 783 01:05:38,450 --> 01:05:41,360 Τούτου λεχθέντος, είναι αρκετά εύκολο στη χρήση. 784 01:05:41,360 --> 01:05:44,960 Είναι πρόκειται να μας δώσει ένα χαρακτήρα? Έτσι το μόνο που έχουμε να κάνουμε είναι να κρατήσει ζητώντας από το αρχείο, 785 01:05:44,960 --> 01:05:48,440 "Δώσε μου τον επόμενο χαρακτήρα, να μου δώσει τον επόμενο χαρακτήρα, να μου δώσει τον επόμενο χαρακτήρα», 786 01:05:48,440 --> 01:05:51,400 μέχρι να φτάσουμε στο τέλος του αρχείου. 787 01:05:51,400 --> 01:05:54,730 Και ότι θα τραβήξει σε ένα χαρακτήρα τη φορά από το αρχείο μας, 788 01:05:54,730 --> 01:05:56,250 και στη συνέχεια μπορούμε να κάνουμε ό, τι θέλουμε με αυτό. 789 01:05:56,250 --> 01:06:00,160 Μπορούμε να το αποθηκεύσετε, μπορούμε να το προσθέσετε σε μια σειρά, μπορούμε να το εκτυπώσετε. 790 01:06:00,160 --> 01:06:04,630 Προβείτε σε οποιαδήποτε από αυτό. 791 01:06:04,630 --> 01:06:09,600 >> Ζουμ πίσω έξω και να πηγαίνει πίσω στο πρόγραμμα cat.c μας, 792 01:06:09,600 --> 01:06:16,170 αν θα πάμε να χρησιμοποιήσετε fgetc, 793 01:06:16,170 --> 01:06:21,710 πώς θα μπορούσαμε να προσεγγίσουμε αυτή την επόμενη γραμμή του κώδικα; 794 01:06:21,710 --> 01:06:26,020 Εμείς πάμε για να χρησιμοποιήσει - fread θα κάνει κάτι λίγο διαφορετικό. 795 01:06:26,020 --> 01:06:32,600 Και αυτή τη φορά, είμαστε ακριβώς πρόκειται να χρησιμοποιήσετε fgetc να πάρει ένα χαρακτήρα κάθε φορά. 796 01:06:32,600 --> 01:06:40,910 Για να επεξεργαστείτε ένα ολόκληρο αρχείο, αυτό θα μπορούσε να πρέπει να κάνουμε; 797 01:06:40,910 --> 01:06:44,030 Πόσοι χαρακτήρες υπάρχουν σε ένα αρχείο; 798 01:06:44,030 --> 01:06:47,390 Υπάρχουν πολλά. Έτσι, ίσως θέλετε να πάρετε ένα 799 01:06:47,390 --> 01:06:49,860 και στη συνέχεια να πάρετε ένα άλλο και να πάρει ένα άλλο και να πάρει ένα άλλο. 800 01:06:49,860 --> 01:06:53,330 Τι είδος του αλγορίθμου νομίζετε ότι θα μπορούσαμε να χρησιμοποιήσουμε εδώ; 801 01:06:53,330 --> 01:06:55,470 Τι είδους -; [Αλέξανδρος] Α για βρόχο; Ακριβώς >>. 802 01:06:55,470 --> 01:06:57,500 Κάποιο είδος του βρόγχου. 803 01:06:57,500 --> 01:07:03,380 Ένας βρόχος for είναι πραγματικά μεγάλη, σε αυτή την περίπτωση. 804 01:07:03,380 --> 01:07:08,620 Και όπως είπατε, αυτό ακούγεται σαν θέλετε μια θηλιά πάνω από το σύνολο του φακέλου, 805 01:07:08,620 --> 01:07:11,820 να πάρει ένα χαρακτήρα τη φορά. 806 01:07:11,820 --> 01:07:13,850 Οποιεσδήποτε προτάσεις σχετικά με το τι που θα μπορούσε να μοιάζει; 807 01:07:13,850 --> 01:07:22,090 [Αλέξανδρος, ακατάληπτο] 808 01:07:22,090 --> 01:07:30,050 >> Εντάξει, απλά πες μου στα αγγλικά αυτό που προσπαθείτε να κάνετε; [Αλέξανδρος, ακατάληπτο] 809 01:07:30,050 --> 01:07:36,270 Έτσι, στην περίπτωση αυτή, ακούγεται σαν να είμαστε απλώς προσπαθεί να βρόχο πάνω από το σύνολο του φακέλου. 810 01:07:36,270 --> 01:07:45,330 [Αλέξανδρος] Έτσι, i <το μέγεθος του int; >> Το μέγεθος της -; 811 01:07:45,330 --> 01:07:49,290 Υποθέτω ότι το μέγεθος του αρχείου, έτσι δεν είναι; Το μέγεθος - we'll απλά γράψτε το όπως αυτό. 812 01:07:49,290 --> 01:07:57,470 Μέγεθος του αρχείου για την ώρα, i + +. 813 01:07:57,470 --> 01:08:04,610 Έτσι, αποδεικνύεται ότι ο τρόπος που το κάνετε αυτό χρησιμοποιώντας fgetc, και αυτό είναι νέο, 814 01:08:04,610 --> 01:08:10,460 είναι ότι δεν υπάρχει εύκολος τρόπος για να πάρετε ακριβώς το μέγεθος ενός αρχείου 815 01:08:10,460 --> 01:08:16,979 με αυτό το "sizeof" τύπο κατασκευής που έχετε δει πριν. 816 01:08:16,979 --> 01:08:20,910 Όταν χρησιμοποιείτε αυτή τη λειτουργία fgetc, είμαστε εισαγωγή κάποιου είδους 817 01:08:20,910 --> 01:08:29,069 νέα, funky σύνταξη σε αυτό για βρόχο, όπου αντί να χρησιμοποιεί μόνο μια βασική αντίθεση 818 01:08:29,069 --> 01:08:33,920 για να πάει χαρακτήρα προς χαρακτήρα, θα πάμε να τραβήξει ένα χαρακτήρα κάθε φορά, 819 01:08:33,920 --> 01:08:37,120 ένα χαρακτήρα κάθε φορά, και ο τρόπος που ξέρουμε ότι είμαστε στο τέλος 820 01:08:37,120 --> 01:08:41,290 όταν δεν έχουμε υπολογίζονται έναν ορισμένο αριθμό χαρακτήρων, 821 01:08:41,290 --> 01:08:49,939 αλλά όταν ο χαρακτήρας μας βγάλει είναι ότι οι ειδικές τέλος του αρχείου χαρακτήρα. 822 01:08:49,939 --> 01:08:58,689 Έτσι, μπορούμε να το κάνουμε αυτό με - Καλώ αυτό το ch, και θα πάμε να το αρχικοποιήσει 823 01:08:58,689 --> 01:09:08,050 με την πρώτη κλήση μας για να πάρει τον πρώτο χαρακτήρα από το αρχείο. 824 01:09:08,050 --> 01:09:14,979 Έτσι, αυτό το μέρος εδώ, αυτό πρόκειται να πάρει ένα χαρακτήρα από το αρχείο 825 01:09:14,979 --> 01:09:20,840 και να αποθηκεύσει στη μεταβλητή ch. 826 01:09:20,840 --> 01:09:25,420 Εμείς πάμε για να συνεχίσουμε να το κάνουμε αυτό μέχρι να φτάσουμε στο τέλος του αρχείου, 827 01:09:25,420 --> 01:09:41,170 οποίο κάνουμε με τη δοκιμή για τον χαρακτήρα δεν είναι ίσο με το εν λόγω ειδικό χαρακτήρα ΕΟΦ. 828 01:09:41,170 --> 01:09:48,750 Και τότε, αντί να κάνει ch + +, η οποία θα αυξήσει την αξία μόνο του, 829 01:09:48,750 --> 01:09:52,710 οπότε αν διαβάσουμε ένα ένα από το αρχείο, ένα κεφαλαίο Α, ας πούμε, 830 01:09:52,710 --> 01:09:56,810 ch + + θα μας δώσει β, και τότε θα έπαιρνα γ και δ στη συνέχεια. 831 01:09:56,810 --> 01:09:59,310 Αυτό σαφώς δεν είναι αυτό που θέλουμε. Αυτό που θέλουμε εδώ 832 01:09:59,310 --> 01:10:05,830 σε αυτό το τελευταίο κομμάτι που θέλουμε να πάρει τον επόμενο χαρακτήρα από το αρχείο. 833 01:10:05,830 --> 01:10:09,500 >> Πώς, λοιπόν, μπορεί να έχουμε τον επόμενο χαρακτήρα από το αρχείο; 834 01:10:09,500 --> 01:10:13,470 Πώς να πάρει τον πρώτο χαρακτήρα από το αρχείο; 835 01:10:13,470 --> 01:10:17,200 [Φοιτητικό] fgetfile; >> Fgetc, ή, συγγνώμη, θα ήταν απόλυτα σωστή. 836 01:10:17,200 --> 01:10:20,470 Μου ορθογραφικά λάθη εκεί. Οπότε ναι. 837 01:10:20,470 --> 01:10:26,240 Εδώ, αντί να κάνει ch + +, 838 01:10:26,240 --> 01:10:29,560 είμαστε ακριβώς πρόκειται να καλέσετε fgetc (αρχείο) και πάλι 839 01:10:29,560 --> 01:10:39,180 και αποθηκεύουν το αποτέλεσμα στην ίδια μεταβλητή ch μας. 840 01:10:39,180 --> 01:10:43,730 [Ερώτηση Φοιτητών, ακατάληπτο] 841 01:10:43,730 --> 01:10:52,390 >> Αυτό είναι όπου αυτοί οι τύποι αρχείου * είναι ειδική. 842 01:10:52,390 --> 01:10:59,070 Ο τρόπος που λειτουργεί είναι ότι - όταν για πρώτη φορά ανοιχτό - όταν κάνετε την πρώτη κλήση αυτή fopen, 843 01:10:59,070 --> 01:11:04,260 το * FILE χρησιμεύει αποτελεσματικά ως ένα δείκτη στην αρχή του αρχείου. 844 01:11:04,260 --> 01:11:12,830 Και στη συνέχεια, κάθε φορά που θα καλέσει fgetc, κινείται ένα χαρακτήρα μέσα από το αρχείο. 845 01:11:12,830 --> 01:11:23,280 Έτσι, κάθε φορά που θα καλέσει αυτό, έχετε την αύξηση του δείκτη αρχείου με ένα χαρακτήρα. 846 01:11:23,280 --> 01:11:26,210 Και όταν fgetc πάλι, είστε κινείται το άλλο χαρακτήρα 847 01:11:26,210 --> 01:11:28,910 και ένα άλλο χαρακτήρα και ένα άλλο χαρακτήρα και ένα άλλο χαρακτήρα. 848 01:11:28,910 --> 01:11:32,030 [Ερώτηση Φοιτητών, ακατάληπτο] >> Και that's - ναι. 849 01:11:32,030 --> 01:11:34,810 Είναι το είδος της μαγείας κάτω από την κουκούλα. 850 01:11:34,810 --> 01:11:37,930 Μπορείτε απλά να κρατήσει προσαύξηση μέσα. 851 01:11:37,930 --> 01:11:46,510 Σε αυτό το σημείο, είστε σε θέση πραγματικά να συνεργαστεί με έναν χαρακτήρα. 852 01:11:46,510 --> 01:11:52,150 Πώς, λοιπόν, θα μπορούσαμε να εκτυπώσετε αυτό έξω στην οθόνη, τώρα; 853 01:11:52,150 --> 01:11:58,340 Μπορούμε να χρησιμοποιήσουμε το ίδιο πράγμα printf που χρησιμοποιήσαμε πριν. 854 01:11:58,340 --> 01:12:00,330 Αυτό που έχουμε χρησιμοποιήσει όλα τα εξαμήνου. 855 01:12:00,330 --> 01:12:05,450 Μπορούμε να καλέσετε printf, 856 01:12:05,450 --> 01:12:21,300 και μπορούμε να περάσουμε στο χαρακτήρα έτσι απλά. 857 01:12:21,300 --> 01:12:27,430 Ένας άλλος τρόπος για να το κάνουμε είναι αντί να χρησιμοποιούν printf και έχουν να κάνουν αυτή την συμβολοσειρά μορφής, 858 01:12:27,430 --> 01:12:29,490 μπορούμε επίσης να χρησιμοποιήσουμε μία από τις άλλες λειτουργίες. 859 01:12:29,490 --> 01:12:40,090 Μπορούμε να χρησιμοποιήσουμε fputc, η οποία εκτυπώνει ένα χαρακτήρα στην οθόνη, 860 01:12:40,090 --> 01:12:52,580 εκτός αν κοιτάξουμε fputc - επιτρέψτε μου σμίκρυνση λίγο. 861 01:12:52,580 --> 01:12:56,430 Βλέπουμε τι ωραίο είναι ότι παίρνει στο χαρακτήρα που διαβάζουμε με τη χρήση fgetc, 862 01:12:56,430 --> 01:13:05,100 αλλά τότε θα πρέπει να του δώσετε ένα ρεύμα να εκτυπώσετε. 863 01:13:05,100 --> 01:13:11,850 Μπορούμε επίσης να χρησιμοποιήσουμε τη λειτουργία putchar, το οποίο θα τεθεί άμεσα σε τυποποιημένες. 864 01:13:11,850 --> 01:13:16,070 Έτσι, υπάρχουν ένα σωρό διαφορετικές επιλογές που μπορούμε να χρησιμοποιήσουμε για την εκτύπωση. 865 01:13:16,070 --> 01:13:19,580 Είναι όλα στο πρότυπο I / O βιβλιοθήκη. 866 01:13:19,580 --> 01:13:25,150 Κάθε φορά που θέλετε να εκτυπώσετε - έτσι printf, από προεπιλογή, θα εκτυπωθούν σε ειδικό πρότυπο από ρεύμα, 867 01:13:25,150 --> 01:13:27,910 η οποία είναι ότι stdout. 868 01:13:27,910 --> 01:13:41,300 Έτσι, μπορούμε απλά να αναφέρονται σε αυτήν ως είδος αυτού του μαγικού αξία, stdout εδώ. 869 01:13:41,300 --> 01:13:48,410 Ωχ. Βάλτε το ερωτηματικό έξω. 870 01:13:48,410 --> 01:13:52,790 >> Αυτή είναι μια πολύ νέα, funky πληροφορίες εδώ. 871 01:13:52,790 --> 01:13:58,600 Πολλά από αυτά είναι πολύ ιδιότυπο, με την έννοια ότι αυτή είναι κώδικας 872 01:13:58,600 --> 01:14:05,700 που είναι γραμμένο με αυτόν τον τρόπο μόνο και μόνο επειδή είναι καθαρή για να διαβάσετε, εύκολο να το διαβάσετε. 873 01:14:05,700 --> 01:14:11,520 Υπάρχουν πολλοί διαφορετικοί τρόποι για να το κάνει, πολλές διαφορετικές λειτουργίες που μπορείτε να χρησιμοποιήσετε, 874 01:14:11,520 --> 01:14:14,680 αλλά έχουμε την τάση να ακολουθούν ακριβώς τα ίδια μοτίβα ξανά και ξανά. 875 01:14:14,680 --> 01:14:20,180 Έτσι, μην εκπλαγείτε αν δείτε τον κωδικό όπως αυτό έρχονται ξανά και ξανά. 876 01:14:20,180 --> 01:14:25,690 Εντάξει. Σε αυτό το σημείο, πρέπει να σπάσει για την ημέρα. 877 01:14:25,690 --> 01:14:31,300 Ευχαριστώ που ήρθες. Ευχαριστώ για την προσοχή αν είστε σε απευθείας σύνδεση. Και θα τα πούμε την επόμενη εβδομάδα. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]