1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Setmana 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvard University] 3 00:00:04,860 --> 00:00:07,260 [Aquesta és CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Això és CS50, la Setmana 5. 5 00:00:09,740 --> 00:00:12,900 Avui en dia, i aquesta setmana, presentem una mica del món de la ciència forense 6 00:00:12,900 --> 00:00:14,850 en el context del butlletí de problemes 4. 7 00:00:14,850 --> 00:00:18,480 Avui serà una lliçó abreujada perquè hi ha un esdeveniment especial a aquí després. 8 00:00:18,480 --> 00:00:21,940 Així que anem a fer una ullada i es burlen tant dels estudiants com per als pares d'avui dia 9 00:00:21,940 --> 00:00:24,600 amb algunes de les coses que estan en l'horitzó. 10 00:00:24,600 --> 00:00:29,050 >> Entre ells, a partir de dilluns, tindrà una mica més dels seus companys de classe. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvard i la nova iniciativa en línia del MIT OpenCourseWare i per més, 12 00:00:32,980 --> 00:00:36,730 està posant en marxa al campus de Harvard, dilluns, el que significa venir dilluns 13 00:00:36,730 --> 00:00:40,930 tindrà, a partir de l'últim recompte, 86.000 companys de classe addicionals 14 00:00:40,930 --> 00:00:43,680 que estarà seguint al llarg de amb xerrades CS50 i les seccions 15 00:00:43,680 --> 00:00:45,890 i els tutorials i els conjunts de problemes. 16 00:00:45,890 --> 00:00:51,870 I com a part d'això, es convertiran en membres de la classe inaugural del CS50 i CS50x ara. 17 00:00:51,870 --> 00:00:56,150 Com a part d'això ara, s'adonen que hi haurà alguns Upsides també. 18 00:00:56,150 --> 00:01:00,620 Per preparar-se per això, per l'enorme quantitat d'estudiants, 19 00:01:00,620 --> 00:01:03,820 només cal dir que tot i que comptem amb 108 TFS i CAS, 20 00:01:03,820 --> 00:01:07,560 no és exactament el millor estudiant-mestre una vegada que arribem a 80.000 dels estudiants. 21 00:01:07,560 --> 00:01:09,830 No anem a qualificar problema per a molts jocs de forma manual, 22 00:01:09,830 --> 00:01:13,050 que hagin introduït aquesta setmana en el conjunt de problemes serà CS50 Check, 23 00:01:13,050 --> 00:01:15,410 que serà una utilitat de línia d'ordres en l'aparell 24 00:01:15,410 --> 00:01:17,880 que obtindrà una vegada que el actualitzeu a finals d'aquest cap de setmana. 25 00:01:17,880 --> 00:01:21,030 Vostè serà capaç d'executar una ordre, check50, en el seu propi conjunt de processadors, 26 00:01:21,030 --> 00:01:24,770 i obtindrà informació instantània sobre si el seu programa és correcte o incorrecte 27 00:01:24,770 --> 00:01:27,980 d'acord amb les especificacions de disseny diferents que ens han brindat. 28 00:01:27,980 --> 00:01:30,310 Més sobre això en l'especificació de problemes. 29 00:01:30,310 --> 00:01:34,220 Els companys de classe CS50x va a utilitzar això també. 30 00:01:34,220 --> 00:01:36,170 >> Butlletí de problemes 4 té a veure amb la medicina forense, 31 00:01:36,170 --> 00:01:38,630 i aquest conjunt de processadors va ser inspirat realment per algunes coses de la vida real 32 00:01:38,630 --> 00:01:41,210 de manera que quan jo estava a la universitat em van internar per un temps 33 00:01:41,210 --> 00:01:45,270 amb l'oficina del fiscal del Comtat de Middlesex el districte està fent la feina forense 34 00:01:45,270 --> 00:01:47,660 amb el seu investigador forense plom. 35 00:01:47,660 --> 00:01:50,280 El que això equival a, com crec que he esmentat un parell de setmanes passat, 36 00:01:50,280 --> 00:01:52,720 és la policia estatal de comunicació o altres persones poguessin entrar, 37 00:01:52,720 --> 00:01:56,150 ells deixen les coses com discs durs i CD i els disquets i similars, 38 00:01:56,150 --> 00:01:58,770 i llavors l'objectiu de l'oficina forense era determinar 39 00:01:58,770 --> 00:02:01,470 si hi va haver o no evidència d'algun tipus. 40 00:02:01,470 --> 00:02:04,730 Aquesta va ser la Unitat d'Investigacions Especials, així que era delictes de coll blanc. 41 00:02:04,730 --> 00:02:10,949 Era una mica més preocupant dels delictes, qualsevol cosa que implica algun tipus de mitjans de comunicació digitals. 42 00:02:10,949 --> 00:02:16,450 Resulta que no és que molta gent escriu un correu electrònic dient: "Jo ho vaig fer". 43 00:02:16,450 --> 00:02:20,490 Així que molt sovint, aquestes recerques forenses no es va presentar tot el que molt de fruit; 44 00:02:20,490 --> 00:02:22,820 però de vegades la gent anava a escriure aquests correus electrònics. 45 00:02:22,820 --> 00:02:25,240 Així que de vegades, els esforços van ser recompensats. 46 00:02:25,240 --> 00:02:31,210 >> Però per dur a aquest conjunt de processadors forense, anem a introduir en pset4 una mica de gràfics. 47 00:02:31,210 --> 00:02:35,410 És probable que prendre aquestes coses per fet - JPEG, GIF i similars - en aquests dies. 48 00:02:35,410 --> 00:02:38,320 Però si vostè realment pensa d'ell, una imatge, igual que la cara de Rob, 49 00:02:38,320 --> 00:02:41,270 pot modelar com una seqüència de punts o píxels. 50 00:02:41,270 --> 00:02:43,380 En el cas de la cara de Rob, hi ha tot tipus de colors, 51 00:02:43,380 --> 00:02:46,760 i comencem a veure els punts individuals, coneguts com píxels, 52 00:02:46,760 --> 00:02:48,610 una vegada que comencem per apropar la imatge 53 00:02:48,610 --> 00:02:54,660 Però si simplifiquem el món una mica i dir que això aquí és Rob en blanc i negre, 54 00:02:54,660 --> 00:02:57,490 per representar en blanc i negre, només pot utilitzar binari. 55 00:02:57,490 --> 00:03:01,660 I si utilitzarem binari, 1 o 0, podem expressar aquesta mateixa imatge 56 00:03:01,660 --> 00:03:06,140 de cara somrient de Rob amb aquest patró de bits. 57 00:03:06,140 --> 00:03:12,100 11000011 representa el blanc, blanc, negre, negre, negre, negre, blanc, blanc. 58 00:03:12,100 --> 00:03:16,150 I el que no és un gran salt després de començar a parlar sobre fotografies a tot color, 59 00:03:16,150 --> 00:03:18,600 coses que t'agradaria veure a Facebook o prendre amb una càmera digital. 60 00:03:18,600 --> 00:03:21,410 Però, certament, quan es tracta de colors, necessita més bits. 61 00:03:21,410 --> 00:03:25,690 I molt comú en el món de les fotografies és utilitzar no 1-bit color, 62 00:03:25,690 --> 00:03:29,560 ja que això suggereix, però de 24-bit color, on realment obtenir milions de colors. 63 00:03:29,560 --> 00:03:32,250 Així com en el cas quan el zoom a l'ull de Rob, 64 00:03:32,250 --> 00:03:36,370 que era qualsevol nombre de milions de possibilitats diferents colors. 65 00:03:36,370 --> 00:03:39,040 Així que anem a introduir en aquest Butlletí de problemes 4, així com en el tutorial, 66 00:03:39,040 --> 00:03:43,370 que serà avui a les 3:30 en lloc de les habituals a causa de 2:30 conferència de divendres aquí. 67 00:03:43,370 --> 00:03:46,620 Però el vídeo estarà en línia com de costum matí. 68 00:03:46,620 --> 00:03:48,820 >> També vaig a presentar a un altre format d'arxiu. 69 00:03:48,820 --> 00:03:51,270 Això està deliberadament destinada a semblar intimidatori al principi, 70 00:03:51,270 --> 00:03:55,670 però això és només part de la documentació per a una estructura C. 71 00:03:55,670 --> 00:03:58,940 Resulta que Microsoft fa anys va ajudar a popularitzar aquest format 72 00:03:58,940 --> 00:04:05,150 anomenat el format d'arxiu de mapa de bits, bmp, i això va ser un super format simple, colorit gràfic d'arxius 73 00:04:05,150 --> 00:04:10,150 que s'ha utilitzat des de fa força temps i de vegades encara per als papers pintats d'escriptori. 74 00:04:10,150 --> 00:04:14,760 Si vostè pensa de nou a Windows XP i els turons i el cel blau, 75 00:04:14,760 --> 00:04:17,170 que era en general una imatge de mapa de bits bmp o. 76 00:04:17,170 --> 00:04:19,959 Els mapes de bits són divertits per a nosaltres perquè tenen una mica més de complexitat. 77 00:04:19,959 --> 00:04:22,610 No és tan simple com aquesta xarxa de 0s i 1s. 78 00:04:22,610 --> 00:04:27,510 En el seu lloc, tenen coses com una capçalera al començament d'un arxiu. 79 00:04:27,510 --> 00:04:31,990 En altres paraules, dins d'un arxiu. Bmp és un munt de 0s i 1s, 80 00:04:31,990 --> 00:04:34,910 però hi ha alguna cosa addicional 0s i 1s en aquest país. 81 00:04:34,910 --> 00:04:38,220 I resulta que el que probablement ha donat per fet durant anys - 82 00:04:38,220 --> 00:04:45,170 formats d'arxiu com. doc o. xls o. mp3, mp4,. siguin quins siguin els formats d'arxiu 83 00:04:45,170 --> 00:04:48,480 que vostè està familiaritzat amb - què significa ser fins i tot un format d'arxiu, 84 00:04:48,480 --> 00:04:52,480 perquè al cap ia la fi tots aquests arxius que utilitzem té només 0s i 1s. 85 00:04:52,480 --> 00:04:56,810 I potser els 0s i 1s representen ABC a través d'ASCII o similars, 86 00:04:56,810 --> 00:04:58,820 però al final del dia, encara és només 0s i 1s. 87 00:04:58,820 --> 00:05:02,100 Així que els humans només de tant en tant decideixen inventar un nou format d'arxiu 88 00:05:02,100 --> 00:05:06,420 on estandarditzar el que els patrons de bits realment signifiquen. 89 00:05:06,420 --> 00:05:09,220 I en aquest cas aquí, amics els que va dissenyar el format de fitxer de mapa de bits 90 00:05:09,220 --> 00:05:15,620 va dir que en el primer byte en un arxiu de mapa de bits, com es denota per 0 Offset allà, 91 00:05:15,620 --> 00:05:18,940 que serà una mica crípticament anomenat bfType variable anomenada, 92 00:05:18,940 --> 00:05:23,080 que només representa el tipus de fitxer de mapa de bits, el tipus de fitxer de mapa de bits és la següent. 93 00:05:23,080 --> 00:05:27,700 Es pot inferir potser des de la segona fila que compensat 2, número 2 byte, 94 00:05:27,700 --> 00:05:33,740 té un patró de 0 i 1 que representa què? La mida d'alguna cosa. 95 00:05:33,740 --> 00:05:35,310 I continua des d'allà. 96 00:05:35,310 --> 00:05:37,410 Així que, en conjunt Problema 4, se li va travessar algunes d'aquestes coses. 97 00:05:37,410 --> 00:05:39,520 No arribarem a preocupar per tots ells. 98 00:05:39,520 --> 00:05:47,510 Però noti que comença a posar-se interessant voltant byte 54: rgbtBlue, Verd i Vermell. 99 00:05:47,510 --> 00:05:52,110 Si alguna vegada has escoltat la sigla RGB - vermell, verd, blau - es tracta d'una referència a aquesta 100 00:05:52,110 --> 00:05:54,610 perquè resulta que es pot pintar tots els colors de l'arc de Sant Martí 101 00:05:54,610 --> 00:05:58,180 amb una combinació de vermell, blau i verd. 102 00:05:58,180 --> 00:06:03,320 I de fet, els pares a l'habitació pot recordar alguns dels primers projectors. 103 00:06:03,320 --> 00:06:05,890 En aquests dies, vostè acaba de veure una llum brillant que surt d'una lent, 104 00:06:05,890 --> 00:06:09,800 però de tornada al dia en què va tenir la lent de color vermell, la lent blava i verd de la lent, 105 00:06:09,800 --> 00:06:13,380 i junts dirigida a una pantalla i formen un quadre de colors. 106 00:06:13,380 --> 00:06:16,270 I molt sovint, les escoles intermèdies i secundàries que tenen aquests lents 107 00:06:16,270 --> 00:06:19,720 molt lleugerament decantat, de manera que eren una mena de veure imatges dobles o triples. 108 00:06:19,720 --> 00:06:24,100 Però aquesta era la idea. Tenies llum vermella, verda i blava que pinta un quadre. 109 00:06:24,100 --> 00:06:26,590 I aquest mateix principi s'utilitza en els ordinadors. 110 00:06:26,590 --> 00:06:30,230 >> Així que un dels reptes a continuació, perquè en el Problema 4 seran unes quantes coses. 111 00:06:30,230 --> 00:06:34,800 Un d'ells és per redimensionar una imatge, per prendre en un patró de 0s i 1s, 112 00:06:34,800 --> 00:06:40,200 esbrinar què trossos de 0s i 1s representen el que en una estructura d'aquest tipus, 113 00:06:40,200 --> 00:06:43,630 i després trobar la manera de reproduir els píxels - els vermells, els blaus, els verds - 114 00:06:43,630 --> 00:06:46,660 dins, així que quan una imatge es veu com aquest principi, 115 00:06:46,660 --> 00:06:49,210 pot semblar que aquesta vegada després d'això. 116 00:06:49,210 --> 00:06:53,640 Entre els altres reptes que també serà que se li va lliurar una imatge forense 117 00:06:53,640 --> 00:06:56,030 d'un arxiu real d'una càmera digital. 118 00:06:56,030 --> 00:06:58,960 I en aquesta cambra, fa molt de temps, eren un munt de fotos. 119 00:06:58,960 --> 00:07:03,760 El problema és que accidentalment esborrats o tenia la imatge danyada d'alguna manera. 120 00:07:03,760 --> 00:07:05,750 Les coses dolentes succeeixen amb càmeres digitals. 121 00:07:05,750 --> 00:07:09,150 I pel que ràpidament copiat tots els de 0s i 1s d'aquesta carta per a tu, 122 00:07:09,150 --> 00:07:13,610 salvat a tots en un sol arxiu gran, i després els anem a lliurar a vostè en problemes n º 4 123 00:07:13,610 --> 00:07:19,320 de manera que vostè pot escriure un programa en C amb el de recuperar tots aquests arxius JPEG, idealment. 124 00:07:19,320 --> 00:07:23,330 I resulta que els arxius JPEG, encara que són una mena format d'arxiu complex - 125 00:07:23,330 --> 00:07:26,360 són molt més complexes que aquesta cara somrient aquí - 126 00:07:26,360 --> 00:07:31,160 resulta que cada JPEG comença amb els mateixos patrons de 0s i 1s. 127 00:07:31,160 --> 00:07:35,630 Així, utilitzant, en definitiva, un bucle while o un cicle for o similar, 128 00:07:35,630 --> 00:07:38,880 pot iterar sobre tots els 0s i 1s en aquesta imatge forense, 129 00:07:38,880 --> 00:07:43,150 i cada vegada que veus el patró especial que està definit en l'especificació del conjunt de problemes, 130 00:07:43,150 --> 00:07:47,880 es pot assumir aquí és, amb una probabilitat molt alta, l'inici d'un JPEG. 131 00:07:47,880 --> 00:07:51,230 I tan aviat com vostè troba el mateix patró determinat nombre de bytes 132 00:07:51,230 --> 00:07:55,430 o KiB o megabytes més tard, es pot assumir que aquí hi ha una segona JPEG, 133 00:07:55,430 --> 00:07:57,380 la foto que vaig prendre després de la primera. 134 00:07:57,380 --> 00:08:01,370 Permetin-me deixar de llegir aquest arxiu en primer lloc, començar a escriure aquest nou, 135 00:08:01,370 --> 00:08:06,310 i la sortida del seu programa per pset4 hi haurà fins a 50 imatges JPEG. 136 00:08:06,310 --> 00:08:09,270 I si no són 50 imatges JPEG, té una mica d'un bucle. 137 00:08:09,270 --> 00:08:12,490 Si vostè té un nombre infinit d'imatges JPEG, té un bucle infinit. 138 00:08:12,490 --> 00:08:14,910 Així que això també serà un cas bastant comú. 139 00:08:14,910 --> 00:08:16,600 Així que això és el que està en l'horitzó. 140 00:08:16,600 --> 00:08:21,310 >> Concurs 0 a les nostres esquenes, per compte del meu correu electrònic que sempre hi ha persones que són al mateix temps feliç, 141 00:08:21,310 --> 00:08:23,640 espècie de punt mort, trist i al voltant qüestionari temps 0. 142 00:08:23,640 --> 00:08:26,800 I si us plau acostar-se a mi, el cap TF Zamyla, el seu propi TF, 143 00:08:26,800 --> 00:08:31,180 o una de les entitats emissores de certificats que vostè sàpiga si li agradaria discutir com anaven les coses. 144 00:08:31,180 --> 00:08:35,539 >> Així que per impressionar als pares aquí a l'habitació, el que és la biblioteca CS50? 145 00:08:36,429 --> 00:08:40,390 [Rialles] Bona feina. 146 00:08:40,390 --> 00:08:48,340 Quina és la biblioteca CS50? Si. >> [Estudiant] És un conjunt prescrit de codi [inaudible] 147 00:08:48,340 --> 00:08:49,750 Bé, bé. 148 00:08:49,750 --> 00:08:53,240 És un conjunt prescrit de codi que va escriure el personal, proporcionem a vostè, 149 00:08:53,240 --> 00:08:55,030 que proporciona part de la funcionalitat comuna, 150 00:08:55,030 --> 00:08:59,020 coses com fer-me una cadena, porta-me'n 1 int - totes les funcions que s'enumeren aquí. 151 00:08:59,020 --> 00:09:02,260 >> A partir d'ara, comencem a prendre realment aquestes rodes d'entrenament apagat. 152 00:09:02,260 --> 00:09:05,050 Anem a començar a portar una cadena de vostè, 153 00:09:05,050 --> 00:09:08,870 recordo que era un sinònim per al tipus de dades real? >> [Diversos estudiants] Char *. 154 00:09:08,870 --> 00:09:12,730 * Char. Per als pares, que probablement va ser [fa so de bufada]. Això és bo. 155 00:09:12,730 --> 00:09:17,550 * Char començarem a veure a la pantalla amb més raó ara traiem cadena del nostre vocabulari, 156 00:09:17,550 --> 00:09:19,730 almenys quan es tracta de realment escriure codi. 157 00:09:19,730 --> 00:09:22,840 De la mateixa manera, deixarem d'utilitzar algunes d'aquestes funcions tant 158 00:09:22,840 --> 00:09:25,280 ja que els nostres programes es posaran més sofisticat. 159 00:09:25,280 --> 00:09:28,480 En lloc d'escriure programes de seure allà amb un missatge parpellejant, 160 00:09:28,480 --> 00:09:31,870 esperant que l'usuari escrigui alguna cosa endins, vostè rebrà les aportacions d'altres llocs. 161 00:09:31,870 --> 00:09:35,490 Per exemple, vostè els rebi d'una sèrie de bits en el disc dur local. 162 00:09:35,490 --> 00:09:38,580 En el seu lloc, vaig a aconseguir en el futur d'una connexió de xarxa, 163 00:09:38,580 --> 00:09:40,230 un lloc web en algun lloc. 164 00:09:40,230 --> 00:09:44,110 >> Així que anem a pelar aquesta capa, per primera vegada i tiri cap amunt del Dispositiu CS50 165 00:09:44,110 --> 00:09:49,010 i l'arxiu anomenat cs50.h, que ha estat inclòs # durant setmanes, 166 00:09:49,010 --> 00:09:51,140 però anem a veure realment el que hi ha dins d'això. 167 00:09:51,140 --> 00:09:54,430 La part superior de l'arxiu en blau és només un munt de comentaris: 168 00:09:54,430 --> 00:09:57,050 informació sobre la garantia i llicència. 169 00:09:57,050 --> 00:09:59,050 Aquesta és una espècie de paradigma comú en el programari 170 00:09:59,050 --> 00:10:01,580 perquè una gran quantitat de programari en aquests dies és el que s'anomena codi obert, 171 00:10:01,580 --> 00:10:05,220 el que significa que algú ha escrit el codi i ho va fer lliurement disponible 172 00:10:05,220 --> 00:10:10,470 no només per executar i utilitzar, sinó per realment llegir i modificar i integrar en el seu propi treball. 173 00:10:10,470 --> 00:10:14,660 Així que això és el que vostè ha estat utilitzant programari de codi obert, encara que d'una manera molt petita. 174 00:10:14,660 --> 00:10:18,560 Si em desplaço cap avall més enllà dels comentaris, però, començarem a veure algunes coses més familiars. 175 00:10:18,560 --> 00:10:25,010 Avís a la part superior aquí que l'arxiu cs50.h inclou una gran quantitat d'arxius de capçalera. 176 00:10:25,010 --> 00:10:28,560 La majoria d'ells, no hem vist abans, però un és familiar. 177 00:10:28,560 --> 00:10:32,270 Quin d'aquests hem vist, encara que breument, fins ara? >> [Estudiant] Biblioteca estàndard. 178 00:10:32,270 --> 00:10:35,810 Sí, la biblioteca estàndard. stdlib.h té malloc. 179 00:10:35,810 --> 00:10:38,320 Quan vam començar a parlar sobre l'assignació de memòria dinàmica, 180 00:10:38,320 --> 00:10:41,650 que anem a tornar a la setmana següent, així, que va començar a incloure aquest arxiu. 181 00:10:41,650 --> 00:10:46,640 Resulta que bool i veritat i la falsedat en realitat no existeix en C per se 182 00:10:46,640 --> 00:10:49,440 si no va acompanyat l'arxiu aquí. 183 00:10:49,440 --> 00:10:52,710 Hem estat durant setmanes fins i tot stdbool.h 184 00:10:52,710 --> 00:10:55,620 de manera que vostè pot utilitzar la noció d'una. bool, vertader o fals 185 00:10:55,620 --> 00:10:58,620 Sense això, vostè hauria d'ordenar d'fingir i utilitzar un int 186 00:10:58,620 --> 00:11:02,610 i només arbitràriament assumir que 0 és fals i 1 és veritable. 187 00:11:02,610 --> 00:11:07,150 Si ens desplacem cap avall encara més, aquí és la nostra definició d'una cadena. 188 00:11:07,150 --> 00:11:11,390 Resulta que, com hem dit abans, que aquesta estrella és on en realitat no importa. 189 00:11:11,390 --> 00:11:13,720 Vostè pot fins i tot tenir espai al seu voltant. 190 00:11:13,720 --> 00:11:16,740 Tenim aquest semestre ha estat promovent com això per deixar clar 191 00:11:16,740 --> 00:11:18,620 que l'estrella té a veure amb el tipus, 192 00:11:18,620 --> 00:11:21,700 però s'adonen tan comú, sinó una mica més comú, 193 00:11:21,700 --> 00:11:24,430 és posar allà, però funcionalment és el mateix. 194 00:11:24,430 --> 00:11:27,720 Però ara, si llegim més avall, anem a fer una ullada a getInt 195 00:11:27,720 --> 00:11:32,190 perquè hem utilitzat que potser primer abans de tot aquest semestre. 196 00:11:32,190 --> 00:11:37,440 Aquí està getInt. Això és el que? >> [Estudiant] Un prototip. >> Això és només un prototip. 197 00:11:37,440 --> 00:11:41,410 Sovint, hem posat prototips a la part superior del nostre. Arxius c, 198 00:11:41,410 --> 00:11:46,690 però també es pot posar en prototips arxius de capçalera, arxius. h, com aquest d'aquí 199 00:11:46,690 --> 00:11:50,840 de manera que en escriure algunes de les funcions que voleu que altres persones puguin utilitzar, 200 00:11:50,840 --> 00:11:53,550 que és exactament el cas de la biblioteca CS50, 201 00:11:53,550 --> 00:11:57,040 no només posar en pràctica les seves funcions en una mena cs50.c, 202 00:11:57,040 --> 00:12:02,790 també posar els prototips no en la part superior d'aquest arxiu, però a la part superior d'un arxiu de capçalera. 203 00:12:02,790 --> 00:12:07,170 Després que l'arxiu de capçalera és el que els amics i col · legues incloure 204 00:12:07,170 --> 00:12:09,760 amb # include en el seu propi codi. 205 00:12:09,760 --> 00:12:12,210 Així que tot aquest temps que has estat incloent tots aquests prototips, 206 00:12:12,210 --> 00:12:16,580 eficaçment a la part superior del seu arxiu, però a través d'aquest mecanisme # include, 207 00:12:16,580 --> 00:12:20,070 que essencialment còpia i enganxa aquest arxiu en el seu compte. 208 00:12:20,070 --> 00:12:23,070 Aquí hi ha alguna documentació molt detallada. 209 00:12:23,070 --> 00:12:25,640 Hem pràcticament per fet que getInt rep un int, 210 00:12:25,640 --> 00:12:27,640 però resulta que hi ha alguns casos de cantonada. 211 00:12:27,640 --> 00:12:31,810 Què passa si l'usuari escriu un nombre que és massa gran, un trilió, 212 00:12:31,810 --> 00:12:35,490 que no pot cabre dins d'un int? Quin és el comportament esperat? 213 00:12:35,490 --> 00:12:38,020 L'ideal és predictible. 214 00:12:38,020 --> 00:12:40,280 Així que en aquest cas, si un llegeix la lletra petita, 215 00:12:40,280 --> 00:12:44,500 que realment va a veure que si la línia no pot ser llegit, aquest INT_MAX devolucions. 216 00:12:44,500 --> 00:12:48,320 Mai hem parlat d'això, però sobre la base de la seva capitalització, el que és probable que sigui? 217 00:12:48,320 --> 00:12:50,640 [Estudiant] Constant. >> És una constant. 218 00:12:50,640 --> 00:12:54,770 És una constant especial que probablement està declarat en un dels arxius de capçalera 219 00:12:54,770 --> 00:13:00,090 que és més alt en l'arxiu, i INT_MAX és probablement una mena uns 2 milions de dòlars, 220 00:13:00,090 --> 00:13:04,990 La idea és que, perquè hem d'indicar d'alguna manera que alguna cosa va sortir malament, 221 00:13:04,990 --> 00:13:10,700 nosaltres, sí, tenim 4 milions de números a la nostra disposició: -2 milions de dòlars en fins a 2 milions de dòlars, més o menys. 222 00:13:10,700 --> 00:13:14,710 Bé, el que és comú en la programació és de robar un d'aquests números, 223 00:13:14,710 --> 00:13:18,920 0 tal vegada, potser 2 milions de dòlars, potser -2000000000, 224 00:13:18,920 --> 00:13:23,280 perquè passi una de les seves possibles valors perquè pugui comprometre amb el món 225 00:13:23,280 --> 00:13:26,820 que si alguna cosa surt malament, jo em tornaré aquest valor gran super. 226 00:13:26,820 --> 00:13:31,030 Però vostè no desitja que l'usuari escrigui alguna cosa críptic com 234 ..., un nombre molt gran. 227 00:13:31,030 --> 00:13:34,060 El generalitzar en canvi, com una constant. 228 00:13:34,060 --> 00:13:38,060 Així que en realitat, si s'estaven anal en les últimes setmanes, cada vegada que es diu getInt, 229 00:13:38,060 --> 00:13:42,900 vostè ha d'haver estat revisant amb una condició, si ho va fer el tipus d'usuari en INT_MAX, 230 00:13:42,900 --> 00:13:46,590 o, més específicament, va fer INT_MAX getint retorn, perquè si ho fes, 231 00:13:46,590 --> 00:13:51,830 que en realitat vol dir que no ho escrigui. Quelcom ha fallat en aquest cas. 232 00:13:51,830 --> 00:13:56,080 Així que això és el que es coneix generalment com un valor sentinella, que només significa especial. 233 00:13:56,080 --> 00:13:58,120 >> Passem ara a l'arxiu. C. 234 00:13:58,120 --> 00:14:01,340 L'arxiu de C ha existit en l'aparell durant algun temps. 235 00:14:01,340 --> 00:14:06,840 I de fet, l'aparell ha de pre-compilats per a vostè en aquesta cosa que es diu codi objecte, 236 00:14:06,840 --> 00:14:09,540 però això no li importa a vostè on està perquè el sistema sap 237 00:14:09,540 --> 00:14:11,730 en aquest cas on és: l'aparell. 238 00:14:11,730 --> 00:14:17,400 Anem ara a desplaçar-se cap avall i veure com getInt getInt ha estat treballant tot aquest temps. 239 00:14:17,400 --> 00:14:19,460 Aquí tenim comentaris similars d'abans. 240 00:14:19,460 --> 00:14:21,660 Permetin-me fer un zoom sobre només la part del codi. 241 00:14:21,660 --> 00:14:23,900 I el que tenim per getInt és la següent. 242 00:14:23,900 --> 00:14:25,700 No es necessita entrada. 243 00:14:25,700 --> 00:14:29,510 Es torna un int, mentre que (veritat), així que tenim un bucle infinit deliberada, 244 00:14:29,510 --> 00:14:33,180 però se suposa que sortirem d'això d'alguna manera o tornar des d'aquest. 245 00:14:33,180 --> 00:14:34,870 >> Anem a veure com funciona això. 246 00:14:34,870 --> 00:14:39,240 Sembla que estem fent servir GetString en aquesta primera línia dins del bucle, 166. 247 00:14:39,240 --> 00:14:43,780 Això ara és una bona pràctica perquè en quines circumstàncies podria tornar GetString 248 00:14:43,780 --> 00:14:47,660 la paraula clau NULL especial? >> [Estudiant] Si alguna cosa surt malament. 249 00:14:47,660 --> 00:14:51,630 Si alguna cosa surt malament. I què podria sortir malament quan es diu alguna cosa així com GetString? 250 00:14:54,960 --> 00:14:57,640 Si. >> [Estudiant] malloc no imposar els INT. 251 00:14:57,640 --> 00:14:59,150 Si. Potser malloc falla. 252 00:14:59,150 --> 00:15:03,190 En algun lloc sota de la capella com crida malloc GetString, que assigna la memòria, 253 00:15:03,190 --> 00:15:06,020 que permet a la botiga d'informàtica a tots els personatges 254 00:15:06,020 --> 00:15:07,750 que l'usuari escriu en el teclat. 255 00:15:07,750 --> 00:15:11,590 I suposem que l'usuari tenia un munt de temps lliure i va escriure més, per exemple, 256 00:15:11,590 --> 00:15:16,160 de 2 milions de caràcters, més caràcters que l'equip encara té RAM. 257 00:15:16,160 --> 00:15:19,250 GetString ha de ser capaç d'indicar que, si s'escau. 258 00:15:19,250 --> 00:15:22,560 Fins i tot si es tracta d'un cas super, super cantonada poc comú, 259 00:15:22,560 --> 00:15:24,340 ha de ser d'alguna manera capaç de manejar això, 260 00:15:24,340 --> 00:15:28,750 i així GetString, si ens vam tornar i llegir la seva documentació, ho fa en NULL fet de retorn. 261 00:15:28,750 --> 00:15:34,460 Així que ara si GetString falla en tornar NULL, getInt fallarà en tornar INT_MAX 262 00:15:34,460 --> 00:15:37,690 així com un sentinella. Aquests són només convencions humanes. 263 00:15:37,690 --> 00:15:41,450 L'única manera de saber que aquest és el cas és llegir la documentació. 264 00:15:41,450 --> 00:15:45,040 >> Anem a desplaçar-se cap avall perquè el int és realment aconseguit. 265 00:15:45,040 --> 00:15:51,160 Si desplaceu-vos cap avall una mica més lluny, en la línia 170, que té un comentari sobre aquestes línies. 266 00:15:51,160 --> 00:15:55,100 Declarem en un int 172, n, i char a, c, i llavors aquesta nova funció, 267 00:15:55,100 --> 00:15:58,930 que alguns de vosaltres heu ensopegat abans, sscanf. 268 00:15:58,930 --> 00:16:00,870 Això significa scanf cadena. 269 00:16:00,870 --> 00:16:05,700 En altres paraules, dóna'm una cadena i el vaig a buscar els fragments d'informació d'interès. 270 00:16:05,700 --> 00:16:07,360 Què significa això? 271 00:16:07,360 --> 00:16:11,800 Suposem que jo escriure, literalment, 123 en el teclat i després prem Enter. 272 00:16:11,800 --> 00:16:16,470 Quin és el tipus de dades de 123 quan són retornats per GetString? >> [Estudiant] String. 273 00:16:16,470 --> 00:16:18,380 Òbviament és una cadena, no? Tinc una cadena. 274 00:16:18,380 --> 00:16:23,220 Així que 123 és realment, entre cometes, 123 amb el 0 \ al final de la mateixa. 275 00:16:23,220 --> 00:16:27,110 Això no és un int. Això no és un nombre. Sembla un nombre, però no és en realitat. 276 00:16:27,110 --> 00:16:29,080 Llavors, què getInt he de fer? 277 00:16:29,080 --> 00:16:35,750 S'ha d'explorar aquesta cadena d'esquerra a dreta - 123 \ 0 - i d'alguna manera convertir un enter real. 278 00:16:35,750 --> 00:16:37,850 Vostè podria trobar la manera de fer això. 279 00:16:37,850 --> 00:16:41,450 Si penses en pset2, vostè probablement té una mica còmode amb César 280 00:16:41,450 --> 00:16:44,820 o Vigenère, així que vostè pot iterar sobre una seqüència, pot convertir caràcters a sencers. 281 00:16:44,820 --> 00:16:46,710 Però diables, és un munt de treball. 282 00:16:46,710 --> 00:16:49,860 Per què no cridar a una funció com sscanf que fa això per a vostè? 283 00:16:49,860 --> 00:16:54,230 Així sscanf espera un argument - en aquest cas anomenat línia, que és una cadena. 284 00:16:54,230 --> 00:17:01,840 A continuació, especifiqui entre cometes, molt similar a printf, el que s'espera veure en aquesta cadena. 285 00:17:01,840 --> 00:17:09,000 I el que estic dient aquí és que espero veure un nombre decimal i pot ser un personatge. 286 00:17:09,000 --> 00:17:12,000 I anem a veure per què aquest és el cas en un moment. 287 00:17:12,000 --> 00:17:15,869 I resulta que aquesta notació és ara una reminiscència de coses que vam començar a parlar de 288 00:17:15,869 --> 00:17:17,619 poc més d'una setmana. 289 00:17:17,619 --> 00:17:21,740 Quin és & N i & c fent per nosaltres aquí? >> [Estudiant] Direcció de n i la direcció de c. 290 00:17:21,740 --> 00:17:25,400 Si. M'està donant la direcció de n i la direcció de c. Per què és tan important? 291 00:17:25,400 --> 00:17:30,220 Vostès saben que amb funcions en C, sempre es pot tornar un valor o cap valor en absolut. 292 00:17:30,220 --> 00:17:34,530 Vostè pot tornar un int, cadena, un flotador, char a, el que sigui, o pot tornar buit, 293 00:17:34,530 --> 00:17:38,030 però només es pot tornar una cosa al màxim. 294 00:17:38,030 --> 00:17:42,760 Però aquí volem sscanf per a mi tornar potser un enter, un nombre decimal, 295 00:17:42,760 --> 00:17:46,220 i també a. char, i vaig a explicar per què el char en un moment 296 00:17:46,220 --> 00:17:51,460 Que efectivament vol tornar a sscanf dues coses, però això no és possible en C. 297 00:17:51,460 --> 00:17:55,200 Podeu evitar que en aprovar en dues direccions 298 00:17:55,200 --> 00:17:57,370 perquè quan et lliuren una funció de dues direccions, 299 00:17:57,370 --> 00:18:00,470 el que pot ser que la funció de fer amb ells? >> [Estudiant] Escriure a aquestes adreces. 300 00:18:00,470 --> 00:18:02,010 Es pot escriure en aquestes direccions. 301 00:18:02,010 --> 00:18:05,770 Vostè pot utilitzar l'operació estrella i anar-hi, a cadascuna d'aquestes direccions. 302 00:18:05,770 --> 00:18:11,260 És una espècie d'aquest mecanisme de la porta del darrere però molt comú per canviar els valors de les variables 303 00:18:11,260 --> 00:18:14,870 més d'un sol lloc - en aquest cas, dues. 304 00:18:14,870 --> 00:18:21,340 Ara noti que estic comprovant == 1 i després tornar n si això és així, de fet, s'avaluen com true. 305 00:18:21,340 --> 00:18:26,170 Llavors, què està passant? Tècnicament, tot el que realment volem que succeeixi en getInt és això. 306 00:18:26,170 --> 00:18:30,740 Volem analitzar, per dir-ho així, volem llegir la cadena - entre cometes 123 - 307 00:18:30,740 --> 00:18:34,560 i si sembla que hi ha un nombre allà, el que estem dient sscanf fer 308 00:18:34,560 --> 00:18:38,190 és indicar un nombre - 123 - en aquesta variable n per a mi. 309 00:18:38,190 --> 00:18:42,090 Llavors, per què llavors tinc realment això així? 310 00:18:42,090 --> 00:18:48,220 Quin és el paper de sscanf dient que també pot ser que aconsegueixi un personatge aquí? 311 00:18:48,220 --> 00:18:53,470 [Resposta dels estudiants inaudible] >> Un punt decimal en realitat podria funcionar. 312 00:18:53,470 --> 00:18:56,330 Anem a celebrar que va pensar per un moment. Què més? 313 00:18:56,330 --> 00:18:59,270 [Estudiant] Pot ser NULL. >> Bona idea. Podria ser el caràcter nul. 314 00:18:59,270 --> 00:19:01,660 En realitat no és en aquest cas. Si. >> [Estudiant] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. O deixa que em generalitzar encara més. 316 00:19:04,340 --> 00:19:06,640 El% c no és només per a la comprovació d'errors. 317 00:19:06,640 --> 00:19:09,300 No volem que hi hagi un caràcter després del número, 318 00:19:09,300 --> 00:19:11,870 però el que això em permet fer és el següent. 319 00:19:11,870 --> 00:19:18,210 Resulta que sscanf, a més d'emmagatzemar els valors de N i C en aquest exemple aquí, 320 00:19:18,210 --> 00:19:24,890 el que també fa és que retorna el nombre de variables de posar els valors cm 321 00:19:24,890 --> 00:19:30,260 Així que si només escriu en l'any 123, només el% d va a coincidir, 322 00:19:30,260 --> 00:19:33,880 i només s'emmagatzema n amb un valor com 123, 323 00:19:33,880 --> 00:19:35,640 i res es posa al c. 324 00:19:35,640 --> 00:19:37,620 C segueix sent un valor escombraries, per dir-ho - 325 00:19:37,620 --> 00:19:40,730 escombraries, ja que mai s'ha inicialitzat a un valor. 326 00:19:40,730 --> 00:19:45,520 Així que en aquest cas, sscanf retorna 1 perquè poblada 1 dels punters, 327 00:19:45,520 --> 00:19:50,190 en aquest cas gran, tinc un int de manera que alliberar la línia per alliberar la memòria 328 00:19:50,190 --> 00:19:54,000 GetString que realment assignat, i després torno n, 329 00:19:54,000 --> 00:19:58,500 else if T'has preguntat on Reintenta declaració que ve, que ve d'aquí. 330 00:19:58,500 --> 00:20:04,390 Així que si, per contra, de tipus I en 123foo - només alguns seqüència aleatòria de text - 331 00:20:04,390 --> 00:20:08,490 sscanf veurà el nombre, nombre, nombre, f, 332 00:20:08,490 --> 00:20:16,410 i que posarà el 123 en n, sinó que posarà a la f c i després tornar 2. 333 00:20:16,410 --> 00:20:20,640 Així que tenim, simplement usant la definició bàsica de la conducta sscanf, una manera molt simple - 334 00:20:20,640 --> 00:20:23,900 així, complex a primera vista, però al final de la dia mecanisme força simple - 335 00:20:23,900 --> 00:20:28,320 de dir que hi ha un enter i si ho és, que l'únic que he trobat? 336 00:20:28,320 --> 00:20:29,860 I l'espai en blanc aquí és deliberada. 337 00:20:29,860 --> 00:20:34,000 Si llegeix la documentació de sscanf, li diu que si s'inclou una peça d'espais en blanc 338 00:20:34,000 --> 00:20:38,810 al principi o al final, sscanf també permetrà que l'usuari, per qualsevol raó, 339 00:20:38,810 --> 00:20:41,860 123 per colpejar la barra d'espai i que serà legítim. 340 00:20:41,860 --> 00:20:44,150 No va a cridar que l'usuari només perquè prem la barra d'espai 341 00:20:44,150 --> 00:20:48,640 al principi o al final, que és només una mica més fàcil d'utilitzar. 342 00:20:48,640 --> 00:20:52,300 >> Qualsevol pregunta llavors sobre getInt? Si. >> [Estudiant] Què passa si vostè acaba de posar en un char? 343 00:20:52,300 --> 00:20:54,030 Bona pregunta. 344 00:20:54,030 --> 00:20:59,890 Què passa si vostè acaba d'escriure en un char com f i premeu Enter sense escriure 123? 345 00:20:59,890 --> 00:21:02,420 Què et sembla el comportament d'aquesta línia de codi seria llavors? 346 00:21:02,420 --> 00:21:04,730 [Resposta dels estudiants inaudible] 347 00:21:04,730 --> 00:21:08,790 Sí, i sscanf pot cobrir això també, perquè en aquest cas, no va a omplir n o c. 348 00:21:08,790 --> 00:21:15,310 Va a tornar en lloc 0, en aquest cas estic també posar aquest escenari 349 00:21:15,310 --> 00:21:18,750 pel fet que el valor esperat que vull és 1. 350 00:21:18,750 --> 00:21:22,000 Només vull una cosa i només una part del utilitzador. Bona pregunta. 351 00:21:22,000 --> 00:21:24,290 >> Altres? Està bé. 352 00:21:24,290 --> 00:21:26,250 >> Millor no anar a través de totes les funcions d'aquí, 353 00:21:26,250 --> 00:21:29,500 però la que sembla potser d'interès restant és GetString 354 00:21:29,500 --> 00:21:32,790 perquè resulta que GetFloat, getInt, GetDouble GetLongLong 355 00:21:32,790 --> 00:21:36,260 tot punt gran part de la seva funcionalitat a GetString. 356 00:21:36,260 --> 00:21:39,750 Així que donem una ullada a la manera com es porta a terme aquí. 357 00:21:39,750 --> 00:21:43,630 Aquest sembla una mica complex, però utilitza els mateixos fonaments 358 00:21:43,630 --> 00:21:45,670 que comencem a parlar de la setmana passada. 359 00:21:45,670 --> 00:21:49,490 En GetString, que pren cap argument com pel buit fins aquí 360 00:21:49,490 --> 00:21:53,730 i retorna una cadena, que pel que sembla estic declarant una cadena anomenada buffer. 361 00:21:53,730 --> 00:21:56,270 Realment no sé el que serà utilitzat per encara, però ja veurem. 362 00:21:56,270 --> 00:21:58,390 Sembla que la capacitat per defecte és 0. 363 00:21:58,390 --> 00:22:01,350 No estic segur d'on va això, no sé el que n s'utilitzarà per, però, 364 00:22:01,350 --> 00:22:03,590 però ara s'està posant una mica més interessant. 365 00:22:03,590 --> 00:22:06,520 En la línia 243, que declara un int, c. 366 00:22:06,520 --> 00:22:08,800 Aquesta és una espècie d'un detall tonto. 367 00:22:08,800 --> 00:22:15,820 Un char és de 8 bits, i 8 bits pot emmagatzemar quants valors diferents? >> [Estudiant] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 El problema és que si vols tenir 256 caràcters diferents ASCII, els quals hi 369 00:22:20,730 --> 00:22:23,340 si vostè pensa de nou - i això no és una cosa per memoritzar. 370 00:22:23,340 --> 00:22:25,710 Però si penses en aquesta taula ASCII gran que vam tenir setmanes enrere, 371 00:22:25,710 --> 00:22:30,600 existien en aquest cas, 128 o 256 caràcters ASCII. 372 00:22:30,600 --> 00:22:32,940 Utilitzem tots els patrons de fins 0s i 1s. 373 00:22:32,940 --> 00:22:36,210 Això és un problema si vostè vol ser capaç de detectar un error 374 00:22:36,210 --> 00:22:40,190 perquè si vostè ja està utilitzant 256 valors per als seus personatges, 375 00:22:40,190 --> 00:22:43,050 que en realitat no planificar el futur perquè ara no hi ha manera de dir: 376 00:22:43,050 --> 00:22:46,270 aquest no és un caràcter de fiar, aquest és un missatge erroni. 377 00:22:46,270 --> 00:22:50,270 Així que el que el món fa és que s'utilitza el valor més gran que ve, una mena int, 378 00:22:50,270 --> 00:22:54,720 de manera que vostè té un nombre boig de bits, 32 per 4 bilions de possibles valors 379 00:22:54,720 --> 00:22:58,860 de manera que només ha de acaben usant essencialment 257 de ells, 380 00:22:58,860 --> 00:23:01,720 1 dels quals té un significat especial com un error. 381 00:23:01,720 --> 00:23:03,120 >> Així que anem a veure com funciona això. 382 00:23:03,120 --> 00:23:07,760 En la línia 246, que tinc aquest bucle while gran que està trucant fgetc, 383 00:23:07,760 --> 00:23:11,090 f significat arxiu, de manera getc, a continuació, stdin. 384 00:23:11,090 --> 00:23:15,520 Resulta que això és només la forma més precisa de dir-ho llegir l'entrada des del teclat. 385 00:23:15,520 --> 00:23:19,300 Teclat estàndard mitjà d'entrada, la sortida estàndard significa pantalla, 386 00:23:19,300 --> 00:23:23,310 i l'error estàndard, que veurem en pset4, significa que la pantalla 387 00:23:23,310 --> 00:23:27,490 però una part especial de la pantalla perquè no es confonen amb la producció real 388 00:23:27,490 --> 00:23:30,750 que pretén imprimir. Però més sobre això en el futur. 389 00:23:30,750 --> 00:23:34,440 Així fgetc només significa llegir un caràcter del teclat i emmagatzemar-on? 390 00:23:34,440 --> 00:23:37,350 Guardi'l al c. 391 00:23:37,350 --> 00:23:41,360 I a continuació, comprovar - així que estic fent servir algunes conjuncions booleanes aquí - 392 00:23:41,360 --> 00:23:46,000 comprovar que no és igual a - \ n, de manera que l'usuari ha premi Enter, volem deixar en aquest moment, 393 00:23:46,000 --> 00:23:49,850 final del bucle - i també volem comprovar la constant EOF especial, 394 00:23:49,850 --> 00:23:53,610 que si sap o endevina, què significa? >> [Estudiant] Final de l'arxiu. >> Fi de l'arxiu. 395 00:23:53,610 --> 00:23:56,560 Això és una mica absurd perquè si estic escrivint en el teclat, 396 00:23:56,560 --> 00:23:58,870 no hi ha realment cap arxiu involucrats en això, 397 00:23:58,870 --> 00:24:01,150 però això és només una espècie del terme genèric utilitzat per a referir- 398 00:24:01,150 --> 00:24:04,220 que només ve dels dits de l'humà. 399 00:24:04,220 --> 00:24:06,460 EOF - final de l'arxiu. 400 00:24:06,460 --> 00:24:09,920 Com acotació al marge, si mai t'has colpejat Control D en el seu teclat, no és que vostè hauria encara - 401 00:24:09,920 --> 00:24:15,230 vostè ha colpejat Control C - Control D envia aquesta constant especial anomenada EOF. 402 00:24:15,230 --> 00:24:19,850 Així que ara només ens queda una mica d'assignació de memòria dinàmica. 403 00:24:19,850 --> 00:24:23,440 >> Així que si (n + 1> capacitat). Ara vaig a explicar núm. 404 00:24:23,440 --> 00:24:26,100 N és només quants bytes es troben actualment en el buffer, 405 00:24:26,100 --> 00:24:28,620 la cadena que s'està construint en l'actualitat per part de l'usuari. 406 00:24:28,620 --> 00:24:33,450 Si vostè té més personatges en la memòria intermèdia del que té la capacitat de la memòria intermèdia, 407 00:24:33,450 --> 00:24:37,410 intuïtivament el que hem de fer llavors és assignar més capacitat. 408 00:24:37,410 --> 00:24:43,330 Així que vaig a passar fregant algunes de les operacions aritmètiques aquí i centrar-se només en aquesta funció aquí. 409 00:24:43,330 --> 00:24:46,070 Saps el que és malloc o almenys generalment familiar. 410 00:24:46,070 --> 00:24:48,970 Endevina el que realloc fa. >> [Estudiant] Afegeix la memòria. 411 00:24:48,970 --> 00:24:52,920 No és prou l'addició de memòria. Es reassignació la memòria de la següent manera. 412 00:24:52,920 --> 00:24:57,220 Si encara hi ha espai a l'extrem de la corda perquè duri més que la memòria 413 00:24:57,220 --> 00:25:00,000 del que originalment li dóna, llavors vostè aconseguirà que la memòria addicional. 414 00:25:00,000 --> 00:25:03,460 Així que vostè pot seguir posant els personatges de la cadena de tornada a esquena amb esquena amb esquena. 415 00:25:03,460 --> 00:25:05,830 Però si aquest no és el cas, ja que va esperar massa temps 416 00:25:05,830 --> 00:25:07,940 i es va deixar caure alguna cosa a l'atzar va quedar en la memòria hi ha 417 00:25:07,940 --> 00:25:10,290 però no hi ha més memòria per aquí, això està bé. 418 00:25:10,290 --> 00:25:13,100 Realloc farà tot el treball pesat per a vostè, 419 00:25:13,100 --> 00:25:16,750 moure la cadena ha llegit fins ara d'aquí, el va deixar allà, 420 00:25:16,750 --> 00:25:19,460 i després li donen la pista una mica més en aquest punt. 421 00:25:19,460 --> 00:25:22,550 >> Així que amb un gest de la mà, deixa dir que el que està fent GetString 422 00:25:22,550 --> 00:25:26,330 s'està començant amb un buffer petit, potser un sol caràcter, 423 00:25:26,330 --> 00:25:30,820 i si l'usuari escriu en dos personatges, GetString acaba trucant realloc i diu: 424 00:25:30,820 --> 00:25:33,150 un personatge no era suficient, dóna'm dos personatges. 425 00:25:33,150 --> 00:25:35,950 Llavors, si vostè llegeix a través de la lògica del circuit, que dirà 426 00:25:35,950 --> 00:25:39,600 l'usuari va escriure en 3 caràcters; dóna'm ara no 2, però 4 personatges, 427 00:25:39,600 --> 00:25:42,320 llavors dóna'm 8, llavors dóna'm 16 i 32. 428 00:25:42,320 --> 00:25:45,000 El fet que estic doblant la capacitat cada vegada 429 00:25:45,000 --> 00:25:48,570 significa que el buffer no creixerà a poc a poc, va creixent super ràpid. 430 00:25:48,570 --> 00:25:51,380 I el que podria ser l'avantatge d'això? 431 00:25:51,380 --> 00:25:54,600 Per què estic doblant la mida de la memòria intermèdia 432 00:25:54,600 --> 00:25:58,020 encara que l'usuari només pot ser que necessiti un personatge extra del teclat? 433 00:25:58,020 --> 00:26:01,750 [Resposta dels estudiants inaudible] >> Què és això? >> [Estudiant] No ha de créixer amb tanta freqüència. 434 00:26:01,750 --> 00:26:03,300 Exactament. No ha de créixer amb tanta freqüència. 435 00:26:03,300 --> 00:26:05,510 I això és només una mica de te de cobertura seves apostes aquí, 436 00:26:05,510 --> 00:26:10,850 La idea és que vostè no desitja trucar realloc molt, ja que tendeix a ser lenta. 437 00:26:10,850 --> 00:26:12,910 Cada vegada que li demana al sistema operatiu per a la memòria, 438 00:26:12,910 --> 00:26:16,990 com aviat veurem en un futur conjunt de problemes, tendeix a portar el seu temps. 439 00:26:16,990 --> 00:26:20,010 Així que minimitza la quantitat de temps, fins i tot si vostè està perdent una mica d'espai, 440 00:26:20,010 --> 00:26:21,900 tendeix a ser una bona cosa. 441 00:26:21,900 --> 00:26:24,060 >> Però si llegim a través de la part final del GetString aquí - 442 00:26:24,060 --> 00:26:27,950 i una altra la comprensió de cada línia aquí no és tan important avui en dia - 443 00:26:27,950 --> 00:26:30,530 adonar que finalment crida a malloc nou 444 00:26:30,530 --> 00:26:33,880 i s'assigna exactament tants bytes com necessita per a la cadena 445 00:26:33,880 --> 00:26:38,060 i després llença a les escombraries trucant gratis la memòria intermèdia excessivament gran 446 00:26:38,060 --> 00:26:40,080 si de fet he doblat diverses vegades. 447 00:26:40,080 --> 00:26:42,730 Així que en resum, així és com GetString ha estat treballant tot aquest temps. 448 00:26:42,730 --> 00:26:47,060 Tot el que fa és llegir un caràcter alhora una i altra vegada i una altra, 449 00:26:47,060 --> 00:26:50,750 i cada vegada que necessita una mica de memòria addicional, li demana al sistema operatiu perquè 450 00:26:50,750 --> 00:26:53,670 trucant realloc. 451 00:26:53,670 --> 00:26:57,890 >> Alguna pregunta? Està bé. 452 00:26:57,890 --> 00:26:59,270 >> Un atac. 453 00:26:59,270 --> 00:27:04,060 Ara que entenem punters o almenys estan cada vegada més familiaritzats amb els punters, 454 00:27:04,060 --> 00:27:06,700 anem a considerar com el món sencer comença a esfondrar- 455 00:27:06,700 --> 00:27:10,030 si no arribes a defensar contra els usuaris contradictori, 456 00:27:10,030 --> 00:27:11,850 persones que estan tractant de tallar en el seu sistema, 457 00:27:11,850 --> 00:27:16,890 persones que estan tractant de robar seu programari eludint un codi de registre 458 00:27:16,890 --> 00:27:19,090 que en cas contrari podria haver d'escriure polz 459 00:27:19,090 --> 00:27:22,990 >> Fes un cop d'ull a aquest exemple aquí, que és només el codi C que té una funció principal a la part inferior 460 00:27:22,990 --> 00:27:26,380 que crida a una funció foo. I què és el que passa a foo? 461 00:27:26,380 --> 00:27:29,680 [Estudiant] Un sol argument. >> [Malan] Un sol argument. 462 00:27:29,680 --> 00:27:33,450 Així que argv [1], el que significa la primera paraula que l'usuari escriu en la línia d'ordres 463 00:27:33,450 --> 00:27:36,360 després a.out o el que s'anomena el programa. 464 00:27:36,360 --> 00:27:41,680 Així foo a la part superior porta en un char *. Però char * és què? >> [Estudiant] Una cadena. 465 00:27:41,680 --> 00:27:43,350 [Malan] Una cadena, així que no hi ha res de nou aquí. 466 00:27:43,350 --> 00:27:45,420 Aquesta cadena és arbitràriament ser anomenat bar. 467 00:27:45,420 --> 00:27:51,430 En aquesta línia aquí, char c [12], en una mena de semi-Anglès tècnic, el que està fent aquesta línia? 468 00:27:51,430 --> 00:27:55,220 [Estudiant] Matriu de - Array de >>? >> [Estudiant] Caràcters. Caràcters. >> 469 00:27:55,220 --> 00:27:58,870 Dóna'm una matriu de 12 caràcters. Així que podríem anomenar això un buffer. 470 00:27:58,870 --> 00:28:02,920 És tècnicament anomenat c, però un amortidor en la programació només significa un munt d'espai 471 00:28:02,920 --> 00:28:04,800 que vostè pot posar algunes coses polz 472 00:28:04,800 --> 00:28:07,940 A continuació, finalment, memcpy no hem usat abans, però que és fàcil endevinar el que fa. 473 00:28:07,940 --> 00:28:10,480 Còpia de la memòria. Què fer? 474 00:28:10,480 --> 00:28:19,270 Aparentment còpia bar, la seva entrada, al c, però només fins a la longitud de la barra. 475 00:28:19,270 --> 00:28:24,930 Però hi ha un error aquí. >> [Estudiant] Es necessita el caràcter sizeof. >> Okay. 476 00:28:24,930 --> 00:28:30,860 Tècnicament, hauríem de fer strlen (bar) * sizeof (char)). Això és correcte. 477 00:28:30,860 --> 00:28:33,930 Però en el pitjor dels casos aquí, anem a suposar que això és - 478 00:28:33,930 --> 00:28:35,950 Bé. Llavors hi ha dos errors. 479 00:28:35,950 --> 00:28:39,160 Així sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Anem a fer això una mica més. 481 00:28:41,290 --> 00:28:44,910 Així que ara que encara hi ha un error, que és el que? >> [Resposta dels estudiants inaudible] 482 00:28:44,910 --> 00:28:46,990 Comproveu què? >> [Estudiant] Comprovar valor NULL. 483 00:28:46,990 --> 00:28:50,270 En general, s'ha de comprovar si NULL perquè passen coses dolentes 484 00:28:50,270 --> 00:28:53,200 quan el punter és NULL, ja que podria acabar anant allà, 485 00:28:53,200 --> 00:28:57,630 i no sempre es va a NULL per eliminació de referències amb l'operador estrella. 486 00:28:57,630 --> 00:29:01,050 Així que això és bo. I què més farem? Lògicament, hi ha una falla aquí també. 487 00:29:01,050 --> 00:29:04,450 [Estudiant] Comprovar si argc és> = a 2. 488 00:29:04,450 --> 00:29:10,550 Per tal de comprovar si argc és> = 2. Bé, hi ha tres errors en aquest programa. 489 00:29:10,550 --> 00:29:16,630 Estem comprovant si l'usuari realment escriure en res a argv [1]. Bé. 490 00:29:16,630 --> 00:29:20,950 Quin és l'error tercera? Si. >> [Estudiant] C pot no ser prou gran. 491 00:29:20,950 --> 00:29:23,320 Bé. Ens registrem un escenari. 492 00:29:23,320 --> 00:29:29,520 Hem comprovat implícitament no copiar més memòria de la que s'excedeixi la longitud de la barra. 493 00:29:29,520 --> 00:29:32,510 Així que si la cadena que l'usuari va escriure en és de 10 caràcters de longitud, 494 00:29:32,510 --> 00:29:36,020 això es va limitar a dir copiar 10 caràcters. I això està bé. 495 00:29:36,020 --> 00:29:39,940 Però què passa si l'usuari va escriure en una paraula en l'indicador com una paraula de 20 caràcters? 496 00:29:39,940 --> 00:29:44,900 Això és a dir còpia 20 caràcters de barra en què? 497 00:29:44,900 --> 00:29:49,750 C, també conegut com el nostre buffer, el que significa que acabes d'escriure dades 498 00:29:49,750 --> 00:29:52,540 a 8 llocs byte que vostè no és propietari, 499 00:29:52,540 --> 00:29:54,870 i no els tenen en el sentit que mai se'ls assignen. 500 00:29:54,870 --> 00:30:00,370 Així que això és el que es coneix generalment com l'atac de desbordament de memòria intermèdia o atac saturació de la memòria intermèdia. 501 00:30:00,370 --> 00:30:05,580 I és un atac en el sentit que si l'usuari o el programa que està trucant a la seva funció 502 00:30:05,580 --> 00:30:10,490 està fent maliciosament, el que realment passa a continuació en realitat podria ser molt dolent. 503 00:30:10,490 --> 00:30:12,450 >> Així que anem a fer una ullada a aquesta foto aquí. 504 00:30:12,450 --> 00:30:16,060 Aquest quadre representa la pila de memòria. 505 00:30:16,060 --> 00:30:19,580 Recordeu que cada vegada que es crida a una funció rep aquest petit marc a la pila 506 00:30:19,580 --> 00:30:21,520 i després un altre i després un altre i un altre. 507 00:30:21,520 --> 00:30:24,300 I fins ara, tenim només una mica abstret aquests en forma de rectangles 508 00:30:24,300 --> 00:30:26,290 ja sigui en el tauler oa la pantalla aquí. 509 00:30:26,290 --> 00:30:30,580 Però si ens centrem en un d'aquests rectangles, quan es crida a una funció foo, 510 00:30:30,580 --> 00:30:35,880 resulta que hi ha més a l'interior de la pila que s'emmarquen en aquest rectangle 511 00:30:35,880 --> 00:30:40,060 que amb prou feines x i i i a i b, com ho vam fer parlant de swap. 512 00:30:40,060 --> 00:30:44,410 Resulta que hi ha alguns detalls de menor nivell, entre els quals remet. 513 00:30:44,410 --> 00:30:49,550 Així que resulta quan principal diu foo, el principal ha d'informar foo 514 00:30:49,550 --> 00:30:53,520 quina és la direcció principal està en la memòria de l'ordinador 515 00:30:53,520 --> 00:30:57,770 perquè en cas contrari, tan aviat com foo es fa executar, com en aquest cas aquí, 516 00:30:57,770 --> 00:31:00,830 una vegada que arribi a aquest claudàtor tancat al final del foo, 517 00:31:00,830 --> 00:31:05,310 Com dimonis es foo saber on és el control del programa se suposa que ha d'anar? 518 00:31:05,310 --> 00:31:08,970 Resulta que la resposta a aquesta pregunta està en aquest rectangle vermell aquí. 519 00:31:08,970 --> 00:31:12,670 Això representa un punter, i li toca a l'ordinador per emmagatzemar temporalment 520 00:31:12,670 --> 00:31:17,030 a la pila de trucada de la direcció principal, de manera que tan aviat com foo es fa executar, 521 00:31:17,030 --> 00:31:21,120 l'equip sap on i quina línia principal per tornar. 522 00:31:21,120 --> 00:31:23,940 Punter salvat Frame fa de manera similar a aquesta. 523 00:31:23,940 --> 00:31:26,310 Bar Char * aquí representa què? 524 00:31:26,310 --> 00:31:31,350 Ara bé, aquest segment blau aquí és el marc de foo. Què és el bar? 525 00:31:31,570 --> 00:31:35,010 Bar és només l'argument de la funció foo. 526 00:31:35,010 --> 00:31:37,500 Així que ara estem de tornada en una mena de quadre familiar. 527 00:31:37,500 --> 00:31:39,850 Hi ha més coses i més distraccions en la pantalla, 528 00:31:39,850 --> 00:31:43,380 però aquest segment de color blau clar només és el que hem estat dibuixant a la pissarra 529 00:31:43,380 --> 00:31:45,790 per a alguna cosa com swap. Aquest és el marc per foo. 530 00:31:45,790 --> 00:31:51,490 I l'única cosa en què ara mateix és el bar, que és aquest paràmetre. 531 00:31:51,490 --> 00:31:55,220 Però el que més hauria d'estar a la pila d'acord amb aquest codi aquí? 532 00:31:55,220 --> 00:31:57,760 [Estudiant] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 També cal veure 12 quadres de memòria assignada a una variable anomenada c, 534 00:32:02,810 --> 00:32:04,970 i de fet hem de a la pantalla. 535 00:32:04,970 --> 00:32:08,480 La part superior hi ha c [0], i llavors l'autor d'aquest diagrama 536 00:32:08,480 --> 00:32:11,850 no es va molestar a dibuixar totes les places, però en realitat hi ha 12 hi 537 00:32:11,850 --> 00:32:16,590 perquè si ens fixem en la part inferior dreta, c [11] si s'enumeren des de 0 és el byte tal 12. 538 00:32:16,590 --> 00:32:18,400 Però aquí està el problema. 539 00:32:18,400 --> 00:32:22,390 En quina direcció es c creixent? 540 00:32:22,390 --> 00:32:27,080 Ordenar de dalt a baix si comença a la part superior i creix fins al fons. 541 00:32:27,080 --> 00:32:30,110 No es veu com ens va deixar la pista molt aquí en absolut. 542 00:32:30,110 --> 00:32:32,090 Hem classe de nosaltres mateixos pintat en una cantonada, 543 00:32:32,090 --> 00:32:36,940 i que c [11] és just contra bar, que està just en contra punter guardat, 544 00:32:36,940 --> 00:32:39,960 que és just en contra del remet. No hi ha més lloc. 545 00:32:39,960 --> 00:32:42,810 Quina és la implicació llavors si fiques la pota 546 00:32:42,810 --> 00:32:46,500 i està llegint 20 bytes en un buffer de 12 bytes? 547 00:32:46,500 --> 00:32:50,060 On són aquests 8 bytes addicionals anirà? >> [Estudiant] Inside - 548 00:32:50,060 --> 00:32:53,200 Dins de tota la resta, alguns dels quals és súper important. 549 00:32:53,200 --> 00:32:57,260 I el més important, potencialment, és el quadre vermell allà, Direcció de Retorn, 550 00:32:57,260 --> 00:33:03,560 perquè suposo que vostè ja sigui accidental o de contradicció sobreescriure aquests 4 bytes, 551 00:33:03,560 --> 00:33:07,260 que la direcció del punter, no només amb les escombraries però amb un nombre 552 00:33:07,260 --> 00:33:09,810 que passa a representar una adreça real a la memòria. 553 00:33:09,810 --> 00:33:13,880 Quina és la implicació, lògicament? >> [Estudiant] Funció que tornarà a un lloc diferent. 554 00:33:13,880 --> 00:33:15,250 Exactament. 555 00:33:15,250 --> 00:33:19,170 Quan torna foo i èxits que claudàtor, el programa es procedirà 556 00:33:19,170 --> 00:33:25,060 no per tornar al menú principal, tornarà al que la direcció està en aquesta caixa vermella. 557 00:33:25,060 --> 00:33:28,600 >> En el cas del registre de programari eludir, 558 00:33:28,600 --> 00:33:32,260 I si l'adreça que està sent retornat a és la funció que normalment s'anomena 559 00:33:32,260 --> 00:33:35,690 després d'haver pagat pel programari i introdueix el teu codi de registre? 560 00:33:35,690 --> 00:33:39,870 Et pots enganyar a l'ordinador en no anar aquí, però en comptes de pujar aquí. 561 00:33:39,870 --> 00:33:45,100 O si ets realment intel · ligent, un adversari realment pot escriure en el teclat, per exemple, 562 00:33:45,100 --> 00:33:50,690 no és una paraula real, els personatges no 20, però suposo que ell o ella actualment els tipus d' 563 00:33:50,690 --> 00:33:52,770 alguns personatges que representen codi. 564 00:33:52,770 --> 00:33:55,320 I no serà el codi C, en realitat seran els personatges 565 00:33:55,320 --> 00:33:59,290 que representen el codi binari de màquina, 0s i 1s. 566 00:33:59,290 --> 00:34:01,290 Però suposem que ets prou intel · ligent com per fer això, 567 00:34:01,290 --> 00:34:06,500 per fer alguna manera en l'indicatiu GetString una cosa que és essencialment codi compilat, 568 00:34:06,500 --> 00:34:09,980 i els últims 4 bytes sobreescriure aquest remitent. 569 00:34:09,980 --> 00:34:13,360 I quina direcció vol que l'entrada de fer-ho? 570 00:34:13,360 --> 00:34:18,630 S'emmagatzema realment en aquest rectangle vermell la direcció del primer byte de la memòria intermèdia. 571 00:34:18,630 --> 00:34:23,070 Així que cal ser molt intel · ligent, i això és un munt de prova i error per a la gent dolenta per aquí, 572 00:34:23,070 --> 00:34:25,639 però si vostè pot esbrinar què tan gran és aquest tampó 573 00:34:25,639 --> 00:34:28,820 de manera que els últims bytes de l'entrada li proporcionarà al programa 574 00:34:28,820 --> 00:34:33,540 passar a ser equivalent a la direcció de l'inici del seu buffer, que pot fer això. 575 00:34:33,540 --> 00:34:39,320 Si diem hola i normalment 0 \, això és el que acaba en la memòria intermèdia. 576 00:34:39,320 --> 00:34:44,420 Però si ets més intel · ligent i omplim aquest memòria intermèdia amb el que genèricament anomenarem codi d'atac - 577 00:34:44,420 --> 00:34:48,860 AAA, atac, atac, atac - que és només una cosa que fa una cosa dolenta, 578 00:34:48,860 --> 00:34:51,820 Què passa si ets realment intel · ligent, és possible fer això. 579 00:34:51,820 --> 00:34:58,610 En el quadre vermell aquí és una seqüència de nombres - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Recordeu que que coincideix amb el nombre que està aquí dalt. 581 00:35:01,610 --> 00:35:04,430 Està en ordre invers, però més d'això en un altre moment. 582 00:35:04,430 --> 00:35:08,140 Tingueu en compte que aquesta direcció de retorn s'hagin modificat 583 00:35:08,140 --> 00:35:12,020 per igualar la direcció d'aquí, no l'adreça de la principal. 584 00:35:12,020 --> 00:35:17,500 Així que si el dolent de la pel · lícula és súper intel · ligent, ell o ella va a incloure en aquest codi d'atac 585 00:35:17,500 --> 00:35:20,930 una mena eliminar tots els arxius de l'usuari o copiar les contrasenyes 586 00:35:20,930 --> 00:35:24,680 o crear un compte d'usuari que pot accedir a - res en absolut. 587 00:35:24,680 --> 00:35:26,950 >> I aquest és el perill i el poder de la C. 588 00:35:26,950 --> 00:35:29,840 Com que té accés a la memòria a través de punters 589 00:35:29,840 --> 00:35:32,520 i per tant es pot escriure el que vulgui en la memòria d'un ordinador, 590 00:35:32,520 --> 00:35:35,080 vostè pot fer que un equip fer el que vulguis 591 00:35:35,080 --> 00:35:39,550 simplement per haver-ho saltar dins del seu propi espai de memòria. 592 00:35:39,550 --> 00:35:44,650 I així fins al dia d'avui tants programes i llocs web internacionals de tants que estan en perill 593 00:35:44,650 --> 00:35:46,200 es redueixen a les persones que prenen avantatge d'això. 594 00:35:46,200 --> 00:35:50,760 I això pot semblar un sofisticat atac super, però no sempre comença d'aquesta manera. 595 00:35:50,760 --> 00:35:53,560 La realitat és que el que la gent dolenta sol fer és, 596 00:35:53,560 --> 00:35:58,200 si es tracta d'un programa en una línia d'ordres o un programa d'interfície gràfica d'usuari o una pàgina web, 597 00:35:58,200 --> 00:35:59,940 que acaba de començar a proporcionar una tonteria. 598 00:35:59,940 --> 00:36:03,980 Vostè escriu en una paraula molt gran en el camp de cerca i prémer Retorn, 599 00:36:03,980 --> 00:36:05,780 i esperar a veure si el lloc web s'estavella 600 00:36:05,780 --> 00:36:09,990 o esperar a veure si el programa es manifesta algun missatge d'error 601 00:36:09,990 --> 00:36:14,330 perquè si tens sort com el dolent de la pel · lícula i oferiments entrada boig 602 00:36:14,330 --> 00:36:18,980 que bloqueja el programa, el que significa que el programador no va preveure el seu mal comportament, 603 00:36:18,980 --> 00:36:23,630 el que significa que probablement pot amb bastant esforç, el judici suficient i error, 604 00:36:23,630 --> 00:36:26,650 trobar la manera de lliurar un atac més precís. 605 00:36:26,650 --> 00:36:31,410 Així que una part tan important de la seguretat no és només evitar aquests atacs en conjunt 606 00:36:31,410 --> 00:36:34,100 però la seva detecció i, de fet mirant logs 607 00:36:34,100 --> 00:36:36,780 i veure el que la gent boja entrades teclejades al seu lloc web, 608 00:36:36,780 --> 00:36:38,960 quins termes de recerca i la gent escriu a la seva pàgina web 609 00:36:38,960 --> 00:36:42,870 amb l'esperança d'algun desbordament buffer. 610 00:36:42,870 --> 00:36:45,500 I tot això es redueix al bàsic senzilles del que és una matriu 611 00:36:45,500 --> 00:36:49,080 i què significa per assignar i utilitzar la memòria. 612 00:36:49,080 --> 00:36:51,710 >> Relacionat a continuació, que també és aquesta. 613 00:36:51,710 --> 00:36:54,280 Anem a fer una ullada a l'interior d'un disc dur nou. 614 00:36:54,280 --> 00:36:58,440 Vostè recordarà d'una o dues setmanes enrere, que en arrossegar arxius a la paperera de reciclatge o pot d'escombraries, 615 00:36:58,440 --> 00:37:03,710 Què passa? >> [Estudiant] Res. >> Absolutament res, oi? 616 00:37:03,710 --> 00:37:05,740 Finalment, si s'executa sense espai en disc, 617 00:37:05,740 --> 00:37:08,190 Windows o Mac OS començarà a eliminar arxius per vostè. 618 00:37:08,190 --> 00:37:10,390 Però si arrossega alguna cosa aquí, això no és del tot segur. 619 00:37:10,390 --> 00:37:13,800 Tota la seva company de quart o d'un amic o membre de la família ha de fer és doble clic i, voila, 620 00:37:13,800 --> 00:37:16,310 hi ha tots els arxius incomplets que van intentar esborrar. 621 00:37:16,310 --> 00:37:19,590 La majoria de nosaltres si més no saber que vostè ha de fer clic dret o control Premeu 622 00:37:19,590 --> 00:37:22,310 i buidar les escombraries o alguna cosa així. 623 00:37:22,310 --> 00:37:25,000 Però fins i tot llavors, que no acaba de fer el truc 624 00:37:25,000 --> 00:37:28,010 perquè el que passa quan es té un arxiu en el disc dur 625 00:37:28,010 --> 00:37:32,770 que representa algun document de Word o algun JPEG, el que representa el disc dur, 626 00:37:32,770 --> 00:37:35,350 i diguem que aquesta estella aquí representa aquest arxiu, 627 00:37:35,350 --> 00:37:38,390 i es compon d'un munt de 0s i 1s. 628 00:37:38,390 --> 00:37:42,470 Què passa quan vostè no només arrossegar el fitxer a la paperera o paperera de reciclatge 629 00:37:42,470 --> 00:37:48,020 però també buidar? Una espècie de res. 630 00:37:48,020 --> 00:37:49,640 No hi ha absolutament res ara. 631 00:37:49,640 --> 00:37:54,290 Ara només és res perquè una mica d'alguna cosa que passa en la forma d'aquesta taula. 632 00:37:54,290 --> 00:37:58,370 Així que hi ha una mena de base de dades o taula dins de la memòria d'un ordinador 633 00:37:58,370 --> 00:38:03,850 que essencialment té una columna per als noms de fitxers i una columna per als arxius 'ubicació, 634 00:38:03,850 --> 00:38:07,720 on això podria ser la ubicació 123, un nombre a l'atzar. 635 00:38:07,720 --> 00:38:14,560 Així que podríem tenir quelcom x.jpeg i la ubicació 123. 636 00:38:14,560 --> 00:38:18,800 Què passa llavors quan realment buidar la paperera? 637 00:38:18,800 --> 00:38:20,330 Que se'n vagin. 638 00:38:20,330 --> 00:38:23,610 Però el que no desapareix és el 0s i 1s. 639 00:38:23,610 --> 00:38:26,270 >> Quina és llavors la connexió a pset4? 640 00:38:26,270 --> 00:38:31,240 Bé, amb pset4, només perquè hem esborrat accidentalment la targeta Compact Flash 641 00:38:31,240 --> 00:38:35,750 que tenia totes les fotos o simplement perquè la mala sort es va corrompre 642 00:38:35,750 --> 00:38:38,000 no vol dir que el 0 i 1 no estan encara allà. 643 00:38:38,000 --> 00:38:40,410 Potser alguns d'ells s'han perdut perquè alguna cosa es corromp 644 00:38:40,410 --> 00:38:43,320 en el sentit que alguns 0s i 1s 1s convertir es va convertir en 0s. 645 00:38:43,320 --> 00:38:47,240 Les coses dolentes poden succeir a causa de programari defectuós o maquinari defectuós. 646 00:38:47,240 --> 00:38:50,370 Però molts d'aquests bits, potser fins i tot el 100% d'ells, encara hi són. 647 00:38:50,370 --> 00:38:55,050 És que l'ordinador o la càmera no sap on va començar JPEG1 648 00:38:55,050 --> 00:38:56,910 i on JPEG2 començar. 649 00:38:56,910 --> 00:39:01,070 Però si, el programador, saber amb una mica de sentit comú en aquests JPEGs són 650 00:39:01,070 --> 00:39:06,010 o com es veuen perquè pugui analitzar el 0 i 1 i diuen JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 vostè pot escriure un programa amb essencialment un bucle for o while 652 00:39:09,440 --> 00:39:12,820 que es recupera cada un d'aquests arxius. 653 00:39:12,820 --> 00:39:16,030 Així que la lliçó és, doncs, per començar a esborrar els arxius de forma segura 654 00:39:16,030 --> 00:39:18,340 si vols evitar això del tot. Sí 655 00:39:18,340 --> 00:39:21,010 >> [Estudiant] Com és que diu en el seu ordinador 656 00:39:21,010 --> 00:39:23,550 que té més memòria que abans? 657 00:39:23,550 --> 00:39:27,820 Tenir més memòria que abans - >> [estudiant] Més memòria disponible. 658 00:39:27,820 --> 00:39:29,630 Oh. Bona pregunta. 659 00:39:29,630 --> 00:39:32,360 Llavors, per què després de buidar les escombraries té el seu ordinador li dirà 660 00:39:32,360 --> 00:39:34,910 que té més espai lliure que abans? 661 00:39:34,910 --> 00:39:36,770 En poques paraules, perquè està mentint. 662 00:39:36,770 --> 00:39:40,740 Més tècnicament, vostè té més espai perquè ara vostè ha dit 663 00:39:40,740 --> 00:39:43,680 pots posar altres coses en aquest arxiu una vegada va ser. 664 00:39:43,680 --> 00:39:45,450 Però això no vol dir que els bits desapareixeran, 665 00:39:45,450 --> 00:39:48,590 i això no vol dir que els bits estan sent canviats per a tots 0s, per exemple, 666 00:39:48,590 --> 00:39:50,150 per a la seva protecció. 667 00:39:50,150 --> 00:39:54,640 Així que per contra, si bé esborrar arxius o destruir físicament el dispositiu, 668 00:39:54,640 --> 00:39:57,300 que és realment l'única manera de vegades al voltant d'això. 669 00:39:57,300 --> 00:40:02,020 >> Així que per què no ens anem en aquesta nota semi-por, i ens veiem el dilluns. 670 00:40:02,020 --> 00:40:07,000 [Aplaudiment] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]