>> [Lecture de musique]
>> DAVIN: Très bien, les gars.
Voilà donc la revue pour la première quiz.
Tout le monde est prêt pour le quiz le mercredi?
ALLISON: Woo!
L'ÉLÈVE: Woo!
DAVIN: Ouais.
ALLISON: Ouais!
DAVIN: prêt-Ce gars.
Ce gars-là, deux mains, agréable.
Alors examen de quiz aujourd'hui, ça va à environ une heure et demie.
Nous allons passer en revue tous les grands concepts que vous devez savoir pour le quiz.
Nous allons passer en revue certains codage par exemples de la main, qui sont à chaque questionnaire.
Et si vous avez des questions, sentez-vous libre de lever la main et tout
comme ça.
Eh bien, la logistique sur le quiz en ligne.
Donc, nous allons diviser les gens en différentes chambres.
Il est basé sur leur nom.
Donc, si vous avez des questions sur l'endroit où d'aller ou de ce matériau est, comme,
le mot officiel sur ce qui se passe être sur le questionnaire, vérifier en ligne.
Et qui est tout à jour.
Donc, si il n'y a pas de questions à d'abord, nous allons commencer.
Et voici Allison.
>> [CLAPS]
>> ALLISON: OK, merci, Rob.
L'apprécier.
Davin aurait retourné à cela.
Ceci est la liste non exhaustive des sujets, comme toujours, comme vient de le dire Davin.
Consultez la documentation en ligne Quiz zéro.
Mais cela est assez much-- il est sur le programme
est tout ce que nous avons dépassé à ce jour.
Tout ici est jeu juste, ainsi que toute autre chose
qui peuvent avoir été mentionné dans la leçon.
>> Ma section, ici, est juste un lot de contrôle.
Il ya quelques exercices que vous avez peut travailler.
Mais pour la plupart, nous avons vraiment que vous souhaitez obtenir Davin avec ceux du code
par des exercices de la main.
>> Donc, je vais voler à travers cela.
Si vous avez des questions, arrêter moi.
Levez la main.
Je promets que je vais probablement vous vois.
Si non, juste agiter autour.
Je vais parler rapidement.
Je souhaite tout le monde est OK avec ça.
>> OK, mot spécial, Davin évidemment oublié de parcourir ces diapositives.
[Rires] Vous êtes en difficulté, l'homme.
Donc conseils pour questionnaire zéro, les pratiques de codage sur papier.
Les gars, vous allez obtenir quelque pratiquer avec qui maintenant avec Davin,
de sorte que vous ne serez pas complètement par vous-même.
Je pense que nous allons en fait par ces deux fonctions.
Alors vous serez bien préparé il.
>> Familiarisez-vous avec vos ensembles de problèmes.
Il ya eu des questions sur des questionnaires précédents
qui vous demandera, par exemple, de coder quelque chose de très similaire à Mario.
Donc, être très familier avec votre problème fixe, ainsi
que les questions que nous vous demandons au début de la forme
que vous remplissez, seront vous servir très bien.
>> Faire un quiz précédent sous les contraintes de temps.
Ces questionnaires sont longs.
Le temps passe très vite.
Et souvent, vous ne réalisez pas combien vitesse il va jusqu'à ce que vous
mettez-vous sous les contraintes.
Donc, si vous ne pouvez tailler, vous le savez, 75 minutes, ce soir ou demain
de prendre un de ces questionnaires sous que, vous serez en bien meilleure forme.
>> Et aussi, la création de votre feuille de référence.
Rappelez-vous, vous obtenez une Cette page avant et arrière
comme référence pour votre quiz mercredi.
Création qui est un excellent moyen pour étudier.
Tout ce que vous avez de la difficulté vous souhaitez inclure là-bas.
Tout ce que vos TF ont été, comme, ce qui est vraiment important.
Vous devriez savoir cela, sont peut-être que tu as là-bas
si vous ne les avez pas mémorisé.
Même si vous ne les connaissez vraiment Eh bien, parfois avoir sur il
est juste un peu de confort pour vous, que je connais quiz sont stressantes.
Ainsi, tout le confort que vous obtenez peut vous aider.
Tout droit, aussi, obtenir le sommeil et manger et aimer les choses normales
que nous vous disons de quiz.
>> Ainsi, à partir de facile, types et tailles données.
Comme je le disais, ce va juste pour être en me jetant un tas de choses
ici que vous devez savoir.
Nous avons donc nos caractères qui sont un octets, ints
qui sont quatre octets de long de long, qui sont huit octets.
Fondamentalement, il est juste que vous vouloir tenir des entiers plus grands.
Flotteurs, qui sont quatre, doubles, qui sont huit.
Encore une fois, vous donne juste plus espace pour vos flotteurs.
Et puis tapez étoile, de sorte que toute pointeur sur une machine de 32 bits,
qui est de tous vous les gars ont besoin à savoir, est de quatre octets.
>> Donc, toutes les choses que vous devriez savoir, peut-être les choses
vous voulez avoir sur votre feuille de référence.
OK, conversion binaire en binaire, conversion
en hexadécimal, d'avant en arrière, toutes les choses que vous devez savoir.
Donc, à partir de binaire en décimal.
Les gars, vous voulez prendre une minute rapide et essayer de comprendre chacun de ces
et dites-moi ce qu'ils sont?
>> Je dois aussi des bonbons dans mon sac, donc tout le monde qui répond obtient des bonbons, par la manière.
Et je dois beaucoup.
Permettez-moi de saisir cette.
Je vais donner ce à Gabe.
Ainsi, vous pouvez donner des bonbons à celui qui est agréable et coopérative.
>> OK, je l'ai vu une main dans le dos.
>> L'ÉLÈVE: Oui, le premier est de 42.
>> Allison: Oui, premier est de 42, correct.
L'ÉLÈVE: [inaudible].
[Rires]
ALLISON: seconde, il de retour en jaune?
L'ÉLÈVE: 110010.
ALLISON: Correct, et ce dernier, ici-bas sur le fond?
Aussi, oui, vous savez voulez?
Il suffit de jeter des bonbons.
Que diriez-vous des bonbons pour tout le monde?
>> L'ÉLÈVE: [inaudible] quand nous aurons fini.
>> ALLISON: Shh.
Et puis le dernier.
Qui veut répondre?
Juste là.
>> L'ÉLÈVE: 11100.
>> ALLISON: 11100, regardez ça.
Félicitations, excellent travail, tout le monde.
OK, tout le monde sorte de comprendre le processus pour ce faire?
Vous avez, passant de binaire en décimal la façon dont je tends à le faire, est en train d'écrire sur
les puissances de 2.
Alors je dis, OK, 0 fois 2 à 0, alors qui est égal à 0, 1 fois 2 à la première,
est 2 va partir de cette façon.
Quelqu'un veut me explicitement passer par un exemple de binaire?
OK, cool.
>> Décimal à binaire est très similaire.
Je tends à écrire les puissances de 2.
Commencez par celui qui est le plus grand, mais ne va pas au-delà de la décimale
que vous cherchez.
Et puis sorte de travailler votre chemin en arrière en ajoutant des choses comme nécessaire.
>> Et puis avec plus, il est comme l'addition normale.
Si jamais vous avez le cas où vous êtes ajoutant deux 1, il devient évidemment 2.
2 en binaire est maintenant 1 0 si vous avez besoin pour transporter votre 1 dans la colonne suivante.
Laisser refroidir.
>> Hexadécimal, ce pourrait être quelque chose qui est un peu moins familier.
Alors que Rob me disait justement au préalable, son truc pour ce
est à juste scinder en quatre morceaux d'octets, OK?
Bits, désolé.
Voir?
Merci Rob.
Ceci est la raison pour laquelle vous êtes ici. [Bruit] OK, si nous rompons juste vers le haut
en blocs de quatre bits.
Donc, avec les binaires en code hexadécimal, nous regardons les 4 premiers,
qui est si nous avons quatre 1 dans un rangée, ce nombre est-ce que symbolisent?
>> L'ÉLÈVE: F.
>> ALLISON: Donc dans ce cas, ce qui est 11111111 ou-- oui?
L'ÉLÈVE: FF.
ALLISON: Parfait, FF.
Si grande, bonbons pour vous.
Maintenant, pour savoir comment hexadécimal en binaire, nous il suffit de penser à ce sujet de sorte à l'envers.
Pour chaque numéro ou une lettre qui nous avons dans notre hexadécimal,
juste convertir à sa quatre bits [Rires] à sa conversion à quatre bits.
Donc 5, dans ce cas, ce qui est 5 si nous représentons avec quatre bits?
>> L'ÉLÈVE: 010?
Mm-hm.
Et puis A, qui est en fait 10, ce serait?
1010.
Alors que nous avons, ici.
Donc, la conversion entre hexadécimal et binaire est en fait pas si mal que ça.
Si vous regardez dans quatre bits morceaux, vont être d'or.
Everyone-- oui?
>> ROB: Ceci est ridicule, mais je me souviens toujours
A, puisque A est censé être 10.
Et binaire est juste 10 10, so--
>> ALLISON: Ah, là nous allons.
>> ROB: Hey.
>> ALLISON: Hey, bonbons pour Rob.
Il ya des choses non-chocolat là-dedans.
Ainsi, vous pouvez avoir.
Donc mathématiques ASCII.
Se comporter.
Donc ASCII mathématiques, comme vous les gars probablement bien se rappeler
p set 2 avec Visioneer et César, vous avez fait beaucoup de cela.
Rappelez-vous, les personnages sont fondamentalement que des chiffres.
Donc, nous pouvons faire des maths avec eux, comme nous le faisons avec les mathématiques ints.
>> Donc nous avons juste un peu chose simple ici.
Nous en avons dans A qui est initialisé à 65.
B et égale à la valeur ASCII d'un plus 1, char C égale à D moins 1,
et de l'omble D égal à 68.
Alors nous allons impression chacun d'eux, comme nous le voyons ici.
Et quelqu'un peut me dire ce que cela va imprimer?
L'ÉLÈVE: [inaudible].
ALLISON: Exactement, si une chose à remarquer est
que nous imprimons sur caractères à chaque fois, ici.
Nous désignons même si A et B sont ints quand nous les mentionnées ci-dessus.
Nous leur impression par caractères le pour cent C et notre instruction printf,
de sorte qu'ils seront tous imprimer sous forme de caractères.
Et bien sûr, la volonté valeur ASCII 65 imprimer comme A. La valeur ASCII de A plus 1
serait de 66, ce qui serait fier de B. Donc, en fait, nous
obtenir A B C D. Tout le monde il bon?
Des questions?
Impressionnant.
>> OK, la portée.
Donc portée est évidemment une très chose importante à comprendre, ici.
Beaucoup d'entre vous, si vous avoir des erreurs de compilation,
et il dit que vous ne devez pas l'accès à une variable,
il est probablement parce que vous il défini dans une boucle
et puis essayé d'y accéder hors de lui, ou vice versa.
>> Donc, portée à sa base, il détermine à l'endroit où
nous disons une variable existe, où nous peut changer, où nous pouvons y accéder.
Il est juste une sorte de dire ce sont des les seuls endroits où vous avez accès
pour cette variable.
>> Ainsi, les deux champs que nous parlons pendant la classe sont globales et locales.
Donc, les variables globales dont nous parlons lorsque vous les définissez-dessus principal.
Cela signifie que l'ensemble de votre programme a accès à elle,
et il existe aussi longtemps comme les courses du programme, OK?
Local signifie qu'il est plus confinée à une région.
Donc, lorsque vous avez des fonctions spécifiques comme swap, nous parlons toujours.
Nous parlons toujours de swap avec A et B. A et B existent à l'intérieur de cette fonction.
Ils ne se retrouvent nulle part ailleurs.
>> De plus, quand vous avez si déclarations ou des boucles.
Chaque fois que nous avons, par exemple, dans une boucle for nous avons int I est égale à 0.
Nous avons certaines conditions et nous mettre à jour.
Je existe que dans les accolades de cette boucle.
Si vous essayez d'accéder ailleurs, votre compilateur crier à vous.
Ce serait comme, qu'est-ce que vous essayez de faire?
Cela ne pas exister.
Voilà donc les deux différents types de portée.
Cela fait-il sens à tout le monde?
>> Ainsi, par exemple ici, ce est juste un programme simple.
Qu'est-ce que vous en pensez est qui va se passer à chaque point
que nous essayons d'imprimer?
Alors celui-ci, ce qui va se passer?
L'ÉLÈVE: Il imprimer trois.
ALLISON: Droit.
Il va imprimer trois.
Qu'en est-il ici?
L'ÉLÈVE: Il ne fonctionne pas.
Allison: Cela ne marchera pas.
Vous êtes hors de portée, non?
Ne existe pas variable locale en dehors de ces accolades, d'accord?
Et puis quoi ici?
>> L'ÉLÈVE: [inaudible].
>> ALLISON: Quoi?
Rob, allez.
>> ROB: Je viens de dire.
Les variables globales doivent être variable globale de soulignement.
>> ALLISON: Ah, oui, désolé.
Merci, Rob.
Rob comme notre compilateur résident.
Il va juste crier à nous lorsque nous besoin. [Rires] Oui, ce
devrait être variable globale de soulignement.
Donc, en supposant que ce était de soulignement mondial
variables, ce qui va se passer ici?
L'ÉLÈVE: Cela ne marchera.
ALLISON: ça va marcher.
Donc, il va imprimer, si juste un exemple très simple.
OK, prototypes.
Alors, évidemment, nous avons vraiment souligner pour vous les gars
pour faire fonctions si elle sens dans vos programmes.
Mais bien sûr, quand vous faire vos propres fonctions,
généralement vous les définissez après principal.
Et vous allez essayer de les appeler en principal.
Et si vous ne l'utilisez pas un prototype, votre compilateur va hurler à vous.
>> Prototype est fondamentalement juste dire à votre compilateur
que je dois cette fonction ci-dessous principale.
Je vais l'appeler avant que je le définis.
Tenir juste.
Je vous promets qu'il est défini, et vous aura tout ce dont vous avez besoin.
>> Donc, la façon dont nous faisons est juste votre retour le type, le nom de votre fonction, votre entrée
liste.
Il est essentiellement la première ligne de votre déclaration de fonction.
Il est vraiment tout ce qu'il est.
Mais ceci est juste un type général de forme.
>> Ainsi, dans notre exemple, qui vous les gars devraient
ont vu dans la section à un certain moment, nous avons
un certain int cube que prend un certain int de l'entrée.
Et nous avons notre principal fonction, qui appelle cube.
Et cube est défini après le fait.
>> Donc, si nous ne disposions pas d'entrée int cube au sommet, quand nous avons appelé cube
dans principal, notre compilateur serait en colère contre nous.
Ce serait comme, ce parlez-vous?
Cube ne pas exister.
Je ne sais pas ce que vous demandez.
Et je vais arrêter.
>> Mais parce que nous avons fait de notre prototype au sommet, nous l'avons dit,
vous savez, quand vous voyez cube, ne vous inquiétez pas à ce sujet.
Je vous promets qu'il est défini plus tard.
Et il vous laisse faire ce que vous voulez.
Donc si jamais vous avez une fonction qui est déclarée après que vous l'appelez
pour la première fois, vous devez l'ont prototypé au sommet.
>> Oui?
>> ROB: Il est carré, pas de cubage.
>> Allison: Oh mon Dieu.
Je ne l'ai pas have-- Gabe, je pensais vous étiez notre correcteur.
OK les gars, portent avec moi, ici.
Je souhaite tout le monde faire passer l'idée.
OK, ce qui devrait avoir été carré, pas en cubes.
Mais l'idée reste la même.
Toute fonction que nous appelons après le fait doit avoir un prototype.
Tout le monde bien avec qui?
Toutes les autres fautes de frappe?
Dáccord.
Toute faute de frappe ici avant de commencer, Rob?
[Rires] OK, donc structures.
Fondamentalement, struct, vous permettent pour créer votre propre type de données.
Donc, un peu comme un int ou un char ou un flotteur, il est juste un autre type.
Je me plais à penser de ce que, comme, créer votre propre type de données.
Donc, il vous permet de le faire.
Et il contient différents types de données.
>> Donc, si vous vous souvenez, dans un tableau, nous ne peut tenir les choses du même type.
Structures nous permettent de contenir plusieurs choses de différents types.
Donc dans ce cas là, nous avoir une structure appelée étudiants,
nommé ici en bas.
Et nous avons un certain int id et un nom de chaîne.
Donc, ceci est juste un autre type de données.
Nous avons maintenant un type de données appelé étudiant.
>> Donc, parce que nous pouvons penser comme tout autre type de données,
nous pouvons déclarer des variables comme nous le ferions tout autre.
Ainsi, au lieu d'avoir juste, comme, un int étudiant, nous avons juste un étudiant,
1 étudiant.
Oh, regarde.
Il est Rob.
Nous sommes donc ici déclarant une structure, ou une variable
appelé étudiant 1 de type étudiant.
Donc, il va falloir id et le nom qui lui est associé.
>> Et la façon dont nous accéder à ces éléments au sein de notre structure
est avec l'opérateur point, ici.
Donc dans ce cas, nous déclaré un étudiant 1.
Nous avons attribué l'ID à 1.
Et nous avons attribué le nom de Rob être.
OK, tout le monde bien avec qui?
Utilisez-le like-- juste oui?
>> L'ÉLÈVE: Oui, quand typedef-- devons-nous utiliser typedef?
>> Allison: Alors typedef juste dit that-- Rob, vous
peut me corriger si je suis ce wrong-- mais typedef est juste de déclarer réellement
comme un type que vous pouvez utiliser, non?
>> ROB: Ouais, il est fondamentalement, il est donc juste créer
un alias ou un pseudonyme pour un type.
Ainsi, vous pouvez taper que [inaudible].
Donc, [inaudible] existe, et maintenant nous avons juste
[Inaudible] des moyens exactement la même chose.
Et ici, nous sommes tapé, je pense, un certain type 2 struct [inaudible].
Donc, il est juste un surnom pour un type donné.
>> L'ÉLÈVE: String bibliothèque [inaudible] a été tapé comme l'omble étoiles.
>> ALLISON: Pour nos besoins ici, si vous déclarer une structure,
il suffit de faire typedef struct.
OK, si au préalable, cela est juste une variable normale ici.
Nous y accédons par un point.
si nous avons un pointeur vers une structure, nous pouvons
utiliser une flèche, qui est plutôt cool.
>> Donc dans ce cas, nous avons un pointeur vers un étudiant 1 qui est de type étudiant.
Rappelez-vous, avec votre construction de pointeur,
vous voulez tout type pointeur pointe vers soit au début.
Donc, nous avons un étudiant 1, ici.
Et depuis cet étudiant 1 est maintenant un objet pointu,
nous pouvons aller élève nom 1 flèche au lieu de point, car il est un pointeur,
et attribuer Rob.
Et maintenant, si nous voulons Rob changer de Davin,
cela est juste de vous montrer une autre façon de faire.
>> Ainsi, au lieu d'utiliser la flèche, vous peut also-- Je vais terminer cette puis
prendre que vous pourriez question-- faire également étudiant de référence 1.
Cela dit, comme aller à tout ce qui est à 1 étudiant, qui
serait notre structure d'étudiant.
Accéder avec un point et l'élément que vous voulez, et puis le réaffecter.
Il y avait une question.
L'ÉLÈVE: Oui, comment se fait-il à utiliser [inaudible] lorsque vous êtes
faisant étoiles étudiant sans [Inaudible] étudiant?
ALLISON: Parce que ce est la création d'un pointeur.
ROB: Nous allons en parler.
Allison: Nous allons parler à ce sujet plus tard dans la revue.
Il suffit donc de garder cette pensée.
Si cela vous dérange encore à la fin, venir parler à l'un de nous.
>> Donc, ce font exactement la même chose.
Nous sommes en train de vous montrer deux différentes façons de le faire.
Étudiant 1 est maintenant un pointeur, donc vous pouvez accéder à l'élément de Nom
à l'intérieur de la structure d'une flèche.
Ou vous pouvez déréférencer le pointeur, et puis y accéder comme vous le feriez normalement.
Est-ce que cela a un sens pour tout le monde?
Si l'ensemble des choses de pointeur sont un peu confusion, Gabe parler,
et puis peut-être cette aura plus de sens.
Oui?
>> L'ÉLÈVE: Oui, alors comment est ce différent de la?
ALLISON: le précédent?
Ainsi l'étudiant 1 dans cette cas est pas un pointeur.
Il est juste votre structure réelle.
>> L'ÉLÈVE: OK.
>> Allison: Alors que celui-ci est un pointeur vers une struct.
>> L'ÉLÈVE: OK, mais est-ce genre de finissent par travailler le même [inaudible].
>> ALLISON: Il fonctionne effectivement la même.
Votre syntaxe est juste différent.
L'ÉLÈVE: OK.
>> Allison: Oui, ils sont effectivement les mêmes.
Il est juste en fonction du contexte, vous voudrez peut-être l'un sur l'autre.
Oui?
>> L'ÉLÈVE: Quand vous faites les références à la 1--
ALLISON: Mm-hm?
ÉTUDIANT: Pourquoi vous faire ont les parenthèses?
ALLISON: Parce étudiant 1 est le pointeur.
Donc, vous devez vous assurer que vous êtes juste déréférencement du pointeur.
>> L'ÉLÈVE: OK.
>> ALLISON: Donc dans ce cas ici, les parenthèses autour d'elle
signifie que vous êtes étudiant déréférencement 1.
Donc, vous allez à l'endroit où l'étudiant 1 points, ce qui est votre structure.
Donc maintenant vous pouvez penser de celui-ci en tant que structure,
afin que nous puissions utiliser notre opération de point normal.
D'autres questions?
Cool, super.
>> Donc, dernière chose, je pense que est ma dernière diapositive, woo!
OK, le point imprécision si flottant.
Nous avons parlé brièvement cette conférence au cours.
Fondamentalement, nous avons une infinité de nombres réels.
Et si l'un de vous les gars aimer les mathématiques, il ya
toutes sortes de trucs cool avec nous.
>> Mais il ya une infinité nombres réels.
Mais ils sont seulement fini le nombre de bits que nous avons.
Donc, vous allez toujours ont imprécision, est tout.
Et voilà que tout semble se comme quelque chose que vous devez savoir.
Ce que nous pouvons vous demander pourquoi ne virgule flottante imprécision existe?
Il suffit donc de quelque chose que vous devez savoir.
Et avec cela, je me tourne au-dessus de pointeurs.
>> BINKY: Bonjour, les gars.
Binky de mon nom.
Je vais parler de pointeurs.
Ouais, donc des pointeurs est en fait ma partie préférée dans ce cours.
Il suffit donc de préciser ce que Allison a été question ici, de sorte que la raison
pourquoi-- la seule différence ici, La grande différence est la manière
nous déclarons choses.
Donc étoiles étudiant signifie cette est un pointeur vers un étudiant.
Alors que la lame avant, est un étudiant struct réelle, comme un étudiant réel,
contenant aucune de ces choses.
>> Et la raison pour laquelle nous vouloir to-- oui, Davin?
>> DAVIN: Qu'est-ce que la flèche signifie?
>> BINKY: Les moyens de direction exactement les mêmes que ce produit.
Donc, on n'a pas vraiment besoin de la flèche.
Comme, si vous êtes seul programme En C, vous pouvez simplement utiliser cette fonctionnalité.
Désolé, je ne sais pas ce qui est.
Vous pouvez simplement utiliser cette syntaxe.
>> Mais certaines personnes, quand ils concevaient C,
ils ont pensé que les gens utilisé cette syntaxe tellement,
qu'ils aiment juste de venir avec une structure de syntaxe pour cela.
Et cela a eu lieu dans la forme de cette flèche.
Et il est vraiment agréable, parce que il symbolise quelque chose
comme nous sommes en train de suivre cette flèche, ce pointeur,
vers l'espace dans la mémoire.
Et quand nous y serons, nous voulons regarder le nom de l'élève,
si cela fait sens.
D'accord?
>> Donc, ce sont exactement les mêmes.
Ceci est exactement la même chose que cela.
Ils se compilés exactement la même, OK?
Et la raison pourquoi ici nous malloc quelque chose, parce que dans ce cas,
notre variable est réellement juste une variable pointeur.
Donc, nous avons seulement un peu d'espace dans mémoire qui est titulaire d'un pointeur.
Nous ne disposons pas vraiment d'espace qui détient la structure réelle.
>> Donc, ce qui doit être fait en deux étapes.
Nous devons créer la la mémoire à la mise en structure.
Et nous devons créer la mémoire pour mettre le pointeur en.
Ils sont donc essentiellement deux différentes variables, ici.
L'un d'eux est de type étudiant, sauf qu'il n'a pas vraiment un nom.
Et l'autre est Type de l'étudiant étoiles.
Et puis étudiant 1 points là, si ce sens.
D'accord?
>> Donc, la raison pour laquelle nous utilisons pointeurs est que tout
dans un ordinateur, toutes les variables dans un ordinateur a deux choses.
Il a sa valeur.
Et il a son adresse.
Et une bonne façon de conceptualiser ce est qu'il n'y a
de nombreux problèmes lorsque vous essayer d'utiliser les fonctions.
Et nous allons essayer de se pencher sur l'un de ceux.
A savoir, il va penser de la mémoire comme des boîtes.
>> Vous avez toujours pensé que des variables quand vous dites na est égal à 5.
Vous pensez que de mettre 5 dans une boîte.
Alors que faire si vous voulez passer que int dans une fonction?
Vous pass-- juste que je ne sais pas know-- x dans une fonction.
Mais ce qui se passe est normalement en tant qu'êtres humains, vous
pourrait penser quelque chose comme je suis passage de la boîte à une personne.
Et il n'a pas vraiment arriver dans les ordinateurs.
Ce qui se passe est que vous copiez la valeur de la boîte de la boîte de la personne.
>> Donc ce que je veux dire est que si vous avez un function-- sorry-- ici,
si nous avons une fonction comme à cinq jusqu'à là, si vous essayez de passer une variable,
il va tout simplement à copier.
Si un nx d'initialisation est égal à 3, il va pour copier cette valeur à la variable a
là-haut.
OK, et ce genre est de la raison pourquoi nous voulons utiliser des pointeurs.
En raison de la place donnant juste la valeur,
au lieu de simplement en passant juste la valeur d'une fonction,
nous voulons passer par référence.
Ce que nous appelons passe par référence est en quelque sorte de donner la boîte à la fonction,
de sorte que la fonction peut également changer les valeurs dans cette boîte.
>> OK, si quelques-uns pointeur de base choses est de créer des pointeurs,
vous venez de le déclarer un type, et vous mettez une étoile juste après.
Et le type est juste ce que vous montrant.
Donc, si il est un int étoiles, vous pointez un int.
Si il est une star de char, vous montrant un graphique.
Et si elle est une star de l'étudiant, vous pointez un étudiant.
D'accord?
>> Et ils sont tous les 4 octets de long.
Parce que cette variable il ne fait pas réellement
besoin de tenir un char, un int, ou un étudiant.
Il suffit de tenir un discours.
Voilà pourquoi ils sont tous les 4 octets longue dans une machine de 32 bits normale.
D'accord?
Donc, ici, x est une variable qui indique à un int. Y points à char. des points z
à un flotteur.
Toute question ici?
Laisser refroidir.
Et il ya deux ils ont des symboles différents
garder à l'esprit lorsque venir au pointeur.
Donc, le référencement et la déréférencement sont les plus grands.
Donc, l'esperluette de la nom de la variable que vous la donne?
L'ÉLÈVE: Adresse.
BINKY: Adresse.
Donc, si vous déclarez un int est égal à 5, puis esperluette
d'un va vous donner l'adresse.
Et vous pouvez réellement essayer d'imprimer et que voir
quelle adresse en mémoire votre variable a.
Et puis dereferencing-- de sorte que faisait référence,
obtenir le déréférencement address-- est l'exact opposé.
OK, tout comme le temps est en face d'une division,
étoiles est à l'opposé de esperluette.
Alors moyens déréférencement y aller.
Donc, si vous donnez star-- je ne pas know-- 50, qui est
vais essayer d'aller à l'adresse de nombre de 50 à l'intérieur de votre ordinateur.
OK, pourquoi voyons-nous qu'ils sont opposés?
Parce que ce qui se passe si vous faites quelque chose comme une étoile esperluette?
Eh bien, une esperluette vous donne l'adresse d'une variable, l'adresse d'un.
Mais étoile signifie y aller.
>> Donc ce qui arrive si vous aller à l'adresse d'un?
Vous obtenez juste une, non?
Donc, aller à l'adresse de un est la même chose qu'un.
Voilà pourquoi ils sont généralement renvoyée à la same-- cette
et ce sont appelées opérateurs comme opposées.
D'accord?
So cool.
>> Sous le capot, par exemple, si nous déclarons int x est égal à 5,
nous avons une variable.
Et rappelez-vous que je l'ai dit tout variable-- et cela est une bonne chose
de garder à l'mind-- il a deux différentes choses associé avec.
Il dispose d'un compte et d'une valeur.
D'accord?
>> Ainsi, la valeur est dans ce cas 5.
Et l'adresse est-- disons, je suis faire quelque chose up-- il est 0x04.
Et la seule raison pour laquelle nous avons l'habitude représenter les adresses en hexadécimal
est un, parce qu'il est comme le bon.
Il va bien avec binaire.
Il est facile de convertir vers et à partir binaire.
Et ce ne soit pas trop grande si vous avez un très grand nombre.
Donc, nous aimons utiliser hexadécimal dans les adresses d'impression.
Mais je ne pouvais représenter cette forme d'entier.
Il est très bien.
>> Et il a une adresse 4 et une valeur de 5.
Et puis je l'ai dit pointeur int étoiles.
Donc ceci est un autre type, avis.
Int pointeur étoiles est égal l'adresse de x.
Alors, que va être la valeur de ptr?
Ça va être la adresse de x, ici-bas.
OK, donc la valeur va être la même que l'adresse.
Voilà la mission fonctionne que je fais.
Et puis ptr va avoir sa propre adresse, qui se révèle,
dans ce cas, la 8, OK?
>> Et puis je crée une nouvelle copie entier.
Et je dis int copie est égale à y aller.
Alors, allez à ce ptr pointe.
Eh bien, ce que cette ptr ont?
Ptr a 0x04.
Qu'advient-il si je tente d'y aller?
Je vais trouver le gars qui a adresse x et qui a l'adresse 4.
Et qui a l'adresse quatre est x.
Est-ce logique?
Oui?
>> L'ÉLÈVE: Dans ce cas, est le pointeur dans une pile?
>> BINKY: Dans ce cas, it's-- bonne question.
Je ne pense pas vraiment à ce sujet lors de la constitution de ces adresses.
Mais si cela est, comme tous ce sont des variables locales,
alors x va vivre in-- tout va vivre dans la pile.
Donc tout va être pointant à empiler.
Vous obtenez seulement le tas quand vous commencez à utiliser malloc, non?
>> Donc, si vous vous souvenez de la pile est à chaque fois vous appelez une fonction dans votre programme,
comme, par exemple principal, ou toute autre fonction, comme printf.
Toutes les variables locales sont allez obtenir mis dans un cadre de pile.
Et ils vont obtenir comme entassés dans la pile.
Voilà ce qu'on appelle une pile.
Et toutes ces variables locales vont être là.
Et la heap-- et nous allons pour parler plus sur ce later--
le tas est là tous allouée dynamiquement vie de mémoire.
Cool?
>> Nous allons à cette diapositive.
Oui?
>> ÉTUDIANT: Pourquoi pas int copie 0x04 retour?
>> BINKY: Pourquoi pas int copie 0x04 retour?
>> ÉTUDIANT: Pourquoi est-ce pas [inaudible]?
>> BINKY: Parce que ce qui est une valeur de ptr?
>> L'ÉLÈVE: 0x04.
>> BINKY: 0x04.
Qu'advient-il si vous allez à 0x04?
Qu'est-ce que vous obtenez?
>> L'ÉLÈVE: Oh, OK.
BINKY: Vous voyez?
L'ÉLÈVE: Oui.
BINKY: Donc, vous obtenez 5.
Donc copie va avoir 5, si cela fait sens.
Oui?
>> L'ÉLÈVE: Pourrions-nous avoir obtenu 5 dans la boîte de valeur [inaudible]
si nous mettons int copier [inaudible].
>> BINKY: Int-- nous le ferions, ouais.
Cela aurait fait à peu près la même chose.
Mais de cette façon, nous pouvons passer répondre à des fonctions.
Et qui est le truc cool nous allons faire maintenant.
>> Donc, ce genre d'exercice est toujours on-- vient très souvent sur des questionnaires.
Donc, il est vraiment bon d'essayer de faire ce genre de chose vous-même.
Donc, essayez de garder une trace de ce que l'adresse est et que vous voulez les valeurs des variables
sont à chaque point.
Donc, ceci est exactement ce que nous allons faire.
Ici, nous avons étapes, un, deux, trois, quatre, cinq.
Un, deux, trois, quatre, cinq.
Et nous allons suivre les valeurs de x et a.
>> Alors, que ce qui est fait, si cela est un Code buggy, nous essayons de faire à cinq.
Donc, nous essayons d'obtenir dans un variable et changer sa valeur à 5.
Et rappelez-vous mon analogie d'avoir un boîte et remettre la boîte à quelqu'un?
Alors principal a appelé cette case x.
Et elle contient la valeur 3.
Et je suis en train de remettre cette boîte à cinq.
>> Et je tiens à cinq pour changer la valeur de cette boîte à cinq.
Et puis je vous suffit d'imprimer la valeur de x.
Ceci est ce que mon function-- voilà ce que je suis en train de faire.
Je suis juste essayer de mettre à jour la valeur de x à 5.
Est-il clair que la fonction fait?
>> OK, alors qu'est-ce que va être la valeurs de x et un ici,
la première ligne, juste avant la première line-- je say-- du programme?
>> L'ÉLÈVE: Probablement ordures.
>> BINKY: Juste ordures choses.
Donc, je viens de mettre N / A. Si nous ne savons pas vraiment.
Comme, un n'a même existe pas encore, parce que nous ne sommes pas appelés à cinq.
Int est un pas déclaré.
Et x va exister ici, mais nous avons pas vraiment
attribué aucune valeur à, donc OK?
>> Et puis, qu'est-ce que va être la valeurs de x et un nombre à deux?
>> L'ÉLÈVE: [inaudible].
>> BINKY: Donc, x va être 3.
Rien de plus simple, parce que nous assignons à 3 il.
Et un ne existe pas encore car un juste vit dans cinq.
Donc, je vais avoir 3 et rien.
ou comme des ordures, que ce soit, pas vraiment défini.
Et maintenant, voici la ligne importante.
Ici, nous allons fait appel à cinq.
Et rappelez-vous ce que je disais.
Nous ne transmettons jamais dans la boîte.
Nous copions juste la valeur de la boîte à une autre boîte.
Voilà tous les ordinateurs, copiez choses d'un endroit à l'autre.
>> Donc, pour cinq ans, ce qu'il fait Est-il copie la valeur de x à un.
Alors, que va être ici?
Les valeurs de x et a.
3 et 3, nous allons simplement copier au-dessus de x à un.
Laisser refroidir.
>> Maintenant, nous sommes ici.
Et maintenant, nous allons à mettre à jour est égale à un 5.
Qu'est-ce qui va se passer dans la quatrième ligne?
>> L'ÉLÈVE: [inaudible].
>> BINKY: un est mis à jour, mais x ne sont pas mis à jour.
Parce x vit encore en principal, il est un complètement différent bloc de mémoire.
Il est une autre variable.
un autre est variable.
Ils arrive d'avoir la même valeur parce que je
copié sur la valeur de x à un.
Mais maintenant, quand je fais un égal 5, il ne pas effectuer réellement x en aucune façon.
Ceci est la partie délicate.
Est-il judicieux pour tout le monde?
Oui?
L'ÉLÈVE: Une dernière question, vous avez 3.
Pourquoi un already-- oh, non, il est 3.
Désolé, ça ne fait rien.
Je lis 5.
>> BINKY: Ouais, 3, 3.
>> L'ÉLÈVE: [inaudible], ouais.
BINKY: Et puis nous attribuons à 5 un, mais ne change pas vraiment x.
Bonne?
L'ÉLÈVE: Oui.
BINKY: Oui?
Pouvez-vous expliquer à nouveau comment un est copié [inaudible]?
>> BINKY: OK, donc quand vous appelez à cinq de x, si cette ligne de code ici.
à cinq de x, ce qui est x?
x est à seulement 3 en ce moment, non?
Ainsi, vous pouvez juste penser à mettre 3 ici et oublier x.
Il suffit de mettre un 3 ici.
Comme, nous allons copier sur le valeur de x à l'int un qui est là-haut.
D'accord?
>> Ainsi, la valeur de x est 3.
Nous allons copier sur 3 à un.
Et cet autre bloc de mémoire, cette autre variable
appelé une aura 3, ainsi.
Est-ce logique?
Oui?
>> ÉTUDIANT: Si vous donnez à cinq comme ont comme nombre entier x au lieu d'un,
serait que tout arranger?
>> BINKY: Si il est une integer-- pas, ce ne serait pas tout régler.
Voilà donc une très bonne question.
Il n'a pas vraiment d'importance ce que vous appelez ces variables.
Encore une fois, ce sera une question de portée, parce qu'ils ne sont pas la même x.
Ils sont complètement dans différents espaces mémoire.
L'ÉLÈVE: [inaudible].
BINKY: il ne le fait pas vraiment Peu importe ce que vous les appelez.
Cela ne résout pas les choses, OK?
Plus de questions?
Oui?
>> L'ÉLÈVE: Comment est-il de retour à nombre de cinq [inaudible]?
BINKY: OK, nous avons pas encore fait.
Allons au numéro cinq, alors.
>> L'ÉLÈVE: [inaudible]?
>> BINKY: Quoi?
>> L'ÉLÈVE: Avez-vous un retour à tous?
BINKY: Nous ne disposons pas un retour, pas de principal.
Cependant, les principales renvoie 0 automatiquement si vous ne retournez pas rien.
Oui?
>> L'ÉLÈVE: Pourriez-vous faire main-- ou pourriez-vous faire à cinq retour un?
>> BINKY: Nous pourrions avoir à cinq retourner une, oui.
Mais alors que nous aurions à attribuer x est égale à la valeur de retour de cinq,
ce qui serait un peu programme différent.
Il pourrait fonctionner.
Mais ce que nous voulons faire est ce qui est appelé changer quelque chose à la place.
Donc, nous voulons réellement changer cette boîte et vous inquiétez pas
d'avoir à retourner valeurs ou quoi que ce soit.
D'accord?
>> Ceci est juste comme la fonction de permutation David a montré en conférence, sauf que je suis
seulement face à une variable.
Et il a utilisé deux, donc int a et b et puis variable temporaire et ainsi de suite.
D'accord?
Alors, quelle est la dernière ligne?
Après cinq retours, il est simplement l'un va aller.
Nous ne verrons plus un, et seulement x sera toujours vivre.
>> Et devinez quoi? x ne pas modifier sa valeur,
après tout, parce que nous sommes seulement en changeant la valeur de a.
Voilà pourquoi x était de 3 partout.
D'accord?
Bon.
Donc, ce programme ne réaliser ce que nous voulions.
Maintenant, nous allons régler le problème.
>> Et le programme de correction est l'utilisation de pointeurs.
Ce que nous faisons est que nous avons trois les lignes qui sont différentes.
Les premiers est que nous sommes ne passent pas x.
Nous passons l'adresse de x.
Ainsi, au lieu de copier sur la valeur de la boîte,
Je vais quand même de copier quelque chose.
Mais je suis sur la copie l'adresse de la boîte.
>> Donc, si je passe l'adresse de la boîte à cinq, puis à cinq
sera en mesure de constater que dans mémoire et changer sa valeur.
>> Alors et alors là, je dois que ne constitue pas un int plus.
a est un int étoiles.
Il est un pointeur sur un entier.
Et puis, parce que je suis de passage le adresse ici, et puis ce que je fais
est pas un est égal à 5, parce que un tient une adresse.
Donc ce que je veux faire est d'aller là-bas et mettre à jour le contenu de cette adresse
à 5.
>> OK, donc nous allons passer par l'ensemble de lignes une par une.
Alors, quand je commence ici, je avoir toujours N / A, N / A, N / A
pour tout dans la première ligne, parce que je ne ai pas vraiment
encore déclaré choses.
Et puis la deuxième ligne, je dois x est égal à 3.
Un int étoiles A ne pas exister, même chose qu'avant.
>> Maintenant, ça devient intéressant.
Donc, je vais passer.
Et supposons que l'adresse de x est 12 en hexadécimal.
Disons simplement supposer cela.
Je l'ai fait jusqu'à.
Donc, ce que je passais ici est un à cinq.
Je suis de passage 12.
>> Alors quelle valeur ont un?
>> L'ÉLÈVE: [inaudible].
>> BINKY: Désolé?
>> L'ÉLÈVE: [inaudible].
BINKY: Ouais, comme, à laisser de supposons que nous sommes ici, maintenant.
Je demande.
>> L'ÉLÈVE: [inaudible].
>> BINKY: Il a été initié.
>> L'ÉLÈVE: [inaudible].
BINKY: Parce que nous sommes passés quelque chose de la fonction.
Oui?
>> L'ÉLÈVE: Adresse de x.
BINKY: Ça va avoir l'adresse de x.
Et l'adresse de x est 12, bon.
Donc, x va être 3, parce que nous ne sommes pas vraiment changé x encore.
Et puis un va être 0x12, si l'adresse de x, parce que ce
ce que nous passons à cinq.
>> Et puis ce qui se passe si nous essayons d'y aller?
Qu'allons-nous trouver?
Donc, si vous essayez d'imprimer une étoile, nous allons suivre cette adresse
et obtenir la valeur à l'intérieur.
Et la valeur est juste la même valeur que x
a parce que ce la adresse de x, qui sera 3.
Sommes-nous bien?
>> OK, et puis maintenant, nous y allons en fait.
Et tout ce que nous mettons à jour est dans cette adresse 12.
Il est 5.
Alors maintenant, x et une étoile sont 5.
>> Pourquoi donc?
Comme l'adresse de x est 12.
Et a aussi un 12 comme valeur.
Donc, si nous suivons 12, nous sommes aller juste pour trouver x.
Donc, tout ce que nous faisons avec étoiles un qui va se passer
à x, car un contient l'adresse de x.
D'accord?
>> Et cela est comme le point crucial de la solution.
Alors maintenant, nous sommes en mesure, de cinq, en fait
accès mémoire qui vivait dans principal.
Donc cette mémoire ne vit pas pour cinq, comme avant, cette adresse 12.
Et nous avons pu y aller et changer sa valeur à 5.
>> Et puis quand nous reviendrons, nous oublions un.
Nous oublions étoiles a.
Et x est encore cinq.
Donc, si vous voulez mettre en œuvre une fonction de permutation,
vous suffit de faire exactement la même chose, sauf que vous devez int étoiles ici,
et ainsi de suite et ainsi de suite.
D'accord?
Sommes-nous bien?
Laisser refroidir.
>> Donc, l'arithmétique des pointeurs.
Ceci est un sujet un peu délicat.
Ainsi, il apparaît que pointeurs ne sont que des nombres entiers.
Vous pouvez les considérer comme des entiers.
Parce que dans la mémoire, vous avez comme mémoire adresse zéro, un, deux, trois,
quatre, cinq.
On peut donc résumer les adresses de mémoire.
>> Et qui est généralement ce que vous faites quand vous êtes en réseau et, par exemple.
Un tableau est comme un contiguë bloc de mémoire, de beaucoup de caractères,
par exemple, beaucoup de ints.
Donc, si vous voulez aller à la deuxième int ou à la troisième int,
il vous suffit de résumer quelque chose pour la première adresse, et vous allez y arriver.
Donc, cela est vraiment utile pour cela.
>> Et la chose à garder dans l'esprit, cependant, est
qu'il est pas comme juste arithmétique normale dans le sens
que si vous faites affaire avec, par exemple, un int étoiles, et vous ajoutez 1 à il,
alors tu ne vas pas à ajouter 1 à l'adresse,
vous allez ajouter 4 à l'adresse.
Parce que un int est de 4 octets.
>> Donc, cela est tout comme marcher sur un tableau.
Si nous avons un tableau de lots d'entiers et alors nous essayons d'aller à la seconde,
il est fondamentalement juste additionnant les l'adresse de la première de plus 1.
Mais ce ne sera pas juste être-- disons que l'adresse de la première est 4.
Ici, dans ce cas.
Et si nous résumons, si ce est ce qui se passe.
Nous avons un int.
Int x est égal à 5.
X a une valeur de 5.
Et on initialise ce pointeur, int y int étoiles y est égal à l'adresse de x.
>> Supposons que l'adresse de x est 4.
Qu'est-ce qui va se passer Maintenant, si je résume ajouter 1 à Y?
Il va en fait somme de 4 au lieu de seulement 1.
Donc je ajouter un 1, mais il en fait ajoutée 4, parce que l'ordinateur est intelligent.
Donc, il va en fait ajouter par i fois la taille du type de pointeur.
D'accord?
>> Donc, si elle était un char, par exemple, si cela était un omble étoiles y,
et si nous avons ajouté 1 alors ce serait être 5, parce que l'omble est longueur de 1 octet.
Bonne?
>> Et finalement, nous sommes arrivés à pointeurs et les tableaux.
Il se trouve que chaque fois vous avez affaire à un tableau,
vous êtes en train de traiter avec un pointeur.
La très belle raison conceptuelle pour cela est que les tableaux sont très grandes.
Donc me souviens que je disais que chaque fois que vous passez choses autour,
vous copiez tout.
Donc, si vous avez un tableau qui est vraiment, vraiment grand,
vous ne voulez pas vraiment copier tout à chaque fois
vous passez à un autre autour de fonction, parce que ce juste
des quantités massives de travail.
Donc, ce que vous faites est juste passé l'adresse du premier octet.
Et puis la fonction aura accès à tous les éléments de cette matrice.
Donc vous avez passé le tableau par son adresse, si l'adresse du premier octet.
>> Donc, si nous déclarons int tableau 3, ici, nous savons
la façon d'accéder au premier élément en utilisant la notation de support.
Si vous vous souvenez du support notation, tableau support 0 est égal à 1.
Eh bien, ce serait exactement la même comme juste y aller et mettre 1.
OK, est exactement la même chose.
Ainsi, la notation de support ici sera le même que celui de cette ligne.
>> Et devinez quoi la notation de support pour un tableau support 1 sera?
Ce sera juste la même chose que cela.
Donc, ajouter un à la matrice.
Déplacer un long mémoire.
Allez-y, et mettre un 2.
D'accord?
Et cette ligne est la même chose.
Nous voulons aller à la troisième boîte, de sorte gamme plus 2.
Allez-y, et de mettre un 3.
Donc, dans la mémoire, ce qui est qui va se passer est que nous sommes
va avoir 1, 2, et 3 comme le trois éléments de ce tableau.
>> Nous aurions pu faire cela en utilisant notre notation de support familier.
Je veux juste vous les gars de savoir qu'ils sont la même chose.
OK, les questions à ce sujet?
Nice.
Maintenant, je vais remettre la parole à Hannah,
>> HANNAH: Yay, yee-haw.
>> BINKY: Parler mémoire et de l'article choses.
[Applaudissements]
>> HANNAH: Salut, cool, alors nous sommes va parler un peu plus
sur la mémoire, que nous venons abordé l'utilisation de pointeurs.
Donc, il ya deux parties principales de mémoire qui nous intéresse.
Nous avons la pile, qui pousse dans le fond, et le tas, qui
descend du haut.
Et la pile va tenir l'ensemble de nos variables d'instance.
Ainsi, chaque appelle à une fonction obtient son propre petit cadre sur la pile.
Alors que Gabe mentionné plus tôt, si nous appeler encore et encore la fonction,
nous allons empiler les choses sur la pile.
>> Et de même, le tas, qui commence au sommet
va tenir toute la mémoire que nous allouer dynamiquement.
Et comme nous dynamiquement allouer de la mémoire,
cette descendra vers le bas.
Couple choses à savoir quand nous utilisons la pile et le tas,
avec la pile, si nous avons trop many-- nous allons say-- appels récursifs,
et nous appelons à nouveau une fonction, et encore, et encore, et encore,
et il est empiler, empilage, l'empilage vers le haut.
Et il va s'écraser dans le tas.
Nous allons manquer de mémoire.
Cela va provoquer une problème de l'ordinateur.
Et qui est ce qu'on appelle le débordement de pile.
Voilà donc certainement quelque chose que vous devraient être conscients et essayer d'éviter.
Et le tas, à se souvenir pas de fuite accidentelle mémoire.
Chaque fois que vous utilisez malloc, ne pas oublier de libérer la mémoire.
Sinon, ce sera juste être sur le tas perdu,
et l'ordinateur ne saura pas que il est libre d'utiliser cette mémoire.
Donc, ce sont quelques choses être très prudent avec quand
vous avez affaire à la pile et la pile.
Vous avez des questions à cet égard?
Impressionnant.
>> OK, cool.
Donc ce genre de a la même idée débordement de pile, où
nous allons au-delà de la limites de ce mémoire
est que nous sommes censés être en mesure d'utiliser.
Alors, prenez, par exemple, un tampon, ou vous pourrait juste penser à elle comme un tableau.
Et nous l'avons dit, OK, nous allons créer ce joli petit tableau.
Ça va être une chaîne.
Ou il va stocker les caractères.
Et il va juste dire bonjour.
Et il est indéterminée.
Ce est tout.
>> Mais si je devais quelqu'un mal et je voulais faire quelque chose de mal avec ce tableau, ce
Je pourrais faire est d'essayer d'écrire après la fin de la chaîne.
Et comme vous le verrez, si Je vous écris assez loin,
Je peux effectivement affecter l'adresse de retour.
Et si je commence à affecter l'adresse de retour,
Je affecter la façon dont le programme fonctionne réellement.
Et au lieu de rentrer, vous savoir, une chaîne heureux comme bonjour, je
pourrait faire quelque chose de mauvais, comme aller à ailleurs dans votre ordinateur, encore
mémoire, modifier, tout ce que je veux faire.
Voilà ce que ce serait ressembler est si je sorte de l'a rempli
avec la valeur des ordures aléatoire, dans ce cas, juste une.
Et puis, quand je fait obtenu à l'adresse de mémoire,
Je commencé à se remplir avec quelque chose qui fait ce que je voulais faire.
Toute question débordement de tampon?
Impressionnant, volant à droite à travers ce genre de choses.
>> OK, donc nous avons beaucoup parlé de à propos des pointeurs avec Gabe.
Comment pouvons-nous réellement un pointeur?
Comment pouvons-nous obtenir une adresse en mémoire?
Eh bien, nous pouvons utiliser cette belle appel de fonction malloc, qui
va obtenir un petit morceau de mémoire,
en particulier dans le tas, comme nous en avons discuté,
et il va vous redonner une pointeur vers cette adresse en mémoire.
Et l'argument selon lequel nous avoir à donner à malloc
est la quantité d'espace dans la mémoire que nous voulons.
>> Ainsi, vous pouvez voir la taille en octets.
Disons, par exemple, ou en fait, dans cet exemple,
nous allouer suffisamment espace pour 10 entiers.
Donc probablement ce que nous allons vouloir de mettre ici est un tableau de 10 entiers.
Donc, nous lui donnons la taille d'entiers, qui avons appris combien d'octets?
L'ÉLÈVE: 4.
HANNAH: 4, belle, et nous 10 vouloir de ceux qui sont en ligne,
de sorte que nous avons assez d'espace pour stocker tous les 10 entiers, dans ce cas.
Quelque chose super important, chaque fois que vous appelez malloc,
vous devez vérifier nulle.
Si vous ne cochez pas nul, bien, malloc cas d'épuisement de l'espace
et ne peut plus vous donner tout plus de mémoire, il sera de retour nul.
Donc, si vous ne cochez pas, malloc peut retourner null.
Et puis si nous essayons de déréférencer un pointeur NULL,
nous allons obtenir une erreur de segmentation, que nous allons parler maintenant.
Impressionnant.
>> OK, les questions avec malloc?
Oui?
>> L'ÉLÈVE: Est-ce que la vérification null [Inaudible] ne pas le faire sur le quiz?
>> HANNAH: Bien sûr, la question était il ne matter-- sur le questionnaire,
vous obtiendrez des points de si vous ne cochez pas nul?
Oui, vous obtiendrez des points de Si vous ne cochez pas la valeur NULL.
Chaque fois que vous appelez malloc, à la fois sur le questionnaire et vos psets et dans la vraie vie,
vous devez vérifier nulle.
Bonne question.
>> GABE: Que faire si je ne libère pas?
HANNAH: Gabe veut savoir si nous ne le faisons pas libre.
Ensuite, nous aurons une fuite de mémoire dans notre tas.
D'autres questions?
Oui?
>> L'ÉLÈVE: Peut vous-- aller sur les débordements de buffer rapide à nouveau?
>> HANNAH: Bien sûr.
La question était peut-on aller sur débordement vraiment rapide tampon.
Revenons à ces diapositives.
Ainsi, un tampon, vous pouvez simplement penser comme un tableau, non?
Vous avez un peu d'espace dans la mémoire.
Et lorsque nous créons notre premier tableau, nous savons réseaux fixes taille,
ou notre tampon a une taille fixe.
>> Donc, disons que dans ce cas, nous avons juste assez d'espace pour écrire la chaîne bonjour.
Si nous dépassons cette limite, si nous dépassons ce que notre gamme nous a dit qu'il pourrait tenir,
nous pourrions commencer écriture dans la mémoire
que l'ordinateur ne fonctionne pas vouloir nous écrire en.
Et précisément, si nous avons atteint quelque chose comme le retour
adresse de la fonction, qui, comme toute autre pièce de la mémoire,
est juste quelque part dans votre ordinateur, vous pouvez réellement
changer cela et commencer à faire de mauvaises choses.
Répondre à votre question?
Impressionnant, autre chose?
Oui?
>> Etudiant: Ainsi empiler [inaudible], vous dit d'aller de bas en remontant.
Dans la gamme de la pile, ne la mémoire vont de, comme,
de haut en bas se rapportant à chaque pause?
>> HANNAH: Comment faire vous-- reporter à Rob sur celui-ci.
>> ROB: Il va grandir dans le même direction que la pile grandit.
HANNAH: OK.
ROB: Je vous trompez.
Cela va être de l'abstraction.
HANNAH: OK.
ROB: Cela est vrai.
Ainsi, si la pile est de plus en plus le haut, puis il generally--
n'a pas à être comme ça. mais vous pouvez déclarer int x.
Ensuite, vous déclarez int y.
Puis int x sera généralement inférieur sur la pile de int y.
Mais qui est juste un fait.
Cela ne veut pas comme une chose importante de semences.
>> ROB: Donc la question était de nouveau ce qui se passe chaque image se forme.
Ainsi, chaque fonction obtient un petit morceau de la pile.
Et pendant que vous montez, dans ce petit morceau, dans ce cadre,
nous dirons que les variables dans ce cadre déplacer également en hausse.
Question?
>> ROB: Juste pour être sur micro.
HANNAH: Oh, oui.
ROB: Je vais parler en vous.
HANNAH: Oh, oui, OK.
ROB: L'exception est pour les tableaux et les Structures,
où les tableaux, une plus faible index dans le tableau,
et dans structs supérieur à domaine dans les struct
sont garantis d'être à des adresses plus bas à une valeur plus tard dans la baie.
Donc, ceux-ci sont garantis.
Mais toutes les variables particulières à l'intérieur, comme int x et y int dans une fonction,
il n'y a pas nécessairement de relation entre leurs adresses.
HANNAH: Une autre question ici?
Etudiant: Ainsi dans un tampon de flux, seulement Buffer Overflow
arrivé seulement quand vous ont, comme, attribué
une quantité d'une matrice que puis est plus grande?
Comme, pouvez-vous?
Donc, si vous vous demandez quelque chose de la user--
>> HANNAH: Mm-hm.
L'ÉLÈVE: Peuvent-ils de force vous donner quelque chose en retour
qui est plus grand que tout ce que vous avez alloué pour eux?
HANNAH: Bien sûr, si la question était essentiellement,
l'utilisateur peut vous donner plus que vous demandez?
L'ÉLÈVE: Oui.
HANNAH: Eh bien, vous pourriez éviter l'utilisateur de le faire.
Vous pourriez dire précisément ne pas me donner plus de x nombre de bytes
Je ne vous ai donné la chambre pour x nombre d'octets, le nombre de caractères x.
Voilà donc quelque chose que vous voulez éviter.
Oui?
Quelle est la différence entre Stack Overflow et un débordement de tampon?
>> HANNAH: OK, donc la pile overflow-- oh, ce
est la différence entre la pile débordement et de débordement de tampon?
Donc, nous voulons penser à débordement pile passe quand nous sommes réellement
l'empilage de ces appels de fonction.
Disons que vous avez une fonction récursive, parce que nous savons que chaque fois que vous
appeler une fonction, il est obtient sa propre trame sur la pile.
>> Donc, nous nous classons trop élevé, et puis nous commençons à déborder.
Et nous utilisons trop de mémoire, et nous ne sommes nulle part à gauche.
Nous obtenons cette erreur.
>> Débordement de tampon est dans un programme.
Nous voulons peut-être pas nécessairement à court de mémoire de la même façon
que nous pourrions si nous empilage un si grand nombre d'appels de fonction,
mais nous écrivons passé la mémoire que nous savons que nous pouvons utiliser.
Et qui nous permet de faire de mauvaises choses.
Ouais?
>> ROB: Oui, vous voudrez peut-être à répéter ce,
mais vous pouvez aussi penser d'un débordement de pile
que comme un type spécifique de dépassement de mémoire tampon.
Ou vous pensez juste de votre empiler comme un très gros tampon.
Puis, quand vous débordez vous empilez, il est un peu comme un dépassement de mémoire tampon.
Mais un débordement de pile est juste un terme spécifique utilisé lors de la pile
elle-même déborde.
>> HANNAH: Bon, alors à répéter pour la vidéo,
il que vous pouvez penser de débordement de pile comme un type spécifique de débordement de tampon.
Cool?
D'autres questions avant de passer?
Impressionnant.
>> OK, cool, donc parlons certains messages d'erreur courants.
Ceci est quelque chose qui a montré sur plusieurs questionnaires,
donc quelque chose qui vaut la peine prendre un deuxième coup d'oeil.
Je suis sûr que vous avez rencontré au moins une partie de ceux-ci
comme vous faites votre problème fixe.
Donc, assurez-vous que vous pouvez parler à leur sujet sur le questionnaire.
>> Ainsi, la première est une une erreur de segmentation.
Et ça peut nous de temps tenter d'accéder à la mémoire
que nous ne sommes pas autorisés à accéder.
Donc, vous avez vu ce MIGH, par exemple, dans cassure.
Si la détection de collision null, et puis vous
essayé de faire quelque chose avec cette valeur de zéro,
l'ordinateur donnerait vous une erreur de segmentation.
Donc, un, une chose importante à faire pour essayer d'éviter ce
est de toujours vérifier pour nulle.
>> Vous avez peut-être également vu déclaration implicite de la fonction.
Donc voilà ce qui arrive quand Allison vous a montré
comment nous faisons un prototype, non?
Alors disons que nous avons une certaine fonction que nous définissons.
Disons cube.
Et cela va au fond de notre fonction, en vertu principale.
>> Si on oublie de dire à l'ordinateur sur cube, lorsque principal tente d'appeler cube,
l'ordinateur sera, comme, oh mon dieu.
Je ne sais pas ce que cela signifie.
Je ne sais pas quoi faire, ici.
Ainsi, le prototype dit ne vous inquiétez pas.
Je vais vous le dire.
>> Il va venir.
Ne me crie pas dessus.
Ne me donnez pas un implicite déclaration de la fonction.
Donc, si vous obtenez cette erreur, une chose que vous allez vouloir faire
est assurez-vous que vous avez votre prototype.
D'accord?
>> Et last but not least, identificateur non déclaré
est essentiellement lorsque vous essayez d'utiliser un variable que vous avez pas déclaré.
Donc, tout d'un coup vous commencez dire comme n plus plus.
Et l'ordinateur dit ce qui est n?
Vous ne m'a jamais dit n était une chose.
>> Donc, une chose que vous devez vous assurer que vous fait est de dire à l'ordinateur ce n est.
Ainsi, par exemple, n peut être un nombre entier.
Et puis vous éviter cette erreur.
Des questions sur les erreurs courantes?
Oui?
>> ÉTUDIANT: Pour l'implicite déclaration de fonction,
pourrait-il être aussi que vous avez omis une des bibliothèques que vous deviez
à inclure, plutôt que le prototype?
>> HANNAH: Bon, alors le question était, pourriez-vous
aussi obtenir cette erreur si vous oublié d'inclure une bibliothèque.
>> L'ÉLÈVE: Oui.
>> HANNAH: Absolument, en raison de la même manière
que nous voulons mettre nos prototypes avant que la fonction principale,
si nous avons une bibliothèque, ceux vont à inclure essentiellement les prototypes,
inclure les définitions des fonctions.
Grande question.
>> ÉTUDIANT: Pour une segmentation la faute, ce que cela aussi
passerait-il si nous, comme, essayé à accéder à une variable,
comme, dans un autre [inaudible] qu'il a été déclaré dans?
HANNAH: Bien sûr, il en serait de nous obtenir une erreur de segmentation
si nous avons essayé d'accéder à un variables hors de portée?
Etait-ce une question?
L'ÉLÈVE: Oui.
HANNAH: Belle.
Donc probablement, vous allez obtenir une noir erreur d'identification à la place.
Donc, il va juste dire Je ne sais pas ce qui est.
Cool, autre chose?
Ouais, OK, belle.
>> Tous droitier, si la récursivité.
Donc je l'ai mentionné à quelques reprises que nous pourrions obtenir un débordement de pile
parce que nous appelons notre fonction récursive tant de fois.
Nous recevons tous ces pile cadres, blah, blah, blah.
Ce qui est encore une fonction récursive?
Eh bien, une fonction récursive est toute fonction que lui-même appelle.
>> Quelques choses à savoir quand vous mettent en œuvre des fonctions récursives,
ne pas oublier d'inclure un scénario de base.
Un scénario de base est la point où nous nous retrouvons.
Ainsi, par exemple, si nous codage, , Dire, Fibonacci récursive,
nous voulons nous assurer que lorsque nous obtenons pour la ou le premier numéro 0 de Fibonacci,
ces deux nombres ont ces cas, parce que ce ne sont pas dépendants
sur des choses qui sont venus avant.
Ceux-ci ont leurs propres valeurs.
>> Certains pros à la récursivité, ce qui est un question que nous avons vu sur des questionnaires passés.
Ils peuvent conduire à plus concise, le code élégant.
Et un grand nombre de fonctions, un beaucoup de différents algorithmes,
en fait se prêter à la récursivité.
Leur définition est peut-être récursives et de lui-même.
Donc Fibonacci est un.
Factorielle est une.
Fusionner tri est One-- tous choses que vous pouvez regarder.
OK, des questions?
Oui?
>> L'ÉLÈVE: Est un cas de coin similaire à un cas de base?
Ou est-ce pour une autre genre de [inaudible]?
>> HANNAH: Bien sûr, si une coin affaire est donc any--
est le même coin cas comme cas de base?
Un cas de coin est tout ce que votre code pourrait comporter un peu différemment.
cas de base est en quelque sorte lié, dans qu'ils sont comme des cas particuliers
que vous voulez regarder.
Mais l'idée d'un scénario de base est que vous voulez que votre fonction récursive
à arrêter à un moment donné.
Il ne peut pas garder elle-même appel à jamais.
Il faut arrêter à un moment donné.
>> ROB: Oui, souvent, vos affaires de base pourraient être des exemples de bases de coin.
>> HANNAH: droit, cool, rien?
>> L'ÉLÈVE: Pourriez-vous expliquer fonde un peu plus?
Je ne comprends pas très bien [Inaudible] cas de base.
>> HANNAH: Des cas de base?
>> L'ÉLÈVE: cas de base, oui.
>> HANNAH: Oh oui, bien sûr.
Voyons.
Avons-nous la craie ici?
Oui, nous le faisons.
OK, donc très rapidement, je vais essayer d'écrire assez gros
de sorte que vous pouvez voir sur l'écran.
Parlons, vraiment rapidement, Fibonacci.
Donc, je vais vous donner la suite de Fibonacci.
Vous pouvez rechercher la définition.
>> Essentiellement, chaque élément de la séquence est la somme des deux nombres précédents.
OK, donc la façon dont je vient d'être décrit Fibonacci,
vous pourriez entendre la récursion, non?
Quand je l'ai dit chaque nombre est la somme des deux nombres précédents,
nous pourrions dire OK.
Eh bien, la nième Fibonacci number-- nous allons donc
dire que nous avons cette fonction appelée fib fib-- de n
va être égale à fib de n moins 1 plus-- désolé,
nous allons passer à la ligne suivante sur fib ici-- de n moins 2.
>> OK, donc cela fonctionne très bien si vous êtes examiner, par exemple, la valeur zéro, un,
deux, trois, quatre, cinquième nombre de Fibonacci,
où vous pouvez dire que La figure 5 est égal à 2, plus 3.
Mais que faire si vous êtes au début?
Que faire si vous êtes juste de frapper ces deux premières valeurs?
>> Pour obtenir ce 1, vous ne pouvez pas dire ajouter les deux précédents,
parce que nulle et-- Je ne sais pas.
Donc, à un moment donné, il faut arrêter.
À un certain moment, nous avons besoin de dire que ces deux ont juste leurs propres définitions.
Le nombre de Fibonacci est 0 0.
Et le premier nombre de Fibonacci est 1.
>> Donc, la façon dont je puisse coder, je dirais que si n est inférieur à deux,
puis juste retour n.
Et ce serait mon scénario de base.
Voilà comment je sais à arrêter avec une fonction récursive.
Est-ce clair?
Impressionnant.
Tout le reste sur la récursivité?
Belle.
>> De laisser rapidement parler recherche et de tri gérés fois.
Et puis, je vais vous donner quelques Davin temps de parler des exemples de codage.
Voici donc la recherche principale et sortes que vous devez connaître.
Guarantee-- je ne peux pas garantir, parce que je ne l'ai pas vu la quiz--
mais cela vient jusqu'à questionnaire après test après cesser de fumer.
Donc certainement utiliser ce tableau.
Comme, prendre ce tableau.
Mettez-le sur votre feuille de triche.
Vous serez une personne heureuse.
>> Cela nous indique les temps d'exécution de chaque de ces algorithmes de tri et de recherche.
Donc, la recherche linéaire, vous pouvez voir terme temps, et même avec recherche binaire.
Allez sur ce que ces algorithmes faire, l'idée générale.
Regardez quelques-unes pseudo, sinon lui-même code.
>> Vous verrez que la bulle a une sorte supérieure lié dans le pire des cas de n carré.
Donc, si notre réseau est complètement en arrière avant que nous voulions faire le tri,
nous dirions que ce est va prendre des mesures n carrés.
Mais, dans le meilleur des cas, de sorte que le limite inférieure pour le meilleur des cas
va être si elle est déjà parfaitement triés.
Alors tout ce que nous avons à faire est vérifiez qu'il est bien triée.
Y at-il une question ici?
>> L'ÉLÈVE: Quand serait vous souhaitez utiliser sorte?
Le genre.
Je suis juste curieux.
>> HANNAH: Quand souhaitez-vous voulez utiliser la sélection sorte?
Celui-ci?
Celui qui est n au carré dans les deux cas?
>> L'ÉLÈVE: [inaudible].
>> HANNAH: il est donc très différent.
Si vous avez spécifique exigences de votre programme,
comme des choses comme si nous venons de dire mettre en oeuvre une sorry-- search--
mettre en œuvre une sorte, vous aurez voudrez probablement aller
pour l'un de ceux que a un meilleur cas de n,
ou une borne inférieure dans le meilleur des cas de n.
Mais il pourrait y avoir certaines choses comme, par exemple,
swaps sont vraiment cher pour une raison quelconque.
Ensuite, vous voulez faire tri à bulles, parce que vous
avoir à faire beaucoup swaps, des choses comme ça.
Toute oui other--?
>> L'ÉLÈVE: Serait-il [inaudible] de dire que [inaudible]?
HANNAH: Voilà une chose que diriez-vous à
Si vous êtes à la recherche à la mise en œuvre.
La façon dont je voudrais en fait penser pourquoi il est n
carré est que nous devons courir grâce à notre tableau de longueur n,
chaque fois jouant au plus, n swaps.
Et nous avons à faire ce processus n fois.
>> Ainsi, lorsque vous avez à faire au plus n swaps et N traverse le tableau,
il va y avoir de n carré.
Mais oui, ce sera révélé par cette double boucle,
que la question asked-- ou imbriquée boucle, je dois dire.
D'accord?
>> Et puis le tri par fusion, qui est le genre le plus rapide que nous aujourd'hui,
ou que nous avons couvert en CS50, sait que l'algorithme principal est
cette idée de rupture dans morceaux triés, puis
fusionnant ces bits triés.
Et va nous amener log n log n.
Des questions sur les recherches et sortes avant de céder la parole?
Voyons.
>> Oh, les listes chaînées.
Désolé, je dois un sujet plus.
OK, impressionnant, lié listes.
Problème avec les tableaux, ils ont une taille fixe.
Donc, si vous ne savez pas quelle taille votre entrée va être,
vous ne voulez pas créer un tableau.
Parce que si nous créons une matrice qui est trop petit,
nous pourrions courir en dépassement de mémoire tampon.
>> Ainsi, au lieu, nous pourrions faire quelque chose avec les listes chaînées, qui
nous permet d'avoir une dynamique structure de données de taille
qui va nous permettre de stocker une montant plus souple des données.
Donc, au sein de chaque nœud dans notre liste chaînée, nous avons deux pièces.
Nous avons la valeur réelle qu'il stocke.
Voilà donc juste la chose que vous feriez voir dans le tableau, par exemple.
Et puis nous conservons également un pointeur vers la prochaine chose dans la mémoire.
>> Contrairement aux tableaux, qui nous savons allons tous
à être-- éléments du tableau sont tous un après l'autre dans memory-- lié
listes pourraient être n'importe où dans la mémoire.
Ils sont des emplacements arbitraires.
Donc, si nous étions à en fait aller les trouver, nous
besoin de garder une trace de la prochaine chose dans notre liste.
>> Et puis pour savoir où cette liste dans son ensemble est,
tout ce que nous avons à suivre est la premier élément de notre liste chaînée.
Et ça va nous permettre de suivre à travers.
>> Voilà donc comment vous pouvez définir un mode.
Ceci est une grande opportunité de profiter de structures.
Parce que vous avez cette idée, bien, pour un noeud donné, je dois deux pièces.
Je dois la valeur elle-même.
Et puis je dois un pointeur vers la élément suivant dans la liste chaînée.
Donc, vous voyez, nous avons un entier n, qui va être la valeur réelle,
et puis un pointeur vers un noeud, appelé suivante.
Alors que va être la prochaine élément dans notre liste chaînée.
L'ÉLÈVE: Oui?
Avez-vous de préciser que l'étoile est comme une structure?
>> HANNAH: Oui, depuis cette est presque comme une sorte de,
il semble comme un récursive définition par le fait que nous
besoin de savoir ce qu'est un nœud est à l'intérieur pour trouver un nœud.
Etant donné qu'il ne fait savoir ce qu'est un nœud est complètement
jusqu'à ce que nous arrivons à la fin de this-- et après cela, nous pouvons l'appeler simplement
un node-- à l'intérieur de cette définition, nous devons appeler un noeud de structure.
Grande question.
Rien d'autre?
Oui?
>> ÉTUDIANT: Pourquoi avons-nous dois dire nœud deux fois?
Parce que quand nous étions en [inaudible] nous avons juste eu à le faire en virgule,
mais maintenant, nous devons constater que noeud de structure? [Inaudible].
HANNAH: Je crois dans le dernier exemple,
nous étions juste en train de créer à tout moment vous voulu utiliser un élève après cela, vous
dû utiliser struct node-- Je sorry-- struct étudiant.
Cela nous a permis de, après le fait, tout simplement utilisation nœud ajouter un nouveau type, essentiellement.
Ce sens?
Il faudrait donc revenir en arrière et regarder le code avant.
Mais je dirais que on n'a pas utilisé typedef.
Et nous avons demandé à la question, Pourquoi avons-nous besoin d'utiliser typedef?
Typedef nous permet d'éviter la mot struct au début.
Oui?
L'ÉLÈVE: Quel genre de questions seraient venir
en termes en termes de nœuds et les listes chaînées?
>> HANNAH: Donc, une chose est que nous pourrions dire comment pourriez-vous chercher dans une liste chaînée?
OK, parce qu'il est un peu plus compliqué
que si nous sommes à la recherche à travers un réseau.
Nous pouvons simplement regarder élément zéro, un élément, élément deux, blah, blah,
bla.
Si nous voulons rechercher par une liste chaînée,
nous serions réellement devons suivre ce petit labyrinthe de pointeurs.
Donc, nous allons effectivement aller à travers ce très rapidement.
Ce que nous pourrions faire dans commander to-- disons nous
veulent juste itérer notre liste entièrement lié.
Nous pourrions commencer à la tête.
Et puis pour déplacer vers l'élément suivant,
au lieu d'une incrémentation par comme nous pourrions en passant par un tableau,
nous allons en fait suivre le pointeur suivant,
afin que nous puissions trouver où dans mémoire l'élément suivant est.
Donc, je sais qu'il ne suffit pas à prendre tout cela en ce moment,
mais vous aurez ces diapositives.
Ainsi, vous pouvez passer par ce un peu plus lentement.
Mais essentiellement, ce que nous voulons à faire est de suivre ces pointeurs
à travers la totalité de la liste chaînée.
Donc la question est vous pourriez être invité.
>> Quelque chose à remarquer avec insertion, disons
nous avons voulu mettre un nouvel élément à l'avant de notre liste chaînée.
Nous devons être très prudents sur l'ordre dans lequel on
réaffecté les pointeurs.
Parce que disons que je viens de dire OK.
Assurez-point de la tête de ce nouvel élément.
Il suffit de faire pointer ensuite à 1, nous avons essentiellement perdu le reste de notre liste,
parce que je ne me souviens pas où 2 vies.
>> Donc, nous avons à faire à un ordre très spécifique.
Tout d'abord, nous faisons la nouvelle Point à la tête de l'élément.
Et puis nous faisons la tête pointer vers le nouvel élément.
Voyons donc à quoi ça ressemble avec arrows-- juste comme ça.
Donc, vous devez d'abord la nouvelle Point à la vieille tête de l'élément.
Et maintenant, nous avons la tête pointer vers le nouveau premier élément.
Vous avez des questions à cet égard?
>> OK, voici un code nouveau, quelque chose à regarder un peu plus tard.
Et maintenant, je vais céder la parole à Davin pour GDB et un peu de pratique
codage sur papier.
Belle.
>> ROB: Et Rob.
>> HANNAH: Oh, Davin et Rob.
Je suis désolé.
>> L'ÉLÈVE: Woo!
>> ROB: Merci.
>> DAVIN: Voulez-vous dire tout réel rapide?
ROB: Ouais, ouais.
DAVIN: Une fois que je suis debout.
OK, tandis que Rob met la microphone, alors quel est GDB?
Tout le monde devrait avoir vu GDB classe et aussi à des heures de bureau.
Et vous devriez être utiliser.
Alors, quelle est GDB?
Tout le monde?
>> L'ÉLÈVE: Il est un débogueur.
>> DAVIN: Il est un débogueur.
Et qu'est-ce que vous permet de faire?
Comme, pourquoi aimons-nous GDB?
ÉTUDIANT: Pour ralentir le programme.
DAVIN: droit, de sorte que vous pouvez marcher travers comme un rythme humain.
Et si ce sont quelques-uns commandes que vous pouvez faire?
Eh bien, la rupture est probablement votre commande favorite.
Parce que vous permet de casser la programme et fait marcher à travers elle
ligne par ligne.
>> Run vous permet de l'exécuter.
Ensuite, comme marcher à travers.
Quelle est la prochaine et entre étape?
Attendez, dire à haute voix.
Il avait raison.
>> L'ÉLÈVE: [inaudible].
>> DAVIN: Oui, impressionnant.
Donc, comme, à côté et l'étape, si you're-- disons que vous avez une fonction
définir.
Disons que certains dans votre fonction principale, et vous frapper juste à côté, à côté,
suivant.
Vous allez effectivement exécuter cette fonction,
mais vous allez sauter par-dessus.
Si vous frappez pas, ou s ou que ce soit, vous êtes
va réellement sauter dans cette fonction,
et puis vous pouvez frapper à côté pour voir les différents appels
à l'intérieur de cette fonction particulière.
Ouais?
>> L'ÉLÈVE: Est-il possible à sauter, comme, revenir en arrière?
DAVIN: Terminer, ouais, en finir avec vous sauter.
Donc, ça va finir que fonction, et puis vous êtes
sera de retour en principal, par exemple.
Impression imprimer une seule fois.
Quelque chose que je l'utilise toujours est affichée.
L'affichage imprimer constamment tout au long de la totalité
de votre programme.
>> Par exemple, si vous êtes dans une boucle, et vous
envie de voir comment quelque chose est en évolution, et vous ne voulez pas, comme, constamment
être faire comme impression, impression, impression, affichage
affiche cette variable en continu, chaque fois que vous cliquez sur suivant.
Et continuer.
Donc GBD, qui est GDB.
>> L'ÉLÈVE: Quelle est la seule où vous [inaudible]?
DAVIN: Qu'est-ce?
>> L'ÉLÈVE: Quelle est the-- les variables locales.
ROB: Il ya quelque chose en fait comme les locaux ou quelque chose.
Je can't--
>> DAVIN: Il pourrait être quelque chose comme ça, oui.
>> HANNAH: Dans les locaux?
>> DAVIN: Voilà.
Voilà l'un.
ROB: Belle.
>> DAVIN: Ouais.
>> ÉTUDIANT: Qu'est-ce que continuer faire?
>> DAVIN: Il continues-- il est donc juste va continuer vos programmes.
Donc, si vous cassez et frappez continuer, ça va
seulement de lancer ce programme jusqu'à ce que il frappe à nouveau cette pause.
Ainsi, par exemple, si vous cassé dans une fonction,
et vous allez faire comme pour boucle ou quelque chose comme ça,
et vous frappez continuer, il va continuer et revenir à cette pause.
Ou il n'y a pas rupture, il va continuer et terminer le programme.
>> ROB: Ainsi, tout comme les arrêts exécuter au premier point d'arrêt
vous frappez, si vous puis touchées continuent, il va garder
va jusqu'à ce qu'il soit le prochain point d'arrêt.
Et puis continuer ira au point d'arrêt suivant.
DAVIN: D'autres questions sur GDB?
Donc je pense que dans le passé, nous vous avons demandé ce que
GDB est et donner un exemple de certaines choses que vous
peut faire avec GDB, si réel simple, mais ouais.
Là vous allez.
Et noeuds?
>> ROB: Oui, si la direction était-ce?
L'ÉLÈVE: Cela était-il.
DAVIN: Attendez.
ROB: Ce gars?
DAVIN: Celui-là.
ROB: Ce gars, oh, je ne savais pas.
Nous étions donc pas clair sur ce que je ne fais pas the--
savoir qui il était-- mais la question.
Nous ne savons pas exactement ce que vous demandaient à ce sujet, si juste
de clarifier quelque chose.
Alors d'abord, comme je l'ai dit avant, typedef vous êtes toujours en utilisant seulement
créer un surnom pour un type.
Donc ici, le surnom que nous sommes la création est pour ce noeud de structure de type.
>> Alors d'abord, en ignorant ce nœud dans le typedef, si cette structure noeud bouclés
préparez-bas à côté bouclés accolade est le type de nœud de structure.
Et nous avons besoin de ce noeud là-haut, parce que nous
besoin de référencer nœud ici.
Donc, avec ce genre de structure récursive, vous devez donner à cette structure un nom,
ou bien vous ne pouviez pas dire nœud struct ici.
Alors qu'avant avec étudiant lorsque nous avons tapé, je pense,
nous ne devons pas dire étudiant là-bas, parce que nous
ne pas avoir à dire struct étudiant l'intérieur de la structure elle-même.
Donc, il est le récursive qui nous oblige à dire nœud il.
>> Ce noeud est juste le nom que nous sommes donnant noeud pour le typedef.
Ainsi, ce noeud est pas la même chose que ce noeud.
Mais ce nœud de structure est la même que celui noeud de structure.
DAVIN: Donc, lorsque vous appelez, comme, nœud dans votre fonction principale,
tu ne vas pas à dois dire que nœud de structure.
Vous pouvez juste dire nœud, car un noeud est different-- est fondamentalement
vous dites, OK.
Au lieu d'avoir à appeler noeud de structure dans mon code,
Je veux juste renommer comme noeud de rendre plus facile.
>> ROB: Si vous avez toujours utiliser typedef, alors ce
est le seul endroit où vous allez avoir pour déclarer une variable avec nœud de structure
étoile, oui.
>> DAVIN: OK, donc la dernière partie est difficile d'enseigner because--
ROB: Quoi?
>> DAVIN: Parce que ça codage sur papier.
Ainsi, chaque année, nous avons Code sur les questions de papier.
Donc, je pense que l'année dernière, 12 des 80 points étaient code sur papier.
Année d'avant, 10 sur 80, année d'avant, 20 sur 100,
si un certain nombre de ces.
Donc, vous allez avoir de pouvoir à coder ces fonctions à la main.
>> Alors je pensé que nous pourrions passer par un deux d'entre eux et de voir comment les gens font,
genre de marcher à travers les lentement avec les gens.
Donc, en général, et strlen atoi ont été très populaires.
L'année dernière, je pense que nous avions GetPositiveInt et randomInt.
Mais pow, donc puissance, aussi positif aussi.
Rentrons à travers peut-être un ou deux de ceux-ci ensemble.
Qu'est-ce que les gens veulent voir?
>> L'ÉLÈVE: Atoi.
L'ÉLÈVE: Oui.
DAVIN: Atoi?
L'ÉLÈVE: [inaudible].
DAVIN: OK, je vais de le faire sur la carte.
Avez-vous une préférence si je le fais ici ou là?
Là, Gabe dit il.
>> ROB: Et voilà réflexions générales sur ces questions de codage.
Essayez d'écrire quelque chose.
Ne pas laisser le champ vide.
>> DAVIN: Oui.
ROB: Si vous pouvez obtenir le retourner type correct,
ou peut-être que nous pourrions donner à vous, mais si vous le pouvez, comme,
écrire la signature de la fonction générale, Si vous pouvez obtenir les cas de base correcte,
ou des cas d'angle, ou se souvenir chèque de nul,
aussi longtemps que vous avez une certaine choses, alors peut-être nous
peut vous donner quelques points pour le problème.
Ne pas laisser le champ vide.
>> DAVIN: Oui, et si vous sont juste complètement
perplexe sur la façon de en fait se transformer en code.
Si vous écrivez pseudo, qui est très bon aussi.
Donc, il est comme, il est une question en six points, et vous écrivez le bon pseudo,
vous aurez au moins deux points.
Donc, ne pas laisser pas vide.
Essayez de mettre quelque chose.
>> ROB: Il doit être le bon pseudo, cependant.
>> DAVIN: Oui.
ROB: Donc, nous sommes généralement sont moins indulgent avec des bugs dans pseudo.
Davin: OK, si vous les gars voulu voir atoi.
OK, si juste really-- si ce que vous voulez faire
est vous allez être donné une sorte de numéro.
Mais ce nombre est pas va être un int, non?
Qu'est-ce que ça va être?
>> L'ÉLÈVE: [inaudible].
>> DAVIN: Ça va être une chaîne, non?
Donc, si vous avez reçu un string-- nous allons say--
>> ROB: Dois-je tirer un éditeur?
Je peux tirer up--
>> DAVIN: Oh, vous voulez faire on--
>> ROB: Préférez-vous la carte?
>> DAVIN: Que voulez-vous faire?
Je veux dire, est-ce que vous voulez faire à la main?
Ou voulez-vous faire par ordinateur?
>> ROB: faire à la main.
>> DAVIN: [Rires]
ROB: faire à la main.
>> DAVIN: OK, donc ça va être atoi.
Alors, quel est it-- Je veux dire, nous allons probablement vous donner ceci.
Mais qu'est-ce que ça va revenir?
>> L'ÉLÈVE: Int.
>> DAVIN: Il va revenir int, non?
So-- Je ne veux pas le faire là-bas.
Je vais le faire ici.
>> ROB: Vous pouvez tirer vers le bas et puis poussez sur elle.
>> DAVIN: oui.
[Rires] changement de jeu.
OK, donc ça va être atoi int, et ce que ça va prendre?
Une étoile de char, si juste chaîne, étoile s, comme ça.
>> ROB: Belle étoile, agréable.
DAVIN: Cela pourrait ne pas être là, OK.
ROB: Ouais.
DAVIN: OK, donc la première chose que vous voulez que je do--
Je ne sais pas si quelqu'un a regardé à la solutions-- de pratique
mais ce que vous allez à vouloir faire est vous êtes
allez vouloir avoir une boucle, parce que vous êtes
allez vouloir réellement parcourir cette chaîne.
Donc helpful-- alors disons nous allons une boucle,
et nous allons passer en revue chaque élément de la chaîne.
Combien de temps est-ce?
Combien de fois allons-nous à parcourir en ce que pour la boucle?
L'ÉLÈVE: Sterln?
DAVIN: Sterln, ouais.
Donc, disons que int longueur égale sterln s.
Et tout simplement curieux, pourquoi est-il toujours bon de mieux faire à l'extérieur de boucles?
Comme, pourquoi est-il préférable de faire appel cette fonction à l'extérieur d'une boucle?
Il suffit de cocher une santé mentale rapide?
Ouais?
Etudiant: Ainsi vous ne le faites pas avoir à garder le contrôle de lui.
Vous pouvez juste [inaudible].
>> DAVIN: Exactement, alors oui, exactement ce qu'elle a dit.
Donc, nous ne devons pas continuer à vérifier.
Ainsi, par exemple, si je vous appelle cette fonction dans une boucle,
alors je vais continuer à appeler cette fonction à plusieurs reprises.
Et cela va diminuer l'efficacité de votre programme.
Donc, il est toujours utile de déclarer à l'extérieur.
>> ROB: ce qui est dit, sur aucun de ces problèmes,
à peu près aussi longtemps que vous obtenez une solution de travail, vous obtenez un crédit complet.
Donc, ne vous inquiétez pas si votre conception est absolument horrible.
Il pourrait nous faire bouleversé la lecture de votre code.
Mais tant que cela fonctionne, vous obtiendrez des points.
>> DAVIN: Oui.
OK, alors je vais déclarer une variable.
Il va juste appeler int somme.
Et je vais régler cette égale à zéro, comme cela.
Et que va juste d'être un espace réservé.
Donc cela va être ce que je vais revenir.
Je vais donc, à terme, retourner somme de ce programme.
Je dois donc ces deux variables.
Je dois longueur.
Je dois somme.
Et maintenant, nous allons sauter dans notre chaîne.
>> Donc permet d'avoir notre boucle.
Donc quatre int I est égale à 0 W, tandis que I est inférieur longueur je plus plus.
Et maintenant--
ROB: Nice.
DAVIN: OK, et maintenant ici vient la viande de notre code.
Ainsi, vous pouvez réellement faire ce essentiellement en une ligne.
Donc ce que quelqu'un a une idée de ce que nous allons faire ensuite?
OK, donc ce est OK.
Nous faisons donc dire somme equals-- permettez-moi de Scoot cette somme over--
est égale à la somme de 10 plus-- nous sommes va prendre s I moins un
citant 0 une citation fait, comme ça.
ROB: Très intuitive.
>> DAVIN: écrasé.
OK, donc someone-- je l'ai eu, je l'ai eu.
OK, si cela est clairement à la hausse.
Qu'est-ce que cela signifie?
Donc, personne ne sais ce que cela signifie?
Tout le monde peut voir cela?
Non, personne ne peut le voir, OK.
Je vais to--
>> ROB: Je vais écrire la formule juste ici.
DAVIN: OK, Rob va le faire sur l'ordinateur, ce qui est amusant.
ROB: Oh mon Dieu.
Ou je ne veux pas.
DAVIN: Stand by.
Etudiant: Je voudrais poser une question.
DAVIN: Oui, bien sûr.
L'ÉLÈVE: [inaudible]?
DAVIN: OK, donc il en fait, comme, juste en général,
Si vous deviez mettre, comme, dans cette déclaration int
I est égale à la longueur de 0 virgule égaux sterln, that--
>> L'ÉLÈVE: [inaudible].
>> DAVIN: Ça va, parce que that--
ÉTUDIANT: Pourquoi voudriez-vous même pas besoin d'utiliser la longueur?
Pourquoi ne pourrions-nous pas tout simplement [inaudible] sterln s, comme tout le temps [inaudible]?
>> DAVIN: Vous voulez dire ici?
>> L'ÉLÈVE: Oui.
DAVIN: Parce que chaque temps pour cette exécution de la boucle,
il va évaluer cette condition.
L'ÉLÈVE: Oui.
DAVIN: Et si vous avez sterln là, alors il est
allez avoir à réellement appeler cette fonction à chaque fois unique.
Ainsi, au lieu de juste comparant à un int,
vous allez être appeler un fonction et de le comparer
de la valeur de retour.
Ouais, il est donc juste, oui.
>> Nice, OK, maintenant tout le monde peut le voir.
Qu'est-ce que cela ressemble à does--, ce qu'il est.
Ceci est la confiture, ici.
Qu'est-ce que cela veut dire?
Que fais-je?
Ouais, une idée?
Ouais?
>> L'ÉLÈVE: Eh bien, quand vous entrez dans un tableau,
vous allez aller de gauche à droite,
si vous allez à aller dans décimal de la touche [inaudible].
DAVIN: Exactement.
Etudiant: Ainsi chacun vous devez multiplier
ce que vous avez vu que la valeur de l'int par le temps vous rendre à déplacer que sur une.
>> DAVIN: Parfait, parfait, Ainsi, par exemple, nous allons
dis-je donné vous-- je suis vais écrire ici.
Non, je ne suis pas.
Je vais écrire ici.
Disons que je vous ai donné 76, non?
Disons que je vous donne 76.
Voilà une chaîne pour commencer, OK?
>> Donc longueur est quoi?
2, non?
Somme est 0.
Puis nous sautons dans notre boucle.
OK, la première itération de ce, qu'est-ce que ça va être?
Ça va être somme est 0.
Donc résumer fois 10 0.
Voilà sens.
Alors qu'est-ce que cela fait?
L'ÉLÈVE: [inaudible].
>> DAVIN: Il va tourner que caractère en un entier, non?
Il est un peu comme avec votre problème set-- ce light--
il est un peu comme avec problème réglé Visioneer.
Vous avez affaire à des valeurs ASCII.
Donc, si je vous donne, comme un sept, mais il est un personnage,
et vous voulez savoir, OK, ce chiffre est-ce?
Oui, vous pouvez, ouais.
Donc, ce chiffre est-ce?
Vous pouvez soustraire de 0, mais vous avoir à soustraire 0, le caractère.
>> Et où certaines personnes se trébuché, ils sont
comme, OK, bien, je dois savoir les valeurs ASCII pour ce quiz?
Non, vous faites certainement pas besoin de savoir l'ASCII
valeurs de, comme, en minuscules un, majuscules A, zéro.
>> ROB: Il n'y a pas de raison de jamais mettre cela sur la feuille de triche.
>> DAVIN: faire Certainement pas perdre votre espace avec cette.
Vous pouvez literally-- juste place de dire 48, comme jusqu'à
y, qui est équivalente à dire une, une apostrophe,
comme ça, exactement la même.
>> ROB: On pourrait presque penser de ce que si-- Dieu, je dois ma,
oops-- on pourrait presque penser comme si nous avions quelque chose comme ça hachage
définir en tant que 0 48.
Cela ne marchera pas.
Mais pensez-y comme apostrophe 0 apostrophe, et pour tous les caractères.
Pensez-y comme une constante représente la valeur ASCII.
>> DAVIN: Oui.
OK, donc la première fois à travers, si avec 76-- si la première fois à travers,
ceci est juste le caractère 7 moins le caractère 0,
et ce sont sept integers-- bien, ceux
sept espaces éloignés les uns des les autres sur la table ASCII ou autre.
Alors que ça va revenir un int de 7.
Alors maintenant, somme égale à 7.
>> OK, bien, nous allons sauter dans cette boucle de nouveau.
OK, maintenant il est temps somme 10.
Donc, vous êtes effectivement déplacer le 7 vers la gauche.
Est-ce logique?
Vous êtes efficace le déplaçant vers la gauche.
>> Et puis vous add-- cette va être moins 6 0.
Voilà 6.
Donc, ça va être 70 plus 6.
76, qui est votre numéro.
Donc, quel que soit le nombre Je vous ai donné, il est lentement juste
va changer les valeurs les plus élevées vers la gauche, une facteur de 10
à chaque fois dans la boucle, et ensuite ajouter si nécessaire.
>> Dans le dos?
L'ÉLÈVE: Nous ne disposons pas de faire tout vérifier dans le programme?
>> ROB: Pour autant que la vérification va pour le programme,
nous vous dire assez beaucoup ce que vous devez vérifier.
Si nous ne vous disons pas rien, alors généralement
supposons que vous avez à vérifier la plupart des choses.
Comme vous pouvez, juste pour être sûr, vous devrait probablement vérifier hey, est de nulle?
Alors je ne sais pas ce qu'il faut revenir.
Mais nous vous dire ce genre de chose.
0, je ne sais pas.
>> DAVIN: Et pourquoi voudriez-vous revérifier si s est égal à zéro?
L'ÉLÈVE: [inaudible].
DAVIN: En raison de l'omble étoiles.
Il est un pointeur.
Ainsi, un parfaitement acceptable déclaration, je pourrais dire, OK,
s est égal à zéro, car il pourrait être un pointeur null.
Donc, lorsque vous avez des pointeurs dans votre chemin dans ce genre,
vous devriez probablement vérifier.
Parce que si vous ne cochez pas que, et alors vous puis allez dans votre boucle,
et vous doing-- scoot bas.
Scoot bas.
>> ROB: Désolé, ça y est.
>> DAVIN: Et donc, comme si elle est nulle, et puis vous
faire, quelle erreur allez-vous obtenir?
ÉTUDIANTS: Vous allez obtenir un ensemble faute.
DAVIN: Vous allez mettre en la faute, droit, parce que vous êtes
essayer de l'indice en null.
Donc, vous allez essayer de l'indice en mémoire que vous ne possédez pas.
Donc, cela, si cela est nulle, et vous faites cela, vous aurez cycle.
>> ROB: Je pense également à l'examen en ce qui nous avons posé cette question, nous vous disons
que vous pouvez simplement supposer il est un nombre positif.
Parce devrait également atoi à manipuler des nombres négatifs,
de sorte que vous auriez à cas particulier.
Hey, est le premier caractère un tableau de bord, dans ce cas, OK,
maintenant il est un entier négatif.
Nous allons vous dire ce genre de choses.
Nous allons vous dire ce que vous devez gérer.
DAVIN: Oui.
Donc, je suis sûr que certaines personnes pourraient have-- si vous avez commencé la recherche de vieilles examens,
vous avez vu sterln.
Voilà un des plus populaires.
Et je pense que dans sterln, vous deviez faire cette vérification pour nulle, le retour
0 ou quelque chose comme ça.
Comme, il fallait vérifier nulle.
Et si vous ne l'avez pas, que a été le point de rabais sur le questionnaire.
Donc de toute façon, tout le monde ne sentir OK avec atoi?
Quelqu'un veut-il aller sur les parties encore?
ROB: Oh oui, je pense nous vous disons aussi vous
peut supposer que tout ce que est-- ils sont en fait entrer un certain nombre,
que vous ne devez pas vous inquiéter au sujet, comme, lettres étant dans la chaîne, donc.
DAVIN: Ouais.
Oui?
L'ÉLÈVE: Pouvez-vous aller sur une durée plus lorsque
vous utilisez des guillemets doubles et apostrophe?
>> DAVIN: Bien sûr, si les guillemets doubles, très simplement, est entre guillemets sont des chaînes.
Donc, si vous doublez citation rien, qui est une chaîne.
Alors, comme, si je devais cette 0 ici, et je l'ai fait, voilà une chaîne.
Voilà plus d'un caractère.
Donc je ne peux pas trouver cette valeur sur mon ASCII graphique, car il est une chaîne, ouais.
>> OK, d'autres questions?
Oui?
>> Etudiant: Ainsi vous avez déjà répondu à cela,
mais comme, quand nous sommes réellement écrit ceci sur le questionnaire,
voulez-vous que nous écrivions avec barres obliques zéros [inaudible]?
DAVIN: Non
La question était devriez-vous mettre une barre oblique à travers les zéros
pour indiquer si elles sont des zéros?
Non, nous allons le découvrir.
Oui, merci, ils sont bons.
OK, rien d'autre?
Quelqu'un veut to-- donc je pense que nous avons couru un peu plus de temps.
Voulez-vous voir un autre, ou?
L'ÉLÈVE: randomInt.
>> DAVIN: randomInt, OK, exactement.
Alors, faisons randomInt.
Je vais le faire ici.
Donc randomInt est en fait beaucoup plus simple.
Je pense atoi est probablement le plus difficile que nous avons demandé dans les années précédentes.
L'ÉLÈVE: [inaudible].
>> DAVIN: Quoi?
ROB: Je vois si elle est un peu de visible à partir ici.
DAVIN: Est-ce?
ROB: Je ne pense pas que ce soit going-- je pense il va courir vers la droite.
DAVIN: OK, donc je vais faire celui-ci.
Et puis, vous venez de le mettre sur l'écran.
>> ROB: Très bien.
>> DAVIN: Vous voulez être mon scribe?
>> ROB: Ouais.
>> DAVIN: Nice.
OK, je peux effacer ce?
>> L'ÉLÈVE: Oui.
>> DAVIN: Voilà si dur.
(Chant) Vous faites ce que vous faites.
Et faire ce que vous ne faites pas.
Bien.
>> OK, si je me souviens bien, sur le quiz le randomInt était comme,
OK, je vais vous donner deux numéros, comme un a et un b.
Et je veux que vous me donniez une RandomInt entre ces chiffres.
Donc randomInt va de prendre deux numbers--
si RandomInt-- et il est va retourner un int.
>> Alors, quelle est la valeur de retour?
Je viens de vous dire.
Int, non?
Comme ça, et puis il est va prendre deux ints.
Donc, il va falloir int a et b int, comme ça.
Alors qu'est-ce randomInt est allons faire est que ça va
à retourner une valeur aléatoire entre ces deux valeurs.
Donc, ça va être plus grande d'un, à moins de b.
Donc, je pense que vous pouvez probablement supposer que a est la plus petite des deux valeurs.
Donc, si nous avons affaire à aléatoire, quelle fonction
nous avons vu que nous donne des choses au hasard?
L'ÉLÈVE: drand.
DAVIN: drand, exactement.
Donc, vous allez probablement voulez utiliser votre drand.
Ainsi, vous pouvez dire int aléatoire, et nous allons il suffit de dire est égal à 0 à l'heure actuelle.
Et ils vont nous dire, OK, égaux aléatoires drand 48.
Et qu'est-ce que ce retour?
Qu'est-ce que cette fonction vous donner?
>> L'ÉLÈVE: Entre 0 et 1.
>> DAVIN: Oui, entre 0 et 1.
Donc, il va être--
>> ROB: Et ce est-- je pense nous vous dire ceci.
Comme, vous pouvez utiliser drand 48.
Vous pouvez le vérifier sur l'examen passé.
Mais nous aurions probablement vous dire peut utiliser drand 48, qui
renvoie un flotteur entre 0 et 1.
>> DAVIN: Oui, oui, je suis sûr à l'examen
il vous dit probablement vouloir utiliser drand, ouais.
Donc, il va revenir une valeur comprise entre 0 et 1.
Et puis ce que vous êtes allez vouloir faire?
Eh bien, vous voulez multiplier by-- attends, je pense qu'il est comme ça, désolé.
Je vais le faire.
Je ne sais pas.
>> Donc b moins un.
Alors pourquoi b moins un?
Donc, disons que vous redonne drand un OK int--, je vais faire le reste,
si plus d'une.
Alors qu'est-ce does-- y est moins un b.
Donc, disons que vous redonne drand la valeur maximale, il pourrait peut-être
vous donner.
Qu'est-ce que ça va être?
L'ÉLÈVE: 1.
>> DAVIN: 1, non?
Donc, si cela est 1, et vous êtes multipliant par b moins un,
bien, que est que le différence entre moins A.
Et si vous ajoutez à cela que retour sur un, qui est ce?
Il est fondamentalement b.
Est-ce logique?
>> L'ÉLÈVE: Oui.
>> DAVIN: Donc, si cela est le maximum valoriser ce pourrait être,
ça va être 1.
Et puis cela est juste la la différence entre les deux.
Ajouter à un, si cela est va revenir aléatoire.
Et dans le cas d'angle qui drand vous redonne 1,
aléatoire sera simplement être efficacement b.
Mais qui est le maximum possible.
Donc, si ça va être inférieure à que, alors disons que sa comme 0,9,
Alors 0,9 fois moins b un va être moins
que la différence entre B moins un.
>> Et puis si vous ajoutez que à un, alors cette valeur est
va être supérieur à un, parce que vous ajoutez quelque chose sur elle,
mais ça va être inférieure à b.
Donc, vous allez obtenir un hasard nombre, parce que vous vous appelez drand.
Et que rand, ce nombre aléatoire est va être quelque part entre un
et b.
Est-ce logique?
>> ROB: Juste pour le mettre dans des chiffres concrets, de sorte
disons que nous voulons choisir un nombre aléatoire compris entre 7 et 10.
Donc b moins un est notre gamme.
Donc, il ya une gamme de trois chiffres que nous veulent choisir.
Et puis en multipliant que, entre 0 et 1 1,
si cela nous donne alors some-- disons que nous donne 1,5.
>> Puis 1,5, nous voulons aller de 7 à 10.
Donc 1,5 + 7 nous apporte nouveau dans notre gamme de 7 à 10.
Et puis nous ranger à l'intérieur de un nombre entier, de sorte qu'il tronquée vers le bas à 8.
Et puis nous revenons juste que.
Donc b moins un est notre gamme.
une décale vers le haut dans les numéros que nous voulons dans cette fourchette.
Ainsi, entre 7 et 10, et puis nous peut retourner ce que nous retrouvons avec.
>> DAVIN: Ouais, bon.
>> ROB: Je vous remercie.
>> DAVIN: Ouais, quoi de neuf?
>> L'ÉLÈVE: Avons-nous courons à tout type de erreurs ASCII quand we're-- si drand est
retour d'un flotteur [inaudible].
>> ROB: Ainsi, tout comme Rob dit, car aléatoire est pas un int,
si drand sera un flotteur.
Il multiplie donc et ensuite.
Et vous pourriez obtenir une certaine type de numéros de flotteur.
Et puis ça va tronquer.
>> L'ÉLÈVE: OK.
DAVIN: Ouais.
ROB: Et si le compilateur devait avertir vous sur, comme la perte de précision,
vient de lancer un int dans là, et puis il est bon.
DAVIN: Oui?
>> L'ÉLÈVE: aurait-il la même probabilité d'obtenir,
comme, b ou un [inaudible]?
>> ROB: Donc est-- je suis réellement wondering-- est censé randomInt
à avoir un certain nombre de une à moins de b?
Comme, si elle est entre 7 et 10, quelles sont les possibilités?
7, 8 et 9, ou 7, 8, 9, 10?
DAVIN: je ne sais plus.
Sur le problème de set--
>> ROB: Je pense qu'il est 7, 8, 9.
>> DAVIN: Il dit précisément ses inclusive et exclusive de l'un.
>> ROB: Ouais.
>> DAVIN: Mais je don't-- je suis pas--
>> ROB: Je pense donc ceux-ci est pas inclus, dans ce cas,
il ya une égalité probabilité de 7, 8, et 9.
Il n'y a pas de probabilité 10.
DAVIN: Oui?
Etudiant: Je voudrais poser une question.
Nous voulons définir une fonction renvoie pas une valeur, mais un tableau.
Alors quelle serait la syntaxe après le retour?
>> DAVIN: OK, alors vous would-- après le retour?
Donc, disons que vous aviez déclaré un tableau quelque part là-haut.
Ensuite, vous voulez bien revenir le nom du tableau.
>> L'ÉLÈVE: OK, merci.
Ensuite il suffit de retourner à A-
DAVIN: Oh, attends, désolé.
La question était de savoir comment retournez-vous un tableau.
>> ROB: Bien qu'il ne pouvait pas être un tableau déclaré
sur la pile ou quelque chose comme ça.
Il devrait être quelque chose malloced, parce que malloc
est de savoir comment vous déplacer attribution automatique de la mémoire.
>> DAVIN: Oui.
ROB: Comment obtenez-vous autour de portée locale.
>> DAVIN: Mais vous il suffit de retourner son name--
>> L'ÉLÈVE: [inaudible] il est pas un valeur, par exemple, deux nombres, de sorte
[Inaudible].
>> DAVIN: Vous ne pouvez pas revenir multiple.
Vous ne pouvez pas, comme, return--
>> Etudiant: Je parlais de retour un tableau ou quelque chose comme ça.
>> DAVIN: Ouais, donc la question est puis-je retourner des valeurs multiples.
Vous ne pouvez pas renvoyer plusieurs valeurs.
Vous ne pouvez pas, comme, retourner un puis retourner b ou quelque chose comme ça.
Parce que, après votre retour, vous revenir sur la fonction.
Et puis la fonction est fait, et comme dit Rob, est sur la pile.
>> Donc tout ce que la mémoire devient juste retour à l'ordinateur.
Tout est oublié, essentiellement.
Donc, si vous voulez revenir multiple valeurs, vous devez renvoyer un tableau,
Et la façon dont vous le faites est allouer de.
Et alors vous retourner x comme ça.
Fondamentalement, il vous suffit de retourner le nom.
Et lorsque vous revenez quelque chose comme ça, vous êtes
pas fait de renvoyer la valeur.
>> Donc, disons que vous avez enregistré les valeurs dans un tableau.
Vous n'êtes pas réellement renvoyer ces valeurs.
Comme, si je revenais un int, je suis vraiment le retour des copies des valeurs.
Mais si je devais revenir quelque chose comme ça,
Je retourne une référence à ces valeurs.
Donc, je suis de retour, fondamentalement, un adresse de mémoire pour les valeurs.
Est-ce logique?
L'ÉLÈVE: Oui.
DAVIN: Nice.
Oui?
>> L'ÉLÈVE: Lorsque vous êtes utilisant drand ici,
vous devez mettre srand avant?
>> DAVIN: Non, non, je ne le pense pas.
>> ROB: Ouais, si vous avez rien dire sur srand?
Le défaut de vous dire jamais srand tout se résume à faire srand null.
Donc drand sur son propre travail de volonté.
Et il sera automatiquement semences avec l'heure actuelle, est ce qu'il utilise.
DAVIN: Oui?
L'ÉLÈVE: Pensez-vous [inaudible] avec les chiffres?
DAVIN: Oui, vous le pouvez.
Etudiant: Ainsi vous pourriez dire, comme, 4 fois 2.
La chose est, vous ne pouvez pas assumer puis un int est de quatre octets.
La terre que:
>> DAVIN: Je veux dire, pour le quiz, vous pouvez.
[Rires]
>> ROB: Mm, non.
DAVIN: Oui, oui, vous le pouvez.
Si on vous demande comment un grand int est, vous ne pouvez pas être, comme, quatre ou huit.
ROB: Oh, si la question est précisément,
comme, si il ya un problème de codage, vous devriez dire la taille de int.
Si elle est une table, ou il dit combien d'octets,
vous ne devriez pas remplir la taille des entiers.
>> ÉTUDIANTS: [Rires]
>> DAVIN: Bon, alors pourquoi est taille de int important ici?
Donc, comme, si nous allons à 32 bits processeur ou quelque chose comme ça,
alors ça va être quatre octets.
Mais certains des nouveaux choses, il pourrait être quoi?
Il pourrait être huit, non?
Donc this-- si vous venez de coder en dur quatre, puis sur certaines machines, cela va fonctionner.
Certaines machines, il ne fonctionnera pas.
Mais si sur le questionnaire nous sommes comme la taille est un int?
Mettez quatre.
ROB: Droit.
DAVIN: Ouais?
Etudiant: Ainsi parce que nous déclarant [Inaudible] à l'intérieur d'une fonction,
devrions-nous mettre 3 à l'intérieur de cette fonction?
Ou pouvons-nous utiliser à l'extérieur?
DAVIN: vous pouvez l'utiliser en dehors de cette fonction.
Alors il demande gratuitement.
>> L'ÉLÈVE: Oubliez où [inaudible].
>> ROB: Oh, la libre ne happen-- pas cela fait partie de la magie de malloc
est que vous n'êtes pas limitée à portée locale.
Vous avez le plein contrôle sur combien de temps vos variables vivent.
Nous appelons donc malloc ici, il pourrait être une fonction à part entière.
Il pourrait être de 10 heures plus tard que nous appelons enfin libre.
>> DAVIN: Ainsi, par exemple, comme, un couple semaines à partir de maintenant quand vous enfin
faire votre dictionnaire orthographique psets, vous allez
d'avoir une fonction qui crée tonnes de noeuds.
Donc, vous allouer de tonnes de nœuds dans cette fonction.
Et puis plus tard dans un fonction distincte, vous êtes
allez vouloir libérer tous ces nœuds.
Ainsi, vous pouvez littéralement passer à libérer un pointeur, donc une adresse mémoire
à ce que vous malloced.
Et ce sera bien.
Vous n'êtes pas obligé de libérer, comme, dans la même fonction.
Oui?
>> Etudiant: Ainsi un malloc variable [inaudible] à l'extérieur?
Est-ce ce que vous dites?
DAVIN: Attendez, dire cela?
Désolé.
>> ÉTUDIANT: Si une variable de malloc peut être libre partout dans le code,
alors qu'ils peuvent être consultés n'importe où dans le code?
Pouvez-vous garder les locaux?
>> DAVIN: Oh, elle a demandé, comme, la variable like--
>> ROB: Donc, vous avez encore besoin de avoir une sorte de référence
pour le bloc de l'malloc de mémoire.
Donc, ici, nous sommes de retour x.
L'ÉLÈVE: Oh.
ROB: Si nous ne revenons x ici, et cela était juste vide,
alors nous aurions pas accès à le pointeur qui a été malloced,
et il est la mémoire fuite.
>> L'ÉLÈVE: OK.
>> DAVIN: Donc, comme, disons que vous avoir cette, comme, ici.
ROB: Non
DAVIN: Dans ma fonction principale, je ne peux pas il suffit d'appeler cette x et être, comme, OK,
dans cette fonction, je l'ai fait.
>> ROB: Droit.
>> DAVIN: Je vais appeler x dans, comme, principale ou quelque chose comme ça.
Vous ne pouvez pas faire cela.
Vous allez retourner quelque chose.
Mais qu'est-ce que vous allez revenir?
Vous allez retourner une adresse mémoire.
Et parce que vous retournez un mémoire adresse, qui peut être consulté ailleurs.
D'autres questions?
Oui?
>> ÉTUDIANTS: La fonction ci-dessus étant chèque de [inaudible]?
>> DAVIN: Pourquoi dois-je pas besoin de faire cela?
L'ÉLÈVE: [inaudible].
DAVIN: Parce que vous êtes pas allouer de quoi que ce soit.
Donc, il est pas-- ouais, il est pas comme une chaîne s.
Il est un pointeur quelque part.
Ce ne sont que des valeurs.
L'ÉLÈVE: OK.
DAVIN: Ouais.
Rien d'autre?
ROB: Ouais?
Etudiant: Mais lorsque vous [inaudible]?
>> ROB: Ainsi, afin de libérer le mémoire, nous dirions ici.
Donc x est notre pointeur à le bloc de mémoire.
Nous libérons ce pointeur.
Et nous ne serions pas nécessairement le faire ici.
Nous pouvons le faire n'importe où.
Mais vous appelez seulement gratuitement sur quelque chose que malloc retourne.
Donc, malloc, ici, de retour ce qui est stocké dans x.
Nous pouvons donc appeler gratuitement sur x.
Les dernières questions?
>> DAVIN: Les dernières questions?
Ouais?
>> L'ÉLÈVE: Désolé, pouvez-vous expliquer à nouveau pourquoi vous libérer là-dedans?
Pourquoi [inaudible]?
>> DAVIN: Pour ici?
>> L'ÉLÈVE: Oui, comme tout de suite après.
DAVIN: Vous avez probablement ne veulent pas d'un libre ici.
ROB: Vous feriez probablement pas.
DAVIN: Oui, que cela ne permettrait pas.
Ce serait, comme, créer mémoire, faire des choses pour elle,
et puis tout de suite oublier, oui.
>> ROB: Mais nous pourrions faire, comme, ici pour une raison.
Nous pourrions dire int étoiles y est égal à matrice de retour.
Faire des trucs avec y, peut-être imprimer le contenu.
Et puis, finalement, nous avons terminé.
Nous pouvons libérer y.
L'ÉLÈVE: [inaudible].
DAVIN: Dois-je faire défiler vers le bas?
Merci.
ROB: Nice.
>> DAVIN: OK, ça y est.
ROB: Très bien, très bien.
Bonne chance.
>> DAVIN: Si vous avez des questions, écrivez-nous.
Bonne chance.