[Powered by Google Translate] [Semaine 5]
[David J. Malan - Université de Harvard]
[C'est CS50. - CS50.TV]
>> C'est CS50, Semaine 5.
Aujourd'hui et cette semaine, nous introduisons un peu du monde de la médecine légale
dans le contexte du problème posé 4.
Aujourd'hui sera une conférence abrégée parce qu'il ya un événement spécial ici après.
Donc, nous allons jeter un coup d'oeil et taquiner les élèves et les parents d'aujourd'hui
avec quelques-unes des choses qui sont sur la ligne d'horizon.
>> Parmi ceux-ci, à partir de lundi, vous aurez quelques camarades plus.
EDX, Harvard et du MIT nouvelle initiative en ligne pour OpenCourseWare et plus,
lance sur le campus de Harvard, le lundi, ce qui signifie que lundi prochain
vous devrez, à compter du dernier recensement, 86 000 camarades de classe supplémentaires
qui suivra le long avec des conférences CS50 et les sections
et soluces et ensembles de problèmes.
Et dans le cadre de la présente, vous deviendrez membres de la classe inaugurale du CS50 et maintenant CS50x.
Dans le cadre de ce moment, se rendre compte que il y aura quelques bons côtés aussi.
Pour se préparer à cela, car le grand nombre d'étudiants,
il suffit de dire que même si nous avons 108 FO et AR,
ce n'est pas tout à fait le meilleur ratio élève-enseignant une fois nous avons touché 80.000 de l'élève.
Nous n'allons pas à classer problème tellement définit manuellement,
donc présenté cette semaine dans le problème posé sera CS50 Check,
qui va être un utilitaire de ligne de commande à l'intérieur de l'appareil
que vous obtiendrez une fois que vous le mettre à jour plus tard ce week-end.
Vous serez en mesure d'exécuter une commande, check50, sur votre propre pset,
et vous obtiendrez une rétroaction instantanée de savoir si votre programme est correcte ou incorrecte
selon les spécifications de conception différentes que nous avons fourni.
Plus à ce sujet dans la spécification du jeu de problème.
Les camarades de classe CS50x allons utiliser ceci aussi bien.
>> 4 Réglez problème est tout au sujet de la médecine légale,
et ce pset a été vraiment inspiré par des choses de la vie réelle
de sorte que lorsque j'étais à l'école d'études supérieures j'ai fait un stage pendant un certain temps
avec le bureau du procureur de district du comté de Middlesex a fait un travail médico-légal
avec leur enquêteur judiciaire plomb.
Que cela représentait, comme je crois l'avoir mentionné quelques semaines passé,
est la police d'État de masse ou d'autres viendraient,
ils déposer des choses comme les disques durs et les CD et les disquettes et autres,
et alors l'objectif du bureau judiciaire était de déterminer
s'il ya eu ou non une preuve d'une certaine sorte.
Ce fut l'Unité des enquêtes spéciales, de sorte qu'il était criminalité en col blanc.
C'était en quelque sorte plus troublant de crimes, tout ce qui concerne certains types de médias numériques.
Il s'avère que pas beaucoup de gens écrire un e-mail disant: «Je l'ai fait."
Donc, très souvent, ces recherches médico-légales ne se sont pas tout ce que beaucoup de fruit,
mais parfois les gens écriraient ces courriels.
Alors, parfois, les efforts ont été récompensés.
>> Mais pour mener à ce pset médico-légale, nous allons introduire dans pset4 un peu de graphiques.
Vous avez sans doute prendre ces choses pour acquises - JPEG, GIF, etc - ces jours-ci.
Mais si vous pensez vraiment cela, une image, un peu comme le visage de Rob,
peut être modélisée comme une séquence de points ou pixels.
Dans le cas du visage de Rob, il ya toutes sortes de couleurs,
et nous avons commencé à voir les points individuels, autrement connu en tant que pixels,
lorsque nous avons commencé à effectuer un zoom avant
Mais si nous simplifions le monde un peu et je dis juste que c'est ici Rob en noir et blanc,
pour représenter le noir et blanc, nous pouvons simplement utiliser binaire.
Et si nous allons utiliser binaire, 1 ou 0, on peut exprimer cette même image
du visage souriant de Rob avec ce modèle de bits.
11000011 représente le blanc, blanc, noir, noir, noir, noir, blanc, blanc.
Et donc ce n'est pas un énorme bond, puis commencer à parler de photographies en couleurs,
les choses que vous aimeriez voir sur Facebook ou prendre avec un appareil photo numérique.
Mais certainement quand il s'agit de couleurs, vous avez besoin plus de bits.
Et très répandue dans le monde de la photographie est de ne pas utiliser 1-bit couleur,
que cela suggère, mais couleur 24-bit, où vous obtenez en fait des millions de couleurs.
Alors que dans le cas où nous avons zoomé sur les yeux de Rob,
qui a été un certain nombre de millions de possibilités différentes couleurs.
Donc, nous allons présenter ce problème dans 4 Set ainsi que dans la procédure pas à pas,
qui aura lieu aujourd'hui à 3:30 au lieu de 2:30 l'habitude en raison de conférence de vendredi ici.
Mais la vidéo sera en ligne dès demain d'habitude.
>> Nous allons également vous présenter un autre format de fichier.
Ceci est délibérément destinée à paraître intimidant au premier abord,
mais ce n'est que de la documentation pour une struct C.
Il s'avère que les années Microsoft il ya contribué à populariser ce format
appelé le format de fichier bitmap, bmp, et ce fut une super simple, le format de fichier graphique coloré
qui a été utilisé pendant un certain temps et parfois encore des fonds d'écran sur les ordinateurs de bureau.
Si vous pensez revenir à Windows XP et les collines et le ciel bleu,
qui était généralement une image bmp ou bitmap.
Les bitmaps sont un plaisir pour nous parce qu'ils ont un peu plus de complexité.
Ce n'est pas tout à fait aussi simple que cette grille de 0 et de 1.
Au lieu de cela, vous avez des choses comme un en-tête au début d'un fichier.
Donc, en d'autres termes, à l'intérieur d'un fichier. Bmp est un tas de 0 et de 1,
mais il ya des 0 et des 1 dans les autres là-bas.
Et il s'avère que ce que nous avons probablement pris pour acquis depuis des années -
formats de fichiers tels que. doc ou. xls ou. mp3, mp4,. quelles que soient les formats de fichiers
que vous êtes familier avec - ce que ça veut dire être même un format de fichier,
car à la fin de la journée, tous ces fichiers que nous utilisons ont juste des 0 et des 1.
Et peut-être les chiffres 0 et 1 représentent ABC à travers ASCII ou similaires,
mais à la fin de la journée, il est encore juste des 0 et des 1.
Alors seulement occasionnellement les humains décident d'inventer un nouveau format de fichier
où ils normaliser ce schémas de bits réellement dire.
Et dans ce cas là, les gens qui ont conçu le format de fichier bitmap
dit que l'octet première fois dans un fichier bitmap, tel que désigné par 0 compensé là-bas,
il va y avoir une certaine nommés de façon énigmatique bfType variable appelée,
ce qui est juste pour le type de fichier bitmap, ce type de fichier bitmap est présent.
Vous pouvez déduire peut-être à partir de la deuxième rangée qui compensent 2, numéro 2 octets,
présente un motif de 0 et de 1 qui représente quoi? La taille de quelque chose.
Et il va à partir de là.
Donc, en 4 Set problème, vous serez parcouru certaines de ces choses.
Nous ne finiront pas se soucier de chacun d'eux.
Mais remarquez qu'il commence à devenir intéressant autour octet 54: rgbtBlue, Vert et Rouge.
Si vous avez déjà entendu l'acronyme RVB - rouge, vert, bleu - c'est une référence à ce
car il s'avère que vous pouvez peindre toutes les couleurs de l'arc en ciel
avec une combinaison de rouge et de bleu et de vert.
Et en fait, les parents dans la salle souvenez peut-être parmi les premiers projecteurs.
Ces jours-ci, vous venez de voir une lumière vive qui sort d'une lentille,
mais de retour dans la journée vous avez eu la lentille rouge, le verre bleu, et la lentille verte,
et ensemble, ils s'adressent à un écran et formé une image colorée.
Et bien souvent, les collèges et les lycées aurait ces lentilles
un tant soit peu de travers, de sorte que vous étaient en quelque sorte de voir des images doubles ou triples.
Mais c'était l'idée. Vous avez eu une lumière rouge et verte et bleue de peindre un tableau.
Et ce même principe est utilisé dans les ordinateurs.
>> Ainsi, parmi les défis alors pour vous un problème de Set 4 vont être quelques petites choses.
L'un est pour redimensionner une image, à prendre dans un modèle de 0 et de 1,
déterminer quels morceaux de 0 et de 1 représentent ce que dans une structure de ce type,
et ensuite trouver comment reproduire les pixels - les rouges, les bleus, les verts -
à l'intérieur de sorte que lorsque l'image se présente initialement,
il pourrait ressembler à ceci plutôt que par la suite.
Parmi les autres défis aussi va être que vous serez remis une image médico-légale
d'un fichier réel à partir d'un appareil photo numérique.
Et sur cette caméra, il était une fois, étaient tout un tas de photos.
Le problème est que nous avait accidentellement effacé ou endommagé en quelque sorte l'image.
De mauvaises choses arrivent avec des caméras numériques.
Et donc nous avons rapidement copié tous les hors 0s et 1s de cette carte pour vous,
sauvé tous en un seul gros fichier, et ensuite nous allons les remettre à vous dans un problème Set 4
de sorte que vous pouvez écrire un programme en C avec lequel récupérer tous ces fichiers JPEG, idéalement.
Et il s'avère que les fichiers JPEG, même si elles sont en quelque sorte un format de fichier complexe -
ils sont beaucoup plus complexes que ce visage souriant ici -
il s'avère que tous les JPEG commence par les mêmes schémas de 0 et de 1.
Donc, en utilisant, en fin de compte, une boucle while ou une boucle for ou similaire,
vous pouvez parcourir tous les 0 et de 1 dans cette image médico-légale,
et chaque fois que vous voyez le modèle spécial qui est défini dans la spécification problème posé,
on peut supposer ici est, avec une très forte probabilité, le début d'une JPEG.
Et dès que vous trouvez le même schéma certain nombre d'octets
ou kilo-octets ou méga-octets plus tard, vous pouvez supposer ici est une seconde JPEG,
la photo que j'ai prise après le premier.
Permettez-moi de cesser de lire ce fichier d'abord, commencer à écrire cette nouvelle,
et la sortie de votre programme pour pset4 va être jusqu'à 50 images JPEG.
Et si ce n'est pas 50 fichiers JPEG, vous avez un peu d'une boucle.
Si vous avez un nombre infini de fichiers JPEG, vous avez une boucle infinie.
Donc, cela va aussi être un cas assez commun.
Donc, c'est ce qui est à l'horizon.
>> Quiz 0 derrière nous, se rendre compte par mon e-mail qui, invariablement, il ya des gens qui sont à la fois heureux,
sorte de neutre, et triste autour de quiz 0 fois.
Et s'il vous plaît ne me tendre la main, la tête TF Zamyla, votre propre TF,
ou l'une des autorités de certification que vous savez si vous souhaitez discuter de la façon dont cela s'est passé.
>> Donc, pour impressionner les parents ici dans la salle, ce qui est la bibliothèque CS50?
[Rires] Bon travail.
Quelle est la bibliothèque CS50? Ouais. >> [L'élève] Il s'agit d'un ensemble pré-écrit du code [inaudible]
Bon, très bien.
Il s'agit d'un ensemble pré-écrit de code que nous le personnel écrit, nous vous fournissons,
qui fournit des fonctionnalités communes,
des trucs comme me une chaîne, m'obtenir un int - toutes les fonctions qui sont énumérés ici.
>> À partir de maintenant, nous commençons à vraiment prendre ces roues d'entraînement hors tension.
Nous allons commencer à enlever une chaîne de votre part,
qui était juste un rappel pour traduire ce type de données réel? >> [Plusieurs étudiants] Char *.
Char *. Pour les parents, c'est probablement [rend sifflement]. C'est bien.
* Char nous allons commencer à voir sur l'écran d'autant plus que nous retirons de notre chaîne de vocabulaire,
au moins quand il s'agit de réellement écrire de code.
De même, nous allons cesser d'utiliser certaines de ces fonctions autant
parce que nos programmes vont devenir plus sophistiqués.
Plutôt que de simplement écrire des programmes qui sont assis là avec un clignotement rapide,
d'attente pour l'utilisateur de taper quelque chose, vous aurez vos entrées d'ailleurs.
Par exemple, vous les obtenir à partir d'une série de bits sur le disque dur local.
Vous, au lieu de les obtenir à l'avenir à partir d'une connexion réseau,
un certain site Web, quelque part.
>> Donc, nous allons décoller cette couche pour la première fois et tirer vers le haut l'appliance CS50
et ce fichier appelé cs50.h, que vous avez été # y compris pendant des semaines,
mais il faut vraiment voir ce qu'il ya dedans de cela.
Le début du fichier en bleu est juste un tas de commentaires:
informations sur la garantie et la licence.
C'est en quelque sorte un paradigme commun dans le logiciel
parce que beaucoup de logiciels de nos jours est ce qu'on appelle l'open source,
ce qui signifie que quelqu'un a écrit le code et rendu disponible gratuitement
pas seulement à courir et à utiliser, mais de réellement lire et modifier et l'intégrer dans votre propre travail.
C'est donc ce que vous avez utilisé, le logiciel open source, quoique sous une forme très faible.
Si je défiler vers le bas au-delà des commentaires, cependant, nous allons commencer à voir des choses plus familières.
Avis au sommet ici que le fichier cs50.h comprend tout un tas de fichiers d'en-tête.
La plupart de ceux-ci, nous n'avons pas vu avant, mais on est familier.
Lequel de ces avons-nous vu, quoique brièvement, à ce jour? >> [L'élève] bibliothèque standard.
Ouais, bibliothèque standard. stdlib.h a malloc.
Une fois que nous avons commencé à parler de l'allocation dynamique de mémoire,
que nous y reviendrons la semaine prochaine aussi, on a commencé à inclure ce fichier.
Il s'avère que bool, vrai et faux n'existent pas en soi C
sauf si vous incluez ce fichier ici.
Nous avons été pendant des semaines, y compris stdbool.h
de sorte que vous pouvez utiliser la notion de. bool, vrai ou faux
Sans cela, vous auriez à trier de faux et d'utiliser un int
et juste arbitrairement supposer que 0 est faux et 1 est vrai.
Si nous défiler vers le bas encore, voici notre définition d'une chaîne.
Il s'avère, comme nous l'avons déjà dit, que lorsque cette étoile est n'est pas vraiment important.
Vous pouvez même avoir l'espace tout autour.
Nous ce semestre ont été en faire la promotion comme cela à préciser
que l'étoile a à voir avec le type,
mais se rendre compte tout aussi commun, si ce n'est un peu plus fréquent,
est de le mettre là, mais fonctionnellement c'est la même chose.
Mais maintenant, si nous lisons un niveau plus bas, nous allons jeter un coup d'oeil à getInt
parce que nous avions l'habitude que peut-être d'abord avant toute autre chose de ce semestre.
Voici getInt. C'est quoi? >> [L'élève] Un prototype. >> Ce n'est qu'un prototype.
Souvent, nous avons mis prototypes au sommet de notre. Fichiers c,
mais vous pouvez aussi mettre des prototypes dans les fichiers d'en-tête, les fichiers. h, comme celui-ci ici
de sorte que lorsque vous écrivez des fonctions que vous voulez que les autres soient en mesure d'utiliser,
ce qui est exactement le cas avec la bibliothèque CS50,
non seulement vous mettre en œuvre vos fonctions dans quelque chose comme cs50.c,
vous pouvez également mettre les prototypes pas au sommet de ce fichier mais au sommet d'un fichier d'en-tête.
Ensuite, ce fichier d'en-tête est ce que les amis et collègues comprennent
avec # include dans leur propre code.
Donc tout ce temps, vous avez été, y compris l'ensemble de ces prototypes,
efficacement en haut de votre fichier, mais par le biais de ce mécanisme de # include,
dont l'essentiel des copies et des pâtes ce fichier dans votre propre.
Voici une documentation assez détaillée.
Nous avons à peu près acquis que getInt obtient un int,
mais il s'avère qu'il ya des cas marginaux.
Que faire si l'utilisateur tape un nombre qui est trop grand, un trillion,
qui ne peut pas s'adapter à l'intérieur d'un int? Quel est le comportement attendu?
Idéalement, il est prévisible.
Donc dans ce cas, si vous avez réellement lu les petits caractères,
vous allez vraiment voir que si la ligne ne peut pas être lu, ce INT_MAX rendements.
Nous n'avons jamais parlé de cela, mais en fonction de sa capitalisation, quel est-il probable?
[L'élève] Une constante. >> C'est une constante.
C'est une constante spéciale qui est probablement déclaré dans un de ces fichiers d'en-tête
c'est plus haut dans le fichier, et INT_MAX est probablement quelque chose comme environ 2 milliards de dollars,
l'idée étant que, parce que nous avons besoin d'une certaine manière signifier que quelque chose s'est mal passé,
nous, oui, avez 4 milliards de numéros à notre disposition: -2 milliards à 2 milliards d'euros, donner ou prendre.
Eh bien, ce qui est commun dans la programmation est que vous volez juste un de ces numéros,
peut-être 0, peut-être 2 milliards de dollars, peut-être -2000000000,
si vous passez un de vos valeurs possibles de sorte que vous pouvez vous engager dans le monde
que si quelque chose va mal, je vais retourner cette valeur super grand.
Mais vous ne voulez pas que l'utilisateur tape quelque chose comme 234 ... cryptique, un très gros chiffre.
Vous généraliser plutôt comme une constante.
Alors, vraiment, si tu étais anal cours des dernières semaines, à chaque fois que vous avez appelé getInt,
vous auriez dû vérifier avec une condition if a l'utilisateur de saisir INT_MAX,
ou, plus précisément, fait INT_MAX retour getInt, parce que si c'était le cas,
qui signifie en fait qu'ils n'ont pas le taper. Quelque chose n'allait pas dans ce cas.
Donc, c'est ce qui est généralement connu comme une valeur sentinelle, ce qui signifie tout simplement extraordinaire.
>> Passons maintenant dans le fichier. C.
Le fichier C a existé dans l'appareil pendant un certain temps.
Et en fait, l'appareil at-il pré-compilés pour vous dans cette chose que nous avons appelé code objet,
mais il n'a pas d'importance pour vous où il est parce que le système sait
dans ce cas, où il est: l'appareil.
Voyons maintenant défiler vers le bas pour getInt et de voir comment getInt a travaillé tout ce temps.
Ici, nous avons des commentaires similaires d'avant.
Permettez-moi de faire un zoom sur la seule portion de code.
Et ce que nous avons pour getInt est la suivante.
Il ne prend pas d'entrée.
Elle retourne un int, while (true), nous avons donc une boucle infinie délibérée,
mais sans doute nous allons sortir de cette façon ou retourner à partir de ce.
>> Voyons comment cela fonctionne.
Nous semblons être en utilisant GetString dans cette première ligne dans la boucle, 166.
C'est maintenant une pratique bien parce que les circonstances dans lesquelles pourrait revenir GetString
le mot clé NULL spécial? >> [L'élève] Si quelque chose va mal.
Si quelque chose va mal. Et qu'est-ce qui pourrait mal tourner lorsque vous appelez quelque chose comme GetString?
Ouais. >> [L'élève] Malloc ne parvient pas à lui donner les ints.
Ouais. Peut-être que malloc échoue.
Quelque part sous le capot, GetString appelle malloc, qui alloue de la mémoire,
ce qui permet au magasin de l'ordinateur tous les caractères
que l'utilisateur tape sur le clavier.
Et si l'utilisateur avait beaucoup de temps libre et j'ai tapé plus, par exemple,
de 2 milliards de caractères, plus de caractères que l'ordinateur a même RAM.
GetString doit être en mesure d'indiquer que pour vous.
Même si c'est un super, super-coin rare cas,
il doit en quelque sorte être capable de gérer cela,
et ainsi de GetString, si nous sommes allés en arrière et lire sa documentation, fait en effet NULL retour.
Alors maintenant, si GetString échoue en renvoyant NULL, getInt va échouer, en retournant INT_MAX
comme une sentinelle. Ce ne sont que des conventions humaines.
La seule façon vous savez ce cas il suffit de lire la documentation.
>> Faisons défiler vers le bas à l'endroit où l'int est effectivement obtenu.
Si je défiler vers le bas un peu plus loin, dans la ligne 170, nous avons un commentaire ci-dessus de ces lignes.
Nous déclarons en 172 un int, n, et un char, c, puis cette nouvelle fonction,
que certains d'entre vous ont trébuché à travers avant, sscanf.
C'est la contraction de scanf chaîne.
En d'autres termes, donnez-moi une corde et je vais le rechercher des éléments d'information d'intérêt.
Qu'est-ce que ça veut dire?
Supposons que je tape, littéralement, 123 sur le clavier, puis appuyez sur Entrée.
Quel est le type de données de 123 lorsqu'ils sont retournés par GetString? >> [L'élève] String.
C'est évidemment une chaîne, pas vrai? J'ai une chaîne de caractères.
Donc 123 est vraiment, entre guillemets,, 123 avec le 0 \ à la fin de celui-ci.
Ce n'est pas un int. Ce n'est pas un nombre. Il ressemble à un numéro, mais il ne s'agit pas en réalité.
Alors qu'est-ce getInt avez à faire?
Il doit analyser cette chaîne de gauche à droite - 123 \ 0 - et en quelque sorte convertir en entier réel.
Vous pouvez trouver une façon de le faire.
Si vous repensez à pset2, vous sans doute été un peu à l'aise avec César
ou Vigenère, de sorte que vous pouvez parcourir une chaîne, vous pouvez convertir les caractères à ints.
Mais diable, c'est un tas de travail.
Pourquoi ne pas appeler une fonction comme sscanf qui fait cela pour vous?
Donc sscanf attend un argument - dans ce cas appelé la ligne, qui est une chaîne.
Vous pouvez ensuite spécifier entre guillemets, très similaire à printf, ce que vous attendez à voir dans cette chaîne.
Et ce que je dis ici, c'est je m'attends à voir un nombre décimal et peut-être un caractère.
Et nous allons voir pourquoi c'est le cas dans un instant.
Et il s'avère que cette notation est désormais penser à des choses que nous avons commencé à parler à propos de
un peu plus d'une semaine.
Quel est & n et & c fait pour nous ici? >> [L'élève] Adresse de n et l'adresse de c.
Ouais. Il me donne l'adresse de n et l'adresse de c. Pourquoi est-ce important?
Vous savez que, avec des fonctions en C, vous pouvez toujours retourner une valeur ou pas de valeur du tout.
Vous pouvez retourner un int, une chaîne, un flotteur, un char, que ce soit, ou vous pouvez renvoyer void,
mais vous ne pouvez retourner une chose maximum.
Mais ici, nous voulons sscanf pour moi de revenir peut-être un int, un nombre décimal,
et aussi un. char, et je vais vous expliquer pourquoi le char dans un moment
Vous voulez sscanf efficacement pour retourner deux choses, mais ce n'est tout simplement pas possible en C.
Vous pouvez contourner ce passage dans deux adresses
parce que dès que vous remettez une fonction de deux adresses,
ce que cela peut-il fonctionner en faire? >> [L'élève] Ecrire à ces adresses.
Il peut écrire à ces adresses.
Vous pouvez utiliser l'opération étoiles et aller là-bas, à chacune de ces adresses.
C'est en quelque sorte ce mécanisme porte arrière, mais très commun pour changer les valeurs des variables
plus que juste un endroit - dans ce cas, deux.
Maintenant, remarquez je vérifie pour == 1, puis retour n si ça, en fait, la valeur true.
Alors qu'est-ce qui se passe? Techniquement, tout ce que nous voulons vraiment arriver dans getInt est la suivante.
Nous voulons analyser, pour ainsi dire, nous voulons lire la chaîne - entre guillemets, 123 -
et s'il semble qu'il y ait un numéro, ce que nous disons sscanf faire
est mis ce nombre - 123 - dans cette variable n pour moi.
Alors pourquoi ai-je réellement avoir ce ainsi?
Quel est le rôle de sscanf dire que vous pouvez également obtenir un personnage ici?
[Réponse de l'élève inaudible] >> Un point décimal pourrait effectivement fonctionner.
Tenons qui réfléchit un instant. Quoi d'autre?
[L'élève] Il pourrait être NULL. >> Bonne pensée. Il pourrait être le caractère nul.
En fait, c'est pas dans ce cas. Ouais. >> [L'élève] ASCII.
ASCII. Ou laissez-moi généraliser encore plus loin.
Le c%, il est juste pour la vérification des erreurs.
Nous ne voulons pas qu'il y ait un caractère après le nombre,
mais ce que cela me permet de faire est la suivante.
Il s'avère que sscanf, en plus de stocker des valeurs dans N et C dans cet exemple ici,
ce qu'il ne retourne aussi est-il le nombre de variables mettre les valeurs po
Donc, si vous tapez uniquement en 123, alors que le% d va correspondre,
et que n est stockée avec une valeur comme 123,
et rien ne se mettre en c.
C reste une valeur ordures, pour ainsi dire -
poubelle parce qu'il n'a jamais été initialisé à une certaine valeur.
Donc, dans ce cas, sscanf renvoie 1 car je peuplée 1 de ces pointeurs,
Dans ce cas, une grande, j'ai un int donc je libérer la ligne pour libérer la mémoire
que GetString effectivement alloués, et puis je retourne n,
d'autre si vous jamais demandé où que Réessayer déclaration vient, il vient ici.
Donc, si, par contre, je tape dans 123foo - quelques-unes séquence aléatoire de texte -
sscanf va voir, numéro, numéro, f,
et il va mettre le 123 en n, il va mettre le f en c et ensuite revenir 2.
Nous avons donc, simplement en utilisant la définition de base du comportement sscanf, un moyen très simple -
ainsi, complexe à première vue, mais à la fin de la journée mécanisme assez simple -
de dire est-il un int et si c'est le cas, c'est que la seule chose que j'ai trouvé?
Et l'espace blanc ici est délibérée.
Si vous lisez la documentation de sscanf, il vous dit que si vous incluez une pièce d'espaces
au début ou à la fin, trop sscanf permettra à l'utilisateur, pour une raison quelconque,
pour atteindre 123 bar espace et ce sera légitime.
Vous ne serez pas crier à l'utilisateur juste parce que ils ont frappé la barre d'espace
au début ou à la fin, ce qui est un peu plus convivial.
>> Toutes les questions, puis sur getInt? Ouais. >> [L'élève] Que faire si vous venez de mettre dans un char?
Bonne question.
Que faire si vous venez de taper dans un char comme f et appuyez sur Entrée sans jamais taper 123?
Que pensez-vous du comportement de cette ligne de code serait alors?
[Réponse de l'élève inaudible]
Ouais, donc sscanf peut couvrir que trop, car dans ce cas, il ne va pas à remplir n ou c.
Il va plutôt retourner 0, auquel cas je suis aussi attraper ce scénario
parce que la valeur attendue je veux, c'est 1.
Je veux seulement une et une seule chose à pourvoir. Bonne question.
>> Autres? Très bien.
>> Il ne faut pas passer par toutes les fonctions ici,
mais celui qui semble être peut-être des intérêts restants GetString
car il s'avère que GetFloat, getInt, GetDouble, GetLongLong
tout botté de dégagement de beaucoup de leurs fonctionnalités à GetString.
Donc, nous allons jeter un oeil à la façon dont il est mis en œuvre ici.
Celui-ci semble un peu complexe, mais il utilise les mêmes principes
que nous avons commencé à parler la semaine dernière.
En GetString, qui ne prend aucun argument que le vide par ici
et il retourne une chaîne, je suis apparemment déclarant une chaîne appelée tampon.
Je ne sais pas vraiment ce qui va être utilisé pour l'instant, mais nous allons voir.
On dirait que la capacité est par défaut 0.
Pas tout à fait sûr où cela se passe, pas sûr de ce que n va être utilisé pour encore,
mais maintenant ça devient un peu plus intéressant.
Dans la ligne 243, nous déclarons un int, c.
C'est en quelque sorte un détail stupide.
Un char est de 8 bits et 8 bits peut stocker combien de valeurs différentes? >> [L'élève] 256. 256 >>.
Le problème est que si vous voulez avoir 256 différents caractères ASCII, qui y sont
si vous repensez - et ce n'est pas quelque chose à mémoriser.
Mais si vous repensez à ce que grand tableau ASCII nous avions semaines,
il y avait dans ce cas, 128 ou 256 caractères ASCII.
Nous avons utilisé tous les modèles jusqu'à 0 et de 1.
C'est un problème si vous voulez être en mesure de détecter une erreur
parce que si vous utilisez déjà 256 valeurs pour vos personnages,
vous n'avez pas vraiment planifier à l'avance parce que maintenant vous n'avez aucun moyen de dire,
ce n'est pas un caractère légitime, c'est quelque message erroné.
Alors que le monde fait est qu'ils utilisent la valeur prochain plus grand, quelque chose comme un int,
de sorte que vous avez un certain nombre de bits fou, 32, pour 4 milliards de valeurs possibles
de sorte que vous pouvez simplement finir par utiliser essentiellement 257 de leur
1 de ce qui a une signification particulière comme étant une erreur.
>> Donc, nous allons voir comment cela fonctionne.
Dans la ligne 246, j'ai cette grande boucle while qui appelle fgetc,
f fichier signification, de sorte getc, puis stdin.
Il s'avère que ce n'est que le moyen le plus précis de dire lire des données depuis le clavier.
Clavier standard moyen d'entrée, de sortie standard signifie écran,
et l'erreur standard, que nous allons voir dans pset4, signifie que l'écran
mais une partie spéciale de l'écran de sorte qu'il n'est pas confondue avec la production réelle
que vous vouliez imprimer. Mais plus à ce sujet dans l'avenir.
Donc, fgetc signifie simplement lire un caractère sur le clavier et de le stocker où?
Conservez-le dans c.
Et puis vérifier - je suis juste en utilisant des conjonctions booléennes ici -
vérifier qu'il n'est pas égale à - \ n, de sorte que l'utilisateur a la touche Entrée, nous voulons arrêter à ce moment-là,
fin de la boucle - et nous voulons aussi vérifier l'EOF constante spéciale,
qui, si vous savez ou deviner, ce que ça représente? >> [L'élève] Fin du dossier. Fin >> du fichier.
C'est une sorte de non-sens, car si je tape au clavier,
il n'y a vraiment pas de fichier impliqué dans cela,
mais ceci est juste une sorte de terme générique utilisé pour désigner
rien d'autre que vient doigts de l'humain.
EOF - fin du fichier.
Soit dit en passant, si vous avez déjà touché de commande D sur votre clavier, et non pas ce que vous auriez encore -
vous avez touché contrôle C - D Contrôle envoie cette constante spéciale appelée EOF.
Alors maintenant, nous avons juste une allocation dynamique de mémoire.
>> Donc, si (n + 1> Capacité). Maintenant, je vais vous expliquer n.
N est juste combien d'octets sont actuellement dans la mémoire tampon,
la chaîne que vous êtes en train de construire à partir de l'utilisateur.
Si vous avez plus de caractères dans votre tampon que vous avez la capacité de la mémoire tampon,
intuitivement ce que nous devons faire alors est d'allouer plus de capacité.
Donc, je vais survoler une partie du calcul ici et se concentrer uniquement sur cette fonction ici.
Vous savez ce que malloc est ou sont au moins généralement connu.
Essayez de deviner ce que realloc fait. >> [L'élève] Ajoute mémoire.
Ce n'est pas tout à fait l'ajout de mémoire. Il redistribue mémoire comme suit.
S'il ya encore de la place à la fin de la chaîne pour vous donner plus de cette mémoire
que celui qu'il accorde à l'origine toi, alors que tu auras le mémoire supplémentaire.
Ainsi, vous pouvez simplement continuer à mettre des personnages de la corde dos à dos à dos à dos.
Mais si ce n'est pas le cas parce que vous avez attendu trop longtemps
et quelque chose d'aléatoire dans la mémoire s'est flac il
mais il n'y a plus de mémoire ici-bas, ce n'est pas grave.
Realloc va faire tout le levage lourd pour vous,
déplacer la chaîne que vous avez lu dans ce loin d'ici, le mettre là-bas,
et puis vous donner un peu plus de la piste à ce moment-là.
>> Donc, avec un geste de la main, laissez-moi vous dire que ce qui fait GetString
est ça commence avec un petit tampon, peut-être un seul personnage,
et si l'utilisateur tape deux personnages, GetString finit par appeler realloc et dit
un caractère n'était pas suffisant, donnez-moi deux personnages.
Alors si vous lisez à travers la logique de la boucle, il va dire
l'utilisateur a tapé 3 caractères, donnez-moi maintenant pas 2, mais 4 caractères,
donnez-moi 8, alors donnez-moi 16 et 32.
Le fait que je suis doublement de la capacité à chaque fois
signifie que la mémoire tampon ne va pas croître lentement, il va grandir super rapide.
Et quel pourrait être l'avantage?
Pourquoi suis-je doubler la taille de la mémoire tampon
même si l'utilisateur peut simplement besoin d'un caractère supplémentaire à partir du clavier?
[Réponse de l'élève inaudible] >> Qu'est-ce que c'est? >> [L'élève] Vous n'avez pas à le cultiver aussi souvent.
Exactement. Vous n'avez pas à le cultiver aussi souvent.
Et ce n'est qu'un type de couverture vous vos paris ici,
l'idée étant que vous ne voulez pas appeler realloc beaucoup parce qu'elle tend à être lente.
Chaque fois que vous demandez au système d'exploitation pour la mémoire,
comme vous le verrez bientôt dans un ensemble de problèmes futurs, il a tendance à prendre un certain temps.
Réduisant ainsi au maximum ce laps de temps, même si vous perdez un peu d'espace,
tend à être une bonne chose.
>> Mais si nous lisons la dernière partie de GetString ici -
et encore comprendre chaque ligne ici n'est pas si importante aujourd'hui -
remarquerez qu'il appelle finalement à nouveau malloc
et il attribue exactement autant d'octets dont il a besoin pour la chaîne
puis jette loin en appelant gratuitement le tampon trop grande
si elle s'est en effet doublé de trop nombreuses fois.
Donc en bref, c'est comme ça que GetString a travaillé tout ce temps.
Tout ce qu'il fait est de lire un caractère à la fois, encore et encore et encore,
et chaque fois qu'il a besoin de la mémoire supplémentaire, il demande au système d'exploitation pour qu'il
en appelant realloc.
>> Des questions? Très bien.
>> Une attaque.
Maintenant que nous comprenons pointeurs ou du moins sont de plus en plus familiers avec les pointeurs,
nous allons examiner la façon dont le monde entier commence à s'effondrer
si vous n'avez pas tout à fait défendre contre les utilisateurs contradictoire,
les gens qui essaient de s'introduire dans votre système,
personnes qui tentent de voler votre logiciel en contournant un code d'enregistrement
qu'elles pourraient autrement avoir à taper po
>> Jetez un oeil à cet exemple ici, qui est simplement le code C qui a une fonction principale à la base
qui appelle une fonction foo. Et quel est-il de passer à toto?
[L'élève] Un seul argument. >> [Malan] Un seul argument.
Donc, argv [1], ce qui signifie que le premier mot que l'utilisateur a tapé la ligne de commande
après a.out ou quel que soit le programme est appelé.
Donc foo au sommet prend dans un char *. Mais char * est juste quoi? >> [L'élève] Une chaîne de caractères.
[Malan] Une chaîne, il n'y a donc rien de nouveau ici.
Cette chaîne est arbitrairement appelé bar.
Dans cette ligne ici, char c [12]; dans une sorte de semi-technique en anglais, ce qui est de cette ligne fait?
[L'élève] Tableau de - Array >> de? >> [L'élève] Caractères. Caractères >>.
Donnez-moi un tableau de 12 caractères. Alors nous pourrions appeler cela un tampon.
Il est techniquement appelé c, mais un tampon dans la programmation signifie juste un tas d'espace
que vous pouvez mettre quelques trucs po
Puis enfin, memcpy nous n'avons pas utilisé avant, mais vous pouvez probablement le deviner ce qu'il fait.
Il copie la mémoire. Que faut-il faire?
Il semble copie bar, son entrée, au c mais seulement jusqu'à la longueur de la barre.
Mais il ya un bug ici. >> [L'élève] Vous devez le caractère sizeof. Ok >>.
Techniquement, nous devrions vraiment faire strlen (bar) * sizeof (char)). C'est exact.
Mais dans le pire des cas ici, supposons que C'est -
D'accord. Puis, il ya deux bogues.
Donc, sizeof (char));
Nous allons en faire un peu plus large.
Alors maintenant, il ya encore un bug, qui est quoi? >> [Réponse de l'élève inaudible]
Vérifiez pour quoi faire? >> [L'élève] Vérifiez la valeur NULL.
Nous devrions être en général la vérification de la valeur NULL parce que de mauvaises choses arrivent
lorsque le pointeur est NULL, car vous pourriez finir par y aller,
et vous ne devriez jamais aller à NULL par le déréférençant avec l'opérateur étoiles.
Donc, c'est une bonne chose. Et que faisons-nous d'autre? Logiquement, il ya une faille ici aussi.
[L'élève] Vérifiez si argc est> = à 2.
Donc, vérifiez si argc est> = 2. Bon, il ya trois bugs dans ce programme ici.
Nous sommes en train de vérifier si l'utilisateur a effectivement tapé dans quoi que ce soit dans argv [1]. Bon.
Alors, quel est le bug troisième? Ouais. >> [L'élève] C peut ne pas être assez grande.
Bon. Nous avons vérifié un scénario.
Nous implicitement vérifiée ne copiez pas plus de mémoire que dépasse la longueur de la barre.
Donc, si la chaîne saisie par l'utilisateur est de 10 caractères dans le long terme,
cela veut dire que copier 10 caractères. Et ce n'est pas grave.
Mais que faire si l'utilisateur a tapé un mot à l'invite comme un mot de 20 caractères?
Cela revient à dire copie 20 caractères dans la barre en quoi?
C, autrement connu comme notre buffer, ce qui signifie que vous venez d'écrire des données
à 8 emplacements d'octets que vous ne possédez pas,
et vous n'en possédez pas, dans le sens que vous n'avez jamais à leur allocation.
Donc, c'est ce qui est généralement connu comme l'attaque ou attaque de type buffer overflow dépassement de mémoire tampon.
Et c'est une attaque dans le sens que si l'utilisateur ou le programme qui appelle votre fonction
fait cette malice, ce qui se passe réellement prochaine pourrait en fait être tout à fait mauvais.
>> Donc, nous allons jeter un oeil à cette image ici.
Cette image représente votre pile de la mémoire.
Rappelez-vous que chaque fois que vous appelez une fonction que vous obtenez ce petit cadre sur la pile
et puis une autre, puis une autre et une autre.
Et jusqu'à présent, nous avons juste une sorte de résumé de ces sous forme de rectangles
soit sur la carte ou sur l'écran ici.
Mais si l'on zoom sur l'un de ces rectangles, lorsque vous appelez une fonction foo,
il s'avère qu'il ya plus à l'intérieur de ce cadre pile dans ce rectangle
que de x et y et a et b, comme nous n'avons parlé de swap.
Il s'avère qu'il ya certains détails de niveau inférieur, parmi lesquels adresse de retour.
Ainsi, il s'avère quand principale appelle foo, principal doit informer foo
ce qui est l'adresse principale en mémoire de l'ordinateur
parce que sinon, dès que foo est faite d'exécution, comme c'est le cas ici,
une fois que vous atteignez cette accolade fermée bouclés à la fin de foo,
comment diable ne sais pas où foo du contrôle du programme est censé aller?
Il s'avère que la réponse à cette question se trouve dans ce rectangle rouge ici.
Cela représente un pointeur, et c'est à l'ordinateur pour stocker temporairement
sur la dite pile l'adresse de principal de telle sorte que dès que foo est faite d'exécution,
l'ordinateur ne sait où et quelle ligne principale en revenir à.
Cadre pointeur sauvé concerne de même à cela.
Bar * Char ici représente quoi?
Or, ce segment bleu est ici foo cadre. Quel est le bar?
Bar est juste l'argument de la fonction foo.
Alors maintenant, nous sommes de retour au genre de l'image familière.
Il ya plus de choses et plus de distractions à l'écran,
mais ce segment bleu clair est exactement ce que nous avons été en s'appuyant sur le tableau noir
pour quelque chose comme swap. C'est le cadre de foo.
Et la seule chose en ce moment est le bar, qui est ce paramètre.
Mais ce qui doit se tenir dans l'empilement selon ce code ici?
[L'élève] char c [12]. >> [Malan] char c [12].
Nous devrions également voir 12 carrés de mémoire allouée à une variable appelée c,
et en effet ce que nous avons à l'écran.
Le très haut il est c [0], puis l'auteur de ce schéma
ne me dérangeait pas tirer toutes les cases, mais il ya en effet 12, il
parce que si vous regardez en bas à droite, c [11] si l'on compte à partir de 0 est l'octet 12 tel.
Mais voici le problème.
Dans quelle direction est de plus en plus c?
Trier du haut vers le bas si elle commence par le haut et pousse vers le bas.
Il ne ressemble pas à notre départ nous piste bien du tout ici.
Nous avons sorte de nous-mêmes dans une impasse,
et que c [11] est bien en place contre la barre, ce qui est tout contre pointeur de trame enregistrée,
ce qui est tout contre-adresse de retour. Il n'y a pas plus de place.
Alors, quelle est l'implication alors si vous bousiller
et vous essayez de lire 20 octets dans une mémoire tampon de 12 octets?
Où sont ces 8 octets supplémentaires va aller? >> [L'élève] Inside -
A l'intérieur tout le reste, dont une partie est super important.
Et la chose la plus importante, peut-être, est la zone rouge là-bas, adresse de retour,
car supposons que vous accidentellement ou contradictoirement écraser ces 4 octets,
que l'adresse du pointeur, pas seulement avec les ordures mais avec un certain nombre
ce qui se passe pour représenter une adresse réelle en mémoire.
Quelle est la conséquence, en toute logique? >> [L'élève] Fonction va revenir à un endroit différent.
Exactement.
Lors du retour de toto et les coups que l'accolade, le programme va procéder
de ne pas retourner au menu principal, il va revenir à n'importe quelle adresse dans cette case est rouge.
>> Dans le cas de l'enregistrement des logiciels contourner,
si l'adresse qui a été retourné à la fonction qui est normalement appelé
après que vous avez payé pour le logiciel et entré votre code d'enregistrement?
Vous pouvez trier des truc dans l'ordinateur ne va pas ici, mais au lieu de monter ici.
Ou si vous êtes très intelligent, un adversaire peut effectivement taper sur le clavier, par exemple,
pas un mot réel, et non pas 20 caractères, mais supposons que ce qu'il a réellement types de
certains caractères qui représentent le code.
Et ça ne va pas être du code C, il va vraiment être les personnages
qui représentent le code machine binaire, 0 et de 1.
Mais supposons qu'ils sont assez intelligents pour le faire,
en quelque sorte à coller dans le GetString quelque chose de rapide qui est essentiellement le code compilé,
et les 4 derniers octets écraser l'adresse de retour.
Et qu'est-ce que l'entrée d'adresse ne faire?
Il stocke en fait dans ce rectangle rouge de l'adresse du premier octet de la mémoire tampon.
Donc, il faut être très intelligent, et c'est beaucoup d'essais et d'erreurs pour les mauvaises personnes là-bas,
mais si vous pouvez comprendre l'ampleur de ce tampon est
tels que les quelques octets dans l'entrée que vous fournissez au programme
arrive d'être équivalent à l'adresse de début de la mémoire tampon, vous pouvez le faire.
Si nous disons bonjour et normalement \ 0, c'est ce qui se retrouve dans la mémoire tampon.
Mais si nous sommes plus intelligents et nous remplissons ce tampon avec ce que nous appelons génériquement code d'attaque -
AAA, attaque, attaque, attaque - si cela est juste quelque chose qui fait quelque chose de mal,
ce qui se passe si vous êtes vraiment intelligent, vous pouvez le faire.
Dans la boîte rouge ici est une séquence de chiffres - 80, C0, 35, 08.
Notez que le nombre qui correspond à ce que qui se passe ici.
C'est dans l'ordre inverse, mais plus sur cela une autre fois.
Notez que cette adresse de retour a été délibérément modifié
d'égaler l'adresse ici, et non pas l'adresse du principal.
Donc, si le méchant est super intelligent, il ou elle va d'inclure dans ce code d'attaque
quelque chose comme supprimer tous les fichiers de l'utilisateur ou de copier les mots de passe
ou créer un compte d'utilisateur que je puisse ensuite se connecter à - rien du tout.
>> Et c'est à la fois le danger et la puissance de C.
Parce que vous avez accès à la mémoire par l'intermédiaire de pointeurs
et vous pouvez donc écrire ce que vous voulez dans la mémoire d'un ordinateur,
vous pouvez faire un ordinateur de faire ce que vous voulez
simplement en avoir sauter partout au sein de son propre espace mémoire.
Et jusqu'à ce jour tellement de programmes et de sites Web qui sont autant de compromis
se résument à des gens qui profitent de cette.
Et cela peut sembler comme une super attaque sophistiquée, mais il ne commence pas toujours de cette façon.
La réalité est que ce qui est généralement de mauvaises gens faire est,
qu'il s'agisse d'un programme à une ligne de commande ou une application graphique ou un site web,
vous venez de commencer à fournir des bêtises.
Vous tapez un mot vraiment grand dans le champ de recherche et appuyez sur Entrée,
et vous attendre pour voir si le site tombe en panne
ou vous attendez de voir si le programme manifeste un certain message d'erreur
parce que si vous avez de la chance que le méchant et vous fournir certaines entrées fou
qui fait planter le programme, cela signifie que le programmeur ne s'attendait pas à votre mauvais comportement,
ce qui signifie que vous pouvez probablement avec assez d'effort, essai et d'erreur assez,
comprendre comment mener une attaque plus précise.
Donc, comme partie intégrante de la sécurité n'est pas seulement d'éviter ces attaques complètement
mais les détecter et effectivement regarder les journaux
et voir ce que les entrées fous des gens tapés dans votre site,
quels termes de recherche ont tapé les gens dans votre site web
dans l'espoir de déborder une partie du tampon.
Et cela se résume à des bases simples de ce qui est un tableau
et qu'est-ce que cela signifie d'allouer et d'utiliser la mémoire.
>> Liée à celle puis est trop présent.
Disons simplement un coup d'œil à l'intérieur d'un disque dur encore une fois.
Vous souvenez-vous d'une semaine ou deux il ya que lorsque vous faites glisser les fichiers vers votre corbeille ou corbeille,
ce qui se passe? >> [L'élève] Rien. >> Absolument rien, pas vrai?
Finalement, si vous êtes à court d'espace disque,
Windows ou Mac OS commence à supprimer les fichiers pour vous.
Mais si vous faites glisser quelque chose là-dedans, ce n'est pas du tout en sécurité.
Tout votre colocataire ou un ami ou un membre de la famille a à faire est de double-cliquer sur, et voila,
il ya tous les fichiers sommaires que vous avez essayé de supprimer.
La plupart d'entre nous savons au moins que vous avez à faire un clic droit ou Ctrl clic
et videz la corbeille ou quelque chose comme ça.
Mais même alors, cela ne veut pas tout à fait faire l'affaire
parce que ce qui arrive quand vous avez un fichier sur votre disque dur
qui représente un certain document Word ou un JPEG, ce qui représente votre disque dur,
et disons que ce ruban représente ici ce fichier,
et il est composé de tout un tas de 0 et de 1.
Qu'est-ce qui se passe quand vous avez non seulement faire glisser ce fichier à la poubelle ou corbeille
mais aussi le vider? Trier de rien.
Ce n'est pas rien maintenant.
Maintenant, c'est juste parce que rien ne se passe un petit quelque chose dans la forme de ce tableau.
Il ya donc une sorte de base de données ou d'une table à l'intérieur de la mémoire d'un ordinateur
qui a essentiellement une colonne pour les noms des fichiers et une colonne pour les fichiers 'emplacement,
où cela pourrait être l'emplacement 123, juste un nombre aléatoire.
Donc, nous pourrions avoir quelque chose comme x.jpeg et l'emplacement 123.
Qu'advient-il alors lorsque vous avez réellement vider votre corbeille?
Qui s'en va.
Mais ce qui ne va pas loin est le 0 et de 1.
>> Alors, quelle est alors la connexion à pset4?
Eh bien, avec pset4, juste parce que nous avons accidentellement effacé de la carte compact flash
qui avait toutes ces photos ou tout simplement parce que la malchance est devenu corrompu
ne signifie pas que des 0 et des 1 ne sont pas encore là.
Peut-être quelques-uns d'entre eux sont perdus parce que quelque chose a été corrompu
en ce sens que certains 0s et 1s 1s devient devient 0.
De mauvaises choses peuvent arriver à cause de logiciels défectueux ou matériel défectueux.
Mais beaucoup de ces bits, peut-être même 100% d'entre eux, sont toujours là.
C'est juste que l'ordinateur ou l'appareil photo ne savez pas où commencer JPEG1
et où JPEG2 commencé.
Mais si vous, le programmeur, le savoir avec un peu de savvy où les fichiers JPEG sont
ou à quoi ils ressemblent afin que vous puissiez analyser le 0 et de 1 et de dire JPEG, JPEG,
vous pouvez écrire un programme avec essentiellement juste une boucle for ou while
qui recouvre chacun de ces fichiers.
Donc, la leçon est donc de commencer en toute sécurité d'effacer vos fichiers
si vous voulez éviter ce tout à fait. Oui.
>> [L'élève] Comment se fait-il dit sur votre ordinateur
que vous avez plus de mémoire que vous avez fait avant?
Ont plus de mémoire que vous avez fait avant - >> [l'élève] Plus de mémoire disponible.
Oh. Bonne question.
Alors pourquoi après avoir vidé la corbeille de votre ordinateur ne vous dis
que vous avez plus d'espace libre que vous avez fait avant?
En un mot, parce qu'il a menti.
Plus techniquement, vous n'avez plus d'espace parce que maintenant vous avez dit
vous pouvez mettre d'autres choses où ce fichier a déjà été.
Mais cela ne veut pas dire que les bits s'en vont,
et cela ne signifie pas les bits sont modifiés pour tous les 0, par exemple,
pour votre protection.
Ainsi, en revanche, si vous effacer en toute sécurité des fichiers ou de détruire physiquement l'appareil,
c'est vraiment la seule façon parfois autour de cela.
>> Alors pourquoi ne pas nous laisser sur cette note semi-effrayant, et nous vous verrai lundi.
[Applaudissements]
>> [CS50.TV]