>> JASON HIRSCHHORN: Bienvenue A5, tout le monde.
Nous avons une semaine excitante devant nous, principalement parce qu'il ya tellement de nouveau
visages dans cette salle.
C'est merveilleux.
Beaucoup d'entre vous sont ici par accident, ce qui est encore mieux.
Donc, j'espère que vous allez continuer à vous joindre à nous.
>> Cette semaine, nous allons passer l'essentiel de l'article
préparation pour le quiz.
Donc, par l'ordre du jour, nous allons parler un peu de ressources pour la classe,
mais aussi pour le quiz, puis, de nouveau, passer l'essentiel de parler de classe
sur des questions.
Une fois que nous aurons fini de répondre à votre questions, ou si vos questions
naturellement nous conduire à une certaine codage, je avoir des problèmes d'échantillonnage de mi-session
passé que nous allons coder en direct dans la section ainsi que mettre également en place une autre
bons sujets à couvrir.
>> Alors d'abord, comme nous l'avons vécu pour le deux dernières semaines pour vous rappeler
les gars, il ya une tonne de ressources disponible pour ce cours.
Beaucoup d'entre eux seront très utiles de vous que vous continuez à
étudier pour quizz 0, car c'est mardi après-midi.
Donc, vous avez tous été étudier un peu.
>> Il ya des notes de cours et la source Code que vous devriez
absolument vérifier.
Regardez les shorts.
Découvrez study.cs50.net.
Et puis, énumérés ci-dessous, un certain nombre d'autres ressources.
>> Encore une fois, quizz 0, c'est demain à 01 heures.
Si vous ne l'avez pas déjà fait, vérifiez le propos de Quiz 0 document sur la
la page d'accueil de cours pour comprendre où vous prenez le quiz.
Le quiz commence à 01h10 et se termine 70 minutes plus tard.
Donc, si vous vous présentez après 01h10, vous êtes allez obtenir que beaucoup moins de minutes
de 70 à prendre le quiz.
Donc, assurez-vous que vous êtes à l'heure.
Si vous êtes un étudiant ou d'extension ont d'autres considérations d'essai, il
pourrait ne pas être à 01 heures demain.
Mais encore une fois, vérifier le propos Quiz 0 documenter pour s'assurer que vous savez quand
vous prenez le quiz.
J'ai écrit 75 minutes ici.
Je pense que c'est bon, pas 70.
>> Il couvre tout le matériel d'une semaine 0 à la conférence de la semaine dernière, le mercredi.
Et encore une fois, pour ce quiz, par qui document, vous obtenez un recto-verso et 8
1/2 par 11 feuille de papier que vous obtenez à utiliser comme des notes pendant le test.
Beaucoup de gens, si pas la plupart des gens, ont constaté que la façon la plus utile
à étudier pour le quiz est à faire une feuille d'étude, une
un sider, de leur propre chef.
Alors regardez les dernières si vous avez vu les dernières.
Tendez la main à des amis pour voir ce qu'ils mettent sur le leur.
>> Mais les mains vers le bas, la meilleure façon possible étude est de passer par tout et
rogner vers le bas à ce qui devrait ou ne devrait pas appartenir à cette feuille de
papier, parce que c'est juste une très moyen utile pour vous assurer
vous allez à travers tout et avoir une certaine familiarité avec elle.
La plupart des gens, nous trouver, même si elles ont la feuille de papier assis juste
à côté d'eux sur le questionnaire, ne mettez pas pour elle, parce que, encore une fois, que très
processus de passer par l'information les a aidés à apprendre.
>> Quelqu'un at-il des questions Quiz 0?
A tout le monde -
Je ne vais pas faire un spectacle de mains.
Ce n'est rien.
J'allais demander qui commencé à étudier.
Mais je ne veux pas vous faire tout pas lever la main.
Donc, comme je l'ai dit - oui, Avi, aller de l'avant.
>> AVI: Quelle serait une chose utile à mettre sur le document d'une page?
>> ETUDIANT: C'est à vous.
>> JASON HIRSCHHORN: Vous obtenez d'utiliser votre jugement.
Choses utiles à mettre sur le document d'une page, Si vous êtes confus au sujet du grand O
l'exécution de différents types de recherches et sortes, mis que là-bas dans un
pratique graphique dandy.
De cette façon, si vous êtes invité que sur la quiz, vous n'avez pas besoin d'essayer de comprendre
it out ou la raison par le runtime.
Vous pouvez simplement copier vers le bas.
Si vous regardez quiz passé, beaucoup de fois, il est en cours d'exécution des questions de temps.
Donc, ce serait un exemple de bonne chose à mettre sur votre document d'une page.
>> D'autres bonnes choses à mettre sur, si vous êtes confus sur la façon de déclarer un
fonction ou ce que les différentes parties de la déclaration de fonction sont, écrire
que là-bas, une version générique et alors peut-être un exemple.
Si vous êtes confus au sujet de pointeurs, un schéma de la façon dont les pointeurs travail est
probablement très utile.
Si vous êtes confus au sujet de la récursivité, un goûter fonction récursive sur il
pourrait également s'avérer très utile.
Est-ce que vous donner quelques idées?
>> AVI: Vous devez comprendre la processus de compilation entière, comme
comment tout cela fonctionne?
>> JASON HIRSCHHORN: Tout qui a été couverte pourrait
apparaître sur le questionnaire.
Questions -
mais encore une fois, certaines choses seront peser lourdement que d'autres.
Certaines choses se sont à nouveau et de nouveau dans la classe, dans
conférence, et de l'article.
D'autres choses n'ont pas venir souvent.
>> Nous avons beaucoup parlé de # include et -L quelque chose et ce que cela signifie dans les
le processus de compilation.
Nous avons beaucoup parlé de GDB, accrochez vous, ces différents drapeaux que nous utilisons quand
nous compilons quelque chose, et ce make15, par exemple, vraiment
moyens et vraiment fait.
Nous n'avons pas parler autant sur chaque étape dans
le processus de compilation.
Nous avons toujours parlé.
Donc, c'est toujours quelque chose que vous devrait être familier.
Mais encore une fois, nous n'allons pas être -
choses qui viennent le plus souvent en classe sont plus susceptibles de trouver plus
souvent et plus fortement pondéré sur le questionnaire.
>> Cool.
Toutes les autres questions du quiz 0?
>> OK, alors j'ai mis une liste de sujets sur la carte.
Je suis passé par le programme.
Je suis passé par la section d'examen de la nuit dernière et les diapositives à venir
une liste non exhaustive des sujets que nous avons couvert jusqu'ici dans CS50
et les choses qui pourraient apparaître sur le questionnaire.
Donc, je ne vais pas passer par chacun de ces éléments.
Cela prendra beaucoup plus de temps que nous avons maintenant.
Mais je mets cette place ici dans l'espoir jogging votre mémoire à des choses qui peut
ou peut-être pas aussi familier avec vous.
>> Et je serais ravi de passer la majeure partie de section répondre à vos questions sur
ces sujets, les sujets qui ne sont pas couverts ici.
Nous pouvons écrire du code pseudo.
Nous pouvons écrire le code réel pour s'assurer que vous -
Je ne peux répondre à votre question et aider tout le monde comprend fondamentalement une
beaucoup de ces sujets afin que vous vous sentirez prêt et confortable entrer dans
le quiz demain.
Alors, lisez sur la liste.
Vous êtes venus nous espérons à l'article avec quelques questions.
Lorsque vous êtes prêt, levez la main et nous allons commencer.
>> Gardez à l'esprit, les questions que vous avez, il n'y a pas de questions stupides.
Nous avons entendu dire que beaucoup de choses.
Et les questions que vous avez, je suis prêt à parier, beaucoup d'autres personnes à la fois
assis ici et regarder en ligne ont ainsi.
Donc, vous ne pouvez aider les gens en posant des questions.
Marcus.
>> MARCUS: entre la pile et l' tas, est-il une pré-alloué
pourcentage de mémoire qui est défini comme ceci est pour l'empilage ou pour le tas?
Ou comment ça marche exactement?
>> JASON HIRSCHHORN: Grande question.
Je vais soutenir la trace un peu.
Est-ce que tout le monde -
s'il vous plaît soyez honnête.
Je sais que je vous demande d'augmenter votre main devant vos pairs.
Mais y at-il des gens qui se sentent à l'aise avec la pile et le tas
et voudrait aller plus que et ce que ceux qui veut dire?
Levez la main si -
OK.
Merci.
Donc, nous allons aller sur la pile et le tas très rapidement puis
passer à répondre à votre question.
>> Donc, si nous tirons une boîte à représenter mémoire sur votre ordinateur, quels sont
choses qui vont dans cette boîte?
Main.
Une fonction principale.
Où va principal?
>> ETUDIANT: [inaudible].
>> JASON HIRSCHHORN: Donc, nous allons mettre principal ici.
Que va dans cette boîte?
>> ÉTUDIANTS: Les fonctions que vous appelez.
>> JASON Hirschhorn: Les fonctions que nous appelons.
Et où vont-ils?
>> ETUDIANT: Dans la pile.
>> JASON HIRSCHHORN: Ils passer dans la pile.
Nous allons donc appeler cette chose ici-bas de la pile.
Et là-haut, nous avons le tas.
Donc, la mémoire n'est pas une boîte comme ça.
Mais il est en fait assez similaire.
Il va y avoir beaucoup de boîtes sur et plus, en fonction de la taille de votre
ordinateur est ou la taille de votre mémoire est.
>> Au guillemets, "bas" est l'empilement.
Et il ya plusieurs choses qui vont sur la pile.
Et elles dépendent les fonctions vous avez dans votre code.
Vous avez toujours une fonction dans votre Code appelée principale, donc il ya toujours une
section ici dans le empiler consacré à principal.
>> Ces sections de la pile sont appelés cadres de pile.
Lorsque vous appelez une autre fonction, dire principale appelle une fonction de recherche binaire,
nous avons mis un autre cadre sur la pile.
Plus précisément, nous allons don d'une partie de la mémoire de notre
ordinateur pour stocker recherche binaire section locale variables et d'exécuter le binaire
Code de recherche.
>> Nous appelons donc la recherche binaire.
Dans ce morceau de mémoire, nous allons pour stocker ses variables locales.
Nous allons stocker ses appels printf.
Quoi qu'il arrive, cette fonction est va être stockée là.
Recherche binaire va exécuter.
Il va terminer l'exécution.
Quel est le mot en C qui signifie qu'une fonction doit
compléter son exécution?
>> ETUDIANT: Retour.
>> JASON HIRSCHHORN: Retour.
Donc, chaque fois que vous voyez une déclaration de retour, les extrémités de fonction
quand il frappe ça.
Recherche pour binaire va frapper son retour.
Cette partie de la mémoire sera essentiellement être libéré.
Et principal reviendra à exécution.
Alors principal aura une pause où était, appel recherche binaire, obtenir une valeur de retour,
et poursuivre l'exécution.
Ce cadre de pile va disparaître.
>> Si nous appelons une fonction récursive, qui est une fonction qui s'appelle elle-même sur
et plus, nous pourrions avoir - nous disons fait une recherche binaire récursive.
Nous pourrions obtenir binaire version recherche sur un, recherche binaire deux, recherche binaire
trois, quatre recherche binaire, recherche binaire cinq.
Et puis ce dernier recherche binaire cinq a frappé le cas de base, et la pile
Les cadres vont revenir et garder la clôture jusqu'à ce que nous revenions à principal.
Nous pouvons aller plus récursion dans un peu.
Mais tout cela est-à-dire, si vous êtes appeler plusieurs fonctions à la fois,
il y aura pile multiple frames de la pile.
>> Le segment de mémoire, d'autre part, vers le haut ici, n'est pas pour les fonctions,
pas pour les variables locales.
C'est pour allouée dynamiquement variables.
Donc, ce sont des variables qui peuvent être initialisé en soit principale ou une
fonctionner que principaux appels.
N'importe où dans votre code, ils peut être initialisé.
Et pour initialiser une dynamique variable allouée.
Quelle est la fonction en C utilisons-nous?
>> ETUDIANT: Malloc.
>> JASON HIRSCHHORN: Malloc.
Vous appelez malloc.
Vous obtenez un espace de mémoire.
Et que l'espace de la mémoire est sur le tas.
Et que l'espace de la mémoire reste jusqu'à ce que vous appelez gratuitement.
>> Variables pour alloués dynamiquement en tas existera aussi longtemps que vous
voulons qu'ils existent, et ils ne seront pas aller jusqu'à ce que vous explicitement
leur dire de s'en aller.
Vous pouvez les créer dans une fonction.
La pile de cette fonction cadre va disparaître.
Mais cette variable existe toujours dans le segment de mémoire jusqu'à ce qu'il soit libéré,
potentiellement par la fonction qui a appelé recherche binaire ou autre.
>> Donc, ces variables tas y rester aussi longtemps que vous le souhaitez
qu'ils y restent.
Et ils se mettent ici.
Et puis la prochaine se mettre là.
Ils gardent de se remplir, et ils y rester jusqu'à ce que vous appelez gratuitement.
>> Et l'essentiel, le tas et la pile, obtenir à la question de Marcus,
pousser l'un vers l'autre.
Et si ils courent dans l'autre, vous avez utilisé toute la mémoire de votre
ordinateur, et votre programme quitteront parce que vous n'avez pas plus de mémoire
de gauche à utiliser.
Entre eux, il existe potentiellement d'autres choses.
Mais pour le cadre de ce cours, vous n'ont pas besoin de s'inquiéter à ce sujet.
>> C'était donc la réponse à votre question.
Ne vous en faites pas.
Mais c'était la longue réponse.
Tout ce que vous devez savoir, c'est la tas et la pile sera -
on commence par le bas.
La pile ne.
Le tas est là-haut.
Ils vont se rapprocher de l'autre.
>> Et si elles se touchent, c'est un problème.
Vous avez manqué de mémoire.
Mais également, en plus de savoir où ils sont, ce qui est stocké à la fois dans la
pile et le tas.
Curtis.
>> CURTIS: Quand ils entrent en collision, est que un débordement de pile?
>> JASON HIRSCHHORN: Quand ils entrent en collision, ce n'est pas un débordement de pile.
Un débordement de pile est une zone différente que nous pouvons aller plus si vous voulez.
OK, nous allons revenir à ce que dans un peu.
>> ETUDIANT: Quel est le mot appelé quand ils ont frappé l'autre, la
pile et le tas?
>> JASON HIRSCHHORN: Pour l'instant, ne vous inquiétez pas.
Il suffit de savoir -
Je vais répondre à cette question après la classe.
Si tout se passe dans l'autre, vous avez manqué de mémoire, car il n'y a pas plus
espace là.
>> ETUDIANT: Désolé, ce qui est un défaut de segmentation?
>> JASON HIRSCHHORN: Un segment défaut peut être appelé à -
cela dépend pourquoi appelé de la faute de segmentation.
Parfois, votre débordement de pile, ça va dire segment redire que l'erreur.
>> ETUDIANT: Qu'en est-il de déréférencement une variable nulle?
Est-ce une erreur de segmentation?
>> JASON HIRSCHHORN: déréférencement un pointeur null -
OK, donc si vous avez un pointeur que vous égal à null, pointeurs, rappel,
adresses de la mémoire de stockage que leurs valeurs.
Et un pointeur NULL est essentiellement stocker 0, le 0-ième
répondre à cette variable.
Donc 0x, 0, 0, 0, 0, et ainsi de suite.
Que 0-ème adresse en mémoire qui n'est pas dans notre image, c'est là-haut
quelque part, qui est réservée pour l'ordinateur.
Nous n'avons pas le droit d'y toucher.
>> Ainsi, lorsque votre programme est l'exécution, si quelque chose essaie d'aller à la mémoire
l'adresse 0, on sait que c'est une valeur vide.
Il ne sait rien devrait être là.
Donc, si vous essayez d'utiliser quelque chose et de traiter quelque chose comme il ou
essayer d'aller à cet endroit, vous êtes allez obtenir une erreur de segmentation ou une erreur.
Est-ce que cela répond à votre question?
>> Et maintenant, nous allons revenir à Stack Overflow.
Choses dans la pile, comme vous les gars ont vu avant, en - tirons un proche
en place d'un cadre de pile.
Tout le monde peut voir que?
Donc, nous avons notre cadre de pile.
Nous économisons un tableau en tant que locale variable dans cette fonction.
Donc, dire que notre réseau dispose de cinq points.
Les cinq personnes seront stockées dans ce laps de pile.
>> Si nous commençons à écrire au-delà de la limites de ce tableau -
si nous commençons à écrire dans, disons que c'est 0.
Ce sont les cinq indices de notre réseau.
Si nous commençons à écrire dans l'index 5, qui nous n'avons pas quand nous avons une
tableau de taille 5, nous commençons à écrire dans index 6, 7, 8, 9, nous pouvons obtenir une pile
Erreur de débordement.
>> En général, il n'est pas -
vous aurez probablement des ennuis si vous dépassez par un.
Mais en général, vous obtiendrez dans le plus de problèmes si vous dépassez par un grand nombre
et vous allez jusqu'à plus que vous écrivez sur l'adresse de ce retour
fonction, qui est situé à l' bas de la trame de pile.
>> Parce que, à droite?
Vous - en - désolé.
Pas "parce que le droit."
>> Dans le cadre de pile, vous avez vos variables locales.
Tout en bas de la pile cadre est l'adresse de retour.
C'est là que la fonction va quand c'est fini.
Et si vous le remplacez que le retour adresse, puis quand ce frame de pile,
quand vous allez à travers la pile cadrer et de l'exécution de chaque ligne, vous êtes
passer à votre nouvelle adresse de retour que c'est écrit à la place de la
réel sur un.
Et c'est ainsi que nous avons vu certaines failles de sécurité
peut se produire avec les ordinateurs.
>> Débordement Donc pile, en bref, est quand vous remplacez la pièce de la pile
vous êtes censé utiliser, local variable que vous êtes censé utiliser, et
en particulier lorsque vous commencez à écraser choses importantes comme la
l'adresse de retour.
Et c'est là que vous obtiendrez une erreur.
Ou peut-être même vous pourriez commencer même écrit dans -
dire la recherche binaire était juste au-dessus principale.
Si vous avez écrasé un lot, vous pouvait écrire en principal.
Mais en général, vous obtenez une erreur avant puis, parce que l'ordinateur sait
vous faites quelque chose que vous ne doit pas faire.
Ouais.
>> ETUDIANT: Quelle est la différence entre un débordement de pile
et un débordement de tampon?
>> JASON HIRSCHHORN: débordement de tampon est un type plus générique de
ce que je viens de décrire.
>> ETUDIANT: un débordement de pile est donc un exemple d'un dépassement de mémoire tampon.
>> JASON HIRSCHHORN: Exactement.
C'est un tableau que nous pouvons considérer comme une tampon, un espace pour que les choses aillent po
Il s'agit d'un débordement de mémoire tampon.
Nous pourrions avoir un débordement de la mémoire tampon.
S'il y avait une mémoire tampon, qui y souvent est un tableau le tas, et nous
écrasait ces limites, alors nous serions un débordement de la mémoire tampon.
>> Et au-delà de la portée de ce cours, ils ont détecté un peu différemment.
Le compilateur a spécial des moyens de détection de chacune d'elles.
Mais un débordement de tampon est un plus générique type de ce que j'ai décrit,
qui était un débordement de mémoire tampon.
Ai-je répondu à votre question?
Sweet.
>> Y avait-il d'autres questions connexes à la pile ou le tas?
Ouais.
>> Étudiant: Je sais que vous avez à cordes libres parce qu'ils sont dans le tas
et vous ne voulez pas perdre la mémoire.
Mais avez-vous de libérer les variables globales et des choses comme ça?
Ou sont-ils libérés automatiquement?
>> JASON HIRSCHHORN: Bonne question.
Ainsi, dans CS50.H, nous créons cette chose pour que vous avez appelé une chaîne.
Une chaîne est vraiment ce que?
>> ETUDIANT: Char étoiles.
>> JASON HIRSCHHORN: Une étoile de char, un pointeur à un caractère, un pointeur vers
un tableau de caractères.
C'est ce que la chaîne est.
Donc, nous devons libérer, parce que GetString, qui nous avons beaucoup utilisé -
nom de la chaîne est égale à GetString -
que mallocs pour nous un peu de mémoire sur la tas, puis renvoie un pointeur sur le
le premier caractère de cette chaîne, une étoile char.
>> Donc, apparemment, si vous n'avez pas été écriture libre sur vos chaînes
que vous avez appelé jusqu'ici, vous avez été une fuite de la mémoire.
Bien sûr, nous n'avons pas parlé , donc personne est obtenu en
la difficulté pour le faire.
Mais à l'avenir, oui.
Lorsque vous appelez GetString, vous êtes allouer de l'espace sur le tas.
Et si vous n'appelez pas libre plus tard que chaîne, vous avez une fuite de mémoire.
Cela répond à votre question?
>> Oui
>> Étudiant: Donc, pour ce faire, utilisons-nous libre juste avant le retour?
Comme, dans le cadre de, je suppose que si nous disons, comme, int principale, dans le
portée du code qui est dans les accolades, juste avant -
vous savez où vous feriez généralement mis retour.
Mettez-vous gratuitement avant?
>> JASON HIRSCHHORN: Donc, vous pouvez mettre gratuitement partout où vous voulez mettre gratuitement.
Parce que ce sont alloués dynamiquement des variables, car ils peuvent
vivre au-delà de la portée d'un particulier fonction, si vous appelez malloc dans un
fonction distincte, par exemple, GetString, vous pouvez appeler gratuitement en principal.
Vous n'avez pas besoin de l'appeler dans la fonction spécifique
où malloc est appelé.
Mais vous n'avez pas besoin de l'appeler avant principal revient.
>> Et cela dépend vraiment.
Cela dépend de la raison pour laquelle vous malloced que espace en premier lieu.
Certaines personnes vont appeler libérer assez rapidement.
Certaines personnes ne seront pas appeler gratuitement jusqu'à la fin de leur programme.
Et ils passent par et tout est gratuit.
Cela dépend de la raison pour laquelle vous avez appelé malloc.
>> Étudiant: Et que diriez-vous si vous appeliez utilisation GetString?
Vous diriez sans quoi?
>> JASON HIRSCHHORN: Donc, la syntaxe gratuitement est tout simplement libre, parenthèse ouverte, à proximité
paren, et le nom du pointeur.
Donc, si vous écrivez le nom cordes égaux GetString, vous mettez le nom ici.
C'est le nom du pointeur.
Et il sait de libérer la mémoire.
>> Étudiant: Alors, quand il libère cette mémoire, le pointeur pointe toujours à cet endroit
dans la mémoire?
Ou est le pointeur aussi vidé de l'adresse qu'il pointe vers.
>> JASON HIRSCHHORN: Nous devrions essayer.
Nous devrions code.
Revenons quand nous arrivons à codage, et nous allons code.
Et si vous voulez trouver la réponse pour cela, vous pouvez également le code qui
dans l'intervalle.
Mais c'est une grande question.
>> ETUDIANT: Est-il possible de quelque chose de gratuit trop tôt?
Donc, vous avez encore besoin pour votre programme, et vous avez libéré cet espace mémoire?
>> JASON HIRSCHHORN: Oui.
Il est possible, si vous quelque chose de gratuit puis vous utilisez à nouveau, vous allez
courir dans une erreur.
Mais c'est sur vous, parce que vous avez libéré quelque chose et puis a appelé plus tard.
C'était donc l'erreur d'un programmeur.
Mais oui.
Vous pouvez écrire cela.
>> D'autres questions sur -
Oui.
>> Étudiant: Donc, si vous êtes censé juste libérer en général avant l'
programme se termine, ce que cela signifie si l' programme se termine et vous n'avez pas la libérer,
que la mémoire est encore alloué?
>> JASON HIRSCHHORN: Si votre programme se termine et vous oubliez de libérer quelque chose, alors
que la mémoire a été répartie dans la durée de vie de votre programme.
Lorsque votre programme se ferme complètement, que la mémoire ne va pas
y rester pour toujours.
L'ordinateur est assez intelligent pour savoir que, lorsque le programme se ferme, il
devrait se débarrasser de toute la mémoire que a été associée à ce programme.
>> Cependant, il existe des outils que vous pouvez exécuter sur un programme pour détecter si, lorsque le
programme terminé, vous avez oublié pour libérer de la mémoire.
Et pour votre prochain problème posé où vous allez utiliser malloc et l'utilisation
pointeurs, vous exécuter ce programmer sur votre programme pour voir si,
où les principaux retours, vous aviez quelque les choses qui ont été laissés unfreed.
>> Donc, ils ne vont pas rester malloced toujours dans votre ordinateur.
Ce serait inutile, car très vite, les ordinateurs
serait à court de mémoire.
Mais si ils courent jusqu'à la fin de votre programmer et ils ne sont pas libérés et votre
programme se termine, c'est toujours un problème que cet outil vous aidera à répondre.
>> ETUDIANT: Est-ce que Valgrind?
>> JASON HIRSCHHORN: C'est appelé Valgrind.
Et vous serez -
>> Étudiant: Mais nous n'avons pas à connaître que pour le quiz, si?
Je veux dire, on en a parlé un peu en cours.
>> JASON HIRSCHHORN: Donc Valgrind est le nom de cet outil.
Sachant ce qu'il fait est assez pour le quiz.
Mais vous n'avez pas encore utilisé votre problème posé parce que nous n'avons pas eu un
ensemble de problème qui a explicitement traitées avec malloc ou vous avec malloc.
Donc, vous n'avez pas encore utilisé Valgrind.
Mais vous allez l'utiliser plus tôt plutôt que plus tard.
>> ETUDIANT: Pouvez-vous répéter ce Valgrind est?
>> JASON HIRSCHHORN: Désolé?
>> ETUDIANT: Pouvez-vous répéter ce que le but de Valgring est?
>> JASON HIRSCHHORN: Valgrind est le nom -
comme GDB vous aide à déboguer votre programme, Valgrind vous aide à déterminer si
les choses n'ont pas été libérés lorsque votre programme se ferme.
Donc, vous allez rencontrer sur votre programme.
Et votre programme se termine, et il dira votre programme appelé malloc ce nombre
fois pour ce nombre d'octets, et vous seulement appelés gratuit à de nombreuses reprises.
Et si vous avez quitté ces nombreux octets sans être libéré.
Ou il va dire que vous avez tout libéré.
Bon travail.
>> ETUDIANT: OK.
Et ça s'appelle Valgring?
>> Jason HIRSCHHORN: V-A-L-G-R-I-N-D.
>> ETUDIANT: Une question sur les pointeurs.
Donc, dire que vous avez n étoile x est égal à quelque chose.
Cela équivaut, tout ce que vous mettez là, c'est que ce qui a été mis à l'intérieur
ce x pointe vers, ou le pointeur de x?
>> JASON HIRSCHHORN: Pouvez-vous répéter la question?
Pouvons-nous tirer pendant que vous le dites?
>> ETUDIANT: Dans le questionnaire, en fait, le celui que vous nous avez envoyé, c'était comme, char
vérité étoiles est égal roches CS50, non?
Donc, cela veut dire que ce que les roches CS50 est ce que la vérité est orientée vers?
>> JASON HIRSCHHORN: Donc vous parlez sur une étoile de caractère dans une chaîne, comment
cela fonctionne?
Ouais.
OK.
Tirons ceci ici.
>> [SIDE CONVERSATION]
>> JASON HIRSCHHORN: Donc, cette variable va être de type char étoiles.
Quelle est la taille d'une variable de type char étoiles?
Combien d'octets?
>> ÉTUDIANTS: Quatre.
>> JASON HIRSCHHORN: C'est quatre octets.
Combien l'homme est une variable de type int étoiles?
>> ÉTUDIANTS: Quatre.
>> JASON HIRSCHHORN: Quatre octets.
Si c'est un pointeur, il est toujours quatre octets, parce que les pointeurs, leur
valeur est une adresse mémoire.
Et adresses de mémoire sur la CS50 appareil sont quatre octets de long.
Ainsi, lorsque nous appelons GetString, ou lorsque nous par exemple, Nomchaîne égale, puis en
guillemets mis une chaîne, nous mettons -
eh bien, c'est un peu différent.
Nous ne GETSTRING comme exemple.
Ou quelque chose de char étoiles est égale à la chaîne.
Désolé, donnez-moi l'exemple que vous avez lu?
>> ÉTUDIANT: char vérité étoiles est égal "roches CS50" entre guillemets.
>> JASON HIRSCHHORN: Donc, cette étoile, ce nous appelons cette variable x pour notre
fins génériques.
Nous avons créé une variable appelée x.
C'est type char étoiles.
Il s'agit d'un pointeur vers une série de caractères.
Donc ici -
>> Donc, c'est comment ce serait travailler dans la mémoire.
Cela stocker une adresse mémoire.
Il serait stocker l'adresse de la mémoire de le premier caractère dans la matrice.
Et puis, quand vous avez suivi le pointeur, vous le feriez
obtenir le premier caractère.
>> Et si vous lisez cette chose comme une chaîne, votre ordinateur est intelligent
assez pour savoir, lisez tout cela jusqu'à ce qu'il arrive à un jeu 0.
Mais si vous lisez un caractère à un temps, afin que vous nous parcourons
cette chaîne, alors vous venez de lire un caractère à la fois jusqu'à ce que vous arrivez à
barre oblique inverse 0.
Cela pourrait ne pas répondre à votre question, cependant.
>> ÉTUDIANT: Oui, mais vous n'avez pas malloced que l'espace
encore pour que pointeur.
>> JASON HIRSCHHORN: Je ne suis pas sûr exactement ce que vous cherchez à,
parce que je n'ai pas fait que quiz.
Cela devait être un utile ressources d'un autre TF.
Si vous créez une chaîne sur la empiler ou comme une variable locale, ça va
juste être ensemble de charges plutôt que généralement une étoile char montrant
une autre chaîne.
Mais je ne sais pas.
Cela pourrait être un pointeur vers un autre chaîne sur la pile ainsi.
Ouais.
>> Étudiant: Je sais que vous devez allouer de la mémoire si le pointeur est
se déclare à l'intérieur d'une autre fonction.
Avez-vous besoin de faire la même chose si c'est être déclarée à l'intérieur de principal,
vous l'utilisez à l'intérieur de principal?
>> JASON HIRSCHHORN: Alors oui.
Vous pouvez déclarer un pointeur vers une adresse de mémoire dans la mémoire.
Il peut s'agir de l'adresse de la mémoire d'une locale variables, bien souvent,
les gens ne déclarent pas les adresses de mémoire aux variables locales, car ils vont
loin une fois que la fonction retourne, qui C'est pourquoi nous malloc généralement des choses.
Mais oui, vous pouvez déclarer un pointeur à une autre variable locale.
C'est juste généralement pas fait.
Mais je peux jeter un oeil à ce que chose de spécifique après la classe.
Ouais.
>> Étudiant: Je pense que c'est une sorte de ce qui est demandé.
Il semble étrange à l'initialisation un pointeur non pas comme un
adresse, mais comme ce semble être une valeur.
Il semble que le CS50 est ce qui est à l'intérieur la chose qui est fait pour et
pas l'adresse réelle, non?
>> JASON HIRSCHHORN: C'est pas le cas, cependant.
Ce n'est pas ce qui se passe.
Lorsque vous déclarez une étoile de char, c'est une adresse mémoire.
Les pointeurs sont toutes les adresses de la mémoire pointant vers quelque chose d'autre.
Que quelque chose pourrait être sur le pile, mais il est presque toujours sur la
entasser dans la façon dont nous allons le voir utilisé.
Mais Nomchaîne égale guillemet "GETSTRING," nous pouvons voir que nous
peut voir à travers cela et que coder.
chaîne GETSTRING n'est pas enregistré dans cette variable, ou quelle que soit la chaîne
nom n'est pas enregistré dans ce variables, car ce n'est pas la façon dont
pointeurs fonctionnent.
Cela fait-il sens?
>> ÉTUDIANT: Oui.
>> JASON HIRSCHHORN: OK.
Heureusement, ce n'était pas source de confusion pour tout le monde.
Mais si c'était, nous pouvons regarder à nouveau un peu, parce que nous allons en fait
de coder quelque chose qui, nous l'espérons travaillez avec des cordes et aider à vous sentir
plus à l'aise avec eux.
>> Toutes les autres questions liées à ces sujets ou d'autres sujets qui
Je remets en place?
Et -
en ce moment.
Oui, Alden.
>> ALDEN: Donc, c'est complètement différent, mais pouvons-nous aller un peu plus
très rapidement ce que nous devons savoir sur la différence entre un 32 et
Ordinateur 64 bits?
>> JASON HIRSCHHORN: Oui.
Donc 32 bits est le nombre d'octets?
>> ALDEN: C'est quatre octets.
>> JASON HIRSCHHORN: C'est quatre octets.
Et 64 bits est le nombre d'octets?
>> ETUDIANT: Huit.
>> JASON HIRSCHHORN: Huit octets.
Encore une fois, huit bits est un octet.
Votre appareil est CS50 une machine de 32 bits.
Ainsi, les adresses de mémoire sont quatre octets de long.
Il ya 2 au 32 des adresses de mémoire.
0 à 2 pour le 32 moins 1.
Et je ne suis pas positif, mais c'est probablement la portée de ce que vous devez
savoir pour une machine 32 bits, la mémoire les adresses sont, de plus, quatre octets de long,
et c'est le montant maximum d'adresses de mémoire.
>> En outre, les types de données -
ce pourrait être quelque chose comme bien qu'il vaut la peine de noter.
La taille d'un type de données dépend de la machine vous travaillez avec.
Ainsi, un char, un caractère unique, est de savoir comment le nombre d'octets sur notre appareil de CS50?
Un octet.
Et c'est en fait un octet comme bien sur une machine de 64 bits.
>> Et la plupart des types de données sont le même nombre des octets sur les deux machines.
Mais certains types de données seront différentes sur les deux machines.
Ce serait donc potentiellement la seule chose que vous devez savoir.
>> Mais même cela, je pense, est au-delà des limites -
Je suis presque certain, si vous regardez en arrière de vieilles quiz, dit-il, assumer
problèmes que vous utilisez le codage une machine de 32 bits.
Mais il ya, pour aller avec ce que dans Si vous êtes intéressé, il ya
les types de données qui sont les mêmes taille sur toutes les machines.
>> Si vous avez vu quelque chose comme uint32_t, vous pouvez ou
ne pas avoir vu cela.
C'est un type de données.
Ce n'est pas peu dire, être 32 bits peu importe quelle machine ce n'est sur.
Alors, quand les gens écrivent portable code, ils ne seront probablement pas utiliser ints.
Ils utilisent plutôt ces autres données types qu'ils connaissent seront les mêmes
taille sur chaque machine.
Madhu.
>> MADHU: J'avais une question à propos de le processus de compilation.
Donc, si vous écrivez un programme qui utilise une bibliothèque comme CS50 ou quelque chose
comme ça, je sais que cette bibliothèque doit, à un certain point, être
compilé et lié po
Mais combien de ce qui se passe pendant la compilation de votre programme?
Quelle partie de ce processus de bibliothèque se produit lorsque vous êtes
compilation de votre propre programme?
>> JASON HIRSCHHORN: Donc, nous allons passer en en général, les étapes de ce procédé.
Vous écrivez votre fichier c..
Dans votre fichier de c., Vous incluez votre # bibliothèques d'en-tête, par exemple, cs50.h.
Qu'est-ce que forte comprennent ligne faire à votre programme?
Akchar.
>> Akchar: Il ajoute les prototypes de les fonctions de l'en-tête
fichiers dans les bibliothèques.
>> JASON HIRSCHHORN: Exactement.
Il ajoute ces prototypes de fonctions à votre code.
Ainsi, lorsque votre code est compilé dans les premiers stades, le compilateur sait
que ces fonctions existent réellement, et que quelque part, ils ont été définis.
Les fichiers. H ne comprennent pas la définitions de ces fonctions ou comment
elles travaillent effectivement.
Cs50.h comprend juste quelque chose qui dit GetString est une chose réelle que
peut arriver.
Et standardio.h dit printf est une véritable chose qui puisse arriver.
>> Donc, votre langue de c avec cela. Tête fichier est transformé en un certain
un code lisible par machine, qui par la suite obtient transformé en binaire
code, de 0 et de 1.
Et c'est le code qui en fin de compte est exécuté.
-L ligne CS50 - par exemple, lorsque vous Clang écrit -
puis vous incluez-l CS50, que vous tapez po
Et vous voyez que.
Lorsque vous écrivez faire, vous aurez voir cette ligne ici.
Et nous verrons que, dans un deuxième quand nous codons ou plus tard, quand nous le code.
>> Mais que-l ligne CS50 fait quelque chose un peu différente de celle
les # include cs50.h.
Qu'est-ce que la ligne-l CS50 faire?
Avi?
>> AVI: Je veux dire que c'est Liens la bibliothèque à la fonction
appeler, comme les joints fichiers..
>> JASON HIRSCHHORN: donc très près, sinon spot-on.
-L CS50 prend le fichier binaire et fusionne avec le fichier binaire.
Donc cs50.h, il ne sert à rien tournant cs50.h de langage C en binaire chaque
temps seul il est utilisé.
Ce serait idiot, parce que serait perdre beaucoup de temps.
Ainsi, il a déjà été établi et transformé en un exécutable.
Et maintenant, il va être fusionné avec votre fichier à la fin.
Donc, ces 1 et de 0 vont à fusionner avec vos proches
et de 0 à la fin.
Alors maintenant, vous allez vraiment vous avez la réelle 1 et de 0 qui définissent la façon dont GetString,
par exemple, fonctionne, ou comment printf, par exemple, fonctionne.
>> Et pour plus d'informations, il ya un compilateurs courtes que Nate donne que
vous devriez vérifier ce qui va à travers ces étapes.
Mais -
Oui.
>> ETUDIANT: fichiers o Sont-ils toujours en. quand ils sont sous la forme de bibliothèque,
prêt à être fusionné, lié - comme ils sont dans le code binaire?
>> JASON HIRSCHHORN: OK.
Qu'est -
>> ÉTUDIANT: Est-ce toujours le cas pour les bibliothèques quand vous leur lien?
>> JASON HIRSCHHORN: Oui.
Donc, il ya. S fichiers, qui seront code machine, qui sera également
cryptique pour vous.
Vous n'avez pas besoin de s'inquiéter à propos de ceux-ci.
Mais en général, oui, ils vont être. o fichiers prêts à aller.
>> Étudiant: Donc lorsque vous expédiez à une bibliothèque, vous ne transportons seulement
l'. h et le. o?
Vous n'avez pas expédier le. C ou le. S.
>> JASON HIRSCHHORN: Donc -
et c'est dans ce court ainsi, si cette information semble venir d'un
peu vite.
Mais sur le court compilateurs parle de cela aussi.
Lorsque vous expédiez une bibliothèque, si vous expédiez l'. h, le fichier d'en-tête, les
prototypes de fonction, et le 1 de et 0 de, c'est tout ce que vous devez donner.
Vous n'avez pas besoin de donner la façon dont le fonction fonctionne, le fichier c..
Parce que l'abstraction, ou le signaler API, le point à ce SPL,
la bibliothèque portable de Stanford, il est pour vous de ne pas vous soucier de comment les nouvelles
GRect fonctionne, ou comment passer des œuvres, ou comment ajouter des œuvres.
Tout ce que vous devez savoir, c'est que complément est une fonction que vous pouvez
utiliser, et il le fait.
Donc, vous n'avez pas vraiment besoin de savoir comment il est écrit en C. Vous avez juste besoin d'
savoir, voici les fonctions, ce qu'ils faire, et voici les de 1 et de 0
quand vous voulez vraiment les utiliser.
>> Cool.
D'autres questions sur les compilateurs ou d'autres sujets sur la carte?
>> ETUDIANT: J'ai une question de la mise en œuvre des fonctions récursives.
Une question sur la récursivité.
J'ai eu le sentiment que pourrait se poser.
Allons donc rapidement récursion avec un spécifique
exemple, une fonction factorielle.
Parce que c'est un exemple qui revient souvent ou est utilisé
pour illustrer la récursion.
>> Ainsi, "4"! est lu comme 4 factorielle.
Et qu'est-ce que 4 factorielle signifie?
Qu'est-ce que faire?
Comment calculez-vous 4 factorielle?
4 fois 3 fois 2 fois 1.
>> Donc, une autre façon d'écrire 4 factorielle est d'écrire cela.
4 fois 3 factoriel.
Parce que 3 factorielle est 3 fois 2 fois 1.
Soit 4 fois 3 factoriel est 4 fois 3 fois 2 fois 1.
C'est pourquoi factorielle est une grande candidat à la récursivité, parce que c'est
clair qu'il ya quelque chose qui arrive encore et encore et encore sur un
plus petit nombre de choses jusqu'à ce que vous atteignez la fin.
Lorsque vous arrivez à 1, 1 factorielle est 1.
Vous ne pouvez pas aller plus loin.
0 factorielle est également définie comme 1.
Donc, quand vous arrivez à 1 ou 0, vous êtes à la fin, et vous pouvez
commencer à aller vers le haut.
Donc, si nous voulions écrire un récursive fonction pour calculer une factorielle,
nous allons écrire un peu pseudo pour ça maintenant.
Avant nous écrivons que pseudo -
Je vais vous donner les gars quelques minutes pour écrire le code de pseudo ou il suffit de penser
à ce sujet - il ya deux choses tous fonction récursive a besoin.
Quels sont ces deux choses?
>> JACK: Il doit se dire.
>> JASON HIRSCHHORN: Noé?
Oh, Jack.
Allez-y.
>> JACK: Il doit se dire.
>> JASON HIRSCHHORN: Donc un récursive fonction a besoin d'un appel récursif, un
appeler à lui-même.
C'est un.
Et ce qui est l'autre chose?
>> JACK: Un cas de base.
>> JASON HIRSCHHORN: Un cas de base.
Un scénario de référence est, ici c'est quand nous nous arrêtons.
Donc, votre fonction est appelée.
Le cas de base vient en premier.
Vous voulez savoir si vous êtes à la fin.
Et si vous n'êtes pas à la fin, vous faire de votre appel récursif.
Et vous passez par cette fonction de nouveau, vérifiez votre hypothèse de base.
Si vous n'êtes pas la fin, vous faites un autre appel récursif,
et cetera, et cetera.
>> C'est pourquoi les fonctions récursives toujours besoin de ces cas de base et ceux
appels récursifs.
Si vous n'avez pas un appel récursif, il ne serait pas une fonction récursive.
Si vous n'avez pas un cas de base, vous aller toujours et
il n'y aurait pas de fin.
Et le cas de base vient toujours en premier, parce que vous aurez toujours envie de vérifier
si vous êtes à la première extrémité.
Donc, avant de faire un peu de pseudo, pourquoi prenez-vous pas une minute pour réfléchir à
comment une fonction factorielle récursive serait écrit?
>> Aussi, autant que vous le faites, l'écriture -le sur une feuille de papier est
ce que vous allez avoir à faire sur le quiz demain.
Donc probablement une bonne pratique de faire que le code que vous écrivez
bas sur la feuille de papier -
ou vous pouvez le faire.
Vous savez où sont les points-virgules.
Vous vous souvenez de la syntaxe.
Parce que vous n'êtes pas en mesure d'avoir une compilateur dire que vous avez fait une erreur.
>> En outre, le long de ces lignes, demain, quand vous avez des problèmes de codage, si vous
sont pressés par le temps, ou si vous êtes très confus quant à la façon dont vous êtes censé
écrire la chose particulière dans c, il serait vous incombera d'écrire pseudo-code
ou écrire des commentaires en tant que bien.
Parce qu'il ya un crédit partiel pour un beaucoup de questions sur le questionnaire.
Donc, vous pourriez être pressé, ou que vous pourrait bien être confondu.
Écrit dans les commentaires ou pseudo-code sont souvent des moyens que vous
peuvent obtenir un crédit partiel.
>> Donc, ne pas laisser quelque chose blanc sur le questionnaire.
Il n'y a pas de sanctions pour mettre les choses po
En fait, la mise en pseudo-code ou commentaires va aider la niveleuse
déterminer si vous savez vraiment ce vous parlez, et peut-être d'attribution
vous un peu de crédit partiel pour cela.
>> Aussi le long de ces lignes, écrire clairement.
Si nous ne pouvons pas vraiment ce que vous écrivez, nous n'allons pas vous appeler
à minuit demain à la figure ce que vous avez écrit.
Nous allons juste à décoller points.
Ecrivez clairement que nous puissions entendre, ou plutôt, nous pouvons lire ce que vous avez écrit.
>> Et si elle dit deux phrases, ne pas écrire un paragraphe.
Suivez les instructions.
Écrire clairement.
Et écrire dans ces commentaires ou pseudocode pour les questions qui pourraient
crédit partiel de prix.
>> OK, allons-y pour factorielle.
Nous avons donc une fonction factorielle.
Si je devais réellement écrire cela en C, qu'est-ce que je dois mettre avant le nom
de la fonction?
Le type de retour, ce qui, dans ce cas, nous allons lui donner int.
Et puis à l'intérieur des accolades, est ce qui se passe à l'intérieur des accolades pour
une fonction?
>> ÉTUDIANTS: Type d'argument.
>> JASON HIRSCHHORN: Ses arguments.
Donc factorielle sera probablement prendre un argument.
Il va probablement prendre un argument.
Et nous disons qu'il va prendre un nombre entier appelé x.
Et encore une fois, lors de l'écriture du prototype de une fonction ou d'écrire la fonction
dans votre code avant de la définir, vous écrire le type de données et le nom d'
cette variable pour cette fonction seulement.
Ainsi, vous pouvez passer un certain nombre dans ce fonction, il sera appelé x
en interne.
>> Nous avons notre fonction factorielle.
Nous avons besoin de deux choses, un cas de base et un appel récursif.
Quel est le scénario de base pour factorielle?
Quelqu'un qui l'a écrit sur et qui n'a pas encore parlé, ce qui est la base
cas pour factorielle?
>> ETUDIANT: Si n est inférieur de 2, retour 1.
>> JASON HIRSCHHORN: Si n est moins de 2, retour 1.
J'aime que, parce que prend soin de 0 et 1.
Nous ferons donc x <2, retour 1.
Si nous sommes passés 0, si nous obtenons passé 1, cette fonction sera
retourner immédiatement 1.
Si nous sommes passés un certain nombre supérieur ou égale à 2, nous allons
avoir notre appel récursif.
>> Et comment est-ce que cela va fonctionner?
Can quelqu'un d'autre qui a travaillé sur ce qui n'a pas encore parlé de me donner l'
appel récursif pour cette fonction en pseudo-code?
Si nous sommes passés à un nombre x et il est supérieur à 2, ce qui
voulons-nous faire?
Nous avons également un exemple écrit sur le côté qui pourrait vous donner un indice.
>> ETUDIANT: Appelez x fois la factorielle de x moins 1?
>> JASON HIRSCHHORN: Exactement.
Nous allons revenir x fois la factorielle de x moins 1.
Et que, même si j'ai écrit, Fondamentalement, ce que vous avez dit en anglais,
cette fonction factorielle sera appelée à nouveau.
Il va exécuter sur x moins 1.
Il va revenir avec un entier, et alors il va multiplier ces deux
en même temps, et cette valeur sera retourné à quelque appelé cette
fonction factorielle, qui pourrait un autre exemple d'
cette fonction factorielle.
>> C'est donc un exemple d'un récursive fonction, une très
fonction récursive simple.
Mais la plupart d'entre eux seront comme ça.
Si vous voulez un bon récursive un défi pour le quiz, essayez de codage
recherche binaire récursive.
Parce que si vous avez fait une recherche binaire pour problème réglé trois, vous avez sans doute l'avez fait
de manière itérative dans une boucle while.
>> Mais elle peut aussi s'écrire de manière récursive.
Vous allez avoir besoin d'écrire votre propre fonction distincte qui prend un certain
différents arguments de ligne de commande - ou et non des arguments de ligne de commande, un certain
différents arguments juste réguliers.
Mais vous pouvez écrire recherche binaire récursive ainsi.
>> Étudiant: Donc, vous auriez pu également écrit, à la place de x moins 1, vous
aurait également écrit x moins moins, ou vous pourriez avoir
écrite minus minus x.
Pouvez-vous nous expliquer très rapidement pourquoi ceux qui seraient des choses différentes,
comme quelle est la différence entre x moins moins moins moins et x?
>> JASON HIRSCHHORN: Non, je ne suis pas va aller là-dedans.
Mais je vais vous parler après classe. x moins en moins, moins, moins x
décrémenter x par 1.
Mais ils le font un peu différemment.
Mais je ne veux pas entrer dans cela.
D'autres questions sur la récursivité ou cette fonction?
Ce n'est pas vraiment même pseudo.
C'est essentiellement le code C Vous souhaitez écrire pour cela.
>> OK, d'autres questions sur des sujets ici?
Ouais.
>> ÉTUDIANT: J'ai un rapide aperçu des le point et virgule flottante.
>> JASON HIRSCHHORN: Flottant le point et de précision.
Quelqu'un peut très vite me donner un aperçu de
virgule flottante et précision?
Vous avez tous eu à faire pour votre problème réglé, si vous êtes tous
familier avec elle.
Ou peut-être pas tous.
N'importe qui?
Donnez-moi un point de commencer.
Virgule flottante et précision.
Quel est le problème?
Oui.
Victoria?
>> VANESSA: Vanessa.
>> JASON HIRSCHHORN: Vanessa.
Désolé.
>> VANESSA: Il n'y a qu'un nombre fini des nombres qui peuvent être représentés
parce que vous êtes sur un, dans notre cas, un système 32 bits.
Donc, vous avez à type de faire quelques numéros.
>> JASON HIRSCHHORN: C'est tout à fait exact.
Il existe seulement une certaine quantité d' nombres qui peuvent être représentés.
Si vous multipliez deux très grands nombres, il pourrait déborder de la quantité
d'espaces que vous devez représenter un nombre entier.
C'est pourquoi parfois nous utilisons un long long au lieu d'un int.
Cela a plus de places.
Qui peut contenir un plus grand nombre.
>> Précision en virgule flottante a à voir avec que, mais a aussi à voir avec la
fait que les nombres décimaux sont pas toujours représenté.
Désolé.
Permettez-moi de cette sauvegarde.
Le nombre décimal 1.0 n'est pas toujours représentée comme on peut s'y attendre,
1,000000000.
Il est parfois représenté comme 1,000000001 0,999999999 ou.
Il pourrait même être jeté 89 quelque part.
Donc, ces nombres décimaux ne sont pas représenté exactement comme vous le feriez
s'attendent à ce qu'ils soient représentés.
>> Donc problème posé -
était-ce deux? -
problème réglé deux, où nous avons traité nombres à virgule flottante, lorsque nous voulions
qu'ils représentent exactement ce que nous voulions qu'ils représentent, le nombre
de pièces de monnaie, ou le nombre de cents, nous les multiplions par 100.
Nous leur avons arrondi.
Et puis nous avons coupé tout derrière la virgule.
C'était pour s'assurer qu'ils seraient effectivement égale exactement ce que nous voulions
qu'ils sont égaux.
>> Parce que quand vous prenez quelque chose qui est un flotteur et la transformer en un int, vous
couper tout à droite de la virgule.
Parce qu'il ya un certain point flottant imprécision, 100.000 peut-être
représentée comme 99,999999999.
Et si vous venez de couper tout à le droit de suite, vous allez
obtenir le mauvais numéro.
Ouais.
>> ETUDIANT: j'ai eu une question sur la coulée.
Dans quel ordre faut-il se produire en?
Si vous souhaitez faire flotter, entre parenthèses, 1 divisé par 10, ça ne 1 divisé par 10,
puis obtenir 0,1, puis tournez dans un flotteur?
>> JASON HIRSCHHORN: Si vous faites flotter 1 divisé par 10 -
>> ETUDIANT: Ouais, et alors égaux -
ainsi, il serait normalement faire égal à -
Ouais.
Vous voulez faire un flotteur, non?
>> JASON HIRSCHHORN: OK, nous allons l'utiliser pour enchaîner en déterminer
les réponses à ces questions par codage.
Parce que vous aurez probablement beaucoup de ces questions de minutes, et une bonne façon
de les résoudre à travers le codage.
Nous allons donc à coder ce droit maintenant, et puis nous allons revenir en arrière et
coder la question que vous aviez.
>> Ainsi, la première ligne -
Je n'aurais pas écrit il - ce qui est la première chose que nous voulons faire quand nous
ouvrir un nouveau fichier dans gedit?
>> ETUDIANT: Inclure.
>> JASON HIRSCHHORN: Inclure quoi?
>> ETUDIANT: bibliothèque CS50.
>> JASON HIRSCHHORN: OK.
Que devrions-nous comprendre?
Nous allons juste pour vérifier ce qui se passe quand vous lancez quelque chose à un flotteur.
Mais que devons-nous inclure si nous sommes allez écrire un programme C?
>> ETUDIANT: Standard I / O.
>> JASON HIRSCHHORN: stdio.h.
Nous n'avons pas réellement besoin, pour cette programme, cs50.h, même si c'est
toujours utile de l'inclure.
Mais nous n'avons pas toujours besoin stdio.h.
>> ETUDIANT: Lors du codage en C?
>> JASON HIRSCHHORN: Lors du codage en C
>> Donc je l'enregistrer comme fichier de c..
Je reçois quelques belles coloration syntaxique.
J'ai écrit vide à l'intérieur principale.
Qu'est-ce que signifie vide?
>> ETUDIANT: Ne pas prendre de arguments de ligne de commande.
>> JASON Hirschhorn: moyen néant, dans ce cas, le principal ne prend pas
arguments de ligne de commande.
Dans d'autres cas, cela signifie que la fonction ne prend pas d'arguments de ligne de commande.
Ou la fonction, si je devais écrire vide main (void), que diraient principales de
ne pas retourner quoi que ce soit.
Donc nul signifie simplement rien.
Qu'est-ce que j'écris si je devais prendre des arguments de ligne de commande?
>> ETUDIANT: int arc c arc de chaîne c
>> JASON HIRSCHHORN: int argc chaîne argv.
N'est-ce pas?
>> ETUDIANT: C'est carac supports de argv étoiles.
>> JASON HIRSCHHORN: Donc, vous pourriez écrire supports chaîne de argv ou argv char étoiles
entre parenthèses, mais vous devez les parenthèses.
Parce que argv est un tableau de chaînes, se souvenir.
Ce n'est pas seulement une chaîne.
Alors chaîne argv est, ici est une chaîne appelée argv.
Supports String argv est, voici un tableau de chaînes.
Alors int argc parenthèses chaîne de argv serait quelque chose que je
probablement écrire.
>> Donc, vous vouliez sauver dans un entier?
>> ETUDIANT: Ouais, entier.
Ou dans un flotteur.
>> JASON HIRSCHHORN: Dans un flotteur?
Comme, float x est égal à 1 divisé par 10.
>> JASON HIRSCHHORN: OK.
Comment puis-je imprimer un flotteur dans printf?
Qu'est-ce?
>> ETUDIANT:% f.
>> JASON HIRSCHHORN:% f.
Qu'est-ce qu'un nombre entier?
d ou i.
Qu'est-ce que c'est une chaîne?
>> ÉTUDIANT: s.
>> JASON HIRSCHHORN: s.
Comment puis-je obtenir une nouvelle ligne?
>> ETUDIANT: Backslash n.
>> JASON HIRSCHHORN: Qu'est-ce que je reviens si les principales pistes correctement?
>> ETUDIANT: 0.
Ai-je besoin d'écrire cette ligne, si?
>> ÉTUDIANT: Non
OK, nous ne serons pas écrire, alors.
Tout le monde peut lire?
Il ressemble un peu petit.
Tout le monde peut voir, ou devrait Je me fais plus?
Je pense que pour l'appareil photo, nous allons faire un peu plus grand, cependant.
>> JASON HIRSCHHORN: Si je veux faire de cette . C déposer dans un fichier exécutable, ce qui
dois-je écrire?
>> ÉTUDIANTS: Faire test.
>> JASON HIRSCHHORN: Désolé?
>> ÉTUDIANTS: Faire test.
>> JASON HIRSCHHORN: Assurez-test.
Nous parlions cette ligne plus tôt.
Clang.
Ce qui est bruit?
Le nom du compilateur.
Quelle est cette ligne?
>> ETUDIANT: Définit en place pour l'utilisation de GDB.
>> JASON Hirschhorn: Ensembles vers le haut pour l'utilisation de GDB.
Cette ligne, c'est quoi?
>> ÉTUDIANTS: Le code source.
>> JASON HIRSCHHORN: C'est l' fichier source, le fichier c..
Qu'est-ce que ces deux lignes font?
Ou ces deux lignes non.
>> ETUDIANT: Il nomme test.
>> JASON HIRSCHHORN: Donc, le tableau de bord o dit, nommer les choses différemment.
Et ici vous appeler test.
Si je ne l'ai pas, quel serait-il nommer ce?
>> ETUDIANT: a.out.
>> JASON HIRSCHHORN: a.out.
Qu'est-ce que cela fait?
>> ETUDIANT: Liens à la bibliothèque de mathématiques.
>> JASON HIRSCHHORN: Il relie dans la bibliothèque de mathématiques.
Nous n'avons pas inclus la bibliothèque de mathématiques, mais puisque c'est si commun, ils ont
formule par écrit, à toujours inclure la bibliothèque mathématique.
Et de même, ce qui inclut la bibliothèque CS50.
>> OK, donc si nous énumérons, nous avons maintenant un exécutable appelé test.
Pour l'exécuter, j'écris test.
Je vois que mon virgule flottante, comme on s'y attendait, est égal à 0.
Est-ce que -
si -
>> Etudiant: Alors si vous mettez flottez maintenant, comme vous le lancez comme flotteur -
>> JASON HIRSCHHORN: Cast le 1 à un flotteur?
>> ETUDIANT: Non, jeter la chose entière -
ouais.
Si vous venez de faire cela, serait qui font qu'il est de 0,1?
>> JASON HIRSCHHORN: OK, donc très rapidement, 1 divisé par 10, ce sont
entiers étant divisés.
Ainsi, lorsque vous diviser des nombres entiers, ils sont 0, et vous enregistrez que 0 dans un
flotter, parce que la barre est juste division entière.
Alors maintenant, nous nous tournons quelque chose dans un flotteur.
>> Voyons ce qui se passe.
Nous ferons test.
Ainsi, nous voyons maintenant que ce n'était pas slash division entière, il flottait
la division en point.
Parce que l'un de ses arguments avait été mis à un flotteur.
Alors maintenant, il a été dit, traiter ce division que nous avons affaire à
flottants, pas avec des nombres entiers.
Et si nous obtenons la réponse que nous attendons.
>> Voyons ce qui se passe -
oops.
Si je voulais imprimer plus décimal taches, comment pourrais-je le faire?
>> ETUDIANT: point point f, ou autant décimales que vous le souhaitez.
>> JASON HIRSCHHORN: Donc j'imprime 10 places décimales.
Et nous voyons maintenant que nous obtenons des trucs bizarres.
Et cela va revenir à votre question sur virgule flottante imprécision.
Il ya des trucs bizarres stockée ici.
>> OK, est-ce que cela répond à votre question?
Que vouliez-vous pour coder rapidement?
>> Étudiant: Je voulais juste voir si pas, si vous avez libéré un peu de pointeur,
si ce pointeur n'avait toujours stocké dans il l'adresse de ce qu'elle avait été
montrant précédemment.
>> JASON HIRSCHHORN: OK, nous allons donc le faire.
Char ptr étoiles, ce qui crée une variable appelé ptr de type char étoiles.
Comment puis-je écrire malloc?
Alden?
>> ALDEN: Juste malloc.
Mais alors, il doit être la taille de, et dans ce cas, je suppose que vous
être dirigée vers un char.
Donc, ce serait l'omble.
>> JASON HIRSCHHORN: OK, donc plus générique, à l'intérieur -
éditons.
Inside malloc, vous voulez que le numéro des octets sur le tas.
En général, ce que nous avons vu que nous sommes faire, c'est que nous allons malloc
des chaînes, par exemple, ou tableaux d'entiers.
Donc, si nous voulons 10 entiers, ou 10 caractères, 10 nous donnera 10.
Et puis la taille de caractères donnerait nous que la taille des caractères, qui en
ce cas est de 1 octet.
Nous obtenons 10 octets.
Si nous devions écrire la taille de int, cela nous donnerait 40 octets.
>> Donc, plus générique, à l'intérieur de malloc est le nombre d'octets que vous voulez.
Dans ce cas, nous obtenons 1 octet.
Qui semble être une utilisation étrange de malloc, mais pour notre
fins du sens.
Il n'y a donc que.
>> Nous allons appeler gratuitement.
Nous nous débarrassons de lui et nous utilisons ptr de nouveau.
Et qu'est-ce que vous voulez vérifier?
>> Étudiant: Je voulais juste vérifier si ou pas qu'il y avait quoi que ce soit
à l'intérieur de celui-ci.
>> JASON HIRSCHHORN: Donc si il a à quelque chose?
>> ÉTUDIANT: Oui, exactement, si il y avait encore une adresse mémoire.
>> JASON HIRSCHHORN: Donc, vous voulez pour vérifier la valeur de ptr?
>> ÉTUDIANT: Oui, exactement.
>> JASON HIRSCHHORN: Qu'est-ce que j'écris ici si je veux vérifier la valeur de la
le point - ce qui est, la Jordanie dit, la valeur?
Ou ce qui est stocké à l'intérieur de ptr?
>> ETUDIANT: Une adresse de mémoire.
>> JASON HIRSCHHORN: Une adresse de mémoire.
Donc, si je vous écris tout cela, ça va me donner la valeur de ptr.
Et comment puis-je imprimer une adresse de mémoire?
Quelle est la chaîne de format pour une adresse de la mémoire?
>> ETUDIANT:% p.
>> JASON HIRSCHHORN:% p.
% S est une chaîne.
% P pour pointeur.
N'est-ce pas?
C'est exact.
Donc ptr égal -
il a encore quelque chose.
C'est probablement un plus question intéressante.
Qu'est-ce que cette ligne fait?
>> ETUDIANT: défauts Seg.
>> JASON HIRSCHHORN: Quoi?
>> ÉLÈVE: Je pense que seg défauts.
>> JASON HIRSCHHORN: Hm?
>> Etudiant: Je pense que ça va seg faute.
>> JASON HIRSCHHORN: Donc, cette ligne ptr code, étoiles, ce
ne l'étoile signifie?
>> ETUDIANT: Contenu de.
>> JASON HIRSCHHORN: Ouais.
Allez pour obtenir le contenu de.
Donc, cela va aller à la mémoire il répondre et me donner cela.
J'avais l'habitude% c ici parce qu'il sont des caractères stockés là.
Donc, nous allons aller à cette adresse que nous juste vu - ou ce sera probablement un
peu ce différent temps, nous courons le programme.
Mais nous irons à cette adresse que nous connaissons existe encore
et voir ce qui est là.
>> Donc, il n'a pas seg faute.
Il n'a tout simplement pas nous donner quoi que ce soit.
Il aurait pu effectivement nous a donné quelque chose, nous ne pouvons tout simplement pas le voir.
Et cela nous ramène à cette idée -
et nous n'allons pas trop entrer dans ce, parce que c'est au-delà de la
cadre de ce cours.
Mais nous avons parlé ici, si nous est allé au-delà des limites du tableau par
1, nous ne pourrions pas avoir des ennuis.
>> Parfois, quand vous allez simplement hors de 1, vous faites quelque chose de mal, et vous
pourrait avoir des ennuis.
Mais vous n'avez pas toujours en difficulté.
Cela dépend de la façon dont beaucoup d'une mauvaise chose que vous ne, vous allez avoir des ennuis.
Qui ne veut pas dire, être négligé avec votre code.
Mais il est-à-dire, le programme ne sera pas toujours cesser de fumer, même si vous allez quelque part
vous n'êtes pas censé aller.
>> Un bon exemple en est, beaucoup d' personnes dans leur problème défini 3, qui
a 15, n'ont pas vérifié l' limites de la carte.
Alors vous avez regardé à gauche, tournés vers la droite, tournés vers le haut, regardé
vers le bas.
Mais vous n'avez pas coché pour voir si le haut qui se passait réellement à être sur le plateau.
Et beaucoup de gens qui ont fait cela et tourné que dans leur programme a
parfaitement, parce que là où ce conseil était stockée dans la mémoire, si vous êtes allé un
au-dessus ou vérifié que la mémoire adresse, il n'y avait rien
particulièrement horrible à ce sujet, de sorte que votre programme n'a pas été
va te crier dessus.
>> Mais nous serions encore enlever des points si vous n'avez pas coché, parce que vous
ont été quelque chose que vous n'étiez pas censé faire, et vous pourriez avoir
obtenu en difficulté.
Les chances sont, cependant, vous n'avez probablement pas.
Donc, c'est pour montrer que, oui, nous pouvons encore y aller.
Et nous ne sommes pas entrer en difficulté dans ce cas.
Si nous avons essayé de faire lire le 100 caractères suivants, nous avions
probablement des ennuis.
Et vous pouvez coder la lecture de la prochaine 100 caractères si vous voulez en faisant quelques
sorte de boucle.
Ouais.
>> ETUDIANT: Depuis qu'on nous a donnée que espace une valeur réelle, nous ne serions pas
effectivement être en mesure de voir quoi que ce soit.
Devrions-nous essayer à la mise que égal à aimer c ou quelque chose?
>> JASON HIRSCHHORN: Grande question.
Comment puis-je configurer cette valeur -
ce ligne de code dois-je écrire en ligne sept à faire ce que vous avez dit?
>> ÉTUDIANT: Star ptr est égal unique citation c Fin de citation unique.
>> JASON HIRSCHHORN: C'est la mise un caractère, c, à cet emplacement,
car encore une fois, cette étoile signifie aller à là.
Et lorsqu'il est utilisé sur le côté gauche de un opérateur d'affectation, qui est égale à
signer, nous n'allons pas obtenir que valeur autant que défini cette valeur.
Voyons maintenant ce qui se passe.
>> Nous avons quelque chose et il était là.
Nous avons appelé gratuitement.
Quelques trucs probablement arrivé sur le tas.
Donc ce n'est pas plus là.
Mais encore une fois, nous n'obtenons pas en difficulté pour y aller.
>> Je fais cela dans le code pour illustrer que beaucoup de ces
questions que vous avez, ils sont très intéressant
répond beaucoup de temps.
Et ils sont vraiment de bonnes questions.
Et vous pouvez les trouver sur vous-même si, par exemple,
nous ne sommes pas dans la section.
Ouais.
>> ETUDIANT: Parce que vous n'êtes pas l'envoi de la pointeur n'importe où, que vous devez
utiliser malloc?
>> JASON HIRSCHHORN: Donc, cela revient à votre question initiale.
[? ?]
Est-ce juste une variable locale?
Malloc ici n'est pas que convaincante.
L'utilisation de malloc ici n'est pas que convaincant, car il est
seulement une variable locale.
>> ETUDIANT: Pourriez-vous faire l'omble ptr étoiles équivaut bonjour?
>> JASON HIRSCHHORN: Oh.
Donc, nous allons obtenir maintenant de retour à votre question initiale.
Je pense que vous n'étiez pas satisfait ma réponse.
OK?
Comme ça?
>> ÉTUDIANT: Oui.
Attendez.
>> JASON HIRSCHHORN: Et où voulez-vous imprimer?
Donc, nous l'imprimerons sur une chaîne comme ça?
>> ETUDIANT: Intéressant.
>> JASON HIRSCHHORN: Donc, cela dit ce argument est le type de caractère.
Donc, cela devrait être un caractère.
>> ETUDIANT: prend juste le premier.
>> JASON HIRSCHHORN: Donc, ce c'est ce que j'ai dit avant.
Comme je le disais, ce n'est pas le stockage de la chaîne à l'intérieur variable pointeur.
Il est le stockage -
>> ÉTUDIANTS: La première valeur de la chaîne.
>> JASON HIRSCHHORN: L'adresse de la la première valeur de la chaîne.
Si nous étions à imprimer, nous sommes obtenir la valeur à l'intérieur pointeur.
Et nous verrons, il est, en effet, une adresse de mémoire.
>> Cela fait-il sens?
Désolé.
Attendez, est-ce que cela répond à votre question, si?
>> ÉTUDIANT: Oui.
>> JASON HIRSCHHORN: Cette ligne de code est la création d'une chaîne et puis un autre
variable pointeur qui est pointant à cette chaîne, ce tableau.
Ouais.
>> Étudiant: Donc, si nous sommes allés une mémoire examiner plus avant, pourrions-nous obtenir l'h?
At-il été stockée comme une chaîne?
>> JASON HIRSCHHORN: Comme, nous l'avons fait -
donc c'est utile de le faire.
C'est l'arithmétique, qui vous les gars ont vu avant et devrait être
relativement à l'aise avec.
Cela s'apparente à l'écriture -
si nous devions écrire cette ligne de code, nous avons vu la notation de tableau avant.
Cela devrait nous donner la deuxième valeur dans ce tableau, h.
>> Si nous faisions cela, cela devrait également donner nous la deuxième valeur de ce tableau.
Parce qu'il va pas à la mémoire Adresse de la première chose, mais la
adresse mémoire de la chose un plus.
Et puis les déréférences opérateur étoiles ce pointeur.
Et encore une fois, nous allons voir.
Nous recevons encore h.
>> ETUDIANT: Que signifie exactement dereference dire?
>> JASON HIRSCHHORN: déréférencement est un mot de fantaisie pour aller.
Aller à cela et obtenir ce qui est là est de déréférencer un pointeur.
C'est juste un mot de fantaisie pour cela.
>> ETUDIANT: Si nous voulions imprimer l'ensemble de la chaîne, pourrions-nous
faire pointeur esperluette?
>> JASON HIRSCHHORN: OK, nous sommes va faire une pause ici.
Nous allons terminer ici.
Ampersand vous donne l'adresse d'un emplacement, ainsi quand vous faites de l'esperluette
une variable, il vous donne l'adresse où cette variable est stockée.
Pointeur Ampersand vous la donner adresse de ptr ptr où est en mémoire.
>> Nous n'allons pas aller sur avec cet exemple.
Vous pouvez trouver ces choses sur votre propre.
Mais encore une fois, ce pourrait même être frôle un peu au-delà de ce que vous devez savoir pour
la portée de la présente à mi-parcours -
ou ce quiz, plutôt.
Désolé.
>> Nous allons passer, parce que je j'aimerais faire un problème de codage
avant le temps est écoulé.
Et nous allons coder ce que je pense est le plus convaincant de ces
exemples, atoi.
Donc, ce fut une question sur un quiz il ya deux ans.
Et je l'ai sur la carte ici.
>> Les gens ont été invités sur le quiz -
ils ont eu un peu plus dans tesxt la question, mais j'ai éliminé la
texte, car il n'était pas nécessaire pour nos fins aujourd'hui.
C'était juste un peu de fond sur ce que atoi fait.
Mais vous le savez tous et sont très familiariser avec atoi.
>> Je vous suggère de coder ce sur une feuille de papier.
Je suggère également que vous utilisez la stratégie que nous avons dépassé
beaucoup dans notre section.
Tout d'abord, assurez-vous de bien comprendre ce atoi de faire.
Dessiner une image ou venir avec une certaine image mentale de celui-ci dans votre tête.
Ensuite, écrire pseudo pour cela.
Sur le questionnaire, si tout ce que vous obtenez est pseudo, à moins que vous
mettre quelque chose.
Et puis la carte que pseudo sur C. Si vous avez un chèque dans votre
pseudo, comme vérifier si quelque chose est 1, qui mappe sur un si
état et ainsi de suite.
Et enfin, le code du programme en C.
>> Donc, revenir à atoi et prendre cinq minutes pour coder ce sur une feuille de
papier, qui est probablement la quantité de temps que vous voulez prendre un
quiz pour atoi de code.
Cinq à 15 minutes, de cinq à 12, à cinq 10 minutes, est sur le montant de
temps que vous passez sur ce question dans le quiz.
Donc, prendre cinq minutes, s'il vous plaît.
Et si vous avez des questions, soulever votre main et je vais venir autour.
>> [SECONDAIRES CONVERSATIONS]
>> JASON HIRSCHHORN: OK, donc C'était cinq minutes.
C'est probablement sur le montant de fois que vous passerait sur que sur un quiz,
peut-être le bas de gamme de l'époque.
Nous récapitulons un peu.
Commençons coder cette.
Et si nous n'obtenons pas tout au long, les réponses à cette et cette
question quiz sont disponibles, encore une fois, L'automne 2011, c'est quand cette question
apparu sur le questionnaire.
>> Et il valait huit points sur le questionnaire alors.
Huit points sont à l'extrémité supérieure de la nombre de points vaut un.
La plupart des questions sont dans la gamme de un à six points.
Donc, c'est un plus difficile question, pour sûr.
Quelqu'un peut-il me faire commencer?
>> En général, ce que nous allons à vouloir faire de cette
fonctionner atoi, logiquement?
Que voulons-nous faire?
Nous allons donc écrire certains pseudo.
>> ETUDIANT: Autre caractères en nombres entiers.
>> JASON HIRSCHHORN: Autre caractères en nombres entiers.
OK.
Alors, combien de caractères sommes-nous allez avoir besoin de passer?
>> ETUDIANT: Toutes.
>> ETUDIANT: Tous les personnages dans la chaîne.
>> JASON HIRSCHHORN: Tous les caractères de la chaîne.
Donc, si nous voulions passer par toutes les caractère d'une chaîne, ce qui est une chose
en C, nous avons vu ce qui a permis nous passons par tous les
caractère d'une chaîne?
>> ÉTUDIANTS: Une boucle for.
>> JASON HIRSCHHORN: Une boucle for.
Donc, nous allons faire une boucle par tous les caractères de l'art.
>> Alors qu'est-ce que nous allons vouloir faire quand nous obtenons un caractère spécifique?
Disons que nous allons nous passâmes un 90.
Nous obtenons le 9.
C'est un personnage.
Que voulons-nous faire avec ce caractère neuf?
>> ETUDIANT: Soustrayez caractère 0?
>> ETUDIANT: Ajouter 0?
>> JASON HIRSCHHORN: Soustraire il de caractère 0?
>> ÉTUDIANT: Oui.
>> JASON HIRSCHHORN: Pourquoi vous voulez faire?
>> ETUDIANT: [inaudible]
valeur.
Sa valeur int.
>> JASON HIRSCHHORN: OK, si nous prenons l' caractère 9, soustraire de
caractère 0 pour obtenir une nombre entier réel 9.
Sweet.
Et comment savez-vous ce personnage 9 moins 0 caractère est de 9?
Quel tableau, avez-vous regardé?
>> ETUDIANT: Il ya logiquement neuf lieux entre 9 et 0.
Ou vous pouvez regarder la table ASCII.
>> JASON HIRSCHHORN: table ASCII.
Mais oui, vous avez raison aussi.
Donc, nous soustrayons 0.
Nous avons donc maintenant l'entier 9.
Et qu'est-ce que nous voulons faire avec ça?
Si nous avons 90, il est le premier entier nous avons, ce que nous voulons faire?
>> ETUDIANT: je mettrais dans un entier temporaire tableau, alors faire des mathématiques à elle
plus tard pour en faire une fin.
>> JASON HIRSCHHORN: OK.
>> ETUDIANT: Vous pouvez commencer à la fin de le tableau, puis aller de l'avant afin
que chaque fois que vous avancez, vous multipliez par 10.
>> JASON HIRSCHHORN: OK.
Cela ressemble à une jolie idée convaincante.
Nous pouvons commencer à la fin de notre tableau, et nous pouvons utiliser strleng.
Nous pouvons utiliser strleng ici.
Nous aurons la longueur de notre chaîne.
Nous commençons à la fin.
Et + la première, nous prenons juste que entier, et peut-être que nous créons comme un
nouvelle variable entière là-haut où nous faisons tout stocker.
Nous avons donc une boucle sur chaque caractère dans s de arrière vers l'avant, nous soustrayons 0, et
puis nous prenons, et en fonction de où il est, nous multiplions
par une puissance de 10.
Parce que la première, que faisons-nous multiplier le caractère le plus à droite par?
>> Étudiant: 10 au 0.
>> JASON HIRSCHHORN: 10 au 0.
Que faisons-nous multiplions la seconde droite caractère par?
>> ETUDIANT: [inaudible].
>> JASON HIRSCHHORN: Quoi?
>> Étudiant: 10 au 1.
>> JASON HIRSCHHORN: 10 au 1.
Le troisième personnage-droite?
>> Étudiant: 10 à 2.
>> JASON HIRSCHHORN: 10 à 2.
>> ETUDIANT: Désolé, je ne comprends pas ce que nous faisons ici.
>> JASON HIRSCHHORN: OK, Revenons, alors.
Nous allons donc à obtenir passé dans une chaîne.
Parce que nous écrivons atoi.
Nous sommes tellement passé dans une chaîne.
Disons que nous allons nous passâmes dans la chaîne 90.
>> La première chose que nous allons faire est de définir une nouvelle variable de type entier que nous sommes
aller juste pour créer comme notre nouveau entier.
C'est ce que nous allons pour revenir à la fin.
Nous avons besoin de passer par tous les caractères de la chaîne parce que nous avons déterminé
que nous devons toucher chacun et puis l'ajouter à notre nouveau entier.
>> Mais nous ne pouvons pas simplement l'ajouter comme un certain nombre.
Nous ne pouvons pas prendre 9 et ajouter 9 à notre entier.
Cela dépend de ce lieu il est dans la chaîne.
Nous allons avoir besoin de multiplier par une puissance de 10.
Parce que c'est comme ça que 10 œuvres base.
>> Donc, nous allons voir la réelle caractère, ou le nombre entier réel
nombre, en soustrayant caractère 0 de caractère 9 comme nous l'avons fait avec
soustrayant caractère majuscule de quel que soit le caractère que nous avions dans l'une des
ces problèmes.
Donc, nous allons réellement obtenir un nombre de 0 à 9 sauvé comme un nombre réel, et nous allons
multiplier par une puissance de dix en fonction où nous en sommes dans la chaîne.
Et puis nous allons rajouter dans notre nouvelle variable entière.
>> Donc ce que cela ressemblerait serait être - nous attirons ici.
Si nous sommes passés dans la chaîne 90 -
>> ETUDIANT: [inaudible].
>> JASON HIRSCHHORN: Mais atoi prend une chaîne.
Nous allons donc passer par l'exploitation.
Nous allons faire adopter en 90.
Nous allons de l'arrière vers l'avant.
Nous prenons le 0.
>> Étudiant: Je suis désolé.
Peut-être que c'est stupide.
Si nous allons nous passâmes dans une chaîne, pourquoi est-ce que nous sommes 90
se répercuter dans?
Parce que 90 est un nombre entier.
>> JASON HIRSCHHORN: Parce que atoi prend une chaîne et le transforme en l'entier
représentation de cette chaîne.
Mais la chaîne 90 n'est pas l'entier 90 ou le nombre 90.
La chaîne 90 est un tableau de deux ou trois caractères, plutôt, le 9
caractère, le caractère 0, et la barre oblique inverse 0 caractère.
>> Et nous atoi écrire parce que, pour exemple, lorsque vous prenez la commande
argument de la ligne, et il est enregistré dans argv, il est enregistré comme une chaîne.
Mais si vous voulez le traiter comme un nombre, vous avez besoin pour le convertir dans un
nombre entier réel.
Que nous avons fait une de nos séries de problèmes.
Que nous avons fait dans un certain nombre de nos ensembles de problèmes.
Tout le monde qui a eu un nombre entier comme un argument de ligne de commande.
C'est pour cela que notre fonction atoi prend une chaîne.
>> Encore une fois, dans notre exemple, nous sommes va prendre la dernière.
Nous allons soustraire le caractère 0 de celui-ci, parce que les caractères 0
soustraite par le caractère 0 vous donne le nombre réel de 0, selon l'
ASCII mathématiques que nous faisons.
>> Parce que les personnages sont représentés comme différente de leur réelle - la
un caractère, par exemple, minuscules un est de 97.
Ce n'est pas - oh là là!
Ce n'est pas ce que vous attendez qu'il soit, 0, par exemple.
Donc, vous devez soustraire le caractère d'obtenir un 0.
>> Donc, nous allons le faire ici pour obtenir le nombre réel.
Et puis nous allons multiplier par une puissance de dix en fonction de l'endroit où il
est dans la chaîne, et ensuite prendre que et l'ajouter à notre place de titulaire
variable de sorte que nous pouvons arriver à notre nouvelle entier finale.
Est-ce que cela a un sens pour tout le monde?
>> Donc, nous n'allons pas coder cette en ce moment, parce que nous sommes
obtenir à court de temps.
Je m'excuse pour le moment que.
Mais c'est ce qui, nous l'espérons, vous le feriez être capable de faire sur le questionnaire - à l'
tout le moins, obtenir ce pseudo écrit sur.
>> Et puis, si nous devions écrire l' pseudo, en fait, nous avons pu faire
assez rapidement.
Chaque ligne de commentaires, nous nous écrivions ici se traduit à environ
une ligne de code C.
Déclarer une nouvelle variable, écrit une boucle, une partie de soustraction, de certaines
multiplication, et certains affectation.
Nous aurions probablement voulons aussi écrire une ligne de retour.
Nous pourrions aussi mettre certains contrôles dans ici.
Ouais.
>> Étudiant: Alors peut-on traiter s que la chaîne réelle?
Parce que je sais que c'est juste une adresse.
Comme, comment voulez-vous obtenir la longueur de la chaîne étant passé à travers?
>> JASON HIRSCHHORN: Alors, comment la longueur d'une chaîne?
Strlen.
>> ETUDIANT: strlen, ouais.
Mais pouvez-vous mettre s que le argument en faveur de cela?
>> JASON HIRSCHHORN: Donc strlen prend une étoile char.
Et il s'ensuit que l'omble étoile, et il garde compter jusqu'à ce qu'il arrive à un
barre oblique inverse 0. strlen était en fait l'un des autres programmes, nous
allaient code.
C'est un autre bon code.
Que l'on est un peu plus facile, parce que si vous allez penser que
conceptuellement -
Je viens de dire à haute voix - strlen suit un pointeur et continue à aller et
comptage et de suivi jusqu'à ce que vous atteignez une barre oblique inverse 0.
>> ETUDIANT: OK, il a obtenu.
>> JASON HIRSCHHORN: donc préférable de chance sur quizz 0 demain.
Si vous avez des questions, je vais être à l'extérieur après.
N'hésitez pas à m'envoyer un mail.
Tendez la main à votre propre TF si vous êtes pas dans mon article, ou obtenir mon
e-mail si vous le souhaitez.
>> Si vous voulez à paniquer et envoyez juste moi un email, un email de freakout, je vais
vous renvoyer, comme un visage souriant, ou, comme, une blague ou quelque chose.
Alors n'hésitez pas à faire aussi bien.
Bonne chance à nouveau, et je vais vous voir la semaine prochaine.