Tip:
Highlight text to annotate it
X
>> Sprecher 1: Hallo allerseits.
Wir werden, um loszulegen.
Ich glaube, die Leute sind immer noch Filterung zu werden in.
Aber im Interesse der Zeit, so können wir erhalten Sie Jungs von hier auf Zeit,
wir gehen zu starten.
Also willkommen in der CS50 Quiz 0 Bewertung.
Für diejenigen unter Ihnen, die nicht erkannt haben, noch, Sie haben eine Frage am Mittwoch.
Woo-hoo.
>> Wenn Sie noch nicht begonnen haben, noch studieren oder haben noch nicht begriffen, dass diese existiert,
Vergangenheit Quiz und alle Informationen über die Ihr Quiz sind auf cs50.net/quizzes.
Es gibt ein paar ziemlich gute Sachen dort, Vergangenheit Quiz der letzten 10
Jahre sowie Informationen zu diesem Quiz und Themen
dass abgedeckt werden.
Also lasst uns loslegen.
>> So euch erinnern sich vielleicht daran, die erste Tag der Klasse David hatte diese Lampen auf.
So im Wesentlichen alles, was geht unter der Haube eines Computers ist
in binärer getan.
Binary bedeutet, was es klingt wie, 0 und 1 ist.
Es hat zwei Werte, die dargestellt werden.
>> So wie in den ersten Tag des § als David machte Licht
Glühbirne zu vertreten auf oder ein, unsere Computer versteht binär als 0 und
1 ist, ein oder aus.
Grundlagen der Binary.
Jeder Ort vertreten ist in der Basis zwei.
So haben Sie 2 bis 0 auf der hinzufügen 1 bis 2 ganz oben.
>> So berechnen Sie, was Ihre binäre ist, dezimal, folgen Sie einfach diese Gleichung
Geben Sache.
Wenn Sie eine 1 in einem dieser Orte, Sie vermehren sich durch was auch immer
Basis ist es in, fügen Sie es auf, und Sie bekommen die dezimal.
Das ist also, wie man zählt bis 5 in binär.
Genau wie das, was wir tun, auf die letzte Folie, das ist, wie Sie es
1 bis 5 darstellen.
>> Ebenso wie nur Sie können hinzufügen und subtrahieren in Dezimal-oder Basis 10 oder
wirklich keine Basis, auf hinzufügen können und subtrahieren in binär.
Genau das, was man erwarten würde, wenn Sie fügen Sie die zwei auf, wenn er größer ist gleich
als 1 ist, tragen Sie ein, machen es zu einem 0, und tun dem Zusatz, dass Art und Weise, nur
wie Sie mit regelmäßigen erwarten Dezimal-oder andere Basis.
Kühl.
>> Also wie ich schon sagte, alles was geht unter der Haube unseres Computers
ist in 0 und 1 ist, oder binär erfolgt.
So, wie wir zum Ausdruck bringen, zum Beispiel, Buchstaben oder Zahlen oder Zeichen?
Und die Antwort darauf ist ASCII.
>> ASCII ist eine Zuordnung zwischen den Zeichen dass wir in der Regel in der zu sehen
Englisch Sprache wie a, B, C ist, unterstreichen, Bindestriche und
so etwas.
Und es Pläne, dass in eine ASCII-Wert.
Eine ASCII-Wert ist nur eine Zahl, die können von Ihrem Computer zu verstehen.
Und genau wie Sie zusätzlich zu tun und kann Subtraktion mit Zahlen, die Sie tun können
sie mit ASCII-Werten.
>> So dass in diesem Beispiel, was wird diese ausdrucken?
Ja, so einfach Ein Raum B Raum C Raum D. Wo hast meine Maus gehen?
Beachten Sie eine int bei 65 zu definieren.
Und wenn Sie, dass mit Hilfe drucken Prozent C, werde es zu interpretieren, dass ein
Charakter und druckt A.
>> Ebenso können Sie erklären können es als ein Zeichen.
Und wenn Sie es mit Hilfe Prozent drucken C, es werde das interpretieren, wie
Prozent D. Und wie können Sie eine hinzufügen Nummer, können Sie hinzufügen Charaktere sind
ASCII-Werte in diesem Fall.
>> So eine kleine Zeiger für alle.
5, als String, nicht tatsächlich gleich fünf.
Also, wie könnten wir wandeln die String-5 auf die ganze Zahl 5?
Irgendwelche Ideen?
Ja.
>> Also, wenn wir 5 als String, 0 können wir subtrahieren.
Und das wird uns geben 5.
Und ebenso, wenn wir 5 als ein integer, hinzufügen, dass auf den String null.
Und das gibt uns die Zeichenfolge 5.
Kühl.
>> Nun, zurück zu erinnern, wo ein Vortrag sprachen wir über Algorithmen.
Also, wie wollen wir eigentlich ein Computer interessante Dinge zu tun?
Sie wissen, nur Addition und Subtraktion Zahlen und Druck Dinge nicht
so spannend.
Normalerweise wollen wir unsere Computer zu führen eine Art von Algorithmus.
Etwas ein wenig komplexer als nur einfache Arithmetik.
>> Ein Algorithmus ist nur eine Schritt für Schritt-Set von Anweisungen, wie Sie ausführen
eine bestimmte Aufgabe -
Genau wie ein Rezept.
Sie könnten der erste Tag des erinnern Klasse, wo David hatte uns zählen ein Zimmer
von Menschen und wie viele Menschen waren im Zimmer.
Sie könnten zum Zählen verwendet werden nacheinander.
1, 2, 3, 4.
In diesem Fall wird eine lineare Algorithmus.
>> Aber David eingeführt einen Algorithmus für Sie, die Menschen in den Raum zu zählen
wo jeder steht auf, sagen Sie Ihrem Nummer an eine andere Person, hinzufügen, dass
Nummer auf, und eine Person setzt sich.
Und Sie das wiederholen.
Das ist eine Art von Algorithmus.
Wir können analysieren, wie effizient ein Algorithmus auf Basis ihrer Laufzeit.
Aber wir werden ein wenig sprechen dazu später mehr.
>> So können auch alle Algorithmen in Pseudocode geschrieben werden.
Pseudocode ist nur eine englische wie Syntax zu vertreten
eine Programmiersprache.
Zum Beispiel, wenn wir einen Benutzer zu fragen, gesucht Zu meinen Lieblingszahl schätze, wir
könnte Pseudocode haben als solche.
>> Holen Sie sich ein Nutzer zu erraten.
Wenn die Vermutung richtig ist, sagen Sie ihnen, sie korrekt sind, sonst sagen Sie ihnen,
sie sind nicht korrekt.
Und Pseudocode ist ein Weg, der leicht repräsentiert eine Idee oder einen Algorithmus.
So, jetzt wollen wir vielleicht wirklich schreiben dies in der Sprache, dass der Computer
vielleicht verstehen.
So konnten wir unsere Pseudocode schreiben und interpretieren, dass in den Quellcode.
>> So weit, muss im Quellcode haften zu einer bestimmten Syntax
eine Programmiersprache.
Und so weit, in CS50, haben wir worden, die meist c.
So könnte dies Quellcode für c sein.
Später im Verlauf, Sie kommen nachts Kontakt mit anderen Programmier
Sprachen wie PHP.
Oder wenn Sie sogar andere Klassen, die Sie vielleicht Java, Python oder sogar OCML tun.
Aber in unserem c Programmsprache, das ist wie wir den Quellcode schreiben
der Pseudocode-Algorithmus, Ich habe gerade vorher beschrieben.
>> Also, wie sieht Ihr Computer tatsächlich das verstehen?
Wie ich schon sagte, ist es eigentlich nur versteht Nullen und Einsen.
Also wie kann es von der Quelle zu bekommen Code, um etwas, das sein kann,
verstanden?
Nun, so etwas haben wir Compiler genannt.
>> Wenn Sie in den meisten Rücken erinnern psets, eine Art von Programm musste man
in einem Punkt c-Datei geschrieben.
Und dann make eingeben würden.
Also, was ist zu tun?
>> Sie können eingeben, um Ihre kompilieren Programm, weil jemand -
Wer schrieb Ihr p Satz; wahrscheinlich David -
erstellt ein Makefile.
Und das sagt zu machen, zu wissen, laufen Ihre Compiler, genannt Klang, das wird
kompilieren den Quellcode zu Objekt Code, der Nullen und Einsen ist,
dass Ihr Computer versteht.
Aber ein wenig später, gehen wir mehr in die Tiefe zu Compilern.
>> So erinnern pset 0, wobei - ja, Sie haben eine Frage?
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 1: Ja.
Ich denke, dass sie tatsächlich sollte online sein.
Ja.
>> ZIELGRUPPE: Ist es wie [unverständlich]?
>> Sprecher 1: Es ist nicht.
Die sind auf cs50.net/quizzes.
>> ZIELGRUPPE: Slash Quiz, Schrägstrich 2013 Schrägstrich 0 und nur durch klicken
Quiz Quiz 2013 0, Abschnitt überprüfen Rutschen.
>> Sprecher 1: Ja, also, wenn Sie wollen Jungs nach oben ziehen und schauen Sie es auf Ihrem
eigenen Computer, das ist auch in Ordnung.
Sag das noch einmal.
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, [unverständlich] die Dummy-Variable.
Oh, ja?
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 1: Nein, Streiks sind nicht auf die Prüfung.
Sorry, war ihre Frage, wurde Streiks in der Prüfung.
Und es ist nicht.
So pset 0, Jungs sollten alle etwas mit kratz implementiert.
Und wir gelernt, ein paar grundlegende Programmier Bausteine mit Kratzer.
>> Werfen wir also einen Blick auf einige dieser Bausteine
, aus denen sich ein Programm.
Zunächst ist Booleschen Ausdruck.
Boolesche Ausdrücke sind solche, und 0 oder irgend etwas, das hat
zwei mögliche Werte.
In diesem Fall wahr oder falsch, ein-oder ausschalten, und ja oder nein.
Ein Beispiel für eine einfache, sehr einfach, Programm, das einen Boolean verwendet
Ausdruck hier oben.
>> Also, um für boolesche Ausdrücke nützlich sein, haben wir Boolesche Operatoren.
Diese Operatoren sind, die verwendet werden können, auf bestimmte Werte zu vergleichen.
So haben wir und oder nicht gleich, kleiner oder gleich, größer oder
gleich und kleiner als oder mehr.
Aber diese Betreiber sind nicht sehr nützlich es sei denn, wir können sie in Kombination
Bedingungen.
>> So euch vielleicht daran erinnern, von Grund auf neu und von Ihrem p setzt, dass wir
Bedingungen hatten.
Sie sind im Wesentlichen wie Gabeln in die Logik des Programms, die
ausführt, je nachdem, ob eine Bedingung erfüllt ist.
Also eine der Bedingungen, die wir hatten viele Male in diesem Kurs verwendet wird, ist die
wenn sonst, wenn, und dann-Bedingungen.
>> Hier ist ein Beispiel, wie Sie können diese verwenden.
Kennt jemand den Unterschied zwischen wissen nur mit, wenn alle Aussagen
der Weg nach unten, wenn Verse, sonst, ob und anderes kombiniert?
Ja?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Genau.
Also, wenn ich hatte, wenn den ganzen Weg hinunter diese Weise, auch wenn diese Bedingung zurück
stimmt, es wird immer noch weiter Testen der nächsten zwei.
Während mit einer else-if, else Rechnung, wenn die, die true zurückgibt,
die anderen werden nicht geprüft.
Haben Sie Fragen dazu?
Kühl.
>> So können Sie eine if-else eines anderes zu verwenden Aussage, wenn Sie wissen, dass es nur kann
sein, einem dieser Fälle.
So dass wir, wenn x kleiner als 0 ist, ist es auf jeden Fall nicht zu sein
größer als 0 ist.
>> Als nächstes ein weiterer Baustein dass wir gelernt, sind Schleifen.
Wir haben drei Arten von Schleifen.
For-Schleifen, while-Schleifen, und do while-Schleifen.
Und in der Regel, wenn Sie sich hinsetzen, um etwas schreiben, um zu entscheiden, haben Sie
welche der drei die Sie verwenden möchten.
So, wie wir entscheiden, welche?
>> Wir verwenden in der Regel eine for-Schleife, wenn wir wissen, wie oft wir wollen laufen
durch etwas oder wie oft wollen wir eine Aufgabe zu erfüllen.
Wir verwenden while-Schleifen, wenn wir müssen einige Bedingung, um wahr zu sein, um am Laufen zu halten.
Und wir tun, während sehr ähnlich Weile, aber wir unseren Code auf ausführen möchten
mindestens einmal.
>> Also, während, was auf der do wird immer mindestens einmal ausgeführt.
Während mit der Zeit, es kann nicht laufen, wenn die
Bedingung nicht erfüllt ist.
Haben Sie Fragen dazu?
>> So Struktur einer for-Schleife.
Ihr habt alle gesehen.
Sie initialisieren.
Sie haben eine Art von Zustand.
So zum Beispiel könnten wir initialisieren für i gleich 0 ist.
i kleiner als 10 ist.
Und i + +.
Sehr einfach eine, die wir getan haben.
>> Für eine while-Schleife, ähnlich, haben Sie eine Art von Initialisierung haben,
eine Art von Zustand und eine Art Update.
So können wir unsere for-Schleife auch umsetzen als eine while-Schleife mit diesem.
Und in ähnlicher Weise mit einer do while-Schleife wir könnten einige der Initialisierung haben,
etwas ausführen, aktualisieren Sie ihn, und dann überprüfen Sie den Zustand.
>> So, jetzt funktioniert.
Wir haben alles zusammen.
Wir möchten Sie vielleicht einige schreiben Art von Funktion.
Gemeinsame Funktion, die Sie bereits gesehen haben, ist das Haupt.
Main ist eine Funktion.
Es hat einen Rückgabetyp int.
Es hat einen Funktionsnamen, Haupt.
Und es hat Argumente argc und argv.
So ist nur eine Hauptfunktion.
>> Andere Funktionen, die Sie verwendet haben könnte, printf - printf ist eine Funktion -
GetInt, toupper.
Aber diese geschehen gewesen zu sein von uns umgesetzt
eine Art Bibliothek.
Wenn euch daran erinnern, wie Diese CS50.h Bibliothek oder die
Standard I / O-Bibliothek.
Ja, in Frage zu stellen?
>> ZIELGRUPPE: Ist Haupt nur innewohn c?
Ist es nur irgendwie [unverständlich]?
>> Sprecher 1: Die Frage ist, wenn Haupt ist inhärent in c.
Und ja, alle Funktionen eine Hauptfunktion.
Es ist eine Art, die für den Computer zu wissen, wo Sie anfangen
Ausführen des Codes.
>> ZIELGRUPPE: Also würden Sie nicht [unverständlich]?
>> Sprecher 1: Nein.
Noch Fragen?
Kühl.
So wie können Sie eine Funktion verwenden das ist für Sie auch geschrieben haben, können
Schreiben Sie Ihre eigene Funktion.
Dies ist eine Funktion, dass jemand geschrieben, um das Volumen zu berechnen
einer q, zum Beispiel.
Es gibt ein Rückgabetyp hier, in diesem Fall int, unsere Funktion q Name und unsere
Liste der Parameter.
>> Und beachten Sie, dass Sie haben, um die Daten zu schreiben Typ des Parameters Sie wollen
verwenden oder aber die Funktion nicht wissen, welche Art von
Parameter sollte ich akzeptieren.
Also, in diesem Fall wollen wir eine ganze Zahl als unsere Eingabe.
Warum also könnten wir wollen Funktionen nutzen?
>> Zunächst einmal, toll für Organisation.
Sie helfen, brechen Sie den Code in mehr organisiert Stücke und machen
es leichter zu lesen.
Vereinfachung.
Das ist gut für Design.
Wenn Sie lesen, ein Stück Code sind und die Hauptfunktion ist wirklich,
wirklich lange, es schwieriger zu sein könnte Grund über das, was vor sich geht.
Also, wenn Sie es nach unten in Funktionen zu brechen, es leichter zu lesen sein könnte.
Und reuse-Fähigkeit.
Wenn Sie ein Stück Code, Befinden haben genannt oder mehrmals ausgeführt,
statt Umschreiben, die Code 10-mal in der Hauptfunktion, könnten Sie
möchte es wiederverwenden.
Und dann jedes Mal, dass Sie verwenden müssen Stück Code, rufen Sie die Funktion.
>> So jetzt, wenn wir uns erinnern, wieder zu kratzen, wir sprachen auch über ein paar Konzepte,
von denen eine Gewinde.
Gewinde ist das Konzept der Mehrfach Codesequenzen
Ausführen gleichzeitig.
Also denken Sie zurück an Tag eins, wo David hatte Sie Kerle zählen Sie die Anzahl der
Personen im Raum.
>> Wesentlichen, was los war wird auf alle von euch waren
laufen separate Threads.
Und die Fäden zusammen kommen eine Art von Antwort zu bekommen.
Auch in Scratch, wenn Sie mehrere Sprites, könnten Sie
haben eine Katze und einen Hund.
Und sie würden gleichzeitig sein den Betrieb ihrer eigenen Skripten.
Das ist ein Beispiel von Gewinden.
>> Und das andere Konzept, das war Kratz eingeführt war Veranstaltungen.
Und Ereignisse sind, wenn mehrere Teile Code miteinander kommunizieren.
Im Scratch, das war, als Sie verwendet die Übertragungskontrolle, die, wenn ich
Erhalten Blöcke.
>> Und auch, in Problem-Set 4, sahen wir ein bisschen von Veranstaltungen.
Ihr Jungs könnten verwendet haben Gevent die Bibliothek.
Und es gab eine Funktion waitForClick in dem Sie warteten
für den Benutzer zu klicken.
Und Sie hier klicken, wird in diesem Fall, wäre die Veranstaltung und warten Klick ist Ihr
Event-Handler.
>> Und auch, überall läuft Ihr psets und die Arbeit an Ihrem psets Sie
könnte in Kontakt kam Einige dieser Befehle.
Dies ist, was Sie in Ihrem getippt Terminal-Fenster, Fenster oder was auch immer
dass zeigt, bis auf g zu bearbeiten, Wesentlichen, navigieren Sie Ihren Computer.
>> So zum Beispiel, listet das LS Inhalt eines Verzeichnisses.
Machen Verzeichnis erstellt einen neuen Ordner.
CD, Verzeichnis wechseln.
RM, zu entfernen, löscht eine Datei oder ein Verzeichnis.
Und dann entfernen Verzeichnis Entfernt ein Verzeichnis.
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 1: Ja, sicher.
Sorry, war die Frage, ob Sie würde vorschlagen, setzen Sie diese
auf dem Spickzettel.
Es könnte helfen.
Wenn Sie Platz haben, können Sie es anziehen.
Es ist auch nur im Allgemeinen gut genug daran zu erinnern, denn wenn Sie es verwenden
möchten Sie vielleicht nur habe es gespeichert.
Das wird Ihr Leben viel einfacher.
Habe ich Ihre Frage beantworten?
>> So, jetzt, sprachen wir ein wenig kurz über Bibliotheken.
Aber die beiden wichtigsten sind, dass wir gewesen sind Verwendung bisher im Zuge sind
Standard-I / O und CS50.
Welche Dinge sind enthalten in der Standard-I / O-Bibliothek?
>> Ja, so weit wir printf benutzt habe.
In CS50, haben wir GetInt verwendet und GetString.
Und der Datentyp string geschieht auch in diesem CS50-Bibliothek deklariert werden.
Wir werden ein wenig mehr in die Tiefe zu sprechen wie Bibliotheken arbeiten und wie sie
Interaktion mit dem Rest des Codes.
Aber das sind die beiden wichtigsten sind, dass wir in Kontakt mit so weit kommen,
der Kurs.
>> Typen.
Diese sind gut zu merken, wie viel jede Art von oder, wie dargestellt
viele Bytes jeder Art erfordert -
int, 4 Byte, char, 1 Byte.
Float 4 Byte.
Was ist ein Doppel?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, so ein Schwimmer aber doppelt so groß.
Was ist eine lange?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: OK.
Was ist eine lange?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, ein int verdoppeln.
Ja.
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Long [unverständlich].
Und dann eine lange, lange ist doppelt so.
>> ZIELGRUPPE: Nein, nein.
Eine lange ist nur ein int.
Es hängt von der Architektur bevor die [unverständlich]
int und haben die gleiche Größe.
[Unverständlich].
>> Sprecher 1: So eine lange und ein int gleich sind.
Und dann eine lange, lange ist das Doppelte der int.
Kühl.
Und dann, was ist das letzte Typ?
>> ZIELGRUPPE: Zeiger.
>> Sprecher 1: Ja, so haben wir gelernt, ein wenig über Zeiger.
Und unabhängig davon, was ein Zeiger ist zeigt auf - es könnte ein Zeichen sein Stern
oder ein int star -
es ist immer 4 Byte für einen Zeiger.
Fragen dazu?
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 1: So eine lange und sind ein int das gleiche in diesem CS50-Appliance.
>> PUBLIKUM: Das Gerät vollständig austauschbar.
>> Sprecher 1: Ja.
So dann ist ein langer, langer Doppel ein int.
>> PUBLIKUM: Das ist die 32-Bit?
>> Sprecher 1: 32-Bit, ja.
>> ZIELGRUPPE: Also [unverständlich]?
>> Sprecher 1: Ja, wenn es nicht ausdrücklich sagen, du
sollte eine 32-Bit übernehmen.
>> ZIELGRUPPE: Es wäre etwas zu sagen wie unter der Annahme, ein
Architektur, wie das Gerät.
Für 64 bit, die einzigen Dinge, die Wandel sind sehnt und Zeiger.
Beide [unverständlich].
>> Sprecher 1: Ja?
>> ZIELGRUPPE: Frage.
Also auf einer der Praxis Quiz, es fragt nach einem unsigned int.
Also, wie wäre das bestimmt werden von einem int [unverständlich]?
>> Sprecher 1: Ein unsigned ist auch in 4 Bytes.
Aber was ist zu einer unterzeichneten verschiedene int und ein unsigned int?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Richtig.
Man kann negative Werte darstellen.
Aber wie macht sie das?
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, es spart ein Bit, um das Zeichen zu repräsentieren.
Die unterzeichnet hat, dass ein Bit stellt das Vorzeichen.
Und ohne Vorzeichen ist einfach alle Positive.
>> ZIELGRUPPE: OK.
Also sagen Sie, dass ein doppelter ist zweimal die Größe eines Schwimmers?
>> Sprecher 1: Doppel ist doppelt die Größe eines Schwimmers, ja.
>> ZIELGRUPPE: Wie funktioniert ein Zeiger eine lange, lange [unverständlich]?
>> Sprecher 1: Die Frage ist also, wie funktioniert der Zeiger auf eine lange, lange -
wie ist das nur vier Bytes eine lange, lange seine 8 Byte.
Also denken Sie daran, was ein Zeiger ist, im wesentlichen, ganz am Grundwert.
>> ZIELGRUPPE: [unverständlich].
>> Sprecher 1: Ja, so ist ein Zeiger ist nur eine Speicherstelle.
So spielt es keine Rolle, wie viel Platz dass Zeiger verweist.
Es braucht nur 4 Byte den Überblick zu behalten von dieser Speicherstelle.
Noch Fragen?
Kühl.
>> Also das letzte, was ich habe ist die Standardausgabe.
Sie sollten sie häufig verwenden genug, dass Sie sich erinnern können.
Aber das ist, wenn wir printf, zum Beispiel.
Und wir haben diese Platzhalter, die Format-Codes genannt wurden.
>> So Prozent c char, int Prozent für i, und wir können auch d Prozent.
Es ist die gleiche Sache.
Aber im allgemeinen in CS50 wir versuchen, i Prozent zu verwenden.
Prozent f für float.
Ld Prozent für lange lange und Prozent s für String.
>> Ebenso wir haben mit ein paar dieser Escape-Sequenzen.
Zum Beispiel Backslash n für neue Zeile.
Dies ist nur, wenn Sie die Formatierung sind Code für Print-f.
Ja?
>> PUBLIKUM: Was ist für d Prozent?
>> Sprecher 1: Also die Frage ist das, was ist d Prozent für?
Prozent d für Ganzzahlen.
D Prozent Prozent und i gleich sind.
>> PUBLIKUM: Was ist der Unterschied zwischen Backslash Backslash n und r?
>> Sprecher 1: Die Frage ist also, was ist der Unterschied zwischen Spiel und n
spiel r?
Ich denke, Backslash r -
>> ZIELGRUPPE: Also Backslash r nur impliziert kehrt zu dem Anfang der Zeile
ohne tatsächlich in eine neue Zeile.
Also, wenn Sie einen Backslash r und Sie drucken zurück zum Anfang der Zeile
dann mehr Material zu drucken, überschreiben Sie das Zeug, das ist bereits auf
[Unverständlich].
Während, n geht tatsächlich auf eine neue Linie und geht auf [unverständlich].
>> Sprecher 1: Na ja, noch andere Fragen?
Gut.
Ich werde es die Hand von Dan, der wird sich fortsetzen.
>> [Applaus]
>> DAN: Alle Rechtshänder.
Also werde ich zu einem anderen breiten sprechen Reihe von Ideen, die aus der Klasse sind
Vertreter der rund zwei Wochen und der Beginn der Woche drei Anfahren
mit Casting, die nur ein Weg ist Behandeln Wert eines bestimmten Typs als
ein Wert von einem anderen Typ.
So können wir dies mit Zeichen zu tun ints, Schwimmern zu ints und
lange sehnt sich zu verdoppeln.
>> All diese Dinge können als Arten verwendet werden der Behandlung von gewissen numerischen Wert
minus char wie einige andere numerischen Wert.
So gibt es einige Probleme mit diesem, von Natürlich, das kommt, wenn Sie werfen
Dinge wie Schwimmer ints.
Also das ist ein bisschen komisch.
Wir haben einen Schwimmer, der 1,31 ist.
Wir multiplizieren sie mit 10.000.
Und dann wir drucken es als int.
Was bedeutet diese Ausgabe?
10.000 mal 1,31.
Also 13.000, das ist die Vermutung?
>> ZIELGRUPPE: Ich denke, es ist 10.000.
>> Dan: Also ich bin Multiplikation mit 10.000 bevor ich Gießen.
>> ZIELGRUPPE: Oh.
Wäre es nicht da sein, ein 9 und einige Zahlen 0?
>> DAN: Möglicherweise müssen einige seltsame Ziffern.
So richtig, es ist 1,3 mal 10.000.
Also das ist 13.000.
Und diese zusätzliche komisch -
>> ZUSCHAUER: 13.100.
>> DAN: 13.100.
Danke, Rob.
Und diese zusätzliche Verrücktheit -
diese 9,9 -
ist einfach, weil diese Guss bis Abrundung endete, wo
es sollte nicht.
Ja.
>> PUBLIKUM: Das Casting passiert nach etwas anderes?
>> DAN: Also, da ich diese im Druck, es funktioniert diese Multiplikation, bevor es
funktioniert das Casting.
>> ZIELGRUPPE: [unverständlich].
>> Dan: Ich denke, es würde zuerst gegossen, ja, denen 10.000 wären.
Sonst noch was?
Kühl.
Das ist also 13099.
Warum geschieht das?
Die Ungenauigkeit.
>> Floats sind nicht perfekt.
Sie können nur Zahlen darstellen, ein bestimmte Anzahl von signifikanten Stellen.
Also, wenn wir ausdrucken 8 sig Feigen auf Diese Schwimmer, eine Art erhalten wir
hässlich suchen Nummer.
Und das ist, weil 1,31 kann nicht genau durch einfache dargestellt werden
Potenzen von zwei in der Maschine.
So endet die Einnahme des nächsten raten, die bis Ende
, ein wenig niedrig.
Sinnvoll?
OK.
>> Nun schaltet sich eine andere Art der Dabei bedingte Anweisungen, wo alle
wir kümmern uns um eine einzelne Variable.
Also in diesem speziellen Beispiel, wir sind immer eine ganze Zahl von dem Benutzer.
Und dann sind wir auf der Suche was das ganze Zahl ist.
Vermutlich ist es Nummer zwischen einem und vier.
Das ist, was wir für die Nachfrage.
>> So können Sie einen Schalter zu tun der Name variabel.
Dann können Sie sich Fälle von möglichen gesetzt Werte es sein könnte.
Also, falls einer, sagen, es ist niedrig.
Und dann brechen, um aus der Schaltzustand so
Sie nicht halten werde.
>> Im nächsten Fall -
so jeweils zwei und bei drei -
wenn es sich bei beiden es gerade sinkt auf die erste Zeile Code sieht es als mit
Groß-drei, bis sie eine Pause sieht.
Also der Grund, warum Sie einen bekommen zu Fall nur Druck niedrig ist, weil ich
haben diese Pause hier.
Wenn ich, sagen wir, ignoriert diese Pause - wenn ich warf diese abtrünnigen -
es wäre zu drucken niedrig, und dann wäre es Drucken Mitte, und dann ist es brechen würde.
>> Also Pausen sind ein wichtiger Bestandteil von Bedingungen und wechseln
sollten sie da sein.
Alle Fälle, die nicht explizit angegeben werden werden von der Standard behandelt
in dem Schaltergehäuse und sollte gegossen werden.
>> ZIELGRUPPE: Also 1, 2, 3, und 4 würde n sein?
>> DAN: Werte, die n sein kann.
Ja.
Ja?
>> ZIELGRUPPE: Also, wenn Sie , dass [unverständlich]?
>> DAN: Sie würden ausdrucken niedrig, und dann es wäre Mitte zu drucken, und
dann wäre es zu brechen.
>> ZIELGRUPPE: Warum würde es drucken Mitte, wenn [unverständlich]?
>> DAN: Also alles unter einem Fall bevor eine Pause fällt unter.
So ein Fall unter Druck ist bei ein wie die vorliegende folgenden Druck.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Also diese Zahl ist nur eine bestimmte Wert, dass diese Variable
nehmen können, oder?
Heißt das Sinn?
Ja.
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ja, bei beiden würden drucken Mitte und dann brechen.
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ich denke, jeder?
Welche anderen Datentypen können Sie über Schalter?
>> ZIELGRUPPE: Sie können wechseln über beliebige Datentypen.
Aber es bedeutet, dass nur etwas mehr als Zeichen und ints und solche Sachen, weil
wenn Sie über einen Zeiger sind Schalt das nicht wirklich sinnvoll,
Umschalten Lasten, wenn es auch lassen Sie das tun, weil der Floating-Point-
Präzision, nicht wirklich würden Sie will das trotzdem tun.
So recht viel, nur ints und Zeichen und solche Sachen.
>> Dan: Ja, ist es, wenn Sie ausdrücklich Werte, die Sie kennen, glaube ich, kann
dass ein Schalter ist tatsächlich nützlich.
Good?
OK.
>> Scope ist der Bereich, der ein erklärter Variable erstreckt.
Also in diesem kleinen Stück Code, die ich habe, wäre es voller Fehler.
Und der Grund ist, ich dieses int deklariert i innerhalb des Umfangs dieser for-Schleife.
Und dann versuche ich, verweisen, dass i außerhalb der for-Schleife, dass Umfang.
>> Also im Grunde kann man über Umfang denken als alles, was Sie erklären
mit in einer Reihe von geschweiften Klammern nur besteht innerhalb dieser geschweiften Klammern.
Und wenn Sie versuchen, und diese Variable außerhalb dieser geschweiften Klammern, werden Sie
erhalte eine Fehlermeldung des Compilers.
Ja?
>> ZIELGRUPPE: Also das man nicht arbeiten?
>> Dan: Das funktioniert nicht, ja.
Streicher.
String ein char *.
Sie sind genau die gleichen.
Sie sind nur Zeiger auf Zeichen.
Und alle Zeichenfolgen, die Sie haben sollten am Ende mit Backslash Null, das nur
a c Konvention.
>> Man nennt sie die NULL-Terminator.
Und NULL -
N Kapital, Kapital-U-, Kapital- L-, Kapital-L -
ist nicht die gleiche wie die NULL-Terminator.
Dies ist ein Zeiger.
Dies ist ein Zeichen.
Sie sind sehr verschieden.
Daran erinnern.
Es wird auf der Quiz wahrscheinlich sein.
Ich habe nicht das Quiz gesehen.
Ja?
>> ZIELGRUPPE: Also NULL ist, sagen wir, der Zeiger?
>> Dan: Ja.
>> PUBLIKUM: Was macht [unverständlich]?
>> DAN: Wenn, sagen wir, malloc wird aufgerufen, wenn Sie nicht genug Speicher, um zu bekommen
unabhängig von Größe, die Sie für, fragst malloc NULL zurück.
Es ist grundsätzlich immer dann, wenn eine Funktion soll einen Zeiger zurückgeben, können Sie
müssen gegen NULL überprüfen, weil NULL ist ein ziemlich gut -
es ist, eine Art, die Müll-Wert.
Es ist ein Null-Zeiger so weit zu gehen.
>> Immer wenn Sie eine Funktion aufrufen, dass gibt einen Zeiger.
Du wirst zu überprüfen, um zu wollen, sicher, dass der Zeiger nicht NULL
weil NULL ist sehr verbreitet.
Es ist irgendwie ein Müll Rückkehr.
Also, wenn etwas nicht richtig zu gehen, nur NULL zurück statt.
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ja, und das ist das.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Formulieren Sie es wie dieses.
Es ist der NULL-Terminator.
Es wird in Kleinbuchstaben N-U-L-L, wenn Sie buchstabieren es.
>> ZIELGRUPPE: Und ich ging einfach zurück und getestet.
Und wenn Sie versuchen, eine Floating-Point setzen Wert in einen Schalter, es wird dich schreien
sagen, Aufstellung erfordert Ausdruck von Integer-Typ.
>> DAN: Dort gehen Sie.
Aber ja, was war noch mal die Frage?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Also Hauptstadt N, U Kapital, Kapital L, L ist die Hauptstadt eine tatsächliche c Sache.
Es ist der NULL-Zeiger und wird nur als solche behandelt werden.
Sie werden nicht immer versuchen, die Rechtschreib NULL Charakter und sehen keine
anders als diese.
Ja?
>> ZIELGRUPPE: Also wieder in char oder max etwas in den Anmerkungen, wäre es
verkörpern die gleiche Funktion als [unverständlich]?
>> ZIELGRUPPE: So beziehen Sie sich Rückkehr char max von getchar oder
was auch immer es ist?
>> ZIELGRUPPE: Ja.
>> ZIELGRUPPE: Ja, so die allgemeine Begriff für all jene Dinge
Sentinel-Werte sind.
So wie eine Rückkehr int max von GetInt und char max von getchar, ist es
soll wie, alles in Ordnung, wenn diese Dinge wieder zu uns,
etwas schief gelaufen.
>> Für Hinweise, die wir nur zufällig haben Diese Sentinelwert, dass jeder
stimmt auf.
Und das ist das, was Sie zurück wenn etwas schief geht.
So char max ist, was wir mit , etwas zu repräsentieren
wie NULL oder getchar.
>> ZIELGRUPPE: Also, wenn Sie testen getchar sind, könnten Sie einfach NULL setzen?
Würde das einen Unterschied machen?
>> DAN: Sie konnte nicht einfach überprüfen NULL.
Sie müssten char max überprüfen, weil die Rückgabewert der Funktion ist
ein Zeichen, das nicht ein Zeiger.
Ja?
>> ZIELGRUPPE: Diese Frage stellt für die String-Länge.
Heißt das NULL-Zeichen enthalten?
>> DAN: Nein
Und das ist tatsächlich, wie String-Länge weiß, zu stoppen, weil es durch geht
Array von Zeichen, bis es sieht ein NULL-Zeichen.
Und dann ist es wie alle Gut, ich bin fertig.
>> ZIELGRUPPE: [unverständlich] fünf?
>> DAN: Hallo würde fünf sein.
Yep.
So Arrays sind kontinuierliche Speicherblöcke.
Sie haben sofortigen Zugriff sagen die Name des Array und dann in geschweiften
Hosenträger, was Index, den Sie gehen wollen zu, sind sie von Null indiziert durch
die Länge der Anordnung minus 1 ist.
>> Und sie sind durch die Art der das erklärte Sache, die Sie in die Speicherung sind
Array, der Name des Feldes, und was auch immer die Größe des Arrays.
Also das ist ein char-Array der Länge sechs, die diese Werte enthält.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ja.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Wenn Sie haben, was los ist in das Array schon gemacht.
So könnte man diese stattdessen als anzugeben, sagen, Saibling, was auch immer der Name des
Array ist, leere Klammern gleich lockig Klammer H Komma Komma E L L Komma Komma
O Komma NULL-Zeichen und geschweifte Klammer.
Das wäre auch eine Erklärung zu arbeiten.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Dann müssen Sie haben die Größe schon gemacht.
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ja.
Alle Rechtshänder.
Befehlszeilenargumente sind eine Möglichkeit, Eingaben aus dem Benutzer als
Argumente zur Haupt.
Haupt zwei Argumente.
Die Anzahl der Argumente, die sein wird entlang der Befehlszeile und eine bestandene
String-Vektor oder ein String-Array aller Argumente.
>> Wenn ich also etwa genannte eine Funktion wie Ein Punkt aus 1 Raum, 2 Raum, drei,
argc würde 4 sein.
Und die argv 0 würde ein Punkt aus sein.
Argv1 würde 1 sein.
argv2 wäre 2. argv3 wäre 3, in diesem speziellen Fall.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Das letzte Element im Array da das Array Länge argc Plus
einer der argb, das letzte Element ist der NULL-Zeiger.
Es ist argc plus 1.
Also in dem Fall, dass ich sagte nur, es 0 würde argv ist ein Punkt heraus.
argv 1 1 ist. argv2 2 ist. argv 3 3.
argv 4, die eine größere ist als argc wäre NULL.
>> Und das ist der NULL-Zeiger.
Ja.
Und das ist, weil String ist ein char-Stern ist ein Zeiger.
So hat es der gleiche Typ sein.
Ja?
>> ZIELGRUPPE: Zwei Fragen.
So eine, was ist der Unterschied zwischen Diese und andere GetString als eine Art
in der Benutzer Motor?
Und zwei wird in gespeicherten Ihre letzte Erinnerung?
So wie, würde GetString sein [unverständlich]?
>> DAN: Wo ist es gespeichert?
Ich weiß nicht, wo sie gespeichert sind.
>> ZIELGRUPPE: Also, eigentlich, wissen Sie, wie jede Funktion Sie es Argumente nennen
im Stapel gespeichert?
So argc und argv sind Argumente, die Haupt und sie sind auf dem Stapel, oder wirklich
nur über das, was Sie denken, wie der Start des Stapels.
Was war der andere Teil der Frage?
>> ZIELGRUPPE: Also, was ist die [unverständlich]?
>> Dan: Ja, es ist nur eine andere Art des Erhaltens Eingabe von dem Benutzer.
Etwas effizienter und das hier ist es ist handlicher, weil Sie für Skripte
kann nur Argumente an Ihrem Haupt Funktion, anstatt zu warten,
für Benutzer, wenn Sie keine Benutzer haben.
>> ZIELGRUPPE: Und ja, bekommen Saiten wäre [unverständlich].
Es würde die Dinge, die Sie brauchen, zu speichern.
>> Dan: Ja?
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ja, argv 0 beinhaltet immer die dot Strich des Funktionsaufrufs.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ja, jedes der Argumente in NULL-Zeichen beendet, weil sie
Strings sind.
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ja, das ist argc argv ein NULL-Zeiger.
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Oh ja.
Ja, sorry.
>> ZIELGRUPPE: Also [unverständlich]?
>> DAN: Die Frage ist also, wenn Sie hatte die Befehlszeile dot Schrägstrich einen Punkt aus 1, 2,
Würde die Anzahl der Befehlszeile Argumente, zwei oder drei wäre es sein?
>> ZIELGRUPPE: Ich denke, es funktioniert nicht wirklich wichtig sind.
Ich neige dazu zu sagen, oh, die Sie nicht weitergeben Alle Befehlszeilenargumente, wenn
offensichtlich die Funktion aufgerufen Sie.
Also ich neige dazu, die stimmlich ausschließen Funktion von der Kommandozeile
Argumente, auch wenn es in argv enthalten.
>> DAN: Aber wenn es auf dem Prüfstand -
ja - und auch, wenn Sie etwas zu sagen wie argc gleich 3 ist,
Sie sind in sicheren Stand.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Ich denke, wenn statt der Aufruf dieser in argc und String argv Klammern
aber immer die gleichen Typen und gerade angerufen ihnen etwas anderes wie ein
und b, wäre es immer noch funktionieren?
Und es würde immer noch funktionieren, Sie würden nur -
anstatt Argc - Sie würde a und b.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> DAN: Die Frage ist also GetString ist gehen, um Speicher im Heap speichern
weil GetString ist char *.
Es speichert im Heap-Speicher, weil es ruft nun malloc innerhalb des eigentlichen
Umsetzung der GetString.
OK, Bewegung auf.
>> Sicherheit.
So wirklich sicher zu sein, verlassen Sie sich nicht auf ein und Sie lassen niemand Zugang zu einem
Ihre Informationen, weshalb jeder baut ihren eigenen Maschinen,
ihre eigenen Betriebssysteme, die alle ihre Programme von Grund auf neu, und natürlich
zu keinen anderen Computern zu verbinden über das Internet.
Also Computer sind unsicher.
Sie sind wirklich.
Wir haben mit anderen Menschen zu vertrauen.
>> Und die Idee, die Sicherheit ist, dass Sie versucht, die Menge des zu begrenzen
vertrauen, dass Sie benötigen.
Und eines der Mittel, die Sie tun ist durch Kryptographie.
Kryptographie ist im Wesentlichen wir haben Geheimnisse.
>> Manchmal müssen wir unsere Geheimnisse weitergeben entlang durch, sagen wir, das Internet oder
andere Dinge.
Und wir wollen die Leute nicht , diese Geheimnisse zu kennen.
So verschlüsseln wir unsere Geheimnisse in einer Weise, dass wir hoffen, dass niemand herausfinden können.
>> So haben wir -
durch den Verlauf dieser Klasse -
Dinge wie Caesar-Chiffre und [Unverständlich], die beide sind sehr, sehr
unsicher Möglichkeiten der Verschlüsselung von Dingen.
Sie sind einfach, herauszufinden, was sie sind und was Ihre Geheimnisse sind.
Die reale Welt wird wesentlich mehr komplizierte Verschlüsselungsverfahren.
Und wir werden nicht in zu erhalten viel mehr als die.
>> Debugging.
GDB ist die beste.
Ich werde das noch einmal betonen.
Verwenden GDB die ganze Zeit jeden Mal, wenn Sie ein Problem haben.
Befehle, die in GDB nützlich sind, sind brechen, die Sie entweder eine Linie passieren
Nummer, ein Funktionsname, im Wesentlichen wo in Ihrem Code, den Sie stoppen möchten,
und in der Lage, die Kontrolle zu nehmen.
>> Drucken eine variable und druckt was auch immer das ist, dass variable
Punkt in Ihrer Ausführung.
Weiter geht Ihre Ausführung entlang einem Schritt.
Und Schritt *** innerhalb einer Funktion in Ihrer Ausführung.
>> Andere Dinge laufen, die ist, wie Sie tatsächlich führen Sie den Code.
Weiter nimmt alle erforderlichen *** , um zum nächsten Haltepunkt zu bekommen.
Und es gibt viele, viele andere.
Schauen Sie es.
Sie sind großartig.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ja, das ist ein Debugger.
So ein Debugger ist ein Programm, können Sie Ihr Programm debuggen.
Es ist nicht ein Programm, das Bugs findet Sie, aber das wäre toll.
>> Und zuletzt ist für mich suchen.
Also die Art der Suche, die wir sprachen etwa in dieser Klasse sind lineare Suche,
das ist nur, dass Sie durch die einzelnen aussehen Element des Suchraums, einer
Element in einer Zeit, bis Sie finden, was Sie suchen oder bis Sie
das Ende der Suchraum, an dem punkt Sie sagen, dass Sie nicht finden konnte
das Element, das Sie gesucht haben.
Und das dauert im besten konstante Zeit, Das ist 0, 1 und im schlimmsten Fall linear
Zeit, die 0 n ist.
>> Binäre Suche, die benötigt schmutzigen Elemente.
Sie gehen in der Mitte der Elemente, sehen, ob das Element, das Sie suchen
größer oder kleiner ist als das Element Sie befinden sich auf der Mitte.
Es es ist größer, sagen Sie, dass der Boden Ihre Suchraum ist Ihr
aktuellen Standort, in der Mitte, und Sie den Prozess neu zu starten.
Wenn es kleiner, schauen Sie sagen, dass die - ja, was ist los?
>> ZIELGRUPPE: [unverständlich]?
>> Dan: Ja.
Jede Art von Art, die in beigebracht worden ist die Klasse ist Freiwild für den Test.
>> [Gelächter]
>> Dan: Und die Tatsache, dass Sie nicht gehabt haben , um es für ein Problem, do, es ist fair
Spiel für den Test.
>> ZIELGRUPPE: Können wir über sie gehen, wie man -
>> Dan: Es wird übergegangen werden.
>> Sprecher 2: Der eigentliche Code für die [Unverständlich] ist auf study.cs50.net.
Also, wenn Sie in der Praxis Problem suchen in der Merge-Sort Seite
study.cs50.net besteht die Code für die Umsetzung Merge-Sort.
So müssen Sie nicht haben, zu implementieren es sich heute Abend.
Aber stellen Sie sicher, dass Sie es nicht verstehen, als nur auswendig zu lernen.
>> ZIELGRUPPE: [unverständlich]?
>> Sprecher 2: Der Merge-Sort-Seite auf study.cs50.net, gibt es eine Praxis
Problem, dass, wenn Sie durch das Klicken Problem, am Ende befindet sich eine
Lösung, die die Zusammenführung ist Art Umsetzung.
Aber stellen Sie sicher, dass Sie es verstehen und nicht nur auswendig zu lernen
oder kopieren Sie es auf.
>> ZIELGRUPPE: Und ein vollkommen gültig Problem für die Prüfung wäre
so etwas wie hier ist eine Liste.
Was bedeutet diese Liste wie kümmern einen Schritt der Auswahl Art oder
Insertion Sort oder was auch immer.
Eine volle Iteration der Liste.
Also auch wenn Sie nicht am Ende brauchen, um Code für sie, um es zu verstehen, müssen Sie
genug, zu wissen, wie es geht werden, um die Änderung dieser Array.
>> DAN: Das ist es für mich.
>> [Applaus]
>> LUCAS: Hey everyone.
Mein Name ist Lucas.
Ich werde über Rekursion sprechen, die alle die Sorten, die wir gelernt haben, und eine
wenig von allen Zeigern.
OK?
Also zunächst einmal, Rekursion.
Was bedeutet es, zu sagen, dass eine Funktion rekursiv ist?
>> ZIELGRUPPE: Ruft sich.
>> LUCAS: OK, nennt sich selbst, ja.
So wie auf diesem Bild, zum Beispiel.
Es ist wie das Bild in von einem Bild und so weiter.
Dan - So zum Beispiel, können Sie , was über binäre Such sprechen.
Ein Weg, in dem binäre Suche ist rekursiv ist die Tatsache, dass Sie
versuchen, eine Reihe zu finden.
So können Sie in die Mitte zu gehen.
Und dann können Sie überprüfen, ob die Zahlen dort in der linken und in der rechten Seite.
>> Und dann, wenn Sie herausfinden, ist die Zahl gehen, um auf der linken Seite, ist es das gleiche
etwas wie tun, die Suche wieder, aber nur auf der linken Seite der Liste.
Also das ist, wie es klingt wie es ist rekursiv.
Also das ist, warum Sie Jungs haben rekursive Lösung für Merge-Sort.
>> OK, hier ist ein Beispiel.
Also sagen wir mal, dass ich wählen alle Zahlen von 1 bis n ist.
Ich stelle fest, dass die Summe der n Zahl n plus n minus 1 bis 1.
Aber dann, wenn ich mir n minus 1 plus n plus 1 minus 2 ist, dass die gleiche
etwas wie Summieren Zahlen bis zu n minus 1.
So kann ich die Summe von einer gleichen Summe sagen gleich n plus die Summe von n minus 1 ist.
Heißt das Sinn?
>> Und ich würde auch noch etwas anderes haben als Basisfall, der das ist
die Summe der Zahlen bis Null Null wäre.
Also, sobald ich auf die Anzahl zu bekommen Null, ich aufhören zu zählen.
Heißt das Sinn?
>> Also hier ist ein Beispiel, wie Ich kann zu implementieren, dass.
So habe ich diese Funktion in einigen.
Das dauert eine ganze Zahl n.
Also hier bin erst prüfen, ob n weniger oder gleich Null.
So dass, wenn es weniger oder gleich Null ist, I Null zurück, die unsere Basisfall ist.
Ansonsten kann ich nur zurückgeben n plus die Summe der Zahlen von
ein bis n minus eins.
Sinnvoll?
OK.
>> Also hier ist, wie es aussieht.
Sie haben Summe von zwei Gleichen 2 plus die Summe von 1.
Und einige von 1 1 plus die Summe von 0, die 0 ist.
Sinnvoll?
Also, wenn wir uns die Stapel von Ihrem Programm, das ist, wie es aussieht.
>> Erstens haben wir die Hauptfunktion.
Und dann die Hauptfunktion genannte Summe 2.
Und dann die Summe 2 wird sagen, oh, Summe 2 gleich 2 plus die Summe von einem.
Also ich hinzufügen Summe von 1 auf den Stapel.
Und die Summe von 1 wird zu Summe nennen 0, die auch die hinzugefügt werden
auf den Stapel.
Und dann jedes dieser sind diejenigen, die auf dem anderen haben, um zurückzukehren
bevor die anderen können weitermachen.
>> So zum Beispiel, hier Summe von 0, Zunächst wird auf 0 zurück.
Und dann wählen Summe von 1.
Dann Summe von 1 wird zu zurück 1 bis 2 Summe.
Und schließlich Summe von 2 wird , um zum Haupt zurück 3.
Heißt das Sinn?
>> Es ist wirklich wichtig zu verstehen, wie der Stapel arbeiten und versuchen,
sehen, ob es Sinn macht.
OK, so Sortierung.
Warum also ist die Sortierung wichtig, erste von allen?
Warum sollten wir uns kümmern?
Anyone?
Geben Sie mir ein Beispiel nennen?
Ja?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, OK.
So können Sie effizient suchen.
Das ist ein guter Weg.
So, zum Beispiel, haben wir eine Menge von Dinge, eigentlich in unserem Leben, dass
geordnet sind.
Zum Beispiel Wörterbücher.
>> Es ist sehr wichtig, dass alle Worte in einer Art, damit wir
leicht zugänglich machen können.
Also das ist, was er sagte.
Sie können effizienter suchen.
Überlegen Sie, wie schwer es sein würde, haben ein das Wörterbuch in der die Wörter in
zufälliger Reihenfolge.
Sie haben zu sehen, ziemlich, jedes einzelne Wort, bis Sie die
Wort, das Sie suchen.
>> Wenn Sie Facebook sind auch, wenn Sie Ihre Freunde suchen, sind Sie
gehen, um zu sehen, dass Facebook stellen Sie Ihre näher Freund ist oben auf die, die
Sie reden nicht so viel.
Wenn Sie den ganzen Weg auf den Grund gehen Ihr Freund Liste, Sie gehen, um zu sehen
Menschen, die Sie wahrscheinlich noch nicht einmal daran, dass Sie mit Freunden sind.
Und das ist, weil Facebook-Arten Ihre Freunde auf der Basis, wie
schließen Sie sie sind.
>> Also, Daten zu organisieren.
Auch Pokemon.
Sie sehen also, dass alle Pokemons haben Nummern.
Und das ist, wie eine einfache Weg zum Zugreifen auf Daten.
>> ZIELGRUPPE: Zugriff auf Pokemon.
>> LUCAS: Ja.
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Yep.
OK, also Auswahl sortieren.
Auswahl Art wird zur Auswahl der kleinste Wert einer unsortierten Liste jedes
Zeit in jeder Iteration.
Es ist irgendwie wie die Art, die Sie tun in Ihrem Kopf, wenn Sie versuchen,
Sortieren einer Liste auf der Hand.
>> Im Grunde ist alles, was Sie tun, Sie schauen für die kleinste Zahl.
Sie legte es in der sortierten Liste.
Und dann können Sie für den Look nächste kleinste Zahl.
Und dann haben Sie weiterhin tun, daß und so weiter.
>> Also Auswahl Art ist im Grunde Sie Wählen Sie jedes Mal das kleinste
unsortiert Wert.
Setzen am Ende der sortierten Teil der Liste.
Und halten tun.
Also lassen Sie schnell sehen, was das sieht aus wie.
Also hier ist die sortiert und unsortierte Liste.
>> Also für die sortierte Liste von, es ist zunächst leer.
Und dann werde ich zur Auswahl der kleinste Zahl hier, die 2 ist.
So bekomme ich die Nummer 2 und ich in der Vorderseite der Liste.
Und dann sehe ich für die nächstkleinere Element, das 3.
Also habe ich es am Ende der sortierten Liste.
Und dann halte ich das tun.
Ich finde, 4 und legte es am Ende.
Finden Sie 5 und legte es am Ende.
>> Und wie alle diese mal schauen, dass Ich sage, legte sie am Ende ist,
im Grunde, das Wechseln von zwei Werten.
OK?
Und dann die letzte, die Sie gerade haben ein Element mehr.
So ist es bereits sortiert.
>> OK, so insertion sort.
Insertion Art wirst du auch bist das Ding mit der eine sortierte und
eine unsortierte Liste.
Die einzige Sache ist, dass jedes Mal, dass Sie sind ein Element hinzufügt, um die sortierten
Liste, die Sie gerade das Element wählen, dass ist vor der unsortierten Liste.
Und dann hast du finden wirst, was positionieren sollte es in der sortiert werden
Teil der Liste.
>> Mal sehen, was das so ist das macht mehr Sinn.
Also zunächst, zum Beispiel, ich versuche , um die Nummer drei in der einfügen
sortiert Teil der Liste.
So ist die Liste nicht alles haben.
So kann ich einfach die Nummer drei.
>> Jetzt möchte ich die Zahl 5 hinzufügen die sortierte Teil der Liste.
Also schaue ich mir die Nummer fünf.
Ich merke, dass es größer als 3 ist.
Also ich weiß, dass es nach 3 sein.
Also habe ich 3 und 5.
>> Dann möchte ich die Nummer 2 einfügen.
Ich merke, dass die Nummer 2 ist eigentlich dauern dann jeweils 3 und 5.
So habe ich eigentlich um es allen Weise am Anfang der Liste.
Ich muss also, Art der, verschieben alle Elemente in der Liste sortiert, so kann ich
Platz machen für die Nummer zwei.
>> Dann sehe ich die Nummer sechs.
Ich sehe, dass es nach 5 sein.
Also habe ich es dort.
Und schließlich, schaue ich mir die Nummer 4.
Und ich merke es sollte zwischen 3 und 5 liegt.
Und dann habe ich es dort und Verschiebung alle anderen Elemente.
Sinnvoll?
>> Bubble Sort.
So Bubble-Sort ist im Grunde das, was du bist tun - wir nennen es Blase
Art, weil Sie durch die Liste zu gehen - ist es eigentlich besser, wenn ich nur zeigen
Sie möchten diese -
und du wirst vergleichen sind benachbarte Zahlen.
Und Sie gehen zu tauschen sind ihre Positionen, wenn sie nicht
in der richtigen Reihenfolge.
>> Also im Grunde, was los ist, geschehen wird, ist hier zum Beispiel
Sie haben 8 und 6.
Sie wissen, dass die Sortierreihenfolge wird tatsächlich sein 6 und 5, oder?
So wirst du, um die Aufträge zu tauschen.
Dann sehe ich, 8 und 4 hier.
Und ich tue das Gleiche.
Ich wieder tauschen.
Und schließlich, 2 und 8.
Tausche ich sie auch.
>> Es heißt Bubble Sort, weil nach jeder dieser Iterationen eigentlich
die größte Zahl in der Liste erhält alle die bis zum Ende der Liste.
Heißt das Sinn?
Denn es hält tauschen es und bewegt ihn nach rechts.
>> OK, so ist dies die zweite Iteration.
Es wäre dasselbe sein.
Ich werde tun, eine Swap-und dann wird die letzte.
Ich, dass es keine Swaps und die Liste sortiert.
So in Bubble Sort, wir im Grunde halten gehen Sie durch die Liste und tauschen
Dinge, bis ich merke, dass ich es nicht tun keine Swaps zu tun, dass Iteration, die
bedeutet, dass Liste bereits sortiert ist.
Sinnvoll?
>> Reden wir ein wenig über Laufzeit.
So kann euch erinnern Big O, Omega, Theta und?
Ja?
OK, was ist Big O, erste von allen?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, es ist ein Worst-Case genannt Laufzeit, das bedeutet nur, dass es
wie viel Sie erwarten, dass das Programm zu ergreifen, um auszuführen.
Wie, in Bezug auf die -
in diesem Fall - n.
Die Anzahl der Elemente in der Liste im schlimmsten Fall.
Wie, im schlimmsten Fall.
>> Also für Bubble Sort zB wir haben Big O von n Platz.
Warum müssen wir das?
Warum ist Bubble Sort Big O n Platz?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, so der schlimmste Fall sein wird dass ich muss n Iterationen zu tun.
Also jeder der Iterationen wird sich bis zum Ende zu bringen das größte Element
auf der Liste.
Also der schlimmste Fall ist, dass ich das Ding n-mal zu tun.
Und für jede dieser Zeiten, muss ich n do Swaps, weil ich vergleichen
jeweils zwei Elementen.
Also das ist, warum es n Quadrat denn es ist n mal n.
>> Dann ist auch n quadratische Auswahl sortieren weil für jede Iteration, muss ich
Blick auf jedes einzelne Element in der Liste.
Und dann finden die kleinsten, was bedeutet, dass ich
Blick durch n Elemente.
Und ich habe zu tun, dass die n-mal, weil Ich muss alle n Elemente auswählen.
>> Eine Insertion Sort ist auch n Quadrat weil im schlimmsten Fall wird
werden, ein, muss ich einfügen n Zahlen, oder?
Also ich weiß schon, dass ich gehe, n Iterationen zu haben.
Aber für jede dieser Zahlen, wenn ich auf alle Zahlen in aussehen
die sortierte Liste und legte es den ganzen Weg im vorderen, wird diese n quadratisch
denn es wird n mal n wieder.
Sinnvoll?
Was ist Omega?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Es ist das beste Szenario.
So ist es wie in einer Menge Zeit für Sortieren, ist der beste Fall
wenn die Liste bereits sortiert.
So müssen Sie nicht wirklich nichts zu tun.
Bubble Sort hat die beste Fall von n ist.
Haben Sie Jungs wissen, warum?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, wenn Sie im Auge behalten ob Daten Ration hatte keine Swaps oder
nicht, wenn Sie so etwas wie Set zu haben, dann, wenn es eine Iteration, wenn der
Liste bereits sortiert ist, im Grunde, was passieren wird, ist, dass ich zu gehen
versuchen, jeweils zwei tauschen benachbarten Elementen.
Ich werde sehen, dass es gibt keine Swaps.
Und ich sofort zurück.
>> So bedeutet es, dass ich, nur um gehen Sie durch die Liste einmal.
So ist es, weil ich mir n bei n Elementen.
Warum Selection Sort n quadrieren?
>> Ja, auch wenn die Liste sortiert, für jeder Iteration der Auswahl Art, ich
haben, um die Mindest Element auszuwählen.
Das heißt also, dass ich aus zu sehen bei allen Elementen in der unsortierten
Liste und finden Sie die Mindest für jede Iteration.
Heißt das Sinn?
>> Und Einsetzen Schwert ist n, weil in der Fall, dass ich versuche, legen Sie die
Nummern und alle Zahlen, wenn ich versuchen, sie zu legen, sehe ich, dass sie
in der richtigen Position.
Ich habe nicht zu gehen, überprüfen Sie alle anderen Zahlen in der unsortierten Liste.
Also das ist, warum es n sein.
Sinnvoll?
Und was ist Theta?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Was, sorry?
Sag es noch einmal.
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Genau.
So können Sie sehen, dass nur die Auswahl in Merge sort gespeichert haben thetas.
Und das ist, weil Sie nur Theta wenn die beiden Big O und Omega sind die gleichen.
OK.
Und schließlich verschmelzen sortieren ist in der log n.
>> Und dann, als Dan sagte, Merge sort ist eine Art, wie die gleiche Weise,
Sie binäre Suche zu tun.
So erhalten Sie die Liste.
Und Sie gehen zu halbieren.
Und dann hast du sie schneiden in kleineren Hälften.
Und dann hast du ihnen zu verschmelzen.
Ihr Jungs erinnern, oder?
OK, wie er sagte.
>> OK, Zeiger.
Also, was ist ein Zeiger?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Eine Adresse.
OK.
Ich weiß, dass David zeigt eine Reihe von Videos von Binky und Dinge zeigen
einander.
Aber Ich mag zu denken, von Zeigern als nur eine Adresse.
Es ist also eine Variable, die gehen um eine Adresse zu speichern.
>> So ist es nur diese spezielle Variable dass vier Bytes lang.
Denken Sie daran, dass die Zeiger auf alles ist immer vier Byte lange auf unser 32-Bit-
Maschine so der Fall mit das Gerät.
Und es hat nur die Lage einer Variable darin.
>> OK, so gibt es diese Erinnerung, im Grunde.
So wird jede Speicherblock tatsächlich eine Label, das die Adresse des ist
Slotty Speicher.
Das heißt also, dass ich kann ein Zeiger, der auf
jeder dieser Adressen.
Also der Grund, warum wir Zeiger verwenden ist wenn ich den Speicherort erinnern
dass eine bestimmte Variable ist ein Speicher.
>> Und euch daran erinnern, dass einer von denen Fällen war, wenn ich eine Funktion
wenn ich wirklich möchte, dass Sie Swap für Reals, habe ich eigentlich
haben, um einen Zeiger zu senden.
Nicht die Variable.
Haben Sie daran erinnern, dass Jungs?
Der Unterschied zwischen -
was ist der Name?
Aufruf von Wert und Aufrufen Bezug, oder?
>> OK, ja.
So rufen nach Wert.
Wenn Sie senden Sie einfach eine Variable auf Sie funktionieren nur das Senden eines Wertes.
Sie sind also tatsächlich das Senden eine Kopie der Variable.
Und das Programm ist es egal wäre es, wenn die gleiche Variable tatsächlich
eine Kopie.
>> Und fordert von Referenz bedeutet, dass Ich bin eigentlich Sendung einer Kopie der
Zeiger auf diese Variable.
So bedeutet es, dass ich das Senden der Ort dieser Variablen.
So spüre ich die Position des Variable, wenn ich die Funktion aufrufen
mit Zeigern, ich bin in der Lage, tatsächlich ändern Sie die Daten, die im Haupt war.
Sinnvoll?
>> Obwohl, ist der Zeiger eine Kopie, die Zeiger noch die reale Adresse
die Variable, die ich ändern möchten.
Sinnvoll?
>> So Erstellung Zeiger.
Denken Sie daran, der Zeiger immer der Typ, der es zeigt
zu und dann ein Stern.
Und dann setzen Sie den Namen.
Also denken Sie daran, dass, wenn Sie was Sterne, es ist wie ein Zeiger auf
dass das, was variable geben, dass Sie hatten.
>> Also hier in Stern, zum Beispiel, ist es einen Zeiger und eine ganze Zahl ist.
Und dann char Stern ist ein Zeiger char Sterne und so weiter.
Ja?
>> PUBLIKUM: Was, wenn wir eine Zeiger auf n-Sterne-x.
Ich weiß, dass schafft einen Zeiger auf x.
Ist es auch x eine ganze Zahl zu erklären?
>> LUCAS: OK, also, wenn Sie sagen, n-Sterne-x, Erstellen Sie nicht einen Zeiger auf eine
Variable x.
Sie erstellen einen Zeiger namens x.
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Also wenn ich sage, n-Sterne-x, ich bin sagen, hey, in Erinnerung, ich werde
erhalten Sie eine dieser drei Boxen.
Und ich werde sagen, dass die wird zu x sein, was ist
wird ein Zeiger sein.
Und etwas interessantes Zeiger ist, dass wir sagen, dass sie
4 Bytes für einen 32-Bit-Maschine.
Und der Grund dafür ist, dass 4 Bytes sind 32-Bit.
>> Und Maschinen, die 64 Bit eigentlich Zeiger-Adressen haben
die 64 Bits lang sind.
So ist es nur, dass die Größe der Adressen in der Maschine unterschiedlich ist.
>> So Referenzierung und Dereferenzierung.
Es gibt zwei Operatoren, die Sie sollten daran denken, Jungs.
Die erste ist die Ampersand.
Die zweite ist Stern.
Lassen Sie sich von diesem Stern und das verwirrt Sterne, weil daran erinnern, dass in
In diesem Fall haben Sie n-Stern.
>> Es ist wie eine ganze Sache zusammen.
Es gibt keinen Raum n Stern.
So bedeutet es, dass es der Typ.
Denken Sie daran, dass, wenn Sie der veränderliche Stern, du bist
Gespräch über den Typ.
>> Wenn Sie gerade Sterne und dann die Name der Variablen ist, bedeutet dies, dass
Sie sind Dereferenzierung der Zeiger, die bedeutet, dass Sie bei der suchen
Zeiger, der Suche nach der Adresse, es ist zeigt auf, gehen an diese Adresse,
und sah, wenn Sie haben es.
So sage ich meinen Studenten, dass, wenn Sie Sterne, sollten Sie denken, dass es
die Abkürzung Gehalt.
>> Also, wenn Sie einen Zeiger, und Sie Sternzeiger tun, es ist die
Inhalt des Zeigers.
Sie wollen also, was auch immer es ist zu zeigen gehen und Blick auf die konstanten Gehalt.
Und das Und-Zeichen ist das gleiche etwas wie Adresse.
>> Also wenn ich eine Variable ein - wie, lassen Sie uns sagen, dass ich ein int gleich 3 -
wenn ich will, dass die Adresse zu finden Variable eine Erinnerung, kann ich nur tun,
Ampersand ein.
Also ist es eine Adresse.
Sinnvoll?
>> Also hier ist ein Beispiel.
Diese fehlt int b und int c.
So int a = 3 bedeutet, dass Ich werde in den Speicher zu gehen.
Und ich werde einen Steckplatz finden und setzen die Zahl 3 hier.
>> Und dann gleich 4 int b.
Ich werde das gleiche tun.
Zum Speicher und legte eine Reihe 4 in einer der Boxen.
Und int gleich 5.
Finden Sie ein anderes Feld und legte eine Reihe fünf.
>> Also, was ist diese Linie tun Sie? n-Sterne-pa entspricht Et-Zeichen ein.
Also zunächst einmal, n-Sterne-pa.
Wie ist es da?
>> ZIELGRUPPE: [unverständlich].
>> LUCAS: Ja, so n-Sterne-pa, zuerst, deklariert einen Zeiger pa genannt.
Und dann ist es die Zuordnung der Wert der dass Zeiger auf die Adresse einer.
So Ampersand ein.
Dann, wenn ich Sterne pb, was ist ein Stern pb?
>> Oh, sorry.
Dies wird auch fehlen. n-Sterne-pb.
Ich meine Sterne-PC.
Tut mir so leid.
Es ist die gleiche Sache.
Aber jetzt bin ich gut ar Schaffung eines Zeigers zu b und dann ein Zeiger auf c.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Ja.
Also, wenn Sie gehen, um Speicher und Sie gehen Die Box, die Bezeichner für pa ist,
Sie tatsächlich zu sehen eine Adresse ein.
OK?
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Ja, das ist ein Pointer-Adresse.
Vergessen Sie nie, dass.
Es ist wie die wichtigsten Teil über Zeiger.
Es ist die Speicherung und Adresse teil variabel.
Sonst noch was?
Noch Fragen?
OK.
>> So Pointers und Arrays.
Denken Sie daran, dass, wenn ich int-Array 3, im Grunde, was ich tue, ist, ich bin, Art
von und erklärte in einem Zeiger.
So Array ist ein bisschen wie ein Zeiger auf ein bestimmten Ort in Erinnerung, in denen ich
für ganze Zahlen zugeordnet drei Slots.
Heißt das Sinn?
>> Also, wenn ich int-Array 3, was ich bin Dabei ist grundsätzlich die Schaffung von drei
Schlitze im Speicher.
Also habe ich nur drei Steckplätze finden im Speicher.
Also, wenn ich das tun, dann, ein Stern Array, es im Grunde bedeutet, der Inhalt des Array,
was bedeutet, dass ich den Zeiger zu löschen, gehe ich an diesen Ort, die es zeigt auf,
und ich habe die Nummer eins.
>> Und dann, wenn ich Sterne-Array plus 1, das ist das gleiche wie zu tun Array
Klammern ein, das bedeutet nur, dass ich zu der Ort, der es an zeigt.
Und dann die plus 1 macht mich um eine Position.
Also gehe ich auf diese Position, eigentlich und legte die Nummer zwei.
>> Und dann, endlich, wenn ich Array plus 2, gehe ich dorthin, wo
Zeige Arrays an.
Und dann gehe ich auf die Speicherblöcke.
Und dann habe ich die Nummer drei hier.
Ja?
>> ZIELGRUPPE: Also Sterne Array ist einfach sagen, die erste Stelle.
Und Sie können 1 hinzufügen, nur weil Wir sind nur dann wirklich
verweisen, dass die erste Adresse.
>> LUCAS: Ja.
Warum haben wir zum Beispiel sagen, Array 0, 1 Array und Array 2?
Ich sage, warum Sie tun, 0, 1, 2, 3 anstelle von 1, 2, 3?
Einer der Gründe ist, ein Computer Programmierer lieber starten
Zählen von 0.
Zwei ist, denn wenn man 0-Array zu tun, es ist das gleiche wie zu tun Array
plus 0, was bedeutet, ich gehe zu , dass die Position, und ich weiß nicht
keine Speicherblöcke überspringen.
Also ich habe keine Speicherblöcke zu bewegen.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Also sie zu fragen, was ist der Unterschied zwischen tun
oder tun dies malloc.
Einer der Unterschiede ist, dass int-Array 3 schafft ein
Array auf dem Stapel.
Und wenn ich malloc zu tun, es schafft auf dem Heap.
Heißt das Sinn?
>> Und wie funktioniert malloc eigentlich?
Warum also brauchen wir auch, um malloc benutzen?
Ihr Compiler Art von Figuren aus allen die Variablen, die Sie erklärt.
Und er schafft Raum für alle von ihnen in den Stapel.
Also alle Ihre Variablen gehen irgendwo in dem Stapel sein.
So, hier ist die Umgebungsvariablen.
>> Also im Grunde, Raum für diese Variablen in Erinnerung an zuge
Kompilierung.
So bedeutet es, dass Ihr Computer , alle diese Variablen zu kennen
vorher.
Es muss nicht wissen, welchen Wert wirst du in ihnen.
Aber es muss wissen, wie viel Speicher Sie benötigen.
>> Aber jetzt lassen Sie uns sagen, dass, zum Beispiel, Sie erstellen ein Array oder sich ein
Zeichenfolge, die Sie einnehmen von dem Benutzer.
Sie wissen nicht, wie lange die Saite sein wird, zum Beispiel.
So wissen Sie nicht genau, wie viele Speicherblöcke Sie zuweisen, oder?
>> So ist es nicht wirklich sinnvoll, dass Sie sagen 100 Zeichen setzen.
Und was dann, wenn der Benutzer schreibt 150?
Du wirst aufgeschraubt werden.
>> Also im Grunde, kann man nicht sicher sein, wie sein viel Speicher Sie zuweisen müssen
wenn Sie das Programm kompilieren.
Sie weiß nur, dass auf Laufzeit.
Also das ist, warum Sie die Haufen zu haben.
Also der Haufen wird sich Gedächtnis haben dass Sie während der Zuweisung sind
Dauer der Programmlauf.
>> Also im Grunde, wenn man malloc zu tun, was Sie tun, ist das Zuweisen von Speicher an
Laufzeit, was bedeutet, dass Sie in diesem Moment der Entscheidung richtig, dass Sie
haben sollte, dass der Speicher.
Also das ist, wenn Sie es Zuweisung.
Heißt das Sinn?
>> Also denken Sie daran, der Stapel Variablen , die auf der Kompilierung erstellt.
Und dann hat der Heap Variablen , die erstellt werden, wie Sie gehen
mit malloc, zum Beispiel.
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Also ist GetString werde malloc anrufen.
Lassen Sie mich über malloc zu sprechen, und Ich werde GetString erklären.
So malloc dasselbe ist als Speicherzuweisung.
Also, es wird vergeben Speicher auf dem Heap.
Und es geht um einen Zeiger auf Rückkehr , wo das Gedächtnis wurde zugeordnet.
>> Also, wenn Sie zu tun -
hier zum Beispiel -
n-Sterne-Zeiger.
Und dann gleich Zeiger malloc Größe der Zoll mal 10.
Ich erstelle einen Zeiger.
Und dann bin ich, dass die Zeiger auf die Zuordnung der Wert des Zeigers, dass malloc
ist er mir.
>> Also ich frage malloc können Sie zuweisen Platz für 10 Zahlen.
Das ist, was es sagt.
Und malloc gibt mir wieder ein Zeiger an diesen Ort.
Sinnvoll?
OK.
Und ich GetString wird, im Grunde tut ein Aufruf von malloc, so dass Sie zuordnen können
Speicher während der Laufzeit.
>> Immer daran denken, für null überprüfen weil malloc wird zu null zurück
wenn es keinen Speicher zuweisen.
Lassen Sie uns sagen, dass Sie für einen lächerlichen fragen Speichermenge.
Ihr Computer ist nicht sein Lage, viel zuweisen, dass.
>> So malloc ist gerade dabei auf null zurück.
Also immer daran denken, zu prüfen, ob die Zeiger, die Sie von malloc habe ist
null oder nicht, weil, wenn es ist, könnten Sie werden Dereferenzierung eines Zeigers und
dass Nebenfehler.
Und schließlich, nicht zu vergessen Ihren freien Speicher.
>> Malloc schafft Speicher im Heap.
Und Sie, um den Speicher frei zu haben bevor das Programm endet.
OK, das ist alles für mich.
Sorry, Rob.
Vielen Dank.
>> [Applaus]
>> LUCAS: Irgendwelche letzten Fragen vor Rob kommt?
Nein?
Ja?
>> ZIELGRUPPE: Ich habe nicht gesehen dieses online.
Hast du es hochgeladen?
>> LUCAS: Ich denke, Dave ist bald hochzuladen.
>> DAVE: Es wird bekannt gegeben.
>> LUCAS: Es wird online sein.
>> ZIELGRUPPE: Es ist oben.
>> LUCAS: Es ist oben?
OK.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Ja, Sie befreien sollten alle Speicher, der in der Halde gelegt wird.
>> ZIELGRUPPE: [unverständlich]?
>> LUCAS: Ja.
Jedes Mal, wenn eine Kultur malloc haben, Sie sollten eine Kultur frei zu haben
nachdem Sie die Verwendung dieser Variablen.
So malloc und free sind immer zusammen.
Ihre besten Freunde.
Ja.
Rob?
>> ROB: Ich werde schnell gehen.
Und auch das Video wird aufgestellt werden.
Ich habe das Mikro an.
>> OK, also fünf Wochen Zeug.
Das erste, was wir haben, ist der Stapel.
Also denken Sie daran, dass es nur ein Stapel Bild pro aktiven Funktionsaufruf.
Wir werden das in einem zweiten zu sehen.
Und auch daran erinnern, was wirklich geht in jeder Stapelrahmen sein werden
die lokalen Variablen der Funktionen, die Argumente, die übergeben werden, in unserem
Funktionen, zusammen mit ein paar andere Dinge, die Sie nicht wirklich
sich Sorgen machen müssen.
>> Also hier ist ein Beispiel-Programm, wo, Ankündigung, Haupt printfing wird die Rückkehr
Wert von foo 4.
foo ist gerade dabei, die zurückkehren Wert von 6 bar 4 Komma.
Und bar wird einige lokale eingestellt Variable n gleich 4 mal 6.
Und dann n zurück.
>> Also schauen wir uns an der gesamten Stapel die eigentliche Iteration des Programms.
So gibt es die Unterseite unserer Stack.
Denken Sie daran, dass der Stapel wächst.
Also an der Unterseite unserer Stapel, wir haben einen Stapelrahmen für Haupt.
Wenn das Programm startet, Haupt wird immer auf die sein
Unterseite unserer Stack.
>> Und, was in unserer Stapelrahmen für Haupt?
Also auch wenn es keine lokalen Variablen, die Haupt-, wie ich schon sagte,
wir haben argc und rgv nehmen Platz Innenseite der Hauptstapelrahmen.
Also Haupt geht jetzt um rufen Sie die Funktion foo.
Und das bedeutet, foo wird sich bekommen ihren eigenen Stack-Frame.
>> So, jetzt haben wir Innenseite sind die Funktion foo.
Und was muss gehen Stapelrahmen foo?
Nun, foo ein Argument n.
Und n gleich 4 ist da das ist, was Haupt wird als Argument foo ist vorbei.
>> So, jetzt foo wird sich Bar an.
Was ist bar gehen, um im Inneren haben ihrer "Stapelrahmen?
Es hat gleich 4 x y gleich sechs.
Das ist nicht alles, die wir zu haben, in der Stapelrahmen, weil bar
hat auch eine lokale Variable n.
Und n wir gehen gleich 24 zu setzen.
>> So, jetzt Bar wird sich n zurück.
So bar zurückkehrt 24 bis der Stapelrahmen foo.
Und weil bar kehrt nun, dass bedeutet, dass wir knallen die Stapelrahmen
für Bar vom Stapel.
Also alle die Erinnerung, die Bar war Hilfe ist nun aus dem Stapel.
>> Nun wird sich auch foo , um zum Haupt 24 zurück.
So, jetzt, dass foo der Rückkehr, der Speicher dass foo wurde mit in ihre "
Stapelrahmen ist auch weg.
Und jetzt ist der Haupt werde printf anrufen.
So printf ist nur eine andere Funktion.
Wenn wir als printf, es geht um sein ein weiterer Stapelrahmen für die printf
Funktionsaufruf.
>> Was passieren wir printf?
Das ist, was los ist, gehen auf seinem Stapelrahmen.
Zumindest übergeben wir Prozent, dass i n und Backslash
das Argument 24.
Es könnte mehr in es stapeln Rahmen wenn printf passiert zu sein mit einigen
lokalen Variablen.
Wir wissen es nicht.
>> Aber all das geht in die printf Stapelrahmen.
Es wird die printf auszuführen.
Dann printf getan hat.
Es wird zurückkehren.
Schließlich Haupt ist getan.
Haupt zurückkehren wird.
Und dann unser Programm durchgeführt wird.
Ja?
>> ZIELGRUPPE: Sind Sie sehen [unverständlich]
Argumente [unverständlich]
Parameter?
>> ROB: So gibt es einen feinen Unterschied zwischen Argumenten und Parametern.
Und wirklich, gemeinsam sprechen, neigen die Menschen nur mischen sie die ganze Zeit.
Aber Parameter sind die formalen Namen der Dinge.
>> So argc und argv sind die Parameter zur Haupt.
Argumente sind, was Sie wirklich übergeben, wie dieser Parameter.
So gibt es, wenn ich rufe foo von 4, 4 ist das Argument, ich bin vorbei in.
Und die Parameter n, innerhalb von foo, nimmt den Wert 4
seit 4 war das Argument.
>> ZIELGRUPPE: [unverständlich]?
>> ROB: n ist eine lokale Variable zu sperren.
n ist immer noch lokal auf foo, aber es ist ein Parameter foo.
Es ist nicht eine lokale Variable.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: foo ist nur fordern, Bar und Rückkehr auch immer bar zurück.
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Ja, nur, um mehrere zu sehen Stapelrahmen.
Ja?
>> ZIELGRUPPE: Warum wurde foo genannt vor printf?
>> ROB: Warum wurde foo vor printf genannt?
Also ich hätte stattdessen etwas getan wie int x gleich foo von 4
und dann gedruckt x.
Doch statt kombinierte ich die Funktion rufen in die printf-Argument.
>> Aber beachten Sie, dass wir nicht wirklich den Aufruf von printf auszuführen, bis wir
herauszufinden, was foo von 4 ist.
So werden wir dies beurteilen.
Und nur einmal das erledigt ist gehen wieder zu kommen und diese zu bewerten.
Ja?
>> ZIELGRUPPE: Da sowohl bar [unverständlich]
Wert ist, warum haben wir nicht [unverständlich]?
>> ROB: Sie sollten ganz int sein.
Das war nicht mehr gefangen mehreren Durchgängen.
So sollte es eine Bar und ein int int sein foo da beide von denen
kehren Zahlen.
Leere ist nur, wenn sie nicht gehen Istwerte zurückliefern.
Ja?
>> ZIELGRUPPE: Wenn Sie über eine Linien die Rückkehr, [unverständlich]?
>> ROB: Eine Zeile über der Rendite?
>> ZIELGRUPPE: Ja.
Wie, wenn Sie nicht printf und [unverständlich], würde es zweimal ausdrucken?
>> ROB: Also innerhalb von foo?
Wenn wir eine printf hier richtig?
>> ZIELGRUPPE: Ja.
>> ROB: Also, wenn wir eine printf Recht hatte hier wäre es einmal zu drucken.
Da fordern wir foo einmal rechts hier, dann werden wir die printf getroffen.
Dann werden wir Leiste aufrufen.
Und dann werden foo zurück.
Und das ist es.
Wir haben nur je begegnen printf einmal.
Ja?
>> ZIELGRUPPE: [unverständlich]
printf Aufruf foo, weil wir zuerst Aufruf printf und dann sind wir vorbei
die Argumente.
>> ROB: Also in der Theorie, ist nicht printf Aufruf foo?
Also keine.
Nur die Reihenfolge, c wird sich führen diese Dinge, bevor wir können
eine Funktion aufrufen, alle Argumente an die Funktion zu haben,
vollständig ausgewertet werden.
So wird diese vollständig ausgewertet?
Ja, es ist nur ein String.
Es ist nur ein Wert.
>> Dann haben wir vollständig bewerten diese.
Sobald dies geschehen ist, nun alle Argumente werden ausgewertet.
Und jetzt können wir die Aufruf von printf.
Ja?
>> ZIELGRUPPE: Eine Frage.
Wenn Sie eine Lücke Funktion haben, müssen Sie haben Rück Semikolon?
>> ROB: Sie müssen nicht eine Rückkehr Semikolon wenn Sie eine Funktion nichtig.
OK.
So, jetzt einige Haufen Zeug.
So Heap ist, wie wir zu bewältigen mit dynamischer Speicherverwaltung.
Und diese direkt im Gegensatz zu der stapeln, die wir nennen würde automatischen
Speicherverwaltung.
>> Also auf dem Stapel, nie haben Sie wirklich mit, wie die lokalen Variablen umgehen
werden geschoben und alle tauchte ab diese Stack-Frames und all das Zeug.
Sie haben keine Sorgen zu machen.
Es ist automatisch.
Also der Haufen ist manuell.
Und die [unverständlich]
kommt von diesen Funktionen malloc und kostenlos.
>> Also hier ist ein anderes Programm.
Alles, was wir tun, ist mallocing eine ganze Zahl ist.
Wir speichern sie in Sterne-x.
Natürlich müssen wir überprüfen, zu sehen, wenn x ist null.
Dann werden wir gerade eingestellt, was x wird auf 50 zeigt.
Drucken Sie, was x zu zeigen ist, print x, x und dann frei.
>> Also, wie ist das eigentlich gut aussehen wird wenn wir uns auf unsere Stack und Heap?
Also werden wir wieder starten.
Der Boden unserer Stapel wie vorher.
Denken Sie daran, dass dir häufen direkt wendet sich gegen die Stapel?
So werden wir zu haben, die Spitze unserer Haufen da oben.
>> So ist die Unterseite unserer Stapel, haben wir Stapelrahmen für unsere Haupt.
Es hat den Raum für argc, argv, und wir haben nun eine lokale Variable x, die
ist ein int Stern.
So werden wir zu durchlaufen durch dieses Programm.
Das erste, was wir haben, ist ein Aufruf von malloc.
>> Also machen wir einen Aufruf von malloc.
Malloc ist eine Funktion.
Es geht um einen Stapelrahmen zu bekommen.
Was passieren wir malloc?
Das wird nach innen zu gehen der Stapelrahmen.
Wir sind vorbei Größe von n, die 4 ist.
Damit wird malloc geleitet.
>> Was malloc tun?
Es packt uns etwas Platz auf dem Heap.
So werden wir auf den Heap zu gehen.
Und wir werden zu greifen 4 Bytes auf dem Heap.
Lassen Sie uns also nur geben, dass eine beliebige Adresse.
0x123 Einfach so tun, das ist eine Adresse, die auf dem Heap.
>> Also, was ist eigentlich in der die Speicherbereich an der Adresse Ox123?
Garbage.
Also wir haben nichts in ihr gespeichert.
Also so weit wir wissen, ist es könnte alles sein.
Sie sollten nicht davon ausgehen, es ist null.
Es ist sehr wahrscheinlich nicht Null.
>> So, jetzt malloc Renditen.
Und was tun wir, wenn malloc zurückkehrt?
Wir setzen, was es gibt.
Wir setzen x gleich, was sie kehrt zurück.
Also, was ist der Rückkehr?
Es zurück 0x123 da dies die Adresse des Speicherblocks, dass es
nur in dem Heap zugewiesen.
>> Also zurück 0x123 x wird jetzt eingestellt werden gleich 0x123, die, bildhaft,
ziehen wir häufig als x mit einem vorhandenen Pfeil nach diesem Block.
Aber x ist nur die Speicherung dieser Adresse.
So, jetzt müssen wir überprüfen, ob x ist null.
Es ist nicht null.
Wir geben vor, dass malloc gelungen.
>> So, jetzt Sterne-x gleich 50 ist.
So erinnert es bedeutet Sterne gehen an diese Adresse.
So 0x123 Wir werden gehen an diese Adresse.
Also das bringt uns da oben.
Was tun wir an dieser Adresse?
Wir speichern 50.
>> Also nach dieser Linie, ist das, was Dinge aussehen würde.
So jetzt ist es nicht mehr Müll dort oben.
Jetzt wissen wir, dass 50 ist, dass besondere Adresse, da
setzen wir sie auf, dass.
OK?
So, jetzt werden wir f drucken.
>> Also zuerst werden wir Sterne x drucken.
Also, was ist Sterne-x?
Auch Sterne-x Mittel gehen, um die Sache, dass x verweist.
Also x speichert 0x123 Go dazu.
Wir erhalten 50.
So drucken Sie, dass f.
Und das bedeutet, es geht um 50 drucken.
Und dann, die zurückgibt.
>> Und dann haben wir die zweite printf.
Wir sind jetzt Prozent p.
Wenn Sie es nicht gesehen haben, das ist nur, wie Sie einen Zeiger zu drucken.
So haben wir i Prozent, Prozent f, und alle diejenigen, die bereits.
So Prozent p, drucken einen Zeiger.
>> X so ist ein Zeiger.
Also, wenn wir gehen, um x selbst zu drucken, drucken wir, was tatsächlich in
x, der 0x123 Also der erste ist Druck f Drucklegung 50.
Die zweite Druck f wird 0x123 zu drucken Ja?
>> ZIELGRUPPE: Haben Sie Prozent verwenden x, um einen Zeiger zu drucken?
>> ROB: So haben Sie Prozent verwenden x, um einen Zeiger zu drucken?
So können Sie aber nur x Prozent, allgemein für wie wenn Sie einige haben
Integer-und die Sie drucken möchten es als hexadezimal.
Das ist einfach, wie Sie das tun.
>> Ange Prozent würde d drucken als Dezimalzahl.
Das waren wir bekommen Prozent d. i ist nur Integer.
Prozent p ist speziell für Zeiger.
>> X so ist ein Zeiger.
Wir wollen Prozent p zu verwenden.
Aber Prozent x funktionieren könnte.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Ja.
Zumindest für diesen Anruf - so dass ich nicht enthalten sie hier.
Aber diese beiden Argumente sind notwendigerweise Innere dieser Stapelrahmen
zusammen mit allen lokalen Variablen printf passiert zu sein mit.
Und dann der nächste Aufruf jetzt printf innerhalb von printf Stapelrahmen ist
Prozent p Backslash n und unabhängig von der Wert von x, die 0x123 ist.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Es wird etwas zu drucken das sieht aus wie diese.
>> ZIELGRUPPE: [unverständlich].
>> ROB: Also druckt er in Adressformular.
Es sieht aus wie eine Adresse.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Warum ist was?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Warum ist dieser Zeiger 4 Bytes?
So gibt es eine ganze Reihe von 0 hat vor diesem.
So ist es wirklich 0x0000000123.
Auf einem 64-Bit-System, gäbe es eine ganze Reihe von mehr Nullen.
Ja?
>> ZIELGRUPPE: [unverständlich].
>> ROB: Also der erste printf wird zu drucken -
>> ZIELGRUPPE: [unverständlich].
>> ROB: Ja, es geht um die Druck welche x zeigt an.
Stern sagt, was ist das Sache, die auf.
Schnappen Sie es.
Also was ist es zu zeigen?
50.
Schnappen Sie es.
Das ist, was wir zu drucken.
Während der nächsten ein, wir sind nur Druck x selber.
Was innerhalb von f?
0x123.
OK.
>> Und dann, endlich, haben wir das kostenlos.
Was passieren wir zu befreien?
Wir sind vorbei x.
Diese Zeit habe ich eigentlich angezeigt in dem Stapelrahmen.
>> Also sind wir das Bestehen der Wert 0x123 zu befreien.
So, jetzt kostenlos kennt, alle Rechte, Ich muss gehen bis zu dem Haufen
und frei, dass der Speicher.
Es ist nicht mehr mit, was ist an der Adresse 0x123.
>> So frei wird sich lösen dass aus dem Haufen.
Jetzt ist unser Haufen ist wieder leer.
Wir haben keine Speicherlecks.
Jetzt kostenlos zurückkehren wird.
Beachten Sie, dass x ist immer noch 0x123.
Aber das ist jetzt nicht gültig Speicher.
Wir sollten nicht mehr dereferenzieren x.
Ja?
>> ZIELGRUPPE: Ist 0 zurück redundant?
>> ROB: Ist returen 0 redundant?
Ja.
Wir haben nur, dass es da wir haben eine Rück ein nach Luft.
So ist es wie, ja, können gehören die return 0.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Also nach kostenloser x, was passiert, wenn wir versuchen, den Zeiger dereferenzieren?
Es ist möglich, dass nichts schief geht.
Es ist möglich, dass wir immer noch 50.
>> Es ist möglich, auch, dass, dass der Speicher nun für etwas anderes verwendet wird.
So ist es nicht definiertes Verhalten.
Und undefined etwas bedeutet kann passieren.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Nein, also, wenn Sie zuweisen x auf etwas anderes.
Also, wenn wir hier die x gleich malloc etwas anderes -
malloc Größe Veranstaltung -
dann, dass die ursprünglichen Block der Speicher wird nicht freigegeben.
Und wir haben es offiziell verloren.
Das ist ein Speicherleck.
Wir haben alle Verweise verloren in diesem Speicherblock.
Also gibt es keine Möglichkeit können wir jemals befreien sie.
OK, also dann 0 zurück Mittel erfolgen.
>> Alles klar, so Stapelüberlauf.
Was ist die Idee hier?
Also denken Sie daran, Haufen wird runtergefahren.
Stapel steigt.
Das war also das Beispiel aus Vorlesung, Ich denke, in dem die Haupt ist gerade dabei,
rufen Sie diese Funktion foo, die gehen zu sich selbst rekursiv aufrufen und über
wieder.
>> So Stapelrahmen sind los funktionieren genau gleich.
So werden wir mit den Haupt starten wie der Boden Stapelrahmen.
Dann wird sich Haupt foo, rufen Sie die wird eine Stapelrahmen zu bekommen.
>> Dann wird foo foo nennen wieder, die gehen, um zu bekommen
ein weiterer Stapelrahmen.
Und dann wieder, und wieder, und wieder, und immer wieder, bis schließlich laufen wir
in den Haufen.
Also das ist, wie wir ein Stapelüberlauf.
Und an diesem Punkt, seg Sie Schuld.
Oder Sie würde wirklich seg Fehler vor dieser Punkt aber ja.
>> ZIELGRUPPE: Ist der Kern-Dump gleiche wie seg Schuld?
>> ROB: So werden Sie sehen, Segmentierung Fehlerkern geworfen.
Sie erhalten einen Core-Dump, wenn Sie seg Schuld.
Und es ist wie ein Abbild der alle der Inhalt der aktuellen Speicher so
dass Sie versuchen, sich identifizieren können warum Sie seg gestört.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: So ein Segmentation Fault bedeutet es gibt einen Stack-Überlauf.
Also nicht unbedingt.
Eine Segmentierungsfehler bedeutet, dass Sie Berühren Speicher in einer Weise,
Sie sollte nicht sein.
So ein Weg, dass das passiert ist, wenn Sie Lauf stapeln, beginnen wir berühren
Speicher in einer Weise, dass wir nicht sein sollte.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Also innerhalb einer Endlosschleife.
Wie, das ist wie ein unendlich rekursive Schleife und so haben wir anderen zu gelangen
Stapelrahmen jeder Zeit.
Aber gerade innerhalb eines regulären unendlich, während ein -
Nun, lassen Sie uns nicht sogar ausdrucken f -
etwas zu tun.
Was auch immer.
>> Wir gehen nicht zu sein, immer ein weiterer Stapelrahmen.
Wir sind gerade dabei, Looping halten über diesen Einzelunterricht.
Der Stapel wächst nicht.
Es ist die Tatsache, dass jede rekursive Anruf gibt uns einen Stapelrahmen.
Deshalb haben wir einen Stapelüberlauf zu bekommen.
Ja?
>> ZIELGRUPPE: Also, wenn Sie das zu bekommen, die while-Schleife und dann [unverständlich]?
>> ROB: Also, wenn innerhalb der while-Schleife gab es eine printf, würden Sie immer noch
nicht seg Schuld.
Ich wollte nur nicht, Dinge zu verwechseln.
Es wäre Schleife.
Sie würden einen einzelnen Stapel zu bekommen Rahmen für die printf.
>> Dann printf zurückkehren würde.
Dann würde wieder Schleife.
Sie würden einen einzelnen Stapel zu bekommen Rahmen für die printf.
Es würde zurückkehren.
Einzelstapelrahmen.
Sie sind also nicht immer diese unendliche häufen sich Stack-Frames.
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Ja.
Also das Stack-Überlauf passiert weil keine von diesen
Anrufe auf foo kehren zurück.
Also, wenn wir zurückkommen, dann würden wir beginnen zu verlieren Stack-Frames.
Und dann wären wir nicht in Stack-Überlauf.
Und das ist, warum Sie einen Basisfall müssen für Ihre persönliche Funktionen.
Ja?
>> ZIELGRUPPE: Ist der potenzielle Größe und die Stack für den Heap das gleiche für
alle Programme?
>> ROB: Rund.
Ist die potenzielle Größe des Stapels und der Heap für alle Programme?
Rund.
Es gibt einige der Randomisierung bis wo beginnt der Stack und
wo der Haufen beginnt.
Wenn Sie geschehen, eine ganze Menge haben globale Variablen und Dinge, könnten Sie
weg von etwas Platz für Ihre Haufen.
>> Auf einem 64-Bit-System, können Sie praktisch haben unendlich Speicher.
Es gibt einfach so viel.
Zwischen 32 Bit und 64 Bit, dass ist ein bedeutender Unterschied.
>> Sie werden eine ganze Menge mehr zu bekommen Stack und Heap-Speicher auf einem 64-Bit-
System, weil es einfach mehr Adressen, die sie nutzen können.
Sondern auf einem einzelnen System, wird es ist etwa die gleiche Menge an Stapel
und Heap-Speicher.
Gut.
>> Also letzte Sache ist, Zusammenstellung.
Deshalb sollte man diesen Prozess kennen.
Es gibt vier große ***.
Also der erste sollte man leicht zu merken.
Pre-Processing.
Es hat das Präfix vor in sie.
Also, bevor alles andere kommt es.
>> Das ist daran zu erinnern, ist der Hash.
So definiert und Hash-Hash enthält in all diesen.
Das sind alles Pre-Prozessor Richtlinien.
Das sind die Dinge, die der Pre-Prozessor übernimmt.
>> Also, was macht ein Pre-Prozessor zu tun?
Es ist eine wirklich dumme Sache.
Alle es ist in der Lage, sind alle diese Kopieren und Ausschneiden und Einfügen.
>> So umfasst Standard-Hash-i0 h dot.
Was ist das denn?
Es greifen die Standard-i0 dot h Datei und Einfügen in die Top
wo immer es sagt Hash enthält Standard i0 h dot.
>> Und jeder Hash definieren, dass wir gesehen, was ist das denn?
Seine Kopieren der Wert, der den Hash- definiert ist, wie und Einfügen, die definiert
überall dort, wo Sie mit den Wert.
So macht der Präprozessor nur wirklich einfachen Text-basierte Operationen.
Es tut nichts, smart.
Also alles andere ist komplizierter.
>> So, jetzt ist Präprozessor getan, wir tatsächlich zu kompilieren.
Also, was bedeutet Kompilieren das?
Wir gehen jetzt von C-Code zu Assembler-Code.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Ja, gefangen wir.
So kompilieren.
Wir gehen von c bis zur Montage.
Also das ist eine tatsächliche Änderung der Sprache.
Kompilieren selbst bedeutet, sich von eine höhere Sprache
eine geringere Sprache.
>> Und c ist eine Hochsprache im Vergleich zur Montage.
Was ist die Montage?
Die Anweisungen, die sind ziemlich viel, für Ihre CPU gemacht.
Aber der Computer immer noch Montage nicht zu verstehen.
Es versteht nur Einsen und Nullen.
Der nächste Schritt ist die Montage, die bringt uns von diesen Anweisungen,
Ihre CPU versteht und tatsächlich übersetzt sie, um
Die Einsen und Nullen.
>> Also C über die Montage bis binär.
Aber ich glaube nicht eine ausführbare Datei ist leer.
Also denken Sie an den CS50-Bibliothek.
Wir haben euch mit einem binären vorgesehen Diese CS50-Bibliothek, die GetString hat
und GetInt und das alles.
>> Aber der CS50-Bibliothek -
an und für sich - ist nicht ausführbar.
Es muss nicht eine Hauptfunktion.
Es ist nur ein Haufen von binären die Sie verwenden können.
So Verknüpfung ist, wie wir alle zusammen zu bringen dieser verschiedenen Binärdateien
in eine tatsächliche ausführbare Datei.
Eine, die Sie eingeben können dot Schrägstrich einen Punkt aus.
>> Also das ist wie der Datei, die Sie schrieb - was auch immer Ihr Programm ist -
Caesar Punkt c.
Aber jetzt ist es kompiliert auf binär.
So Ceaser dot o.
Und das ist unser CS50 Bibliotheken binär.
Und sie kombiniert in einer einzigen ausführbaren Datei.
Ja?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Also zuerst, denken Sie daran, der Hash enthalten ist eigentlich ein
Pre-Prozessor Schritt.
Aber das ist getrennt.
Wenn Sie nicht mit Funktionen, die keine sind außerhalb der einzigen Datei dann,
Nein, Sie müssen nichts verlinken da Sie alles haben.
>> Das heißt, wird printf wird in. verknüpft
Wenn Sie jemals printf verwenden, das ist etwas das muss in verknüpft werden
weil Sie nicht schreiben wollte, dass.
Und in der Tat automatisch printf verknüpft in.
Sie wissen, wie in der Befehlszeile oder wenn Sie geben zu machen, sehen Sie es
Strich l CS50, der Link hat in der CS50-Bibliothek?
Printf, und so was, wird in automatisch verknüpft werden.
Alle anderen Fragen auf irgendetwas?
>> ZIELGRUPPE: [unverständlich]?
>> ROB: Verknüpfung?
Wir haben eine ganze Reihe von verschiedene binäre Dateien.
Dies ist das kanonische Beispiel dass wir verwenden, ist CS50-Bibliothek.
Wir haben zusammengestellt, um Ihnen und dem angegebenen Binary für dieses CS50-Bibliothek.
>> Sie wollen GetString verwenden in Ihrem Programm.
So können Sie gehen und GetString.
Aber ohne meine Binärcode für GetString, wenn Sie Ihren Code kompilieren
nach unten, kann man nicht wirklich laufen können Ihre Programm, weil GetString String ist
noch nicht vollständig definiert.
>> Es ist nur, wenn Sie in meinem binären verlinken enthält, dass GetString, dass jetzt alle
Recht, kann ich eigentlich GetString ausführen.
Meine Datei ist abgeschlossen.
Und ich kann diese ausgeführt werden.
Ja?
>> ZIELGRUPPE: Hat die Verknüpfung umwandeln die binäre ausführbar gemacht?
Also selbst wenn Sie nicht über andere Bibliotheken, wäre es nicht noch sein
notwendig, um zu übersetzen die [unverständlich]?
>> ROB: Also eine ausführbare ist immer noch in binär.
Es ist nur die Kombination einer ganzen Bündel von Binärdateien.
>> ZIELGRUPPE: Vielen, vielen Dank.
>> ROB: Kein Problem.
Noch Fragen?
Ansonsten sind wir alle eingestellt.
Gut.
Vielen Dank.
>> [Applaus]
>> ZIELGRUPPE: Danke.
>> ROB: Ja.