>> [MUSIQUE JEU]
>> ROB BODEN: Très bien.
Donc, la première chose d'abord, de la vidéo d'un visage familier.
>> [VIDEO LECTURE]
>> -Très bien.
C'est CS50, et c'est le début de la troisième semaine.
Je suis désolé, je ne pouvais pas être là avec vous aujourd'hui, mais permettez-moi de vous présenter
Propre Rob Boden CS50.
>> [LECTURE VIDEO FIN]
>> [Applaudissements et des acclamations]
>> ROB BODEN: La filmographie en que la vidéo est fantastique.
Très bien.
Alors d'abord, il ya un autre déjeuner.
C'est demain à 01h15.
Il n'y a pas déjeuner ce vendredi.
C'est avec Quora.
Et Tommy n'est pas encore là, mais l'un des les gens qui y est ancien CF tête,
Tommy McWilliam.
Donc, il s'agit d'un type d'amusement.
Vous devriez venir.
>> Très bien.
Donc, la semaine dernière, nous avons commencé à briser sur ce qu'est une chaîne est vraiment.
On sait depuis le début que c'est une séquence de caractères.
Mais la semaine dernière, nous avons fouillé dans le fait que ce qui est vraiment une séquence de
caractères, eh bien, nous avons maintenant des tableaux de caractères.
Et nous savons qu'une chaîne, c'est un tableau de caractères, à la fin,
nous avons cet octet nul spéciale, ce 0 barre oblique inverse, qui indique la fin d'
la chaîne.
>> Et si une chaîne est un tableau de caractères, mais nous pouvons avoir plus d'
simplement un tableau de caractères, nous pouvons avoir un tableau de n'importe quel
type de chose que nous voulons.
Donc, si vous vous souvenez de la semaine dernière, la programme Age que David a présenté
très rapidement.
Donc la première chose que nous allons faire est demander à l'utilisateur un nombre entier, l'
nombre de personnes dans la salle.
Une fois que nous avons entier, nous déclarer un tableau.
Notez cette syntaxe de support.
Vous allez vous habituer à cela.
>> Nous allons donc déclarer un tableau d'entiers appelés les âges, et il ya n
entiers de ce tableau.
Donc, ce modèle ici, ce 4 int i est égal à 0, i est inférieur à n, i plus
en plus, que va également être un motif que vous êtes très habitué.
Parce que c'est à peu près la façon dont vous êtes toujours aller pour parcourir les tableaux.
Alors, n'oubliez pas que n est le longueur de notre réseau.
Et ici, nous demandons à plusieurs reprises de l'âge de la personne i dans la chambre.
>> Après cela, nous allons vers le bas, et quelle qu'en soit la raison quelconque, nous avons ensuite
imprimer quel âge ils vont pour une année à partir de maintenant.
Et l'exécution de ce programme, nous allons faire âges, dot âges slash.
Donc, le nombre de personnes dans la salle, disons il ya trois.
Et dire, la première personne est 13, se trouve à côté 26, et la dernière est 30.
Alors il va itérer sur ces trois personnes, d'imprimer 14, 27, et 31.
>> Alors, n'oubliez pas que lorsque nous déclarons une tableau de taille n, les indices qui
tableau, le tableau a des valeurs et les indices 0, 1, 2, tout le chemin
à n moins 1.
Ainsi, lorsque nous l'avons dit, il y avait trois personnes dans la salle, et nous mettons ici
la première itération à travers ce boucle, i va être 0.
Donc, dans l'indice 0.
Nous attribuons la première vieillir l'utilisateur entre.
Puis, en le suivant, nous entrons dans la deuxième n l'utilisateur entre, et dans
à côté de deux, le dernier n.
>> Donc remarquer que un tableau de taille trois n'a rien
l'indice trois.
Ce n'est pas valide.
Très bien.
Donc, pour revenir ici.
Alors, maintenant que nous avons traité avec des tableaux, nous avons une certaine familiarité.
Maintenant, nous allons passer à la commande arguments de ligne, qui vont être
assez pertinente à cet ensemble de problèmes.
>> Donc, jusqu'à présent, chaque fois que vous avez déclaré votre fonction principale, nous avons
dit void main int.
Donc nul signifie simplement que nous n'adoptons pas une
arguments de cette fonction.
Maintenant, nous allons voir que le principal peut prendre quelques arguments.
Ici, nous les appelons int argc cordes et crochets de argv.
Les supports, une fois de plus, ce qui indique que nous avons affaire avec des tableaux.
Donc, ici, entre parenthèses chaîne de argv, nous sommes face à un tableau de chaînes.
Donc argc, cela va indiquer combien d'arguments que nous avons
passé à ce programme.
Et pour voir ce que cela signifie, Fermons cette.
>> OK.
Donc, jusqu'à présent, nous avons exécuté chaque programme comme âges slash dot.
Nous pouvons également, à la ligne de commande, passé passer des arguments, d'où le terme, commande
arguments de ligne.
Ainsi, le premier argument, bonjour monde.
Donc, ici, argc serait de trois.
C'est le nombre des arguments à la ligne de commande.
Argc est toujours au moins une, depuis le point réduire les âges, elle-même, qui est considéré comme l'un des
les arguments de ligne de commande.
>> Alors bonjour est la première.
Si âges slash dot est le zéro, alors bonjour est le premier, et le monde est
Le deuxième argument de ligne de commande.
Ainsi, la chaîne de argv, nous allons le voir, contient les chaînes, slash dot
âges, bonjour, et dans le monde.
Et, à la demande de David, nous allons pour lire une vidéo présentant que.
>> [VIDEO LECTURE]
>> -Jusqu'à présent, dans les programmes que nous avons écrite, nous avons déclarons
principal void main int.
Et tout ce temps, ce vide a simplement été précisant que la
programme ne prend pas arguments de ligne de commande.
En d'autres termes, lorsqu'un utilisateur exécute une programme, il ou elle peut assurer le commandement
arguments de ligne en écrivant supplémentaires des mots ou des phrases après le programme de
nom à l'invite.
>> Eh bien, si vous ne vous voulez que votre programme prendre des arguments de ligne de commande, un ou
plusieurs de ces mots, nous avons besoin de remplacer annuler avec un couple d'arguments.
Alors faisons-le.
Inclure CS50.h.
Inclure io.h. norme
Int main.
Et maintenant, au lieu de vide, je vais spécifier un int argc appelé, et un
tableau de chaînes appelées argv.
Maintenant, argc et argv sont simplement conventions.
>> Nous aurions pu appelé ces arguments plus tout ce que nous voulons.
Mais ce qui est important, c'est que argc est un int parce que, par définition, il est
va contenir le nombre d'arguments, l' nombre de mots au total que l'
utilisateur a tapé à son invite.
argv, quant à lui, l'argument vecteur, est va être en réalité un tableau de stockage
tous les mots que l'utilisateur a tapé à son invite.
>> Passons à faire quelque chose maintenant avec un ou plusieurs de ceux-ci
arguments de ligne de commande.
En particulier, nous allons aller de l'avant et d'impression Quelque soit le mot que l'utilisateur tape
après le nom du programme à l'invite.
Ouvrir le support.
Fermer support.
Printf pour cent de barre oblique inverse et la virgule.
Et maintenant, je dois dire que printf valeur à brancher sur cet espace réservé.
Je veux que le premier mot que l'utilisateur a tapé après le nom du programme,
et donc je vais préciser argv support 1, près
parenthèses, point-virgule.
>> Maintenant, pourquoi support 1 et non 0 support?
Eh bien, il s'avère que, automatiquement mémorisées dans argv 0 va être l'
Le véritable nom de programme.
Ainsi, le premier mot que les types d'utilisateurs après le nom du programme est, par
convention, va être stockée dans argv 1.
Compilons maintenant et exécuter ce programme.
>> Faire argv 0, point barre argv 0.
Et maintenant, un mot comme bonjour.
Entrée.
Et il nous l'avons, bonjour.
>> [LECTURE VIDEO FIN]
>> ROB BODEN: Très bien.
Fermez cette.
Donc, en prenant un coup d'oeil à ce programme qui nous avons introduit de nous, eh bien, tout simplement
pour montrer, si nous imprimons argv 0, faire, maintenant quel est-il, argv 0, point barre argv 0.
Donc, comme prévu, c'est l'impression de la le nom du programme, car argv 0 est
toujours aller à la le nom du programme.
Mais nous allons faire quelque chose d'un peu plus intéressant.
>> Donc, dans l'ensemble du problème, vous serez présenter à cette fonction, atoi.
Alors qu'est-ce que nous utilisons pour atoi?
Cela va convertir une chaîne en entier.
Donc, si je passe la chaîne, un deux trois, à atoi, ça va convertir que
à l'entier, un deux trois.
Donc, nous allons convertir la première commande argument de ligne à un nombre entier,
et puis juste imprimer cet entier.
>> Donc, fondamentalement, nous sommes en quelque sorte réimplémentant getint, juste l'
entier est entré à la commande au lieu de la ligne dans le programme
interactive.
Alors, faisant argv 0, faisons il ici, et que fermer.
Il faut donc lancer argv 0, et nous allons entrer dans le entier, un deux trois quatre un deux.
Donc, il va imprimer le nombre entier, un deux trois quatre un deux.
Il ya quelques subtilités à atoi que il va cesser de s'inquiéter de quoi que ce soit
au-delà d'un caractère numérique valide, mais ce n'est pas grave.
>> Alors, que pensez-vous qui se passe si je fais cela?
Segmentation fault.
Alors, pourquoi est-ce?
Si vous regardez en arrière à notre programme, nous sommes conversion argv 1, le premier argument
après le nom du programme, à un nombre entier.
Mais il n'existe aucun argument passé après le nom du programme.
Donc, ici, nous voyons que c'est un buggy programme, car, si nous essayons de l'exécuter
sans aucun argument, il va juste se bloquer.
>> Donc, un autre motif commun que vous verrez est quelque chose comme, si argc est moins
supérieur à deux, ce qui indique qu'il n'y avait pas au moins le nom du programme et une
premier argument, alors nous ferons quelque chose comme printf, pas assez
arguments de ligne de commande.
Ce n'est probablement pas un bon à imprimer, c'est probablement quelque chose, comme
vous devez entrer un nombre entier à la ligne de commande.
Je vais terminer là.
Et puis retour 1.
Alors, n'oubliez pas qu'à la fin de notre programme, si nous revenons 0, ce genre de
indique le succès.
Et principal automatiquement renvoie 0 si vous ne le faites pas.
>> Donc, ici, nous réaccorder 1 pour indiquer que ce n'est pas le succès.
Et vous pouvez retourner ce que vous voulez, juste, 0 indique le succès, et
rien d'autre indique un échec.
Donc, nous allons exécuter cette version des choses.
Alors maintenant, si nous n'entrons pas dans une ligne de commande argument, il va dire correctement
nous, pas assez de ligne de commande.
N'a pas terminé la phrase.
Sinon, si l'on fait passer l'un, il peut compléter le programme.
Donc, c'est la façon dont vous souhaitez utiliser dans argc Afin de valider le nombre d'
arguments de ligne de commande qui sont effectivement passé.
>> Faisons donc ce programme un peu plus compliqué, et regarder le deuxième
itération de choses.
Alors maintenant, nous ne sommes pas seulement l'impression de la premier argument de ligne de commande.
Ici, nous itération de égaux i int 0, i est inférieur à argc, i plus
en plus, et l'impression argv, l'indice i.
Donc ce modèle, encore une fois, c'est la même fantaisie comme avant, sauf qu'au lieu
d'appeler la variable n, nous utilisons argc.
>> Donc, ce n'est itération sur chaque index dans la matrice, et l'impression de chaque
élément dans ce tableau.
Et donc, lorsque nous manquons de ce programme, ainsi, Je ne suis pas entré une ligne de commande
arguments, de sorte qu'il imprime seulement le nom du programme.
Si j'entre dans un tas de choses, ça va imprimer un, chacun sur sa propre ligne.
>> OK.
Alors prenons un peu plus loin.
Et au lieu d'imprimer chaque argument sur sa propre ligne, nous allons imprimer chaque
caractère de chaque argument sur sa propre ligne.
Alors rappelez-vous que argv est un tableau de chaînes.
Alors, quelle est une chaîne, mais un tableau de caractères?
Cela signifie donc que argv est vraiment un tableau d'un tableau de caractères.
Donc, en prenant avantage de cela, ignorons ce pour le moment.
Disons simplement considérer la chaîne argv 0.
>> Donc, si nous voulons apporter chaque caractère de argv 0 sur sa propre ligne, alors je veux
pour faire le modèle que nous sommes habitués, i est inférieure à la longueur du tableau,
qui ici, est de strlen, c'est pas ce que je veux faire, chaîne
s est égal à 0 argv.
Ainsi, i est inférieure à la longueur de notre tableau, qui dans ce cas est un tableau
de caractères, i plus plus.
Et si, comme nous l'avons vu la semaine dernière, il est idéal si nous passons que strlen l'extérieur
de la maladie, puisque n ajoutera la strlen de s chaque fois que nous allons
dans la boucle, et il est ne va pas changer.
Nous allons donc mis il égal à n ici.
>> OK.
Alors maintenant, nous itération sur chaque indice dans le tableau.
Et donc, si nous voulons imprimer chaque caractère de ce tableau, pour cent c est
le drapeau que nous voulons utiliser pour les caractères.
Et maintenant un support i va être l' chaîne, caractère d'indice i, si la
chaîne étaient bonjour.
alors s 0 va être H, S support Une aura e, et ainsi de suite.
>> Alors maintenant, nous voulons combiner ces deux choses.
Nous voulons imprimer chaque caractère de chaque argument de ligne de commande.
Nous allons donc avoir une nichée de boucle.
Et de façon classique, le premier compteur C'est moi, la prochaine va être j, n
sera le strlen de argv i, i est inférieur à n, i plus plus.
Et maintenant, au lieu d'imprimer argv i, de sorte argv support i va à l'index -
que ça va être la ligne de commande i-ème argument argv i, j va
le caractère j de l'argument de la i-ème.
Je vais me débarrasser de cette place ici maintenant depuis que nous avons dans cette boucle.
Donc, est équivalent à l'égal de cordes argv i, puis de support j.
>> Eh bien, nous n'avons pas besoin de déclarer cette variable s.
Au lieu de cela, nous allons combiner ces deux dans ce que nous avions, argv i, j.
>> INTERLOCUTEUR 1: [inaudible].
>> ROB BODEN: Bon appel.
Donc, c'est cassé.
Si j'ai effectivement couru, nous le ferions ont rendu compte.
Ainsi, le compteur m'importe dans ce cas particulier pour
boucle est j, l'itérateur.
Donc, vous avez rencontrer des problèmes, probablement une boucle infinie, si nous
n'avaient pas fixe.
C'est pourquoi nous parlons aussi débogage aujourd'hui.
>> OK.
Donc, nous allons exécuter ce programme.
Et nous allons effectivement ajouter un printf séparée ici qui va juste imprimer
une autre ligne, car cela signifie que lorsque nous exécuter le programme, il y aura un vide
ligne entre chaque caractère de chaque argument de ligne de commande.
Eh bien, nous verrons ce que cela signifie.
Oop.
Vous avez un bug.
Erreur déclarant implicitement fonction strlen bibliothèque.
>> Pour en revenir à notre programme, je oublié de hachage inclure string.h.
Donc string.h va être la fichier d'en-tête qui déclare
la fonction strlen.
OK, il compile.
Maintenant, nous allons l'exécuter.
Il suffit donc que.
Il va imprimer notre nom du programme, bonjour monde.
Il va imprimer chaque chose, chaque caractère, sur sa propre ligne.
OK.
>> Donc, nous allons effectivement prendre cette un peu plus loin.
Et au lieu d'utiliser string.h, nous allons penser comment nous pourrions mettre en œuvre notre propre
fonction strlen.
Donc je vais donner immédiatement une signature de fonction.
Alors appelons dans my_strlen, et c'est va prendre une chaîne comme argument,
et nous nous attendons à retourner le longueur de cette chaîne.
Alors, où est ce type?
Oui.
OK.
Alors, n'oubliez pas de la diapositive précédente que était aussi de la semaine dernière, que l'
tableau de caractères, ainsi, une chaîne, alors disons que c'est notre chaîne s.
Donc, si s est la chaîne, bonjour, alors, H-E-L-L-O, dans la mémoire, qui va à
être, et puis cette barre oblique inverse 0 caractère.
>> Alors, comment pouvons-nous obtenir la longueur de s?
Eh bien, l'affaire est à la recherche pour cette Backlash 0 caractère, ce nul
terminateur.
Donc, l'algorithme est va être quelque chose comme quelques-uns
suffisamment de caractères que -
nous allons avoir cette main représente une certaine contre, appelons cette longueur int.
Donc, à partir de plus ici, nous sommes aller à parcourir notre chaîne.
>> Ainsi, le premier caractère, il est H, et ce n'est pas de retour slash 0, donc
la longueur est de 1.
Itérer au caractère suivant, E, et ce n'est pas Backslash 0.
La longueur est 2.
L, 3.
L, 4.
O, 5.
Et enfin, nous atteignons la barre oblique inverse 0, et que des moyens, eh bien,
cette chaîne est terminée.
Revenons donc 5.
>> Donc en fait la mise en œuvre qui, d'abord, mon n longueur est égale à 0, ma main droite.
Et nous allons parcourir -
>> INTERLOCUTEUR 1: [inaudible]
>> ROB BODEN: Oh, tirer.
Bon appel.
Boom.
Alors n longueur est égale à 0.
Alors maintenant, la longueur tandis que de ne pas égal puis, barre oblique inverse 0.
Donc n'oubliez pas, ce oblique 0, il s'agit d'une caractère réel, et il indique
la fin de la chaîne.
Tout comme, également, barre oblique inverse n est un personnage réel.
Backslash 0 va indiquer la fin de notre chaîne.
Je ne veux pas mettre que là.
Et tout s indexés par longueur n'est pas égale à la terminaison null,
nous allons juste pour augmenter la longueur.
Alors, à la fin de notre programme, longueur va finalement
être 5 dans ce cas.
Et nous allons revenir longueur.
>> OK.
Alors maintenant, ici-bas, je ne sais pas faire my_strlen.
Compilons pour s'assurer tout se passe bien.
Ce que je faisais en 2?
Ou était-ce une?
Cela devrait le faire.
Très bien.
C'est donc argv 2.
Fonctionne comme prévu, bien que était que celui que j'ai fait il?
Oui.
OK.
Cette version des choses n'avait pas la nouvelle ligne printf après, mais il
ne fait aucune différence.
OK.
Donc travaillé comme prévu.
>> Maintenant, nous pouvons même combiner cette première étape en outre, lorsque l'avis ici, eh bien,
d'abord, nous allons saisir l'strlen de argv i, puis nous itération sur
chaque caractère dans cette chaîne.
Ainsi, au lieu de le faire, si nous juste combiner cette logique d'attendre
jusqu'à ce que nous avons atteint la barre oblique inverse 0 droit dans cette boucle?
Donc parcourir tout argv i, j ne pas égal barre oblique inverse 0.
Donc, nous allons l'exécuter en premier.
>> Très bien.
Donc, ici, cette condition est dit -
clarifions cela.
Alors maintenant, que ce soit notre argv.
Alors, quand j'ai juste couru ce programme avant, argv est un tableau de chaînes.
Et donc, si je le lance avec le point barre argv 2, bonjour le monde, le argv
est elle-même une longueur de 3, pour argv zéro, bonjour, et dans le monde.
>> Et à l'intérieur de chacun de ces indices est, lui-même un tableau, où ce sera
point, ce sera slash, je ne sais pas si c'était la bonne direction, je
Je ne pense pas que c'était.
A-R-V tableau de bord, le besoin de plus d'espace.
Coupons dans ce tableau.
Tiret 0, puis oblique 0 A-R-V.
Et puis dans le désarroi sera bonjour.
Disons, H-E oblique 0.
Et enfin, W-O barre oblique inverse 0.
>> Donc l'algorithme que nous venons d'écrire, la nichée pour les boucles, ce qu'ils
faire dire, nous devons d'abord le contrer i et j.
Ce serait plus facile avec le code de la écran, Revenons à cette question.
OK.
Ainsi constate que i est l'itérateur qui est itération sur chaque commande
argument de la ligne.
Et j est l'itération de l'itération au-dessus de chaque caractère par le fait que
commande argument de ligne.
Donc ce que cela printf interne est fait est, nous avons printf argv 0 0, printf
argv 0 1 printf argv 0 2 0 3, 0 4, 0 5, 6 0, mais maintenant, argv 0 7 va
égal barre oblique inverse 0.
>> Alors que nous sortons de la boucle, et maintenant je itération à 1.
Et maintenant, nous allons imprimer argv 1 0, argv 1 1 -
Eh bien, maintenant, depuis que j'ai coupé court bonjour, argv 1 2 va à nouveau être
barre oblique inverse 0.
Et oui, incrémenter i et continuer, et ainsi de suite, jusqu'à ce que nous imprimons tous
monde, et ceux qui sont de trois ligne de commande arguments, et nous sortons de
la boucle la plus externe, et terminer notre programme.
OK.
>> Donc revenons ici.
Donc, vous gagnerez une certaine familiarité avec arguments de ligne de commande sur ce
problème particulier défini.
>> Maintenant, le débogage.
Donc, vous avez probablement déjà eu à faire du débogage avec votre précédente
problème réglé.
Et une façon très facile de débogage, en premier lieu, regardons un programme de buggy.
Eh bien, la marche à travers ce programme, nous allons demander à l'utilisateur une
entier, prenez cet entier, puis, arbitrairement, nous avons une boucle while qui
va juste à diminuer i jusqu'à ce qu'il soit égal à 10.
Supposons juste que je suis entrée un nombre entier supérieur à 10.
Donc décrémenter i jusqu'à ce qu'il soit égal à 10.
>> Et puis nous avons une autre boucle while que, si i n'est pas égal à 0, nous sommes
aller à i diminuer par 3.
Donc si vous voyez l'intention de l'insecte ici, c'est que ça va décrémenter i de
de 10, et puis cette boucle while volonté décrément i de 10, à 7, à 4, à 1,
à négative 2, à 5 négatif, et ainsi de suite, à l'infini, puisque je
jamais égaler fait 0.
Et puis à la fin de ce programme, nous avons la fonction foo qui est
passe impression que i.
>> C'est donc un programme court et superficiel, et le bug est évident,
surtout après que je viens de dit ce que le bug était.
Mais le but ici est, bien, cela pourrait effectivement ressembler à une partie de votre
solutions de gourmand de la dernière problème posé, et peut-être que vous ne possédez
certains boucle infinie dans votre programme, et vous n'avez aucune idée
ce qui le cause.
Ainsi, une technique de débogage très utile est à juste ajouter printfs
partout dans votre code.
>> Donc ici, je veux un printf extérieur première boucle while.
Et ici, je veux un printf, et je vais imprimer i.
Je vais même faire en premier tandis que boucle, i.
A l'extérieur, tandis que la deuxième boucle.
Une fois de plus, imprimer à l'intérieur d'ici, la valeur i.
Et lançons ce.
>> Donc, point de débogage slash.
Entrez un nombre entier.
Faisons 13.
Et boum.
Nous voyons que nous sommes en boucle infinie à l'intérieur de la deuxième boucle while.
Alors maintenant, nous savons ce que le bug est.
Mais printf débogage est parfaitement bien, mais une fois que vos programmes se
plus long et plus compliqué, il existe solutions plus sophistiquées à
que les choses fonctionnent.
Donc, nous allons supprimer tous ces printfs.
Et faisons en sorte que je n'ai pas rien casser.
OK.
>> Ainsi, le programme que nous allons à introduire est appelé
GDB, pour GNU Debugger.
Eh bien, effectivement, nous allons supprimer débogage pour une seconde, et faire à nouveau débogage.
Eh bien, en fait d'abord, une bonne leçon dans les arguments de ligne de commande.
Notez que cette commande Clang qui est compiler tout est passé
à la ligne de commande, les arguments de ligne de commande.
Donc exactement comment vous allez utiliser arguments de ligne de commande, comme nous
fait avant, et que vous voulez en PSET 2, c'est comme ça que Clang est de les utiliser.
>> Donc remarquer que ce premier drapeau, tableau de bord ggdb3, ce qui n'est pas peu dire c'est, Clang,
vous devez compiler ce fichier avec le intention que nous finirons
besoin de déboguer.
Donc, tant que vous avez le drapeau, alors nous pouvons GDB débogage.
Et il va ouvrir le débogueur GNU.
>> Donc, il ya beaucoup de commandes que vous avez besoin de s'habituer à.
Premier que vous aurez probablement immédiatement besoin est Exécuter.
Alors qu'est-ce Run va faire?
Il va commencer notre programme.
Alors courez, programme de démarrage, le programme nous demande pour un nombre entier, 13.
Et puis c'est boucle infinie prévu, sauf j'ai enlevé le
printfs, de sorte que nous ne voyons même pas.
Sorti normalement.
Oh.
Il est possible que l'enveloppa tout le inverse, vers - ignorant que.
Supposons qu'il n'a pas quitté normalement.
Il ya une réponse compliquée à cela.
>> Alors maintenant, ce n'est pas très utile.
Il suffit donc de la gestion de notre programme à l'intérieur de ce débogueur ne nous aide pas du tout
Ainsi, puisque nous aurions pu faire point slash débogage de l'extérieur GDB.
Donc, la seule commande que Vous aurez probablement -
et je vais arrêter cela.
Control-d ou cesser de fumer, à la fois travail.
Donc, nous allons l'ouvrir à nouveau.
>> Une autre commande que vous aurez probablement immédiatement envie
s'habituer à se Break.
Donc, nous allons briser le principal pour l'instant, et puis je vais vous expliquer cela.
Eh bien, nous voyons ici nous avons mis un point d'arrêt à cette ligne dans debug.c.
Alors quels sont les moyens rupture, c'est que lorsque je saisir run, le programme va
continuer à fonctionner jusqu'à ce que J'ai frappé un point d'arrêt.
Alors, quand j'ai touché terme, le programme démarre, puis il se casse dès que l'
entre dans la fonction principale.
Cassez principal va être quelque chose de vous faites assez souvent.
>> Et maintenant, à vous présenter à un peu plus de commandes.
Notez ici, que c'est de dire que nous cassé à la ligne 11, qui est
printf, entrez un nombre entier.
Ainsi, la commande suivante va être comment nous allons à la ligne de code suivante.
Cela va nous permettre à l'étape grâce à notre programme ligne par ligne.
Alors la prochaine.
>> Maintenant la ligne 12, nous allons pour obtenir le nombre entier.
Suivant.
Et si vous frappez juste Entrez à nouveau, ça va rétablir la dernière chose que vous avez fait.
Donc, je n'ai pas besoin de taper prochaine à chaque fois.
Alors entrer un nombre entier, 13.
Alors maintenant, la ligne 14, tandis que i est supérieur de 10, et je vais faire ensuite.
Et nous voyons que nous allons diminuer i.
Nous allons donc à diminuer i nouveau.
>> Alors maintenant, un autre utiles commande est Print.
Donc Imprimer va imprimer la valeur de la variable.
Allons faire ressortir la valeur i variable.
Imprimons i.
Il va dire i est 11.
Maintenant, nous suivant à nouveau en i est supérieur à 10.
Donc, je c'est encore plus que 10, puisque c'est 11.
i minus minus.
Imprimons i nouveau.
Comme prévu, c'est 10.
>> Alors maintenant, à côté.
Il va revenir à l'état, i est supérieur à 10, mais i est maintenant 10, de sorte
ce n'est pas plus de 10, alors nous nous attendons sa chute hors de la boucle while.
Et maintenant, nous sommes en dessous de cette ligne de code.
Et une autre commande, Liste, va tout simplement pour afficher la précédente et suivante
quelques lignes de code, en Si vous vous perdez.
Donc nous avons juste sortis cette boucle while, et maintenant nous sommes entrés dans ce
tout en boucle, ligne 18.
Ainsi, alors que i n'est pas égal à 0.
Et, à côté, i est égal à i moins 3, et nous allons remarquer, ça va juste continuer.
Et nous pouvons imprimer i.
>> Chaque commande possède sorte de raccourcis.
Donc p est l'abréviation de l'impression.
Donc, nous pouvons p i.
Il suffit de garder la tenue n, ou continuer à faire Suivant.
Imprimer i nouveau.
Vous voyez maintenant, c'est négatif 167.
Donc cela va durer pour toujours, mais pas vraiment jamais, puisque vous venez de voir, il
sera effectivement finir à un moment donné.
>> Alors que commence GDB.
Mais nous allons faire une chose dans GDB.
Euh, débogage.
Donc, dans ce cas particulier, la boucle infinie qui est arrivé à être à l'intérieur de
la fonction principale.
Et pour l'instant, juste accepter que que je suis va déplacer la boucle infinie dans
la fonction foo.
Il suffit de rappeler que, à la fin de cette programme, eh bien, c'était à l'origine
, appeler foo, qui était juste va imprimer i.
Mais maintenant, nous demandons foo, qui est va diminuer jusqu'à ce qu'il soit i 0, et
puis imprimer cette variable.
OK.
Sauf que.
Assurez-debug.
Et maintenant, gdb débogage.
OK.
>> Donc, si je viens couru alors je ne vais pas être en mesure d'intervenir effectivement dans mon
ligne par ligne programme.
Donc, nous allons briser au principal, puis tapez run.
Alors, allez par là, printf, entrez un nombre entier, obtenir le nombre entier, 13.
Donc, nous allons garder décrémentation jusqu'à ce que i est supérieur à 10.
Ensuite, nous allons passer à travers la tout en boucle, et arriver à la ligne -
nous allons ouvrir dans une fenêtre séparée.
Donc nous décrémentés jusqu'à ce que je n'étais plus supérieur à 10, puis on
appelé la fonction, foo.
>> Donc ce qui s'est passé dès que j'ai touché fonction foo, eh bien, j'ai appelé foo, et
je n'avais plus le contrôle de GDB.
Donc dès que j'ai touché suivante à cette ligne, les choses ont continué jusqu'à ce qui s'est passé,
où le programme est sorti quand -
supposer qu'il n'existait pas fini.
Vous l'avez vu faire une pause pour un peu cependant.
Alors, pourquoi ai-je perdu le contrôle de le programme à ce point?
Eh bien, quand je tape suivante, qui va à la ligne suivante littérale de code
exécutera.
Ainsi, après la ligne 21, la ligne de code suivante qui exécutera est la ligne 22,
qui est, à la sortie de la principale.
Donc, je ne veux pas y aller juste à la ligne de code suivante.
Je veux aller dans la fonction foo et puis aussi par l'étape
ces lignes de code.
>> Donc, pour cela, nous avons une solution de rechange.
Cessons de ça.
Cassez principale.
Euh, 1, prochaine, prochain, le 13, à côté, prochaine, prochaine, attentivement,
avant d'atteindre la ligne foo.
OK.
>> Alors maintenant, nous sommes à la ligne 21, où nous appelons foo.
Nous ne voulons pas taper à côté, depuis que va simplement appeler la fonction foo, et
aller à la prochaine ligne de code.
Ce que nous voulons utiliser est l'étape.
Donc, il ya une différence entre l'étape et Suivant, où l'étape étapes dans le
fonctionne, et suivant va au-dessus de la fonction.
Il exécute simplement la totalité de la fonction et continue à aller.
>> Donc, l'étape va nous apporter dans la fonction foo.
Et nous voyons ici, maintenant, nous sommes de retour à cette boucle while est que, en théorie,
va continuer pour toujours.
Et si vous frappez l'étape, quand il n'est même pas une fonction à appeler, alors il est
identique à Suivant.
Donc, c'est seulement quand vous êtes à une ligne qui appelle une fonction qui Step
va différer suivant.
Donc, l'étape va nous apporter ici.
Étape, étape, étape, étape, étape, étape, et Nous allons boucle infinie pour toujours.
>> Donc, vous pourriez vous habituer à ce que votre moyen d'identifier des boucles infinies, est
juste maintenant cette touche Entrée pour voir où vous êtes coincé.
Il ya de meilleures façons de le faire, mais pour l'instant, c'est parfaitement suffisant.
Et stylistiquement, de se conformer aux modèles 50, je l'ai fait.
OK.
>> Alors une dernière commande à introduire.
Eh bien, GDB débogage po
Donc, au lieu de casser dans la principale, si je connaître la fonction foo est aussi le
problème, alors je pourrais avoir juste ledit, briser à foo, à la place.
Disons que je me casse à à la fois principal et foo.
Ainsi, vous pouvez définir autant de points d'arrêt que vous le souhaitez.
Lorsque je tape terme, il va s'arrêter à la -
ooh, nous allons recompiler, depuis J'ai changé les choses.
Vous verrez cette ligne, Attention, la source fichier est plus récente que exécutable.
Cela signifie donc que je suis juste allé ici et changé pour se conformer à ces modèles
50, mais je n'ai pas recompile le programme.
Donc GDB me fait prendre conscience de cela.
Je vais arrêter, faire à nouveau débogage, frapper gdb débogage.
OK.
>> Alors maintenant, à ce que je faisais.
Cassez principal, coupure foo.
Maintenant, si je lance le programme, si ce n'est va continuer jusqu'à ce que frappe un
point d'arrêt.
Cela se produit au point d'arrêt être le premier à principal.
Maintenant, au lieu de le faire suivant, suivant, suivant, prochaine, à côté, jusqu'à ce que je frappe foo, je
peut saisir continuer, qui se poursuivra jusqu'à ce que vous atteignez le point d'arrêt suivant.
Je dois saisir l'entier premier.
Continuer continuera jusqu'à ce que je frappe le point d'arrêt suivante, à savoir que
fonction de foo.
>> Alors Run se déroulera jusqu'à ce que vous atteignez un point d'arrêt, mais vous ne tapez run quand
vous commencez le programme, puis, à partir de là, c'est continuer.
Si je l'ai fait briser principal et puis a couru, il va casser à
principal, puis continuer.
Comme je n'ai pas un point de rupture au foo, entrez le nombre entier, alors maintenant je suis
ne va pas se casser à foo.
Il va juste à l'infini jusqu'à ce que la boucle.
OK.
>> C'est donc Intro à GDB.
Vous devriez commencer à l'utiliser dans vos ensembles de problèmes.
Il peut être très utile pour identifier des bogues.
Si vous avez réellement juste, ligne par ligne, allez dans votre code, et comparer ce qui est
qui se passe réellement avec ce que vous attendez arriver, alors il est assez
difficile de rater vos bugs.
OK.
>> Donc, la semaine dernière, David a cette substance de la cryptographie à clé secrète pour l'
première fois, où nous ne voulons pas les mots de passe juste être stockées sur notre
ordinateur dans certains fichiers de texte brut, où quelqu'un peut venir et juste
ouvrir et les lire.
Idéalement, ils seront cryptées d'une certaine façon.
Et dans le problème Set 2, vous aurez affaire avec une méthode de cryptage,
ou, ainsi, deux méthodes, mais ils ne sont pas si grand.
Si vous faites l'édition pirate, vous êtes va aussi avoir affaire à
décrypter certaines choses.
>> Donc, la question est maintenant, bien, même si nous avons le cryptage le plus puissant
algorithme dans le monde, si vous choisissez un particulièrement mauvaise passe, alors il
ne vous aidera pas beaucoup, car les gens seront toujours en mesure de le comprendre.
Même si voir la chaîne cryptée et il ressemble à un gâchis de déchets
qui ne signifie rien pour eux, s'ils toujours juste besoin d'essayer quelques mots de passe
à comprendre, alors vous ne sont pas très sécurisé.
Donc, en regardant une vidéo rend ce point.
>> [VIDEO LECTURE]
>> -Casque, vous démon.
Qu'est-ce qui se passe?
Que faites-vous à ma fille?
>> -Permettez-moi de présenter le brillant jeune chirurgien plasticien, le Dr Phillip
Schlotkin, le plus grand nez emploi homme dans l'ensemble du
univers, et de Beverly Hills.
>> -Votre Altesse.
>> -Nez emploi?
Je ne comprends pas.
Elle a déjà eu un travail de nez.
C'était un bonbon seize présente.
>> -Non.
Ce n'est pas ce que vous pensez.
C'est bien pire.
Si vous ne me donnez pas la combinaison de le bouclier de l'air, le Dr Schlotkin sera
donner votre fille son vieux nez.
>> -Non.
Où avez-vous cela?
>> -Très bien.
Je vais vous dire.
Non, papa.
Non, vous ne devez pas.
>> -Vous avez raison, mon cher.
Je vais manquer votre nouveau nez.
Mais je ne vais pas lui dire la combinaison, peu importe quoi.
>> -Très bien.
Dr Schlotkin, faire votre pire.
>> -Mon plaisir.
>> [OUTILS à affûter]
>> -Non.
Attendez.
Je vais vous dire.
>> -Je savais que ça marcherait.
Très bien.
Donne-le moi.
>> -La combinaison est un.
>> -Un.
>> -Deux.
>> Trois.
>> -Quatre.
>> -Cinq.
>> -Ainsi, la combinaison est un, deux, trois, quatre, cinq.
C'est la combinaison la plus stupide J'ai jamais entendu dans ma vie.
C'est le genre de chose un idiot pourrait avoir sur ses bagages.
>> -Merci, Votre Altesse.
>> -Qu'avez-vous fait?
>> -Je me suis tourné sur le mur.
>> -Non, vous ne l'avez pas.
Vous avez désactivé tout le film.
>> -Je dois avoir appuyé sur le mauvais bouton.
>> -Eh bien, le remettre sur.
Mettez la vidéo sur.
>> -Oui, monsieur.
Oui, monsieur.
>> -Allons, Arnold.
Venez, Gretchen.
Bien sûr, vous savez que je vais encore dois vous facturer pour cela.
>> [LECTURE VIDEO FIN]
>> ROB BODEN: Très bien.
Alors, maintenant que nous parlons déjà la sécurité, à certains égards, agréable
petite affiche de film, si au cours des dernières jour, ces questions avec la NSA
suivi tout.
Il peut être difficile de se sentir comme vous avoir une sorte de vie privée dans le
monde en ligne, bien que je ne pouvais pas dire vous la plupart des détails de PRISM.
Donc, aller au-delà PRISM, nous n'allons pas de parler de cela, maintenant
pensez à votre ordinateur portable.
Donc ici, je veux passer à mon compte réel,
avec mon petit pingouin.
Donc, j'ai un jeu de mot de passe, et que mot de passe est tout ce que je veux que ce soit.
>> Mais n'oubliez pas que ce que je vous connectant avec, si cette connexion
rapide, est un programme.
C'est un programme qui a été écrit par une personne.
Et donc, que personne, si elles sont particulièrement malveillant, ils pourraient
ont dit, tout droit, si le mot de passe que j'entre est égale à mon
mot de passe réel, ou c'est l'égalité une certaine mot de passe spécial -
David est génial ou quelque chose -
puis laissez-les po
Ainsi, un programmeur malveillant pourrait avoir accès à tous vos Mac, ou
Fenêtres, ou quoi que ce soit.
>> Donc, ce n'est pas vraiment un problème, car, Je veux dire, c'est le programme de connexion
C'est livré avec OS X, des centaines ou des milliers de personnes ont
examiné ce code.
Et donc, si, dans votre code quelque part, vous dire si cette chaîne est égale à égal
David est génial, connectez-vous, puis quelqu'un est va être, comme, attendre.
Ce n'est pas juste.
Cela ne devrait pas être ici.
Donc, c'est une façon de faire les choses à être une sorte de sécurité.
>> Mais pensez à même des programmes que vous écrivez.
Disons que vous avez écrit le programme de connexion.
Donc, ce programme de connexion que vous avez écrit, si évidemment, vous êtes un bon
programmeur.
Vous n'allez pas mettre n'importe quel malveillants si x est égal à égaux David est génial
dans votre code.
Mais ce programme, ce que vous faites utiliser pour compiler ce programme?
Quelque chose comme Clang.
Alors que faire si la personne qui se trouvait à écrire Clang spécial tubé dans Clang
quelque chose comme, si je suis la compilation du programme vous connecter, saisissez ce code
dans le programme de connexion qui dit, si x est égal à égal David est génial?
Donc, pas encore tout à fait, mais nous avons le même émettre ici, où Clang, bien,
des milliers, sinon des dizaines de milliers de personnes, ont regardé Clang, ont
regardé ses lignes de code et dit: tout droit, il n'y a rien de mal ici.
Évidemment, personne ne fait tout ce malveillant.
>> Mais ce qui est lui-même Clang, comme, si je compile Clang?
Que faire si j'ai un compilateur qui compile Clang qui s'insère dans Clang
ce hack spécial qui dit, tout droit, quand je compile Clang, le
exécutable je me dois spécialement regarder à l'intérieur du programme et insert connexion
ce mot de passe, est égal à égal Dave est génial?
Alors, n'oubliez pas que votre compilateur lui-même doit être compilé à un moment donné.
Donc, si ce que vous choisissez de compiler Clang avec lui-même est malveillant, alors vous
pourrait être vissée toute en bas de la ligne.
>> Donc, ici, nous avons Ken Thompson et Dennis Ritchie.
C'est donc une photo emblématique.
Dennis Ritchie est sur la droite.
Il est un grand -
assez bien écrit C. Ainsi, vous pouvez le remercier pour cette classe.
Ken Thomson est sur la gauche.
Les deux d'entre eux essentiellement écrit UNIX.
Eh bien, ils ont été les principaux contributeurs sous UNIX.
Il y avait quelques autres.
Donc, Ken Thompson, à un moment donné, il remporte le prix Turing.
Et le prix Turing, j'ai toujours entendu il référencé cette façon, c'est le
Prix ​​Nobel de l'informatique.
>> Donc, au prix Turing, il doit prononcer son discours d'acceptation.
Et il donne cette très célèbre discours maintenant, appelé Réflexions sur la confiance
Confiance, qui nous avons lié Pour sur le site du cours.
Et dans ce discours, dit-il, tout droit, j'ai donc écrit UNIX, et maintenant tous
vous les gens utilisent UNIX.
Maintenant, rappelez-vous aujourd'hui que Linux est un descendant direct d'UNIX.
OS X utilise directement UNIX.
Windows n'utilise pas beaucoup, mais beaucoup d'idées ont été prises à partir d'UNIX.
>> Alors il monte sur la scène et dit: tout droit, j'ai écrit UNIX.
Et juste pour vous les gars savent, je suis en mesure de se connecter à tous les
seul un de vos ordinateurs.
Depuis que j'ai mis un de ces si spéciale x est égal à égal Ken Thomson est impressionnant,
alors je suis autorisé à vous connecter.
Alors, les gens sont comme, bien, Comment as-tu fait cela?
Nous avons examiné le programme de connexion et rien n'est là.
Il est comme, bien, j'ai modifié le compilateur à identifier le programme de connexion
de sorte que le programme de connexion maintenant aura que x est égal à égaux Ken Thompson
est impressionnante.
>> Et ils disent, eh bien, ce n'est pas vrai.
Nous cherchons à le compilateur, et la compilateur n'a pas encore de lignes de
Code comme ça.
Il est comme, OK, mais ce qui vous la compilation du compilateur avec?
Et ils pensent, et il est, comme, bien, Je suis celui qui vous a donné le compilateur
vous utilisez pour compiler le compilateur, si vous compilez un compilateur, qui
lui-même est malveillant, et sera briser le programme de connexion.
Donc, fondamentalement, à ce moment, il n'y a aucun moyen que vous pouvez regarder à la source
Code du programme de connexion pour voir ce qui est faux.
Vous pourriez même pas regarder dans le le code source du compilateur
pour voir ce qui est faux.
>> Vous auriez besoin de regarder la machine code, le binaire réel de la
compilateur compilé pour voir, attendre, ces lignes de code ne devrait pas être ici.
Mais Ken Thompson a pris une étape plus loin et dit, eh bien, il ya
ces programmes spéciaux qui fait vous aider à lire le fichier binaire de programmes,
et si quelqu'un a utilisé ce programme pour lire le binaire, ils verraient les
lignes de code.
Il a modifié ces programmes à dire, tout droite, si vous êtes à la recherche à la
compilateur, ne montrent pas ce particulier ensemble de binaire.
>> Alors vous avez besoin de faire un pas de plus loin et en gros, qui pourrait avoir
plusieurs niveaux d'indirection prises, et à un moment donné, personne ne s'agit en fait
va être vérifier.
Donc la morale de l'histoire est, vous êtes ne va pas être écrit
Clang dans cette classe.
Vous allez être en utilisant l'escalade Clang beaucoup dans cette classe.
Pour tous vous le savez, Clang est un malveillant programme qui est en train de saboter tous les
programme unique que vous avez jamais compilé.
Et de vous laisser sur ce très inquiétant Attention, vous voir mercredi.
>> [Applaudissements]
>> ENCEINTE 2: Lors de la prochaine CS50.
>> ENCEINTE 3: Ne pas vous osez dire que.
Vous pouvez le faire.
Vous l'avez déjà fait, vous pouvez le faire aujourd'hui, vous pouvez le faire demain.
Vous avez fait cela pendant des années.
Il suffit d'aller là-bas et le faire.
Vous pouvez le faire.
>> [MUSIQUE JEU]