JASON Hirschhorn: Welcome σε Α5, ο καθένας. Έχουμε μια συναρπαστική εβδομάδα μπροστά μας, κυρίως επειδή υπάρχουν τόσα πολλά νέα αντιμετωπίζει σε αυτό το δωμάτιο. Είναι υπέροχο. Πολλοί από εσάς εδώ κατά λάθος, το οποίο είναι ακόμα καλύτερο. Έτσι, ελπίζουμε ότι θα κρατήσει την ένταξή μας. Αυτή την εβδομάδα θα πάμε να περάσουν το μεγαλύτερο μέρος του τμήματος προετοιμασία για το κουίζ. Έτσι ημερήσια διάταξή μας, θα πάμε να μιλήσουμε ένα κομμάτι σχετικά με πόρους για την τάξη, αλλά επίσης και για το κουίζ και, στη συνέχεια, και πάλι, περνούν το μεγαλύτερο μέρος της κατηγορίας μιλάμε για τις ερωτήσεις. Μόλις τελειώσαμε την απάντηση σας ερωτήσεις, ή εάν οι ερωτήσεις σας φυσικά να μας οδηγήσει σε κάποια κωδικοποίηση, I έχουν προβλήματα δείγμα από εξετάσεις προόδου παρελθόν που θα κωδικοποιήσει ζωντανά στο τμήμα μαζί που να φέρει στην επιφάνεια κάποια άλλη καλή θεμάτων που θα καλυφθούν. Έτσι, η πρώτη, όπως έχουμε περάσει για την τελευταίες δύο εβδομάδες για να σας υπενθυμίσω παιδιά, υπάρχει ένας τόνος των πόρων διαθέσιμα για αυτό το μάθημα. Πολλοί από αυτούς θα είναι εξαιρετικά χρήσιμες για να σας όπως μπορείτε να συνεχίσετε να μελέτη για το κουίζ 0, διότι Είναι το απόγευμα της Τρίτης. Έτσι, όλοι θα έχουν μελετώντας για λίγο. Υπάρχουν σημειώσεις από τις διαλέξεις και την πηγή κώδικα που θα πρέπει να σίγουρα να ελέγξετε έξω. Παρακολουθήστε τα σορτς. Αναχώρηση study.cs50.net. Και στη συνέχεια, παρατίθενται παρακάτω, ένας αριθμός άλλων πόρων. Και πάλι, κουίζ 0 αύριο σε μία. Αν δεν το έχετε κάνει ήδη, ελέγξτε έξω από το About Quiz 0 έγγραφο σχετικά με την αρχική σελίδα μαθήματος να καταλάβω όπου παίρνετε το κουίζ. Το κουίζ ξεκινά στις 1:10 και άκρα 70 λεπτά αργότερα. Έτσι, εάν εμφανιστεί μετά 1:10, είστε πρόκειται να πάρει ότι πολύ λιγότερα λεπτά από 70 έως λάβει τα κουίζ. Έτσι, βεβαιωθείτε ότι είστε εκεί στην ώρα τους. Αν είστε φοιτητής επέκταση ή έχουν κάποιες άλλες σκέψεις δοκιμές, μπορεί να μην είναι σε μία αύριο. Αλλά και πάλι, ελέγξτε το για Quiz 0 τεκμηρίωση για να βεβαιωθείτε ότι γνωρίζετε πότε παίρνετε το κουίζ. Έγραψα 75 λεπτά μέχρι εδώ. Νομίζω ότι είναι σωστό, όχι 70. Καλύπτει το σύνολο του υλικού από μια εβδομάδα 0 σε ομιλία της περασμένης εβδομάδας, την Τετάρτη. Και πάλι, για αυτό το κουίζ, ανά που έγγραφο, μπορείτε να πάρετε ένα διπλής όψης και 8 1/2 από 11 φύλλο χαρτιού που έχετε να χρησιμοποιήσετε ως σημειώσεις κατά τη διάρκεια του κουίζ. Πολλοί άνθρωποι, αν όχι οι περισσότεροι άνθρωποι, έχουν διαπίστωσε ότι το πιο χρήσιμο τρόπο να μελετήσει για το κουίζ είναι να κάνει ένα φύλλο μελέτη, ένα sider, από τη δική τους. Έτσι, μια ματιά στο παρελθόν, αν αυτά έχετε δει παρελθόντος. Απευθυνθείτε σε φίλους για να δούμε τι βάζουν τις δικές τους. Αλλά τα χέρια προς τα κάτω, ο καλύτερος τρόπος που μπορείτε μελέτης είναι να περάσει τα πάντα και περιοριστούν τα κάτω σε ό, τι πρέπει ή δεν ανήκουν σε αυτό το φύλλο χαρτί, γιατί αυτό είναι ακριβώς μια πραγματικά χρήσιμο τρόπο για να βεβαιωθείτε ότι θα πάμε μέσα από τα πάντα και έχουν κάποια εξοικείωση με αυτό. Οι περισσότεροι άνθρωποι, βρίσκουμε, ακόμα κι αν έχουν το φύλλο του χαρτιού που κάθεται δεξιά δίπλα τους στο κουίζ, δεν τη σειρά σε αυτό, γιατί, και πάλι, ότι πολύ διαδικασία να περάσει από τις πληροφορίες βοήθησε να το μάθουν. Μήπως κάποιος έχει απορίες για κουίζ 0; Έχει όλους - Είμαι δεν πρόκειται να κάνει μια επίδειξη των χεριών. Δεν πειράζει. Ήμουν έτοιμος να ρωτήσω ποιος άρχισε να μελετά. Αλλά δεν θέλω να σας κάνει όλα δεν σηκώστε τα χέρια σας. Έτσι, όπως είπα - Ναι, Avi, προχωρήστε. AVI: Ποια θα ήταν ένα χρήσιμο πράγμα να βάλει στο ένα μπίπερ; ΦΟΙΤΗΤΗΣ: Αυτό είναι στο χέρι σας. JASON Hirschhorn: Παίρνετε να χρησιμοποιήσετε την κρίση σας. Χρήσιμα πράγματα που πρέπει να βάλει στο ένα μπίπερ, αν βρίσκονται σε σύγχυση για το μεγάλο Ο εκτέλεσης των διαφόρων τύπων των αναζητήσεων και τα είδη, βάλτε το εκεί σε μια εύχρηστο δανδής διάγραμμα. Με αυτόν τον τρόπο, αν σας ζητηθεί ότι για το κουίζ, δεν χρειάζεται να προσπαθήσουμε και σχήμα έξω ή λόγο μέσω της εκτέλεσης. Μπορείτε απλά να αντιγράψετε τα κάτω. Αν κοιτάξετε κουίζ παρελθόν, πολλά φορές, υπάρχει τρέχει ερωτήσεις χρόνο. Έτσι ώστε θα ήταν ένα παράδειγμα μιας καλής πράγμα που πρέπει να θέσει σε σας ένα μπίπερ. Άλλα καλά πράγματα να θέσει σε, αν είστε σύγχυση για το πώς να κηρύξει λειτουργία ή ό, τι τα διάφορα μέρη του η δήλωση της συνάρτησης είναι, γράφουν ότι εκεί, μια γενική έκδοση και τότε ίσως ένα παράδειγμα. Αν είστε σε σύγχυση σχετικά με τους δείκτες, ένα διάγραμμα του τρόπου εργασίας είναι δείκτες ίσως πραγματικά χρήσιμη. Αν είστε σύγχυση σχετικά με αναδρομή, μια δείγμα αναδρομική συνάρτηση εκεί θα μπορούσε επίσης να αποδειχθεί πολύ χρήσιμη. Μήπως αυτό σας δώσει μερικές ιδέες; AVI: Πρέπει να καταλάβετε το Ολόκληρη η διαδικασία μεταγλώττισης, όπως πώς αυτό όλες οι εργασίες; JASON Hirschhorn: Όλα ότι έχει καλυφθεί μπορούσε εμφανιστούν στο κουίζ. Ερωτήσεις - αλλά και πάλι, κάποια πράγματα θα είναι σταθμισμένη σε μεγάλο βαθμό από τους άλλους. Κάποια πράγματα έχουν καταλήξει και πάλι και πάλι στην τάξη, διάλεξη, και το τμήμα. Άλλα πράγματα που δεν έχουν καταλήξει ότι συχνά. Έχουμε μιλήσει πολύ για # περιλαμβάνουν και -L κάτι και τι σημαίνουν σε εκείνες η διαδικασία κατάρτισης. Έχουμε μιλήσει πολύ για GDB, προσκολλώνται, αυτές οι διαφορετικές σημαίες που χρησιμοποιούμε όταν συγκεντρώνουμε κάτι, και τι make15, για παράδειγμα, πραγματικά μέσα και πραγματικά κάνει. Δεν έχουμε μιλήσει τόσο πολύ για κάθε βήμα η διαδικασία κατάρτισης. Έχουμε ακόμα μιλήσει γι 'αυτό. Έτσι, είναι ακόμα κάτι που θα πρέπει να είναι εξοικειωμένοι με. Αλλά και πάλι, εμείς δεν πρόκειται να είναι - πράγματα που έρχονται πιο συχνά στην τάξη είναι πιο πιθανό να καταλήξει περισσότερο συχνά και να είναι πιο έντονα σταθμισμένο με κουίζ. Cool. Οποιεσδήποτε άλλες ερωτήσεις σχετικά με το κουίζ 0; Εντάξει, έτσι έβαλα μια λίστα θέματα σχετικά με το διοικητικό συμβούλιο. Πήγα μέσα από τη διδακτέα ύλη. Πήγα μέσω του τμήματος αναθεώρηση από χθες το βράδυ και οι διαφάνειες να καταλήξει με ένα μη εξαντλητικό κατάλογο των θεμάτων ότι έχουμε καλύψει μέχρι στιγμής στο CS50 και τα πράγματα που θα μπορούσαν να εμφανίζονται στο κουίζ. Γι 'αυτό και δεν πρόκειται να περάσουν κάθε ένα από αυτά. Αυτό θα χρειαζόταν πολύ περισσότερος χρόνο από ό, τι έχουμε τώρα. Αλλά έβαλα αυτό εδώ για να ελπίζουμε jog μνήμη σας ως προς τα πράγματα που μπορούν να ή μπορεί να μην είναι τόσο εξοικειωμένοι με σας. Και θα ήθελα πολύ να περάσουν το μεγαλύτερο μέρος των τμήμα απαντήσω στις ερωτήσεις σας σχετικά με αυτά τα θέματα, τα θέματα που δεν καλύπτονται εδώ. Μπορούμε να γράψετε ψευδοκώδικα. Μπορούμε να γράψουμε πραγματικό κώδικα για να βεβαιωθείτε ότι έχετε - Μπορώ να απαντήσω στην ερώτησή σας και να βοηθήσει όλοι ουσιαστικά καταλάβουμε πολλά από αυτά τα θέματα, έτσι θα αισθανθείτε προετοιμασμένοι και άνετα να υπεισέλθω σε το αύριο κουίζ. Έτσι, διαβάστε πάνω από τη λίστα. Μπορείτε ελπίζουμε ότι έχουν έρθει στην ενότητα με ορισμένες ερωτήσεις, καθώς και. Όταν είστε έτοιμοι, σηκώστε το χέρι σας και εμείς θα ξεκινήσουμε. Λάβετε υπόψη σας, οι ερωτήσεις που έχετε, δεν υπάρχουν ηλίθιες ερωτήσεις. Έχουμε ακούσει ότι πολλά. Και οι ερωτήσεις που έχετε, είμαι πρόθυμος να στοιχηματίσετε, πολλοί άλλοι άνθρωποι, τόσο κάθονται εδώ και βλέποντας έχουν απευθείας σύνδεση, καθώς και. Έτσι, μπορείτε να βοηθήσετε μόνο άνθρωποι από τις ερωτήσεις. Μάρκους. ΜΑΡΚΟΣ: Μεταξύ της στοίβας και το σωρού, είναι ένα προ-διατεθεί εκεί το ποσοστό της μνήμης που έχει προσδιοριστεί ως αυτό είναι για τη στοίβα ή για την σωρού; Ή πώς γίνεται αυτό, ακριβώς; JASON Hirschhorn: Μεγάλη ερώτηση. Πάω να υποστηρίξει τον εντοπισμό λίγο. Μήπως όλοι - παρακαλούμε να είμαι ειλικρινής εδώ. Ξέρω ότι είμαι ζητώντας σας να αυξήσει σας το χέρι μπροστά από τους συμμαθητές σας. Αλλά οι άνθρωποι που αισθάνονται εκεί άβολα με τη στοίβα και σωρού και θα ήθελα να επαναλάβω ότι και τι σημαίνουν αυτά; Σηκώστε το χέρι σας αν - OK. Σας ευχαριστώ. Έτσι θα πάμε να πάει πέρα ​​από το σωρό και ο σωρός πραγματικά γρήγορα και στη συνέχεια προχωρήσουμε σε απάντηση στην ερώτησή σας. Έτσι, αν έχουμε συντάξει ένα κουτί για να εκπροσωπήσει μνήμη του υπολογιστή σας, ποια είναι μερικά πράγματα που πηγαίνουν σε αυτό το πλαίσιο; Κύριο. Μια κύρια λειτουργία. Πού κύρια πάτε; ΦΟΙΤΗΤΗΣ: [δεν ακούγεται]. JASON Hirschhorn: έτσι θα θέσει κύρια εδώ κάτω. Τι άλλο πηγαίνει σε αυτό το πλαίσιο; ΦΟΙΤΗΤΗΣ: Οι λειτουργίες που σας καλούν. JASON Hirschhorn: Οι λειτουργίες ότι λέμε. Και πού πάνε; ΦΟΙΤΗΤΗΣ: Στο στοίβα. JASON Hirschhorn: Μπορούν πάνε στη στοίβα. Έτσι θα πάμε για να καλέσετε αυτό το πράγμα εδώ κάτω στη στοίβα. Και επάνω στην κορυφή, έχουμε το σωρό. Έτσι, η μνήμη δεν είναι ένα κουτί σαν αυτό. Αλλά στην πραγματικότητα είναι αρκετά παρόμοια. Είναι πρόκειται να είναι μια πολλά κουτιά πάνω και άνω, ανάλογα με το πόσο μεγάλο σας υπολογιστής είναι ή πόσο μεγάλη είναι η μνήμη σας είναι. Στο απόσπασμα-unquote "κάτω" είναι η στοίβα. Και υπάρχουν πολλά πράγματα που πηγαίνουν στη στοίβα. Και αυτά εξαρτώνται από τις λειτουργίες έχετε στον κώδικά σας. Έχετε πάντα μια λειτουργία που σου κώδικα που ονομάζεται κύρια, έτσι υπάρχει πάντα ένα τμήμα εδώ κάτω στην στοίβα αφιερωμένο στο κύριο. Τα τμήματα αυτά στη στοίβα ονομάζονται πλαίσια στοίβα. Όταν καλείτε μια άλλη λειτουργία, αναφέρουν ότι ο βασικός καλεί μια δυαδική λειτουργία αναζήτησης, βάζουμε ένα άλλο πλαίσιο στη στοίβα. Πιο συγκεκριμένα, πρόκειται να δωρίσει ένα κομμάτι της μνήμης μας υπολογιστή για να αποθηκεύουν δυαδικά αναζήτησης τοπικής μεταβλητές και να τρέξει το δυαδικό Κωδικός αναζήτησης. Έτσι καλούμε δυαδική αναζήτηση. Σε αυτό το κομμάτι της μνήμης, θα πάμε για να αποθηκεύσετε τις τοπικές μεταβλητές. Εμείς πάμε για να αποθηκεύσετε printf κλήσεις του. Ό, τι συμβαίνει, αυτή η λειτουργία είναι πρόκειται να αποθηκευτεί εκεί. Δυαδική αναζήτηση πρόκειται να εκτελέσει. Είναι πρόκειται να ολοκληρώσει την εκτέλεση. Ποια είναι η λέξη που σημαίνει C ότι μια συνάρτηση πρέπει να την ολοκλήρωση της εκτέλεσης του; ΣΠΟΥΔΑΣΤΩΝ: Επιστροφή. JASON Hirschhorn: Επιστροφή. Έτσι, κάθε φορά που βλέπετε μια δήλωση επιστροφής, τα άκρα λειτουργία όταν χτυπά αυτό. Έτσι, δυαδική αναζήτηση θα χτυπήσει την επιστροφή του. Αυτό το μέρος της μνήμης ουσιαστικά θα να ελευθερωθεί. Και κύρια θα πάει πίσω στην εκτέλεση. Έτσι, κύρια θα σταματήσει όπου ήταν, κλήση δυαδική αναζήτηση, να πάρετε κάποια τιμή επιστροφής, και να συνεχίσει την εκτέλεση. Αυτό το πλαίσιο στοίβας θα πάει μακριά. Αν καλέσετε μια αναδρομική συνάρτηση, η οποία είναι μια συνάρτηση που καλεί τον εαυτό της πάνω και άνω, θα μπορούσε να πάρει - λέμε έκανε δυαδική αναζήτηση αναδρομικά. Εμείς μπορεί να πάρει δυαδική αναζήτηση μία εκδοχή, δυαδική αναζήτηση δύο, δυαδική αναζήτηση τρεις, τέσσερις δυαδική αναζήτηση, δυαδική αναζήτηση πέντε. Και τότε αυτή η τελική δυαδική αναζήτηση πέντε θα χτυπήσει τη βασική περίπτωση, και τη στοίβα πλαίσια θα πάει πίσω και να κρατήσει το κλείσιμο μέχρι να φτάσουμε πίσω στο κύριο. Μπορούμε να πάμε πέρα ​​αναδρομή σε λίγο. Αλλά όλα αυτά είναι για να πει, αν είστε καλώντας πολλαπλές λειτουργίες ταυτόχρονα, Θα υπάρξουν πολλαπλές στοίβα πλαισίων στη στοίβα. Ο σωρός, από την άλλη πλευρά, μέχρι εδώ, δεν είναι για τις λειτουργίες, όχι για τις τοπικές μεταβλητές. Είναι για κατανέμεται δυναμικά μεταβλητών. Έτσι, αυτά είναι μεταβλητές που μπορεί να είναι αρχικοποιηθεί είτε κύρια ή λειτουργούν ότι κύρια κλήσεις. Οπουδήποτε στον κώδικά σας, μπορεί να προετοιμαστεί. Και για να προετοιμαστεί μια δυναμικά κατανέμεται μεταβλητά. Ποιά ήταν η λειτουργία σε C χρησιμοποιούμε; ΣΠΟΥΔΑΣΤΩΝ: Malloc. JASON Hirschhorn: Malloc. Θα καλέσετε malloc. Μπορείτε να πάρετε ένα χώρο μνήμης. Και αυτός ο χώρος της μνήμης είναι στο σωρό. Και αυτός ο χώρος μνήμης μένει εκεί μέχρι να καλέστε δωρεάν. Έτσι, κατανέμεται δυναμικά μεταβλητές σωρός θα υπάρχει για όσο χρονικό διάστημα θέλουν να υπάρχουν, και δεν θα πάει μακριά έως ότου ρητά πείτε τους να πάνε μακριά. Μπορείτε να τα δημιουργήσετε σε μια λειτουργία. Στοίβα ότι η λειτουργία του πλαίσιο θα πάει μακριά. Αλλά αυτή η μεταβλητή θα εξακολουθούν να υπάρχουν στο σωρό μέχρι να απελευθερωθεί, ενδεχομένως με τη συνάρτηση που ονομάζεται δυαδική αναζήτηση ή οτιδήποτε άλλο. Έτσι, αυτές οι μεταβλητές σωρό μείνει εκεί για όσο χρονικό διάστημα θέλετε να μείνουν εκεί. Και παίρνουν θέσει εδώ. Και τότε η επόμενη παίρνει τεθεί εκεί. Θα συνεχίζω να συμπληρωθεί, και μείνετε εκεί μέχρι να καλέστε δωρεάν. Και, κατ 'ουσίαν, ο σωρός και η στοίβα, να πάρει στην ερώτηση Μάρκους, μεγαλώνουν προς το άλλο. Και αν τρέξει σε ένα άλλο, έχετε εξαντλήσει όλες τις δυνατότητες μνήμης σας υπολογιστή και το πρόγραμμα σας θα σταματήσουν γιατί δεν έχετε καμία περισσότερη μνήμη αφήνεται να χρησιμοποιήσει. Σε μεταξύ τους, υπάρχουν ενδεχομένως άλλα πράγματα. Αλλά για το πεδίο εφαρμογής αυτού του μαθήματος, θα Δεν χρειάζεται να ανησυχείτε για αυτό. Έτσι, αυτό ήταν η απάντηση στην ερώτησή σας. Μην ανησυχείτε για αυτό. Αλλά αυτό ήταν η μεγάλη απάντηση. Όλα όσα πρέπει να ξέρετε είναι η σωρού και η στοίβα θα - ένα ξεκινά στο κάτω μέρος. Η στοίβα κάνει. Ο σωρός είναι εκεί. Θα έρθουν πιο κοντά ο ένας στον άλλο. Και αν αγγίξει, αυτό είναι ένα πρόβλημα. Θα ξέμεινε από μνήμη. Αλλά επίσης, εκτός από την γνωρίζουν πού είναι, αυτό που είναι αποθηκευμένα τόσο στην στοίβα και να σωρού. Curtis. CURTIS: Όταν συγκρούονται, είναι ότι μια υπερχείλιση στοίβας; JASON Hirschhorn: Όταν συγκρούονται, αυτό δεν είναι μια υπερχείλιση στοίβας. Η υπερχείλιση της στοίβας είναι μια διαφορετική περιοχή ότι μπορούμε να πάμε πέρα, αν θέλετε να. Εντάξει, θα επανέλθω στο θέμα αυτό σε λίγο. ΦΟΙΤΗΤΗΣ: Ποια είναι η λέξη που ονομάζεται όταν χτυπούν ο ένας τον άλλο, η στοίβα και ο σωρός; JASON Hirschhorn: Προς το παρόν, μην ανησυχείτε. Απλά ξέρω - Θα απαντήσω αυτή την ερώτηση μετά το μάθημα. Αν τρέχουν σε κάθε άλλη, έτρεξε έξω της μνήμης, γιατί δεν υπάρχει πια χώρο εκεί. ΦΟΙΤΗΤΗΣ: Συγγνώμη, αυτό είναι ένα σφάλμα seg; JASON Hirschhorn: Ένα τμήμα σφάλμα μπορεί να κληθεί για - Εξαρτάται γιατί ονομάζεται η βλάβη του seg. Μερικές φορές, υπερχείλιση σας, θα λένε seg fault ως σφάλμα. ΦΟΙΤΗΤΗΣ: Τι γίνεται με dereferencing μια μηδενική μεταβλητή; Είναι αυτό ένα σφάλμα seg; JASON Hirschhorn: Έμμεση αναφορά ένα μηδενικό δείκτη - ΕΝΤΑΞΕΙ, έτσι εάν έχετε ένα δείκτη που τίθεται ίση με null, δείκτες, ανάκληση, διευθύνσεις μνήμης κατάστημα και τις τιμές τους. Και ένα μηδενικό δείκτη είναι ουσιαστικά αποθήκευση 0, το 0-ου την αντιμετώπιση της συγκεκριμένης μεταβλητής. Έτσι 0x, 0, 0, 0, 0, κ.λπ.. Αυτό 0-ου διεύθυνση μνήμης που δεν είναι στην εικόνα μας, αυτό είναι εκεί κάπου, ότι είναι αποκλειστικά για τον υπολογιστή. Εμείς δεν επιτρέπεται να το αγγίξει. Έτσι, όταν το πρόγραμμά σας είναι εκτέλεσης, εάν κάτι που προσπαθεί να πάει στη μνήμη διεύθυνση 0, γνωρίζει ότι ότι είναι μια κενή τιμή. Δεν ξέρει τίποτα δεν θα πρέπει να είναι εκεί. Έτσι, αν προσπαθήσετε να το χρησιμοποιήσετε κάτι εκεί και τη θεραπεία κάτι σαν να υπάρχει ή προσπαθεί να πάει σε αυτήν τη θέση, είστε πρόκειται να πάρει ένα σφάλμα seg ή σφάλμα. Μήπως αυτό απαντήσω στην ερώτησή σας; Και τώρα θα πάμε πίσω να τακτοποιήσουν υπερχείλιση. Τα πράγματα στη στοίβα, όπως εσείς έχετε ξαναδεί, σε - ας συντάξει μια στενή από ένα πλαίσιο στοίβας. Μπορεί ο καθένας να δει αυτό; Έτσι έχουμε στοίβα πλαίσιο μας. Σώζουμε σε μια σειρά ως ένα τοπικό μεταβλητή σε αυτή τη λειτουργία. Έτσι λένε σειρά μας έχει πέντε σημεία. Και τα πέντε από αυτά θα αποθηκεύονται σε αυτό το πλαίσιο στοίβας. Αν αρχίσετε να γράφετε πέρα ​​από το όρια αυτού του πίνακα - οπότε αν αρχίσετε να γράφετε σε, ας πούμε ότι είναι 0. Αυτοί είναι οι πέντε δείκτες του πίνακα μας. Αν αρχίσετε να γράφετε στο δείκτη 5, το οποίο δεν έχουμε όταν έχουμε ένα πίνακα μεγέθους 5, θα αρχίσετε να γράφετε σε Δείκτης 6, 7, 8, 9, μπορούμε να πάρουμε μια στοίβα Υπερχείλιση σφάλμα. Σε γενικές γραμμές δεν είναι - μάλλον θα μπει σε μπελάδες αν πας πάνω από ένα. Αλλά γενικά, θα μπει στο μεγαλύτερο πρόβλημα αν πάει πάνω από μια παρτίδα και να πάτε μέχρι στιγμής πάνω από αυτό που γράφετε πάνω από τη διεύθυνση επιστροφής που λειτουργία, η οποία βρίσκεται κατά τη κάτω μέρος του πλαισίου στοίβας. Διότι, έτσι δεν είναι; Μπορείτε - στο - συγνώμη. Όχι ", διότι το δικαίωμα." Στο πλαίσιο στοίβας, έχετε τοπικές μεταβλητές σας. Στο κάτω μέρος της στοίβας πλαίσιο είναι η διεύθυνση του αποστολέα. Αυτός είναι όπου η συνάρτηση πηγαίνει όταν είναι πάνω. Και αν αντικαταστήσετε ότι η επιστροφή διεύθυνση, τότε όταν αυτό το πλαίσιο στοίβας, όταν περνάτε μέσα από τη στοίβα το πλαίσιο και την εκτέλεση κάθε γραμμή, είστε πρόκειται να πάει στη νέα διεύθυνση επιστροφής σας ότι είναι γραμμένο εκεί, αντί της πραγματική. Και αυτό είναι το πώς έχουμε δει ορισμένες παραβιάσεις της ασφάλειας μπορεί να συμβεί με τους υπολογιστές. Έτσι υπερχείλιση, με λίγα λόγια, είναι όταν μπορείτε να αντικαταστήσετε το μέρος του stack είστε υποτίθεται για να χρησιμοποιήσετε, την τοπική μεταβλητή που υποτίθεται ότι πρέπει να χρησιμοποιήσετε, και ιδίως όταν ξεκινάτε την αντικατάσταση σημαντικά πράγματα, όπως η διεύθυνση επιστρέψει. Και αυτό είναι όπου θα πάρετε ένα λάθος. Ή ίσως ακόμη και θα μπορούσε να αρχίσει ακόμη και εγγράφως σε - λένε δυαδική αναζήτηση ήταν δεξιά πάνω από την κύρια. Αν διέγραφε πολύ, θα μπορούσε να γράψει σε κύρια. Αλλά γενικά, μπορείτε να πάρετε ένα λάθος πριν τότε, επειδή ο υπολογιστής γνωρίζει κάνεις κάτι που Δεν πρέπει να κάνουμε. Ναι. ΦΟΙΤΗΤΗΣ: Ποια είναι η διαφορά μεταξύ υπερχείλιση στοίβας και υπερχείλιση του buffer; JASON Hirschhorn: Υπερχείλιση είναι μια πιο γενική τύπο αυτό που μόλις περιέγραψα. ΦΟΙΤΗΤΗΣ: Έτσι, μια υπερχείλιση στοίβας είναι ένα παράδειγμα της υπερχείλισης buffer. JASON Hirschhorn: Ακριβώς. Αυτό είναι ένας πίνακας που μπορούμε να σκεφτούμε ως buffer, ένα χώρο για να πάνε τα πράγματα μέσα Αυτό είναι ένα buffer υπερχείλιση στοίβας. Θα μπορούσαμε να έχουμε ένα σωρό υπερχείλιση buffer. Αν υπήρχε ένα ρυθμιστικό διάλυμα, το οποίο συχνά υπάρχει είναι ένας πίνακας ο σωρός, και εμείς σβήσατε κάποιες από τις όρια, τότε θα πρέπει, έχουν ένα σωρό buffer υπερχείλιση. Και πέρα ​​από το πεδίο αυτού του μαθήματος, από όπου και αν εντοπιστεί λίγο διαφορετικά. Ο compiler έχει ιδιαίτερη τρόποι ανίχνευσης κάθε μία. Αλλά υπερχείλιση του buffer είναι μια πιο γενική τύπου από αυτά που περιγράφονται, η οποία ήταν ένα buffer υπερχείλιση στοίβας. Μήπως ότι απαντήσω στην ερώτησή σας; Sweet. Υπήρχαν άλλες ερωτήσεις σχετικές στη στοίβα ή σωρού; Ναι. ΦΟΙΤΗΤΗΣ: Ξέρω ότι έχετε την ελεύθερη χορδές επειδή είναι στο σωρό και δεν θέλετε να διαρρεύσει μνήμη. Αλλά δεν θα πρέπει να ελευθερώσετε καθολικές μεταβλητές και τέτοια πράγματα; Ή είναι αυτοί απελευθερώθηκαν αυτόματα; JASON Hirschhorn: Καλή ερώτηση. Έτσι, CS50.H, έχουμε δημιουργήσει αυτό το πράγμα για σας που ονομάζεται ένα string. Ένα string είναι πραγματικά αυτό; ΦΟΙΤΗΤΗΣ: Χαρ αστέρι. JASON Hirschhorn: Ένα αστέρι char, ένας δείκτης σε ένα χαρακτήρα, ένα δείκτη για να μια σειρά χαρακτήρων. Αυτό είναι ό, τι η σειρά είναι. Γι 'αυτό και πρέπει να το ελευθερώσει, γιατί GetString, την οποία χρησιμοποιήσαμε πολλά - συμβολοσειρά ονόματος ισούται GetString - ότι mallocs για μας κάποια μνήμη για την σωρό και στη συνέχεια επιστρέφει ένα δείκτη προς το πρώτος χαρακτήρας του εν λόγω εγχόρδων, ένα αστέρι char. Έτσι, δήθεν, αν δεν έχουν γραπτώς δωρεάν σε οποιοδήποτε από χορδές σας ότι έχετε ονομάζεται μέχρι σήμερα, έχετε έχουν κάποια διαρροή μνήμης. Φυσικά δεν έχουμε μιλήσει για αυτό, έτσι ώστε κανείς δεν πάρει το πρόβλημα για να γίνει αυτό. Αλλά να πάμε μπροστά, ναι. Όταν καλείτε GetString, είστε mallocing λίγο χώρο στο σωρό. Και αν δεν καλέσετε δωρεάν αργότερα ότι string, θα έχετε μια διαρροή μνήμης. Αυτό απαντήσω στην ερώτησή σας; Ναι ΦΟΙΤΗΤΗΣ: Έτσι για να το κάνουμε αυτό, χρησιμοποιούμε Το δικαίωμα ελεύθερης πριν από την επιστροφή; Όπως, εντός του πεδίου εφαρμογής του, υποθέτω, αν λέμε, όπως, int main, στο πλαίσιο της πεδίο εφαρμογής του κώδικα που είναι σε εκείνες αγκύλες, ακριβώς πριν - ξέρετε πού θα έπαιρνα συνήθως τίθεται επιστροφή. Μην βάζετε δωρεάν πριν από αυτό; JASON Hirschhorn: Έτσι μπορείτε να βάλετε δωρεάν όπου θέλετε να βάλετε δωρεάν. Επειδή αυτά διατίθενται δυναμικά μεταβλητές, επειδή μπορούν να ζουν πέρα ​​από το πεδίο εφαρμογής του συγκεκριμένου λειτουργία, εάν καλέσετε malloc σε ένα ξεχωριστή λειτουργία, για παράδειγμα, GetString, μπορείτε να καλέσετε δωρεάν στο κεντρικό. Δεν χρειάζεται να το ονομάσουμε στη συγκεκριμένη λειτουργία malloc όπου λέγεται. Αλλά χρειάζεται να το ονομάσουμε πριν από τα κύρια αποδόσεις. Και αυτό εξαρτάται πραγματικά. Εξαρτάται από το γιατί malloced ότι χώρο στην πρώτη θέση. Μερικοί άνθρωποι θα καλέσει ελευθερώσει αρκετά γρήγορα. Μερικοί άνθρωποι δεν θα καλέσετε δωρεάν μέχρι το τέλος του προγράμματος τους. Και θα περάσουν και όλα δωρεάν. Εξαρτάται από το γιατί ονομάζεται malloc. ΦΟΙΤΗΤΗΣ: Και τι θα λέγατε αν σας κάλεσε χρήση GetString; Θα έλεγα ότι χωρίς αυτό; JASON Hirschhorn: Έτσι, η σύνταξη για δωρεάν είναι απλά ελεύθερη, ανοικτή paren, κοντά paren, και το όνομα του δείκτη. Έτσι, αν έχετε γράψει το όνομα συμβολοσειράς ισούται GetString, βάζετε το όνομα εδώ. Αυτό είναι το όνομα του δείκτη. Και ξέρει να ελευθερώσει εκείνη την μνήμη. ΦΟΙΤΗΤΗΣ: Έτσι, όταν ελευθερώνει ότι η μνήμη, ο δείκτης εξακολουθεί να παραπέμπει σε αυτό το μέρος στη μνήμη; Ή είναι ο δείκτης επίσης αδειάσει από η διεύθυνση που δείχνει. JASON Hirschhorn: Θα πρέπει να προσπαθήσουμε αυτό. Θα πρέπει να προγραμματίσετε εκείνο. Ας επανέλθουμε όταν έχουμε την ευκαιρία να κωδικοποίησης, και ας προγραμματίσετε εκείνο. Και αν θέλετε να υπολογίσετε την απάντηση με αυτό, μπορείτε επίσης να κώδικα που εν τω μεταξύ. Αλλά αυτό είναι ένα μεγάλο ερώτημα. ΦΟΙΤΗΤΗΣ: Είναι δυνατόν να ελεύθερο κάτι πάρα πολύ σύντομα; Έτσι χρειάζεστε ακόμα για το πρόγραμμά σας, και θα απελευθερωθεί αυτό το χώρο μνήμης; JASON Hirschhorn: Ναι. Είναι δυνατό, αν έχετε κάτι ελεύθερο και στη συνέχεια να το χρησιμοποιήσετε ξανά, θα σας τρέχει σε ένα σφάλμα. Αλλά αυτό είναι για σας, γιατί απελευθέρωσε κάτι και στη συνέχεια κάλεσε αργότερα. Έτσι, αυτό ήταν το λάθος ενός προγραμματιστή. Αλλά ναι. Θα μπορούσατε να γράψετε αυτό. Οποιεσδήποτε ερωτήσεις σχετικά με - Ναι. ΦΟΙΤΗΤΗΣ: Έτσι, εάν είστε υποτίθεται για να απλά ελευθερώσετε το σε γενικές γραμμές πριν από την λήξη του προγράμματος, αυτό σημαίνει ότι αν η λήξη του προγράμματος και να μην το ελεύθερο, ότι η μνήμη είναι ακόμα διατεθεί; JASON Hirschhorn: Εάν το πρόγραμμά σας τελειώνει και ξεχάσετε να απελευθερώσει κάτι, τότε ότι η μνήμη διατέθηκε σε όλη την η διάρκεια ζωής του προγράμματός σας. Όταν ένα πρόγραμμα κλείνει εντελώς, ότι η μνήμη δεν πρόκειται να μείνει εκεί για πάντα. Ο υπολογιστής είναι αρκετά έξυπνος για να ξέρω ότι όταν το πρόγραμμα κλείνει, αυτό πρέπει να απαλλαγούμε από όλες της μνήμης που συνδέθηκε με αυτό το πρόγραμμα. Ωστόσο, υπάρχουν εργαλεία που μπορείτε να εκτελέσετε σε ένα πρόγραμμα για να ανιχνεύσει αν, όταν η το πρόγραμμα τελείωσε, έχετε ξεχάσει να ελευθερώσετε λίγη μνήμη. Και για το επόμενο πρόβλημα που σας όπου θα χρησιμοποιείτε malloc και χρησιμοποιώντας δείκτες, θα τρέχετε αυτό προγραμματίσετε το πρόγραμμά σας για να δείτε εάν, όταν ο κύριος επιστρέφει, είχατε κάποια πράγματα που έμειναν unfreed. Έτσι, δεν πρόκειται να μείνει malloced πάντα στον υπολογιστή σας. Αυτό θα ήταν σπατάλη, διότι πολύ γρήγορα, υπολογιστές θα ξεμείνει από μνήμη. Αλλά αν διαρκέσει μέχρι το τέλος του σας προγραμματίσετε και δεν είστε απελευθερωθεί και σας πρόγραμμα βγαίνει, αυτό είναι ακόμα ένα πρόβλημα ότι το εργαλείο αυτό θα σας βοηθήσει να αντιμετωπίσει. ΦΟΙΤΗΤΗΣ: Είναι αυτό Valgrind; JASON Hirschhorn: Είναι ονομάζεται Valgrind. Και θα είναι - ΦΟΙΤΗΤΗΣ: Αλλά εμείς δεν πρέπει να γνωρίζουμε ότι για το κουίζ, όμως; Θέλω να πω, ήταν κάτι που συζητιόταν λίγο στη διάλεξη. JASON Hirschhorn: Έτσι Valgrind είναι το όνομα του εν λόγω εργαλείου. Γνωρίζοντας αυτό που κάνει είναι αρκετό για το κουίζ. Αλλά δεν έχουν ακόμη χρησιμοποιηθεί σε σας πρόβλημα που, επειδή δεν είχαμε ένα πρόβλημα σύνολο που έχει ασχοληθεί ρητά με malloc ή χρησιμοποιείτε malloc. Έτσι, δεν έχετε χρησιμοποιήσει Valgrind ακόμα. Αλλά θα το χρησιμοποιήσει νωρίτερα παρά αργότερα. ΦΟΙΤΗΤΗΣ: Μπορείτε να επαναλάβετε τι Valgrind είναι; JASON Hirschhorn: Συγγνώμη; ΦΟΙΤΗΤΗΣ: Μπορείτε να το επαναλάβετε αυτό ο σκοπός του Valgring είναι; JASON Hirschhorn: Valgrind είναι το όνομα - όπως GDB σας βοηθά να debug το πρόγραμμά σας, Valgrind σας βοηθά να καταλάβουμε αν τα πράγματα δεν έχουν ελευθερωθεί όταν το πρόγραμμα σας κλείνει. Έτσι θα το τρέξει το πρόγραμμά σας. Και το πρόγραμμά σας βγαίνει, και θα πω το πρόγραμμά σας ονομάζεται malloc αυτό πολλές φορές για αυτό πολλές bytes, και μόνο που ονομάζονται ελεύθερες αυτό πολλές φορές. Και έτσι θα αφήσει αυτά τα πολλά bytes χωρίς την απελευθέρωσή τους. Ή θα πούμε ότι έχετε απελευθερωθεί πάντα. Καλή δουλειά. ΣΠΟΥΔΑΣΤΩΝ: OK. Και αυτό λέγεται Valgring; JASON Hirschhorn: V-Α-Ε-G-R-Ι-Ν-ϋ. ΦΟΙΤΗΤΗΣ: Μια ερώτηση σχετικά με τους δείκτες. Έτσι λένε έχετε ν αστέρων x ισούται με κάτι. Αυτό ισοδυναμεί, ό, τι βάζετε εκεί, είναι ότι αυτό που είναι να τεθούν στο εσωτερικό Τι είναι το Χ επισημαίνοντας, ή ο δείκτης του x; JASON Hirschhorn: Μπορείς επαναλάβω την ερώτηση; Μπορούμε να αντλήσει, ενώ μπορείτε να το πω; ΦΟΙΤΗΤΗΣ: Στο κουίζ, στην πραγματικότητα, η αυτό που μας έστειλε, ήταν σαν, char αλήθεια αστέρι ισοδυναμεί βράχια CS50, σωστά; Έτσι, αυτό σημαίνει ότι η εν λόγω πετρώματα CS50 είναι ποια είναι η αλήθεια δείχνει να; JASON Hirschhorn: Δηλαδή μιλάς σχετικά με ένα αστέρι char σε μια σειρά, πώς που λειτουργεί; Ναι. OK. Ας συντάξει αυτό εδώ. [SIDE CONVERSATION] JASON Hirschhorn: Έτσι, αυτή η μεταβλητή πρόκειται να είναι του τύπου αστέρι char. Πόσο μεγάλη είναι μια μεταβλητή τύπου char αστέρι; Πόσα bytes; ΜΑΘΗΤΕΣ: Four. JASON Hirschhorn: Είναι τεσσάρων bytes. Πόσα δικαιώματα είναι μια μεταβλητή τύπου int αστέρι; ΜΑΘΗΤΕΣ: Four. JASON Hirschhorn: Τέσσερα bytes. Αν είναι ένας δείκτης, τότε είναι πάντα τέσσερα bytes, επειδή δείκτες, τους αξία είναι μια διεύθυνση μνήμης. Και διευθύνσεις μνήμης για το CS50 συσκευής είναι τέσσερα bytes. Έτσι, όταν λέμε GetString, ή όταν ας πούμε, stringname ισούται με, και στη συνέχεια, διπλά εισαγωγικά θέσει μια σειρά, θέτουμε - καλά, αυτό είναι λίγο διαφορετικό. Θα κάνει GetString ως παράδειγμα. Ή κάτι char αστέρων ισούται με το string. Συγνώμη, να μου δώσει το παράδειγμα ότι έχετε διαβάσει; ΦΟΙΤΗΤΗΣ: char αλήθεια αστέρι ισούται «Οι βράχοι CS50" σε διπλά εισαγωγικά. JASON Hirschhorn: Έτσι, αυτό το αστέρι, αυτό θα καλέσει αυτήν τη μεταβλητή x για μας γενικής σκοπούς. Έχουμε δημιουργήσει μια μεταβλητή που ονομάζεται x. Είναι τύπου αστέρι char. Είναι ένας δείκτης σε μια σειρά των χαρακτήρων. Έτσι, εδώ κάτω - Έτσι, αυτό είναι το πώς αυτό θα εργάζονται στη μνήμη. Αυτό θα αποθηκεύσει μια διεύθυνση μνήμης. Θα αποθηκεύσετε τη διεύθυνση μνήμης του ο πρώτος χαρακτήρας στη συστοιχία. Και στη συνέχεια, όταν έχετε ακολουθήσει ο δείκτης, θα κάνατε να πάρει τον πρώτο χαρακτήρα. Και αν είστε ανάγνωση αυτό το πράγμα, όπως μια σειρά, ο υπολογιστής σας είναι έξυπνη αρκετά για να γνωρίζουμε, να διαβάσετε όλο αυτό το πράγμα μέχρι να φτάσει σε μια σπασμωδική κίνηση 0. Αλλά αν είστε ανάγνωση ενός χαρακτήρα σε ένα χρόνο, ώστε να είστε επανάληψη μέσα αυτή η σειρά, τότε θα διαβάσει μόνο ένα χαρακτήρα κάθε φορά μέχρι να φτάσετε στο backslash 0. Αυτό δεν μπορεί να απαντήσει σας ερώτημα, όμως. ΦΟΙΤΗΤΗΣ: Ναι, αλλά δεν έχετε malloced ότι ο χώρος ακόμη για αυτό το δείκτη. JASON Hirschhorn: Γι 'αυτό δεν είμαι σίγουρος ακριβώς αυτό που ψάχνετε σε, επειδή δεν είχα κάνει αυτό το κουίζ. Αυτό υποτίθεται ότι είναι ένα χρήσιμο πόρων από άλλο TF. Εάν δημιουργείτε μια σειρά σχετικά με την στοίβα ή ως μια τοπική μεταβλητή, αυτό θα απλά να είναι σειρά των τελών και όχι γενικά ένα αστέρι char επισημαίνοντας μια άλλη σειρά. Αλλά δεν ξέρω. Αυτό θα μπορούσε να είναι ένας δείκτης σε ένα άλλο σειρά στη στοίβα, καθώς και. Ναι. ΦΟΙΤΗΤΗΣ: Ξέρω ότι θα πρέπει να εκχώρηση μνήμης, αν ο δείκτης είναι να πάρει δηλώνονται μέσα από μια άλλη λειτουργία. Μήπως θα πρέπει να κάνουν το ίδιο πράγμα, αν είναι που δηλώνονται μέσα από τις κύριες, αν το χρησιμοποιείτε στο εσωτερικό των κύριων; JASON Hirschhorn: Ναι λοιπόν. Μπορείτε να δηλώσετε ένα δείκτη σε οποιαδήποτε διεύθυνση μνήμης στη μνήμη. Μπορεί να είναι η διεύθυνση της μνήμης ενός τοπικού μεταβλητή, αν και πολλές φορές, οι άνθρωποι δεν δηλώνουν διευθύνσεις μνήμης με τις τοπικές μεταβλητές επειδή πηγαίνουν μακριά από τη στιγμή που η συνάρτηση επιστρέφει, η οποία Γι 'αυτό malloc γενικά πράγματα. Αλλά ναι, θα μπορούσε να κηρύξει ένα δείκτη σε μια άλλη τοπική μεταβλητή. Είναι απλά γενικά δεν γίνεται. Αλλά μπορώ να ρίξετε μια ματιά σε αυτό συγκεκριμένο πράγμα μετά το μάθημα. Ναι. ΦΟΙΤΗΤΗΣ: Νομίζω ότι αυτό είναι το είδος από ό, τι του έχει ζητηθεί. Φαίνεται παράξενο να αρχικοποίηση ένας δείκτης όχι ως διεύθυνση, αλλά ως αυτό Φαίνεται σαν μια αξία. Φαίνεται σαν ο CS50 είναι ό, τι είναι μέσα το πράγμα που επεσήμανε και δεν είναι η πραγματική διεύθυνση, έτσι δεν είναι; JASON Hirschhorn: Έτσι ώστε να είναι Δεν συμβαίνει, όμως. Αυτό δεν είναι ό, τι συμβαίνει. Όταν δηλώνετε ένα αστέρι char, είναι μια διεύθυνση μνήμης. Οι δείκτες είναι όλες οι διευθύνσεις μνήμης που δείχνουν προς κάτι άλλο. Αυτό το κάτι άλλο θα μπορούσε να είναι η στοίβα, αλλά σχεδόν πάντα είναι σχετικά με την σωρού με τον τρόπο που θα δούμε να χρησιμοποιηθεί. Αλλά stringname ισούται με διπλά εισαγωγικά "GetString," μπορούμε να δούμε ότι και εμείς μπορεί να κοιτάξει μέσα από αυτό και να προγραμματίσετε εκείνο. GetString χορδών δεν αποθηκεύονται στο ότι η μεταβλητή, ή ό, τι το string όνομα δεν αποθηκεύονται στο ότι μεταβλητή, όχι επειδή αυτό είναι το πώς δείκτες λειτουργούν. Μήπως αυτό έχει νόημα; ΦΟΙΤΗΤΗΣ: Ναι. JASON Hirschhorn: OK. Ας ελπίσουμε, ότι δεν ήταν συγχέοντας για κανέναν. Αλλά αν ήταν, μπορούμε να εξετάσουμε ξανά σε ένα κομμάτι, γιατί είμαστε στην πραγματικότητα θα να κωδικοποιήσει κάτι που ελπίζουμε ότι θα συνεργαστεί με χορδές και να σας βοηθήσουν να αισθανθείτε πιο άνετα μαζί τους. Τυχόν άλλα ζητήματα που σχετίζονται με αυτές θέματα ή άλλα θέματα που Θα βάλω back up; Και - τώρα. Ναι, Alden. ALDEN: Έτσι, αυτό είναι εντελώς άσχετες, αλλά μπορούμε να πήγαινε πάνω πολύ γρήγορα τι πρέπει να ξέρετε σχετικά με τη διαφορά μεταξύ του 32 και Μηχανή 64-bit; JASON Hirschhorn: Ναι. Έτσι, 32 bits είναι πόσα bytes; ALDEN: Είναι τεσσάρων bytes. JASON Hirschhorn: Είναι τεσσάρων bytes. Και 64 bits είναι πόσα bytes; ΣΠΟΥΔΑΣΤΩΝ: Οκτώ. JASON Hirschhorn: Οκτώ bytes. Έτσι και πάλι, οκτώ bit είναι ένα byte. Συσκευή CS50 σας είναι μια μηχανή 32-bit. Έτσι, οι διευθύνσεις μνήμης είναι τεσσάρων bytes. Υπάρχουν 2 στο 32 διευθύνσεις μνήμης. 0 έως 2 στο 32 μείον 1. Και δεν είμαι θετικός, αλλά αυτό είναι ίσως η έκταση που θα πρέπει να γνωρίζουν για μία μηχανή 32-bit, ότι η μνήμη διευθύνσεις είναι, και πάλι, πολύ τέσσερα bytes, και αυτό είναι το μέγιστο ποσό διευθύνσεων μνήμης. Επίσης, οι τύποι δεδομένων - αυτό θα μπορούσε να είναι κάτι τόσο και αυτό είναι που αξίζει να σημειωθεί. Το μέγεθος ενός τύπου δεδομένων εξαρτάται το μηχάνημα που εργάζεστε με. Έτσι, μια χαρα, ένα ενιαίο χαρακτήρα, είναι το πώς πολλά bytes στην συσκευή CS50 μας; Ένα byte. Και είναι πραγματικά ένα byte, όπως καλά σε μια μηχανή 64-bit. Και οι περισσότεροι τύποι δεδομένων είναι ο ίδιος αριθμός των bytes και στα δύο μηχανήματα. Αλλά μερικά είδη δεδομένων θα είναι διαφορετικό και στα δύο μηχανήματα. Έτσι, αυτό θα ήταν ενδεχομένως η μόνο πράγμα που πρέπει να ξέρετε. Αλλά ακόμα και αυτό, νομίζω, είναι πέρα ​​από τα όρια - Είμαι σχεδόν σίγουρος, αν κοιτάξετε πίσω στο παλιό κουίζ, λέει, να αναλάβει για κωδικοποίηση των προβλημάτων που χρησιμοποιείτε μια μηχανή 32-bit. Αλλά υπάρχουν, για να πάει μαζί με αυτό το περίπτωση που σας ενδιαφέρει, υπάρχουν τύπους δεδομένων που είναι τα ίδια μέγεθος σε όλα τα μηχανήματα. Αν έχετε δει κάτι σαν uint32_t, μπορεί να είναι ή μπορεί να Δεν έχω δει αυτό. Αυτό είναι ένα είδος δεδομένων. Αυτό που λέει, είναι 32 bit δεν έχει σημασία τι το μηχάνημα αυτό είναι. Έτσι, όταν οι άνθρωποι γράφουν φορητές κώδικα, πιθανότατα δεν θα χρησιμοποιήσει ints. Θα χρησιμοποιήσετε αντί για αυτά τα άλλα δεδομένα τύποι που ξέρουν ότι θα είναι το ίδιο μέγεθος για κάθε μηχάνημα. Madhu. MADHU: Είχα μια ερώτηση σχετικά με η διαδικασία κατάρτισης. Έτσι, εάν είστε σύνταξη ενός προγράμματος που χρησιμοποιεί μια βιβλιοθήκη όπως CS50 ή κάτι όπως αυτό, ξέρω ότι η βιβλιοθήκη έχει να, σε κάποιο σημείο, είναι συγκεντρώνονται και συνδέονται μέσα Αλλά πόσο από αυτό συμβαίνει κατά τη διάρκεια η κατάρτιση του προγράμματός σας; Ποιο μέρος αυτής της διαδικασίας βιβλιοθήκης εμφανίζεται όταν είστε καταρτίζει το δικό σας πρόγραμμα; JASON Hirschhorn: Οπότε ας πάμε πάνω γενικά τα στάδια αυτής της διαδικασίας. Μπορείτε να γράψετε σας. C αρχείο. Σε σας. C αρχείο, # include σας βιβλιοθήκες κεφαλίδα, για παράδειγμα, cs50.h. Τι σημαίνει ότι η απότομη περιλαμβάνουν γραμμή να κάνω για να το πρόγραμμά σας; Akchar. AKCHAR: Προσθέτει τα πρωτότυπα των οι λειτουργίες από την επικεφαλίδα αρχείων στις βιβλιοθήκες. JASON Hirschhorn: Ακριβώς. Προσθέτει αυτά τα πρωτότυπα συναρτήσεων με τον κωδικό σας. Έτσι, όταν ο κώδικας σας είναι να καταρτίζονται τα πρώτα στάδια, ο compiler γνωρίζει ότι υπάρχουν πραγματικά αυτές οι λειτουργίες, και ότι κάπου έχουν καθοριστεί. Τα αρχεία. H δεν περιλαμβάνουν το ορισμούς για αυτές τις λειτουργίες ή τον τρόπο εργάζονται πραγματικά. Cs50.h περιλαμβάνει απλά κάτι που λέει GetString είναι ένα πραγματικό πράγμα που μπορεί να συμβεί. Και standardio.h λέει printf είναι ένα πραγματικό πράγμα που μπορεί να συμβεί. Έτσι γ σας γλώσσα με αυτό. Header το αρχείο παίρνει μετατραπεί σε κάποια αναγνώσιμα από μηχάνημα κώδικα, η οποία τελικά παίρνει μετατραπεί σε δυαδικό κώδικα, 0 και 1 του. Και αυτός είναι ο κώδικας που, τελικά, εκτελείται. Η γραμμή l-CS50 - για παράδειγμα, όταν είστε γραπτώς Clang - και τότε θα περιλαμβάνουν l-CS50, πληκτρολογείτε ότι μέσα Και θα δείτε ότι. Όταν γράφετε κάνετε, θα είστε δείτε αυτή τη γραμμή εδώ. Και θα δούμε ότι σε ένα δεύτερο, όταν κωδικοποιούμε ή αργότερα όταν θα κώδικα. Αλλά αυτό-γραμμή l CS50 κάνει κάτι λίγο διαφορετική από ό, τι τα # include cs50.h. Τι σημαίνει αυτό-line l CS50 κάνω; AVI; AVI: Θέλω να πω ότι συνδέει η βιβλιοθήκη στη λειτουργία καλέσει, όπως και τα o αρχεία.. JASON Hirschhorn: Έτσι είναι πολύ κοντά, αν όχι spot-on. Η l-CS50 παίρνει το δυαδικό αρχείο και συγχωνεύεται με δυαδικό αρχείο σας. Έτσι cs50.h, δεν υπάρχει κανένα σημείο στη στροφή cs50.h από τη γλώσσα C σε δυαδικό κάθε φορά που είναι να χρησιμοποιηθεί. Αυτό θα ήταν ανόητο, γιατί αυτό θα χάνουμε πολύ χρόνο. Γι 'αυτό έχει ήδη καταρτιστεί και να μετατραπεί σε ένα εκτελέσιμο. Και τώρα πρόκειται να συγχωνευθεί με το αρχείο σας στο τέλος. Έτσι, οι εν λόγω είναι 1 και 0 θα να συγχωνευθεί με αυτούς σας και 0 στο τέλος. Έτσι τώρα θα έχετε στην πραγματικότητα η πραγματική 1 και 0 που καθορίζουν τον τρόπο GetString, για παράδειγμα, τα έργα, ή πώς printf, για παράδειγμα, λειτουργεί. Και για περισσότερες πληροφορίες, υπάρχει μια σύντομο compilers που δίνει Nate ότι θα πρέπει να ελέγξετε ότι πηγαίνει μέσω αυτών των βημάτων. Αλλά - Ναι. ΦΟΙΤΗΤΗΣ: Είναι πάντα o αρχεία. όταν είναι με τη μορφή της βιβλιοθήκης, έτοιμο να συγχωνευθούν, συνδέονται - όπως θα είστε σε δυαδικό κώδικα; JASON Hirschhorn: OK. Τι - ΦΟΙΤΗΤΗΣ: Είναι πάντα η περίπτωση για οι βιβλιοθήκες όταν τους συνδέουν; JASON Hirschhorn: Ναι. Έτσι, υπάρχει. S αρχεία, τα οποία θα είναι κώδικα μηχανής, η οποία θα είναι επίσης αινιγματικά για εσάς. Δεν χρειάζεται να ανησυχείτε γι 'αυτούς. Αλλά γενικά, ναι, αυτοί θα να. o αρχεία είναι έτοιμα να ξεκινήσουν. ΦΟΙΤΗΤΗΣ: Έτσι, όταν στέλνετε στο βιβλιοθήκη, εσείς μόνο πλοίο η. h και το. o; Δεν στέλνουμε την. C ή το. S. JASON Hirschhorn: Έτσι - και αυτό είναι σε αυτό το σύντομο, καθώς, αν η πληροφορία αυτή φαίνεται να έρχεται ένα λίγο γρήγορα. Όμως, η μικρή σε compilers συνομιλίες για το θέμα αυτό, καθώς και. Όταν σας στείλουμε μια βιβλιοθήκη, εάν αποστέλλετε η. h, το αρχείο κεφαλίδας, εκείνες πρωτότυπα συναρτήσεων, και το 1 και 0, αυτό είναι το μόνο που χρειάζεται να δώσει. Δεν χρειάζεται να δώσουν το πώς η λειτουργία του εργοστασίου, το γ αρχείο.. Επειδή το σημείο της αφαίρεσης, ή η σημείο APIs, το σημείο σε αυτό το SPL, το Stanford φορητή βιβλιοθήκη, είναι για να μην ανησυχείτε για το πώς οι νέες GRect λειτουργεί, ή πώς κινούνται τα έργα, ή πώς να προσθέσετε έργων. Όλα όσα πρέπει να ξέρετε είναι ότι το πρόσθετο είναι μια λειτουργία που μπορείτε να χρήση, και το κάνει αυτό. Έτσι, μπορείτε πραγματικά δεν χρειάζεται να γνωρίζουν πώς είναι γραμμένο σε C. Απλά πρέπει να Ξέρετε, εδώ είναι οι λειτουργίες, τι κάνει, και εδώ είναι οι του 1 και 0 όταν πραγματικά θέλετε να τα χρησιμοποιήσετε. Cool. Οποιεσδήποτε ερωτήσεις σχετικά με compilers ή άλλα θέματα στο διοικητικό συμβούλιο; ΦΟΙΤΗΤΗΣ: Έχω μια ερώτηση του την εφαρμογή αναδρομικές συναρτήσεις. Μια ερώτηση σχετικά με αναδρομή. Είχα την αίσθηση ότι θα καταλήξουμε. Οπότε ας πάμε γρήγορα μέσα αναδρομή με ένα συγκεκριμένο παράδειγμα, ένα παραγοντικό λειτουργία. Επειδή αυτό είναι ένα παράδειγμα ότι έρχεται συχνά επάνω ή χρησιμοποιείται για να τονίσει αναδρομή. Έτσι, το "4" διαβάζεται ως 4 παραγοντικό. Και τι σημαίνει 4 παραγοντικό σημαίνει; Τι σημαίνει ότι κάνει; Πώς μπορείτε να υπολογίσετε 4 παραγοντικό; 4 φορές 3 φορές 2 φορές 1. Έτσι, ένας άλλος τρόπος για να γράψει 4 παραγοντικό είναι να γράψω αυτό. 4 φορές 3 παραγοντικό. Επειδή 3 παραγοντικό είναι 3 φορές 2 φορές 1. Έτσι 4 φορές 3 παραγοντικό είναι 4 φορές 3 φορές 2 φορές 1. Αυτός είναι ο λόγος παραγοντικό είναι μια μεγάλη υποψήφιος για την αναδρομή, γιατί είναι σαφές ότι υπάρχει κάτι που συμβαίνει ξανά και ξανά και ξανά για μια μικρότερο αριθμό πράγματα μέχρι φτάσετε στο τέλος. Όταν φθάσει το 1, 1 παραγοντικό είναι 1. Δεν μπορεί να πάει πολύ πιο πέρα. 0 παραγοντικό είναι επίσης ορίζεται ως 1. Έτσι, όταν φτάσετε σε 1 ή 0, είστε στο τέλος, και μπορείτε να αρχίσει να πηγαίνει πίσω επάνω. Έτσι, αν θέλαμε να γράψω ένα αναδρομικό συνάρτηση για να υπολογίσει ένα παραγοντικό, θα πάμε να γράψει μερικά ψευδοκώδικα για το τώρα. Πριν γράψω αυτό το ψευδοκώδικα - Θα σας δώσω εσείς μερικά λεπτά να γράψει τον κώδικα ψευδο ή απλά σκεφτείτε γι 'αυτό - υπάρχουν δύο πράγματα που κάθε αναδρομική συνάρτηση χρειάζεται. Ποια είναι αυτά τα δύο πράγματα; JACK: Πρέπει να αυτοαποκαλείται. JASON Hirschhorn: Νώε; Ω, Τζακ. Προχωρήστε. JACK: Πρέπει να αυτοαποκαλείται. JASON Hirschhorn: Έτσι, μια αναδρομική λειτουργία χρειάζεται μια αναδρομική κλήση, ένα κλήση στον εαυτό του. Αυτό είναι ένα. Και τι είναι το άλλο; JACK: Μια βασική περίπτωση. JASON Hirschhorn: Μια βασική περίπτωση. Μια βασική περίπτωση είναι, εδώ είναι όταν θα σταματήσουμε. Έτσι, η λειτουργία σας παίρνει ονομάζεται. Η βασική περίπτωση έρχεται πρώτη. Θέλετε να ξέρετε εάν είστε στο τέλος. Και αν δεν είστε στο τέλος, θα κάνουν αναδρομική κλήση σας. Και θα περάσουν από αυτή τη λειτουργία και πάλι, ελέγξτε και πάλι την περίπτωση βάσης σας. Εάν δεν είστε το τέλος, να κάνετε μια άλλη αναδρομική κλήση, κ.λπ., κ.λπ.. Γι 'αυτό πάντα αναδρομικές συναρτήσεις χρειάζονται αυτές τις περιπτώσεις βάσης και εκείνων αναδρομικές κλήσεις. Εάν δεν έχετε μια αναδρομική κλήση, το δεν θα ήταν μια αναδρομική συνάρτηση. Εάν δεν έχετε μια βασική περίπτωση, θα πάει για πάντα και θα υπήρχε κατάληξη. Και το βασικό σενάριο έρχεται πάντα πρώτη, γιατί πάντα θα θέλετε να ελέγξετε αν είστε στο τέλος πρώτα. Έτσι, πριν κάνουμε κάποια ψευδοκώδικα, γιατί Δεν παίρνετε ένα λεπτό για να σκεφτούμε πώς μια αναδρομική συνάρτηση παραγοντικό θα γράψει; Επίσης, όσες κάνετε, το γράψιμο έξω σε ένα φύλλο χαρτιού είναι τι πρόκειται να πρέπει να κάνουμε στο κουίζ αύριο. Έτσι, μάλλον καλή πρακτική να κάνει βεβαιωθείτε ότι ο κώδικας που γράφουμε κάτω σε φύλλο χαρτιού - ή μπορείτε να το κάνετε αυτό. Ξέρεις πού είναι τα ερωτηματικά. Θυμάστε τη σύνταξη. Επειδή δεν είστε σε θέση να έχουν μια compiler πείτε έχετε κάνει λάθος. Επίσης, κατά μήκος αυτών των γραμμών, αύριο, όταν έχετε προβλήματα κωδικοποίησης, αν Οι έσπευσαν για το χρόνο, ή αν είστε πολύ σύγχυση ως προς το πώς είστε υποτίθεται για να γράψει το συγκεκριμένο πράγμα στο γ, το θα behoove να γράψετε ψευδοκώδικα ή να γράψουν ένα σχόλιο σε επίσης. Επειδή υπάρχει μερική πίστωση για ένα Πολλά από τα ερωτήματα σχετικά με το κουίζ. Έτσι, ίσως να έσπευσε, ή θα μπορούσε απλώς να συγχέονται. Γράφοντας σε σχόλια ή ψευδο-κώδικα είναι συχνά τρόπους που μπορείτε μπορούν να πάρουν μερική πίστωση. Γι 'αυτό μην αφήνετε κάτι κενό στο κουίζ. Δεν υπάρχει καμία ποινική ρήτρα για να βάλουμε τα πράγματα μέσα Στην πραγματικότητα, θέτοντας σε ψευδο-κώδικα ή Δείτε τα σχόλια του πρόκειται να βοηθήσει το γκρέιντερ καταλάβω αν πραγματικά ξέρετε τι μιλάς, και ίσως το βραβείο σας κάποια μερική πίστωση γι 'αυτό. Επίσης, κατά μήκος αυτών των γραμμών, γράφει ξεκάθαρα. Αν δεν μπορούμε πραγματικά τι γράφετε, εμείς δεν πρόκειται να σας καλέσει στο αύριο τα μεσάνυχτα με το σχήμα από ό, τι έγραψε. Εμείς απλά θα απογειωθεί σημεία. Γράψτε με σαφήνεια ώστε να μπορούμε να ακούσουμε, ή μάλλον, μπορούμε να διαβάσουμε τι έγραψε. Και αν λέει δύο προτάσεις, δεν γράφουν μια παράγραφο. Ακολουθήστε τις οδηγίες. Γράψτε καθαρά. Και να γράφουν τις παρατηρήσεις αυτές ή ψευδοκώδικα για τις ερωτήσεις που θα μπορούσαν να βραβείο μερική πίστωση. Εντάξει, ας πάμε να παραγοντικού. Έτσι έχουμε ένα παραγοντικό λειτουργία. Αν ήθελα να γράψω πραγματικά αυτό σε C, τι πρέπει να κάνω για να θέσει πριν από το όνομα της συνάρτησης; Ο τύπος επιστροφής, η οποία, σε αυτό το περίπτωση, θα δώσει int. Και τότε μέσα στα άγκιστρα, είναι τι συμβαίνει στο εσωτερικό των αγκυλών μια συνάρτηση; ΜΑΘΗΤΕΣ: Επιχείρημα τύπου. JASON Hirschhorn: Τα επιχειρήματά του. Έτσι, μάλλον θα παραγοντικό να λάβει ένα επιχείρημα. Αυτό κατά πάσα πιθανότητα θα πάρει μόνο ένα επιχείρημα. Και εμείς θα πούμε ότι θα λάβει ακέραιος αριθμός που ονομάζεται x. Και πάλι, κατά τη σύνταξη του πρωτοτύπου της μια λειτουργία ή γράφοντας τη λειτουργία στον κώδικά σας πριν από τον καθορισμό αυτό, γράψετε τον τύπο δεδομένων και το όνομα του ότι η μεταβλητή μόνο για την εν λόγω λειτουργία. Έτσι, μπορείτε να περάσετε κάποιο αριθμό σε αυτό λειτουργία, θα πρέπει να αναφέρονται ως x εσωτερικά. Έχουμε παραγοντικό λειτουργία μας. Χρειαζόμαστε δύο πράγματα, ένα base case και μια αναδρομική κλήση. Ποια είναι η βασική περίπτωση για παραγοντικό; Κάποιος που το έγραψε και ποιος δεν έχει μιλήσει ακόμη, ποια είναι η βάση περίπτωση παραγοντικό; ΦΟΙΤΗΤΗΣ: Αν το n είναι μικρότερο από 2, επιστροφή 1. JASON Hirschhorn: Αν ο n είναι λιγότερο από 2, επιστρέφει 1. Μ 'αρέσει αυτό, γιατί αυτό φροντίζει 0 και 1. Έτσι θα κάνουμε x <2, επιστροφή 1. Αν πάρετε περάσει 0, αν έχουμε πέρασε 1, η λειτουργία αυτή θα επιστρέψει αμέσως 1. Αν πάρετε περάσει κάποια αριθμός μεγαλύτερος ή ίση με 2, θα πάμε να έχουν αναδρομική κλήση μας. Και ναι, πώς είναι ότι πρόκειται να λειτουργήσει; Μπορεί κάποιος άλλος που εργάστηκαν για αυτό το που δεν έχει μιλήσει ακόμα να μου δώσει το αναδρομική κλήση για αυτή τη λειτουργία σε ψευδοκώδικα; Αν πάρετε περάσει σε έναν αριθμό x και είναι μεγαλύτερος από 2, τι θέλουμε να κάνουμε; Έχουμε επίσης ένα παράδειγμα γραμμένο σχετικά με την πλευρά που μπορεί να σας δώσει μια υπόδειξη. ΦΟΙΤΗΤΗΣ: Καλέστε x φορές το παραγοντικό x μείον 1; JASON Hirschhorn: Ακριβώς δεξιά. Εμείς πάμε για να επιστρέψει x φορές το παραγοντικό του x μείον 1. Και αυτό, παρόλο που έγραψα επάνω, Βασικά, αυτό που είπατε στα αγγλικά, αυτή η συνάρτηση παραγοντικό θα πάρει κάλεσε και πάλι. Θα εκτελέσει για x μείον 1. Θα επιστρέψει με κάποιον ακέραιο, και τότε θα πολλαπλασιάσει αυτά τα δύο μαζί, και αυτή η τιμή θα είναι επέστρεψε σε ό, τι ονομάζεται αυτό παραγοντικό λειτουργία, η οποία θα μπορούσε είναι ένα άλλο παράδειγμα της αυτή η συνάρτηση παραγοντικό. Έτσι ώστε είναι ένα παράδειγμα ενός αναδρομικού τη λειτουργία, ένα πολύ απλή αναδρομική συνάρτηση. Αλλά οι περισσότεροι από αυτούς θα είναι σαν αυτό. Αν θα θέλατε μια καλή αναδρομική πρόκληση για το κουίζ, δοκιμάστε κωδικοποίησης δυαδική αναζήτηση αναδρομικά. Γιατί αν δυαδική αναζήτηση πρόβλημα που τρεις, ίσως το έκανε επαναληπτικά σε ένα βρόχο while. Αλλά μπορεί επίσης να γραφτεί αναδρομικά. Θα πάμε να πρέπει να γράψετε τη δική σας ξεχωριστή λειτουργία που λαμβάνει κάποια διαφορετικά επιχειρήματα της γραμμής εντολών - ή Δεν τα επιχειρήματα της γραμμής εντολών, ορισμένοι διαφορετικές ακριβώς τακτική επιχειρήματα. Αλλά θα μπορούσατε να γράψετε δυαδική αναζήτηση αναδρομικά, καθώς και. ΦΟΙΤΗΤΗΣ: Έτσι, θα μπορούσε να έχει γράψει, αντί x μείον 1, θα θα μπορούσε επίσης να γραφτεί x μείον μείον, ή θα μπορούσατε να έχετε γραπτή μείον μείον x. Μπορείς να εξηγήσει πραγματικά γρήγορα γιατί αυτά θα ήταν διαφορετικά τα πράγματα, όπως ποια είναι η διαφορά μεταξύ x μείον μείον και μείον μείον x; JASON Hirschhorn: Όχι, δεν είμαι πρόκειται να υπεισέλθω σε αυτό. Αλλά εγώ θα σας μιλήσω γι 'αυτό μετά τάξη. x μείον μείον, μείον μείον x μειώσετε x κατά 1. Αλλά το κάνουν λίγο διαφορετικά. Αλλά δεν θέλω να υπεισέλθω σε αυτό. Άλλα ερωτήματα σχετικά με αναδρομή ή αυτή η λειτουργία; Αυτό δεν είναι πραγματικά ακόμη και ψευδοκώδικα. Αυτό είναι βασικά ο κώδικας στο C θα γράψω γι 'αυτό. OK, οποιαδήποτε άλλα ζητήματα για θέματα εδώ; Ναι. ΦΟΙΤΗΤΗΣ: Έχω μια γρήγορη μείωση των κινητής υποδιαστολής και ακρίβεια. JASON Hirschhorn: Κυμαινόμενο σημείο και ακρίβεια. Μπορεί κάποιος πολύ γρήγορα να μου δώσει μια περίληψη των κινητής υποδιαστολής και ακρίβεια; Θα έπρεπε όλοι να κάνουμε αυτό για σας πρόβλημα που, έτσι είστε όλοι εξοικειωμένοι με αυτό. Ή ίσως όχι όλοι σας. Όποιος; Δώσε μου ένα σημείο που ξεκίνησε. Κινητής υποδιαστολής και ακρίβεια. Ποιο είναι το πρόβλημα; Ναι. Victoria; VANESSA: Vanessa. JASON Hirschhorn: Vanessa. Λυπάμαι. VANESSA: Υπάρχει μόνο ένας πεπερασμένος αριθμός των αριθμών που μπορούν να αναπαρασταθούν επειδή είστε σε ένα, σε μας περίπτωση, ένα σύστημα 32-bit. Έτσι κατά κάποιο τρόπο πρέπει να αποτελούν μερικούς αριθμούς. JASON Hirschhorn: Έτσι ώστε να είναι ακριβώς δεξιά. Υπάρχουν μόνο ένα ορισμένο ποσό αριθμών που μπορούν να αναπαρασταθούν. Αν πολλαπλασιάσουμε δύο πολύ μεγάλους αριθμούς, μπορεί να υπερχειλίσει το ποσό των χώρων θα πρέπει να εκπροσωπεί ένας ακέραιος. Γι 'αυτό μερικές φορές χρησιμοποιούμε μια πολύ καιρό αντί int. Αυτό έχει περισσότερους χώρους. Αυτό μπορεί να κρατήσει έναν μεγαλύτερο αριθμό. Κινητής υποδιαστολής ακρίβειας έχει να κάνει με ότι, αλλά επίσης έχει να κάνει με τη γεγονός ότι οι δεκαδικοί αριθμοί είναι δεν εκπροσωπείται πάντοτε. Λυπάμαι. Επιτρέψτε μου να θέσω αυτό το back up. Ο δεκαδικός αριθμός 1.0, δεν είναι πάντα αντιπροσωπεύονται όπως θα περιμένατε, 1.000000000. Είναι μερικές φορές εκπροσωπήθηκαν ως 1,000000001 0,999999999 ή. Θα μπορούσε να είναι ακόμη και 89 ρίχνονται κάπου εκεί. Έτσι, αυτοί οι δεκαδικοί αριθμοί δεν είναι αντιπροσώπευε ακριβώς όπως θα κάνατε αναμένουμε από αυτούς να εκπροσωπούνται. Έτσι, το πρόβλημα που - ήταν δύο; - πρόβλημα που δύο, όπου ασχοληθήκαμε με αριθμοί κινητής υποδιαστολής, όταν θέλαμε να εκπροσωπεί ακριβώς αυτό που θέλαμε εκπροσωπούν τους, ο αριθμός πένες, ή ο αριθμός των λεπτών, θα τις πολλαπλασιάζει με 100. Τους στρογγυλεμένες. Και τότε θα κόψει τα πάντα πίσω από την υποδιαστολή. Αυτό ήταν για να εξασφαλιστεί ότι θα πραγματικά ίση ακριβώς αυτό που θέλαμε να είναι ίσα. Διότι όταν παίρνετε κάτι που είναι α επιπλέουν και να το μετατρέψει σε έναν int, θα κόψει τα πάντα προς τα δεξιά από την υποδιαστολή. Επειδή υπάρχει κάποια κινητής υποδιαστολής ανακρίβεια, 100.000 μπορεί να είναι εκπροσωπήθηκαν ως 99.999999999. Και αν απλά διακόπτει τα πάντα για να το δικαίωμα το δικαίωμα μακριά, θα πάμε να να πάρει το λάθος αριθμό. Ναι. ΦΟΙΤΗΤΗΣ: Είχα μια ερώτηση για τη ρίψη. Τι προκειμένου συμβαίνει και σε? Αν θέλετε να κάνετε float, παρένθεση, 1 χωρίζεται από 10, δεν το κάνουν 1 διαιρείται με 10, στη συνέχεια να πάρει 0.1, στη συνέχεια, ενεργοποιήστε το σε ένα πλωτήρα; JASON Hirschhorn: Αν το κάνετε επιπλέουν 1 διαιρείται με 10 - ΦΟΙΤΗΤΗΣ: Ναι, και τότε ισούται - καλά, θα έπρεπε κανονικά έχουν το ίσο με - Ναι. Θέλετε να κάνετε μια float, σωστά; JASON Hirschhorn: Εντάξει, έτσι θα πάμε να χρησιμοποιήσουμε για να segue σε αναφέρονται οι απαντήσεις σε αυτά τα ερωτήματα μέσω της κωδικοποίησης. Επειδή θα έχετε πιθανώς πολλές αυτά τα ερωτήματα λεπτό, και ένας καλός τρόπος για την επίλυσή τους είναι μέσω κωδικοποίησης. Έτσι θα πάμε για να κωδικοποιήσει αυτή τη στιγμή, και στη συνέχεια θα πάμε για να πάει πίσω και να κωδικοποιεί την ερώτηση που είχε. Έτσι, η πρώτη γραμμή - Δεν έπρεπε να γράψει - τι είναι το πρώτο πράγμα που θέλουμε να κάνουμε όταν ανοίξει ένα νέο αρχείο στο gedit; ΣΠΟΥΔΑΣΤΩΝ: Να συμπεριληφθούν. JASON Hirschhorn: Συμπεριλάβετε τι; ΦΟΙΤΗΤΗΣ: βιβλιοθήκη CS50. JASON Hirschhorn: OK. Τι άλλο θα πρέπει να περιλαμβάνει; Εμείς απλά θα ελέγξει τι συμβαίνει όταν ρίχνει κάτι σε έναν πλωτήρα. Αλλά τι πρέπει να περιλαμβάνει αν είμαστε πρόκειται να γράψει ένα πρόγραμμα σε C; ΦΟΙΤΗΤΗΣ: Standard I / O. JASON Hirschhorn: stdio.h. Εμείς πραγματικά δεν χρειάζεται, γι 'αυτό προγράμματος, cs50.h, ακόμα κι αν είναι πάντα χρήσιμο να το συμπεριλάβουμε. Αλλά χρειάζεται πάντα stdio.h. ΦΟΙΤΗΤΗΣ: Κατά την κωδικοποίηση σε C; JASON Hirschhorn: Κατά την κωδικοποίηση σε C. Γι 'αυτό και να το αποθηκεύσετε ως αυτού. Γ. το αρχείο. Θα πάρετε κάποια ωραία επισήμανση σύνταξης. Έγραψα κενό μέσα στον κεντρικό. Τι σημαίνει κενό σημαίνει; ΦΟΙΤΗΤΗΣ: Δεν παίρνει καμία τα επιχειρήματα της γραμμής εντολών. JASON Hirschhorn: Void μέσα, σε αυτό το περίπτωση, το κύριο δεν λαμβάνει καμία τα επιχειρήματα της γραμμής εντολών. Σε άλλες περιπτώσεις, αυτό σημαίνει ότι η λειτουργία δεν λαμβάνει τα επιχειρήματα της γραμμής εντολών. Ή η λειτουργία, εάν επρόκειτο να γράψει κενό main (void), που θα αναφέρουν ότι ο βασικός του δεν επιστρέφουν τίποτα. Έτσι, οι void ακριβώς σημαίνει τίποτα. Τι θα γράψω αν μου ήταν να λαμβάνουν τα επιχειρήματα της γραμμής εντολών; ΦΟΙΤΗΤΗΣ: int c τόξο χορδή τόξου κατά JASON Hirschhorn: int argc argv εγχόρδων. Είναι σωστό αυτό; ΦΟΙΤΗΤΗΣ: Είναι char παρένθεση argv αστέρι. JASON Hirschhorn: Έτσι θα μπορούσα να γράψω παρένθεση εγχόρδων argv ή argv char αστέρων παρένθεση, αλλά θα πρέπει να έχετε τις αγκύλες. Επειδή argv είναι ένας πίνακας χορδές, θυμάται. Δεν είναι μόνο μία χορδή. Έτσι εγχόρδων argv είναι, είναι εδώ μια σειρά που ονομάζεται argv. Παρένθεση String argv είναι, είναι εδώ μια σειρά από χορδές. Έτσι, int argc argv παρένθεση κορδόνι θα ήταν κάτι που θα θα μπορούσε πιθανότατα να γράψω. Έτσι ήθελε να σώσει έναν ακέραιο; ΦΟΙΤΗΤΗΣ: Ναι, ακέραιος. Ή σε μια float. JASON Hirschhorn: Σε ένα πλωτήρα; Όπως, float x ισούται με 1 διαιρείται με το 10. JASON Hirschhorn: OK. Πώς μπορώ να εκτυπώσω ένα πλωτήρα στην printf; Τι; ΦΟΙΤΗΤΗΣ:% f. JASON Hirschhorn:% f. Τι είναι ένας ακέραιος; d ή i. Τι είναι ένα string; ΣΠΟΥΔΑΣΤΩΝ: s. JASON Hirschhorn: s. Πώς μπορώ να αποκτήσω μια νέα γραμμή; ΦΟΙΤΗΤΗΣ: κάθετος n. JASON Hirschhorn: Τι μπορώ να επιστρέψει αν η κύρια τρέχει σωστά; ΣΠΟΥΔΑΣΤΩΝ: 0. Μήπως πρέπει να γράψω αυτή τη γραμμή, όμως; ΦΟΙΤΗΤΗΣ: Όχι. Εντάξει, δεν θα το γράψω, τότε. Μπορεί ο καθένας να διαβάσει αυτό; Μοιάζει λίγο μικρό. Μπορεί ο καθένας να δει, ή θα πρέπει να Θα το κάνει μεγαλύτερο; Νομίζω ότι για την κάμερα, θα κάνουμε είναι λίγο μεγαλύτερο, όμως. JASON Hirschhorn: Αν θέλετε να το κάνετε . C αρχείο σε ένα εκτελέσιμο, τι μπορώ να γράψω; ΦΟΙΤΗΤΗΣ: Κάνετε δοκιμή. JASON Hirschhorn: Συγγνώμη; ΦΟΙΤΗΤΗΣ: Κάνετε δοκιμή. JASON Hirschhorn: Κάντε τεστ. Μιλούσαμε για αυτή η γραμμή νωρίτερα. Κλαγγή. Τι είναι κλαγγή; Το όνομα του compiler. Τι είναι αυτή η γραμμή; ΦΟΙΤΗΤΗΣ: Ορίζει ότι για τη χρήση του GDB. JASON Hirschhorn: Σετ αυτό, για τη χρήση του GDB. Αυτή η γραμμή, τι είναι αυτό; ΦΟΙΤΗΤΗΣ: Ο πηγαίος κώδικας. JASON Hirschhorn: Αυτή είναι η αρχείο προέλευσης, το γ αρχείο.. Τι σημαίνουν αυτές οι δύο γραμμές να κάνω; Ή αυτά τα δύο δεν γραμμές. ΦΟΙΤΗΤΗΣ: Είναι τα ονόματα να το δοκιμάσετε. JASON Hirschhorn: Έτσι, το ταμπλό o λέει, ονομάστε τον κάτι διαφορετικό. Και εδώ είστε καλώντας το τεστ. Αν δεν είχα ότι, τι θα το όνομα αυτό; ΣΠΟΥΔΑΣΤΩΝ: a.out. JASON Hirschhorn: a.out. Τι κάνει αυτό το κάνει; ΦΟΙΤΗΤΗΣ: Σύνδεσμοι βιβλιοθήκη μαθηματικών. JASON Hirschhorn: Συνδέει στη βιβλιοθήκη μαθηματικά. Δεν περιλαμβάνει τη βιβλιοθήκη μαθηματικά, αλλά δεδομένου ότι αυτό είναι τόσο συχνές, που έχουν γραπτή κάνουν να συμπεριλαμβάνεται πάντα η βιβλιοθήκη μαθηματικά. Και επίσης, αυτό περιλαμβάνει η βιβλιοθήκη CS50. Εντάξει, οπότε αν έχουμε λίστα, έχουμε τώρα ένα εκτελέσιμο που ονομάζεται δοκιμασία. Για να το εκτελέσετε, γράφω δοκιμή. Βλέπω ότι κινητής υποδιαστολής μου, όπως αναμενόταν, ισούται με μηδέν. Μήπως αυτό - έτσι - ΦΟΙΤΗΤΗΣ: Στη συνέχεια, αν βάλετε επιπλέουν τώρα, σαν να ρίχνει ως float - JASON Hirschhorn: Πρωταγωνιστές το 1 με ένα φλοτέρ; ΦΟΙΤΗΤΗΣ: Όχι, ρίχνει όλο το πράγμα - ναι. Αν απλά έκανα αυτό, θα που το καθιστούν 0.1; JASON Hirschhorn: Εντάξει, έτσι πολύ γρήγορα, 1 διαιρούμενο με 10, αυτά είναι ακεραίων διαιρείται. Έτσι, όταν χωρίζουν ακέραιοι, είναι 0, και σώζετε ότι 0 σε ένα επιπλέουν, επειδή ο κάθετος είναι μόνο ακέραιος διαίρεσης. Έτσι τώρα είμαστε στροφή κάτι σε ένα πλωτήρα. Ας δούμε τι θα συμβεί. Θα κάνουμε τεστ. Έτσι τώρα θα δούμε ότι αυτό δεν ήταν κάθετος διαίρεσης, που επέπλεε σημείο διαχωρισμού. Επειδή ένα από τα επιχειρήματα της ερρίφθη σε ένα πλωτήρα. Έτσι, τώρα είναι έλεγε, την αντιμετώπιση αυτού διαίρεση, όπως έχουμε να κάνουμε με πλωτά σημεία, όχι με ακέραιους. Και έτσι παίρνουμε την απάντηση περιμένουμε. Ας δούμε τι θα συμβεί - ουπς. Αν ήθελα να εκτυπώσετε περισσότερα δεκαδικά κηλίδες, πώς θα μπορούσα να κάνω αυτό; ΦΟΙΤΗΤΗΣ: Point dot f, ή όπως πολλοί δεκαδικά ψηφία, όπως θέλετε. JASON Hirschhorn: Οπότε μπορώ να εκτυπώσω 10 δεκαδικά σημεία. Και βλέπουμε τώρα παίρνουμε κάποια περίεργα πράγματα. Και αυτό πηγαίνει πίσω στην ερώτησή σας για κινητής υποδιαστολής ανακρίβεια. Υπάρχουν περίεργα πράγματα είναι αποθηκευμένα εδώ. Εντάξει, μήπως αυτό απαντήσω στην ερώτησή σας; Τι άλλο ήθελες να κώδικα γρήγορα; ΦΟΙΤΗΤΗΣ: Ήθελα απλώς να δείτε αν όχι, αν ελευθερωθεί κάποιο δείκτη, αν η εν λόγω δείκτης είχε ακόμη αποθηκευμένα σε είναι η διεύθυνση του ό, τι είχε δείχνουν προς προηγουμένως. JASON Hirschhorn: OK, οπότε ας το κάνουμε αυτό. Char ptr αστέρι, αυτό δημιουργεί μια μεταβλητή ονομάζεται ptr τύπου αστέρι char. Πώς μπορώ να γράψω malloc; Alden; ALDEN: Just malloc. Αλλά τότε θα πρέπει να είναι το μέγεθος της, και σε αυτή την περίπτωση, υποθέτω ότι θα έπαιρνα πρέπει να δείχνουν προς char. Έτσι θα ήθελα να είναι char. JASON Hirschhorn: Εντάξει, έτσι ώστε περισσότερα γενικά, Inside - ας επεξεργαστείτε. Μέσα malloc, θέλετε τον αριθμό των bytes στο σωρό. Σε γενικές γραμμές, αυτό που έχουμε δει ότι είμαστε κάνουμε είναι να πάμε να malloc χορδές, για παράδειγμα, ή συστοιχίες των ακεραίων. Έτσι, αν θέλουμε 10 ακέραιοι αριθμοί, ή 10 χαρακτήρες, 10 θα μας δώσει 10. Και τότε το μέγεθος των χαρακτήρων που θα δώσει μας ότι το μέγεθος των χαρακτήρων, η οποία σε αυτή την περίπτωση είναι 1 byte. Παίρνουμε 10 bytes. Εάν επρόκειτο να γράψετε το μέγεθος του int, που θα μας δώσει 40 bytes. Έτσι, πιο γενικά, μέσα από malloc είναι ο αριθμός των bytes που θέλετε. Σε αυτή την περίπτωση, παίρνουμε 1 byte. Ποια φαίνεται σαν μια περίεργη χρήση της malloc, αλλά και για μας σκοπούς νόημα. Έτσι υπάρχει αυτό. Εμείς πάμε για να καλέσετε δωρεάν. Έχουμε να απαλλαγούμε από αυτό και χρησιμοποιούμε πάλι ptr. Και τι θέλετε να ελέγξετε; ΦΟΙΤΗΤΗΣ: Ήθελα απλώς να ελέγξει κατά πόσον ή δεν υπήρχε τίποτα στο εσωτερικό του. JASON Hirschhorn: Έτσι, αν επισήμανε σε τίποτα; ΦΟΙΤΗΤΗΣ: Ναι, ακριβώς, αν είχε ακόμη μια διεύθυνση μνήμης. JASON Hirschhorn: Έτσι θέλετε για να ελέγξετε την αξία του ptr; ΦΟΙΤΗΤΗΣ: Ναι, ακριβώς. JASON Hirschhorn: Τι μπορώ να γράψω εδώ αν θέλετε να ελέγξετε την αξία του σημείο - τι είναι, Ιορδανία είπε, η αξία; Ή αυτό που είναι αποθηκευμένα στο εσωτερικό του ptr; ΣΠΟΥΔΑΣΤΩΝ: Η διεύθυνση της μνήμης. JASON Hirschhorn: Η διεύθυνση της μνήμης. Έτσι, αν γράφω μόνο αυτό, θα δώσε μου την αξία της ptr. Και πώς μπορώ να εκτυπώσετε μια διεύθυνση μνήμης; Ποια είναι η συμβολοσειρά μορφοποίησης για μια διεύθυνση μνήμης; ΦΟΙΤΗΤΗΣ: p%. JASON Hirschhorn: p%. % S είναι ένα string. P% για το δείκτη. Είναι σωστό αυτό; Αυτό είναι σωστό. Έτσι ptr ισούται με - εξακολουθεί να έχει κάτι σε αυτό. Αυτό είναι πιθανώς μια πιο ενδιαφέρουσα ερώτηση. Τι σημαίνει ότι η γραμμή κάνει; ΦΟΙΤΗΤΗΣ: σφάλματα Δευτερόλεπτο. JASON Hirschhorn: Τι; ΦΟΙΤΗΤΗΣ: Νομίζω ότι SEG σφάλματα. JASON Hirschhorn: Χμ; ΦΟΙΤΗΤΗΣ: Νομίζω ότι θα SEG σφάλμα. JASON Hirschhorn: Έτσι, αυτή η γραμμή της ptr κώδικα, αστέρι, τι δεν το αστέρι σημαίνει; ΦΟΙΤΗΤΗΣ: Περιεχόμενο. JASON Hirschhorn: Ναι. Πηγαίνετε να πάρει το περιεχόμενο του. Έτσι, αυτό πρόκειται να πάει στη μνήμη αντιμετωπίσουν εκεί και να μου δώσει αυτό. Συνήθιζα% γ εδώ γιατί εκεί Οι χαρακτήρες που είναι αποθηκευμένα εκεί. Έτσι θα πάμε για να πάει στο ότι εμείς διεύθυνση Μόλις είδα - ή κατά πάσα πιθανότητα θα είναι μια λίγο διαφορετικά αυτή φορά που θα τρέξει το πρόγραμμα. Αλλά θα πάμε σε αυτή τη διεύθυνση η οποία γνωρίζουμε ότι εξακολουθεί να υπάρχει και να δούμε τι υπάρχει εκεί. Γι 'αυτό δεν SEG σφάλμα. Απλά δεν μας δίνουν τίποτα. Θα μπορούσε να δώσει πραγματικά μας κάτι, απλά δεν μπορούμε να το δούμε. Και αυτό πηγαίνει πίσω στην ιδέα - και εμείς δεν πρόκειται να πάρει πάρα πολύ σε αυτό, γιατί αυτό είναι πέρα ​​από το σκοπός του μαθήματος. Αλλά μιλήσαμε για το δικαίωμα εδώ, αν υπερέβη τα όρια του πίνακα με 1, ίσως να μην πάρει στο πρόβλημα. Μερικές φορές, όταν απλά να πάει μακριά με 1, κάνεις κάτι λάθος, και θα θα μπορούσε να πάρει στο πρόβλημα. Αλλά δεν χρειάζεται πάντα να πάρει στο πρόβλημα. Εξαρτάται από το πόσο κακό πράγμα που το κάνετε, θα πάμε για να πάρει στο πρόβλημα. Ποια είναι για να μην πω, είναι ατημέλητη με τον κωδικό σας. Αλλά πρέπει να πω, το πρόγραμμα δεν θα πάντα σταματήσουν το κάπνισμα, ακόμα και αν πάτε κάπου δεν είστε υποτίθεται για να πάει. Ένα καλό παράδειγμα αυτού είναι, πολλά άνθρωποι στην πρόβλημά τους set 3, η οποία ήταν 15, δεν ελέγχει την όρια του διοικητικού συμβουλίου. Έτσι κοίταξε αριστερά, κοίταξε προς το δεξιά, κοίταξε προς την κορυφή, κοίταξε προς τα κάτω. Αλλά δεν ελέγξτε για να δείτε εάν η κορυφή ήταν πραγματικά πρόκειται να είναι στο διοικητικό συμβούλιο. Και πολλοί άνθρωποι που το έκαναν αυτό και αποδείχθηκε ότι, το πρόγραμμά τους εργάστηκαν τέλεια, γιατί όταν το πλοίο ήταν αποθηκευμένα στη μνήμη, αν πήγε ένα πάνω από αυτό ή να ελέγχεται ότι η μνήμη διεύθυνση, δεν υπήρχε τίποτα ιδιαίτερα φρικτό γι 'αυτό, ώστε το πρόγραμμά σας δεν ήταν πρόκειται να φωνάζω σε σας. Αλλά θα εξακολουθούν να απογειωθεί σημεία, αν δεν έχετε ελέγξει ότι, επειδή έκαναν κάτι που δεν ήταν έπρεπε να κάνω, και θα μπορούσε να έχει πάρει στο πρόβλημα. Οι πιθανότητες είναι, όμως, τότε μάλλον δεν το έκανε. Έτσι, αυτό είναι να δείξει ότι, ναι, μπορούμε ακόμα να πάμε σε αυτό. Και δεν είμαστε πάρει το πρόβλημα σε αυτή την περίπτωση. Αν προσπαθούσαμε να κάνουμε διαβάστε το επόμενα 100 χαρακτήρες, θα έπαιρνα πιθανόν να έρθετε σε μπελάδες. Και τότε μπορείτε να προγραμματίσετε την ανάγνωση της επόμενης 100 χαρακτήρες, αν θέλετε, να κάνει κάποια είδος για το βρόχο. Ναι. ΦΟΙΤΗΤΗΣ: Από τότε που αποδίδεται ότι χώρο μια πραγματική αξία, δεν θα είναι πράγματι σε θέση να δείτε τίποτα. Θα πρέπει να το δοκιμάσετε με ρύθμιση που ίση με c αρέσει ή κάτι άλλο; JASON Hirschhorn: Μεγάλη ερώτηση. Πώς μπορώ να ορίσω την τιμή αυτή - ποια γραμμή κώδικα μπορώ να γράψω on line επτά για να κάνει ό, τι είπατε; ΦΟΙΤΗΤΗΣ: Star ptr ισούται με ενιαίο quote c τέλος μόνη προσφορά. JASON Hirschhorn: Έτσι ώστε να είναι βάζοντας ένα χαρακτήρα, γ, σε αυτή τη θέση, γιατί και πάλι, ότι αστέρι σημαίνει να πάει εκεί. Και όταν χρησιμοποιείται στην αριστερή πλευρά ένας φορέας ανάθεσης, που ισούται με υπογράψει, εμείς δεν πρόκειται να πάρει ότι αξία τόσο πολύ που αυτή η τιμή. Τώρα, ας δούμε τι θα συμβεί. Βάζουμε κάτι εκεί και ήταν εκεί. Ζητήσαμε δωρεάν. Μερικά πράγματα ίσως συνέβη στο σωρό. Έτσι δεν είναι πια εκεί. Αλλά και πάλι, δεν είμαστε πάρει στο πρόβλημα για να πάει εκεί. Κάνω αυτό σε κώδικα για να απεικονίσουν ότι πολλά από αυτά ερωτήσεις που έχετε, είναι πραγματικά ενδιαφέρον απαντά πολύ χρόνο. Και είναι πραγματικά καλές ερωτήσεις. Και μπορείτε να τα καταλάβω σε το δικό σας αν, για παράδειγμα, Δεν είμαστε στο τμήμα. Ναι. ΦΟΙΤΗΤΗΣ: Επειδή δεν είστε αποστολή της pointer οπουδήποτε, δεν θα πρέπει να χρησιμοποιήσετε malloc; JASON Hirschhorn: Έτσι, αυτό πηγαίνει πίσω στην αρχική ερώτηση σας. [? ?] Είναι απλά μια τοπική μεταβλητή; Malloc εδώ δεν είναι τόσο συναρπαστικό. Η χρήση της malloc εδώ δεν είναι ότι συναρπαστικό γιατί είναι απλά μια τοπική μεταβλητή. ΦΟΙΤΗΤΗΣ: Έτσι θα μπορούσατε να κάνετε char ptr αστέρι ισούται με γεια; JASON Hirschhorn: Αχ. Έτσι θα πάμε για να πάρει τώρα πίσω στην αρχική ερώτηση σας. Νομίζω ότι δεν ήταν ικανοποιημένοι με την απάντησή μου. Εντάξει; Όπως αυτό; ΦΟΙΤΗΤΗΣ: Ναι. Περιμένετε. JASON Hirschhorn: Και πού θέλετε να εκτυπώσετε; Έτσι θα εκτυπώσετε μια σειρά σαν αυτό; ΣΠΟΥΔΑΣΤΩΝ: Ενδιαφέρον. JASON Hirschhorn: Έτσι, αυτό λέει αυτό επιχείρημα το είδος του χαρακτήρα. Έτσι, αυτό θα πρέπει να είναι ένας χαρακτήρας. ΦΟΙΤΗΤΗΣ: παίρνει μόνο το πρώτο. JASON Hirschhorn: Έτσι, αυτό Είναι αυτό που είπα πριν. Όπως είπα, δεν είναι η αποθήκευση σπάγκο μέσα μεταβλητού δείκτη. Είναι αποθήκευση - ΣΠΟΥΔΑΣΤΩΝ: Η πρώτη τιμή του string. JASON Hirschhorn: Η διεύθυνση του η πρώτη τιμή της συμβολοσειράς. Αν ήταν να εκτυπώσετε αυτό, είμαστε να πάρει την αξία εσωτερικό δείκτη. Και θα δείτε ότι είναι, πράγματι, μια διεύθυνση μνήμης. Μήπως αυτό έχει νόημα; Λυπάμαι. Περιμένετε, έχει απαντήσει ότι σας ερώτημα, όμως; ΦΟΙΤΗΤΗΣ: Ναι. JASON Hirschhorn: Αυτή η γραμμή κώδικα είναι δημιουργώντας μια σειρά και, στη συνέχεια, ένα άλλο μεταβλητή δείκτη που να υποδεικνύουν στην εν λόγω σειρά, η σειρά. Ναι. ΦΟΙΤΗΤΗΣ: Έτσι, αν πήγαμε μία μνήμη την περαιτέρω αντιμετώπιση, θα έχουμε την ώρα; Μήπως έχει αποθηκευτεί ως ένα string; JASON Hirschhorn: Όπως, κάναμε - έτσι αυτό είναι πολύτιμο για να το κάνετε. Αυτό είναι το σημείο αριθμητική, την οποία εσείς έχουν δει στο παρελθόν και θα πρέπει να σχετικά άνετα. Αυτό είναι σαν να γράφει - αν ήταν να γράψω αυτήν τη γραμμή κώδικα, έχουμε δει σημειογραφία πίνακα πριν. Αυτό θα πρέπει να μας δώσει το δεύτερο αξία σε αυτήν την συστοιχία, h. Αν το κάναμε αυτό, θα πρέπει επίσης να δώσει μας η δεύτερη αξία σε αυτόν τον πίνακα. Επειδή δεν πρόκειται για τη μνήμη διεύθυνση από το πρώτο πράγμα, αλλά η διεύθυνση μνήμης του ένα πράγμα πάνω. Και τότε οι dereferences φορέα αστέρων ότι δείκτη. Και πάλι, ας δούμε. Παίρνουμε πάλι h. ΦΟΙΤΗΤΗΣ: Τι ακριβώς κάνει Αποαναφορά σημαίνει; JASON Hirschhorn: Αποαναφορά είναι μια φανταχτερή λέξη για να πάει να. Πηγαίνετε σε αυτό και να πάρει ό, τι υπάρχει είναι να dereference ένα δείκτη. Είναι απλά μια φανταχτερή λέξη για αυτό. ΦΟΙΤΗΤΗΣ: Αν θέλαμε να εκτυπώσετε όλο το κείμενο, θα μπορούσαμε κάνει εμπορικό δείκτη; JASON Hirschhorn: Εντάξει, είμαστε Θα σταματήσω εδώ. Εμείς πρόκειται να τελειώσει εδώ. Εμπορικό και σας δίνει τη διεύθυνση μιας θέση, έτσι ώστε όταν κάνετε εμπορικό του μια μεταβλητή, σας δίνει τη διεύθυνση όπου είναι αποθηκευμένη η μεταβλητή. Ampersand δείκτης θα σας το δώσει διεύθυνση ptr όπου ptr είναι στη μνήμη. Εμείς δεν πρόκειται να πάει για με αυτό το παράδειγμα. Μπορείτε να καταλάβω αυτά πράγματα για τη δική σας. Αλλά και πάλι, αυτό θα μπορούσε ακόμη και να αγγίζει τα όρια ενός λίγο πέρα ​​από ό, τι πρέπει να ξέρετε για το πεδίο εφαρμογής της παρούσας ενδιάμεσης - ή αυτό το κουίζ, μάλλον. Λυπάμαι. Θα προχωρήσουμε, γιατί θα ήθελα να κάνω ένα πρόβλημα κωδικοποίησης πριν την ώρα είναι επάνω. Και πρόκειται να κωδικοποιήσει αυτό που νομίζω είναι το πιο συναρπαστικό από αυτές παραδείγματα, atoi. Έτσι, αυτό ήταν ένα ζήτημα για ένα κουίζ πριν από δύο χρόνια. Και έχω στον πίνακα εδώ. Οι άνθρωποι κλήθηκαν στο κουίζ - τους δόθηκε λίγο περισσότερο tesxt σε η ερώτηση, αλλά εγώ εξαλειφθεί η κειμένου, ότι ήταν αχρείαστο για τους σκοπούς μας τώρα. Ήταν απλά κάποιο υπόβαθρο σε ποια atoi έκανε. Αλλά όλοι γνωρίζουν και είναι πολύ εξοικειωμένοι με atoi. Σας προτείνω να κωδικοποιήσει αυτό σε ένα φύλλο χαρτιού. Προτείνω επίσης να χρησιμοποιήσετε τη στρατηγική ότι έχουμε περάσει πάνω πολλά στο τμήμα μας. Πρώτον, βεβαιωθείτε ότι έχετε κατανοήσει τι κάνει ο atoi. Σχεδιάστε μια εικόνα ή να καταλήξει σε ορισμένα νοητική εικόνα του στο κεφάλι σας. Στη συνέχεια, γράψτε ψευδοκώδικας για αυτό. Στο κουίζ, αν το μόνο που έχετε είναι ψευδοκώδικα, τουλάχιστον θα βάλει κάτι κάτω. Και στη συνέχεια χάρτη που ψευδοκώδικα σε Γ. Αν έχετε μια επιταγή σε σας ψευδοκώδικα, όπως και ελέγξτε αν κάτι είναι 1, δηλαδή χάρτες σε μία περίπτωση κατάσταση και ούτω καθεξής. Και τέλος, την κωδικοποίηση του προγράμματος σε C. Έτσι, πηγαίνετε πίσω στο atoi και πέντε λεπτά να κωδικοποιήσει αυτό σε ένα φύλλο χαρτί, το οποίο είναι πιθανώς περίπου το χρονικό διάστημα που θα αναλάβει την κουίζ για atoi κώδικα. Πέντε έως 15 λεπτά, πέντε έως 12, πέντε έως 10 λεπτά, είναι για το ποσό των χρόνος που θα περάσετε σε αυτό ερώτηση στο κουίζ. Έτσι χρειαστούν πέντε λεπτά τώρα, παρακαλώ. Και εάν έχετε οποιεσδήποτε ερωτήσεις, να εκφράσουν το χέρι σας και θα έρθει γύρω. [ΣΥΝΟΜΙΛΙΕΣ SIDE] JASON Hirschhorn: Εντάξει, έτσι ώστε ότι ήταν πέντε λεπτά. Αυτό ήταν κατά πάσα πιθανότητα για το ποσό των χρόνος που θα περάσετε σε ότι σε ένα κουίζ, ίσως το χαμηλό τέλος εκείνου του χρόνου. Θα ανακεφαλαιώσουμε σε λίγο. Ας την έναρξη της κωδικοποίησης αυτό. Και αν δεν πάρει όλος ο τρόπος μέσω, οι απαντήσεις σε αυτό και αυτό ερώτηση κουίζ είναι διαθέσιμα, και πάλι, Φθινόπωρο 2011 είναι όταν αυτή η ερώτηση εμφανίστηκε στο κουίζ. Και άξιζε οκτώ σημεία στο κουίζ τότε. Οκτώ σημεία είναι το υψηλό τέλος της ποσό των πόντων κάτι που αξίζει. Οι περισσότερες ερωτήσεις είναι στην περιοχή ενός έως έξι μονάδες. Έτσι, αυτό είναι ένα πιο δύσκολο ερώτημα, αυτό είναι σίγουρο. Μπορεί κάποιος να μου ξεκίνησε; Σε γενικές γραμμές, τι θα να θέλετε να κάνετε με αυτό λειτουργούν atoi, λογικά; Τι θέλουμε να κάνουμε; Έτσι θα πάμε για να γράψει κάποια ψευδοκώδικα. ΦΟΙΤΗΤΗΣ: Μετατροπή χαρακτήρες σε ακέραιους αριθμούς. JASON Hirschhorn: Μετατροπή χαρακτήρες σε ακέραιους αριθμούς. OK. Έτσι, πόσους χαρακτήρες είμαστε Θα χρειαστεί να περάσουν; ΦΟΙΤΗΤΗΣ: Όλοι τους. ΦΟΙΤΗΤΗΣ: Όλοι οι χαρακτήρες στη συμβολοσειρά. JASON Hirschhorn: Όλα τα χαρακτήρες στη συμβολοσειρά. Έτσι, αν θέλαμε να πάμε μέσα από κάθε χαρακτήρα σε μια σειρά, αυτό είναι ένα πράγμα σε C έχουμε δει ότι επέτρεψε μας επιτρέψει να περάσουν κάθε χαρακτήρα σε μια σειρά; ΦΟΙΤΗΤΕΣ: A για το βρόχο. JASON Hirschhorn: Α για το βρόχο. Έτσι θα πάμε να βρόχο μέσω κάθε χαρακτήρα s. Τότε τι θα πάμε να θέλουν να κάνουν όταν παίρνουμε ένα συγκεκριμένο χαρακτήρα; Ας πούμε ότι είστε για να περάσει ένα 90. Έχουμε πάρει το 9. Είναι ένας χαρακτήρας. Τι θέλουμε να κάνουμε με ότι ο χαρακτήρας 9; ΦΟΙΤΗΤΗΣ: Αφαίρεσε από τον χαρακτήρα 0; ΦΟΙΤΗΤΗΣ: Προσθήκη 0; JASON Hirschhorn: Αφαιρείται το από το χαρακτήρα 0; ΦΟΙΤΗΤΗΣ: Ναι. JASON Hirschhorn: Γιατί θέλετε να το κάνετε αυτό; ΦΟΙΤΗΤΗΣ: [δεν ακούγεται] αξία. Int αξία του. JASON Hirschhorn: Εντάξει, έτσι ώστε να πάρουμε το χαρακτήρα 9, το αφαιρέσουμε από 0 χαρακτήρας για να πάρετε μια πραγματική ακέραιος 9. Sweet. Και πώς ξέρεις ότι ο χαρακτήρας 9 μείον 0 χαρακτήρας είναι 9; Τι διάγραμμα δεν κοιτάς; ΦΟΙΤΗΤΗΣ: Υπάρχουν λογικά εννέα θέσεις μεταξύ 9 και 0. Ή θα μπορούσατε να δείτε στο τραπέζι ASCII. JASON Hirschhorn: ASCII πίνακα. Αλλά ναι, είστε σωστοί, καθώς και. Έτσι αφαιρέσουμε 0. Έτσι τώρα έχουμε τον ακέραιο 9. Και τι θέλουμε να κάνουμε με αυτό; Αν έχουμε 90, είναι ο πρώτος ακέραιος έχουμε, τι θέλουμε να κάνουμε; ΦΟΙΤΗΤΗΣ: Θα έβαζα σε μια προσωρινή ακέραιο σειρά, στη συνέχεια, κάντε τα μαθηματικά για να το αργότερα να το κάνει σε ένα τέλος. JASON Hirschhorn: OK. ΦΟΙΤΗΤΗΣ: Μπορείτε να αρχίσει στο τέλος του η σειρά και στη συνέχεια να κινηθεί προς τα εμπρός, ώστε ότι κάθε φορά που κινείστε προς τα εμπρός, πολλαπλασιάζουμε με το 10. JASON Hirschhorn: OK. Αυτό ακούγεται σαν μια πολύ συναρπαστικό ιδέα. Μπορούμε να ξεκινήσουν στο τέλος του πίνακα μας, και μπορούμε να χρησιμοποιήσουμε strleng. Μπορούμε να χρησιμοποιήσουμε strleng εδώ. Θα πάρει το μήκος της συμβολοσειράς μας. Ξεκινάμε στο τέλος. Και + το πρώτο, παίρνουμε μόνο ότι ακέραιος, και ίσως έχουμε δημιουργήσει σαν νέα ακέραια μεταβλητή επάνω στην κορυφή, όπου είμαστε αποθήκευση πάντα. Γι 'αυτό βρόχο μέσα από κάθε χαρακτήρα μέσα από την s πίσω προς τα εμπρός, τότε αφαιρούμε 0, και τότε θα το πάρετε, και ανάλογα με όπου είναι, μπορούμε να πολλαπλασιάσουμε από μια δύναμη του 10. Επειδή το πρώτο, τι κάνουμε εμείς πολλαπλασιάστε το δεξιότερο χαρακτήρα; ΦΟΙΤΗΤΗΣ: 10 στο 0. JASON Hirschhorn: 10 στο 0. Τι πολλαπλασιάζουμε το δεύτερο δεξιότερο χαρακτήρα; ΦΟΙΤΗΤΗΣ: [δεν ακούγεται]. JASON Hirschhorn: Τι; ΦΟΙΤΗΤΗΣ: 10 στο 1. JASON Hirschhorn: 10 στο 1. Ο χαρακτήρας τρίτων δεξιά; ΦΟΙΤΗΤΗΣ: 10 2. JASON Hirschhorn: 10 2. ΦΟΙΤΗΤΗΣ: Συγγνώμη, δεν καταλαβαίνω τι κάνουμε εδώ. JASON Hirschhorn: OK, ας πάμε πίσω, τότε. Έτσι θα πάμε για να πάρει πέρασε σε μια σειρά. Επειδή γράφουμε atoi. Έτσι, θα έχουμε περάσει σε μια σειρά. Ας πούμε ότι είστε για να περάσει στη συμβολοσειρά 90. Το πρώτο πράγμα που πρόκειται να κάνετε είναι να ορίσετε μια νέα ακέραια μεταβλητή που είμαστε ακριβώς πρόκειται να δημιουργήσει ως νέα μας ακέραιο. Γι 'αυτό θα πάμε να επιστρέψει στο τέλος. Πρέπει να περάσει από κάθε χαρακτήρα η χορδών, γιατί έχουμε καθορίσει ότι πρέπει να αγγίξει κάθε μία και στη συνέχεια προσθέστε το νέο μας ακέραιο. Αλλά δεν μπορούμε απλά να το προσθέσετε ως αριθμός. Δεν μπορείτε να πάρετε μόνο 9 και προσθήκη 9 σε ακέραιο μας. Εξαρτάται από το ποια θέση είναι στη συμβολοσειρά. Εμείς πάμε να πρέπει να πολλαπλασιάσετε αυτό από μια δύναμη του 10. Επειδή αυτό είναι το πώς βάσης 10 έργα. Έτσι θα πάμε για να πάρει την πραγματική χαρακτήρα, ή ο πραγματικός ακέραιος τον αριθμό, αφαιρώντας χαρακτήρα 0 από τον χαρακτήρα 9 όπως κάναμε με αφαιρώντας χαρακτήρα του κεφαλαίου Α από ό, τι χαρακτήρα που είχαμε σε ένα από τα αυτά τα προβλήματα. Γι 'αυτό και θα πάρετε στην πραγματικότητα μια σειρά από 0 έως 9 αποθηκεύεται ως ένα πραγματικό αριθμό, και θα το πολλαπλασιάζουμε με μία δύναμη του 10, ανάλογα για το πού βρισκόμαστε στη συμβολοσειρά. Και μετά θα πάμε για να το προσθέσετε ξανά σε νέες ακέραια μεταβλητή μας. Έτσι αυτό θα μοιάζει θα να - θα συντάξει εδώ. Αν πάρετε περάσει στη σειρά 90 - ΦΟΙΤΗΤΗΣ: [δεν ακούγεται]. JASON Hirschhorn: Μα atoi παίρνει ένα string. Έτσι θα πάμε για να περάσει η εκμετάλλευση. Θα πάρει περάσει το 90. Εμείς πάμε από πίσω προς τα εμπρός. Παίρνουμε το 0. ΦΟΙΤΗΤΗΣ: Λυπάμαι. Ίσως αυτό είναι ηλίθιο. Αν θέλουμε να είμαστε πάρει περάσει σε μια σειρά, γιατί είναι 90 τι είμαστε να πάρει περάσει μέσα; Επειδή το 90 είναι ένας ακέραιος. JASON Hirschhorn: Επειδή atoi παίρνει μια string και το μετατρέπει στο ακέραιο αναπαράσταση αυτής της πετονιάς. Αλλά το κορδόνι 90 δεν είναι ο ακέραιος 90 ή ο αριθμός 90. Η συμβολοσειρά 90 είναι μια σειρά από δύο ή τρεις χαρακτήρες, μάλλον, το 9 χαρακτήρα, ο χαρακτήρας 0, και το backslash 0 χαρακτήρα. Και γράφουμε atoi διότι, για παράδειγμα, όταν παίρνετε την εντολή όρισμα της γραμμής, και είναι αποθηκευμένο σε argv, αυτό αποθηκεύεται ως ένα string. Αλλά αν θέλετε να την αντιμετωπίσουμε ως έναν αριθμό, θα πρέπει να το μετατρέψετε σε ένα πραγματική ακέραιο. Που κάναμε ένα πρόβλημα σύνολα μας. Ποια κάναμε σε μια σειρά του προβλήματος σετ μας. Ο καθένας που πήρε έναν ακέραιο ως όρισμα γραμμής εντολών. Έτσι, γι 'αυτό και η λειτουργία atoi μας παίρνει ένα string. Έτσι και πάλι, στο παράδειγμά μας εδώ, είμαστε πρόκειται να πάρει το τελευταίο. Εμείς πάμε για να αφαιρέσουμε το χαρακτήρα 0 από αυτό, επειδή οι χαρακτήρες 0 αφαιρείται από το χαρακτήρα σας δίνει 0 ο πραγματικός αριθμός 0, σύμφωνα με την τα μαθηματικά ASCII που κάνουμε. Επειδή οι χαρακτήρες εκπροσωπήθηκαν ως διαφορετική από την πραγματική τους - η Χαρακτήρας α, για παράδειγμα, πεζά a είναι 97. Δεν είναι - ουπς! Δεν είναι ό, τι θα περίμενε κανείς να είναι, μηδέν, για παράδειγμα. Έτσι, θα πρέπει να αφαιρέσετε το χαρακτήρα για να πάρει ένα 0. Έτσι θα πάμε να το κάνουμε αυτό εδώ για να πάρει τον πραγματικό αριθμό. Και τότε θα έχετε την ευκαιρία να το πολλαπλασιάσετε επί μια δύναμη του 10, ανάλογα με το πού είναι στη σειρά, και στη συνέχεια να λάβει ότι και να το προσθέσετε στο κάτοχο τόπο μας μεταβλητή ώστε να μπορούμε να καταλήξουμε σε τελική νέο ακέραιος μας. Μήπως αυτό έχει νόημα για όλους; Γι 'αυτό και δεν πρόκειται να κωδικοποιήσει αυτό τώρα, επειδή είμαστε να πάρει πολύ χρόνο. Ζητώ συγγνώμη για το χρόνο αυτό. Αλλά αυτό είναι ό, τι, ας ελπίσουμε, θα κάνατε να είναι σε θέση να κάνει το κουίζ - κατά τη πολύ λιγότερο, να πάρει αυτό το ψευδοκώδικα ολογράφως. Και τότε, αν επρόκειτο να γράψει το ψευδοκώδικας, στην πραγματικότητα, θα μπορούσαμε να το κάνουμε αυτό αρκετά γρήγορα. Κάθε γραμμή των σχολίων που γράψαμε εδώ μεταφράζεται σε περίπου μία γραμμή κώδικα C. Δηλώνοντας μια νέα μεταβλητή, γράφοντας ένας βρόχος, κάποια αφαίρεση, μερικές πολλαπλασιασμό, και κάποια εργασία. Μάλλον θα θέλουν επίσης να γράψει μια γραμμή επιστροφής. Θα μπορούσαμε επίσης να θέλετε να βάλετε μερικοί έλεγχοι εδώ. Ναι. ΦΟΙΤΗΤΗΣ: Έτσι μπορούμε να τη θεραπεία s, όπως η πραγματική σειρά; Επειδή ξέρω ότι είναι απλώς μια διεύθυνση. Όπως, πώς θα πάρει το μήκος της το κορδόνι που περνάει μέσα; JASON Hirschhorn: Λοιπόν, πώς έκανε το μήκος μιας συμβολοσειράς; Strlen. ΦΟΙΤΗΤΗΣ: strlen, ναι. Αλλά μπορεί να σας βάλει s, όπως η επιχείρημα γι 'αυτό; JASON Hirschhorn: Έτσι strlen παίρνει ένα αστέρι char. Και συνάγεται ότι αστέρι char, και συνεχίζει να μετρούν μέχρι να φτάσει στο ένα backslash 0. strlen ήταν στην πραγματικότητα ένα από τα άλλα προγράμματα που επρόκειτο να κώδικα. Αυτό είναι άλλο ένα καλό αποτέλεσμα για να κώδικα. Αυτό και μόνο είναι λίγο πιο εύκολο, γιατί αν θα πάμε να σκεφτούμε ότι εννοιολογικά - Μόλις το είπε φωναχτά - strlen εξής ένας δείκτης και συνεχίζει και καταμέτρηση και παρακολούθηση μέχρις ότου φτάσετε σε ένα backslash 0. ΦΟΙΤΗΤΗΣ: Εντάξει, το κατάλαβα. JASON Hirschhorn: Έτσι, ο καλύτερος του τύχη σε ένα κουίζ 0 αύριο. Εάν έχετε οποιεσδήποτε ερωτήσεις, εγώ θα είναι έξω μετά από αυτό. Μη διστάσετε να μου στείλετε email. Προσπαθήστε να προσεγγίσετε το δικό σας TF αν είστε όχι στο τμήμα μου, ή να πάρετε μου e-mail, αν θέλετε. Αν θέλετε να φρικάρεις και απλά να στείλετε μου ένα email, ένα email freakout, εγώ θα σας στείλει πίσω, όπως, ένα χαμογελαστό πρόσωπο, ή, όπως, ένα αστείο ή κάτι τέτοιο. Έτσι, μη διστάσετε να το κάνετε αυτό επίσης. Καλή τύχη και πάλι, και εγώ θα βλέπετε όλα την επόμενη εβδομάδα.