ENCEINTE 1: Salut tout le monde. Nous allons commencer. Je pense que les gens sont toujours en cours pour être en filtration. Mais dans l'intérêt de temps, afin que nous puissions obtenir les gars d'ici à temps, nous allons commencer. Alors bienvenue à la CS50 Quiz 0 avis. Pour ceux d'entre vous qui n'ont pas réalisé encore, vous avez une question mercredi. Woo-hoo. Si vous n'avez pas encore commencé à étudier ou n'ont pas réalisé que cela existe encore, quiz passées et toutes les informations sur votre quiz sont sur cs50.net/quizzes. Il ya des trucs assez bon là-bas, quiz dernières de la dernière 10 ans ainsi que des informations sur ce quiz et sujets qui seront couverts. Donc, nous allons commencer. Alors vous avez peut-souvenir, le premier jour de classe David avait ces lampes sur. Donc, essentiellement, tout ce qui va sous le capot d'un ordinateur fait en binaire. Binaire signifie ce que cela comme, 0 et de 1. Il dispose de deux valeurs que peuvent être représentées. Ainsi, tout comme dans le premier jour de l'article quand David allumé une lumière Ampoule pour représenter sur, ou 1, notre ordinateur comprend binaire 0 et de De 1, allumé ou éteint. Notions de base binaire. Chaque lieu est représenté en base deux. Donc, vous ajoutez 2 à 0 au 1 à 2 sur toute la hauteur. Pour calculer ce que votre binaire est de décimal, il vous suffit de suivre cette équation ce genre de chose. Si vous avez un 1 dans l'un de ces endroits, vous multipliez par quelque fonder c'est, ajoutez-le, et vous obtenez la décimale. Voilà donc comment vous comptez à 5 en binaire. Tout comme ce que nous faisions sur le dernière diapositive, c'est la façon dont vous le feriez représenter de 1 à 5. De même, comme vous venez vous pouvez ajouter et soustraire en décimal ou en base 10, ou vraiment n'importe quelle base, sur peut ajouter et soustraire en binaire. Exactement ce que vous attendez lorsque vous ajouter les deux jusqu'à, si elle est égale à une plus grande à 1, vous portez un 1, en font un 0, et faire le plus de cette façon, juste comme on pourrait s'y attendre régulière décimal ou toute autre base. Cool. Donc, comme je l'ai déjà dit, tout ce qui qui se passe sous le capot de votre ordinateur se fait dans, ou binaire de 0 et de 1. Alors, comment pouvons-nous exprimer, par exemple, lettres ou des chiffres, ou des caractères? Et la réponse à cette question est ASCII. ASCII est une correspondance entre caractères que nous aurions normalement voir dans le Langue anglaise comme A, le B de, C de, souligner, des tirets, et quelque chose comme ça. Et il maps que pour une valeur ASCII. Une valeur ASCII est juste un nombre qui peut être compris par votre ordinateur. Et comme vous pouvez faire plus et soustraction avec les chiffres, vous pouvez faire les valeurs ASCII. Donc, dans cet exemple, ce qui sera présent imprimer? Ouais, juste un espace B C espace espace D. D'où vient ma souris aller? Notez que vous pouvez définir un int à 65. Et lorsque vous imprimez à l'aide que pour cent C, il va interpréter que comme une caractère et imprimera A. De même, vous pouvez déclarer comme un produit de carbonisation. Et lorsque vous l'imprimez en utilisant pour cent C, il va interpréter que comme pour cent D. Et comme vous pouvez ajouter un nombre, vous pouvez ajouter des caractères sont valeurs ASCII, dans ce cas. Donc un peu de pointeur pour tout le monde. 5, comme une chaîne, qui ne fonctionne pas 5 en fait égaux. Alors, comment pouvons-nous transformer l' 5 cordes à l'entier le 5? Des idées? Ouais. Donc, si nous avons 5 sous forme de chaîne, nous pouvons soustraire 0. Et qui nous donnera 5. Et de même, si nous avons 5 comme entier, l'ajouter à la chaîne 0. Et cela nous donne la chaîne 5. Cool. Maintenant, rappelez-retour pour donner des conférences où un nous avons parlé des algorithmes. Alors, comment voulons-nous réellement un ordinateur à faire des choses intéressantes? Vous savez, juste additionner et soustraire des chiffres et des choses d'impression n'est pas sur que passionnant. Habituellement, nous voulons que notre ordinateur effectuer une sorte d'algorithme. Quelque chose d'un peu plus complexe qu'une simple arithmétique. Un algorithme est juste une étape par étape ensemble de des instructions sur la façon d'effectuer un certain task-- tout comme une recette. Vous vous souvenez peut le premier jour de classe où David nous avait compter une chambre de personnes et combien de personnes sont dans la chambre. Vous pourriez être utilisé pour le comptage une par une. 1, 2, 3, 4. Dans ce cas, un algorithme en temps linéaire. Mais David a présenté un algorithme pour vous comptez les gens dans la salle où tout le monde se lève, vous dites que votre nombre à une autre personne, d'ajouter que nombre, et une personne s'assied. Et vous répétez cela. C'est un type d'algorithme. Nous pouvons analyser une façon efficace algorithme est basé sur il est géré temps. Mais nous allons parler un peu plus à ce sujet plus tard. Donc, tous les algorithmes peuvent aussi être écrit en pseudo-code. Pseudocode est juste un Anglais comme la syntaxe utilisée pour représenter un langage de programmation. Par exemple, si nous voulions demander à un utilisateur de deviner mon numéro préféré, nous pseudocode peut avoir en tant que tel. Inscrivez-vous pour les utilisateurs de deviner. Si l'hypothèse est correcte, dites-leur ils sont corrects, sinon leur dire ils ne sont pas correctes. Et pseudo est un moyen de facilement représentant une idée ou un algorithme. Alors maintenant, nous pourrions réellement écrire ce qui dans le langage de l'ordinateur pourrait comprendre. Donc, nous pourrions écrire notre pseudo et interpréter que dans le code source. Jusqu'à présent, le code source doit respecter à un certain syntaxe de un langage de programmation. Et jusqu'à présent, dans CS50, nous avons été en utilisant la plupart du temps c. Donc, c'est peut-être le code source de c. Plus tard dans le cours, vous venez nuit en contact avec d'autres programmes langues telles que PHP. Ou si vous prenez encore d'autres classes, vous pourrait faire Java, Python, ou même OCML. Mais dans notre langage de programmation c, c'est comment nous pourrions écrire le code source pour l'algorithme de pseudocode que Je viens de décrire plus haut. Alors, comment fonctionne votre ordinateur fait comprendre cela? Comme je l'ai déjà dit, il n'est vraiment comprend des zéros et des uns. Alors, comment obtient-il de la source code pour quelque chose qui peut être compris? Eh bien, nous avons quelque chose appelé un compilateur. Si vous vous souvenez de retour dans la plupart de votre psets, vous aviez une sorte de programme écrit dans un fichier de point de c. Et puis vous tapez make. Alors, que faire est en train de faire? Vous pouvez taper make pour compiler votre programme parce someone-- celui qui a écrit votre jeu de p; probablement David-- créé un fichier de marque. Et qui dit faire savoir pour faire fonctionner votre compilateur, appelé bruit, que la volonté puis compiler votre code source de s'opposer code, qui est zéros et de uns que votre ordinateur comprend. Mais un peu plus tard, nous irons plus en profondeur sur les compilateurs. Donc rappeler pset 0, where-- oui, Vous avez une question? PUBLIC: [inaudible]? ENCEINTE 1: Oui. Je pense qu'ils ont effectivement devrait être en ligne. Ouais. PUBLIC: Est-ce comme [inaudible]? ENCEINTE 1: Il ne s'agit pas. Le sont sur cs50.net/quizzes. PUBLIC: quiz de Slash, slash 2013, slash 0, et il suffit de cliquer à travers quiz 2013 et quizz 0, examiner les diapositives de la section. ENCEINTE 1: Ouais, donc si vous voulez les gars à tirer vers le haut et regarder sur votre propre ordinateur, c'est très bien aussi. Le dire. PUBLIC: [inaudible]. ENCEINTE 1: Ouais, [inaudible] est la variable muette. Oh, oui? PUBLIC: [inaudible]? ENCEINTES 1: Non, les grèves ne sont pas à l'examen. Désolé, sa question était, était grèves sur l'examen. Et il n'est pas. Donc pset 0, les gars devrait avoir tous mis en place quelque chose avec rien. Et nous avons appris un peu de programmation de base blocs de construction à l'aide de scratch. Donc, nous allons jeter un oeil à certains de ces blocs de construction qui constituent un programme. Le premier est l'expression booléenne. Les expressions booléennes sont ceux et 0 de ou quoi que ce soit qui a deux valeurs possibles. Dans ce cas, vrai ou faux, allumé ou éteint, et oui ou non. Un exemple d'une méthode simple, très simple, programme qui utilise un booléen expression ici. Donc, pour les expressions booléennes à être utile, nous avons des opérateurs booléens. Ce sont des opérateurs qui peuvent être utilisés de comparer certaines valeurs. Alors que nous avons et ou non égal à, moins supérieur ou égal à, supérieur ou égal à, et moins de ou supérieure. Mais ces opérateurs ne sont pas très utiles si nous ne pouvons les regrouper en conditions. Alors vous avez peut rappeler à partir de zéro et à partir de votre p définit que nous eu conditions. Ils sont, pour l'essentiel, comme des fourches la logique de votre programme exécute selon que une condition est remplie. Donc l'une des conditions que nous avions utilisé de nombreuses fois dans ce cours est la si, d'autre, si, et les conditions d'autre. Voici un exemple de la façon dont vous pourriez utiliser. Est-ce que quelqu'un sait la différence entre simplement en utilisant if tous la façon dont les couplets si, d'autre, si, et d'autre combiné? Oui? PUBLIC: [inaudible]. ENCEINTE 1: Exactement. Donc, si je devais si tout le long de ce Ainsi, même si cette condition retours vrai, il faudra encore continuer tester les deux suivants. Considérant que, dans un autre-si, un autre déclaration, si l'un renvoie true, les autres ne sont pas testés. Pour toute question à ce sujet? Cool. Donc, vous utilisez un autre si-d'un autre déclaration si vous savez qu'il ne peut être un de ces cas. Donc, nous savons si x est inférieur à 0, il est certainement ne va pas être supérieur à 0. Ensuite, un autre bloc de construction que nous avons appris des boucles. Nous avons trois types de boucles. Pour les boucles, les boucles while, et faire des boucles while. Et généralement, quand vous vous asseyez à écrire quelque chose, vous devez décider lequel des trois vous souhaitez utiliser. Alors, comment pouvons-nous décider lequel? Nous utilisons généralement une boucle for si nous savons combien de fois nous voulons parcourir par quelque chose ou combien de fois nous voulons effectuer une tâche. Nous utilisons des boucles while si nous avons besoin d' état pour être vrai pour continuer à fonctionner. Et nous utilisons ne bien que très similaire à temps, mais nous voulons que notre code fonctionne à moins une fois. Donc faire tout, tout ce qui est dans le faire la volonté toujours exécuter au moins une fois. Considérant que, avec le temps, il peuvent ne pas fonctionner du tout si l' condition n'est pas satisfaite. Toute question qui? Donc, la structure d'une boucle for. Les gars, vous avez tout vu. Vous l'initialiser. Vous avez une sorte de condition. Ainsi, par exemple, nous pourrions initialiser en tant que i est égal à 0. i est inférieur à 10. Et je ++. Très simple que nous avons fait. Pour une boucle while, de même, vous avez d'avoir une sorte de l'initialisation, une sorte de condition, et une sorte de mise à jour. Donc, nous pouvons mettre en œuvre notre boucle aussi comme une boucle lors de l'utilisation. Et de même avec une boucle Do While, nous pourrions avoir une initialisation, exécuter quelque chose, le mettre à jour, et alors vérifier l'état. Alors maintenant fonctions. Nous mettons tout ensemble. Nous pourrions écrire un peu type de fonction. Fonction commune que vous pourriez ont déjà vu est le principal. Principal est une fonction. Il a un type de retour, int. Il a un nom de fonction, principal. Et il a des arguments, argc et argv. Alors principal est juste une fonction. Autres fonctions que vous pourriez avoir utilisées, printf printf-- est un function-- Getint, toupper. Mais ceux-ci se produisent à avoir été mis en œuvre pour nous par une sorte de bibliothèque. Si vous les gars me souviens notamment cette bibliothèque ou le CS50.h Je norme / O bibliothèque. Oui, la question? PUBLIC: Est-principale juste inhérent à c? Est-ce que c'est en quelque sorte [inaudible]? ENCEINTE 1: La question est de si principal est inhérent à c. Et oui, toutes les fonctions avoir une fonction principale. C'est une sorte de nécessaire pour l'ordinateur à savoir par où commencer l'exécution du code. PUBLIC: Donc, vous ne serait pas [inaudible]? ENCEINTE 1: Non D'autres questions? Cool. Donc, comme vous pouvez utiliser une fonction que c'est écrit pour vous, vous pouvez également écrire votre propre fonction. C'est une fonction que quelqu'un pourrait ont écrit pour calculer le volume d'un q, par exemple. Il ya un type de retour ici, dans ce cas int, notre nom de la fonction q et notre liste des paramètres. Et notez que vous devez écrire les données type de paramètre que vous voulez utiliser ou bien la fonction n'est pas savoir quel genre de paramètre devrais-je accepter. Donc, dans ce cas, nous voulons un entier comme notre contribution. Alors, pourquoi aurions nous voulons utiliser les fonctions? Tout d'abord, une grande pour l'organisation. Ils aident à briser votre code en plus de morceaux organisé et faire plus facile à lire. Simplification. Ce qui est bon pour la conception. Lorsque vous lisez un morceau de code et la fonction principale est vraiment, très long, il pourrait être plus difficile à raisonner sur ce qui se passe. Donc, si vous le décomposer en fonctions, il pourrait être plus facile à lire. Et réutiliser-capacité. Si vous avez un morceau de code qui est d'être appelé ou exécuté plusieurs fois, au lieu de réécrire ce code 10 fois dans votre fonction principale, vous pourriez vouloir réutiliser. Et puis à chaque fois que vous devez utiliser morceau de code, appelez la fonction. Alors maintenant, si nous nous souvenons de revenir à zéro, nous avons également parlé de quelques concepts, dont l'un est Threading. Le fil est le concept de multiple les séquences de code exécuter en même temps. Donc penser à un jour où David avait vous les gars Comptez le nombre de personnes dans la salle. Essentiellement, ce qui se passait On est tout de vous les gars étaient l'exécution des threads séparés. Et ces discussions ont été s'unissent pour obtenir une sorte de réponse. De même, dans Scratch, lorsque vous avez plusieurs sprites, vous pourriez avoir un chat et un chien. Et ils seraient simultanément la gestion de leurs propres scripts. C'est un exemple de filetage. Et l'autre concept qui a été mis en place en scratch était évènements. Et les événements sont si plusieurs parties du le code de communiquer les uns avec les autres. Dans Scratch, c'est à ce moment que vous avez utilisé la contrôle et la diffusion Quand je Recevez blocs. Et aussi, dans le problème Set 4, nous avons vu un peu d'événements aussi bien. Les gars, vous pourriez avoir utilisées la bibliothèque Gevent. Et il y avait une fonction waitForClick dans lequel vous attendiez pour l'utilisateur de cliquer. Et votre clic, dans ce cas, serait l'événement et attendre clic est votre gestionnaire d'événement. Et aussi, tout au long de l'exécution de vos psets et travailler sur vos psets, vous auraient pu entrer en contact avec certaines de ces commandes. C'est ce que vous avez tapé dans votre fenêtre de terminal ou tout autre fenêtre qui montre sur votre g, modifier à, essentiellement, naviguer dans votre ordinateur. Ainsi, par exemple, indique le LS contenu d'un répertoire. Faire répertoire crée un nouveau dossier. CD, changement de répertoire. RM, supprimer, supprime un fichier ou un répertoire. Et puis supprimer le répertoire supprime un répertoire. PUBLIC: [inaudible]? ENCEINTE 1: Oui, bien sûr. Désolé, la question était de savoir si vous suggère de mettre ce sur la feuille de triche. Il pourrait aider. Si vous avez de la place, vous pouvez le mettre sur. Il est également juste en général assez bon à retenir, car lorsque vous l'utilisez vous voudrez peut-être juste l'ont mémorisé. Ça va vous rendre la vie beaucoup plus facile. Ai-je répondu à votre question? Alors maintenant, nous avons parlé un peu brièvement sur les bibliothèques. Mais les deux principaux qui nous ont été en utilisant jusqu'à présent dans le cadre sont I / O et CS50 standard. Quel genre de choses sont inclus dans la bibliothèque standard d'E / S? Oui, jusqu'à présent, nous avons utilisé printf. Dans CS50, nous avons utilisé getint et GetString. Et la chaîne de caractères de type de données se produit également à déclarer dans cette bibliothèque de CS50. Nous parlerons un peu plus en profondeur sur comment les bibliothèques fonctionnent et comment ils interagir avec le reste de votre code. Mais ce sont les deux principales que nous avoir été en contact avec la mesure dans cours. Types. Ce sont de bonnes à rappeler combien chaque type est représenté par ou comment le nombre d'octets de chaque type de requires-- int, 4 octets; char, 1 octet. Float est de 4 octets. Qu'est-ce que c'est une double? PUBLIC: [inaudible]. ENCEINTE 1: Ouais, donc un flotteur mais doubler la taille. Qu'en est-il de temps? PUBLIC: [inaudible]. ENCEINTE 1: OK. Qu'est-ce que c'est long? PUBLIC: [inaudible]. ENCEINTE 1: Ouais, doubler un int. Oui. PUBLIC: [inaudible]. ENCEINTE 1: Long [inaudible]. Et puis un long long est double. PUBLIC: Non, non. Une longue est juste un int. Il dépend de l'architecture avant la [inaudible] int et ont la même taille. [Inaudible]. ENCEINTE 1: Donc une longue et un int sont les mêmes. Et puis un long long est le double de la int. Cool. Et puis, ce qui est le dernier type? PUBLIC: Pointeur. ENCEINTE 1: Ouais, donc nous avons appris un peu de pointeurs. Et indépendamment de ce qu'est un pointeur pointant to-- il pourrait être une étoile char ou un int star-- c'est toujours 4 octets pour un pointeur. Questions à ce sujet? Oui? PUBLIC: [inaudible]? ENCEINTE 1: Alors un long et int sont même dans cet appareil de CS50. PUBLIC: L'appareil est complètement interchangeable. ENCEINTE 1: Ouais. Alors un long long est le double int. PUBLIC: Il s'agit de la 32 bits? ENCEINTE 1: 32 bits, ouais. PUBLIC: Donc [inaudible]? ENCEINTE 1: Oui, si ce n'est pas dire explicitement, vous devrait assumer un peu 32. PUBLIC: Il dirait quelque chose comme l'hypothèse d'une l'architecture comme l'appareil. Pour 64 bits, les seules choses qui changement sont longs et les pointeurs. Ils ont tous deux [inaudible]. ENCEINTE 1: Oui? PUBLIC: Question. Ainsi, sur l'un des questionnaires de pratique, il pose des questions sur un unsigned int. Alors, comment cela serait-il déterminé d'un int [inaudible]? ENCEINTE 1: Un non signé en est également de 4 octets. Mais ce qui est différent d'un signé int et un unsigned int? PUBLIC: [inaudible]. ENCEINTE 1: Droit. On peut représenter les valeurs négatives. Mais comment fait-elle cela? PUBLIC: [inaudible]. ENCEINTE 1: Ouais, il enregistre une bit pour représenter le signe. La signature a un peu qui représente le signe. Et non signé est juste tous positifs. PUBLIC: OK. Donc, vous dites que c'est une double deux fois la taille d'un flotteur? ENCEINTE 1: Double est deux fois la taille d'un flotteur, oui. PUBLIC: Comment un pointeur pour un long long [inaudible]? ENCEINTE 1: Donc la question est de savoir comment le pointeur sur un long long-- Comment est-ce que quatre octets un long long de ses 8 octets. Alors, n'oubliez pas ce qui est un pointeur, essentiellement, à la valeur très base. PUBLIC: [inaudible]. ENCEINTE 1: Ouais, donc un pointeur est tout simplement un emplacement de mémoire. Donc, il n'a pas d'importance combien d'espace ce pointeur pointe. Il suffit de 4 octets à suivre de cet emplacement de mémoire. D'autres questions? Cool. Ainsi, la dernière chose que je dois est la sortie standard. Vous devez les utiliser fréquemment assez que vous vous souvenez. Mais c'est à ce moment que nous utilisons printf, par exemple. Et nous avons ces espaces réservés ont été appelés codes de format. Donc pour cent c char, pour cent i pour int, et nous pouvons aussi utiliser pour cent d. C'est la même chose. Mais, en général, on en CS50 essayer d'utiliser pour cent i. F pour cent du flottant. Pour cent ld pour long long et pour cent s pour une chaîne. De même, nous avons utilisé un peu de ces séquences d'échappement. Par exemple, la barre oblique inverse n pour une nouvelle ligne. C'est juste pour quand vous mettez en forme votre code pour l'impression f. Oui? PUBLIC: Quel est pour cent d pour? ENCEINTE 1: Donc la question est ce qui est pour cent d pour? Pour cent d est pour ints. Pour cent pour cent et d i sont les mêmes. PUBLIC: Quelle est la différence entre barre oblique inverse n et barre oblique inverse r? ENCEINTE 1: Donc la question est quelle est la la différence entre n et réaction r jeu? Je pense que la barre oblique inverse r is-- PUBLIC: Donc barre oblique inverse r implique seulement revenir au début de la ligne sans aller à une nouvelle ligne. Donc, si vous imprimez une barre oblique inverse r et vous revenir au début de la ligne alors vous imprimez plus de choses, vous écrasez le truc qui est déjà sur [Inaudible]. Considérant que, n va en fait à une nouvelle ligne et va à [inaudible]. ENCEINTE 1: Eh bien, d'autres questions? Bien. Je vais la passer à Dan, qui va se poursuivre. [Applaudissements] DAN: Tous droitier. Donc, je vais vous parler d'un autre grand éventail d'idées de la classe qui sont à peu près représentatif de deux semaines et le début de trois semaines à partir de la coulée, qui est juste une façon de traitement d'une valeur d'un certain type que une valeur d'un type différent. Donc, nous pouvons le faire avec les caractères à ints, les flotteurs à ints, et longues aspire à doubler. Toutes ces choses peuvent être utilisés comme moyens de traiter une certaine valeur numérique moins char comme un autre valeur numérique. Donc, il ya quelques problèmes avec cela, Bien sûr, ce qui arrive quand vous lancez des choses comme flotteur pour ints. Donc, c'est un peu bizarre. Nous avons un flotteur qui est de 1,31. Nous multiplions par 10 000. Et puis nous imprimons comme un int. Qu'est-ce que cette sortie? 10.000 fois 1.31. Donc, 13 000, est que la conjecture? PUBLIC: Je pense que c'est 10 000. DAN: Je suis le multipliant par 10 000 avant que je le jeter. PUBLIC: Oh. Aurait-il pas un 9 et certains numéros 0? DAN: Vous pourriez avoir des chiffres bizarres. Alors bon, c'est 1,3 fois 10.000. C'est donc 13 000. Et ce weird-- supplémentaire PUBLIC: 13100. DAN: 13100. Merci, Rob. Et ce weirdness-- supplémentaire ce 9,9-- tout simplement parce que ce casting fini arrondi vers le bas où il ne devrait pas avoir. Ouais. PUBLIC: Le casting se passe après quoi d'autre? DAN: Donc, parce que j'ai ce papier, il t-il cette multiplication avant fait ce casting. PUBLIC: [inaudible]. DAN: Je pense que ce serait jeter les premiers, oui, ce qui serait de 10.000. Rien d'autre? Cool. Donc, c'est 13 099. Pourquoi cela se produit? Imprécision. Flotteurs ne sont pas parfaits. Ils ne peuvent représenter des nombres à un certain nombre de chiffres significatifs. Donc, si nous imprimons sur 8 figues de sig sur ce flotteur, on obtient une sorte de laid nombre prospectifs. Et c'est parce que 1.31 ne peut pas précisément être représenté par simple des puissances de deux dans la machine. Donc, il finit par prendre le plus proche devinez qui finit par être un peu faible. Donner un sens? Dáccord. Maintenant, commutation sont une autre façon de faire des déclarations conditionnelles où tous les nous nous soucions est une seule variable. Donc, dans cet exemple particulier, nous sommes obtenir un nombre entier de l'utilisateur. Et puis nous cherchons à ce qui est entier. Vraisemblablement, c'est le numéro entre un et quatre. C'est ce que nous demandons. Alors que vous faites un commutateur de le nom de la variable. Ensuite, vous configurez les cas de possible valeurs qu'elle pourrait être. Donc affaire, un dire que c'est faible. Et puis vous cassez sortir de l'état de commutation de sorte vous ne gardez pas aller. Dans la prochaine case-- donc deux cas et cas three-- si c'est le cas deux il tombe juste en bas de la première ligne de code qu'il considère comme des Troisième cas jusqu'à ce qu'il voit une pause. La raison pour laquelle vous obtenez un cas de Seule l'impression est faible parce que je avoir cette pause ici. Si moi, par exemple, ignoré cette break-- si j'ai jeté ce breakaway-- il imprimer faible, et il serait imprimer milieu, et il allait se briser. Donc, les pauses sont une partie importante de changer les conditions et ils devraient être là. Tous les cas qui ne sont pas mentionnés explicitement sont traitées par le défaut cas dans le commutateur et doit être jeté. PUBLIC: Donc 1, 2, 3, et 4 serait n? DAN: Les valeurs qui peuvent être n. Oui. Ouais? PUBLIC: Alors, quand vous avez que [inaudible]? DAN: Vous imprimer bas, puis il imprimer milieu, et il allait se briser. PUBLIC: Pourquoi serait-il imprimer milieu si [inaudible]? DAN: Alors tout sous un cas avant une pause relève. Donc cas une impression est le cas sous un comme l'est cette impression suivante. Ouais? PUBLIC: [inaudible]? DAN: Donc, ce nombre est juste un particulier valeur de cette variable peut prendre, non? Cela fait-il sens? Ouais. PUBLIC: [inaudible]? DAN: Oui, deux cas serait imprimer milieu, puis se briser. PUBLIC: [inaudible]? DAN: Je pense que tout? Quels sont les autres types de données pouvez-vous basculer? PUBLIC: Vous pouvez passer sur tout type de données. Mais cela signifie que quoi que ce soit sur les caractères et ints et des trucs comme ça, parce que si vous êtes de commutation sur un pointeur qui n'a pas vraiment de sens, commutation de charges, si elle laisse même de vous faites cela, en raison de virgule flottante de précision, vous ne seriez pas vraiment vouloir faire de toute façon. Donc, à peu près, à seulement ints et caractères et des trucs comme ça. DAN: Ouais, c'est quand vous avez explicite valeurs que vous savez, je pense, peut être que le passage est réellement utile. Bonne? Dáccord. Scope est la plage qui a déclaré s'étend variables. Donc, dans ce petit morceau de code que j'ai, il serait plein d'erreurs. Et la raison en est, j'ai déclaré ce int i dans la portée de cette boucle. Et puis je suis en train de faire référence à ce que i l'extérieur de cette boucle portée. Donc, fondamentalement, vous pouvez penser à portée comme tout ce que vous déclarez avec à l'intérieur un jeu d'accolades ne existe au sein de ces accolades. Et si vous essayez d'utiliser cette variable en dehors de ces accolades, vous aurez obtenir une erreur du compilateur. Ouais? PUBLIC: Donc celui-ci ne fonctionne pas? DAN: Cela ne fonctionne pas, oui. Cordes. Chaîne un char *. Ils sont exactement les mêmes. Ils sont juste des pointeurs caractères. Et toutes les chaînes que vous avez doivent se terminer avec barre oblique inverse zéro, ce qui est juste une convention de c. Il est appelé le terminateur NULL. Et NULL-- N majuscule, U majuscule, le capital L, capitale L-- n'est pas le même que l' Terminateur NULL. Il s'agit d'un pointeur. Il s'agit d'un caractère. Ils sont très distinctes. Rappelez-vous il. Il sera sur le quiz, probablement. Je n'ai pas vu le quiz. Ouais? PUBLIC: Donc NULL est, par exemple, le pointeur? DAN: Oui. PUBLIC: Qu'est-ce que [inaudible]? DAN: si, par exemple, malloc est appelé lorsque vous ne pas avoir suffisamment de mémoire pour obtenir la taille que vous vous demandez, malloc retourne NULL. C'est, en fait, chaque fois qu'une fonction est supposée retourner un pointeur, vous besoin de vérifier une valeur NULL parce NULL est une jolie good-- c'est, en quelque sorte, la valeur des ordures. C'est un zéro dans la mesure où les pointeurs vont. Chaque fois que vous appelez une fonction, qui renvoie un pointeur. Vous allez vouloir vérifier pour être vous que ce pointeur n'est pas NULL parce que NULL est très commun. C'est en quelque sorte d'un retour des ordures. Donc, si quelque chose ne va pas droit, il suffit de retourner la valeur NULL à la place. PUBLIC: [inaudible]? DAN: Oui, et c'est ce. PUBLIC: [inaudible]? DAN: Sort comme cela. C'est le terminateur NULL. C'est minuscule N-U-L-L si vous l'épeler. PUBLIC: Et je suis juste allé dos et testé. Et si vous essayez de mettre une virgule flottante valeur dans un commutateur, il va crier à vous dire, déclaration nécessite expression de type entier. DAN: Il vous allez. Mais oui, quelle était la question? PUBLIC: [inaudible]? DAN: Donc capitale N, U majuscule, le capital L, L majuscule est une chose c réelle. Il est le pointeur NULL et de la volonté seulement être traitée comme telle. Vous ne serez jamais essayer de préciser la Caractère NULL et voir tout autre manière que cela. Ouais? PUBLIC: Donc retour à char max ou quelque chose dans les notes, ne serait-il incarner la même fonction comme [inaudible]? PUBLIC: Alors parlez-vous retour caractères max de getchar, ou quoi que ce soit? PUBLIC: Ouais. PUBLIC: Ouais, donc le général terme de toutes ces choses sont des valeurs sentinelles. Donc, comme un retour int max de getint et caractères max de getchar, c'est censé être comme, tout droit, si ces choses sont de retour à nous, quelque chose n'allait pas. Pour pointeurs, nous justement des cette valeur de sentinelle que tout le monde accord sur. Et c'est la chose que vous revenez quand les choses vont mal. Donc caractères max est ce que nous utilisons de représenter quelque chose comme NULL ou getchar. PUBLIC: Donc, si vous getchar tester, pourriez-vous mettre NULL? Cela ferait une différence? DAN: Vous pouvez non seulement vérifier NULL. Il faudrait vérifier caractères max parce que le La valeur de retour de la fonction est un caractère qui n'est pas un pointeur. Ouais? PUBLIC: Cette question demande pour la longueur de chaîne. Est-ce que couvre le caractère NULL? DAN: Non Et c'est effectivement la façon dont la longueur de chaîne sait d'arrêter car il passe par votre tableau de caractères jusqu'à ce que il voit un caractère NULL. Et puis c'est comme tout Bon, je suis fait. PUBLIC: [inaudible] cinq? DAN: Bonjour serait de cinq ans. Yep. Ainsi, les tableaux sont continues des blocs de mémoire. Ils ont un accès instantané en disant que le Nom du tableau et ensuite, bouclés accolades, quel que soit l'indice vous voulez aller pour, ils sont indexés à partir de zéro à la longueur de la matrice moins 1. Et ils sont déclarés par le type de l' chose que vous stockez dans la réseau, le nom de la matrice, et ensuite quelle que soit la taille de ce tableau. Il s'agit donc d'un tableau de caractères de longueur qui a six de ces valeurs. Ouais? PUBLIC: [inaudible]? DAN: Oui. PUBLIC: [inaudible]? DAN: Si vous avez ce qui se passe dans le tableau déjà fait. Ainsi, vous pouvez spécifier ce lieu que, par exemple, char, quel que soit le nom de votre tableau est, entre parenthèses vides est égal bouclés préparez-H virgule E virgule L virgule L virgule O virgule caractère NULL et accolade. Ce serait aussi fonctionner comme une déclaration. PUBLIC: [inaudible]? DAN: Ensuite, vous devez avoir la taille déjà fait. PUBLIC: [inaudible]? DAN: Oui. Tous droitier. arguments de ligne de commande sont un moyen de obtenir les commentaires de l'utilisateur comme arguments principaux. Principal prend deux arguments. Le nombre d'arguments qui est en cours passé le long de la ligne de commande et un vecteur de chaîne ou un tableau de chaînes de tous les arguments. Donc, si je, par exemple, appelé une fonction telle que un point sur 1 espace 2 espace, trois, argc serait 4. Et la argv 0 serait un point sur. Argv1 serait 1. argv2 serait 2. argv3 seraient 3, dans ce cas particulier. Ouais? PUBLIC: [inaudible]? DAN: Le dernier élément du tableau car le tableau est la longueur argc, plus l'un des ARGB, le dernier élément est le pointeur NULL. Il est argc plus 1. Donc, dans le cas que je viens de dire, il serait argv 0 est un point sur. argv 1 est 1 argv2 est 2. argv 3 est 3. argv 4, qui est une plus grande que argc serait nulle. Et c'est le pointeur NULL. Oui. Et c'est parce que la chaîne est une étoile de char est un pointeur. Donc, il doit être du même type. Ouais? PUBLIC: Deux questions. Donc un, quelle est la différence entre ce et GetString autre d'un type dans le moteur de l'utilisateur? Et de deux, il est stocké dans votre mémoire récente? Donc, comme, GetString serait être [inaudible]? DAN: Où est-il stocké? Je ne sais pas où il est stocké. PUBLIC: Donc, en fait, vous savez comment tout la fonction que vous appelez c'est arguments sont stockées dans la pile? Donc argc et argv sont arguments de main et ils sont sur la pile, ou vraiment juste au-dessus ce que vous pensez que le début de la pile. Ce qui était l'autre partie de la question? PUBLIC: Alors, quelle est la [inaudible]? DAN: Oui, c'est juste une façon différente d'obtenir l'entrée de l'utilisateur. Un peu plus efficace et celui-ci est il est plus pratique pour les scripts parce que vous peut juste passer des arguments à votre principal fonction plutôt que d'avoir à attendre pour les utilisateurs si vous n'avez pas tous les utilisateurs. PUBLIC: Et oui, obtenir les chaînes serait [inaudible]. Il serait stocker les choses dont vous avez besoin. DAN: Ouais? PUBLIC: [inaudible]? DAN: Oui, argv 0 comprend toujours le point slash de l'appel de fonction. Ouais? PUBLIC: [inaudible]? DAN: Oui, chacun des arguments sont terminé à caractère NULL parce qu'ils sont des chaînes. PUBLIC: [inaudible]? DAN: Oui, argv argc est un pointeur NULL. PUBLIC: [inaudible]? DAN: Oh oui. Ouais, désolé. PUBLIC: Donc [inaudible]? DAN: Donc la question est de savoir si vous avez eu l' ligne de commande point slash un point sur 1, 2, serait le nombre de ligne de commande arguments soient deux ou serait-il trois? PUBLIC: Je pense que ce n'est pas le vraiment d'importance. J'ai tendance à dire, oh, vous n'avez pas passé des arguments de ligne de commande lorsque, de toute évidence, vous avez appelé la fonction. J'ai donc tendance à exclure vocalement l' fonction de la ligne de commande arguments, même si c'est inclus dans argv. DAN: Mais si c'était le test-- yeah-- et aussi si vous dites quelque chose comme argc est égal à 3, vous êtes en position de sécurité. Ouais? PUBLIC: [inaudible]? DAN: Je pense que si, au lieu de l'appel de cette dans argc et argv chaîne supports mais a gardé les mêmes types et juste appelé les quelque chose de différent comme un et b, serait-il encore travailler? Et il serait encore travailler, vous just-- au lieu d'utiliser argc-- vous devriez utiliser a et b. Ouais? PUBLIC: [inaudible]? DAN: Donc la question est GetString est allez stocker la mémoire dans le tas parce GetString est char *. Il stocke la mémoire dans le tas, car il appelle maintenant malloc dans le réel la mise en oeuvre de GetString. OK, passer. Sécurité. Donc, pour être vraiment sûr, vous comptez sur aucune un et vous permettez à personne l'accès à tout de votre information, ce qui explique pourquoi chacun construit leurs propres machines, leurs propres systèmes d'exploitation, tout leur programmes à partir de zéro, et de toute évidence ne pas se connecter à d'autres machines par l'intermédiaire de l'Internet. Donc, les ordinateurs ne sont pas sûrs. Ils sont vraiment. Nous devons faire confiance à d'autres personnes. Et l'idée de sécurité, c'est que vous êtes tenter de limiter la quantité d' la confiance que vous avez besoin. Et l'un des moyens que vous faites est par la cryptographie. La cryptographie est, essentiellement, nous avons secrets. Parfois, nous devons passer nos secrets le long de travers, par exemple, l'Internet ou d'autres choses. Et nous ne voulons pas que les gens de connaître ces secrets. Donc, nous chiffrons nos secrets dans un chemin que nous espérons que personne ne peut comprendre. Donc nous used-- tout au long de cette class-- des choses comme chiffrement de César et [Inaudible], qui sont tous deux extrêmement moyens précaires de chiffrer les choses. Ils sont faciles à comprendre ce qu'ils sont et quelles sont vos secrets sont. Le monde réel utilise beaucoup plus systèmes de cryptage complexes. Et nous n'allons pas entrer dans beaucoup plus que cela. Débogage. GDB est le meilleur. Je vais insister sur ce message. Utilisez GDB tout le temps tous les fois que vous avez un problème. Les commandes qui sont utiles dans des GDB cassez, que vous passez soit une ligne numéro, un nom de fonction, essentiellement où dans votre code, vous voulez arrêter, et être en mesure de prendre le contrôle. Imprimer prend une variable et affiche quelle que soit la variable est à ce point dans votre exécution. Se déplace à côté de votre exécution le long d'un pas. Et l'étape marches à l'intérieur d'une fonction dans votre exécution. D'autres choses sont gérées, qui est de savoir comment vous avez fait votre code. Continuer prend toutes les mesures nécessaires pour obtenir au prochain point de rupture. Et il ya beaucoup, beaucoup d'autres. Consultez-les. Ils sont grands. Ouais? PUBLIC: [inaudible]? DAN: Oui, ce qui est un débogueur. Ainsi, un débogueur est un programme qui permet de déboguer votre programme. Ce n'est pas un programme qui trouve des bugs pour vous, mais ce serait génial. Et enfin pour moi, c'est la recherche. Ainsi, les types de recherche dont nous avons parlé dans cette classe sont la recherche linéaire, qui est exactement ce que vous regardez à travers chaque élément de l'espace de recherche, un élément à la fois, jusqu'à ce que vous trouviez ce que vous cherchez ou jusqu'à ce que vous atteignez la fin de votre espace de recherche au cours de laquelle point vous dites que vous ne pouviez pas trouver l'élément que vous recherchez. Et cela prend du temps, au mieux, constante, qui est de 0 1 et au pire linéaire temps, qui est de 0 n. Recherche binaire, qui doit éléments sordides. Vous allez à la moyenne de vos éléments, voir si l'élément que vous cherchez est plus grand ou plus petit que l'élément que vous êtes au milieu. Il lui est plus grand, vous dites que le fond de votre espace de recherche est votre emplacement actuel, au milieu, et vous redémarrez le processus. Si elle est plus petite, vous regardez dire que the-- ouais, quoi de neuf? PUBLIC: [inaudible]? DAN: Oui. Toute sorte de tri qui a été enseigné dans la classe est un jeu équitable pour le test. [Rires] DAN: Et le fait que vous n'avez pas eu de le faire pour un ensemble de problème, il est juste Jeu pour le test. PUBLIC: Peut-on aller au-dessus comment to-- DAN: Il ne sera plus là-dessus. ENCEINTE 2: Le code réel pour [Inaudible] est sur study.cs50.net. Donc, si vous regardez le problème de la pratique dans la page de tri par fusion de study.cs50.net, il s'agit du code pour la mise en œuvre le tri par fusion. Donc, vous n'avez pas à mettre en œuvre vous-même ce soir. Mais assurez-vous de comprendre plutôt que de le mémoriser. PUBLIC: [inaudible]? ENCEINTE 2: La page de tri par fusion sur study.cs50.net, il existe une pratique problème qui, si vous cliquez sur le problème, à la fin il est solution, qui est la fusion la mise en œuvre de tri. Mais assurez-vous que vous comprenez plutôt que de simplement mémoriser ou en le copiant vers le bas. PUBLIC: Et un parfaitement valable problème pour l'examen serait quelque chose comme voici une liste. Qu'est-ce que cette liste ressemble après une étape de sélections sorte ou tri par insertion ou autre. Une itération complète de la liste. Donc, même si vous ne finissent pas par avoir besoin d' Code pour cela, vous devez comprendre assez pour savoir comment ça va à la modification de ce tableau. DAN: C'est tout pour moi. [Applaudissements] LUCAS: Salut tout le monde. Mon nom est Lucas. Je vais parler de la récursivité, tout les sortes que nous avons apprises, et une peu de tous les pointeurs. D'accord? Alors tout d'abord, la récursivité. Qu'est-ce que cela signifie de dire que une fonction est récursive? PUBLIC: se dit. LUCAS: OK, appelle lui-même, oui. Donc, comme cette image, par exemple. C'est comme l'image dans d'une image et ainsi de suite. Ainsi, par exemple, vous pouvez have-- Dan qui parlait de recherche binaire. Une façon dont la recherche est binaire récursif, c'est le fait que vous êtes essayer de trouver un certain nombre. Alors vous allez au milieu. Et puis vous vérifiez si les numéros là dans la gauche et dans le droit. Et puis si vous trouvez le nombre est va être sur la gauche, c'est la même chose chose que faire de la recherche à nouveau juste à gauche de la liste. C'est comme ça que ça sonne comme c'est récursif. Donc, c'est pour cela que vous les gars ont récursive solution pour le tri par fusion. OK, alors voici un exemple. Donc, disons que je veux choisir tous les nombres de 1 à n. Je peux comprendre que la somme des n nombre est n + n moins 1 à 1. Mais alors, si je regarde n moins 1 plus n moins 2 plus 1, c'est la même chose chose que les numéros de sommation à n moins 1. Donc je peux dire la somme d'un montant égal n est égal, plus la somme de n moins 1. Cela fait-il sens? Et je voudrais aussi avoir quelque chose d'autre appelé le scénario de base, qui est que la somme des nombres des à zéro serait zéro. Donc dès que je reçois au nombre zéro, je m'arrête compter. Cela fait-il sens? Alors, voici un exemple de la façon dont Je peux mettre en oeuvre. J'ai donc cette fonction dans certains. Cela prend un entier n. Donc ici, je vérifie d'abord si n est inférieure ou égale à zéro. Donc, si ce n'est inférieur ou égal à zéro, je retourner zéro, ce qui est notre cas de base. Sinon, je peux retourner n plus la somme des nombres de une à n moins un. Donner un sens? Dáccord. Alors, voici à quoi il ressemble. Vous avez somme de 2 égaux 2, plus la somme de 1. Et quelques-uns des 1 est 1 plus le somme de 0, ce qui est égal à 0. Donner un sens? Donc, si on regarde la pile de votre programme, c'est à quoi il ressemble. Tout d'abord, nous avons la fonction principale. Et puis la fonction principale appelé somme 2. Et puis somme 2 va dire, oh, somme 2 est égal à 2, plus la somme de un. J'ajoute donc une somme de 1 sur la pile. Et la somme de 1 va appeler somme de 0, ce qui va également être ajoutée de la pile. Et puis chacun de ces ceux qui sont au-dessus de l'autre à revenir avant les autres peuvent continuer. Ainsi, par exemple, ici, somme de 0, la première, va retourner 0. Et puis choisissez une somme de 1. Ensuite, une somme de 1 va revenir 1 à la somme des deux. Et enfin, une somme de 2 va pour revenir à 3 principale. Cela fait-il sens? Il est vraiment important de comprendre comment la pile fonctionne et essayer de voir si cela fait sens. OK, donc le tri. Alors, pourquoi est tri importante, tout d'abord? Pourquoi devrions-nous nous en soucier? N'importe qui? Donnez-moi un exemple? Ouais? PUBLIC: [inaudible]. LUCAS: Ouais, OK. Ainsi, vous pouvez effectuer une recherche plus efficace. C'est un bon moyen. Ainsi, par exemple, nous avons beaucoup de choses, en fait, dans nos vies qui sont triés. Par exemple, des dictionnaires. Il est très important d'avoir toutes les mots un peu d'ordre que nous peuvent accéder facilement. Voilà ce qu'il disait. Vous pouvez effectuer une recherche plus efficace. Pensez à la façon dont il serait difficile d'avoir un dictionnaire dans lequel les mots sont en un ordre aléatoire. Vous aurez à regarder, à peu près, chaque mot jusqu'à ce que vous trouviez le mot que vous cherchez. Si vous utilisez Facebook aussi, quand vous cherchez à vos amis, vous êtes allez voir que Facebook a mis à votre ami proche est au-dessus de ceux que vous ne parlez pas à grand-chose. Si vous allez tout le chemin vers le bas de votre liste d'amis, vous allez voir les gens que vous n'avez probablement pas encore n'oubliez pas que vous êtes amis avec. Et c'est parce que les sortes Facebook vos amis en fonction de la façon dont vous êtes proche d'eux. Donc, l'organisation des données. Aussi Pokemon. Donc, vous voyez que tous les Pokémons disposer d'un nombre. Et c'est comme un simple chemin d'accès aux données. PUBLIC: Accès Pokemon. LUCAS: Ouais. PUBLIC: [inaudible]. LUCAS: Ouais. OK, donc la sélection sorte. Sélection sorte va sélectionner le plus petite valeur d'une liste non triés chaque temps à chaque itération. C'est un peu comme le genre que vous faites dans votre tête quand vous essayez de trier une liste en main. Fondamentalement, vous ne faites que vous regardez pour le plus petit nombre. Vous le mettez dans la liste triée. Et puis vous regardez pour la plus petit nombre suivant. Et puis vous continuez à faire que et ainsi de suite. Donc, la sélection sorte est, fondamentalement, vous sélectionner à chaque fois la plus petite valeur non triés. Mettre à la fin de la liste triée partie de la liste. Et continuer à le faire. Voyons rapidement ce cela ressemble. Alors, voici la liste triée et la liste non triée. Donc, pour le tri de la liste, il est initialement vide. Et puis je vais sélectionner le plus petit nombre ici, qui est de 2. Donc, je reçois le numéro 2 et je mets à l'avant de la liste. Et puis je regarde pour la prochaine plus petite élément, qui est de 3. Donc, je l'ai mis à la fin de la liste triée. Et puis je continue à le faire. Je trouve 4 et le mettre à la fin. Trouver 5 et le mettre à la fin. Et regardez comment tous ces moments que Je veux dire le mettre à la fin est, essentiellement, en échangeant deux valeurs. D'accord? Et puis la dernière, que vous venez de disposer un élément de plus. Donc, il est déjà trié. OK, donc le tri par insertion. Le tri par insertion, vous allez avoir également que chose d'avoir un triés et une liste non triée. La seule chose, c'est que chaque fois que vous ajoutez un élément à la liste triée liste, il vous suffit de choisir l'élément que est en face de la liste triée. Et puis vous allez trouver ce que position, il devrait être dans le tri partie de la liste. Voyons ce que cela est si cela fait plus de sens. Donc, d'abord, par exemple, je suis en train insérer le numéro trois dans le partie de la liste triée. Ainsi, la liste n'a rien. Donc, je ne peux mettre le numéro 3. Maintenant, je tiens à ajouter le nombre de 5 à la partie triée de la liste. Donc je regarde le nombre 5. Je remarque que c'est plus grand que 3. Donc, je sais que ce doit être après 3. Alors, j'ai mis 3 et 5. Ensuite, je veux insérer le numéro 2. Je remarque que le numéro 2 est en fait durer alors à la fois 3 et 5. J'ai donc fait de mettre tout le moyen au début de la liste. Je dois donc, en quelque sorte, passer tous les éléments dans la liste triée afin que je puisse faire de la place pour le numéro 2. Puis je vois le nombre 6. Je vois que cela devrait être après 5. Donc, je l'ai mis là. Et enfin, je regarde le nombre 4. Et je remarque qu'il devrait être comprise entre 3 et 5. Et puis je l'ai mis là et changement tous les autres éléments. Donner un sens? Bubble Sort. Alors tri à bulles est essentiellement ce que vous êtes aller à do-- nous appelons bulle sorte parce que vous passez par le films-- c'est en fait mieux si je montre juste vous aimez this-- et vous allez comparer nombres adjacents. Et vous allez échanger leur positions si elles ne sont pas dans le bon ordre. Donc, fondamentalement, ce qui se passe à arriver, c'est ici, par exemple, vous avez 8 et 6. Vous savez que l'ordre de tri sera effectivement 6 et 5, non? Donc, vous allez inverser les commandes. Puis je vois 8 et 4 ici. Et je fais la même chose. J'échange nouveau. Et enfin, 2 et 8. Je les échanger aussi. C'est ce qu'on appelle de tri à bulles car après chacune de ces itérations, en fait, le plus grand nombre dans la liste obtient tout le moyen de la fin de la liste. Cela fait-il sens? Car il maintient l'échangeant et le déplacer vers la droite. OK, c'est donc la seconde itération. Ce serait la même chose. Je vais faire un échange et puis le dernier. Je qu'il n'y a pas échanges et la liste est triée. Ainsi, dans Bubble Sort, nous gardons essentiellement en passant par la liste et l'échange choses jusqu'à ce que je remarque que je n'ai pas fait des swaps faisant cette itération, qui signifie que la liste est déjà trié. Donner un sens? Parlons un peu sur temps de fonctionnement. Alors que vous les gars me souviens Big O, Omega, et Theta? Ouais? OK, ce qui est Big O, tout d'abord? PUBLIC: [inaudible]. LUCAS: Ouais, ça s'appelle le pire des cas l'exécution, ce qui signifie simplement que c'est combien vous vous attendez le programme à prendre afin de fonctionner. Comme, en termes de-- en ce case-- n. Le nombre d'éléments dans le liste dans le pire des cas. Comme, dans le pire des cas. Donc, pour Bubble Trier, par exemple, nous avons Big O n place. Pourquoi avons-nous cela? Pourquoi est-Bubble Trier Big O n place? PUBLIC: [inaudible]. LUCAS: Ouais, donc le pire des cas sera que je vais devoir faire n itérations. Ainsi, chacune des itérations va apporter le plus grand élément de la fin de la liste. Donc le pire des cas, c'est que j'ai de faire cette chose n fois. Et pour chacun de ces moments, je dois faire n swaps parce que je dois comparer chaque fois deux éléments. Voilà pourquoi il est n au carré parce qu'il est n fois n. Ensuite, la sélection sorte est également n carré parce que, pour chaque itération, je dois regarder chaque élément dans la liste. Et puis trouver le plus petit, ce qui signifie que je dois regarder par n éléments. Et je dois faire ce que n fois parce Je dois sélectionner tous les n éléments. Un tri par insertion est également n carré parce que le pire des cas sera être, un, je dois insérer n nombres, non? Donc, je sais déjà que je vais d'avoir n itérations. Mais pour chacun de ces numéros, si j'avais regarder tous les numéros dans la liste triée et il a mis tout le chemin à l'avant, ce sera n carré car il sera n fois n nouveau. Donner un sens? Qu'en est-il oméga? PUBLIC: [inaudible]. LUCAS: C'est le meilleur des cas. Donc, c'est comme dans un grand nombre de fois pour le tri, le meilleur scénario est lorsque la liste est déjà trié. Donc, vous n'avez pas vraiment de faire quelque chose. Bubble Trier a le meilleur scénario de n. Avez-vous les gars savent pourquoi? PUBLIC: [inaudible]. LUCAS: Ouais, si vous gardez une trace de si ration de données avait des swaps ou pas, si vous avez quelque chose comme mis à vrai si il y avait une itération, si la liste est déjà trié, essentiellement, ce qui va se passer, c'est que je vais essayer de déplacer chaque deux les éléments adjacents. Je vais voir ce que il n'y a pas de swaps. Et je viens de revenir tout de suite. Donc, cela signifie que j'ai juste eu à parcourir la liste une fois. C'est donc n parce que je regarde à n éléments. Pourquoi la sélection sorte n carré? Oui, même si la liste est triée, pour chaque itération de la sélection sorte, je avoir à sélectionner l'élément minimum. Donc, cela signifie que je dois à sa recherche à tous les éléments de la non triés la liste et trouver le minimum pour chaque itération. Cela fait-il sens? Et l'insertion épée est n parce que dans le cas que je suis en train d'insérer la nombres et tous les chiffres, lorsque je essayer de les insérer, je vois qu'ils sont dans la bonne position. Je n'ai pas à aller voir tous les autres numéros de la liste non triée. Voilà pourquoi il sera n. Donner un sens? Et ce qui est thêta? PUBLIC: [inaudible]. LUCAS: Qu'est-ce, désolé? Dites-le à nouveau. PUBLIC: [inaudible]. LUCAS: Exactement. Donc vous pouvez voir que seule la sélection stockée dans Merge avoir thetas sorte. Et c'est parce que vous avez seulement thêta si les deux Big O et Omega sont les mêmes. Dáccord. Et enfin, le tri par fusion-dire dans le journal n. Et puis, comme Dan a dit, le tri par fusion est un peu comme de la même manière que vous faites une recherche binaire. Ainsi, vous obtenez la liste. Et vous allez couper en deux. Et puis, vous les coupez en petites parties. Et puis, vous les fusionner. Les gars, vous vous souvenez que, non? OK, comme il disait. OK, pointeurs. Donc, ce qui est un pointeur? PUBLIC: [inaudible]. LUCAS: Une adresse. Dáccord. Je sais que David montre un tas de vidéos de Binky et les choses pointant l'un l'autre. Mais je me plais à penser de pointeurs comme une simple adresse. Donc, c'est une variable qui va pour stocker une adresse. Donc, c'est juste cette variable spéciale c'est-à quatre octets de long. Rappelez-vous, ce pointeur à quoi que ce soit est toujours quatre octets de long pour notre 32-bit machine pour le cas l'appareil. Et il vient de l'emplacement d'une variable à l'intérieur de celui-ci. OK, donc il ya cette mémoire, essentiellement. Ainsi, chaque bloc de mémoire a effectivement un étiquette, qui est l'adresse de l' mémoire slotty. Donc, cela signifie que je peux avoir un pointeur vers l'une de ces adresses. Donc la raison pour laquelle nous allons utiliser des pointeurs est si je dois me rappeler de l'emplacement une variable qui est spécifique d'une mémoire. Et vous les gars n'oubliez pas que l'un de ceux cas était si j'ai une fonction si j'ai fait vous voulez swap pour reals, j'ai effectivement avoir à envoyer un pointeur. Pas la variable. Avez-vous les gars Rappelez-vous que? La différence de between-- quel est le nom? Appel par valeur et en appelant par référence, non? OK, ouais. Alors, appelez en valeur. Lorsque vous suffit d'envoyer une variable à la fonction que vous êtes juste envoyer une valeur. Donc vous êtes en train d'envoyer une copie de la variable. Et votre programme s'en fout Et si la même variable effectivement fait une copie. Et appelant par des moyens de référence qui Je suis en train d'envoyer une copie de la pointeur vers cette variable. Donc, cela signifie que je suis l'envoi de la emplacement de cette variable. Donc, je dois sentir l'emplacement de l' variables, quand je l'appelle la fonction avec des pointeurs, je suis en mesure de réellement modifier les données qui étaient en principal. Donner un sens? Bien que, le pointeur est une copie, la pointeur a toujours l'adresse réelle de la variable que je veux changer. Donner un sens? Créant ainsi des pointeurs. Rappelez-vous, le pointeur ont toujours le type que c'est pointant puis à une étoile. Et puis vous mettez le nom. Alors, n'oubliez pas que chaque fois que vous avez quelle que soit étoiles, c'est comme un pointeur vers que toute variable taper que vous aviez. Donc, ici en étoile, par exemple, il est un pointeur et un entier. Et puis l'omble étoiles est un pointeur étoiles de carbonisation et ainsi de suite. Ouais? PUBLIC: Que faire si nous avons un pointeur de n à l'étoile x. Je sais que cela crée un pointeur vers x. Est-il aussi déclarer x un entier? LUCAS: OK, donc quand vous dites n star du x, vous n'êtes pas la création d'un pointeur vers une variable x. Vous créez un pointeur nommé x. PUBLIC: [inaudible]. LUCAS: Alors quand je dis n star du x, je suis dire, hey, dans la mémoire, je vais obtenir un de ces trois cases. Et je vais vous dire que ce va être x, qui est va être un pointeur. Et quelque chose d'intéressant à propos des pointeurs c'est que nous disent qu'ils ont 4 octets pour une machine de 32 bits. Et la raison en est que 4 octets sont 32 bits. Et les machines qui sont 64 bits fait avoir des adresses des pointeurs qui sont de 64 bits. Donc, cela signifie juste que la taille de la adresses de la machine est différente. Donc, le référencement et déréférencement. Il ya deux opérateurs Vous devriez retenir. Le premier est esperluette. La seconde est l'étoile. Ne vous trompez pas de cette étoile et ce STAR souvenir parce que, dans ce cas, vous avez n étoiles. C'est comme une chose tout à l'autre. Il n'y a pas étoile n de l'espace. Donc, cela signifie que c'est le type. Rappelez-vous que, lorsque vous avez l'étoile variable, vous êtes parler de ce type. Lorsque vous avez juste étoiles puis l' Nom de la variable, cela signifie que vous déréférencement du pointeur, qui signifie que vous êtes à la recherche à la pointeur, trouver l'adresse c'est montrant, d'aller à cette adresse, et en regardant chaque fois vous avez là. Donc, je dis à mes étudiants que lorsque vous avez étoiles, vous devriez penser que c'est l'abréviation du contenu de. Donc si vous avez un pointeur et vous faire pointeur étoiles, c'est le le contenu du pointeur. Alors vous allez à ce qu'il pointe vers et regarder le contenu constant. Et l'esperluette est le même chose que l'adresse du. Donc, si j'ai une variable un-- comme, disons dire que j'ai fait un int est égal 3-- si je veux trouver l'adresse de ce une mémoire de variables, je ne peux faire Ampersand a. C'est donc l'adresse d'un. Donner un sens? Alors, voici un exemple. Ce manque int b et c int. Donc int a est égal à 3 signifie que Je vais aller à la mémoire. Et je vais trouver un logement et mettre le numéro 3 ici. Et puis int b est égal à 4. Je vais faire la même chose. Aller à la mémoire et mettre un certain nombre 4 dans l'une des boîtes. Et int est égal à 5. Trouver une autre boîte et mettre un nombre à 5. Alors, quelle est cette ligne de faire sortir? n pa étoiles est égal à un esperluette. Alors tout d'abord, n pa étoiles. Que fait-il? PUBLIC: [inaudible]. LUCAS: Ouais, donc n pa étoiles, d'abord, déclare un pointeur appelé pa. Et puis il est affectant la valeur ce pointeur pour être l'adresse d'un. Donc esperluette un. Ensuite, si je fais pb étoiles, ce qui est un pb étoiles? Oh, désolé. Ceci est également absente. n pb étoiles. Je veux dire pc étoiles. Je suis tellement désolé. C'est la même chose. Mais maintenant je suis bien ar la création d'un pointeur à b et un pointeur vers c. Ouais? PUBLIC: [inaudible]? LUCAS: Oui. Donc, si vous allez à la mémoire et vous allez à la boîte qui est l'indicateur de pa, vous allez effectivement voir l'adresse d'un. D'accord? Ouais? PUBLIC: [inaudible]? LUCAS: Ouais, pointeur est une adresse. Ne jamais oublier. C'est comme le plus important partie sur des pointeurs. Il ya le stockage et l'adresse à une variable. Rien d'autre? D'autres questions? Dáccord. Donc, et ensembles. Rappelez-vous que quand je fais int tableau 3, fondamentalement, ce que je fais, c'est que je suis, genre de, déclarant dans un pointeur. Donc tableau est un peu comme un pointeur vers une lieu précis en mémoire dans laquelle je alloué trois fentes pour les entiers. Cela fait-il sens? Donc, quand je fais int tableau 3, ce que je suis faire, au fond, est la création de trois fentes de mémoire. Je trouve juste trois emplacements dans la mémoire. Donc, si je le fais, alors, un réseau en étoile, il signifie essentiellement le contenu de la matrice, ce qui signifie que j'efface le pointeur, je vais à cet endroit qu'il pointe vers, et j'ai mis le numéro un. Et puis, si je fais éventail étoiles plus 1, c'est la même chose que faire ensemble crochets l'une, ce qui signifie que je vais à la place qui lui est pointé. Et puis les plus 1 marques me décale d'une position. Donc, je vais à cette position, en fait, et mettre le numéro deux. Et puis, enfin, quand je fais tableau plus 2, je vais là où Le pointage au tableau à. Et puis je passe à des blocs de mémoire. Et puis j'ai mis le numéro trois ici. Ouais? PUBLIC: array Donc étoiles est tout simplement disant que le tout premier point. Et vous pouvez ajouter 1, juste parce que nous ne sommes vraiment référençant cette première adresse. LUCAS: Ouais. Pourquoi avons-nous, par exemple, disons tableau 0, tableau 1, et tableau 2? Je veux dire, pourquoi faites-vous 0, 1, 2, 3 au lieu de 1, 2, 3? L'une des raisons en est un, ordinateur programmeurs préfèrent commencer compter à partir de 0. Deux, c'est parce que quand vous faites tableau 0, c'est la même chose que faire ensemble ainsi que 0, ce qui signifie que je vais à cette position, et je ne sais pas sauter des blocs de mémoire. Donc, je ne bouge pas tous les blocs mémoires. Ouais? PUBLIC: [inaudible]? LUCAS: Donc elle demande ce qui est la différence entre faire ceci ou cela malloc. L'une des différences est que int tableau 3 est la création d'un matrice dans la pile. Et quand je fais malloc, il crée sur le tas. Cela fait-il sens? Alors, comment ne malloc réellement? Alors pourquoi avons-nous encore besoin d'utiliser malloc? Votre compilateur genre de chiffres sur tous les variables que vous avez déclarés. Et il crée de l'espace pour tous d'entre eux dans la pile. Donc, tous vos variables vont à se situer dans la pile. Voici donc les variables d'environnement. Donc, fondamentalement, un espace pour les variables dans la mémoire est allouée à moment de la compilation. Donc, cela signifie que votre ordinateur dispose d' Pour connaître toutes les variables l'avance. Il n'a pas besoin de savoir quelle est la valeur vous allez mettre dedans. Mais il a besoin de savoir comment la quantité de mémoire dont vous avez besoin. Mais maintenant, disons que, par exemple, vous créez un tableau ou prendre un chaîne que vous prenez à partir de l'utilisateur. Vous ne savez pas combien de temps la chaîne va être, par exemple. Donc vous ne savez pas exactement combien blocs de mémoire que vous allouez, non? Donc, il n'a pas vraiment de sens pour vous dites mis 100 caractères. Et puis si l'utilisateur écrit 150? Vous allez être vissé. Donc, fondamentalement, vous ne pouvez pas être sûr de la façon dont la quantité de mémoire dont vous avez besoin pour allouer lorsque vous compilez le programme. Vous savez juste que le temps d'exécution. Donc, c'est pourquoi vous avez le tas. Ainsi, le tas va avoir la mémoire que vous allouer au cours de la durée du programme en cours. Donc, fondamentalement, quand vous faites malloc, ce vous faites est l'allocation de mémoire à l'exécution, ce qui signifie que vous êtes décider à ce moment précis que vous doit avoir cette mémoire. Donc, c'est quand vous leur attribution. Cela fait-il sens? Donc n'oubliez pas, la pile contient des variables qui sont créés sur la compilation. Et puis le tas contient des variables qui sont créés au fur et à avec malloc, par exemple. PUBLIC: [inaudible]? LUCAS: Donc GetString est vais appeler malloc. Permettez-moi de parler de malloc, et Je vais vous expliquer GetString. Donc malloc est la même chose comme l'allocation de mémoire. Donc, il va allouer mémoire sur le tas. Et il va renvoyer un pointeur vers où la mémoire a été allouée à. Ainsi, lorsque vous do-- ici pour exemple-- n pointeur étoiles. Et puis pointeur est égale à malloc taille de temps de 10 pouces. Je crée un pointeur. Et puis je suis attribuant ce pointeur à la valeur du pointeur qui malloc est de me donner. Malloc Je demande donc peut vous affecter l'espace de 10 nombres entiers. C'est ce qu'il dit. Et malloc me redonne un pointeur à cet endroit. Donner un sens? Dáccord. Je Et GetString est, fondamentalement, fait un appel à malloc de sorte que vous pouvez allouer la mémoire lors de l'exécution. Rappelez-vous toujours de vérifier null parce malloc va retourner null si elle ne peut pas allouer de la mémoire. Disons que vous demandez un ridicule quantité de mémoire. Votre ordinateur ne va pas être en mesure d'allouer beaucoup. Donc malloc va juste pour retourner null. Alors, n'oubliez pas de toujours vérifier si le pointeur que vous avez obtenu de malloc nulle ou pas, parce que si c'est le cas, vous pourriez être de déréférencer un pointeur et provoquant des défauts latéraux. Et enfin, n'oubliez pas votre mémoire libre. Malloc crée la mémoire dans le tas. Et vous devez libérer la mémoire avant la fin du programme. OK, c'est tout pour moi. Désolé, Rob. Merci. [Applaudissements] LUCAS: Les dernières questions Rob vient avant? Non? Ouais? PUBLIC: Je ne vois pas celui-ci en ligne. Avez-vous téléchargé il encore? LUCAS: Je pense que Dave est téléchargeant bientôt. DAVE: Ça va être affiché. LUCAS: Il sera en ligne. PUBLIC: C'est. LUCAS: C'est? Dáccord. Ouais? PUBLIC: [inaudible]? LUCAS: Oui, vous devez libérer toutes les la mémoire qui est mis en tas. PUBLIC: [inaudible]? LUCAS: Oui. Chaque fois que vous avez un malloc de la culture, vous devriez avoir une culture libre après vous arrêtez d'utiliser cette variable. Donc malloc et free sont toujours ensemble. Leurs meilleurs amis. Ouais. Rob? ROB: Je vais rapidement. Et aussi la vidéo sera mis en place. J'ai le micro. OK, donc la semaine de cinq trucs. La première chose que nous avons est la pile. Donc, n'oubliez pas qu'il ya une seule pile image par appel de fonction active. Nous verrons dans un instant. Et rappelez-vous aussi ce qui se passe réellement dans chaque cadre de pile vont être les variables locales de nos fonctions, les arguments qui sont passés dans notre fonctions, avec un couple d'autres choses que vous n'avez pas vraiment besoin de s'inquiéter. Alors, voici un exemple de programme où, avis, le principal est printfing le retour valeur de foo 4. foo va juste retourner le valeur de bar 4 virgule 6. Et le bar va mettre un certain locale variable n égal à 4 fois par 6. Et puis retour n. Alors regardons à la pile à travers l'itération actuelle de ce programme. Donc, il ya le fond de notre pile. Rappelez-vous que la pile grandit. Donc, au fond de notre pile, nous avoir un cadre de pile pour principale. Lorsque le programme démarre, principale va toujours être à la fond de notre pile. Et ce qui est à l'intérieur de notre empiler cadre pour principal? Ainsi, même si il n'y a pas locale variables aux principal, comme je l'ai dit avant, nous avons argc et RGV prendre de l'espace l'intérieur du cadre de la pile principale. Donc principale va maintenant appeler la fonction foo. Et cela signifie que foo va obtenir son propre cadre de pile. Alors maintenant, nous sommes à l'intérieur de la fonction foo. Et ce qui doit aller dans le cadre de pile de foo? Eh bien, foo a un argument n. Et n est égal à 4 puisque c'est ce que principale passe comme argument de foo. Alors maintenant, foo va appeler bar. Qu'est-ce que la barre va avoir à l'intérieur de son «cadre de pile? Il a x égal à 4 y égal à six. Ce n'est pas tout ce que nous allons avoir dans le cadre de pile parce bar a également une variable locale n. Et n, nous allons établir égal à 24. Alors maintenant, bar va revenir n. Donc barre revient à 24 foo cadre de pile. Et parce que la barre est maintenant de retour, que signifie que nous éclater le cadre de pile pour la barre hors de la pile. Donc, toute la mémoire qui barre avait été l'aide est maintenant la pile. Maintenant, foo va également à revenir à 24 principale. Alors, maintenant que foo est de retour, la mémoire que foo a été utilise dans son ' cadre de pile a également disparu. Et maintenant, principal va appeler printf. Donc printf est juste une autre fonction. Lorsque nous appelons printf, ça va être un autre cadre de pile pour la fonction printf appel de fonction. Que faisons-nous passons printf? C'est ce qui va se passer sur son cadre de pile. À tout le moins, nous passons que pour cent i Backslash n et l'argument 24. Il pourrait avoir plus dans son cadre de pile si printf arrive à être en utilisant une des variables locales. Nous ne savons pas. Mais tout ce qui va dans printf de empiler cadre. Il va exécuter la fonction printf. Puis printf qui est fait. Il sera de retour. Enfin, le principal est fait. Principale sera de retour. Et puis notre programme est fait. Ouais? PUBLIC: Êtes-vous voir [inaudible] arguments [inaudible] paramètres? ROB: Donc, il ya une différence subtile entre les arguments et les paramètres. Et vraiment, en parler commun, les gens ont tendance juste mélanger tout le temps. Mais paramètres sont formelle nommer des choses. Donc argc et argv sont les paramètres à principale. Les arguments sont ce que vous avez réellement transmis en tant que ces paramètres. Il ya donc quand je l'appelle foo de 4, 4 est l'argument que je suis de passage à. Et le paramètre n, à l'intérieur de foo, prend la valeur 4 depuis le 4 était l'argument. PUBLIC: [inaudible]? ROB: n est une variable locale à la barre. n est toujours locale à foo, mais c'est un paramètre à toto. Ce n'est pas une variable locale. Ouais? PUBLIC: [inaudible]? ROB: bar foo est juste appeler et retour quel que soit le rendement de la barre. PUBLIC: [inaudible]? ROB: Ouais, juste pour voir multiple trames de pile. Ouais? PUBLIC: Pourquoi foo a été appelé avant printf? ROB: Pourquoi foo appelée avant printf? Donc je pourrais avoir, au contraire, fait quelque chose comme int x est égal à foo de 4 puis imprimé x. Mais au lieu, j'ai combiné la fonction remettre en l'argument de printf. Mais notez que nous ne pouvons pas réellement exécuter l'appel à printf jusqu'à ce que nous comprendre ce que foo de 4 est. Donc, nous allons évaluer cela. Et seulement une fois que c'est fait vont de revenir et d'évaluer cela. Ouais? PUBLIC: Depuis deux bar [inaudible] valeur, pourquoi n'avons-nous pas [inaudible]? ROB: Ils doivent être totalement int. Cela n'a pas été pris sur plusieurs passes. Donc, il devrait être int bar et int foo puisque les deux personnes sont de retour entiers. Void est que si ils ne vont pas pour renvoyer des valeurs réelles. Ouais? PUBLIC: Si vous aviez une ligne au-dessus le retour, [inaudible]? ROB: Une ligne au-dessus du rendement? PUBLIC: Ouais. Comme si vous avez printf et [inaudible], serait-il imprimer deux fois? ROB: Donc, à l'intérieur de foo? Si nous avions un printf ici? PUBLIC: Ouais. ROB: Donc, si nous avions le droit de printf ici, il serait imprimer une fois. Depuis que nous appelons foo une fois à droite ici, nous allons frapper le printf. Ensuite, nous appelons bar. Et puis foo sera de retour. Et c'est tout. Nous ne rencontrons jamais printf fois. Ouais? PUBLIC: [inaudible] printf, appeler foo parce que nous sommes les premiers appelant printf puis nous passons les arguments. ROB: Donc, en théorie, n'est pas printf, appeler foo? Donc pas. Il suffit de l'ordre que c va exécuter ces choses est, avant que nous puissions appeler une fonction, tous les arguments à la fonction doivent être complètement évaluées. Donc, est-ce complètement évaluée? Oui, c'est juste une chaîne. C'est juste une valeur. Ensuite, nous avons complètement évaluer cette question. Une fois cela fait, tout de ses arguments sont évalués. Et maintenant, nous pouvons faire la appeler à printf. Ouais? PUBLIC: Une question. Si vous avez une fonction de vide, doit vous avez rendement virgule? ROB: Vous n'avez pas une virgule de retour si vous avez une fonction de vide. Dáccord. Alors maintenant, des trucs de tas. Donc tas est de savoir comment nous allons faire face à une gestion dynamique de la mémoire. Et ce contraste directement avec la pile que nous appellerions automatique la gestion de la mémoire. Donc, sur la pile, vous n'avez jamais vraiment pour faire face à la façon dont les variables locales sont poussés et sauté hors tout ces cadres de pile et tout ça. Vous n'avez pas à vous en préoccuper. C'est automatique. Ainsi, le tas est manuel. Et la [inaudible] vient de ces fonctions malloc et free. Alors, voici un autre programme. Tout ce que nous faisons, c'est allouer de un nombre entier. Nous le stocker dans star du x. Bien sûr, nous devons vérifier pour voir si x est nul. Ensuite, nous allons simplement mettre ce x pointe vers 50. Imprimer ce x pointe vers, print x, puis libre x. Alors, comment est-ce vraiment va chercher si nous regardons notre pile et le tas? Nous allons donc commencer à nouveau. Le fond de notre pile comme avant. Rappelez-vous que toi tas directement s'oppose à la pile? Donc, nous allons avoir l' haut de notre tas là-haut. Ainsi, le fond de notre pile, nous avons notre cadre de pile pour principale. Il dispose de l'espace pour argc, argv, et nous ont maintenant une variable locale x, qui est un int étoiles. Nous allons donc à parcourir grâce à ce programme. La première chose que nous avons est un appel à malloc. Nous faisons donc un appel à malloc. Malloc est une fonction. Il va y avoir un cadre de pile. Que faisons-nous passer à malloc? Cela va aller à l'intérieur du cadre de pile. Nous passons la taille de n, qui est de 4. Donc, qui est passé à malloc. Qu'est-ce que malloc faire? Il nous prend un peu d'espace sur le tas. Donc, nous allons aller au tas. Et nous allons saisir 4 octets dans le tas. Donnons donc juste que une adresse arbitraire. 0x123 Juste prétendent que c'est un adresse qui se trouve sur le segment de mémoire. Donc ce qui est réellement à l'intérieur de ce région de mémoire à l'adresse Ox123? Garbage. Nous n'avons donc pas stocké rien dedans. Pour autant que nous le savons, il pourrait être n'importe quoi. Vous ne devriez pas supposer que c'est zéro. Il n'est probablement pas zéro. Rendements Alors maintenant malloc. Et que faisons-nous au retour de malloc? Nous avons mis ce qu'il retourne. Nous avons mis en x égal à ce il est de retour. Alors qu'est-ce qu'il revient? Il est 0x123 retour puisque c'est la l'adresse du bloc de mémoire qui est vient d'allouer dans le tas. Donc revenir 0x123 x va maintenant être mis en égale à 0x123 qui, imagée, nous attirons souvent que x ayant une réelle flèche pointant vers ce bloc. Mais x est simplement stocker cette adresse. Alors maintenant, nous devons vérifier si x est nul. Ce n'est pas nulle. Nous prétendons que cette malloc réussi. Alors maintenant, star du x est égal à 50. Donc étoiles se souvient que cela signifie aller à cette adresse. Donc 0x123 Nous allons aller à cette adresse. Donc cela nous amène là-haut. Que faisons-nous à cette adresse? Nous stockage 50. Donc, après cette ligne, c'est ce que les choses vont ressembler. Alors maintenant, il n'est plus ordures là-haut. Maintenant, nous savons que 50 est dans ce notamment parce adresse nous l'avons mis à cela. D'accord? Alors maintenant, nous allons imprimer f. Donc tout d'abord nous allons imprimer star du x. Alors, quelle est star du x? Encore une fois, la star x signifie aller à l' chose qui x pointe. Donc x est le stockage de 0x123 Go pour cela. Nous obtenons 50. Donc imprimer f que. Et cela signifie qu'il va imprimer 50. Et puis qui retourne. Et puis nous avons la deuxième printf. Nous sommes maintenant pour cent p. Si vous n'avez pas vu, c'est à quel point vous imprimez un pointeur. Nous avons donc pour cent i, pour cent f, et tous ceux déjà. Donc pour cent p, imprimer un pointeur. Donc x est un pointeur. Donc, si nous allons imprimer x lui-même, nous imprimons ce qui est réellement à l'intérieur x, qui est donc le premier 0x123 f impression va imprimer 50. La seconde impression f va d'imprimer 0x123 Ouais? PUBLIC: Utilisez-vous des pour cent x pour imprimer un pointeur? ROB: Alors utilisez-vous pour cent x pour imprimer un pointeur? Ainsi, vous pouvez, mais pour cent x est juste, généralement, pour que si vous avez une entier et que vous souhaitez imprimer comme un hexadécimal. C'est juste la façon dont vous le faites. Considérant que, pour cent d serait imprimer en décimal. C'est là que nous obtenons pour cent d. i est tout nombre entier. p est spécifiquement pour cent pour des pointeurs. Donc x est un pointeur. Nous voulons utiliser pour cent p. Mais pour cent x pourrait fonctionner. Ouais? PUBLIC: [inaudible]? ROB: Oui. Au moins pour cette call-- donc je ne pas l'inclure ici. Mais ces deux arguments ne sont pas nécessairement à l'intérieur de ce cadre de pile ainsi que toutes les variables locales printf arrive à être utiliser. Et puis le prochain appel à printf maintenant l'intérieur de printf cadre de pile est pour cent p barre oblique inverse n et quel que soit le La valeur de x est, ce qui est 0x123. Ouais? PUBLIC: [inaudible]? ROB: Ça va imprimer quelque chose qui ressemble à ceci. PUBLIC: [inaudible]. ROB: elle imprime donc il sous forme d'adresse. Il ressemble à une adresse. Ouais? PUBLIC: [inaudible]? ROB: Pourquoi est-ce? PUBLIC: [inaudible]? ROB: Pourquoi est-ce pointeur de 4 octets? Donc, il ya tout un tas de 0 est en face de cela. Donc, c'est vraiment 0x0000000123. Sur un système 64 bits, il y aurait tout un tas de zéros. Ouais? PUBLIC: [inaudible]. ROB: Donc la première printf va print-- PUBLIC: [inaudible]. ROB: Oui, il va imprimer ce x pointe vers. Star dit quelle est cette chose montrant. Prenez-le. Alors qu'est-ce qu'il pointe vers? 50. Prenez-le. C'est ce que nous allons imprimer. Considérant que, la prochaine, nous sommes juste l'impression x lui-même. Ce qui est à l'intérieur de f? 0x123. Dáccord. Et puis, enfin, nous avons le libre. Que faisons-nous passer à libérer? Nous passons x. Que fois que j'ai affiché dans le cadre de pile. Nous allons donc passer la valeur 0x123 pour libérer. Alors maintenant gratuitement sait, tout droit, Je dois aller jusqu'à le tas et sans que la mémoire. C'est de ne plus utiliser ce est à l'adresse 0x123. Le libre va libérer que dans le tas. Maintenant, notre tas est de nouveau vide. Nous n'avons pas de fuites de mémoire. Maintenant libre sera de retour. Notez que x est toujours 0x123. Mais ce n'est pas maintenant mémoire valide. Nous ne devrait plus déréférencer x. Ouais? PUBLIC: Est retourner 0 redondant? ROB: Est returen 0 redondant? Oui. Nous mettons juste que là parce que nous avons un retour un pour l'air. Donc, c'est comme, ouais, permet de inclure le retour 0. Ouais? PUBLIC: [inaudible]? ROB: Alors après x gratuits, ce qui se passe si nous essayons de déréférencer le pointeur? Il est possible que tout se passe bien. Il est possible que nous obtenons encore 50. Il est possible, également, que cette mémoire est maintenant utilisé pour autre chose. Il s'agit donc d'un comportement non défini. Et indéfini signifie quelque chose qui peut arriver. Ouais? PUBLIC: [inaudible]? ROB: Non, si vous affectez x à autre chose. Donc, si nous avons dit ici x est égal à quelque chose de malloc else-- malloc taille event-- alors que le bloc d'origine de la mémoire n'est pas libérée. Et nous avons officiellement perdu. C'est une fuite de mémoire. Nous avons perdu toutes les références pour ce bloc de mémoire. Il n'y a donc aucun moyen que nous pouvons jamais libérer. OK, donc puis retourner 0 moyen fait. Très bien, si débordement pile. Quelle est l'idée ici? Alors rappelez-vous, tas est à la baisse. Pile est à la hausse. Donc, ce fut l'exemple de conférence, Je pense, où principal va tout simplement appeler cette fonction foo, qui va de s'appeler récursivement sur et encore. Donc pile cadres vont fonctionner exactement de la même. Donc, nous allons commencer avec les principaux que le cadre de pile bas. Puis principale va appeler foo, qui va obtenir un cadre de pile. Puis foo va appeler foo nouveau, qui va se faire un autre cadre de pile. Et puis encore, et encore, et encore, et encore jusqu'à ce que, finalement, nous courons dans le tas. Voilà donc comment nous obtenons un débordement de pile. Et à ce stade, vous SEG faute. Ou vous voulez vraiment la faute seg avant ce point, mais oui. PUBLIC: Est-core dump l' même que seg faute? ROB: Donc vous verrez segmentation noyau de défaut déversés. Vous obtenez un core dump quand vous SEG faute. Et c'est comme un dépotoir de tous les contenu de votre mémoire en cours afin que vous pouvez essayer d'identifier pourquoi vous SEG défaut. Ouais? PUBLIC: [inaudible]? ROB: Donc un moyen de segmentation de défaut il ya un débordement de pile. Donc, pas nécessairement. Signifie un défaut de segmentation que vous êtes souvenir ému d'une manière vous ne devriez pas l'être. Donc, une façon de ce qui se passe, c'est que lorsque vous empilez trop-plein, nous commençons à toucher mémoire d'une manière que nous ne devrions pas être. Ouais? PUBLIC: [inaudible]? ROB: Donc, à l'intérieur d'une boucle infinie. Comme, c'est comme une infinie récursive boucle et ainsi nous obtenons une autre pile encadrer chaque fois. Mais juste à l'intérieur d'un régulier infini tandis que un-- Eh bien, même pas imprimer F-- faire quelque chose. Peu importe. Nous n'allons pas être d'obtenir un autre cadre de pile. Nous allons juste garder boucle au cours de cette instruction unique. La pile ne se développe pas. C'est le fait que chaque récursive appel nous donne un cadre de pile. C'est pourquoi nous obtenons un débordement de pile. Ouais? PUBLIC: Donc, si vous avez dit pour obtenir le tout en boucle, puis [inaudible]? ROB: Donc, si à l'intérieur de la boucle while il y avait un printf, vous le feriez encore défaut ne seg. Je ne voulais pas compliquer les choses. Il serait boucle. Vous souhaitez obtenir une seule pile encadrer pour la fonction printf. Puis printf reviendrait. Ensuite, vous feriez encore boucle. Vous souhaitez obtenir une seule pile encadrer pour la fonction printf. Il reviendrait. Simple cadre de pile. Donc, vous n'obtenez pas cet infini empilant des cadres de pile. PUBLIC: [inaudible]? ROB: Oui. Donc, ce débordement de pile qui se passe car aucun de ces appels à foo sont de retour. Donc, si nous revenons, nous n'aurions commencer à perdre des trames de pile. Et puis, nous ne serions pas empiler trop-plein. Et c'est pourquoi vous avez besoin d'un scénario de base pour vos fonctions personnelles. Ouais? PUBLIC: La taille potentielle et l' empiler des tas de même pour tous les programmes? ROB: Environ. Est la taille potentielle de la pile et le segment de mémoire de la même pour tous les programmes? Environ. Il ya une certaine randomisation à où l'empilement et commence où commence le tas. S'il vous arrive d'avoir un tas de des variables globales et les choses, vous pourriez enlever de l'espace pour votre tas. Sur un système 64 bits, vous presque disposer d'une mémoire infinie. Il ya tellement de choses. Entre 32 et 64 bits, que une différence significative. Vous allez obtenir un ensemble beaucoup plus empiler et de l'espace du segment sur 64 bits système, car il ya un peu plus adresses qu'ils peuvent utiliser. Mais sur un système individuel, il sera être à peu près la même quantité de pile et de l'espace du tas. Bien. Donc, dernière chose est la compilation. Donc, vous devez savoir ce processus. Il ya quatre grandes étapes. Donc, le premier devrait être facile à retenir. Pré-traitement. Il a le préfixe pré en elle. Donc, il s'agit avant tout le reste. La chose à retenir est le hachage. Donc hachage définit et comprend hachage Dans l'ensemble de ceux-ci. Ce sont tous pré-processeur directives. Ce sont les choses que les pré-processeur prend en charge. Alors qu'est-ce un pré-processeur faire? C'est une chose vraiment stupide. Tout ce qu'il est capable de sont tous ces copie, et coupées, et coller des opérations. Donc hachage comprend norme i0 point h. Qu'est-ce que faire? C'est saisissant le point i0 h norme déposer et de le coller dans le haut où il est dit hachage comprend norme i0 point h. Et tout hachage définir que nous avons vu, ce qui est que faire? Son copiant la valeur que le hachage défini est défini comme et le coller partout où vous utilisez la valeur. Ainsi, le préprocesseur vraiment opérations fondées sur des textes simples. Il ne fait rien à puce. Donc, tout le reste est plus compliqué. Alors, maintenant que préprocesseur est faire, nous compilons fait. Alors qu'est-ce compilation veut dire? Nous allons maintenant à partir du code c de code assembleur. Ouais? PUBLIC: [inaudible]? ROB: Oui, nous avons pris cela. Donc la compilation. Nous allons de c à l'assemblage. Il s'agit donc d'un changement de langue réelle. Compiler soi, c'est aller de un langage de haut niveau à un langage de niveau inférieur. Et c est un langage de haut niveau par rapport à l'assemblage. Qu'est-ce que le montage? Ses instructions qui sont, assez beaucoup, fait de votre CPU. Mais votre ordinateur ne fonctionne toujours pas comprendre ensemble. Il ne comprend uns et de zéros. Donc, la prochaine étape est l'assemblage, qui nous amène de ces instructions votre CPU comprend et fait les traduit, à les uns et de zéros. Donc C du code assembleur en binaire. Mais je n'ai pas encore un exécutable. Alors, pensez à la bibliothèque de CS50. Nous vous avons fourni un binaire pour cette bibliothèque de CS50, qui a GetString et getint et tout ça. Mais la CS50 library-- dans et elle s'est d'abord n'est pas exécutable. Elle n'a pas de fonction principale. C'est juste un tas de binaire que vous pouvez utiliser. Donc, la liaison est la façon dont nous rassembler tous de ces différents fichiers binaires dans un exécutable réel. Celui que vous pouvez taper point slash un point sur. Donc, c'est comme le fichier que vous écrit, - quel que soit votre programme is-- Ceaser point c. Mais maintenant, il a été compilé jusqu'à binaire. Donc Ceaser point o. Et c'est notre CS50 bibliothèques binaire. Et ils sont en cours de combinés en un seul exécutable. Ouais? PUBLIC: [inaudible]? ROB: comprend donc d'abord, souvenez-vous, le hachage inclure est en fait un pré-processeur étape. Mais ce n'est séparée. Si vous n'utilisez pas les fonctions que sont à l'extérieur de votre fichier unique puis, non, vous n'avez pas besoin de lier tout puisque vous avez tout. Cela dit, printf est liée à. Si jamais vous utilisez printf, c'est quelque chose qui doit être lié à parce que vous n'avez pas écrit cela. Et, de fait, est automatiquement printf lié à. Vous savez comment à la ligne de commande ou lorsque vous tapez faites, vous le voyez ont tableau de bord l CS50, qui a lien dans la bibliothèque de CS50? Printf, et des trucs comme ça, va à lier automatiquement. D'autres questions sur quoi que ce soit? PUBLIC: [inaudible]? ROB: lier? Nous avons tout un tas de différents fichiers binaires. C'est l'exemple canonique que nous utilisons est une bibliothèque de CS50. Nous avons compilé et qui vous est donné le binaire pour cette bibliothèque CS50. Vous souhaitez utiliser GetString dans votre programme. Alors vous allez utiliser GetString. Mais sans mon code binaire pour GetString, lorsque vous compilez votre code vers le bas, vous ne pouvez pas réellement faire fonctionner votre programme parce GetString String est pas encore totalement définies. C'est seulement lorsque vous liez à mon binaire qui contient GetString que maintenant, tout droite, je peux effectivement exécuter GetString. Mon dossier est complet. Et je peux exécuter ce. Ouais? PUBLIC: Ne reliant convertir le binaire exécutable à? Donc, même si vous n'avez pas d'autres bibliothèques, ça ne serait pas encore nécessaire de traduire la [inaudible]? ROB: Donc un exécutable est encore en binaire. C'est juste la combinaison d'un ensemble de tas de fichiers binaires. PUBLIC: Merci beaucoup. ROB: Pas de problème. D'autres questions? Sinon, nous sommes tous mis. Bien. Merci. [Applaudissements] PUBLIC: Je vous remercie. ROB: Oui.