JASON HIRSCHHORN: Willkommen bis A5, jeder. Wir haben eine aufregende Woche vor uns, vor allem, weil es so viele neue steht in diesem Raum. Es ist wunderbar. Viele von euch sind hier durch einen Unfall, Das ist sogar noch besser. So werden Sie hoffentlich halten zu uns. Diese Woche werden wir verbringen der Großteil der Abschnitt Vorbereitung für das Quiz. Also nach unserer Tagesordnung, werden wir zu sprechen ein bisschen über Ressourcen für die Klasse, sondern auch für das Quiz, und dann wieder, verbringen den Großteil der Klasse sprechen über Fragen. Sobald wir fertig sind Beantwortung Ihrer Fragen, oder wenn Sie Ihre Fragen natürlich führen uns zu einigen Codierung, ich Probe haben Probleme, die aus Halbzeiten Vergangenheit, die wir in Abschnitt Live-Code zusammen, die auch bringen eine andere gute Themen zu decken. Also erstens, wie wir durch die für gegangen letzten paar Wochen, um Sie daran zu erinnern, Jungs, es gibt eine Tonne von Ressourcen für diesen Kurs zur Verfügung. Viele von ihnen werden unglaublich hilfreich , Sie, wie Sie weiter Studie für Quiz-0, da es ist Dienstag Nachmittag. Also alle von Ihnen haben Studium für ein bisschen. Es gibt Skripten und Quelle Code, die Sie definitiv auschecken. Sehen Sie sich die Shorts. Schauen Sie sich study.cs50.net. Und dann, die unten aufgeführt, eine Zahl von anderen Ressourcen. Auch hier ist morgen Quiz 0 um 1 Uhr. Wenn Sie dies nicht bereits getan haben, überprüfen aus der Über-Quiz 0 Dokument auf die Homepage der Kurs, um herauszufinden, wo sie das Quiz sind. Das Quiz beginnt um 01.10 Uhr und Enden 70 Minuten später. Also, wenn Sie sich zeigen, nach 01.10 Uhr, sind Sie werde, dass viele weniger Minuten erhalten als 70 um das Quiz zu nehmen. So stellen Sie sicher, dass Sie rechtzeitig da sind. Wenn Sie Student sind eine Erweiterung oder einige andere Tests Erwägungen ist vielleicht nicht um 1 Uhr morgen. Aber wieder, überprüfen Sie die Über-Quiz 0 dokumentieren, um sicherzustellen, dass Sie wissen, wann Sie nehmen das Quiz sind. Ich schrieb 75 Minuten hier oben. Ich denke, das ist richtig, nicht 70. Es deckt das gesamte Material von einer Woche 0 bis letzte Woche Vortrag am Mittwoch. Und wieder, für dieses Quiz, dass pro Dokument, erhalten Sie eine zweiseitige und 8 1/2 von 11 Blatt Papier, die Sie erhalten als Notizen während des Quiz zu verwenden. Viele Menschen, wenn nicht die meisten Menschen, haben festgestellt, dass das einzige und hilfreiche Art und Weise zu studieren, für das Quiz ist es, machen eine Studie, Folie, eine ein Insider, der ihren. Also schauen vorbei, wenn diejenigen, Sie vorbei an diejenigen gesehen habe. Erreichen Sie Freunde zu sehen, was sie auf ihre Umsetzung. Aber die Hände nach unten, der beste Weg, können Sie Studie ist es, durch alles gehen und schnitzen es darauf an, was sollte oder nicht auf diesem Blatt gehören Papier, denn das ist nur ein wirklich hilfreich Möglichkeit für Sie, stellen Sie sicher, Sie durch alles gehst und haben eine gewisse Vertrautheit mit ihm. Die meisten Menschen, so finden wir, auch wenn sie haben das Blatt Papier sitzt direkt neben ihnen auf dem Quiz, nicht drehen darauf, weil wiederum die sehr Prozess zu gehen durch die Informationen hat ihnen geholfen, es zu lernen. Hat jemand irgendwelche Fragen haben, Quiz über 0? Hat alle - Ich werde nicht um eine Show der Hände zu tun. Das macht nichts. Ich wollte die fragen Studium begonnen. Aber ich weiß nicht, Sie zu machen alle nicht die Hand heben. Also wie ich schon sagte - ja, Avi, nur zu. AVI: Was wäre eine sinnvolle Sache sein auf der einen Pager setzen? STUDENT: Das ist bis zu Ihnen. JASON HIRSCHHORN: Sie erhalten Ihrem Urteil zu verwenden. Nützliche Dinge, die auf der einen Pager-setzen, wenn Sie über das große O verwechselt werden Laufzeit von verschiedenen Arten von Such und Sorten, setzte sich dort in ein Handy Dandy Diagramm. So, wenn Sie gebeten, dass auf der Quiz, brauchen Sie nicht zu versuchen und Figur Grund ihn aus oder durch die Laufzeit. Sie können einfach kopieren Sie es auf. Wenn Sie bei Quiz Vergangenheit viel sehen mal, da ist Laufzeit Fragen. Also das wäre ein Beispiel für eine gut Sache, auf Ihr One-Pager setzen. Andere gute Sachen anzuziehen, wenn Sie verwirrt darüber, wie zu erklären, ein Funktion oder, was die verschiedenen Teile die Funktionsdeklaration sind, schreiben dass dort, eine generische Version und dann vielleicht ein Beispiel. Wenn Sie verwirrt über Zeiger sind, ein Diagramm, wie Zeiger Arbeit ist wahrscheinlich wirklich hilfreich. Wenn Sie verwirrt über Rekursion, sind ein probieren rekursive Funktion dort könnte sich auch als sehr hilfreich. Heißt das, dass Ihnen ein paar Ideen? AVI: Sie müssen verstehen, die gesamten Übersetzungsprozess, wie wie das alles funktioniert? JASON HIRSCHHORN: Alles abgedeckt wurde, dass könnte zeigen sich auf der Quiz. Fragen - aber wieder, werden einige Dinge stärker gewichtet werden als andere. Einige Dinge haben sich wieder kommen und wieder in der Klasse, in Vortrag und Abschnitt. Andere Dinge haben nicht kommen so oft. Wir haben viel über # include und redeten -L etwas und was bedeuten die in der Prozess Zusammenstellung. Wir haben viel über GDB gesprochen, festhalten, diese verschiedenen Flaggen, die wir verwenden, wenn wir etwas zu kompilieren, und was make15 zum Beispiel wirklich bedeutet, und wirklich. Wir haben nicht so viel reden jeder einzelne Schritt in der Prozess Zusammenstellung. Wir haben immer darüber gesprochen. Also es ist immer noch etwas, dass Sie vertraut sein sollten. Aber noch einmal, wir werden nicht zu sein - Dinge, die kommen immer häufiger in der Klasse sind eher mehr kommen oft und stark sein auf der Quiz gewichtet. Kühl. Alle anderen Fragen zu Quiz: 0? OK, also habe ich eine Liste der Themen auf dem Brett. Ich ging durch den Lehrplan. Ich ging durch die Überprüfung von Abschnitt letzte Nacht, und diese Dias zu kommen mit einer nicht erschöpfenden Liste von Themen dass wir bisher in CS50 bedeckt und Dinge, die vielleicht erscheinen auf dem Quiz. Also ich werde nicht gehen durch jeder einzelne von ihnen. Das wäre viel mehr zu nehmen Zeit, als wir jetzt haben. Aber Ich habe dies hier hoffentlich Jog Ihr Gedächtnis, wie die Dinge, die kann oder auch nicht so vertraut mit dir sein. Und ich würde gerne den Großteil verbringen Abschnitt der Beantwortung Ihrer Fragen zu diese Themen, Themen, die werden hier nicht behandelt. Wir können Pseudo-Code zu schreiben. Wir können echten Code schreiben um sicherzustellen, dass Sie - Kann ich Ihre Frage beantworten und Ihnen helfen alle grundlegend zu verstehen, ein Viele dieser Themen, so dass Sie sich fühlen, vorbereitet und komfortabel in gehen das Quiz morgen. So lesen Sie über die Liste. Sie haben hoffentlich Abschnitt kommen mit einigen Fragen. Wenn Sie bereit sind, heben Sie Ihre Hand und wir werden beginnen. Denken Sie daran, die Fragen, die Sie haben, Es gibt keine dummen Fragen. Wir haben das eine Menge gehört. Und die Fragen, die Sie haben, bin ich bereit auf, viele andere Menschen setzen beide hier sitzen und beobachten Online-als auch. So können nur Menschen helfen durch Fragen. Marcus. Marcus zwischen dem Stapel und der Haufen, gibt es eine vorab zugewiesene Prozentsatz der Erinnerung, die wie folgt definiert ist dies ist für den Stapel oder die Haufen? Oder wie funktioniert das genau? JASON HIRSCHHORN: Gute Frage. Ich werde zurückverfolgen ein wenig. Hat jeder - bitte hier ehrlich. Ich weiß, ich frage Sie erhöhen Ihre Hand vor Ihren Kollegen. Aber gibt es Leute, die glauben, unwohl mit dem Stapel und Haufen und möchte gehen, dass über und was diese bedeuten? Heben Sie Ihre Hand, wenn - OK. Danke. So werden wir über den Stapel gehen und der Haufen wirklich schnell und dann Umzug in Beantwortung Ihrer Frage. Also, wenn wir zeichnen Sie ein Feld zu stellen Speicher auf Ihrem Computer, was sind einige Dinge, die in dieser Box gehen? Main. Eine Hauptfunktion. Wo Haupt gehen? STUDENT: [unverständlich]. JASON HIRSCHHORN: Also wir werden Haupt setzen hier unten. Welche andere geht in diesem Feld? STUDENT: Die Funktionen, die Sie anrufen. JASON HIRSCHHORN: Die Funktionen dass wir anrufen. Und wohin gehen sie? STUDENT: In dem Stapel. JASON HIRSCHHORN: Sie gehen in den Stapel. So werden wir auf diesen Aufruf was hier unten im Stapel. Und bis oben, haben wir die Haufen. Also Speicher ist nicht nur eine Box wie diese. Aber es ist eigentlich ziemlich ähnlich. Es wird eine Menge von Boxen über sein und mehr, je nachdem, wie groß Ihr Computer ist oder wie groß Ihr Gedächtnis ist. An der quote-unquote "unten" ist der Stapel. Und es gibt mehrere Dinge dass auf den Stapel. Und die auf den Funktionen hängen Sie haben in Ihrem Code. Sie haben immer eine Funktion in der Code aufgerufen Haupt, so gibt es immer eine Abschnitt hier unten in der stapeln, um Haupt gewidmet. Diese Abschnitte in dem Stapel werden Stack-Frames genannt. Wenn Sie eine andere Funktion aufrufen, sagen Haupt ruft eine binäre Suche, Wir stellen ein weiteres Bild auf dem Stapel. Genauer gesagt, werden wir spenden einen Teil des Speichers auf unserer Computer zu speichern binäre Suche der lokalen Variablen und die binäre laufen Suche Code. So nennen wir binäre Suche. In diesem Teil des Speichers, wir gehen seinen lokalen Variablen. Wir werden seine printf Anrufe zu speichern. Was auch immer der Fall ist, ist die Funktion gehen, um genau dort gespeichert werden. Binäre Suche wird ausgeführt. Es wird, um die Ausführung zu vervollständigen. Was ist das Wort, dass in C bedeutet dass eine Funktion sollte vervollständigen seine Ausführung? STUDENT: Return. JASON HIRSCHHORN: Zurück. Also, wenn Sie eine Rückrechnung sehen die Funktions Enden wenn er trifft, dass. So binäre Suche wird seine Rückkehr getroffen. Dieser Teil des Speichers wird im Wesentlichen up befreit werden. Und Haupt zurück, um die Ausführung zu gehen. Also überall dort, wo Haupt wird unterbrochen war, Call binäre Suche, bekommen einige Rückgabewert, und die Ausführung fortsetzen. Diese Stapelrahmen gehen weg. Wenn wir eine rekursive Funktion, rufen Sie die ist eine Funktion, die sich selbst aufruft über und mehr, vielleicht bekommen wir - sagen wir tat binäre Suche rekursiv. Wir könnten binäre Such Version eins zu bekommen, binäre Such zwei binäre Suche drei, vier binäre Suche, binäre Such fünf. Und dann diese letzten fünf binäre Suche wird den Basisfall und den Stapel schlagen Frames zurück und halten Schluss bis wir zurück zur Haupt. Wir können mehr als Rekursion in ein bisschen gehen. Aber all das ist zu sagen, wenn Sie Aufruf mehrere Funktionen in einer Zeit, es werde mehrere Stack Rahmen auf dem Stapel. Der Haufen, auf der anderen Seite, bis hier ist nicht für Funktionen, nicht für lokale Variablen. Es ist bei dynamisch zugeteilten Variablen. Das sind also Variablen, die sein können, im Haupt-oder ein initialisiert Funktion, die Hauptgespräche. Überall im Code, sie initialisiert werden. Und einen dynamisch initialisiert zugewiesene Variable. Welche Funktion in C verwenden wir? STUDENT: Malloc. JASON HIRSCHHORN: Malloc. Sie rufen malloc. Sie erhalten ein Erinnerungsraum. Und das Erinnerungsraum ist auf dem Heap. Und, dass der Raum der Erinnerung bleibt dort, bis Sie rufen Sie kostenlos. So dynamisch zugewiesenen Variablen in Haufen wird so lange existieren, wie Sie wollen, dass sie existieren, und sie wird nicht weg, bis Sie explizit ihnen sagen, weg. Sie können sie in einer Funktion erstellen. Stack, der Funktion Rahmen gehen weg. Aber diese Variable noch existieren in der Halde, bis sie befreit, möglicherweise durch die Funktion, die aufgerufen binäre Suche oder was auch immer. Also diese Haufen Variablen bleiben dort so lange, wie Sie wollen sie, dort zu bleiben. Und sie bekommen hier setzen. Und dann der nächste dort setzen wird. Sie halten immer gefüllt, und sie dort bleiben, bis Sie anrufen kostenlos. Und im Grunde, der Heap und der Stapel, immer auf Marcus 'Frage, aufeinander zuwachsen. Und wenn sie ineinander laufen, haben Sie Alle verwendeten Speicher in Ihren Computer, und Ihr Programm wird beendet weil Sie nicht mehr Speicher haben links zu bedienen. Zwischen ihnen gibt es möglicherweise andere Dinge. Aber für den Geltungsbereich dieses Kurses können Sie Sie brauchen sich nicht um die Sorgen machen. So dass die Antwort zu Ihrer Frage. Machen Sie sich deswegen keine Sorgen. Aber das war die lange Antwort. Alles, was Sie wissen müssen, ist die Heap und der Stapel wird - einem am unteren Ende beginnt. Der Stapel tut. Der Haufen ist da oben. Sie sich näher zueinander. Und wenn sie sich berühren, ist das ein Problem. Sie rannte aus der Erinnerung. Sondern auch, zusätzlich zu wissen, wo sie sind, was sowohl die gespeicherte Stack und Heap. Curtis. CURTIS: Wenn sie kollidieren, ist, dass ein Stack-Überlauf? JASON HIRSCHHORN: Wenn sie kollidieren, das ist nicht ein Stapelüberlauf. Ein Stack-Überlauf ist ein anderes Gebiet dass wir gehen vorbei, wenn Sie wollen. OK, wir kommen wieder auf, dass in einem Bit zu kommen. STUDENT: Was ist das Wort genannt wenn sie einander treffen, die Stack und dem Heap? JASON HIRSCHHORN: Denn jetzt, nicht zu befürchten. Genau wissen - Ich werde diese Frage zu beantworten nach dem Unterricht. Wenn sie ineinander laufen, lief aus Sie der Erinnerung, weil es keine mehr Raum gibt. STUDENT: Sorry, was ist ein Segment Schuld? JASON HIRSCHHORN: Ein Segment Fehler können aufgerufen werden - es hängt davon ab, warum heißt der seg Schuld. Manchmal Ihren Stack-Überlauf, wird es sagen Segment als Fehler bemängeln. STUDENT: Was Dereferenzierung ein Null-Variable? Ist das ein Segment Schuld? JASON HIRSCHHORN: Dereferenzierung ein Null-Zeiger - OK, also, wenn Sie einen Zeiger, die Sie haben auf gleich null, Zeiger, Rückruf, Speicher Speicheradressen als Werte. Und ein Null-Zeiger ist im Wesentlichen Speichern von 0 ist, die 0-ten Adresse in dieser Variable. So 0x, 0, 0, 0, 0, et cetera. Das 0-ten Adresse im Speicher, das nicht in unser Bild, das dort oben irgendwo, das ist reserviert für den Computer. Wir sind nicht erlaubt, sie zu berühren. Also, wenn Ihr Programm ist die Ausführung, wenn etwas versucht, den Speicher gehen Adresse 0, weiß er, dass das ist ein leerer Wert. Es weiß nichts da sein sollte. Also, wenn Sie es versuchen, und verwenden Sie etwas und zu behandeln, so etwas gibt oder versuchen, an diesem Ort zu gehen, sind Sie werde eine seg Fehler oder eine Fehlermeldung. Heißt das, Ihre Frage zu beantworten? Und jetzt werden wir wieder gehen um ein Überlaufen zu stapeln. Highlights im Stapel, wie Sie Jungs haben gesehen, in - zu ziehen lassen eine enge aus einem Stapel Rahmen. Kann jeder sehen, dass? So haben wir unsere Stapelrahmen. Wir sparen ein Array als lokaler Variable in dieser Funktion. So sagen unser Angebot hat fünf Spots. Alle fünf Personen gespeichert werden in diesem Stack-Frame. Wenn wir anfangen, über das Schreiben Grenzen dieses Array - also, wenn wir in dem Schreiben beginnen, sagen wir, das ist null. Das sind die fünf Indizes unserer Array. Wenn wir anfangen, in Index 5, schriftlich die haben wir nicht, wenn wir eine Array der Größe 5, starten wir in das Schreiben Index 6, 7, 8, 9, können wir einen Stapel bekommen Überlauffehler. Generell ist es nicht - Sie werden wahrscheinlich in Schwierigkeiten wenn Sie über gehen nach dem anderen. Aber im Allgemeinen, werden Sie in die bekommen meisten Probleme, wenn Sie über gehen durch eine Menge und Sie so weit über, dass Sie schreiben, gehen über die Rücksprungadresse, dass -Funktion, die bei der angeordnet ist Boden der Stapelrahmen. Denn, nicht wahr? Sie - in der - sorry. Nicht ", weil richtig." In der Stapelrahmen, haben Sie Ihre lokalen Variablen. Am unteren Rand des Stapels Rahmen ist die Absenderadresse. Das ist, wo die Funktion geht, wenn es vorbei ist. Und wenn Sie, dass die Rückkehr zu überschreiben Adresse, dann, wenn diese Stapelrahmen, wenn Sie durch den Stapel gehst Rahmen und Ausführung jede Zeile, du bist gehen, um zu Ihrem neuen Absenderadresse gehen das ist es, anstatt die schriftliche tatsächliche. Und das ist, wie wir gesehen haben, einige Sicherheitslücken kann mit dem Computer geschehen. So Stack-Überlauf, kurz gesagt, ist, wenn Sie das Teil in den Stack überschreiben Sie sollen zu verwenden, sind die lokale Variable sollen Sie zu bedienen, und insbesondere, wenn Sie Überschreiben beginnen wichtige Dinge wie die Rückkehr-Adresse. Und das ist, wo Sie eine Fehlermeldung. Oder vielleicht sogar Sie beginnen könnte auch das Schreiben in - sagen binäre Suche war rechts oberhalb der Haupt. Wenn Sie überschrieb eine Menge, die Sie konnte in den Haupt schreiben. Aber in der Regel, bevor eine Fehler erhalten Sie dann, weil der Computer weiß, Sie tun etwas Sie nicht tun sollte. Ja. STUDENT: Was ist der Unterschied zwischen einem Stack-Überlauf und einen Pufferüberlauf? JASON HIRSCHHORN: Pufferüberlauf ist eine generische Art von was ich gerade beschrieben habe. STUDENT: So ein Stapelüberlauf ist ein Beispiel für einen Pufferüberlauf. JASON HIRSCHHORN: Genau. Dies ist ein Array wir als denken können Puffer, ein Platz für die Dinge zu gehen in. Dies ist ein Pufferüberlauf. Wir hätten einen Pufferüberlauf. Wenn es einen Puffer gibt, die oft ist ein Array der Haufen, und wir überschrieb diese Grenzen, dann würden wir haben einen Pufferüberlauf. Und über den Rahmen dieses Kurses sie ein bisschen anders erfasst sind. Der Compiler hat eine besondere Möglichkeiten zur Erkennung jeder. Aber ein Pufferüberlauf ist eine generische Art von, was ich beschrieben, das war ein Pufferüberlauf. Hat das deine Frage beantworten? Süße. Gab es noch andere ähnliche Fragen auf dem Stack oder dem Heap? Ja. Student: Ich weiß, Sie wollen kostenlos Saiten weil sie in dem Haufen sind und Sie nicht möchten, dass ein Speicherleck. Aber wissen Sie, um globale Variablen frei zu haben und solche Sachen? Oder sind sie automatisch freigegeben? JASON HIRSCHHORN: Gute Frage. So in CS50.H, dieses Ding schaffen wir für Sie einen String aufgerufen. Ein String ist wirklich was? STUDENT: Char Stern. JASON HIRSCHHORN: Ein char Stern, ein Zeiger auf ein Zeichen, ein Zeiger auf ein Array von Zeichen. Das ist, was der String. Also müssen wir sie befreien, weil getstring, denen wir viel benutzt - Name der Zeichenfolge entspricht getstring - mallocs, dass für uns eine Erinnerung an die häufen und dann gibt einen Zeiger auf die erste Zeichen, dass Schnur, ein char-Star. So vordergründig, wenn Sie nicht in der kostenlos schriftlich auf alle Ihre Saiten dass Sie bisher genannt haben, haben Sie wurde undicht etwas Speicher. Natürlich haben wir nicht gesprochen , also niemand in bekommen Mühe, es zu tun. Aber für die Zukunft, ja. Wenn Sie getstring nennen, sind Sie mallocing etwas Platz auf dem Heap. Und wenn Sie nicht frei, dass später aufrufen String, haben Sie ein Speicherleck. Dass Ihre Frage beantworten? Ja STUDENT: So zu tun, verwenden wir freie Recht vor Rückkehr? Wie, im Rahmen der, denke ich, wenn wir sagen, wie, int main, innerhalb der Umfang des Codes, die innerhalb dieser ist geschweiften Klammern, direkt vor - Sie wissen, wo du würdest Regel setzen Rückkehr. Haben Sie vor, dass setzen kostenlos? JASON HIRSCHHORN: Also können Sie kostenlos gestellt wo immer Sie wollen frei zu setzen. Da diese dynamisch zugewiesenen Variablen, weil sie es können Leben über den Rahmen einer bestimmten Funktion, wenn Sie in ein malloc aufrufen separate Funktion, zum Beispiel, getstring, können Sie kostenlos in den Haupt anrufen. Sie brauchen nicht zu nennen in der spezifischen Funktion wobei malloc aufgerufen. Aber Sie müssen es nennen vor den Haupt Renditen. Und es hängt wirklich davon. Es hängt davon ab, warum Sie, dass malloced Raum, in den ersten Platz. Einige Leute nennen befreien ziemlich schnell. Einige Leute werden nicht frei nennen, bis das Ende des Programms. Und sie werden durch zu gehen und frei alles. Es hängt davon ab, warum Sie malloc aufgerufen. STUDENT: Und was würden Sie sagen, wenn Sie den Einsatz getstring genannt? Sie würde sagen, was frei? JASON HIRSCHHORN: Also die Syntax kostenlos ist einfach frei, offen paren, in der Nähe paren, und der Name des Zeigers. Also, wenn Sie String-Namen Gleichen schreiben getstring, setzen Sie den Namen hier. Das ist der Name des Zeigers. Und sie weiß, dass die Speicher frei. STUDENT: Also, wenn es befreit, dass der Speicher, der Zeiger immer noch auf der Stelle in der Erinnerung? Oder ist der Zeiger auch geleert die Adresse, die er auf. JASON HIRSCHHORN: Wir sollten versuchen, die. Wir sollten zu codieren, dass. Lassen Sie uns zurückkommen, wenn wir bekommen Codierung, und lassen Sie uns zu codieren, dass. Und wenn Sie, um herauszufinden, die Antwort wollen auf, dass Sie auch Code kann, dass in der Zwischenzeit. Aber das ist eine große Frage. STUDENT: Ist es möglich, frei etwas zu früh? So können Sie noch brauchen es für das Programm, und Sie diesen Speicherplatz frei? JASON HIRSCHHORN: Ja. Es ist möglich, wenn Sie freie etwas und dann kannst du es wieder verwenden, werden Sie laufen in einen Fehler. Aber das ist für dich, weil du befreit etwas, und dann heißt es später. Das war also Fehler eines Programmierers. Aber ja. Man könnte schreiben, dass. Noch weitere Fragen auf - Ja. STUDENT: Also, wenn Sie eigentlich gerade befreien sie in der Regel vor der Programm endet, ist, dass, wenn die mittlere Programm endet und Sie befreien es nicht, dass der Speicher immer noch zugewiesen? JASON HIRSCHHORN: Wenn Ihr Programm endet und Sie vergessen, etwas zu befreien, dann dass der Speicher wurde während zugeteilt die Lebensdauer Ihres Programms. Wenn Ihr Programm vollständig schließt, dass der Speicher nicht für immer dort zu bleiben. Der Computer ist klug genug zu wissen dass, wenn das Programm geschlossen wird, ist es sollte der gesamte Speicher loswerden, dass wurde mit dem Programm zugeordnet. Allerdings gibt es Tools, die Sie ausführen ein Programm zu erfassen, ob, wenn der Programm beendet, Sie vergessen , um Speicherplatz freizugeben. Und für Ihre nächste Problem gesetzt, wo Sie werden mit Hilfe und mit malloc Zeiger, werden Sie diese Lauf Programm auf dem Programm, um zu sehen, ob, wenn die Haupt zurück, musste man einige Dinge, die links unfreed wurden. Also sie gehen nicht malloced zu bleiben für immer in Ihrem Computer. Das wäre Verschwendung, denn sehr schnell, Computer würde der Speicher knapp. Aber wenn sie bis zum Ende Ihrer Lauf programmieren und sie sind nicht befreit und Ihr Programm beendet, das ist immer noch ein Problem dass dieses Tool wird Ihnen helfen, zu adressieren. STUDENT: Ist das Valgrind? JASON HIRSCHHORN: Es ist Valgrind genannt. Und du wirst sein - Student: Aber wir haben nicht zu wissen, dass für das Quiz, wenn? Ich meine, es wurde darüber gesprochen ein wenig in der Vorlesung. JASON HIRSCHHORN: Also Valgrind ist der Name dieses Tool. Zu wissen, was sie tut, ist genug für das Quiz. Aber du hast es auf noch nicht genutzt haben Ihre Problem einstellen, weil wir hatten nicht ein Problem Satz, der ausdrücklich behandelt hat mit malloc oder Sie malloc. So können Sie nicht Valgrind verwendet noch. Aber Sie werden es früher verwenden als später. STUDENT: Können Sie das wiederholen was ist Valgrind? JASON HIRSCHHORN: Es tut uns leid? STUDENT: Können Sie was wiederholen der Zweck der Valgring ist? JASON HIRSCHHORN: Valgrind ist der Name - wie GDB hilft Ihnen, Ihr Programm zu debuggen, Valgrind hilft Ihnen herauszufinden, ob Dinge haben sich nicht befreit worden wenn das Programm geschlossen wird. So haben Sie es auf Ihrem Programm auszuführen. Und Ihr Programm beendet, und es wird sagen Ihr Programm namens malloc dieses viele mal für so viele Bytes, und Sie Free oft nur genannt. Und so viele Bytes Sie diese links ohne befreit. Oder es werde sagen Ihnen alles, was befreit haben. Gute Arbeit. STUDENT: OK. Und es ist Valgring genannt? Jason Hirschhorn V-A-L-G-R-I-N-D. STUDENT: Eine Frage, über Zeiger. So sagen Sie haben n Stern x gleich etwas. Das entspricht, was auch immer Sie setzen gibt, ist, dass, was gerade innen setzen welche x zeigt an, oder der Zeiger von x? JASON HIRSCHHORN: Können Sie die Frage wiederholen? Können wir ziehen es, während Sie es sagen? STUDENT: In dem Quiz, eigentlich die , die Sie uns geschickt, es war wie, char Sterne Wahrheit entspricht CS50 Felsen, oder? Also bedeutet das, dass dass CS50 Felsen ist das, was die Wahrheit ist auf den Hinweis? JASON HIRSCHHORN: Also Sie sprechen über eine char-Sterne in einer Reihe, wie das funktioniert? Ja. OK. Ziehen wir diese hier. [SIDE GESPRÄCH] JASON HIRSCHHORN: Also diese Variable wird sich vom Typ char Stern. Wie groß ist eine Variable vom Typ char Stern? Wie viele Bytes? STUDENTEN: Vier. JASON HIRSCHHORN: Es ist vier Bytes. Wie viele Rechte ist eine Variable vom Typ int Stern? STUDENTEN: Vier. JASON HIRSCHHORN: Vier Bytes. Wenn es einen Zeiger, so ist es immer vier Bytes, weil Zeiger, ihre Wert eine Speicheradresse. Und Speicheradressen auf dem CS50 Gerät sind vier Byte lang. Also, wenn wir rufen getstring, oder wenn wir sagen wir, gleich string und dann in Anführungszeichen setzen einen String, wir setzen - gut, das ist ein wenig anders. Wir werden getstring Sie als Beispiel. Oder char Sterne etwas gleich der Zeichenfolge. Sorry, geben Sie mir das Beispiel dass Sie gelesen haben? STUDENT: char Sterne Wahrheit entspricht "CS50 rocks" in Anführungszeichen. JASON HIRSCHHORN: Also dieser Stern, diese wir werden diese Variable x zu rufen Sie unsere generische Zwecke. Wir haben eine Variable namens x erstellt. Es ist vom Typ char Stern. Es ist ein Zeiger auf eine Serie von Zeichen. Also hier unten - Das ist also, wie würde dies arbeiten im Speicher. Dies würde eine Speicheradresse zu speichern. Es würde die Speicheradresse speichern das erste Zeichen in der Anordnung. Und dann, wenn Sie folgen der Zeiger, würden Sie erhalten die ersten Zeichen. Und wenn Sie diese Sache gerade liest wie ein String ist, ist Ihr Computer intelligent genug, zu wissen, lesen Sie die ganze Sache bis es zu einer Gegenreaktion 0. Aber wenn sie es lesen ein Zeichen an eine Zeit, so dass Sie durch Iteration sind Diese Saite, dann werden Sie gerade lesen ein Zeichen in einer Zeit, bis Sie zu bekommen 0 Backslash. Das nicht beantworten könnte Ihr Frage, wenn. STUDENT: Ja, aber Sie haben malloced, dass der Raum noch für die Zeiger. JASON HIRSCHHORN: Also ich bin mir nicht ganz sicher, genau das, was Sie gerade sehen, weil ich nicht, dass die Quiz machen. Das sollte ein hilfreiches Ressourcen aus einem anderen TF. Wenn Sie erstellen einen String auf die stapeln oder als lokale Variable, wird es gerade Reihe von Gebühren, anstatt sein in der Regel ein Zeichen, die auf Sterne eine andere Zeichenfolge. Aber ich weiß es nicht. Das könnte ein Zeiger zu einem anderen String auf dem Stack als auch. Ja. STUDENT: Ich weiß, dass es nötig ist Speicher zuweisen, wenn der Zeiger immer innerhalb erklärt einer anderen Funktion. Wissen Sie, das Gleiche zu tun, wenn es brauchen im Inneren des Haupt erklärt, Sie verwenden es in der Haupt? JASON HIRSCHHORN: Also ja. Sie können einen Zeiger zu einem erklären Speicheradresse im Speicher. Es kann die Speicheradresse eines lokal Variable, wenn auch oft, Menschen nicht erklären Speicheradressen auf lokale Variablen, weil sie gehen weg, sobald die Funktion gibt, die Deshalb haben wir in der Regel malloc Dinge. Aber ja, könnten Sie einen Zeiger deklarieren zu einem anderen lokalen Variablen. Es ist einfach in der Regel nicht getan. Aber ich kann einen Blick auf das zu nehmen bestimmte Sache nach dem Unterricht. Ja. STUDENT: Ich denke, das ist eine Art von dem, was gefragt. Es scheint seltsam zu werden initialisiert ein Zeiger nicht als Adresse, sondern als das, was scheint wie ein Wert. Es scheint, wie der CS50 ist, was drin ist die Sache an und wies darauf nicht die tatsächliche Adresse, oder? JASON HIRSCHHORN: Also das ist nicht der Fall ist, wenn. Das ist nicht, was passiert. Wenn Sie eine char-Sterne erklären, es ist eine Speicheradresse. Alle Zeiger sind Speicheradressen auf etwas anderes. Das ist etwas anderes könnte auf die sein Stapel, aber fast immer ist auf die Haufen in der Art, wie wir sehen werden sie verwendet. Aber string gleich doppelte Anführungszeichen "Getstring," können wir sehen, dass wir kann über das aussehen und Code,. getstring String wird nicht in gespeichert dass variable, oder was auch immer der String Name wird nicht gespeichert, dass Variable, denn das ist nicht, wie Hinweise zu arbeiten. Heißt das Sinn? STUDENT: Ja. JASON HIRSCHHORN: OK. Hoffentlich war das nicht verwirrend für jeden. Aber wenn es war, können wir noch einmal anschauen ein bisschen, weil wir eigentlich los etwas, das hoffentlich codieren Arbeit mit Strings und Ihnen helfen, sich wohler mit ihnen. Alle anderen Fragen im Zusammenhang mit diesen Themen oder andere Themen, die Ich werde bis zurück zu setzen? Und - jetzt. Ja, Alden. ALDEN: Also das ist völlig unabhängig, aber wir können gehen Sie einfach über wirklich schnell, was wir wissen müssen um die Differenz zwischen einem 32 und 64-Bit-Maschine? JASON HIRSCHHORN: Ja. Also 32 Bit ist, wie viele Bytes? ALDEN: Es ist vier Bytes. JASON HIRSCHHORN: Es ist vier Bytes. Und 64 Bit ist, wie viele Bytes? STUDENT: Eight. JASON HIRSCHHORN: Acht Bytes. Also noch einmal, ist acht Bit ein Byte. Ihr Gerät ist CS50 ein 32-Bit-Rechner. So dass die Speicheradressen vier Bytes lang. Es gibt 2 bis 32 Speicheradressen. 0 bis 2 um 32 minus 1 ist. Und ich bin nicht positiv, aber das ist wahrscheinlich der Umfang dessen, was Sie brauchen weiß, für eine 32-Bit-Computer, dass der Speicher Adressen sind wiederum vier Bytes lang, und das ist die maximale Menge von Speicheradressen. Auch Datentypen - Dies könnte etwas wie sein auch das ist bemerkenswert. Die Größe eines Datentyps hängt die Maschine mit dem Sie arbeiten. So ein Zeichen, ein einzelnes Zeichen, ist, wie viele Bytes auf unserer CS50 Gerät? Ein Byte. Und es ist tatsächlich ein Byte als auch auf einem 64-Bit-Rechner. Und die meisten Datentypen die gleiche Anzahl von Bytes auf beiden Maschinen. Aber einige Datentypen wird anders sein auf beiden Maschinen. Damit würde möglicherweise sein, die einzige, was Sie wissen müssen. Aber auch das, denke ich, jenseits der Grenzen - Ich bin mir fast sicher, wenn Sie zurückblicken am alten Quiz, sagt sie, übernehmen für Codierung Probleme, die Sie verwenden ein 32-Bit-Rechner. Aber es gibt, zu gehen zusammen mit der in Falls Sie interessiert sind, gibt es Datentypen, die die gleichen sind Größe für alle Maschinen. Wenn Sie so etwas gesehen habe uint32_t, können Sie oder auch nicht gesehen haben, dass. Das ist ein Datentyp. Das ist zu sagen, sein 32 Bit egal was diese Maschine ist. Also, wenn die Leute schreiben, tragbare Code, sie wird wahrscheinlich nicht verwenden ints. Sie werden stattdessen diese Daten Typen, die sie wissen, werden die gleichen Größe auf jeder einzelnen Maschine. Madhu. Madhu: Ich hatte eine Frage zu der Prozess Zusammenstellung. Also, wenn Sie ein Programm schreiben, nutzt du eine Bibliothek wie CS50 oder etwas so, ich weiß, dass diese Bibliothek zu einem bestimmten Zeitpunkt sein, kompiliert und gelinkt in. Doch wie viel passiert, dass während die Zusammenstellung des Programms? Welcher Teil dieser Bibliothek Prozess tritt auf, wenn Sie Erstellung eines eigenen Programms? JASON HIRSCHHORN: Also gehen wir über allgemein die Schritte dieses Verfahrens. Sie schreiben Ihre. C-Datei. In Ihrem. C-Datei können Sie Ihre # include Header-Bibliotheken, z. B. cs50.h. Was bedeutet, dass scharfe gehören Linie, um Ihr Programm zu tun? Akchar. AKCHAR: Es fügt die Prototypen der die Funktionen aus dem Header Dateien, die in den Bibliotheken. JASON HIRSCHHORN: Genau. Sie fügt hinzu, diese Funktionsprototypen Ihren Code. Also, wenn Ihr Code wird in kompilierter die frühen Stadien, weiß der Compiler dass diese Funktionen wirklich existieren, und dass sie irgendwo definiert. Die. H-Dateien enthalten nicht die Definitionen für diese Funktionen, oder wie sie tatsächlich arbeiten. Cs50.h umfasst nur etwas, das sagt getstring ist eine echte Sache, dass kann passieren. Und standardio.h sagt printf ist eine echte, was passieren kann. Also Ihr C-Sprache mit diesem. Header Datei wird in einige einge maschinenlesbaren Code, schließlich die wird in binäre gedreht Code, 0 und 1 ist. Und das ist der Code, der letztlich wird ausgeführt. Das-l-CS50 Linie - zum Beispiel, wenn Sie schreiben Clang sind - und dann zählen CS50-l, Sie schreiben, dass in. Und Sie sehen, dass. Wenn Sie schreiben machen, werden Sie sehen, dass Line-Up hier. Und das werden wir in einem zweiten zu sehen, wenn wir codieren oder später, wenn wir Code. Aber das l-CS50 Linie etwas tut ein bisschen anders als die # include cs50.h. Was bedeutet, dass l-CS50 Linie tun? Avi? AVI: Ich möchte sagen, dass es Links Die Bibliothek der Funktion rufen, wie die. o-Dateien. JASON HIRSCHHORN: Also sehr Nähe, wenn nicht Spot-on. Das-l-CS50 ist der binäre Datei und verschmilzt sie mit der Binärdatei. So cs50.h, es gibt keinen Punkt beim Drehen cs50.h von C-Sprache, jeden binär Mal es verwendet wird. Das wäre dumm, denn das würde eine Menge Zeit zu verschwenden. So wurde bereits kompiliert und in eine ausführbare gedreht. Und jetzt ist es werde zusammengeführt werden mit der Datei am Ende. Also diese 1 und 0 gehen um mit Ihren diejenigen zusammenführen und 0 am Ende. So, jetzt werden Sie tatsächlich haben die tatsächlichen 1 und 0, wie getstring zu definieren, arbeitet zum Beispiel, oder wie printf, beispielsweise funktioniert. Und für weitere Informationen, gibt es eine Kurz Compiler, die Nate gibt, dass Sie sollten überprüfen, das geht durch diese Schritte. Aber - Ja. STUDENT: Sind sie immer in o-Dateien. wenn sie in der Bibliothek Form sind, bereit, zusammengeführt werden, verknüpft - wie sie in den binären Code sind? JASON HIRSCHHORN: OK. Was - STUDENT: Ist das immer der Fall die Bibliotheken, wenn Sie sie verlinken? JASON HIRSCHHORN: Ja. Also gibt es. S-Dateien, die sein wird, Maschinencode, der auch sein wird kryptisch zu Ihnen. Sie müssen nicht über diejenigen zu kümmern. Aber im Allgemeinen, ja, sie werden sein. o Dateien bereit zu gehen. STUDENT: Also, wenn Sie zu versenden eine Bibliothek, versenden Sie nur die. h und die. o? Sie liefern nicht die. C oder. S. JASON HIRSCHHORN: So - und das ist in dieser kurzen als auch, wenn diese Information scheint zu sein, kommt eine wenig schnell. Aber die kurz auf Compiler Gespräche über dies auch. Wenn Sie eine Bibliothek Schiff, wenn Sie versenden die. h, die Header-Datei, die Funktionsprototypen und die 1 und 0 ist, das ist alles, was Sie brauchen. Sie brauchen nicht zu geben, wie die Funktion ist, die. c-Datei. Weil der Punkt der Abstraktion oder die Punkt APIs, der Punkt, an diesem SPL, die Stanford tragbare Bibliothek, ist es damit Sie sich keine Sorgen, wie neue GRect funktioniert, oder wie Arbeiten bewegen, oder wie Werke hinzufügen. Alles, was Sie wissen müssen, ist, dass Add ist eine Funktion, die Sie verwenden, und es tut dies. Damit Sie wirklich brauchen nicht zu wissen, wie es ist in C geschrieben, Sie brauchen nur zu kennen, hier sind die Funktionen, was sie zu tun, und hier sind die 1 und 0 wenn Sie wirklich diese nutzen möchten. Kühl. Haben Sie weitere Fragen zu Compilern oder andere Themen auf dem Brett? STUDENT: Ich habe eine Frage Umsetzung der rekursiven Funktionen. Eine Frage, über Rekursion. Ich hatte das Gefühl, die kommen würden. Lassen Sie uns also schnell durch gehen Rekursion mit einem bestimmten beispielsweise ein Fakultätsfunktion. Denn dies ist ein Beispiel, kommt oft nach oben oder verwendet Rekursion zu veranschaulichen. So "4!" als 4 faktorielle lesen. Und was bedeutet 4 faktorielle das? Was bedeutet das? Wie sehen Sie 4 Fakultät berechnen? 4 mal 3 mal 2 mal 1. Also ein weiterer Weg, um 4 faktorielle schreiben ist, dies zu schreiben. 4 mal 3 Fakultät. Da 3 Fakultät ist 3 mal 2 mal 1. Also 4 mal 3 Fakultät ist 4 mal 3 mal 2 mal 1. Deshalb Fakultät ist eine große Kandidat für Rekursion, denn es ist klar, dass es etwas gibt, passiert immer und immer und immer für ein kleineren Anzahl von Dinge, bis Sie das Ende erreichen. Wenn Sie 1 zu erreichen, 1 1 Fakultät ist. Man kann nicht viel weiter gehen. 0 faktorielle wird auch als 1 definiert. Also, wenn Sie auf 1 oder 0 zu bekommen, sind Sie am Ende, und Sie können starten Sie gehen wieder nach oben. Wenn wir also eine rekursive schreiben wollte Funktion, um eine Fakultät zu berechnen, wir werden einige schreiben Pseudocode für diesen jetzt. Bevor wir schreiben, dass Pseudocode - Ich werde euch geben, ein paar Minuten um den Pseudo-Code zu schreiben oder einfach nur denken, darüber - es gibt zwei Dinge, die jeder rekursive Funktion braucht. Was sind diese beiden Dinge? JACK: Es muss sich selbst aufrufen. JASON HIRSCHHORN: Noah? Oh, Jack. Gehen Sie voran. JACK: Es muss sich selbst aufrufen. JASON HIRSCHHORN: Also eine rekursive Funktion muss einen rekursiven Aufruf, ein anrufen, um sich. Das ist einer. Und was ist der andere? JACK: Ein Basisfall. JASON HIRSCHHORN: Eine Basisfall. Eine Basis Fall ist, hier ist, wenn wir aufhören. Also Ihre Funktion aufgerufen wird. Der Basisfall kommt zuerst. Sie wollen wissen, ob Sie am Ende sind. Und wenn Sie nicht am Ende, Sie Ihre rekursiven Aufruf. Und Sie durch diese Funktion wieder zu gehen, überprüfen Sie nochmals Ihre Basisfall. Wenn Sie das Ende sind nicht, Sie machen ein weiterer rekursiven Aufruf, et cetera, et cetera. Das ist, warum immer rekursive Funktionen brauchen diese Grundfälle und die rekursive Aufrufe. Wenn Sie nicht über einen rekursiven Aufruf haben, ist es würde eine rekursive Funktion nicht sein. Wenn Sie nicht über einen Basisfall, Sie für immer gehen würde und gäbe es kein Ende geben. Und die Basisfall kommt immer zuerst, weil Sie immer überprüfen wollen, wenn du am Ende bist zuerst. Also, bevor wir etwas Pseudocode, warum Sie nicht eine Minute, um zu denken wie eine rekursive Funktion Fakultät geschrieben würde? Auch, wie viele, wie Sie tun, schriftlich Um sie auf einem Blatt Papier was du zu haben sind Aktivitäten an der Quiz morgen. Also wahrscheinlich gute Praxis zu machen sicher, dass der Code, den Sie gerade schreiben unten auf Blatt Papier - oder Sie können das tun. Sie wissen, wo die Semikolons sind. Sie erinnern sich an die Syntax. Weil du nicht in der Lage zu haben, ein Compiler sagen, einen Fehler gemacht. Auch in diese Richtung, morgen, wenn Sie Codierung haben Probleme, wenn Sie für Zeit gehetzt, oder wenn Sie sehr , wie du zu verwechseln sollte schreiben die bestimmte Sache in C, es würden Sie gut beraten, zu pseudo-Code schreiben oder Kommentare zu schreiben, in als gut. Denn es gibt einen Teil des Kredits für ein Viele der Fragen, die auf der Quiz. So könnten Sie sich gehetzt werden, oder Sie könnte nur verwechselt werden. Schreiben in den Kommentaren oder Pseudo-Code sind oft Möglichkeiten, die Sie kann einen Teil des Kredits zu bekommen. So etwas nicht verlassen leer auf dem Quiz. Es gibt keine Strafen für die Dinge in. In der Tat, setzen in Pseudo-Code oder Kommentare wird den Klässler helfen herauszufinden, ob Sie wirklich wissen, was Sie reden, und vielleicht preis Sie einige teilweise Gutschrift dafür. Auch in diese Richtung, deutlich schreiben. Wenn wir nicht wirklich das, was du schreibst, wir werden nicht anruft um Mitternacht morgen Figur Sie heraus, was Sie geschrieben haben. Wir sind gerade dabei, off-Punkte zu nehmen. Schreiben Sie klar, damit wir hören, oder besser gesagt, wir können lesen, was Sie geschrieben haben. Und wenn er sagt, zwei Sätze, schreiben Sie nicht einen Absatz. Folgen Sie den Anweisungen. Schreiben Sie klar. Und in den Kommentaren schreiben oder Pseudocode für Fragen, die konnte Auszeichnung Teil Kredit. OK, lass uns gehen, um factorial. So haben wir eine Funktion Fakultät. Wenn ich dies schreibe eigentlich in C, was muss ich vor den Namen setzen der Funktion? Der Rückgabetyp, der in diesem Fall, werden wir es geben int. Und dann innerhalb der geschweiften Klammern ist was sich innerhalb der geschweiften Klammern für eine Funktion? STUDENTEN: Argument-Typ. JASON HIRSCHHORN: Seine Argumente. So wird wohl Fakultät ein Argument. Es wird wahrscheinlich nur ein Argument. Und wir sagen, es nehme x eine ganze Zahl bezeichnet. Und wieder, beim Schreiben den Prototyp eine Funktion oder ein Schreiben der Funktion im Code, bevor es zu definieren, können Sie schreiben, den Datentyp und den Namen des diese Variable nur für diese Funktion. So können Sie eine bestimmte Anzahl in diesen Pass Funktion, wird es als x bezeichnet werden intern. Wir haben unsere Fakultätsfunktion. Wir müssen zwei Dinge, einen Basisfall und einen rekursiven Aufruf. Was ist der Basisfall für die Fakultät? Jemand, der es schrieb, und wer nicht noch nicht gesprochen, was ist die Basis Fall für faktorielle? STUDENT: Wenn n kleiner ist als 2, 1 zurückzukehren. JASON HIRSCHHORN: Wenn n weniger als 2, 1 zurückzukehren. Ich mag, dass, weil das nimmt 0 und 1 ist. Also werden wir x <2 tust, bringe ein. Wenn wir uns weitergegeben 0, wenn wir 1 bestanden, wird diese Funktion sofort wieder ein. Wenn wir uns etwas Zahl größer geben als oder gleich 2 ist, werden wir haben unsere rekursiven Aufruf. Und wie ist das so funktionieren? Kann jemand anderes, der daran gearbeitet , die noch nicht gesprochen mir die rekursiven Aufruf für diese Funktion in Pseudocode? Wenn wir uns in einer Zahl x geben und größer als 2 ist, was wollen wir tun? Wir haben auch ein Beispiel für die schriftliche Seite, die Ihnen einen Hinweis geben könnte. STUDENT: Rufen Sie x-mal die Fakultät von x minus 1? JASON HIRSCHHORN: Genau richtig. Wir werden x-mal zurück die Fakultät von x minus 1. Und dass, obwohl ich schrieb, im Grunde, was Sie in Englisch gesagt, Diese Funktion Fakultät wieder aufgerufen. Es wird auf minus 1 x auszuführen. Es wird mit einigen Ganzzahl zurück, und dann wird es diese beiden multiplizieren zusammen, und dieser Wert wird zurück, was auch immer diese genannt Fakultäts-Funktion, die Macht ist ein weiteres Beispiel für Diese Fakultätsfunktion. Damit ist ein Beispiel eines rekursiven Funktion, eine sehr einfache rekursive Funktion. Aber die meisten von ihnen werden so sein. Wenn Sie möchten, eine gute rekursive für das Quiz herausfordern, versuchen Codierung binäre Suche rekursiv. Denn wenn man binäre Suche für tat Problem drei gesetzt, werden Sie wahrscheinlich haben es iterativ in einer while-Schleife. Aber es kann auch geschrieben werden rekursiv. Sie gehen zu müssen, um ein eigenes zu schreiben separate Funktion, die einige nimmt verschiedenen Kommandozeilen-Argumente - oder nicht Befehlszeilenargumente, einige andere ganz normale Argumente. Aber man konnte binäre Such schreiben rekursiv auch. STUDENT: So haben Sie auch geschrieben haben könnte, anstelle von x minus 1, Sie könnte auch geschrieben haben x minus minus, oder Sie haben könnten geschrieben minus minus x. Können Sie sich wirklich schnell erklären, warum diese würden verschiedene Dinge sein, wie das, was der Unterschied ist zwischen x minus minus minus minus x und? JASON HIRSCHHORN: Nein, ich bin nicht werde darauf eingehen. Aber ich werde mit Ihnen darüber zu sprechen, nachdem Klasse. x minus minus minus minus x x um 1 verringern. Aber sie tun es ein bisschen anders. Aber ich möchte nicht darauf eingehen. Andere Fragen zu Rekursion oder diese Funktion? Das ist nicht wirklich, auch Pseudocode. Das ist im Grunde der Code in C Sie dafür schreiben würde. OK, andere Fragen über Themen hier? Ja. STUDENT: Ich habe einen schnellen Überblick über Floating-Point und Präzision. JASON HIRSCHHORN: Floating Punkt und Präzision. Kann jemand wirklich schnell geben Sie mir einen Überblick über Floating-Point und Präzision? Sie alle, dies für Ihre zu tun hatte Problem eingestellt, so dass Sie alle mit ihm vertraut. Oder vielleicht auch nicht alle. Anyone? Geben Sie mir eine Stelle begonnen. Floating Point und Präzision. Was ist das Problem? Ja. Victoria? VANESSA: Vanessa. JASON HIRSCHHORN: Vanessa. Entschuldigung. VANESSA: Es gibt nur eine endliche Anzahl von Zahlen, die dargestellt werden können, weil Sie auf einem, bist unser Fall eine 32-Bit-System. So können Sie Art müssen machen einige Zahlen. JASON HIRSCHHORN: Also das ist genau richtig. Es gibt nur eine bestimmte Menge von Zahlen, die dargestellt werden können. Wenn Sie vermehren sich zwei sehr große Zahlen, es könnte die Menge OVER der Leerzeichen zu vertreten haben eine ganze Zahl ist. Das ist, warum manchmal verwenden wir ein lange lange anstelle eines int. Das hat mehr Räume. Das kann eine größere Anzahl zu halten. Fließkomma Präzision hat damit zu tun, das, sondern hat auch mit der zu tun Tatsache, dass Dezimalzahlen sind nicht immer vertreten. Entschuldigung. Lassen Sie mich diese wieder auf. Die Dezimalzahl 1.0 ist nicht immer wie Sie vertreten würde erwarten, 1,000000000. Es wird manchmal als dargestellt 1,000000001 oder 0,999999999. Es könnte sogar 89 geworfen werden dort irgendwo. Also diese Dezimalzahlen nicht genau wie Sie es dargestellt erwarten, dass sie dargestellt werden. So in Problem-Set - waren es zwei? - Problem zwei gesetzt, in dem wir zu tun Fließkommazahlen, wenn wir wollten, sie repräsentieren genau das, was wir wollten, sie repräsentieren die Anzahl Pfennige, oder die Anzahl der Cent, wir sie mit 100 multiplizieren. Wir rundeten sie. Und dann schneiden wir alles hinter dem Komma. Das war, um sicherzustellen, dass sie es tatsächlich gleich genau, was wir wollten sie entsprechen. Weil, wenn Sie etwas zu nehmen, das ist Ein Schwimmer und es in einen int, Sie schneiden Sie alles rechts dem Komma. Denn es gibt einige Gleitkomma Ungenauigkeit, 100.000 sein könnte als 99,999999999 vertreten. Und wenn Sie gerade auf alles zu schneiden das Recht sofort, du gehst zu die falsche Nummer. Ja. STUDENT: Ich hatte eine Frage über Gießen. Was bedeutet es in Ordnung kommen? Wenn Sie möchten Schwimmer tun, Konsolen, 1 geteilt 10, ist es nicht ein, geteilt durch 10, erhalten dann 0,1, dann drehen es in ein Schwimmer? JASON HIRSCHHORN: Wenn Sie das tun Schwimmer 1 geteilt durch 10 - STUDENT: Ja, und dann gleich - Nun, normalerweise wäre es haben es in gleich - Ja. Sie wollen es ein Schwimmer zu machen, oder? JASON HIRSCHHORN: OK, so dass wir zu gehen verwenden, um herauszufinden, in segue die Antworten auf diese Fragen durch Codierung. Da Sie wahrscheinlich eine Menge von diese kleinen Fragen, und ein guter Weg, um sie zu lösen, ist durch Codierung. So werden wir dieses Recht jetzt codieren, und dann werden wir zurückgehen und codieren die Frage, die Sie hatten. Also die erste Zeile - Ich hätte es nicht geschrieben haben - was ist das erste, was wir tun wollen, wenn wir öffnen, eine neue Datei in gedit? STUDENT: Fügen. JASON HIRSCHHORN: Fügen Sie was? STUDENT: CS50-Bibliothek. JASON HIRSCHHORN: OK. Was sollten wir sonst gehören? Wir sind gerade dabei, zu überprüfen, was passiert, wenn Sie etwas gegossen, um einen Schwimmer. Aber was müssen wir schließen, wenn wir gehen, um ein C-Programm schreiben? STUDENT: Standard-I / O. JASON HIRSCHHORN: stdio.h. Wir haben eigentlich nicht brauchen, denn diese Programm, cs50.h, auch wenn es immer hilfreich, um es aufzunehmen. Aber wir müssen immer stdio.h. STUDENT: Bei der Codierung in C? JASON HIRSCHHORN: Bei der Codierung in C Also ich speichern Sie es als dieses. C-Datei. Ich bekomme ein paar nette Syntax-Highlighting. Ich schrieb Leere in main. Was ist nichtig das? STUDENT: nimmt keine Befehlszeilenargumente. JASON HIRSCHHORN: entfällt bedeutet in diesem Fall Hauptübernimmt keinerlei Befehlszeilenargumente. In anderen Fällen ist die Funktion nicht stattBefehlsZeilenArgumente. Oder die Funktion, wenn ich die Leere schreiben main (void), wäre das Haupt sagen nichts zurück. So nichtig bedeutet nur nichts. Was würde ich schreiben, wenn ich nehmen Kommandozeilen-Argumente? STUDENT: int Bogen c-Schnur Bogen v. JASON HIRSCHHORN: int argc argv String. Ist das richtig? STUDENT: Es ist char argv Sterne Klammern. JASON HIRSCHHORN: Also könnten Sie schreiben String argv Klammern oder char argv Sterne Klammern, aber Sie müssen die Klammern. Da argv ist ein Array von Strings, erinnern. Es ist nicht nur ein String. So String argv ist, hier ist ein String argv genannt. String argv Klammern, hier ist ein Array von Strings. So int argc String argv Klammern wäre etwas, das ich würde wahrscheinlich schreiben. Also wollten Sie in einem Integer zu retten? STUDENT: Ja, integer. Oder in einem Schwimmer. JASON HIRSCHHORN: In einem Schwimmer? Wie, float x gleich 1 geteilt durch 10. JASON HIRSCHHORN: OK. Wie drucke ich einen Schwimmer in printf? Was? STUDENT:% f. JASON HIRSCHHORN:% f. Was ist eine ganze Zahl? d oder i. Was ist ein String? STUDENT: s. JASON HIRSCHHORN: s. Wie bekomme ich eine neue Linie? STUDENT: Backslash n. JASON HIRSCHHORN: Was muss ich zurück wenn der Hauptläufe korrekt? STUDENT: 0. Muss ich diese Zeile schreibe, obwohl? STUDENT: Nein. OK, werden wir nicht schreiben, dann. Kann jeder das gelesen? Es sieht ein bisschen klein. Kann jeder sehen, oder sollte Ich mache es größer? Ich denke, für die Kamera, wir machen es ist ein bisschen größer, aber. JASON HIRSCHHORN: Wenn ich will, kann das deaktiviert . C in eine ausführbare Datei, was schreibe ich? STUDENT: Make-Test. JASON HIRSCHHORN: Es tut uns leid? STUDENT: Make-Test. JASON HIRSCHHORN: Make-Test. Wir redeten diese Linie früher. Clang. Was ist Klang? Der Name des Compilers. Was ist diese Linie? STUDENT: Stellt es für die Verwendung von GDB. JASON HIRSCHHORN: Sets es für die Verwendung von GDB. Diese Linie, was ist das? STUDENT: Source Code. JASON HIRSCHHORN: Das ist die Quelldatei, die. c-Datei. Was haben diese beiden Linien zu tun? Oder diese beiden Linien nicht. STUDENT: Sie nennt es testen. JASON HIRSCHHORN: Also der Strich o sagt, nennen Sie es etwas anders. Und hier nennen es Test. Wenn ich es nicht haben, dass, was würden Sie nennen das? STUDENT: A.out. JASON HIRSCHHORN: A.out. Was hat das zu tun? STUDENT: Verknüpft die Mathematik-Bibliothek. JASON HIRSCHHORN: Es verbindet in der Mathematik-Bibliothek. Wir haben nicht die Mathematik-Bibliothek, aber denn das ist so üblich, haben sie geschrieben machen, um immer auch die Mathematik-Bibliothek. Und ebenfalls zählt der CS50-Bibliothek. OK, also, wenn wir verzeichnen, haben wir jetzt eine ausführbare Datei namens Test. Um es auszuführen, schreibe ich Test. Ich sehe, dass meine Gleitkomma wie erwartet, gleich 0 ist. Ist das - so - STUDENT: Dann wenn du jetzt schweben, wie Sie es gegossen wie float - JASON HIRSCHHORN: Guss die ein mit einem Schwimmer? STUDENT: Nein, warf die volle Sache - ja. Wenn Sie nur das täte, würde dass es 0,1? JASON HIRSCHHORN: OK, so wirklich schnell, 1 geteilt durch 10, das sind Zahlen geteilt. Also, wenn Sie ganze Zahlen teilen, sind sie 0, und du bist Einsparung, die 0 in eine schwimmen, weil der Schrägstrich ist nur Integer-Division. So, jetzt sind wir etwas drehen in einen Schwimmer. Mal sehen, was passiert. Wir werden ausgefüllt. So, jetzt sehen wir, dass die Schrägstrich nicht Integer-Division, es schwebte Punkt Division. Weil eines ihrer Argumente hatte mit einem Schwimmer gegossen. So, jetzt wurde es zu sagen, behandeln diese Aufteilung, wie wir es zu tun haben schwimmende Punkte, nicht mit Zahlen. Und so erhalten wir die Antwort, die wir erwarten. Mal sehen, was passiert - oops. Wenn ich mehr Dezimalstellen drucken wollte Flecken, wie könnte ich das tun? STUDENT: Punkt Punkt f, oder so viele Dezimalstellen wie Sie wollen. JASON HIRSCHHORN: Also ich drucken 10 Dezimal-Stellen. Und wir sehen jetzt bekommen wir einige seltsame Sachen. Und das geht zurück zu Ihrer Frage über Gleitkomma-Ungenauigkeit. Es gibt seltsame Dinge hier gespeichert. OK, ist, dass Ihre Frage beantworten? Was haben Sie sonst noch wollen schnell zu kodieren? STUDENT: Ich wollte nur sehen, ob nicht, wenn Sie sich einige Zeiger befreit, ob der Zeiger noch immer gespeichert es die Adresse, was es war , die auf zuvor. JASON HIRSCHHORN: OK, also lasst uns das tun. Char Sterne ptr, schafft dies eine Variable ptr vom Typ char Sterne bezeichnet. Wie schreibe ich malloc? Alden? ALDEN: Nur malloc. Aber dann muss es Größe sein und in diesem Fall, ich denke, du würdest werden, die auf char. Also, es wäre char sein. JASON HIRSCHHORN: OK, so dass mehr generisch, Inside - wir bearbeiten. Innerhalb malloc, die Zahl wollen Sie von Bytes auf dem Heap. Generell was wir gesehen haben, dass wir tun, ist, wir werden malloc Zeichenfolgen, zum Beispiel, oder Arrays von ganzen Zahlen. Also, wenn wir wollen, 10 Ganzzahlen oder 10 Zeichen, 10 wird uns 10. Und dann Größe der Zeichen geben würde, uns, dass die Größe der Zeichen, die in In diesem Fall ist 1 Byte. Wir bekommen 10 Byte. Wenn wir die Größe von int zu schreiben, , dass würde uns 40 Byte. Also mehr generisch, innerhalb von malloc ist die Anzahl von Bytes, die Sie wollen. In diesem Fall bekommen wir 1 Byte. Welche scheint wie eine seltsame Verwendung von malloc, aber für unsere Zwecke sinnvoll ist. Es gibt also, dass. Wir werden frei nennen. Wir bekommen es los und wir wieder verwenden ptr. Und was haben Sie prüfen wollen? STUDENT: Ich wollte nur zu prüfen, ob oder nicht, war alles andere darin. JASON HIRSCHHORN: Also, ob darauf hingewiesen, alles zu? STUDENT: Ja, genau, ob es hatte noch eine Speicheradresse. JASON HIRSCHHORN: Sie wollen also um den Wert von ptr überprüfen? STUDENT: Ja, genau. JASON HIRSCHHORN: Was ich hier schreibe, wenn ich den Wert der zu überprüfen Punkt - was ist, Jordanien sagte, der Wert? Oder, was im Inneren des ptr gespeichert? STUDENT: Eine Speicheradresse. JASON HIRSCHHORN: Eine Speicheradresse. Also, wenn ich schreibe nur das, es werde gib mir den Wert von ptr. Und wie kann ich ausdrucken eine Speicheradresse? Was ist der Format-String für eine Speicheradresse? STUDENT:% p. JASON HIRSCHHORN:% p. % S ist ein String. % P für Zeiger. Ist das richtig? Das ist richtig. So ptr gleich - es hat immer noch etwas in ihm. Dies ist wahrscheinlich ein interessante Frage. Was macht diese Linie zu tun? STUDENT: Seg Fehler. JASON HIRSCHHORN: Was? STUDENT: Ich denke, es seg Fehler. JASON HIRSCHHORN: Hm? Student: Ich denke, es wird Fehler Seg. JASON HIRSCHHORN: Also diese Linie Code Sterne ptr, was hat der Stern das? STUDENT: Inhalt. JASON HIRSCHHORN: Ja. Gehen Sie auf den Inhalt zu bekommen. Also, das wird auf den Speicher gehen Adresse dort und mir geben, dass. Ich habe% c hier, weil es Zeichen werden dort gespeichert. So werden wir an diese Adresse gehen wir gerade gesehen haben - oder es wird wahrscheinlich ein bisschen anders diese Zeit, die wir das Programm ausführen. Aber wir werden an diese Adresse gehen was wir wissen, noch existiert und sehen, was da ist. So dauerte es nicht seg Schuld. Es ist einfach nicht geben uns nichts. Es könnte uns tatsächlich gegeben haben etwas, wir können es nicht sehen. Und das geht auf diese Idee - und wir werden nicht zu viel in zu erhalten dies, weil das ist, über die Rahmen dieses Kurses. Aber wir sprachen hier, wenn wir ging über die Grenzen des Arrays durch 1, können wir nicht in Schwierigkeiten bringen könnten. Manchmal, wenn Sie gerade gehen durch 1, Sie etwas falsch zu machen, und Sie könnte in Schwierigkeiten geraten. Aber Sie müssen nicht immer in Schwierigkeiten zu bringen. Es hängt davon ab, wie viel von einer schlechten Sache, die Sie Sie, Sie gehen, um in Schwierigkeiten zu bringen. Was nicht heißt, sein schlampig mit Ihrem Code. Aber es ist zu sagen, wird das Programm nicht immer zu beenden, auch wenn Sie irgendwo hingehen Sie sollen nicht zu gehen. Ein gutes Beispiel dafür ist, eine Menge von Menschen in ihren Problem-Set 3, die 15 wurde, nicht überprüfen Grenzen des Vorstandes. So können Sie schaute nach links, schaute auf die rechts, schaute nach oben, sah nach unten. Aber du hast nicht überprüfen, ob die oben war eigentlich los, um auf dem Board sein. Und eine Menge Leute, die das getan hat und gestellt, dass in, arbeitete ihr Programm perfekt, da, wo das Bord war gespeichert, wenn Sie einen ging darüber oder überprüft, dass der Speicher Adresse, es war nicht alles besonders schrecklich darüber, so dass Ihr Programm nicht werde dich schreien. Aber wir haben noch Entnahmestellen würde, wenn Sie nicht überprüfen, dass, weil Sie wurden etwas, was Sie nicht tun, waren tun soll, und Sie haben könnten in Schwierigkeiten gebracht. Quoten sind, obwohl Sie wahrscheinlich nicht. Das ist also zu zeigen, dass, ja, wir können immer noch zu ihm zu gehen. Und wir sind nicht immer in Probleme in diesem Fall. Wenn wir versucht zu tun, lesen Sie die nächsten 100 Zeichen, würden wir vermutlich in Schwierigkeiten geraten. Und Sie können Code-Lese die nächsten 100 Zeichen, wenn Sie, indem Sie einige wollen Art for-Schleife. Ja. STUDENT: Da wir zugewiesen wurden, dass Raum ein Ist-Wert, würden wir nicht tatsächlich in der Lage, etwas zu sehen sein. Sollten wir versuchen es mit der Einstellung, dass gleich c oder so etwas? JASON HIRSCHHORN: Gute Frage. Wie kann ich diesen Wert - welcher Codezeile schreibe ich auf der Leitung sieben zu tun, was Sie gesagt haben? STUDENT: Star ptr gleich Einzel Zitat C Ende Apostroph. JASON HIRSCHHORN: Also, setzen ein Zeichen, c, an dieser Stelle, weil wieder, dass Sterne bedeutet gehen, um dort. Und wenn auf der linken Seite verwendet ein Zuweisungsoperator, das entspricht unterzeichnen, werden wir nicht zu bekommen, dass Wert, so viel wie Sie diesen Wert gesetzt. Nun wollen wir sehen, was passiert. Wir haben dort etwas und es war da. Wir nannten kostenlos. Einige Sachen wahrscheinlich passiert auf dem Heap. So ist es nicht mehr da. Aber noch einmal, wir sind nicht immer Ärger dorthin zu gehen. Ich tue dies in Code, um zu veranschaulichen dass eine Menge von diesen Fragen, die Sie haben, sind sie wirklich interessant beantwortet eine Menge Zeit. Und sie sind wirklich gute Fragen. Und man sie herausfinden können, auf Ihre eigenen, wenn, zum Beispiel, wir sind nicht im Schnitt. Ja. STUDENT: Weil Sie nicht das Senden sind die Zeiger überall, wollen Sie brauchen malloc verwenden? JASON HIRSCHHORN: Also das geht zurück zu Ihrer ersten Frage. [? ?] Ist es nur eine lokale Variable? Malloc hier ist nicht so überzeugend. Die Verwendung von malloc hier nicht dass überzeugende, weil es nur eine lokale Variable. STUDENT: So könnte man tun, char Sterne ptr gleich hallo? JASON HIRSCHHORN: Oh. Also werden wir jetzt wieder zu Ihrer ersten Frage. Ich denke, dass Sie nicht zufrieden waren mit meiner Antwort. OK? Wie das? STUDENT: Ja. Warten. JASON HIRSCHHORN: Und wo Sie ausdrucken möchten? Also werden wir einen String so ausdrucken? STUDENT: Interessant. JASON HIRSCHHORN: Also sagt das diese Argument des Typs eines Zeichen. So sollte dies ein Zeichen sein. STUDENT: nimmt einfach die erste. JASON HIRSCHHORN: Also das ist das, was ich schon sagte. Wie ich schon sagte, es ist nicht die Speicherung Zeichenfolge innerhalb Variablenzeiger. Es ist die Speicherung - STUDENT: Der erste Wert der Zeichenfolge. JASON HIRSCHHORN: Die Adresse der erste Wert des Strings. Wenn wir drucken diese waren, sind wir immer den Wert innerhalb Zeiger. Und wir werden sehen, es ist in der Tat eine Speicheradresse. Heißt das Sinn? Entschuldigung. Bitte warten, heißt das beantworten Ihre Frage, wenn? STUDENT: Ja. JASON HIRSCHHORN: Diese Codezeile ist Schaffung eines String und dann ein anderes Variable Zeiger, ist zeigen zu dieser Schnur, dass Array. Ja. STUDENT: Also, wenn wir gingen eine Speicher Adresse weiter, würden wir die h zu bekommen? Hat sie als Zeichenfolge gespeichert worden? JASON HIRSCHHORN: Wie, wir haben - so ist dies wertvolles zu tun. Dies ist Arithmetik, welche euch zuvor gesehen haben und sollten relativ bequem mit. Dies ist vergleichbar mit dem Schreiben - wenn wir diese Codezeile zu schreiben, wir haben die Array-Schreibweise gesehen. Das sollte uns die zweite geben Wert in diesem Array, h. Wenn wir dies taten, sollte diese auch geben uns der zweite Wert in diesem Array. Denn es wird nicht auf die Speicher Adresse des ersten Sache, aber die Speicheradresse der Sache ein Ende. Und dann die Sternoperator Dereferenzierungen dass Zeiger. Und wieder, mal sehen. Wir bekommen h wieder ein. STUDENT: Was genau macht dereference das? JASON HIRSCHHORN: Dereference ist ein schickes Wort für Sie auf. Gehen Sie auf, dass und erhalten, was da ist ist zu dereferenzieren einen Zeiger. Es ist einfach ein fantastisches Wort dafür. STUDENT: Wenn wir wollten Druck die ganze Reihe, konnten wir Et-Zeichen-Zeiger zu tun? JASON HIRSCHHORN: OK, wir sind dabei, hier anzuhalten. Wir werden zu Ende. Ampersand gibt Ihnen die Adresse eines Lage, so, wenn Sie von Et-Zeichen zu tun eine Variable, es gibt Ihnen die Adresse wobei diese Variable gespeichert. Ampersand Zeiger gern die Adresse ptr ptr ist, wo im Speicher. Wir gehen nicht weiter zu gehen bei diesem Beispiel. Sie können herausfinden, diese Dinge auf eigene Faust. Aber noch einmal, dies könnte sogar ein grenzender Bit hinaus, was Sie wissen müssen, um für der Umfang dieser Halbzeit - oder dieses Quiz statt. Entschuldigung. Wir werden weitermachen, denn ich würde Lust auf Codierung Problem zu tun , bevor die Zeit um ist. Und wir werden um Code, was ich denke ist die überzeugendste von diesen Beispiele atoi. Das war also eine Frage nach ein Quiz vor zwei Jahren. Und ich habe es auf das Board hier. Die Menschen waren auf dem Quiz gefragt - sie ein wenig mehr in tesxt gegeben wurden, die Frage, aber ich eliminiert die Text, weil es unnötig war jetzt für unsere Zwecke. Es war nur einige Hintergrund auf welche atoi taten. Aber Sie alle wissen und sind sehr vertraut mit atoi. Ich schlage vor, Sie kodieren diese auf einem Blatt Papier. Ich schlage vor, Sie auch die Strategie nutzen dass wir übergelaufen viele in unserer Sektion. Stellen Sie zunächst sicher, dass Sie verstehen, was atoi Werk. Zeichne ein Bild oder kommen mit einigen geistiges Bild von ihm im Kopf. Weiter, schreiben Sie Pseudocode für diese. Auf dem Quiz, wenn alles, was Sie bekommen, ist Pseudocode, zumindest legte etwas nach unten. Und dann, dass die Karte auf Pseudocode C. Wenn Sie in einen Check Ihrer Pseudocode, wie überprüfen, ob etwas 1 ist, dass die Karten auf eine, wenn Zustand und so weiter. Und schließlich, Code des Programms in C So gehen Sie zurück zu atoi und fünf Minuten dauern Um dies auf ein Blatt zu codieren Papier, das wahrscheinlich über die ist Höhe der Zeit wäre für ein nehmen Quiz Code atoi. Fünf bis 15 Minuten, fünf bis 12, fünf bis 10 Minuten wird über die Anzahl an Zeit, die Sie dafür aufwenden würde Frage im Quiz. Also fünf Minuten dauern jetzt, bitte. Und wenn Sie Fragen haben, heben Ihre Hand, und ich werde kommen um. [SIDE GESPRÄCHE] JASON HIRSCHHORN: OK, so das war fünf Minuten. Das war wahrscheinlich über die Höhe der Zeit, die Sie auf, dass verbringen möchten auf ein Quiz, vielleicht das untere Ende dieser Zeit. Wir werden in ein wenig rekapitulieren. Lassen Sie uns diese Codierung. Und wenn wir nicht den ganzen Weg durch, die Antworten auf diese und diese Quizfrage zur Verfügung stehen, wieder, Herbst 2011 ist, wenn diese Frage erschien auf dem Quiz. Und es hat sich gelohnt acht Punkte auf das Quiz dann. Acht Punkte auf dem oberen Ende der Menge der Punkte etwas wert ist. Die meisten Fragen sind im Bereich von ein bis sechs Punkten. Das ist also ein anspruchsvoller Frage, das ist sicher. Kann jemand mir bekommen angefangen? Generell was werden wir damit zu tun haben zu wollen, atoi funktionieren, logisch? Was wollen wir tun? So werden wir zu schreiben einige Pseudocode. STUDENT: Konvertieren Zeichen in ganze Zahlen. JASON HIRSCHHORN: Konvertieren Zeichen in ganze Zahlen. OK. So, wie viele Zeichen sind wir gehen zu müssen, um durch zu gehen? STUDENT: Alle von ihnen. STUDENT: Alle Charaktere in der Zeichenkette. JASON HIRSCHHORN: Alle von der Zeichen in der Zeichenfolge. Also, wenn wir wollten, um durch alle gehen Zeichen in einem String, was ist eine Sache, C in die wir gesehen haben, die es ermöglicht hat uns, durch jeden gehen Zeichen in einem String? STUDENTEN: Eine for-Schleife. JASON HIRSCHHORN: Eine for-Schleife. So werden wir in einer Schleife durchlaufen jedes Zeichen in s. Und was werden wir tun wollen wenn wir einen besonderen Charakter bekommen? Sagen wir, wir sind immer vergangen 90. Wir bekommen die 9. Es ist ein Charakter. Was haben wir damit zu tun, wollen dass der Charakter 9? STUDENT: Subtrahieren Sie es von Zeichen 0? STUDENT: 0 hinzufügen? JASON HIRSCHHORN: Subtrahieren es von Zeichen 0? STUDENT: Ja. JASON HIRSCHHORN: Warum Sie wollen das tun? STUDENT: [unverständlich] Wert. Die int-Wert. JASON HIRSCHHORN: OK, so nehmen wir die Charakter 9, subtrahieren sie von Zeichen 0 ein um eine tatsächlichen integer 9. Süße. Und wie Sie wissen, diesen Charakter 9 minus null Charakter ist 9? Welche Grafik hat man sich aus? STUDENT: Es gibt logischer neun Plätze zwischen 9 und 0 ist. Oder Sie könnten in der ASCII-Tabelle. JASON HIRSCHHORN: ASCII-Tabelle. Aber ja, richtig sind Sie auch. So subtrahieren wir null. So, jetzt haben wir die ganze Zahl neun. Und was wollen wir damit zu tun? Wenn wir 90, es ist die erste Ganzzahl haben wir, was wir tun wollen? STUDENT: Ich würde in einem temporären ganze Zahl setzen Array, dann tun Sie es Mathematik später, um es in einem Ende zu machen. JASON HIRSCHHORN: OK. STUDENT: Sie können am Ende der Start die Reihe und dann nach vorne zu bewegen, so dass jedes Mal, wenn Sie vorwärts zu bewegen, Sie wird mit 10 multipliziert. JASON HIRSCHHORN: OK. Das klingt wie eine ziemlich überzeugende Idee. Wir können am Ende unser Angebot zu starten, und wir können strleng verwenden. Wir können hier in strleng verwenden. Wir werden die Länge unserer String zu erhalten. Wir beginnen am Ende. Und + die erste, nehmen wir eben, dass ganze Zahl ist, und vielleicht schaffen wir wie ein neuen Integer-Variable bis oben, wo wir speichern alles. Also haben wir eine Schleife durch alle Zeichen in s ab hinten nach vorne, subtrahieren wir 0 und dann nehmen wir es, und je nach wo sie ist, multiplizieren wir mit einer Leistung von 10. Da das erste, was wir tun multiplizieren Sie die Zeichen ganz rechts durch? STUDENT: 10 an die 0. JASON HIRSCHHORN: 10 an die 0. Was machen wir multiplizieren die zweite Zeichen ganz rechts durch? STUDENT: [unverständlich]. JASON HIRSCHHORN: Was? STUDENT: 10 auf die 1. JASON HIRSCHHORN: 10 auf die 1. Die dritte Zeichen ganz rechts? STUDENT: 10 auf die 2. JASON HIRSCHHORN: 10 bis 2. STUDENT: Sorry, ich verstehe nicht, was wir hier tun. JASON HIRSCHHORN: OK, gehen wir zurück, dann. Wir werden also zu bekommen in einem String übergeben. Denn wir schreiben atoi. So bekommen wir in einem String übergeben. Sagen wir, wir sind immer bestanden in der Zeichenfolge 90. Das erste, was wir tun werden eingestellt eine neue Integer-Variable, die wir sind gerade dabei zu erstellen als unseren neuen Ganzzahl. Das ist, was wir am Ende zurück. Wir müssen über jedes Zeichen in gehen der String, weil wir festgestellt haben, dass wir jeden berühren und dann zu unserem neuen Ganzzahl hinzufügen. Aber wir können es nicht nur als eine Zahl hinzuzufügen. Wir können nicht nur nehmen und 9 9 hinzufügen, um unsere ganze Zahl ist. Es hängt davon ab, welchen Platz es ist in der Zeichenkette. Wir gehen zu müssen, sich zu vermehren es eine Leistung von 10. Denn das ist, wie Basis 10 Werke. So werden wir die aktuelle zu bekommen Charakter, oder der tatsächliche integer Nummer, durch Subtraktion Zeichen 0 9 von Charakter, wie wir mit haben Subtrahieren Charakter Kapital A von Charakter, was auch immer wir in einem der hatte Diese Probleme. Also werden wir tatsächlich eine Zahl von 0 bis 9 gespeichert als reelle Zahl, und wir werden multipliziert es mit einer Leistung von je 10 auf, wo wir in der Zeichenfolge sind. Und dann werden wir es wieder hinzuzufügen in unser neues Integer-Variable. Also, was wäre, würde aussehen werden - wir werden hier zu ziehen. Wenn wir uns in der Zeichenfolge 90 bestanden - STUDENT: [unverständlich]. JASON HIRSCHHORN: Aber atoi nimmt einen String. So werden wir zu durchlaufen die Halte. Wir werden in 90 übergeben bekommen. Wir gehen von hinten nach vorne. Wir nehmen die 0. STUDENT: Es tut mir leid. Vielleicht ist das dumm. Wenn wir Sie in einem String übergeben, warum ist 90, was wir sind Anfang in geben? Da 90 eine ganze Zahl ist. JASON HIRSCHHORN: Da findet ein atoi String und wandelt es in der Integer Darstellung dieser Zeichenfolge. Aber die Saite 90 nicht die ganze Zahl 90 oder die Zahl 90. Die Saite 90 ist eine Anordnung von zwei oder drei Zeichen vielmehr die 9 Charakter, der 0-Charakter, und der Backslash 0 Charakter. Und wir schreiben atoi, weil für Wenn Sie beispielsweise den Befehl nehmen Zeilenargument, und es ist in gespeichert argv, ist es als String gespeichert. Aber wenn Sie ihn als Zahl behandelt werden sollen, Sie es ein konvertieren Ist Ganzzahl. Was wir haben ein Problem unserer Sets. Was wir in einer Reihe haben unseres Problems Sets. Jeder, der eine ganze Zahl nahm als Befehlszeilenargument. Also das ist, warum unsere Funktion atoi nimmt einen String. Also noch einmal, in unserem Beispiel hier, wir sind gehen, um die letzte zu nehmen. Wir werden den Charakter subtrahieren 0 von ihm, denn die Zeichen 0 durch das Zeichen 0 subtrahiert, gibt Ihnen die tatsächliche Zahl 0, nach der ASCII-Mathematik, die wir tun. Da Zeichen als dargestellt anders als ihre eigentliche - der Zeichen einer beispiels, Kleinbuchstaben a 97. Es ist nicht - oops! Es ist nicht, was man erwarten würde es ist, 0, zum Beispiel. So zu subtrahieren, müssen Sie die Zeichen a auf 0 zu bekommen. So werden wir das hier tun um die tatsächliche Anzahl zu erhalten. Und dann werden wir es multiplizieren eine Leistung von 10, je nachdem, wo es ist in der Zeichenfolge, und dann nehmen, dass und es um unsere Platzhalter hinzufügen variabel, so dass wir mit oben kommen unsere letzte neue Ganzzahl. Heißt das, macht es Sinn, alle? So werden wir nicht gehen, um diesen Code gerade jetzt, weil wir immer wenig Zeit. Ich entschuldige mich für den Zeitpunkt dafür. Aber das ist, was hoffentlich würden Sie der Lage, auf das Quiz zu tun - bei der dest, bekommen diese Pseudo ausgeschrieben. Und dann, wenn wir schreiben, die Pseudocode, eigentlich könnten wir dies tun ziemlich schnell. Jede Zeile der Kommentare, die wir schrieben wir hier übersetzt in etwa eine Linie von C-Code. Deklarieren Sie eine neue Variable, Schreiben eine Schleife, einige Subtraktion, einige Multiplikation und einige Vergabe. Wir würden wahrscheinlich auch zu wollen, einen Rücklauf. Wir möchten vielleicht auch zu setzen einige Prüfungen hier. Ja. STUDENT: So können wir behandeln s als der eigentliche String? Weil ich weiß, es ist nur eine Adresse. Wie, wie würden Sie die Länge der zu der String durchlaufen wird? JASON HIRSCHHORN: Also wie hat die Länge eines Strings? Strlen. STUDENT: strlen, ja. Aber können Sie setzen, wie die s Argument für das? JASON HIRSCHHORN: Also strlen nimmt ein char Stern. Und es folgt, dass char Stern, und es Zählen hält, bis es zu einem 0 Backslash. strlen war eigentlich eines der anderen Programme, die wir wurden, um Code geht. Das ist ein weiterer guter Code. Das hier ist ein bisschen einfacher, denn wenn Sie gehen an das denken sind konzeptionell - Ich sagte, es ist nur laut - strlen folgt ein Zeiger und läuft weiter und Zählen und die Verfolgung bis Sie einen Backslash 0 zu erreichen. STUDENT: OK, es bekam. JASON HIRSCHHORN: Also am besten von Glück auf 0 Quiz morgen. Wenn Sie Fragen haben, werde ich draußen sein nach diesem. Fühlen Sie sich frei, mich zu mailen. Erreichen Sie Ihre eigenen TF, wenn Sie nicht in meinem Bereich oder meine E-Mail, wenn Sie es wollen. Wenn Sie ausflippen wollen, und schicken Sie mir eine E-Mail, eine E-Mail freakout, werde ich senden Sie zurück, wie, ein Smiley-Gesicht, oder, wie, ein Witz oder so etwas. So fühlen sich frei, um das auch zu tun. Viel Glück wieder, und ich werde sehen Sie alle nächste Woche.