1 00:00:00,000 --> 00:00:10,970 >> [Reproducció de música] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. Malan: Molt bé. 3 00:00:12,536 --> 00:00:13,392 >> [El] 4 00:00:13,392 --> 00:00:14,240 >> Benvingut de nou. 5 00:00:14,240 --> 00:00:14,990 Aquesta és CS50. 6 00:00:14,990 --> 00:00:16,890 I aquest cap de setmana 5. 7 00:00:16,890 --> 00:00:20,020 I fins ara, tenim més o menys estat prenent per fet que hi ha 8 00:00:20,020 --> 00:00:23,480 existeix aquest compilador, Clang, que has s'invoca a través d'aquest 9 00:00:23,480 --> 00:00:27,100 altra eina anomenada Fer que d'alguna manera màgicament converteix el codi font 10 00:00:27,100 --> 00:00:31,350 en codi objecte, els zeros i uns que la CPU del seu ordinador, al centre 11 00:00:31,350 --> 00:00:33,410 unitat de processament, en realitat entén. 12 00:00:33,410 --> 00:00:36,770 Però resulta que hi ha un nombre que és passant per sota de la campana a 13 00:00:36,770 --> 00:00:38,690 entre l'entrada i la sortida. 14 00:00:38,690 --> 00:00:41,800 >> I m'agradaria proposar que la carn que en una mica més detall en 15 00:00:41,800 --> 00:00:45,130 aquests quatre passos, tenen alguna cosa que es diu pre-processament, cosa 16 00:00:45,130 --> 00:00:48,300 diu compilar, el que hem vist, cosa que es diu el muntatge, i 17 00:00:48,300 --> 00:00:49,420 cosa que es diu enllaç. 18 00:00:49,420 --> 00:00:53,270 Així que fins ara, en alguns dels nostres programes, hem tingut aguda inclou. 19 00:00:53,270 --> 00:00:56,650 Més recentment, hem tingut alguns forta defineix les constants. 20 00:00:56,650 --> 00:01:00,660 Així que resulta que les coses que estan precedits pel símbol o 21 00:01:00,660 --> 00:01:04,150 el símbol de la lliura són pre-processador directives. 22 00:01:04,150 --> 00:01:07,960 Això és només una forma elegant de dir que és una línia de codi que en realitat 23 00:01:07,960 --> 00:01:12,280 convertit en alguna cosa més abans que el ordinador, fins i tot tractar de convertir la seva 24 00:01:12,280 --> 00:01:13,800 programa en zeros i uns. 25 00:01:13,800 --> 00:01:19,000 >> Per exemple, agut inclou estàndard I / O. H, pràcticament només vol dir anar 26 00:01:19,000 --> 00:01:24,010 per davant, agafa el contingut dels arxius stdio.h i enganxar allà. 27 00:01:24,010 --> 00:01:25,880 Així que no hi ha zeros i uns en aquest punt encara. 28 00:01:25,880 --> 00:01:27,470 No deixa de ser una substitució. 29 00:01:27,470 --> 00:01:30,790 I això es fa durant l'anomenada etapa de pre-processament, quan es 30 00:01:30,790 --> 00:01:34,230 realment executi Clang o específicament Fer en la majoria dels casos. 31 00:01:34,230 --> 00:01:36,950 Així que tot això ha estat succeint primer de forma automàtica fins al moment. 32 00:01:36,950 --> 00:01:38,800 >> Després ve l'etapa de compilació. 33 00:01:38,800 --> 00:01:40,920 Però hem estat molt simplificada compilació. 34 00:01:40,920 --> 00:01:45,060 Compilar un programa realment significa prendre d'una cosa així com C, el 35 00:01:45,060 --> 00:01:48,430 codi font que hem estat escrivint, sota a alguna cosa que es diu muntatge. 36 00:01:48,430 --> 00:01:52,900 El llenguatge assemblador és un nivell més baix llenguatge que, per sort, no ho farem 37 00:01:52,900 --> 00:01:55,480 tenen molta oportunitat d' escriure aquest semestre. 38 00:01:55,480 --> 00:01:59,100 Però és en el nivell més baix de la sentit que, literalment, començar a escriure 39 00:01:59,100 --> 00:02:04,270 sumar i restar i multiplicar i carregar de la memòria i guardar a la memòria, el 40 00:02:04,270 --> 00:02:08,259 instruccions molt bàsiques que un ordinador, sota de la caputxa, 41 00:02:08,259 --> 00:02:09,639 realment entén. 42 00:02:09,639 --> 00:02:14,930 >> Finalment, el muntatge deté idioma dels zeros i uns que hem estat 43 00:02:14,930 --> 00:02:16,190 descrivint fins ara. 44 00:02:16,190 --> 00:02:19,270 I en veritat, finalment, hi ha l'anomenat vinculació fase, que anem a 45 00:02:19,270 --> 00:02:22,360 veure en un moment, que combina els zeros i els uns amb els zeros i 46 00:02:22,360 --> 00:02:24,870 les altres persones abans que ha creat. 47 00:02:24,870 --> 00:02:26,660 >> Així que consideri aquest programa super simple. 48 00:02:26,660 --> 00:02:27,560 Va ser a partir de la setmana 1. 49 00:02:27,560 --> 00:02:29,610 Simplement va dir, Hello World, a la pantalla. 50 00:02:29,610 --> 00:02:30,920 Vam fer això a través d'Clang. 51 00:02:30,920 --> 00:02:33,200 O ens trobem que a través de Make que es va desenvolupar Clang. 52 00:02:33,200 --> 00:02:36,170 I emesa en el moment en què alguns zeros i uns. 53 00:02:36,170 --> 00:02:38,100 Però resulta que hi ha un pas intermedi. 54 00:02:38,100 --> 00:02:40,460 Si em vaig d'aquí - Ui, no ho va fer Vull veure-ho encara. 55 00:02:40,460 --> 00:02:44,800 Si em vaig d'aquí amb el meu aparell i obro hello.c, aquí 56 00:02:44,800 --> 00:02:46,160 és que el mateix programa. 57 00:02:46,160 --> 00:02:48,600 I el que faré en el meu terminal finestra d'aquí se me'n va a 58 00:02:48,600 --> 00:02:51,430 executar Clang en lloc de fer que automatitza els quatre 59 00:02:51,430 --> 00:02:52,870 els passos a seguir per a nosaltres. 60 00:02:52,870 --> 00:02:58,620 I jo faré soroll metàl · lic-S i llavors hello.c i escriviu. 61 00:02:58,620 --> 00:03:00,590 >> I em surt un missatge parpellejant una altra vegada, la qual cosa és bo. 62 00:03:00,590 --> 00:03:05,280 I ara en una finestra una mica més gran, Vaig a obrir gedit aquí. 63 00:03:05,280 --> 00:03:09,610 I vaig a obrir un arxiu que, Resulta que es diu hello.s aquest 64 00:03:09,610 --> 00:03:11,870 que conté llenguatge assemblador M'he referit abans. 65 00:03:11,870 --> 00:03:15,060 I això és el que s'anomena muntatge idioma, nivell força baix 66 00:03:15,060 --> 00:03:18,470 instruccions que el CPU Intel o el que és el que hi ha dins 67 00:03:18,470 --> 00:03:19,350 entén. 68 00:03:19,350 --> 00:03:24,480 I mov és per al moviment. La crida és per trucant, una funció molt baix nivell. 69 00:03:24,480 --> 00:03:26,380 sub és per restar. 70 00:03:26,380 --> 00:03:30,370 >> Així que quan vostè té una CPU en particular dins del seu equip, el que fa que sigui 71 00:03:30,370 --> 00:03:34,300 diferents, en comparació amb altres CPUs al mercat, és que les instruccions que 72 00:03:34,300 --> 00:03:39,460 entén i sovint l'eficient que és a dir, la rapidesa amb què és en l'execució d'alguns 73 00:03:39,460 --> 00:03:40,380 d'aquestes instruccions. 74 00:03:40,380 --> 00:03:45,150 Ara per obtenir més informació, pot prendre juntament CS61 tardor a la universitat. 75 00:03:45,150 --> 00:03:48,170 Però aquí tenim, per exemple, uns pocs identificadors que poguessin semblar familiar. 76 00:03:48,170 --> 00:03:50,150 hola.c és el nom del programa. 77 00:03:50,150 --> 00:03:51,070 >> . Text - 78 00:03:51,070 --> 00:03:54,190 no hi ha molt d'interès no en aquest moment, recordar que el text 79 00:03:54,190 --> 00:03:59,190 segment, a partir de dilluns, és on en memòria del programa de realitat acaba. 80 00:03:59,190 --> 00:04:01,330 Així que almenys vagament familiars allà. 81 00:04:01,330 --> 00:04:03,730 Aquí, per descomptat, és una menció de la nostra funció principal. 82 00:04:03,730 --> 00:04:07,220 Desplaçament cap avall, aquests es refereixen a les coses anomenats registres, molt petits trossos de 83 00:04:07,220 --> 00:04:09,190 memòria dins de la CPU real. 84 00:04:09,190 --> 00:04:12,930 I si em desplaço cap avall fins encara més, veig una mena 85 00:04:12,930 --> 00:04:14,240 menció indirecta d'ASCII. 86 00:04:14,240 --> 00:04:17,120 I, de fet, és aquesta cadena, hola, coma, món. 87 00:04:17,120 --> 00:04:20,079 >> Així que conte llarg, això ha estat passant per vostè, de forma automàtica, 88 00:04:20,079 --> 00:04:22,140 sota de la caputxa de tot aquest temps. 89 00:04:22,140 --> 00:04:26,450 I el que està succeint realment és, un cop se li han acabat Clang, o per mitjà de 90 00:04:26,450 --> 00:04:29,150 Fa, vostè està rebent en primer lloc, a partir del codi font, la 91 00:04:29,150 --> 00:04:30,700 cridats en llenguatge assemblador. 92 00:04:30,700 --> 00:04:35,210 Llavors Clang és convertir aquest conjunt llengua a zeros i uns. 93 00:04:35,210 --> 00:04:38,340 I aquesta és la diapositiva que vam començar nostra discussió en la setmana 0 a - 94 00:04:38,340 --> 00:04:39,840 i a continuació, a la Setmana 1. 95 00:04:39,840 --> 00:04:44,030 I, finalment, els zeros i uns es combinen amb els zeros i uns 96 00:04:44,030 --> 00:04:47,190 d'aquelles biblioteques que hem estat prenent per fet, com E / S estàndard o el 97 00:04:47,190 --> 00:04:50,010 Biblioteca cordes o fins i tot la biblioteca CS50. 98 00:04:50,010 --> 00:04:54,200 >> Així que per pintar aquest quadre més visualment, tenim hello.c. 99 00:04:54,200 --> 00:04:57,220 I, per descomptat, utilitza el printf funcionar per dir hola món. 100 00:04:57,220 --> 00:05:01,810 El pas de compilació presa fins aquest arxiu només vam veure hello.s, fins i tot 101 00:05:01,810 --> 00:05:04,290 però, que està suprimit típicament automàticament. 102 00:05:04,290 --> 00:05:06,050 Però aquest és el codi de l'assemblea en el pas intermedi. 103 00:05:06,050 --> 00:05:09,750 I després, quan ens vam reunir el conjunt llenguatge, per així dir-ho, que és quan es 104 00:05:09,750 --> 00:05:10,830 aconseguir aquests zeros i uns. 105 00:05:10,830 --> 00:05:13,920 Per això hem acostat efectivament avui el que hem donat per fet, 106 00:05:13,920 --> 00:05:16,430 significa anar codi font codi objecte. 107 00:05:16,430 --> 00:05:18,850 >> Però, finalment, ara que mateix quadre - anem a ficar-ho a 108 00:05:18,850 --> 00:05:20,020 la banda esquerra. 109 00:05:20,020 --> 00:05:22,880 I tingui en compte que en la part superior hi ha Vaig esmentar stdio.h. 110 00:05:22,880 --> 00:05:25,030 És un arxiu que hem inclòs en gairebé tots els 111 00:05:25,030 --> 00:05:26,250 programes que hem escrit. 112 00:05:26,250 --> 00:05:28,830 I això és l'arxiu el contingut obtenir còpia enganxada, 113 00:05:28,830 --> 00:05:30,350 efectivament dalt del seu codi. 114 00:05:30,350 --> 00:05:34,170 Però resulta que, en un ordinador sistema en algun lloc, hi ha probablement una 115 00:05:34,170 --> 00:05:39,150 arxiu stdio.c que algú va escriure anys Fa que implementa tota la 116 00:05:39,150 --> 00:05:41,870 funcions que van ser declarades a stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Ara, en realitat, no és probable que el el seu Mac o el PC o fins i tot al 118 00:05:45,465 --> 00:05:47,660 CS50 aparell és un codi C cru. 119 00:05:47,660 --> 00:05:52,710 Algú ja ho va recopilar i va incloure . O arxiu de codi objecte o. Un 120 00:05:52,710 --> 00:05:56,020 arxiu, que és una biblioteca compartida que ha estat pre-instal lat i 121 00:05:56,020 --> 00:05:57,240 pre-compilat per a vostè. 122 00:05:57,240 --> 00:06:01,950 Però suposem que efectivament hi ha al nostre stdio.c ordinador en paral · lel 123 00:06:01,950 --> 00:06:02,650 amb Clang. 124 00:06:02,650 --> 00:06:04,960 El seu codi està sent compilat i muntats. 125 00:06:04,960 --> 00:06:09,200 Codi stdio.c 's s'està recopilant i acoblat, de manera que aquest últim 126 00:06:09,200 --> 00:06:13,730 pas, aquí, hem de d'alguna manera enllaç, per així dir-ho, els seus zeros i uns 127 00:06:13,730 --> 00:06:18,430 amb els seus zeros i uns en un senzill programa que en última instància és 128 00:06:18,430 --> 00:06:20,540 anomenat simplement Hola. 129 00:06:20,540 --> 00:06:23,340 >> Així que això és tota la màgia que és vingut succeint fins ara. 130 00:06:23,340 --> 00:06:26,430 I seguirà prenent aquests processos per fet, però s'adonen 131 00:06:26,430 --> 00:06:28,750 hi ha un munt de detalls sucosos passant per sota allà. 132 00:06:28,750 --> 00:06:31,920 I això és el que fa que la seva ordinador amb Intel a l'interior 133 00:06:31,920 --> 00:06:33,940 particularment diferent. 134 00:06:33,940 --> 00:06:37,020 >> Així que en aquest sentit, si es desitja uneix-t'hi per dinar el divendres, no anar 135 00:06:37,020 --> 00:06:41,570 al lloc habitual cs50.net/rsvp, 13:15 aquest divendres. 136 00:06:41,570 --> 00:06:43,400 I ara alguns anuncis. 137 00:06:43,400 --> 00:06:44,670 Llavors tenim bones notícies. 138 00:06:44,670 --> 00:06:45,970 I tenim una mala notícia. 139 00:06:45,970 --> 00:06:47,260 Comenceu amb una bona notícia aquí. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Gemec] 142 00:06:54,510 --> 00:06:54,710 >> Està bé. 143 00:06:54,710 --> 00:06:56,670 Bé, tècnicament és un dia de festa, per la qual cosa no és tant un regal de nosaltres. 144 00:06:56,670 --> 00:06:58,030 Però la mala notícia, és clar. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Gemec] 147 00:07:01,880 --> 00:07:03,530 >> Em vaig passar un munt de temps en les animacions. 148 00:07:03,530 --> 00:07:04,690 >> [El] 149 00:07:04,690 --> 00:07:07,000 >> Hi haurà una sessió de revisió dilluns que ve. 150 00:07:07,000 --> 00:07:08,340 Serà a les 5:30 AM. 151 00:07:08,340 --> 00:07:11,210 Li recorden tots aquests detalls per correu electrònic en el camp de 152 00:07:11,210 --> 00:07:13,470 lloc web en tan sols un parell de dies. 153 00:07:13,470 --> 00:07:16,610 Serà filmat i posat a disposició poc després. 154 00:07:16,610 --> 00:07:19,200 Així que si vostè no pot fer que dilluns ranura per a la nit, no et preocupis. 155 00:07:19,200 --> 00:07:22,270 Seccions setmana que ve també centrar-se en la revisió de la prova. 156 00:07:22,270 --> 00:07:25,670 Si la secció és dilluns, que és efectivament vacances universitàries, ho farem 157 00:07:25,670 --> 00:07:26,920 sense deixar de complir en la secció. 158 00:07:26,920 --> 00:07:28,890 Si vostè simplement no pot fer que secció perquè et vas 159 00:07:28,890 --> 00:07:29,860 de distància, està bé. 160 00:07:29,860 --> 00:07:33,710 Assistir a una secció dimarts o diumenge o posada a punt a la secció de Jason, és que 161 00:07:33,710 --> 00:07:35,110 disponible en línia. 162 00:07:35,110 --> 00:07:37,490 >> Per tant, més males notícies. 163 00:07:37,490 --> 00:07:41,960 Així que d'acord amb el pla d'estudis, tenim conferència el proper divendres. 164 00:07:41,960 --> 00:07:43,690 Però la bona notícia - 165 00:07:43,690 --> 00:07:44,860 clarament, vaig passar molt de temps en això. 166 00:07:44,860 --> 00:07:45,280 >> [El] 167 00:07:45,280 --> 00:07:47,140 >> Nosaltres cancel · larem pròxima conferències de divendres. 168 00:07:47,140 --> 00:07:50,590 Així que serà un regal per a nosaltres, per la qual cosa realment pot tenir un respir en 169 00:07:50,590 --> 00:07:52,990 entre aquesta setmana i dues setmanes aquí. 170 00:07:52,990 --> 00:07:57,460 Així que no hi ha classes la setmana que ve, només una petita petit qüestionari, per la qual cosa cal 171 00:07:57,460 --> 00:07:59,030 sent cada vegada més excitat. 172 00:07:59,030 --> 00:08:03,870 >> Així que ara anem a centrar l'atenció en cosa que és de fet més visual 173 00:08:03,870 --> 00:08:06,990 i més emocionant i per establir les bases per al que va a estar a l'horitzó 174 00:08:06,990 --> 00:08:08,420 en només un parell de setmanes. 175 00:08:08,420 --> 00:08:12,160 Després de la primera prova, anem a convertir el l'enfocament dels nostres butlletins de problemes a un altre 176 00:08:12,160 --> 00:08:16,710 problema específic de domini, que d' forense o la seguretat en general. 177 00:08:16,710 --> 00:08:19,550 >> De fet, la tradició amb aquest problema joc és per a mi un dels 178 00:08:19,550 --> 00:08:24,850 l'ensenyament de companys o CA de creuar campus de prendre algunes fotografies de 179 00:08:24,850 --> 00:08:29,450 identificables, però no persones òbvies, llocs o coses, i després cada any que 180 00:08:29,450 --> 00:08:34,520 arreglen per eliminar accidentalment o danyar la targeta de mitjans digitals 181 00:08:34,520 --> 00:08:35,720 que està dins de la nostra càmera. 182 00:08:35,720 --> 00:08:36,860 Però no és gran cosa. 183 00:08:36,860 --> 00:08:39,200 Puc seguir endavant i connectar que en el meu ordinador. 184 00:08:39,200 --> 00:08:43,010 Jo puc fer una imatge forense de la mateixa, pel que a parlar, copiant els zeros i 185 00:08:43,010 --> 00:08:46,830 els fora de que la targeta de memòria, ja sigui és una targeta SD o targeta de memòria flash compacta o 186 00:08:46,830 --> 00:08:48,100 el que vostè està familiaritzat. 187 00:08:48,100 --> 00:08:49,300 I després podem lliurar això. 188 00:08:49,300 --> 00:08:53,190 >> I així, el repte per davant, entre d'altres coses per a tu, seran per a escriure 189 00:08:53,190 --> 00:08:58,630 Codi C que recupera un munt de JPEG per a mi i revelades seran 190 00:08:58,630 --> 00:09:00,190 aquestes persones, llocs o coses. 191 00:09:00,190 --> 00:09:03,340 I també parlarem, en aquest problema establert i en els dies per venir, 192 00:09:03,340 --> 00:09:04,440 més gràfics en general. 193 00:09:04,440 --> 00:09:06,140 Nosaltres els hem utilitzat, un curs, per sortir. 194 00:09:06,140 --> 00:09:09,080 Però vostè ha pres una espècie de per fet hi ha aquestes nocions d'alt nivell 195 00:09:09,080 --> 00:09:10,680 de rectangles i ovals. 196 00:09:10,680 --> 00:09:12,450 Però sota de la caputxa hi ha píxels. 197 00:09:12,450 --> 00:09:14,370 I han hagut de començar pensar en ells. 198 00:09:14,370 --> 00:09:18,800 O vostè per p-set 4, que pensar per la diferència entre les rajoles, com 199 00:09:18,800 --> 00:09:21,990 ràpidament que estiguis bola es mou a través de la pantalla d'esclatar. 200 00:09:21,990 --> 00:09:24,830 Així que hi ha aquesta noció de la punts a la pantalla que és 201 00:09:24,830 --> 00:09:26,290 entrar en joc ja. 202 00:09:26,290 --> 00:09:29,430 >> Ara el que es veu, però, és el que s'obté en una pantalla d'ordinador. 203 00:09:29,430 --> 00:09:33,680 Si alguna vegada has vist algun bé o mala televisió, les probabilitats són que pràcticament 204 00:09:33,680 --> 00:09:36,280 tractar al públic com tecnòfobs que realment no 205 00:09:36,280 --> 00:09:37,630 saber molt sobre la computació. 206 00:09:37,630 --> 00:09:40,840 I el que és molt fàcil per a la policia detectiu que dir, oi 207 00:09:40,840 --> 00:09:41,710 netejar això per a mi? 208 00:09:41,710 --> 00:09:42,710 O millorar, no? 209 00:09:42,710 --> 00:09:45,550 Millorar és com la paraula de moda a la majoria de qualsevol programa relacionat amb la delinqüència. 210 00:09:45,550 --> 00:09:49,240 I la realitat és que si vostè pren un imatge borrosa d'un sospitós fent 211 00:09:49,240 --> 00:09:51,620 una cosa dolenta, no es pot simplement millorar-la. 212 00:09:51,620 --> 00:09:53,080 No es pot ampliar fins a l'infinit. 213 00:09:53,080 --> 00:09:56,350 No es pot veure en el reflex d'algú ull que va cometre que 214 00:09:56,350 --> 00:09:59,860 delicte en particular, tot i la prevalença d'aquesta a la televisió. 215 00:09:59,860 --> 00:10:04,110 >> I així, amb que anem a motivar que proper problema conjunt amb una visió a 216 00:10:04,110 --> 00:10:05,765 alguns programes amb els quals podria ser familiar. 217 00:10:05,765 --> 00:10:06,500 >> [REPRODUIR VIDEO] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Ara, anem a obtenir un bon cop d'ull. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Un moment. 222 00:10:17,766 --> 00:10:18,658 Executar dit. 223 00:10:18,658 --> 00:10:19,550 >> -Espera un minut. 224 00:10:19,550 --> 00:10:21,580 Anar a la dreta. 225 00:10:21,580 --> 00:10:21,800 >> -No. 226 00:10:21,800 --> 00:10:22,690 Congelar això. 227 00:10:22,690 --> 00:10:23,692 >> Pantalla completa. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Congelar això. 230 00:10:24,154 --> 00:10:25,140 >> -Estrènyer en això, vols? 231 00:10:25,140 --> 00:10:27,090 >> -Vector en aquest tipus per la roda del darrere. 232 00:10:27,090 --> 00:10:29,730 >> -Apropar aquí en aquest lloc. 233 00:10:29,730 --> 00:10:33,700 >> -Amb l'equip adequat, la imatge formada pot ser ampliat i aguditzat. 234 00:10:33,700 --> 00:10:34,490 >> -Què és això? 235 00:10:34,490 --> 00:10:35,870 >> -Es tracta d'un programa de millora. 236 00:10:35,870 --> 00:10:36,793 >> -Pot vostè aclarir això alguna cosa? 237 00:10:36,793 --> 00:10:38,560 >> -No ho sé. 238 00:10:38,560 --> 00:10:39,090 Anem a millorar-lo. 239 00:10:39,090 --> 00:10:41,690 >> Secció A-6-Millorar. 240 00:10:41,690 --> 00:10:43,510 >> -He millorat el detall i - 241 00:10:43,510 --> 00:10:44,456 >> -Crec que és suficient per millorar. 242 00:10:44,456 --> 00:10:45,402 Deixeu anar a la meva pantalla. 243 00:10:45,402 --> 00:10:47,300 >> -Potenciar la reflexió en el seu ull. 244 00:10:47,300 --> 00:10:49,330 >> -Anem a córrer a través d'aquest millora de vídeo. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, pot millorar això? 246 00:10:50,340 --> 00:10:52,320 >> -Espera. 247 00:10:52,320 --> 00:10:54,290 >> -He estat treballant en aquesta reflexió. 248 00:10:54,290 --> 00:10:55,560 >> -Algú de reflexió. 249 00:10:55,560 --> 00:10:56,440 >> -Reflexió. 250 00:10:56,440 --> 00:10:57,940 >> -Hi ha una reflexió de la cara de l'home. 251 00:10:57,940 --> 00:10:58,860 >> -El reflex. 252 00:10:58,860 --> 00:10:59,710 >> -Hi ha una reflexió. 253 00:10:59,710 --> 00:11:00,900 >> -Faci zoom al mirall. 254 00:11:00,900 --> 00:11:03,500 >> -Es pot veure un reflex. 255 00:11:03,500 --> 00:11:04,700 >> -Es pot millorar la imatge d'aquí? 256 00:11:04,700 --> 00:11:05,700 >> -Pot vostè millorar aquí? 257 00:11:05,700 --> 00:11:06,500 >> -Pots millorar? 258 00:11:06,500 --> 00:11:07,380 >> -Pots millorar? 259 00:11:07,380 --> 00:11:08,190 >> -Podem millorar això? 260 00:11:08,190 --> 00:11:08,940 >> -Pots millorar? 261 00:11:08,940 --> 00:11:10,280 >> -Espera un segon, vaig a millorar. 262 00:11:10,280 --> 00:11:11,570 >> -Acosta't a la porta. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [El] 266 00:11:13,197 --> 00:11:14,360 >> -Entrar a viure 267 00:11:14,360 --> 00:11:15,100 >> -Espera, atura't. 268 00:11:15,100 --> 00:11:15,740 >> -Atura. 269 00:11:15,740 --> 00:11:16,290 >> -Una pausa. 270 00:11:16,290 --> 00:11:19,390 >> -Gireu a 75 graus al voltant per favor la vertical. 271 00:11:19,390 --> 00:11:19,886 >> [El] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, i de nou a la part sobre la porta de nou. 273 00:11:24,350 --> 00:11:26,330 >> -Tinc una imatge potenciador que poden bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Potser puguem usar la Pradeep Sen mètode per veure a les finestres. 275 00:11:28,990 --> 00:11:30,680 >> -Aquest programari és l'estat de la tècnica. 276 00:11:30,680 --> 00:11:31,676 >> -El valor d'icona està apagat. 277 00:11:31,676 --> 00:11:34,166 >> -Amb la combinació correcta d'algoritmes. 278 00:11:34,166 --> 00:11:38,399 >> -Ha pres algorismes d'il · luminació per al següent nivell i que poden utilitzar-los per 279 00:11:38,399 --> 00:11:38,648 millorar aquesta fotografia. 280 00:11:38,648 --> 00:11:42,050 >> -Bloqueig d'encesa i ampliar l'eix z. 281 00:11:42,050 --> 00:11:42,760 >> -Millorar. 282 00:11:42,760 --> 00:11:43,060 >> -Millorar. 283 00:11:43,060 --> 00:11:43,760 >> -Millorar. 284 00:11:43,760 --> 00:11:45,010 >> -Congelar i millorar. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [FI REPRODUCCIÓ DE VÍDEO] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. Malan: So setembre Problema 5 és el que ens espera allà. 288 00:11:51,470 --> 00:11:55,260 Així que aviat tindrem una millor comprensió de quan i per què pot 289 00:11:55,260 --> 00:11:57,300 i la nostra no es pot millorar d'aquesta manera. 290 00:11:57,300 --> 00:12:00,090 Però primer, anem a tornar la nostra atenció a alguns dels components bàsics que anem a 291 00:12:00,090 --> 00:12:02,250 ha de ser capaç d'explicar aquesta història. 292 00:12:02,250 --> 00:12:05,580 >> Així recordem que vam treure aquesta foto a Dilluns i una mica la setmana passada. 293 00:12:05,580 --> 00:12:09,970 I això descriu la disposició de les coses en la memòria de l'equip quan 294 00:12:09,970 --> 00:12:11,000 l'execució d'alguns programes. 295 00:12:11,000 --> 00:12:14,310 El segment de tecnologia al capdamunt, el record, es refereix als zeros reals i uns 296 00:12:14,310 --> 00:12:16,000 que componen el programa. 297 00:12:16,000 --> 00:12:19,340 Hi ha, per sota d'això, alguns inicialitzat o dades sense inicialitzar, que normalment 298 00:12:19,340 --> 00:12:22,910 es refereix a coses com constants o cadenes o variables globals que tenen 299 00:12:22,910 --> 00:12:24,200 estat declarat per endavant. 300 00:12:24,200 --> 00:12:26,500 Aquí està el munt, però anem a venir tornar a això en un moment. 301 00:12:26,500 --> 00:12:27,410 >> I després hi ha la pila. 302 00:12:27,410 --> 00:12:30,660 Igual que una pila de safates al cafeteria, aquí és on la memòria es 303 00:12:30,660 --> 00:12:33,610 capes i capes cada vegada fas el que en un programa? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Quin és l'ús de la pila per? 306 00:12:37,730 --> 00:12:39,320 >> Sí? 307 00:12:39,320 --> 00:12:40,000 >> Truqui a la funció. 308 00:12:40,000 --> 00:12:42,890 Cada vegada que es crida a una funció, és donat estella de memòria per a la seva 309 00:12:42,890 --> 00:12:45,020 variables locals o dels seus paràmetres. 310 00:12:45,020 --> 00:12:48,810 I gràficament, veiem que amb cada funció successiva cridés, quan un 311 00:12:48,810 --> 00:12:52,520 trucades B C trucades trucades D, que aconseguir capes en la pila. 312 00:12:52,520 --> 00:12:55,630 I dins de cadascuna d'aquestes porcions de la memòria és essencialment un únic àmbit 313 00:12:55,630 --> 00:12:58,590 per a aquesta funció, la qual, per descomptat, és problemàtic si es vol lliurar 314 00:12:58,590 --> 00:13:01,850 d'una funció a una altra Una peça de dades que voleu que 315 00:13:01,850 --> 00:13:03,500 per mutar o canviar. 316 00:13:03,500 --> 00:13:08,060 >> Aleshores, quina va ser la nostra solució per a permetre Una funció representada per una pila 317 00:13:08,060 --> 00:13:11,390 emmarcar canviar la memòria en l'interior d'un altre marc de pila? 318 00:13:11,390 --> 00:13:14,590 Com funcionen els dos parlen l'un a l'altre? 319 00:13:14,590 --> 00:13:18,510 Així que a través de punters o adreces, que, de nou, simplement descriure en què 320 00:13:18,510 --> 00:13:22,280 la memòria, per mitjà d'una específica nombre mos, el particular 321 00:13:22,280 --> 00:13:23,830 valor pot ser trobat. 322 00:13:23,830 --> 00:13:26,860 Així recordar l'última vegada també hem continuat la història i va mirar a un 323 00:13:26,860 --> 00:13:28,280 bastant programa defectuós. 324 00:13:28,280 --> 00:13:32,900 I aquest programa està lliure d'errors per a uns pocs raons, però la més preocupant és 325 00:13:32,900 --> 00:13:34,620 perquè no pot comprovar què? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Sí, no marqui l'entrada. 328 00:13:40,450 --> 00:13:41,870 Com? 329 00:13:41,870 --> 00:13:43,880 >> Si es tracta de més de 12 caràcters. 330 00:13:43,880 --> 00:13:47,260 Així que molt intel · ligentment, al trucar memcopy, que, com el seu nom indica, només 331 00:13:47,260 --> 00:13:50,630 memòria de còpies del seu segon argument en el seu primer argument. 332 00:13:50,630 --> 00:13:54,730 El tercer argument, molt intel · ligentment, és revisat per assegurar-se que vostè no ho fa 333 00:13:54,730 --> 00:13:59,400 copiar més de, en aquest cas, la longitud de barres, nombre de caràcters, 334 00:13:59,400 --> 00:14:03,810 en la destinació, que és el array C. Però el problema és que el que 335 00:14:03,810 --> 00:14:07,230 si el mateix C no és prou gran per gestionar això? 336 00:14:07,230 --> 00:14:09,900 Vostè va a copiar el nombre de bytes que s'han donat. 337 00:14:09,900 --> 00:14:13,040 Però, ¿què és el que realment té més bytes que té espai per? 338 00:14:13,040 --> 00:14:16,770 >> Doncs bé, aquest programa molt tontament just cegament procedeix a prendre el que és 339 00:14:16,770 --> 00:14:20,650 dóna, hola barra invertida és 0 genial si la cadena és curta 340 00:14:20,650 --> 00:14:22,040 suficient, com cinc caràcters. 341 00:14:22,040 --> 00:14:26,470 Però si en realitat és 12 caràcters o 1200 caràcters, ens vam veure l'última vegada 342 00:14:26,470 --> 00:14:29,380 que només anem a per complet sobreescriure la memòria que 343 00:14:29,380 --> 00:14:30,470 no li pertany a vostè. 344 00:14:30,470 --> 00:14:34,390 I pitjor dels casos, si es sobreescriu que porció vermella motiu cridem a la 345 00:14:34,390 --> 00:14:35,380 remet - 346 00:14:35,380 --> 00:14:38,370 això és només a l'ordinador automàticament, per a tu, darrere de la 347 00:14:38,370 --> 00:14:43,130 escenes, plecs de distància un valor de 32 bits que li recorda al que la direcció hauria 348 00:14:43,130 --> 00:14:47,080 tornar quan foo, aquesta altra funció, es porta a terme l'execució. 349 00:14:47,080 --> 00:14:49,320 És una molla de pa del tipus a la qual es retorna. 350 00:14:49,320 --> 00:14:52,490 Si sobreescriu que, potencialment, si vostè és el dolent de la pel · lícula, pot va poder 351 00:14:52,490 --> 00:14:54,750 potencialment prendre el control ordinador d'algú. 352 00:14:54,750 --> 00:14:58,020 I el més segur estavellar en la majoria dels casos. 353 00:14:58,020 --> 00:15:01,690 >> Ara bé, aquest problema només es va agreujar com vam començar a parlar de la memòria 354 00:15:01,690 --> 00:15:03,010 gestió en general. 355 00:15:03,010 --> 00:15:07,150 I malloc, per a l'assignació de memòria, és un funció que es pot utilitzar per assignar 356 00:15:07,150 --> 00:15:11,260 memòria quan no sabem per endavant que puguem necessitar. 357 00:15:11,260 --> 00:15:13,960 Així, per exemple, si torno per l'aparell aquí. 358 00:15:13,960 --> 00:15:21,010 I obro l'última vegada hello2.c, recordar aquest programa aquí, que semblava 359 00:15:21,010 --> 00:15:23,500 una mica d'alguna cosa com això, només tres línies - 360 00:15:23,500 --> 00:15:27,940 dir el seu nom, i després nom de la cadena, a l'esquerra, és igual a getString. 361 00:15:27,940 --> 00:15:29,690 I després imprimir-lo, el nom de l'usuari. 362 00:15:29,690 --> 00:15:31,170 >> Així que aquest era un programa super simple. 363 00:15:31,170 --> 00:15:34,870 Perquè quedi clar, deixa anar per davant i fer hola-2. 364 00:15:34,870 --> 00:15:36,680 Jo faré punt slash hola-2. 365 00:15:36,680 --> 00:15:37,750 Digui el seu nom - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Intro. 368 00:15:38,840 --> 00:15:39,540 Hola David. 369 00:15:39,540 --> 00:15:41,060 Sembla que funciona bé. 370 00:15:41,060 --> 00:15:43,140 Però el que realment està passant sota la campana en aquesta llista? 371 00:15:43,140 --> 00:15:44,670 En primer lloc anem a pelar algunes capes. 372 00:15:44,670 --> 00:15:48,380 String és simplement un sinònim hem adonat de què? 373 00:15:48,380 --> 00:15:49,110 Estrelles Char. 374 00:15:49,110 --> 00:15:52,740 Així que farem una mica més complexes però tècnicament més correcta que aquesta 375 00:15:52,740 --> 00:15:55,570 és un estel char, el que significa que nom, sí, és una variable. 376 00:15:55,570 --> 00:15:59,920 Però el que les botigues de noms és la direcció del un char, que se sent una mica estrany 377 00:15:59,920 --> 00:16:01,050 perquè m'estic tornant una cadena. 378 00:16:01,050 --> 00:16:03,580 Estic tornant múltiples caràcters no un char. 379 00:16:03,580 --> 00:16:07,400 >> Però, per descomptat, només cal la primera Direcció de caràcters recordar que el 380 00:16:07,400 --> 00:16:08,870 cadena sencera és perquè ¿per què? 381 00:16:08,870 --> 00:16:12,700 Com es pot esbrinar on és el final de la cadena és saber el principi? 382 00:16:12,700 --> 00:16:13,630 El zero barra invertida. 383 00:16:13,630 --> 00:16:17,260 Així que amb aquests dos pistes d'esbrinar abans que el començament i el final de 384 00:16:17,260 --> 00:16:20,280 qualsevol cadena són, sempre que estiguin format adequadament amb què nul 385 00:16:20,280 --> 00:16:22,110 terminador, que el zero barra invertida. 386 00:16:22,110 --> 00:16:24,520 >> Però això està trucant getString. 387 00:16:24,520 --> 00:16:28,020 I resulta que getString tot aquest temps ha estat una mena de 388 00:16:28,020 --> 00:16:28,820 trampa per a nosaltres. 389 00:16:28,820 --> 00:16:32,460 S'ha estat fent aquesta feina, sens dubte, Obtenció d'una cadena des de l'usuari. 390 00:16:32,460 --> 00:16:34,580 Però on és la memòria es ve? 391 00:16:34,580 --> 00:16:38,440 Si ens remuntem a la imatge aquí i aplicar la definició de només un 392 00:16:38,440 --> 00:16:42,610 Fa moment, que la pila és on memòria quan se'ls crida funcions, 393 00:16:42,610 --> 00:16:45,370 Amb aquesta lògica, quan es diu a getString, i després escric en 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Enter, on és D-A-V-I-D emmagatzema barra invertida zero, sobre la base de la 395 00:16:50,900 --> 00:16:53,480 història que nosaltres hem dit fins aquí? 396 00:16:53,480 --> 00:16:55,190 >> Sembla estar en la pila, no? 397 00:16:55,190 --> 00:16:58,120 Quan es diu a tenir cadena s'obté una petita porció de la memòria a la pila. 398 00:16:58,120 --> 00:17:01,630 Així que és lògic pensar que la D-A-V-I-D s'emmagatzema barra invertida zero 399 00:17:01,630 --> 00:17:02,770 hi ha a la pila. 400 00:17:02,770 --> 00:17:07,680 Però espereu un minut, getString retorns aquesta cadena, per així dir-ho, el que significa 401 00:17:07,680 --> 00:17:11,700 que és la safata de la cafeteria es pren de la pila. 402 00:17:11,700 --> 00:17:14,560 I vam dir l'última vegada que tan aviat com retorna la funció, i prendre aquest 403 00:17:14,560 --> 00:17:20,109 safata, per així dir-ho, de la pila, el es pot assumir sobre les restes d' 404 00:17:20,109 --> 00:17:21,819 que la memòria? 405 00:17:21,819 --> 00:17:25,160 Que tipus d'ells va tornar a dibuixar com a signes d'interrogació perquè es converteixen efectivament 406 00:17:25,160 --> 00:17:26,250 valors desconeguts. 407 00:17:26,250 --> 00:17:29,500 Ells poden ser reutilitzats quan alguns següent funció es diu. 408 00:17:29,500 --> 00:17:31,870 >> En altres paraules, si ens toca a emmagatzemar - 409 00:17:31,870 --> 00:17:34,350 Vaig a dibuixar una imatge ràpida aquí de la pila. 410 00:17:34,350 --> 00:17:38,690 Si arribem a ser el dibuix de la part inferior de la meva segment de memòria, i ho direm 411 00:17:38,690 --> 00:17:42,230 que aquest és el lloc de memòria ocupat per principal i potser arg ci 412 00:17:42,230 --> 00:17:46,790 arg v i qualsevol altra cosa en el programa, quan getString es diu, 413 00:17:46,790 --> 00:17:51,120 presumiblement getString es un tros de memòria aquí. 414 00:17:51,120 --> 00:17:53,940 I llavors D-A-V-I-D d'alguna manera acaba a aquesta funció. 415 00:17:53,940 --> 00:17:55,320 I jo vaig a simplificar en excés. 416 00:17:55,320 --> 00:18:00,050 Però anem a suposar que la seva D-A-V-I-D barra invertida zero. 417 00:18:00,050 --> 00:18:03,500 Així que aquesta quantitat de bytes s'utilitzen en el marc de getString. 418 00:18:03,500 --> 00:18:08,270 >> Però tan aviat com torna GetString, que va dir l'última vegada que aquesta memòria sobre 419 00:18:08,270 --> 00:18:11,340 aquí tot es fa - woops - 420 00:18:11,340 --> 00:18:14,270 tot es torna efectivament esborrats. 421 00:18:14,270 --> 00:18:17,220 I podem pensar en això ara com a qüestió marques, ja que se sap 422 00:18:17,220 --> 00:18:18,720 el que passarà amb aquest record. 423 00:18:18,720 --> 00:18:22,130 De fet, molt sovint criden a funcions que no sigui getString. 424 00:18:22,130 --> 00:18:24,750 I tan aviat com ho dic una altra funció que getString, potser no en 425 00:18:24,750 --> 00:18:28,860 Aquest programa en particular que acabem de veure però en l'altre, sens dubte alguna altra 426 00:18:28,860 --> 00:18:34,180 funció podria arribar a ser donada aquest espot següent a la pila. 427 00:18:34,180 --> 00:18:39,410 >> Per tant, no pot ser que les botigues getString D-A-V-I-D a la pila, perquè ho faria 428 00:18:39,410 --> 00:18:41,040 perdrà immediatament l'accés a la mateixa. 429 00:18:41,040 --> 00:18:43,720 Però sabem que getString només torna el que? 430 00:18:43,720 --> 00:18:47,220 No és tornar a Em sis caràcters. 431 00:18:47,220 --> 00:18:51,090 Què està realment tornant què arribem a la conclusió última vegada? 432 00:18:51,090 --> 00:18:52,480 La direcció de la primera. 433 00:18:52,480 --> 00:18:56,650 Així que d'alguna manera, quan vas getString, que és l'assignació d'una part de la memòria per 434 00:18:56,650 --> 00:18:59,620 la cadena que el tipus i els usuaris direcció i després tornar de la mateixa. 435 00:18:59,620 --> 00:19:02,930 I resulta que quan es vol funcionar per assignar memòria en aquest 436 00:19:02,930 --> 00:19:08,390 camí i tornar a la persona que truca aquesta funció, la direcció de 437 00:19:08,390 --> 00:19:11,870 que parteix de la memòria, malgrat tot no pot posar a la pila al 438 00:19:11,870 --> 00:19:14,750 inferior, ja que funcionalment és només No serà seu molt 439 00:19:14,750 --> 00:19:17,800 ràpidament, el que probablement pot endevinar on probablement tirarem 440 00:19:17,800 --> 00:19:20,130 en canvi, l'anomenada munt. 441 00:19:20,130 --> 00:19:25,290 >> Així que entre la part inferior de la memòria de disseny i la part superior de la memòria de 442 00:19:25,290 --> 00:19:26,820 disseny són un munt de segments. 443 00:19:26,820 --> 00:19:29,270 Una d'elles és la pila, i la dreta per sobre d'ella és el munt. 444 00:19:29,270 --> 00:19:33,680 I heap és només un tros diferent de memòria que no s'utilitza per a les funcions de 445 00:19:33,680 --> 00:19:34,770 quan se'ls crida. 446 00:19:34,770 --> 00:19:38,100 S'utilitza per a la memòria de llarg termini, quan desitja una funció que aconsegueixin unes 447 00:19:38,100 --> 00:19:42,700 memòria i ser capaç d'aferrar a ella sense perdre el control. 448 00:19:42,700 --> 00:19:45,550 >> Ara vostè podria potser immediatament veure que això no és 449 00:19:45,550 --> 00:19:48,060 necessàriament un disseny perfecte. 450 00:19:48,060 --> 00:19:51,350 A mesura que el programa assigna memòria en la pila, o com es diu cada vegada 451 00:19:51,350 --> 00:19:55,540 més funcions, o com es pot assignar memòria en el munt amb malloc apagat com 452 00:19:55,540 --> 00:20:00,690 getString està fent, el que clarament sembla inevitable problema? 453 00:20:00,690 --> 00:20:00,860 >> Dreta. 454 00:20:00,860 --> 00:20:03,150 Igual que el fet que aquestes fletxes estan un davant l'altre 455 00:20:03,150 --> 00:20:04,380 no presagia res de bo. 456 00:20:04,380 --> 00:20:08,630 I, de fet, podríem fallar molt ràpidament un programa en qualsevol nombre de maneres. 457 00:20:08,630 --> 00:20:12,050 De fet, crec que podríem tenir un cop fet això accidentalment. 458 00:20:12,050 --> 00:20:14,020 O si no, ho farem deliberadament ara. 459 00:20:14,020 --> 00:20:21,330 Deixin-me seguir endavant i escriure súper ràpid un programa anomenat dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 I ara vaig a anar aquí i Què aguda inclouen stdio.h. 461 00:20:26,730 --> 00:20:32,620 Anem a declarar la funció foo presa Sense arguments, que és 462 00:20:32,620 --> 00:20:34,040 denotat també per buit. 463 00:20:34,040 --> 00:20:37,830 >> I l'única foo va a fer és anomenada foo, que probablement no és el 464 00:20:37,830 --> 00:20:39,100 molt intel · ligent, però que així sigui. 465 00:20:39,100 --> 00:20:40,490 Ent void main. 466 00:20:40,490 --> 00:20:45,270 Ara l'única cosa principal que va de fer és trucar a foo també. 467 00:20:45,270 --> 00:20:51,050 I, només per diversió, em vaig a anar per davant aquí i dir printf "Hola des 468 00:20:51,050 --> 00:20:52,340 foo ". 469 00:20:52,340 --> 00:20:52,890 >> D'acord. 470 00:20:52,890 --> 00:21:00,160 Així que si jo no he comès cap error, Feu dontdothis dot slash. 471 00:21:00,160 --> 00:21:01,960 I ho farem en una finestra més gran - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Anem. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Pel que sembla, vostè pot fer això. 478 00:21:13,100 --> 00:21:15,190 Maledicció. 479 00:21:15,190 --> 00:21:16,190 D'acord. 480 00:21:16,190 --> 00:21:16,580 Esperi. 481 00:21:16,580 --> 00:21:17,370 En espera. 482 00:21:17,370 --> 00:21:18,270 Hem - 483 00:21:18,270 --> 00:21:20,110 Nosaltres el fem servir amb Make. 484 00:21:20,110 --> 00:21:22,050 >> [Sospira] 485 00:21:22,050 --> 00:21:25,110 >> Ja ho sé, però crec que que acaba d'eliminar. 486 00:21:25,110 --> 00:21:28,410 Uh, sí. 487 00:21:28,410 --> 00:21:30,660 Maledicció. 488 00:21:30,660 --> 00:21:32,640 Resolgui aquest Rob. 489 00:21:32,640 --> 00:21:34,678 Què? 490 00:21:34,678 --> 00:21:35,928 És molt simple. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Sí, ens vam tornar optimització off. 493 00:21:47,360 --> 00:21:48,970 Acceptar, estand adéu. 494 00:21:48,970 --> 00:21:49,950 Ara em sento millor. 495 00:21:49,950 --> 00:21:51,390 D'acord. 496 00:21:51,390 --> 00:21:51,780 Està bé. 497 00:21:51,780 --> 00:21:53,430 >> Així que anem a tornar a compilar això - 498 00:21:53,430 --> 00:21:55,880 Fer-te dontdothis. 499 00:21:55,880 --> 00:22:00,090 Podria ser necessari canviar el nom d'aquest a dothis.c en un moment. 500 00:22:00,090 --> 00:22:00,710 Això és. 501 00:22:00,710 --> 00:22:01,240 Gràcies. 502 00:22:01,240 --> 00:22:02,050 D'acord. 503 00:22:02,050 --> 00:22:05,480 Així que el fet que estava imprimint alguna cosa era en realitat només 504 00:22:05,480 --> 00:22:08,150 alentir el procés pel qual hauria arribat a aquest punt. 505 00:22:08,150 --> 00:22:08,510 D'acord. 506 00:22:08,510 --> 00:22:08,870 Phew! 507 00:22:08,870 --> 00:22:11,180 >> Així que el que realment està passant? 508 00:22:11,180 --> 00:22:14,440 La raó que, com un part, és fer res en termes d'entrada 509 00:22:14,440 --> 00:22:17,270 de sortida tendeix a ser més lent perquè d'escriure caràcters a l' 510 00:22:17,270 --> 00:22:18,600 pantalla, ha de desplaçar-se. 511 00:22:18,600 --> 00:22:21,720 Així que conte llarg, vaig haver en realitat Va succeir tan impacient, tindríem 512 00:22:21,720 --> 00:22:23,260 vist el resultat final també. 513 00:22:23,260 --> 00:22:26,220 Ara que tinc passeig de la impressió de nova creació, veiem de seguida. 514 00:22:26,220 --> 00:22:28,410 Per què està succeint això. 515 00:22:28,410 --> 00:22:31,300 Bé, l'explicació simple, per descomptat, foo és que probablement no hauria 516 00:22:31,300 --> 00:22:32,500 es fa dir. 517 00:22:32,500 --> 00:22:34,470 >> Ara bé, en termes generals, aquesta és la recursió. 518 00:22:34,470 --> 00:22:36,970 I pensem que un parell de setmanes Fa recursiva és bo. 519 00:22:36,970 --> 00:22:40,330 La recursivitat és la forma màgica de expressar súper succinta. 520 00:22:40,330 --> 00:22:41,400 I simplement funciona. 521 00:22:41,400 --> 00:22:45,060 Però hi ha una característica clau de tots els programes recursius que hem parlat 522 00:22:45,060 --> 00:22:48,260 i mirant al lluny, que era que havien de? 523 00:22:48,260 --> 00:22:52,610 Un cas base, que era una mica dur codificat cas que dit en algunes situacions 524 00:22:52,610 --> 00:22:56,210 no cridi foo, que és clarament no és el cas aquí. 525 00:22:56,210 --> 00:22:58,920 >> Així que el que realment està succeint en termes d'aquesta imatge? 526 00:22:58,920 --> 00:23:01,790 Bé, quan Main diu foo, que aconsegueix un tros de memòria. 527 00:23:01,790 --> 00:23:04,150 Quan es crida a foo foo, es posa una porció de la memòria. 528 00:23:04,150 --> 00:23:06,430 Quan es crida a foo foo, es posa una llesca. 529 00:23:06,430 --> 00:23:07,080 Es posa una llesca. 530 00:23:07,080 --> 00:23:08,120 Es posa una llesca. 531 00:23:08,120 --> 00:23:09,460 A causa foo mai torna. 532 00:23:09,460 --> 00:23:12,160 Mai estem esborrant un dels marcs de la pila. 533 00:23:12,160 --> 00:23:15,930 Així que estem bufant a través de la pila, no parlar de qui sap què més, i 534 00:23:15,930 --> 00:23:19,600 estem sobrepassant els límits de la nostra així anomenat segment de la memòria. 535 00:23:19,600 --> 00:23:21,790 Error anar segmentació falsa. 536 00:23:21,790 --> 00:23:24,110 >> Per tant la solució no és clarament, no ho facis. 537 00:23:24,110 --> 00:23:28,830 Però la implicació més gran és que, sí, no és absolutament cert límit, 538 00:23:28,830 --> 00:23:32,470 encara que no està ben definida, quant a com moltes de les funcions que pot trucar en un 539 00:23:32,470 --> 00:23:34,970 programa, quantes vegades una funció pot cridar-se a si mateix. 540 00:23:34,970 --> 00:23:38,430 Així que, encara que ho vam fer predicar recursivitat com aquesta cosa màgica potencialment 01:00 541 00:23:38,430 --> 00:23:41,870 parell de setmanes per a la sigma funció, i quan tinguem les dades d' 542 00:23:41,870 --> 00:23:45,270 estructures i CS50, veuràs una altra aplicacions per a ell, no és 543 00:23:45,270 --> 00:23:46,500 necessàriament el millor. 544 00:23:46,500 --> 00:23:50,070 Perquè si una funció es diu a si mateix, diu a si mateix, fins i tot si no hi ha una base de 545 00:23:50,070 --> 00:23:54,860 cas, si no aconsegueixes que el cas base de 1.000 trucades o 10.000 trucades, per 546 00:23:54,860 --> 00:23:58,800 llavors és possible que hagi quedat sense espai en l'anomenada pila i prem 547 00:23:58,800 --> 00:24:00,400 altres segments de la memòria. 548 00:24:00,400 --> 00:24:03,950 Per tant, també és un disseny de trade-off entre l'elegància i entre 549 00:24:03,950 --> 00:24:06,920 solidesa de la seva especial aplicació. 550 00:24:06,920 --> 00:24:10,780 >> Així que hi ha un altre inconvenient o altra Gotcha al que hem 551 00:24:10,780 --> 00:24:11,720 estat fent fins ara. 552 00:24:11,720 --> 00:24:12,980 Quan vaig trucar a getString - 553 00:24:12,980 --> 00:24:15,120 m'ho dius a mi tornar a hola-2. 554 00:24:15,120 --> 00:24:18,170 Tingueu en compte que estic trucant getString, que està tornant una adreça. 555 00:24:18,170 --> 00:24:20,730 I diem avui que la direcció de és del munt. 556 00:24:20,730 --> 00:24:24,480 I ara estic imprimint el cadena en aquesta direcció. 557 00:24:24,480 --> 00:24:27,000 Però mai hem cridat l' oposat de getString. 558 00:24:27,000 --> 00:24:30,850 Mai hem tingut a calll una funció com ungetstring, on la mà de nou 559 00:24:30,850 --> 00:24:31,610 aquest record. 560 00:24:31,610 --> 00:24:33,250 Però, francament, és probable que hauria d'haver estat. 561 00:24:33,250 --> 00:24:37,390 Perquè si seguim demanant a l'equip per a la memòria, a través d'algú com 562 00:24:37,390 --> 00:24:40,830 getString però mai tornar, segurament que també està obligat a dur a 563 00:24:40,830 --> 00:24:42,970 problemes amb el que ens vam quedar sense memòria. 564 00:24:42,970 --> 00:24:46,140 >> I, de fet, podem mirar per a aquests problemes amb la nova eina l'ús 565 00:24:46,140 --> 00:24:47,640 és una mica críptic per escriure. 566 00:24:47,640 --> 00:24:50,960 Però m'ho dius anar per davant i esquitxades cap amunt a la pantalla en un moment. 567 00:24:50,960 --> 00:24:56,940 Vaig a seguir endavant i executar Valgrind amb el paràmetre el primer comandament 568 00:24:56,940 --> 00:25:00,260 argument de la línia és el nom d'aquest programa hola-2. 569 00:25:00,260 --> 00:25:02,650 I lamentablement és sortida és atroçment 570 00:25:02,650 --> 00:25:04,290 complexa sense una bona raó. 571 00:25:04,290 --> 00:25:06,280 Així que veiem tot aquest embolic. 572 00:25:06,280 --> 00:25:07,530 David és l'estat del meu nom. 573 00:25:07,530 --> 00:25:09,760 Així que aquest és el programa actualment en funcionament. 574 00:25:09,760 --> 00:25:11,180 I ara tenim aquest producte. 575 00:25:11,180 --> 00:25:13,400 >> Així Valgrind és similar en esperit a GDB. 576 00:25:13,400 --> 00:25:14,950 No és un depurador per se. 577 00:25:14,950 --> 00:25:16,270 Però és un comprovador de memòria. 578 00:25:16,270 --> 00:25:20,140 És un programa que executarà el programar i li dirà si li preguntes a un 579 00:25:20,140 --> 00:25:23,860 equip per a la memòria i mai hi va lliurar enrere, el sentit del que vostè té 580 00:25:23,860 --> 00:25:24,570 una pèrdua de memòria. 581 00:25:24,570 --> 00:25:26,240 I les pèrdues de memòria tendeixen a ser dolent. 582 00:25:26,240 --> 00:25:29,120 I és que els usuaris d'ordinadors tenen Probablement aquest sentit, si té una 583 00:25:29,120 --> 00:25:30,300 Mac o un PC. 584 00:25:30,300 --> 00:25:33,730 Alguna vegada ha utilitzat l'equip per temps i no reiniciat en diverses 585 00:25:33,730 --> 00:25:36,820 dia, o només tens una gran quantitat de programes en execució, i la cosa maleïda 586 00:25:36,820 --> 00:25:42,360 retarda a un punt mort, o almenys és super molest d'utilitzar, ja que 587 00:25:42,360 --> 00:25:44,350 tot acaba molt lent. 588 00:25:44,350 --> 00:25:46,260 >> Ara que pot haver-hi qualsevol nombre de raons. 589 00:25:46,260 --> 00:25:49,600 Podria ser un bucle infinit, un error en Codi d'algú, o, més simplement, que 590 00:25:49,600 --> 00:25:53,250 podria significar que vostè està utilitzant més memòria, o tractant, de la seva 591 00:25:53,250 --> 00:25:54,920 equip té en realitat. 592 00:25:54,920 --> 00:25:57,770 I potser hi ha un error en algun programa que mantenen demanant memòria. 593 00:25:57,770 --> 00:26:02,480 Navegadors d'anys eren coneguts per això, demanant més i més memòria 594 00:26:02,480 --> 00:26:03,870 però mai va tornar. 595 00:26:03,870 --> 00:26:07,220 Segurament, si només té un nombre finit quantitat de memòria, no es pot demanar 596 00:26:07,220 --> 00:26:09,990 infinitament moltes vegades per alguns que la memòria. 597 00:26:09,990 --> 00:26:13,070 >> I així, el que es veu aquí, tot i que una altra vegada la sortida de Valgrind és 598 00:26:13,070 --> 00:26:17,490 innecessàriament complex per fer una ullada a en primer lloc, aquesta és la part interessant. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 en ús a la sortida. 601 00:26:20,060 --> 00:26:22,810 Així que aquí està la quantitat de memòria es en ús en el munt al 602 00:26:22,810 --> 00:26:24,300 vegada que el meu programa va sortir - 603 00:26:24,300 --> 00:26:27,280 pel que sembla 6:00 bytes en un bloc. 604 00:26:27,280 --> 00:26:28,710 Així que em vaig a moure les mans al que un bloc és. 605 00:26:28,710 --> 00:26:31,270 Pensa que és només una part, una major paraula tècnica per al fragment. 606 00:26:31,270 --> 00:26:33,140 Però sis bytes - 607 00:26:33,140 --> 00:26:36,870 ¿Quins són els sis bytes que encara estaven en ús? 608 00:26:36,870 --> 00:26:37,390 >> Exactament. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D barra invertida zero, 05:00 lletres nom, més el terminador nul. 610 00:26:41,520 --> 00:26:46,350 Així que aquest programa valgrind adonar que jo demanar sis bytes, segons sembla, per 611 00:26:46,350 --> 00:26:48,950 manera de getString, però mai els va donar l'esquena. 612 00:26:48,950 --> 00:26:52,030 I de fet, això podria no ser tan obvi si el meu programa no és de tres 613 00:26:52,030 --> 00:26:53,590 línies, però és 300 línies. 614 00:26:53,590 --> 00:26:56,920 Així que en realitat podem donar un altre comandament argument de la línia d'Valgrind per 615 00:26:56,920 --> 00:26:58,290 fer-lo més detallat. 616 00:26:58,290 --> 00:26:59,760 És una mica molest per recordar. 617 00:26:59,760 --> 00:27:01,580 Però si ho faig - 618 00:27:01,580 --> 00:27:01,930 anem a veure. 619 00:27:01,930 --> 00:27:03,540 Fuga - 620 00:27:03,540 --> 00:27:05,030 Va ser fuites - 621 00:27:05,030 --> 00:27:07,580 encara que no em acord el que està fora de la mà. 622 00:27:07,580 --> 00:27:08,550 >> - Fugida de verificació és igual completa. 623 00:27:08,550 --> 00:27:10,180 Sí, gràcies. 624 00:27:10,180 --> 00:27:12,520 - Fugida de verificació és igual completa. 625 00:27:12,520 --> 00:27:13,800 Intro. 626 00:27:13,800 --> 00:27:14,940 El mateix programa s'està executant. 627 00:27:14,940 --> 00:27:16,180 Escriviu a David un cop més. 628 00:27:16,180 --> 00:27:17,660 Ara veig una mica més de detall. 629 00:27:17,660 --> 00:27:20,890 Però a continuació el resum munt, la qual és idèntica a quatre - ah, 630 00:27:20,890 --> 00:27:22,120 això és una mica agradable. 631 00:27:22,120 --> 00:27:25,460 Ara Valgrind és en realitat la recerca una mica més difícil en el meu codi. 632 00:27:25,460 --> 00:27:29,580 I està dient que, segons sembla, malloc en línia - 633 00:27:29,580 --> 00:27:30,580 que allunyar. 634 00:27:30,580 --> 00:27:31,980 En la línia - 635 00:27:31,980 --> 00:27:32,930 no veiem quina línia és. 636 00:27:32,930 --> 00:27:35,110 Però malloc és el primer culpable. 637 00:27:35,110 --> 00:27:38,630 Hi ha un bloc en malloc. 638 00:27:38,630 --> 00:27:39,810 >> D'acord? 639 00:27:39,810 --> 00:27:40,450 Bé, no. 640 00:27:40,450 --> 00:27:40,940 Cert? 641 00:27:40,940 --> 00:27:42,520 Vaig trucar GetString. 642 00:27:42,520 --> 00:27:44,460 getString aparentment crida malloc. 643 00:27:44,460 --> 00:27:47,800 Llavors, ¿quina línia de codi és aparentment la culpa de tenir 644 00:27:47,800 --> 00:27:49,050 assignat aquesta memòria? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Anem a suposar que qui va escriure malloc ha existit el temps suficient com perquè sigui 647 00:27:55,540 --> 00:27:56,390 no és culpa seva. 648 00:27:56,390 --> 00:27:57,520 Així que és probable que la meva. 649 00:27:57,520 --> 00:28:02,000 GetString en cs50.c - pel que és una presentar en algun lloc de l'ordinador - 650 00:28:02,000 --> 00:28:05,210 en la línia 286 sembla ser el culpable. 651 00:28:05,210 --> 00:28:08,140 Ara anem a suposar que CS50 ha estat voltant per bona quantitat de temps, pel que 652 00:28:08,140 --> 00:28:09,720 nosaltres també som infal · libles. 653 00:28:09,720 --> 00:28:14,080 I el que no és probable que en getString que l'error es troba, sinó més aviat en 654 00:28:14,080 --> 00:28:17,810 line hola-2.c 18. 655 00:28:17,810 --> 00:28:20,670 >> Així que donem una ullada a el que era la línia 18. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 D'alguna manera aquesta línia no és necessàriament amb errors, per se, sinó que és la raó 658 00:28:27,130 --> 00:28:28,630 darrere d'aquesta pèrdua de memòria. 659 00:28:28,630 --> 00:28:32,140 Així súper senzilla, el que faria intuïtiva ser la solució a aquest problema? 660 00:28:32,140 --> 00:28:34,710 Si estem demanant memòria, mai van ser donant-li l'esquena, i que sembla ser un 661 00:28:34,710 --> 00:28:37,940 problema, ja que amb el temps el meu equip podria quedar-se sense memòria, podria endarrerir 662 00:28:37,940 --> 00:28:42,110 baix, les coses dolentes poden passar, així, Quina és la solució simple i intuïtiva? 663 00:28:42,110 --> 00:28:43,140 Només has de donar volta. 664 00:28:43,140 --> 00:28:44,770 >> Com es pot alliberar aquesta memòria? 665 00:28:44,770 --> 00:28:49,970 Bé, per sort és molt senzill a dir el nom gratuïta. 666 00:28:49,970 --> 00:28:51,260 I mai hem fet això abans. 667 00:28:51,260 --> 00:28:55,890 Però es pot pensar essencialment en lliure com l'oposat de malloc. 668 00:28:55,890 --> 00:28:58,030 lliure és l'oposat a la l'assignació de memòria. 669 00:28:58,030 --> 00:28:59,540 Ara m'ho dius a compilar això. 670 00:28:59,540 --> 00:29:02,050 Feu hola-2. 671 00:29:02,050 --> 00:29:04,620 Déjame córrer de nou. hola-2 David. 672 00:29:04,620 --> 00:29:07,290 Així que sembla que funciona a exactament de la mateixa manera. 673 00:29:07,290 --> 00:29:11,180 Però si torno a Valgrind i tornar a executar mateix comando que en el meu recent 674 00:29:11,180 --> 00:29:14,720 programa compilat, mecanografia en el meu nom com abans - 675 00:29:14,720 --> 00:29:15,370 Niça. 676 00:29:15,370 --> 00:29:16,760 Resum Heap - 677 00:29:16,760 --> 00:29:17,740 en ús a la sortida - 678 00:29:17,740 --> 00:29:19,370 zero bytes en blocs de zero. 679 00:29:19,370 --> 00:29:21,840 I això és molt agradable, tot van ser alliberats blocs de la pila. 680 00:29:21,840 --> 00:29:23,480 No hi ha fuites són possibles. 681 00:29:23,480 --> 00:29:27,200 >> Així que ve, no amb Problemes de 4, però amb Set Problema 5, els forenses 682 00:29:27,200 --> 00:29:30,740 i cap endavant, això també es convertirà en un mesura de l'exactitud de la seva 683 00:29:30,740 --> 00:29:33,630 programa, ja sigui que tingui o no o no tenen pèrdues de memòria. 684 00:29:33,630 --> 00:29:36,900 Però, per sort, no només es pot raonar a través d'ells intuïtivament, que 685 00:29:36,900 --> 00:29:40,430 és, sens dubte, fàcil per a petits programes però és més difícil per als programes més grans, 686 00:29:40,430 --> 00:29:43,860 Valgrind, per als programes de major envergadura, pot ajudar a identificar 687 00:29:43,860 --> 00:29:45,360 el problema particular. 688 00:29:45,360 --> 00:29:47,500 >> Però hi ha un altre problema que pugui sorgir. 689 00:29:47,500 --> 00:29:51,245 Permetin-me obrir aquest arxiu aquí, que és, de nou, un exemple senzill. 690 00:29:51,245 --> 00:29:53,760 Però ens centrarem en el que aquest programa fa. 691 00:29:53,760 --> 00:29:55,190 Això es diu memory.c. 692 00:29:55,190 --> 00:29:58,380 Anem a publicar més tard avui al zip del codi font actual. 693 00:29:58,380 --> 00:30:01,610 I noti que tinc una funció anomenada f que no pren arguments i 694 00:30:01,610 --> 00:30:02,800 retorna res. 695 00:30:02,800 --> 00:30:07,240 En la línia 20, que estic pel que sembla es declara una punter a un int i dir que és x. 696 00:30:07,240 --> 00:30:09,570 Estic assignant és el retorn valor de malloc. 697 00:30:09,570 --> 00:30:14,590 I per ser clars, quants bytes am Probablement tornar a malloc 698 00:30:14,590 --> 00:30:17,080 en aquesta situació? 699 00:30:17,080 --> 00:30:18,040 >> Probablement 40. 700 00:30:18,040 --> 00:30:18,840 D'on vas treure això? 701 00:30:18,840 --> 00:30:22,410 Bé, si vostè recorda que un int és sovint 4 bytes, almenys és al 702 00:30:22,410 --> 00:30:25,110 aparell, 10 vegades 4 és òbviament 40. 703 00:30:25,110 --> 00:30:28,920 Així que malloc torna una adreça d' un tros de memòria i emmagatzematge que 704 00:30:28,920 --> 00:30:30,800 abordar en última instància en x. 705 00:30:30,800 --> 00:30:32,570 Així que per ser clars, el que llavors està succeint? 706 00:30:32,570 --> 00:30:34,990 Bé, deixa canvia de nou a la nostra imatge aquí. 707 00:30:34,990 --> 00:30:38,150 No em deixis sol dibuixar el fons del meu la memòria de l'ordinador, em va deixar anar endavant i 708 00:30:38,150 --> 00:30:42,990 dibuixar tot el rectangle que representa tota la meva RAM. 709 00:30:42,990 --> 00:30:44,790 >> Anem a dir que la pila està a la part inferior. 710 00:30:44,790 --> 00:30:47,010 I hi ha un segment de text en les dades sense inicialitzar. 711 00:30:47,010 --> 00:30:49,880 Però jo només vaig a abstreure els altres coses distants com dot, dot dot. 712 00:30:49,880 --> 00:30:53,470 Jo només faré referència a aquest com la pila a la part superior. 713 00:30:53,470 --> 00:30:57,070 I a continuació, a la part inferior d'aquesta imatge, per representar principal, em vaig 714 00:30:57,070 --> 00:30:59,880 per donar-li una memòria llesques a la pila. 715 00:30:59,880 --> 00:31:03,150 Per f, vaig a donar-li una llesca de memòria a la pila. 716 00:31:03,150 --> 00:31:05,140 Ara, he de consultar amb el meu codi de nou origen. 717 00:31:05,140 --> 00:31:07,170 Quines són les variables locals per al principal? 718 00:31:07,170 --> 00:31:10,710 Aparentment res, així que tall és efectivament buit o ni tan sols tan gran 719 00:31:10,710 --> 00:31:11,600 com he dibuixat. 720 00:31:11,600 --> 00:31:15,730 Però en f, tinc una variable local, que es diu x. 721 00:31:15,730 --> 00:31:20,410 Així que seguiré endavant i donar f una part de la memòria, que va qualificar de x. 722 00:31:20,410 --> 00:31:24,680 >> I ara malloc de 10 vegades 4, Així malloc 40, on és el 723 00:31:24,680 --> 00:31:25,430 memòria ve? 724 00:31:25,430 --> 00:31:27,530 No hem fet un dibuix com això abans. 725 00:31:27,530 --> 00:31:31,140 Però anem a suposar que és efectivament que ve d'aquí, així que un, 726 00:31:31,140 --> 00:31:33,170 dos, tres, quatre, cinc. 727 00:31:33,170 --> 00:31:34,680 I ara he de 40 d'aquests. 728 00:31:34,680 --> 00:31:37,540 Així que vaig a fer punt, punt, punt de suggerir que fins i tot hi ha més memòria 729 00:31:37,540 --> 00:31:39,350 al tornar de la pila. 730 00:31:39,350 --> 00:31:40,710 Ara, quina és l'adreça? 731 00:31:40,710 --> 00:31:42,620 Anem a triar el nostre arbitrària abordar com sempre - 732 00:31:42,620 --> 00:31:46,310 Ox123, tot i que probablement va ser alguna cosa completament diferent. 733 00:31:46,310 --> 00:31:50,420 Aquesta és l'adreça del primer byte de recordo que m'estic preguntant per malloc. 734 00:31:50,420 --> 00:31:53,630 >> Així que en resum la línia, un cop 20 realitza, el que és, literalment, 735 00:31:53,630 --> 00:31:57,170 emmagatzemat a l'interior de x aquí? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 I el bou no és interessant. 739 00:32:01,550 --> 00:32:03,200 Només vol dir que aquí hi ha un nombre hexadecimal. 740 00:32:03,200 --> 00:32:06,490 Però el fonamental és que el que he botiga en x, que és una variable local. 741 00:32:06,490 --> 00:32:10,260 Però el seu tipus de dades, de nou, és una direcció d'un int. 742 00:32:10,260 --> 00:32:12,710 Bé, vaig a guardar Ox123. 743 00:32:12,710 --> 00:32:16,610 Però, de nou, si això és una mica massa complicat innecessàriament, si em desplaço 744 00:32:16,610 --> 00:32:21,490 cap enrere, podem abstreure aquesta molt lluny raonable i just dir que x és un 745 00:32:21,490 --> 00:32:23,910 punter a aquest tros de memòria. 746 00:32:23,910 --> 00:32:24,070 >> D'acord. 747 00:32:24,070 --> 00:32:26,230 Ara la pregunta que ens ocupa és el següent - 748 00:32:26,230 --> 00:32:29,910 línia 21, resulta que està lliure d'errors. 749 00:32:29,910 --> 00:32:31,160 Per què? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Com? 752 00:32:36,930 --> 00:32:38,640 No té per què - 753 00:32:38,640 --> 00:32:40,390 dir que una vegada més. 754 00:32:40,390 --> 00:32:41,240 Bé, no ho fa gratis. 755 00:32:41,240 --> 00:32:42,350 Així que aquest és el segon mes. 756 00:32:42,350 --> 00:32:45,000 Així que hi ha una altra, però específicament en la línia 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Exactament. 759 00:32:50,040 --> 00:32:54,980 Aquesta simple línia de codi és només una desbordament de memòria intermèdia, una saturació de la memòria intermèdia. 760 00:32:54,980 --> 00:32:57,050 Un buffer només significa una part de la memòria. 761 00:32:57,050 --> 00:33:01,520 Però aquest tros de memòria és de grandària 10, 10 nombres enters, el que significa que si tenim 762 00:33:01,520 --> 00:33:05,350 índex en ell amb el sucre sintàctic de la notació de matriu, la plaça 763 00:33:05,350 --> 00:33:09,220 suports, vostè té accés a x 0 x suport de suport 1 x, 764 00:33:09,220 --> 00:33:10,390 suport de punt, punt, punt. 765 00:33:10,390 --> 00:33:13,270 x suport 9 és el més gran. 766 00:33:13,270 --> 00:33:17,680 Així que si ho faig x suport 10, on De fet vaig a la memòria? 767 00:33:17,680 --> 00:33:19,120 >> Bé, si tinc 10 int - 768 00:33:19,120 --> 00:33:21,070 anem realment atreure a tots d'ells aquí. 769 00:33:21,070 --> 00:33:22,700 Així que aquesta va ser la primera de cinc. 770 00:33:22,700 --> 00:33:24,660 Aquí hi ha els altres cinc sencers. 771 00:33:24,660 --> 00:33:29,580 Així que x 0 és el suport aquí. x suport 1 és aquí. x suport 9 està aquí. x suport 772 00:33:29,580 --> 00:33:37,960 10 està aquí, el que significa que estic dient, en la línia 21, l'equip per posar el 773 00:33:37,960 --> 00:33:39,400 nombre d'on? 774 00:33:39,400 --> 00:33:42,010 El nombre 0 on? 775 00:33:42,010 --> 00:33:43,380 Bé, és 0, si. 776 00:33:43,380 --> 00:33:45,460 Però el fet que el 0 és una espècie de coincidència. 777 00:33:45,460 --> 00:33:47,140 Podria ser el número 50, per a tots els que ens importa. 778 00:33:47,140 --> 00:33:50,480 Però estem tractant de posar-ho en x suport 10, que és on aquesta 779 00:33:50,480 --> 00:33:53,700 signe d'interrogació es dibuixa, que No és una bona cosa. 780 00:33:53,700 --> 00:33:57,070 Aquest programa podria molt bé accident com a resultat. 781 00:33:57,070 --> 00:33:59,400 >> Ara, seguirem endavant i veure si això És, de fet, el que succeeix. 782 00:33:59,400 --> 00:34:02,600 Feu memòria, ja que l'arxiu es diu memory.c. 783 00:34:02,600 --> 00:34:05,950 Seguirem endavant i executar la memòria de programa. 784 00:34:05,950 --> 00:34:08,239 Així que vam tenir sort, en realitat, el que sembla. 785 00:34:08,239 --> 00:34:09,340 Vam tenir sort. 786 00:34:09,340 --> 00:34:11,060 Però anem a veure si ara correm Valgrind. 787 00:34:11,060 --> 00:34:14,170 A primera vista, el meu programa podria semblen ser perfectament correcta. 788 00:34:14,170 --> 00:34:18,010 Però m'ho dius córrer Valgrind amb el - Fugida de verificació és igual completa a la memòria. 789 00:34:18,010 --> 00:34:20,110 >> I ara, quan em trobo això - 790 00:34:20,110 --> 00:34:21,030 interessant. 791 00:34:21,030 --> 00:34:26,800 Invalid escriure de mida 4 a la línia 21 de memory.c. 792 00:34:26,800 --> 00:34:29,284 Línia 21 de memory.c és quin? 793 00:34:29,284 --> 00:34:30,340 Oh, interessant. 794 00:34:30,340 --> 00:34:31,080 Però esperi. 795 00:34:31,080 --> 00:34:32,389 Mida 4, quin és el que es refereix a? 796 00:34:32,389 --> 00:34:34,969 Jo només tenia una escric, però és de mida 4. 797 00:34:34,969 --> 00:34:36,889 Per què és 4? 798 00:34:36,889 --> 00:34:39,280 És perquè és un int, que és, de nou, quatre bytes. 799 00:34:39,280 --> 00:34:42,510 Així Valgrind trobat un error que jo, fer una ullada al meu codi, no ho va fer. 800 00:34:42,510 --> 00:34:45,040 I potser la seva TF faria o no faria. 801 00:34:45,040 --> 00:34:48,469 Què Però Valgrind amb seguretat va trobar que que hem comès un error allà, fins i tot 802 00:34:48,469 --> 00:34:52,719 encara que vam tenir sort, i l'ordinador decidir, eh, jo no vaig a xocar 803 00:34:52,719 --> 00:34:57,470 només perquè vostè va tocar un byte, un el valor de la memòria d'int que no ho va fer 804 00:34:57,470 --> 00:34:58,550 realitat pròpia. 805 00:34:58,550 --> 00:35:00,380 >> Bé, què més hi ha errors aquí. 806 00:35:00,380 --> 00:35:01,180 Direcció - 807 00:35:01,180 --> 00:35:03,190 es tracta d'una adreça de mirada boig en hexadecimal. 808 00:35:03,190 --> 00:35:06,890 Això només vol dir que en el munt de lloc és zero bytes després d'un bloc de mida 40 809 00:35:06,890 --> 00:35:07,620 s'assigna. 810 00:35:07,620 --> 00:35:10,610 Permetin-me Allunyar aquí i veure si això és una mica més útil. 811 00:35:10,610 --> 00:35:11,410 Interessant. 812 00:35:11,410 --> 00:35:15,600 40 bytes estan definitivament perduts en el registre de la pèrdua de gener 1. 813 00:35:15,600 --> 00:35:17,840 Una vegada més, més paraules que és útil aquí. 814 00:35:17,840 --> 00:35:21,350 Però en base a les línies ressaltades, on hauria probablement centrar la meva 815 00:35:21,350 --> 00:35:24,070 atenció per a un altre bug? 816 00:35:24,070 --> 00:35:26,570 Sembla que una línia 20 de memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Així que si ens remuntem a la línia 20, que és el un que va identificar anteriorment. 818 00:35:30,990 --> 00:35:33,030 I no és necessàriament erroni. 819 00:35:33,030 --> 00:35:35,160 Però hem invertit aquest els seus efectes. 820 00:35:35,160 --> 00:35:38,790 Llavors, com puc corregir almenys un d'aquests errors? 821 00:35:38,790 --> 00:35:42,240 Què podia fer jo després de la línia 21? 822 00:35:42,240 --> 00:35:47,110 Que podia fer sense x, per la qual cosa de retornar la memòria. 823 00:35:47,110 --> 00:35:49,230 I com puc solucionar aquest error? 824 00:35:49,230 --> 00:35:52,120 Sens dubte hauria d'anar no més de 0. 825 00:35:52,120 --> 00:35:53,670 Així que vaig a tractar i tornar a fer aquest. 826 00:35:53,670 --> 00:35:56,080 Ho sentim, però sens dubte no més de 9. 827 00:35:56,080 --> 00:35:57,510 Fer memòria. 828 00:35:57,510 --> 00:36:00,650 Permetin-me tornar a executar Valgrind en una finestra més gran. 829 00:36:00,650 --> 00:36:01,580 I ara mira. 830 00:36:01,580 --> 00:36:02,250 Niça. 831 00:36:02,250 --> 00:36:03,270 Van ser alliberats tots els blocs de la pila. 832 00:36:03,270 --> 00:36:04,270 No hi ha fuites són possibles. 833 00:36:04,270 --> 00:36:07,520 I per sobre d'aquí, no hi ha cap menció més de la dreta no vàlid. 834 00:36:07,520 --> 00:36:09,820 >> Només per aconseguir cobdiciós, i anem a veure si una altra demostració 835 00:36:09,820 --> 00:36:11,050 no va com estava previst - 836 00:36:11,050 --> 00:36:12,560 Jo vaig tenir la sort fa un moment. 837 00:36:12,560 --> 00:36:15,530 I el fet que aquest és 0 és potser innecessàriament enganyosa. 838 00:36:15,530 --> 00:36:20,650 Farem 50 anys, una mica arbitrària nombre, marca de memòria slash dot memòria - 839 00:36:20,650 --> 00:36:21,410 encara tingui sort. 840 00:36:21,410 --> 00:36:22,510 Res estavellar-se. 841 00:36:22,510 --> 00:36:26,150 Suposem que jo acabo de fer alguna cosa realment ximple, i ho faig 100. 842 00:36:26,150 --> 00:36:30,360 Permeteu-me refer la memòria, dot barra de memòria - 843 00:36:30,360 --> 00:36:31,075 vam tenir sort de nou. 844 00:36:31,075 --> 00:36:32,800 Què hi ha de 1000? 845 00:36:32,800 --> 00:36:35,370 ints més enllà, més o menys, on hauria d'estar? 846 00:36:35,370 --> 00:36:37,410 Fer memòria - 847 00:36:37,410 --> 00:36:38,570 maleïda sigui. 848 00:36:38,570 --> 00:36:39,920 >> [El] 849 00:36:39,920 --> 00:36:41,270 >> D'acord. 850 00:36:41,270 --> 00:36:43,920 No perdrem el temps ja. 851 00:36:43,920 --> 00:36:45,120 Torneu a executar la memòria. 852 00:36:45,120 --> 00:36:45,840 Això és. 853 00:36:45,840 --> 00:36:46,410 Està bé. 854 00:36:46,410 --> 00:36:52,500 Així que pel que sembla s'indexa 100.000 ints més enllà d'on hauria d'haver estat en 855 00:36:52,500 --> 00:36:54,410 memòria, succeeixen coses dolentes. 856 00:36:54,410 --> 00:36:56,430 Així que això no és, òbviament, una regla dur ràpid. 857 00:36:56,430 --> 00:36:58,190 Jo era una mena d'assaig amb i error per arribar-hi. 858 00:36:58,190 --> 00:37:02,230 Però això es deu al fet que, el conte llarg, memòria de l'equip també es divideix 859 00:37:02,230 --> 00:37:03,580 en aquestes coses diuen segments. 860 00:37:03,580 --> 00:37:07,260 I a vegades, l'equip realment que ha donat una mica més de memòria 861 00:37:07,260 --> 00:37:08,400 del que demanes. 862 00:37:08,400 --> 00:37:12,170 No obstant això, per a l'eficiència, és simplement més fàcil obtenir més memòria, però només diré 863 00:37:12,170 --> 00:37:13,780 que vostè està rebent una part. 864 00:37:13,780 --> 00:37:16,370 >> I si tens sort, de vegades, Per tant, vostè podria ser capaç de tocar 865 00:37:16,370 --> 00:37:17,795 memòria que no li pertany a vostè. 866 00:37:17,795 --> 00:37:21,860 No té cap garantia que el que el valor que va posar en el seu lloc es quedarà allà, perquè 867 00:37:21,860 --> 00:37:25,080 l'equip encara pensa que no és seu, però que no va necessàriament 868 00:37:25,080 --> 00:37:29,910 per colpejar a un altre segment de la memòria en la equip i induir un error com 869 00:37:29,910 --> 00:37:31,710 aquest d'aquí. 870 00:37:31,710 --> 00:37:32,060 Està bé. 871 00:37:32,060 --> 00:37:37,240 Qualsevol pregunta, llavors en la memòria? 872 00:37:37,240 --> 00:37:37,590 >> Està bé. 873 00:37:37,590 --> 00:37:40,610 Anem a fer una ullada aquí, llavors, en cosa que hem estat donant per 874 00:37:40,610 --> 00:37:48,361 concedida des de fa força temps, el que es troba a l'arxiu anomenat cs50.h. 875 00:37:48,361 --> 00:37:49,420 Així que aquest és un arxiu. 876 00:37:49,420 --> 00:37:51,130 Aquests són només un grapat sencer dels comentaris amunt. 877 00:37:51,130 --> 00:37:53,900 I és possible que hagi vist en aquest cas que va furgar en l'aparell. 878 00:37:53,900 --> 00:37:57,000 Però resulta que tot el temps, quan solíem utilitzar cadena com 879 00:37:57,000 --> 00:38:01,130 sinònim, el mitjà pel qual declarem que era sinònim amb aquesta 880 00:38:01,130 --> 00:38:03,990 paraula clau typedef, per a la definició de tipus. 881 00:38:03,990 --> 00:38:07,500 I estem dient bàsicament, fem encadenar un sinònim d'estrelles caràcters. 882 00:38:07,500 --> 00:38:11,190 Que els mitjans pels quals la pila creat aquestes rodes d'entrenament conegut com 883 00:38:11,190 --> 00:38:12,040 la cadena. 884 00:38:12,040 --> 00:38:14,830 >> Ara aquí és només un prototip per getchar. 885 00:38:14,830 --> 00:38:17,350 Pot ser que haguem vist abans, però això és de fet el que fa. getchar 886 00:38:17,350 --> 00:38:19,070 no pren cap argument, retorna un char. 887 00:38:19,070 --> 00:38:21,340 GetDouble no pren cap argument, torna una doble. 888 00:38:21,340 --> 00:38:24,440 getFloat no pren arguments, declaracions un flotador, i així successivament. 889 00:38:24,440 --> 00:38:27,270 getint és aquí. getlonglong hi ha aquí. 890 00:38:27,270 --> 00:38:28,820 I getString és aquí. 891 00:38:28,820 --> 00:38:29,420 I això és tot. 892 00:38:29,420 --> 00:38:33,080 Aquesta línia de color morat és un altre preprocessador Directiva per la 893 00:38:33,080 --> 00:38:35,550 hashtag a l'inici de la mateixa. 894 00:38:35,550 --> 00:38:35,870 >> Està bé. 895 00:38:35,870 --> 00:38:38,380 Així que ara vull anar a cs50.c. 896 00:38:38,380 --> 00:38:40,400 I no parlarem massa temps en això. 897 00:38:40,400 --> 00:38:43,280 Però per donar-te una idea del que és estat succeint tot això 898 00:38:43,280 --> 00:38:46,434 temps, em va deixar anar a - 899 00:38:46,434 --> 00:38:48,250 fem-ho getchar. 900 00:38:48,250 --> 00:38:51,050 Així getchar és majoritàriament comentaris. 901 00:38:51,050 --> 00:38:52,060 Però sembla que això. 902 00:38:52,060 --> 00:38:54,800 Així que aquesta és la funció real getchar que hem estat 903 00:38:54,800 --> 00:38:56,055 benentès que existeix. 904 00:38:56,055 --> 00:38:59,370 I tot i que no hem utilitzar aquest que moltes vegades, si alguna, és almenys 905 00:38:59,370 --> 00:39:00,470 relativament simple. 906 00:39:00,470 --> 00:39:02,580 Així que val la pena prendre un ràpid cop d'ull aquí. 907 00:39:02,580 --> 00:39:06,540 >> Així getchar té un bucle infinit, deliberadament per semblar. 908 00:39:06,540 --> 00:39:10,050 A continuació, diu - i això és una espècie de bona reutilització de codi que ens va escriure. 909 00:39:10,050 --> 00:39:11,220 Crida getString. 910 00:39:11,220 --> 00:39:12,460 Perquè ¿què significa tenir una xerrada? 911 00:39:12,460 --> 00:39:14,730 Bé, pot ser que també tractar d'aconseguir una tota la línia de text de l'usuari i 912 00:39:14,730 --> 00:39:16,940 a continuació, només ha de buscar en un d'aquests personatges. 913 00:39:16,940 --> 00:39:19,170 En la línia 60, aquí hi ha una mica de mica d'una comprovació de validesa. 914 00:39:19,170 --> 00:39:21,610 Si getString un valor nul, no anem a procedir. 915 00:39:21,610 --> 00:39:22,820 Quelcom ha fallat. 916 00:39:22,820 --> 00:39:28,120 >> Ara bé, això és una mica molest, però convencional en C. caràcters màx probablement 917 00:39:28,120 --> 00:39:29,960 representa el que acaba basant-se en el seu nom? 918 00:39:29,960 --> 00:39:31,670 És una constant. 919 00:39:31,670 --> 00:39:36,040 És com el valor numèric de la més carbó pot representar amb 920 00:39:36,040 --> 00:39:40,370 un mos, que és probablement el nombre 255, que és el major nombre que 921 00:39:40,370 --> 00:39:42,720 representar vuit bits, a partir de zero. 922 00:39:42,720 --> 00:39:47,460 Així que he utilitzo això, en aquesta funció, escriure aquest codi, només perquè 923 00:39:47,460 --> 00:39:51,753 si alguna cosa va malament en getchar però el seu propòsit a la vida és tornar a 924 00:39:51,753 --> 00:39:54,830 char, necessita alguna manera poder per indicar a l'usuari que 925 00:39:54,830 --> 00:39:55,840 alguna cosa va sortir malament. 926 00:39:55,840 --> 00:39:56,970 No podem tornar null. 927 00:39:56,970 --> 00:39:58,480 Resulta que és un punter nul. 928 00:39:58,480 --> 00:40:01,030 I de nou, getchar té retornar un char. 929 00:40:01,030 --> 00:40:04,760 >> Així que la convenció, si alguna cosa surt malament, és a dir, el programador, o en 930 00:40:04,760 --> 00:40:08,160 aquest cas, jo amb la biblioteca, que tenia un sol decidir arbitràriament, si 931 00:40:08,160 --> 00:40:12,230 alguna cosa surt malament, vaig a tornar el nombre 255, que és veritablement 932 00:40:12,230 --> 00:40:17,240 significa que no podem, l'usuari no pot escriure el caràcter representat per la 933 00:40:17,240 --> 00:40:21,410 nombre 255, perquè teníem un robar com un denominat valor sentinella a 934 00:40:21,410 --> 00:40:23,410 representar un problema. 935 00:40:23,410 --> 00:40:27,010 Ara resulta que el caràcter 255 no és quelcom que es pugui escriure amb 936 00:40:27,010 --> 00:40:28,380 el teclat, pel que no és gran cosa. 937 00:40:28,380 --> 00:40:30,910 L'usuari no s'adona que Jo he robat aquest personatge. 938 00:40:30,910 --> 00:40:34,620 Però si alguna vegada es veu a les pàgines de manual en un sistema informàtic alguna referència a una 939 00:40:34,620 --> 00:40:38,560 majúscules constant com aquest que diu, en cas d'error aquesta força constant 940 00:40:38,560 --> 00:40:42,720 serà retornat, això és tot cert va fer humà Fa anys va ser arbitràriament decidit 941 00:40:42,720 --> 00:40:45,680 tornar aquest valor especial i cridar una constant en el cas 942 00:40:45,680 --> 00:40:46,840 alguna cosa va malament. 943 00:40:46,840 --> 00:40:48,580 >> Ara la màgia passa aquí baix. 944 00:40:48,580 --> 00:40:52,600 En primer lloc, vaig a declarar a la línia 67 dos personatges, C1 i C2. 945 00:40:52,600 --> 00:40:57,080 I després, en la línia 68, hi ha realment una línia de codi que és una reminiscència de 946 00:40:57,080 --> 00:41:01,140 nostre amic printf, atès que no tenen per cent Cs entre cometes. 947 00:41:01,140 --> 00:41:06,490 Però adonar-se del que està passant aquí. sscanf significa scan cadena - 948 00:41:06,490 --> 00:41:11,690 significa escanejar un format corda, sscanf ergo. 949 00:41:11,690 --> 00:41:12,590 Què significa això? 950 00:41:12,590 --> 00:41:16,310 Això vol dir que es passa a sscanf una cadena. 951 00:41:16,310 --> 00:41:18,420 I la línia és el l'usuari in 952 00:41:18,420 --> 00:41:23,520 Es passa a sscanf una cadena de format com això que diu scanf quins són 953 00:41:23,520 --> 00:41:25,870 amb l'esperança que l'usuari ha escrit polz 954 00:41:25,870 --> 00:41:29,730 A continuació, passa a les direccions dels dos trossos de memòria, en aquest cas, 955 00:41:29,730 --> 00:41:31,150 perquè tinc dos marcadors de posició. 956 00:41:31,150 --> 00:41:34,610 Així que vaig a donar l'adreça de C1 i C2 de la direcció. 957 00:41:34,610 --> 00:41:37,700 >> I recordi que vostè dóna en funció de la direcció d'una variable, el que és 958 00:41:37,700 --> 00:41:38,950 la implicació? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Què pot fer que funcioni com un resultat de donar-li la direcció d'un 961 00:41:45,050 --> 00:41:48,170 variable, davant la pròpia variable? 962 00:41:48,170 --> 00:41:49,450 Es pot canviar, oi? 963 00:41:49,450 --> 00:41:53,250 Si tinguessis algú un mapa per a un examen físic direcció, poden anar-hi i fer 964 00:41:53,250 --> 00:41:54,750 el que vulguin en aquesta direcció. 965 00:41:54,750 --> 00:41:55,800 La mateixa idea aquí. 966 00:41:55,800 --> 00:41:59,950 Si passem a sscanf, la direcció de dos fragments de memòria, fins i tot aquests petits 967 00:41:59,950 --> 00:42:03,585 petits trossos de memòria, C1 i C2, però els diem que la direcció d'ells, 968 00:42:03,585 --> 00:42:05,170 sscanf pot canviar. 969 00:42:05,170 --> 00:42:08,530 >> Així que el propòsit de sscanf a la vida, si llegim la pàgina de manual, és llegir el que el 970 00:42:08,530 --> 00:42:13,420 usuari va escriure en, l'esperança que l'usuari tingui escrit en un personatge i potser 971 00:42:13,420 --> 00:42:16,470 un altre personatge, i el que l'usuari escrit, el primer caràcter es 972 00:42:16,470 --> 00:42:19,310 Aquí, el segon personatge va aquí. 973 00:42:19,310 --> 00:42:22,470 Ara, en un apart, això i ho faria Només sé això de la documentació, 974 00:42:22,470 --> 00:42:25,570 el fet que em vaig posar un espai en blanc no només vol dir que no importa si 975 00:42:25,570 --> 00:42:28,440 l'usuari prem la barra d'espai alguns vegades abans que ell o ella pren un 976 00:42:28,440 --> 00:42:30,400 caràcter, vaig a ignorar qualsevol espai en blanc. 977 00:42:30,400 --> 00:42:32,510 Així que, sé per la documentació. 978 00:42:32,510 --> 00:42:36,570 >> El fet que hi ha una segona c% seguit d'un espai en blanc és en realitat 979 00:42:36,570 --> 00:42:37,410 deliberada. 980 00:42:37,410 --> 00:42:41,190 Vull ser capaç de detectar si l'usuari espatllat o no cooperar. 981 00:42:41,190 --> 00:42:45,630 Així que espero que l'usuari només escriu en un personatge, per tant, estic esperant 982 00:42:45,630 --> 00:42:50,640 sscanf que només es va a tornar el valor 1, ja que, de nou, si llegeixo 983 00:42:50,640 --> 00:42:55,400 la documentació, el propòsit de sscanf a la vida és per tornar a la sèrie de 984 00:42:55,400 --> 00:42:59,170 Les variables que es van omplir amb l'entrada de l'usuari. 985 00:42:59,170 --> 00:43:02,270 >> Vaig passar en dues variables adreces, C1 i C2. 986 00:43:02,270 --> 00:43:06,420 Espero, però, que només un de ells és assassinat perquè si sscanf 987 00:43:06,420 --> 00:43:11,130 retorna 2, el que és presumiblement la conseqüència lògica? 988 00:43:11,130 --> 00:43:14,600 Que l'usuari no només em donen una personatge com li vaig dir o ella. 989 00:43:14,600 --> 00:43:17,860 Probablement escriure en almenys dos caràcters. 990 00:43:17,860 --> 00:43:22,430 Així que si jo no tingués lloc la segona % C, només tenia un, que 991 00:43:22,430 --> 00:43:25,370 Francament seria més intuïtiu enfocament, crec que a primera vista, 992 00:43:25,370 --> 00:43:30,220 vostè no serà capaç de detectar si l'usuari ha estat donant més 993 00:43:30,220 --> 00:43:31,780 entrada del que realment volia. 994 00:43:31,780 --> 00:43:34,100 Així que aquesta és una forma implícita de comprovació d'errors. 995 00:43:34,100 --> 00:43:35,640 >> Però noti el que faig aquí. 996 00:43:35,640 --> 00:43:39,970 Un cop estigui segur que l'usuari em va donar una personatge, alliberar la línia, fent 997 00:43:39,970 --> 00:43:44,450 el contrari getString, que al seu torn utilitza malloc i, a continuació, torneu 998 00:43:44,450 --> 00:43:51,030 C1, el personatge que esperava el proporcionat per l'usuari i només va proporcionar. 999 00:43:51,030 --> 00:43:54,680 Així que una ràpida s'albira només, sinó qualsevol pregunta sobre getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Tornarem a alguns dels altres. 1002 00:43:59,590 --> 00:44:03,770 >> Bé, deixa anar endavant i fer això - Suposem ara, per motivar la nostra 1003 00:44:03,770 --> 00:44:08,910 discussió en una setmana més el temps, aquest és un arxiu anomenat structs.h. 1004 00:44:08,910 --> 00:44:11,440 I un cop més, això és només una mostra d'alguna cosa que està per venir. 1005 00:44:11,440 --> 00:44:13,090 Però cal notar que molts d'això és els comentaris. 1006 00:44:13,090 --> 00:44:17,440 Així que vull destacar només el L'interessant per ara. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 hi ha aquesta mateixa paraula clau de nou. 1009 00:44:19,700 --> 00:44:23,100 typedef s'utilitza per declarar cadena com un tipus especial de dades. 1010 00:44:23,100 --> 00:44:27,490 Podeu utilitzar typedef per crear nou tipus de dades que no existien quan 1011 00:44:27,490 --> 00:44:28,570 C va ser inventat. 1012 00:44:28,570 --> 00:44:32,520 Per exemple, int ve amb C. caràcters ve amb C. doble ve amb C. Però 1013 00:44:32,520 --> 00:44:34,000 no hi ha noció d'un estudiant. 1014 00:44:34,000 --> 00:44:37,230 I no obstant això, seria molt útil per capaç d'escriure un programa que emmagatzema 1015 00:44:37,230 --> 00:44:40,440 en una variable, número d'identificació de l'estudiant, seu nom, i la seva casa. 1016 00:44:40,440 --> 00:44:42,890 En altres paraules, tres peces de les dades, com un int i un 1017 00:44:42,890 --> 00:44:44,420 corda i una altra cadena. 1018 00:44:44,420 --> 00:44:48,220 >> Amb la definició de tipus, el que és bastant potent sobre això i la paraula clau per sturct 1019 00:44:48,220 --> 00:44:53,660 estructura, vostè, el programador el 2013, realment pot definir el seu propi 1020 00:44:53,660 --> 00:44:57,530 els tipus de dades que no existien anys però fa que s'adaptin als seus propòsits. 1021 00:44:57,530 --> 00:45:01,910 Així que aquí, a les línies 13 a 19, estem declarant un nou tipus de dades, com 1022 00:45:01,910 --> 00:45:04,320 01:00 int, però cridant estudiant. 1023 00:45:04,320 --> 00:45:09,310 I dins d'aquesta variable va a de tres coses - 01:00 int, una cadena, 1024 00:45:09,310 --> 00:45:09,930 i una cadena. 1025 00:45:09,930 --> 00:45:13,040 Així que vostè pot pensar en el que és realment que va passar aquí, tot i que aquest és un 1026 00:45:13,040 --> 00:45:17,160 mica d'una simplificació per avui, un estudiant és essencialment va 1027 00:45:17,160 --> 00:45:19,450 pel que sembla això. 1028 00:45:19,450 --> 00:45:22,580 Serà un tros de memòria amb una identificació, un nom 1029 00:45:22,580 --> 00:45:25,580 camp, i un camp de casa. 1030 00:45:25,580 --> 00:45:30,670 I serem capaços d'utilitzar els trossos de memòria i accedir a ells de la següent manera. 1031 00:45:30,670 --> 00:45:38,870 >> Si entro a struct0.c, aquí hi ha un relativament llarg, però després d'un 1032 00:45:38,870 --> 00:45:42,630 patró, de codi que utilitza aquest nou truc. 1033 00:45:42,630 --> 00:45:45,790 Així que en primer lloc, permetin-me cridar la seva atenció a les parts interessants sobre de la tapa. 1034 00:45:45,790 --> 00:45:49,670 Afilat defineix als estudiants 3, declara una constants anomenats estudiants i cessionaris 1035 00:45:49,670 --> 00:45:53,450 de manera arbitrària el número 3, només així que tinc tres estudiants amb 1036 00:45:53,450 --> 00:45:54,830 aquest programa per ara. 1037 00:45:54,830 --> 00:45:55,960 Aquí ve Principal. 1038 00:45:55,960 --> 00:45:58,860 I fixin-se, com puc declarar un conjunt d'estudiants? 1039 00:45:58,860 --> 00:46:00,480 Bé, només ha d'utilitzar la mateixa sintaxi. 1040 00:46:00,480 --> 00:46:02,110 La paraula estudiant òbviament nova. 1041 00:46:02,110 --> 00:46:04,790 Però els estudiants, la classe, els estudiants del suport. 1042 00:46:04,790 --> 00:46:06,720 >> Així que per desgràcia hi ha molt de reutilització dels termes aquí. 1043 00:46:06,720 --> 00:46:07,660 Això és només un nombre. 1044 00:46:07,660 --> 00:46:09,040 Així que això és com dir tres. 1045 00:46:09,040 --> 00:46:11,430 Classe és el que jo vull per cridar a la variable. 1046 00:46:11,430 --> 00:46:12,840 Podria dir-estudiants. 1047 00:46:12,840 --> 00:46:15,880 Però la classe, això no és una classe en un orientat a objectes Java tipus de via. 1048 00:46:15,880 --> 00:46:17,220 És una classe d'estudiants. 1049 00:46:17,220 --> 00:46:20,590 I el tipus de cada element de dades en aquesta matriu és estudiant. 1050 00:46:20,590 --> 00:46:23,040 Així que això és una mica diferent i de dir alguna cosa 1051 00:46:23,040 --> 00:46:25,250 així, és només - 1052 00:46:25,250 --> 00:46:29,500 Estic dient dóna'm 3 estudiants i trucar a aquesta classe d'arranjament. 1053 00:46:29,500 --> 00:46:29,800 >> Està bé. 1054 00:46:29,800 --> 00:46:30,680 Ara aquí està un quatre bucle. 1055 00:46:30,680 --> 00:46:33,480 Familiars d'aquest tipus - iterate de zero en un màxim de tres. 1056 00:46:33,480 --> 00:46:35,160 I aquí està la nova peça de la sintaxi. 1057 00:46:35,160 --> 00:46:37,710 El programa em va a sol · licitar, l'ésser humà, per donar-li a un estudiant 1058 00:46:37,710 --> 00:46:39,200 ID, que és un int. 1059 00:46:39,200 --> 00:46:44,650 I aquí està la sintaxi amb què es pot emmagatzemar alguna cosa en el camp d'identificació en 1060 00:46:44,650 --> 00:46:48,630 Classe d'ubicació del suport I. Així aquesta sintaxi no és nova. 1061 00:46:48,630 --> 00:46:51,450 Això només significa donar-me el vuitè estudiant a la classe. 1062 00:46:51,450 --> 00:46:52,940 No obstant això, aquest símbol és nou. 1063 00:46:52,940 --> 00:46:56,320 Fins ara, hem utilitzat no podem punts, almenys en codi com aquest. 1064 00:46:56,320 --> 00:47:01,490 Això vol dir que van a l'estructura coneguda com un estudiant i posar una mica allà. 1065 00:47:01,490 --> 00:47:05,670 De la mateixa manera, en aquesta línia següent, el 31, vagi endavant i posar el que l'usuari escriu 1066 00:47:05,670 --> 00:47:10,530 un nom aquí i el que fan per guanyar-se casa, el mateix, seguir endavant i 1067 00:47:10,530 --> 00:47:13,230 el va posar en. casa. 1068 00:47:13,230 --> 00:47:15,955 >> Llavors, què fa aquest programa en última instància, fer? 1069 00:47:15,955 --> 00:47:17,220 Es pot veure una mica bromista allà. 1070 00:47:17,220 --> 00:47:24,780 Deixin-me seguir endavant i fer fer estructures 0 dot slash struct 0, ID de l'estudiant 1, 1071 00:47:24,780 --> 00:47:28,250 dir David Mather, estudiant ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, estudiant ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 i l'únic que va fer aquest programa, que és una cosa completament arbitrari, es 1075 00:47:38,380 --> 00:47:40,980 Jo volia fer alguna cosa amb aquestes dades, ara que ens han ensenyat a 1076 00:47:40,980 --> 00:47:43,450 utilitzar les estructures, és només tenia aquest bucle addicional aquí. 1077 00:47:43,450 --> 00:47:45,260 I iterar sobre el conjunt dels estudiants. 1078 00:47:45,260 --> 00:47:49,170 He utilitzat el nostre, amic potser ara familiar, cadena de comparar, stircomp a 1079 00:47:49,170 --> 00:47:53,780 verificació és la casa vuitena de l'estudiant igual a Mather? 1080 00:47:53,780 --> 00:47:56,760 I si és així, imprimir alguna cosa arbitràriament com, sí, ho és. 1081 00:47:56,760 --> 00:47:59,430 Però un cop més, només em dóna oportunitats d'usar i reutilitzar i 1082 00:47:59,430 --> 00:48:02,270 reutilitzar aquesta nova notació de punt. 1083 00:48:02,270 --> 00:48:03,250 >> Així que a qui li importa, oi? 1084 00:48:03,250 --> 00:48:06,270 El pujar amb un programa d'estudiant una mica arbitrari, però resulta 1085 00:48:06,270 --> 00:48:09,800 que podem fer coses útils amb aquesta, per exemple, com segueix. 1086 00:48:09,800 --> 00:48:14,600 Aquesta és una estructura molt més complicat en C. Té una dotzena o més camps, 1087 00:48:14,600 --> 00:48:15,880 una mica enigmàticament anomenat. 1088 00:48:15,880 --> 00:48:20,110 Però si alguna vegada has sentit parlar d'un gràfic format d'arxiu anomenat mapa de bits, BMP, que 1089 00:48:20,110 --> 00:48:22,830 Resulta que el format d'arxiu de mapa de bits gairebé sembla que aquest. 1090 00:48:22,830 --> 00:48:24,200 És una mica cara Smiley estúpid. 1091 00:48:24,200 --> 00:48:27,840 És una petita imatge que m'he acostat en prou gran perquè pogués veure 1092 00:48:27,840 --> 00:48:30,410 dels punts o píxels individuals. 1093 00:48:30,410 --> 00:48:33,800 Ara, resulta que podem representar un punt negre amb, per exemple, el nombre 0. 1094 00:48:33,800 --> 00:48:35,520 I un punt blanc amb el número 1. 1095 00:48:35,520 --> 00:48:39,140 >> En altres paraules, si vostè vol fer un Cara somrient i guardar la imatge en un 1096 00:48:39,140 --> 00:48:42,680 ordinador, és suficient per emmagatzemar i zeros els que es veuen així, quan escaigui, 1097 00:48:42,680 --> 00:48:45,250 de nou, els són de color blanc i zeros són de color negre. 1098 00:48:45,250 --> 00:48:48,290 I junts, si vostè té efectivament un ceñidor d'uns i zeros, té una 1099 00:48:48,290 --> 00:48:51,030 reixeta de píxels, i si vostè posa a terme, té un bonic 1100 00:48:51,030 --> 00:48:52,560 careta somrient. 1101 00:48:52,560 --> 00:48:58,150 Ara, el format d'arxiu de mapa de bits, BMP, és efectiva que sota el capó, 1102 00:48:58,150 --> 00:49:00,970 però amb més píxels sot que en realitat pot representar els colors. 1103 00:49:00,970 --> 00:49:05,170 >> Però quan vostè té més sofisticat formats d'arxiu, com BMP i JPEG i GIF 1104 00:49:05,170 --> 00:49:09,360 amb la qual vostè pot ser familiar, els arxius en el disc generalment no només 1105 00:49:09,360 --> 00:49:13,760 tenir zeros i uns dels píxels, però tenen algunes metadades, així - 1106 00:49:13,760 --> 00:49:16,960 meta en el sentit que no és realment dades, però és útil tenir. 1107 00:49:16,960 --> 00:49:21,370 Així que aquests camps aquí s'estan implicant i anem a veure això amb més detall en el P-set 1108 00:49:21,370 --> 00:49:25,810 5, que abans dels zeros i uns que representar els píxels d'una imatge, 1109 00:49:25,810 --> 00:49:29,110 hi ha un munt de metadades com la mida de la imatge i l' 1110 00:49:29,110 --> 00:49:30,250 amplada de la imatge. 1111 00:49:30,250 --> 00:49:32,910 I noto que estic arrencant alguns coses arbitràries aquí - 1112 00:49:32,910 --> 00:49:34,260 amplada i alçada. 1113 00:49:34,260 --> 00:49:36,160 Comptador binari i algunes altres coses. 1114 00:49:36,160 --> 00:49:37,840 Així que hi ha algunes metadades en un arxiu. 1115 00:49:37,840 --> 00:49:41,470 >> Però per entendre com es col · loquen els arxius d'aquesta manera, vostè pot 1116 00:49:41,470 --> 00:49:45,890 a continuació, manipular imatges, recuperar imatges des del disc, canviar la mida d'imatges. 1117 00:49:45,890 --> 00:49:47,560 Però no es pot necessàriament millorar-los. 1118 00:49:47,560 --> 00:49:48,480 Necessitava una fotografia. 1119 00:49:48,480 --> 00:49:52,840 Així que vaig tornar a RJ aquí, que et va veure a la pantalla fa força temps. 1120 00:49:52,840 --> 00:49:57,160 I si obro Keynote aquí, aquest és el que passa si s'intenta apropar i 1121 00:49:57,160 --> 00:49:59,380 millorar RJ. 1122 00:49:59,380 --> 00:50:01,480 No està millorant realment. 1123 00:50:01,480 --> 00:50:06,240 Ara Keynote és una espècie de desenfocament en un poc, només per passar per alt el 1124 00:50:06,240 --> 00:50:11,040 RJ fet que no aconsegueix especialment millorada quan fer més gran 1125 00:50:11,040 --> 00:50:13,310 I si fer-ho d'aquesta manera, veure les places? 1126 00:50:13,310 --> 00:50:15,490 Sí, definitivament es pot veure els quadrats d'un projector. 1127 00:50:15,490 --> 00:50:17,690 >> Això és el que passa quan a millorar. 1128 00:50:17,690 --> 00:50:22,570 Però per entendre com la nostra RJ o el Cara somrient s'implementa ens deixarà 1129 00:50:22,570 --> 00:50:24,950 En realitat escriure codi que manipula aquestes coses. 1130 00:50:24,950 --> 00:50:29,970 I jo que pensava que anava a acabar amb aquesta nota, amb 55 segons d'una realcen això és, 1131 00:50:29,970 --> 00:50:31,230 M'atreveixo, diguem més aviat enganyós. 1132 00:50:31,230 --> 00:50:32,990 >> [REPRODUIR VIDEO] 1133 00:50:32,990 --> 00:50:34,790 >> -Està mentint. 1134 00:50:34,790 --> 00:50:38,310 Sobre què, no ho sé. 1135 00:50:38,310 --> 00:50:41,200 >> -Llavors, què sabem? 1136 00:50:41,200 --> 00:50:45,280 >> -Que a les 9:15 Ray Santoya era al caixer automàtic. 1137 00:50:45,280 --> 00:50:47,830 >> -Així que la pregunta és què estava fent a les 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -El rodatge de la nou mil · límetres en alguna cosa. 1139 00:50:50,750 --> 00:50:52,615 Potser va veure el franctirador. 1140 00:50:52,615 --> 00:50:54,760 >> -O va ser treballar amb ell. 1141 00:50:54,760 --> 00:50:56,120 >> -Esperi. 1142 00:50:56,120 --> 00:50:57,450 Torna un. 1143 00:50:57,450 --> 00:50:58,700 >> -Què és el que veus? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Porteu la seva cara cap amunt, pantalla completa. 1146 00:51:09,490 --> 00:51:09,790 >> -Les seves ulleres. 1147 00:51:09,790 --> 00:51:11,040 >> -Hi ha una reflexió. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Aquest és l'equip de beisbol Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 Aquesta és la seva logotip. 1151 00:51:24,530 --> 00:51:27,040 >> -I està parlant amb qui sigui que estigui portant aquesta jaqueta. 1152 00:51:27,040 --> 00:51:27,530 >> [FI REPRODUCCIÓ DE VÍDEO] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. Malan: Això es pot establir Problema 5. 1154 00:51:29,180 --> 00:51:30,720 Ens veiem la setmana que ve. 1155 00:51:30,720 --> 00:51:32,330 >> Home: En el següent CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Grills] 1157 00:51:39,240 --> 00:51:41,270 >> [Reproducció de música]