1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Java 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Universiteti i Harvardit] 3 00:00:04,860 --> 00:00:07,260 [Kjo është CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Kjo është CS50, Java 5. 5 00:00:09,740 --> 00:00:12,900 Sot dhe këtë javë, ne kemi prezantuar një pak të botës së mjekësinë ligjore 6 00:00:12,900 --> 00:00:14,850 në kontekstin e problemit Set 4. 7 00:00:14,850 --> 00:00:18,480 Sot do të jetë një leksion i shkurtuar për shkak se ka një ngjarje të veçantë në këtu më pas. 8 00:00:18,480 --> 00:00:21,940 Pra, ne do të hedhim një vështrim dhe të vë në lojë dy nxënësit dhe prindërit njësoj sot 9 00:00:21,940 --> 00:00:24,600 me disa nga gjërat që janë në horizont. 10 00:00:24,600 --> 00:00:29,050 >> Midis tyre, nga e hëna, ju do të keni një pak më shumë shokët e klasës. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvardit dhe MIT nismë e re në internet për OpenCourseWare dhe më shumë, 12 00:00:32,980 --> 00:00:36,730 ka nisur në kampus Harvardit të hënën, që do të thotë të vijë e hëna 13 00:00:36,730 --> 00:00:40,930 ju do të keni, si e numërimin e fundit, 86.000 shokët e klasës të tjera 14 00:00:40,930 --> 00:00:43,680 Kush do të jetë ndjekur së bashku me ligjërata CS50 së dhe seksione 15 00:00:43,680 --> 00:00:45,890 dhe walkthroughs dhe vendos problem. 16 00:00:45,890 --> 00:00:51,870 Dhe si pjesë e kësaj, ju do të bëhen anëtarë të klasës së përurimit të CS50 dhe tani CS50x. 17 00:00:51,870 --> 00:00:56,150 Si pjesë e kësaj tani, të kuptojë se nuk do të ketë disa upsides si. 18 00:00:56,150 --> 00:01:00,620 Të marrë të gatshme për këtë, për numrin masiv të nxënësve, 19 00:01:00,620 --> 00:01:03,820 mjafton të themi se edhe pse ne kemi 108 TFS dhe CAS, 20 00:01:03,820 --> 00:01:07,560 kjo nuk është mjaft e mirë nxënës-arsimtar dikur ne hit 80.000 e studentëve. 21 00:01:07,560 --> 00:01:09,830 Ne nuk do të jeni të kategorizim problemi kaq shumë vë dorë, 22 00:01:09,830 --> 00:01:13,050 futur kështu këtë javë në setin e problemit do të jetë CS50 Check, 23 00:01:13,050 --> 00:01:15,410 e cila do të jetë një command-line utility brenda pajisjes 24 00:01:15,410 --> 00:01:17,880 që ju do të merrni një herë ju update it më vonë këtë fundjavë. 25 00:01:17,880 --> 00:01:21,030 Ju do të jenë në gjendje për të drejtuar një komandë, check50, në pset tuaj, 26 00:01:21,030 --> 00:01:24,770 dhe ju do të merrni reagime të menjëhershme për të parë nëse programi juaj është e saktë apo i pasaktë 27 00:01:24,770 --> 00:01:27,980 sipas specifikimeve të ndryshme të projektimit që kemi dhënë. 28 00:01:27,980 --> 00:01:30,310 Më shumë se në specifikimet e caktuar e problemit. 29 00:01:30,310 --> 00:01:34,220 Shokët e klasës CS50x do të jetë duke përdorur këtë si. 30 00:01:34,220 --> 00:01:36,170 >> Set Problem 4 është mbi të gjitha mjekësinë ligjore, 31 00:01:36,170 --> 00:01:38,630 dhe kjo pset ishte i frymëzuar me të vërtetë nga disa sende të vërtetë të jetës 32 00:01:38,630 --> 00:01:41,210 ku kur isha në shkollën e diplomuar I internuar për një kohë 33 00:01:41,210 --> 00:01:45,270 me zyrën e Prokurorit të Rrethit Middlesex County s së bërë punë mjeko-ligjore 34 00:01:45,270 --> 00:01:47,660 me plumb hetues mjeko-ligjor të tyre. 35 00:01:47,660 --> 00:01:50,280 Çfarë kjo arriti në, si unë mendoj se kam përmendur disa javë kaluara, 36 00:01:50,280 --> 00:01:52,720 Policia e Shtetit është e Mass ose të tjerët do të vijë në, 37 00:01:52,720 --> 00:01:56,150 ata do të zbres gjëra të tilla si hard drives dhe CD dhe floppy disqe dhe si, 38 00:01:56,150 --> 00:01:58,770 dhe pastaj qëllimi i zyrës mjeko-ligjore ka qenë për të vërtetuar 39 00:01:58,770 --> 00:02:01,470 nëse kishte apo nuk ishte dëshmi e disa lloj. 40 00:02:01,470 --> 00:02:04,730 Kjo ishte Njësiti i Hetimeve Speciale, kështu që ishte e bardhë-kular krimit. 41 00:02:04,730 --> 00:02:10,949 Ajo ishte lloj më shqetësues i krimeve, gjë që përfshin disa lloj të mediave digjitale. 42 00:02:10,949 --> 00:02:16,450 Ajo rezulton se nuk është se shumë njerëz shkruajnë një email duke thënë, "unë e bëri atë." 43 00:02:16,450 --> 00:02:20,490 Pra mjaft shpesh, këto kërkime mjeko-ligjore nuk kthehet deri të gjitha frutat që shumë, 44 00:02:20,490 --> 00:02:22,820 por ndonjëherë njerëzit do të shkruajnë email tilla. 45 00:02:22,820 --> 00:02:25,240 Pra, ndonjëherë, përpjekjet u shpërblyen. 46 00:02:25,240 --> 00:02:31,210 >> Por për të çojë deri në këtë pset mjeko-ligjor, ne do të jetë futur në pset4 një grimë e graphics. 47 00:02:31,210 --> 00:02:35,410 Ju ndoshta merrni këto gjëra për të dhënë - jpegs, gifs, dhe si - këto ditë. 48 00:02:35,410 --> 00:02:38,320 Por në qoftë se jeni të vërtetë mendoni rreth saj, një imazh, ashtu si fytyra e Rob, 49 00:02:38,320 --> 00:02:41,270 mund të modeluar si një sekuencë të dots ose piksele. 50 00:02:41,270 --> 00:02:43,380 Në rastin e fytyrës Rob, ka të gjitha llojet e ngjyrave, 51 00:02:43,380 --> 00:02:46,760 dhe kemi filluar të shohim dots individuale, i njohur ndryshe si pixels, 52 00:02:46,760 --> 00:02:48,610 sapo kemi filluar të zoom in 53 00:02:48,610 --> 00:02:54,660 Por nëse ne thjeshtojë botën një pak dhe vetëm thonë se kjo këtu është Rob në të zezë dhe të bardhë, 54 00:02:54,660 --> 00:02:57,490 për të përfaqësuar zezë dhe e bardhë, ne mund të përdorni vetëm binar. 55 00:02:57,490 --> 00:03:01,660 Dhe në qoftë se ne jemi duke shkuar për të përdorur binar, 1 ose 0, ne mund të shprehin këtë imazh të njëjtë 56 00:03:01,660 --> 00:03:06,140 fytyrë të qeshur e Rob me këtë model të bit. 57 00:03:06,140 --> 00:03:12,100 11000011 përfaqëson bardhë, e bardhë, e zezë, e zezë, e zezë, e zezë, e bardhë, e bardhë. 58 00:03:12,100 --> 00:03:16,150 Dhe kështu që nuk është një hap i madh për të filluar pastaj të flasim për fotografitë shumëngjyrëshe, 59 00:03:16,150 --> 00:03:18,600 gjërat që ju do të shihni në Facebook ose të marrë me një aparat fotografik dixhital. 60 00:03:18,600 --> 00:03:21,410 Por sigurisht, kur është fjala për ngjyra, ju keni nevojë për më shumë bit. 61 00:03:21,410 --> 00:03:25,690 Dhe mjaft e zakonshme në botën e fotografive është që të përdorin ngjyra jo 1-bit, 62 00:03:25,690 --> 00:03:29,560 si kjo sugjeron, por 24-bit ngjyra, ku ju në të vërtetë të merrni miliona të ngjyrave. 63 00:03:29,560 --> 00:03:32,250 Pra, si në rastin kur ne zoomed në në sy Rob, 64 00:03:32,250 --> 00:03:36,370 se ishte ndonjë numër të miliona e mundësive të ndryshme ngjyra. 65 00:03:36,370 --> 00:03:39,040 Pra, ne do të prezantoj këtë Set Problem 4, si dhe në walkthrough, 66 00:03:39,040 --> 00:03:43,370 cila do të jetë sot në 03:30 në vend të zakonshme 2:30 shkak të leksionit premtes këtu. 67 00:03:43,370 --> 00:03:46,620 Por video do të jetë online, si nesër zakonshme. 68 00:03:46,620 --> 00:03:48,820 >> Ne gjithashtu do të prezantoj me një tjetër format file. 69 00:03:48,820 --> 00:03:51,270 Kjo është për qëllim me qëllim për të parë frikësuese në fillim, 70 00:03:51,270 --> 00:03:55,670 por kjo është vetëm disa dokumentacioni për një struct C. 71 00:03:55,670 --> 00:03:58,940 Ajo rezulton se Microsoft vjet më parë ka ndihmuar popullarizohen këtë format 72 00:03:58,940 --> 00:04:05,150 quajtur bitmap format file, bmp, dhe kjo ishte një super e thjeshtë, ngjyra format grafik fotografi 73 00:04:05,150 --> 00:04:10,150 që është përdorur për mjaft kohë dhe nganjëherë ende për Wallpapers në desktop. 74 00:04:10,150 --> 00:04:14,760 Nëse ju mendoni përsëri në Windows XP dhe kodra kodrina dhe qiellit blu, 75 00:04:14,760 --> 00:04:17,170 që ishte zakonisht një imazh bmp ose bitmap. 76 00:04:17,170 --> 00:04:19,959 Bitmaps janë kënaqësi për ne, sepse ata kanë kompleksitetin pak më shumë. 77 00:04:19,959 --> 00:04:22,610 Kjo nuk është aq e thjeshtë si ky rrjet i 0s dhe 1s. 78 00:04:22,610 --> 00:04:27,510 Në vend të kësaj, ju keni gjëra të tilla si një goditje me kokë në fillim të një skedar. 79 00:04:27,510 --> 00:04:31,990 Pra, me fjalë të tjera, brenda një skedar. Bmp është një bandë e tërë e 0s dhe 1s, 80 00:04:31,990 --> 00:04:34,910 por ka disa 0s 1s shtesë dhe në atje. 81 00:04:34,910 --> 00:04:38,220 Dhe kjo rezulton se ajo që ne kemi marrë për të dhënë ndoshta për vite - 82 00:04:38,220 --> 00:04:45,170 file formats si. doc ose. xls apo. mp3, mp4., çfarëdo file formats 83 00:04:45,170 --> 00:04:48,480 se ju jeni të njohur me - çfarë e bën atë edhe do të thotë të jetë një format file, 84 00:04:48,480 --> 00:04:52,480 sepse në fund të ditës të gjitha këto dosje ne përdorim kemi vetëm 0s dhe 1s. 85 00:04:52,480 --> 00:04:56,810 Dhe ndoshta ata 0s dhe 1s përfaqësojnë ABC përmes ASCII apo të ngjashme, 86 00:04:56,810 --> 00:04:58,820 por në fund të ditës, ai është ende vetëm 0s dhe 1s. 87 00:04:58,820 --> 00:05:02,100 Pra, njerëzit vetëm herë pas here vendosin të shpikë një format të ri skedar 88 00:05:02,100 --> 00:05:06,420 ku ata standardizohet ajo modelet e copa të vërtetë do të thotë. 89 00:05:06,420 --> 00:05:09,220 Dhe në këtë rast këtu, folks që projektoi format bitmap fotografi 90 00:05:09,220 --> 00:05:15,620 tha se në bajt të parë në një skedar bitmap, pėrcaktuara nga 0 kompensuar atje, 91 00:05:15,620 --> 00:05:18,940 aty do të jenë disa quajtur cryptically bfType ndryshueshme quajtur, 92 00:05:18,940 --> 00:05:23,080 të cilat vetëm qëndron për llojin e file bitmap, çfarë lloji i file bitmap është kjo. 93 00:05:23,080 --> 00:05:27,700 Ju mund të konkludoj ndoshta nga rreshtin e dytë që kompensuar 2, numri i bajt 2, 94 00:05:27,700 --> 00:05:33,740 ka një model të 0s dhe 1s që përfaqëson çfarë? Madhësia e diçka. 95 00:05:33,740 --> 00:05:35,310 Dhe ajo shkon në nga atje. 96 00:05:35,310 --> 00:05:37,410 Pra, në Set Problem 4, ju do të ecte nëpër disa nga këto gjëra. 97 00:05:37,410 --> 00:05:39,520 Ne nuk do të përfundojë deri kujdeset për të gjithë ata. 98 00:05:39,520 --> 00:05:47,510 Por vëreni se fillon të marrë interesante rreth bajt 54: rgbtBlue, Green, dhe Red. 99 00:05:47,510 --> 00:05:52,110 Nëse ju keni dëgjuar ndonjëherë akronim RGB - kuqe, jeshile, blu - kjo është një referencë për këtë 100 00:05:52,110 --> 00:05:54,610 sepse kjo rezulton nga ju mund të pikturoj të gjitha ngjyrat e ylberit 101 00:05:54,610 --> 00:05:58,180 me disa kombinim të kuqe dhe blu dhe të gjelbër. 102 00:05:58,180 --> 00:06:03,320 Dhe në fakt, prindërit në dhomë mund të kujtojnë disa nga projektuesit më të hershme. 103 00:06:03,320 --> 00:06:05,890 Këto ditë, ju vetëm shikoni një dritë të ndritshme që vijnë nga një lente, 104 00:06:05,890 --> 00:06:09,800 por mbrapa në ditë keni pasur lente të kuqe, lente blu, dhe lente jeshile, 105 00:06:09,800 --> 00:06:13,380 dhe së bashku ata që synojnë një ekran dhe formoi një foto ngjyra. 106 00:06:13,380 --> 00:06:16,270 Dhe mjaft shpesh, shkollat ​​e mesme dhe shkollat ​​e larta do të ketë këto lente 107 00:06:16,270 --> 00:06:19,720 ndonjëherë kaq pak shtrembër, kështu ju keni qenë lloj i shohim imazhe të dyfishta apo trefishtë. 108 00:06:19,720 --> 00:06:24,100 Por kjo ishte ideja. Keni pasur dritë të kuqe dhe të gjelbër dhe blu pikturë një foto. 109 00:06:24,100 --> 00:06:26,590 Dhe se parimi i njëjtë është përdorur në kompjuter. 110 00:06:26,590 --> 00:06:30,230 >> Pra, ndër sfidat atëherë për ju në problemin Set 4 do të jetë disa gjëra. 111 00:06:30,230 --> 00:06:34,800 Njëra është që në fakt të resize një imazh, për të marrë në një model të 0s dhe 1s, 112 00:06:34,800 --> 00:06:40,200 kuptoj se cila chunks e 0s dhe 1s përfaqësojnë atë në një strukturë si kjo, 113 00:06:40,200 --> 00:06:43,630 dhe pastaj të kuptoj se si për të replikuar piksele - Reds, dëshpëruar, zarzavate - 114 00:06:43,630 --> 00:06:46,660 brenda në mënyrë që kur një foto duket si ky në fillim, 115 00:06:46,660 --> 00:06:49,210 kjo mund të duket si ky vend pas kësaj. 116 00:06:49,210 --> 00:06:53,640 Ndër sfidat tjera shumë do të jetë që ju do të dorëzohet një imazh mjeko-ligjore 117 00:06:53,640 --> 00:06:56,030 i një file aktual nga një aparat fotografik dixhital. 118 00:06:56,030 --> 00:06:58,960 Dhe në atë aparat fotografik, një herë e një kohë, ishin një bandë e tërë të fotografive. 119 00:06:58,960 --> 00:07:03,760 Problemi është që ne aksidentalisht fshirë ose kishte imazhin e korruptuar disi. 120 00:07:03,760 --> 00:07:05,750 Gjëra të këqija të ndodhë me kamera dixhitale. 121 00:07:05,750 --> 00:07:09,150 Dhe kështu që ne kopjuar shpejt të gjitha off 0s dhe 1s të këtë kartë për ju, 122 00:07:09,150 --> 00:07:13,610 shpëtuar të gjithë ata në një skedar të madh, dhe pastaj ne do të dorëzojë ato tek ju në problemin Set 4 123 00:07:13,610 --> 00:07:19,320 kështu që ju mund të shkruani një program në C me të cilin për të rimarrë të gjitha ato JPEGs, në mënyrë ideale. 124 00:07:19,320 --> 00:07:23,330 Dhe kjo rezulton se jpegs, edhe pse ata janë disi e një format file kompleks - 125 00:07:23,330 --> 00:07:26,360 ata janë shumë më komplekse se kjo fytyrë të qeshur këtu - 126 00:07:26,360 --> 00:07:31,160 kjo rezulton se çdo JPEG fillon me modelet e njëjta të 0s dhe 1s. 127 00:07:31,160 --> 00:07:35,630 Pra, duke përdorur, në fund të fundit, një lak, ndërsa ose një për lak apo të ngjashme, 128 00:07:35,630 --> 00:07:38,880 ju mund iterate mbi të gjitha 0s dhe 1s në këtë imazh mjeko-ligjore, 129 00:07:38,880 --> 00:07:43,150 dhe çdo herë që të shihni model të veçantë që është përcaktuar në specifikimet e caktuar e problemit, 130 00:07:43,150 --> 00:07:47,880 ju mund të marrë këtu është, me probabilitet shumë të lartë, fillimi i një JPEG. 131 00:07:47,880 --> 00:07:51,230 Dhe sa më shpejt që ju të gjeni të njëjtin model disa numrin e bytes 132 00:07:51,230 --> 00:07:55,430 ose kilobytes ose megabajt vonë, ju mund të marrë këtu është një JPEG dytë, 133 00:07:55,430 --> 00:07:57,380 foto e mora pas një të parë. 134 00:07:57,380 --> 00:08:01,370 Më lejoni të mos e lexuar këtë skedar parë, filloni të shkruani këtë një të re, 135 00:08:01,370 --> 00:08:06,310 dhe prodhimi i programit tuaj për pset4 do të jetë sa më shumë si 50 jpegs. 136 00:08:06,310 --> 00:08:09,270 Dhe në qoftë se kjo nuk është 50 jpegs, ju keni një pak e një lak. 137 00:08:09,270 --> 00:08:12,490 Nëse ju keni një numër të pafund të JPEGs, ju keni një lak pafund. 138 00:08:12,490 --> 00:08:14,910 Kështu që shumë do të jetë mjaft e një rasti të përbashkët. 139 00:08:14,910 --> 00:08:16,600 Pra, kjo është ajo që është në horizont. 140 00:08:16,600 --> 00:08:21,310 >> Quiz 0 pas nesh, të realizuar në email tim që gjithmonë ka njerëz të cilët janë të dyja të lumtur, 141 00:08:21,310 --> 00:08:23,640 lloj kohe neutrale, dhe i trishtuar rreth quiz 0. 142 00:08:23,640 --> 00:08:26,800 Dhe ju lutem mos arritur jashtë për mua, kreu TF Zamyla, TF tuaj, 143 00:08:26,800 --> 00:08:31,180 ose një i CAS-it që ju e dini në qoftë se ju do të donte për të diskutuar se si gjërat shkuan. 144 00:08:31,180 --> 00:08:35,539 >> Pra, për të bërë përshtypje prindërit këtu në dhomë, ajo është biblioteka CS50? 145 00:08:36,429 --> 00:08:40,390 [Qeshur] Good job. 146 00:08:40,390 --> 00:08:48,340 Çfarë është bibliotekë CS50? Po. >> [Student] Kjo është një para-shkruar grup i kodit [padëgjueshme] 147 00:08:48,340 --> 00:08:49,750 Mirë, mirë. 148 00:08:49,750 --> 00:08:53,240 Kjo është një para-shkruar grup i kodit që kemi stafi i shkruar, ne ofrojmë për ju, 149 00:08:53,240 --> 00:08:55,030 që ofron një funksionalitet të përbashkët, 150 00:08:55,030 --> 00:08:59,020 sende si të merrni më një varg, të merrni mua një int - të gjitha funksionet që janë të listuara këtu. 151 00:08:59,020 --> 00:09:02,260 >> Duke filluar nga tani, ne të fillojë me të vërtetë të marrë këto rrota trajnimit jashtë. 152 00:09:02,260 --> 00:09:05,050 Ne jemi duke shkuar për të filluar për të marrë një varg larg nga ju, 153 00:09:05,050 --> 00:09:08,870 e cila risjell ishte vetëm një sinonim për çfarë lloji të dhënave aktuale? Studentët shumta >> [] char *. 154 00:09:08,870 --> 00:09:12,730 * Char. Për prindërit, që ishte ndoshta [e bën të shëndoshë whooshing]. Kjo është e mirë. 155 00:09:12,730 --> 00:09:17,550 * Char ne do të fillojnë të shohin në ekran të gjithë më shumë si ne vargun hequr nga fjalori ynë, 156 00:09:17,550 --> 00:09:19,730 të paktën kur është fjala për të vërtetë shkruar kodin. 157 00:09:19,730 --> 00:09:22,840 Në mënyrë të ngjashme, ne do të ndaluar përdorimin e disa prej këtyre funksioneve sa më shumë 158 00:09:22,840 --> 00:09:25,280 sepse programet tona do të merrni më të sofistikuara. 159 00:09:25,280 --> 00:09:28,480 Në vend se të shkruani vetëm programe që rri atje me një keq të shpejtë, 160 00:09:28,480 --> 00:09:31,870 duke pritur për përdoruesit të shkruani diçka në, ju do të merrni inputet tuaja nga diku tjetër. 161 00:09:31,870 --> 00:09:35,490 Për shembull, ju do të merrni ato nga një seri e copa në hard drive lokale. 162 00:09:35,490 --> 00:09:38,580 Ju do të merrni në vend të tyre në të ardhmen nga një lidhje të rrjetit, 163 00:09:38,580 --> 00:09:40,230 disa website diku. 164 00:09:40,230 --> 00:09:44,110 >> Pra, le të zhvishem mbrapa shtresë këtë për herë të parë dhe të tërheqë deri Appliance CS50 165 00:09:44,110 --> 00:09:49,010 dhe ky file i quajtur cs50.h, të cilat ju keni qenë për disa javë # përfshirë, 166 00:09:49,010 --> 00:09:51,140 por le të shohim se çfarë është në të vërtetë në brendësi të kësaj. 167 00:09:51,140 --> 00:09:54,430 Në krye të dosjes në ngjyrë blu është vetëm një bandë e tërë e komenteve: 168 00:09:54,430 --> 00:09:57,050 Informacioni garanci dhe licencimit. 169 00:09:57,050 --> 00:09:59,050 Kjo është lloj i një paradigmë të përbashkët në software 170 00:09:59,050 --> 00:10:01,580 sepse një shumë e software këto ditë është ajo që quhet burim të hapur, 171 00:10:01,580 --> 00:10:05,220 që do të thotë se dikush ka shkruar kodin dhe e bëri atë të lirë në dispozicion 172 00:10:05,220 --> 00:10:10,470 jo vetëm për të drejtuar dhe për të përdorur, por që në fakt lexuar dhe të ndryshojë dhe të integrohen në punën tuaj. 173 00:10:10,470 --> 00:10:14,660 Pra, kjo është ajo që ju keni qenë duke përdorur, software burim të hapur, megjithëse në një formë shumë të vogël. 174 00:10:14,660 --> 00:10:18,560 Nëse unë lëvizni poshtë e kaluara komenteve, edhe pse, ne do të fillojnë të shohin disa gjëra më të njohura. 175 00:10:18,560 --> 00:10:25,010 Njoftimi në krye këtu se dosja cs50.h përfshin një bandë e tërë e dosjeve header. 176 00:10:25,010 --> 00:10:28,560 Shumica e këtyre, ne nuk e kemi parë më parë, por një është e njohur. 177 00:10:28,560 --> 00:10:32,270 Cila nga këto kemi parë, megjithëse shkurtimisht, deri më tani? >> [Student] bibliotekë Standard. 178 00:10:32,270 --> 00:10:35,810 Po, biblioteka standarde. stdlib.h ka malloc. 179 00:10:35,810 --> 00:10:38,320 Sapo kemi filluar duke folur për ndarjen e kujtesës dinamike, 180 00:10:38,320 --> 00:10:41,650 të cilat ne do të kthehen në javën e ardhshme, si edhe, duke përfshirë edhe kemi filluar këtë dosje. 181 00:10:41,650 --> 00:10:46,640 Ajo rezulton se bool dhe të vërteta dhe të rreme në fakt nuk ekzistojnë në C në vetvete 182 00:10:46,640 --> 00:10:49,440 nëse ju të përfshijë këtë skedë këtu. 183 00:10:49,440 --> 00:10:52,710 Ne kemi qenë të përfshirë për disa javë stdbool.h 184 00:10:52,710 --> 00:10:55,620 kështu që ju mund të përdorni nocionin e një bool, e vërtetë apo e rreme. 185 00:10:55,620 --> 00:10:58,620 Pa këtë, ju do të keni për të zgjidhur të rreme saj dhe të përdorni një int 186 00:10:58,620 --> 00:11:02,610 dhe vetëm në mënyrë arbitrare të supozojmë se 0 është e rreme dhe 1 është e vërtetë. 187 00:11:02,610 --> 00:11:07,150 Nëse ne lëvizni poshtë më tej, këtu është përkufizimi ynë i një varg. 188 00:11:07,150 --> 00:11:11,390 Kjo rezulton nga, siç kemi thënë më parë, se ku kjo është ylli nuk ka rëndësi. 189 00:11:11,390 --> 00:11:13,720 Ju mund edhe të ketë hapësirë ​​të gjithë rreth. 190 00:11:13,720 --> 00:11:16,740 Ne këtë semestër janë promovuar atë si kjo për të bërë të qartë 191 00:11:16,740 --> 00:11:18,620 se ylli ka të bëjë me llojin, 192 00:11:18,620 --> 00:11:21,700 por e kuptojnë vetëm si e zakonshme, nëse nuk është një pak më të zakonshme, 193 00:11:21,700 --> 00:11:24,430 është për të vënë atë atje, por funksionalisht është e njëjta gjë. 194 00:11:24,430 --> 00:11:27,720 Por tani, nëse lexojmë poshtë më tej, le të marrin një vështrim në GetInt 195 00:11:27,720 --> 00:11:32,190 sepse ne kemi përdorur që ndoshta të parë para se çdo gjë tjetër këtë semestër. 196 00:11:32,190 --> 00:11:37,440 Këtu është GetInt. Kjo është ajo? >> [Student] Një prototip. Kjo >> është vetëm një prototip. 197 00:11:37,440 --> 00:11:41,410 Shpesh, ne kemi vënë prototypes në majat e tonë. Fotografi c, 198 00:11:41,410 --> 00:11:46,690 por ju gjithashtu mund të vënë prototypes në fotografi header. fotografi, h, si ky këtu 199 00:11:46,690 --> 00:11:50,840 kështu që kur ju shkruani disa funksione që ju dëshironi që njerëzit e tjerë të jenë në gjendje për t'u përdorur, 200 00:11:50,840 --> 00:11:53,550 e cila është pikërisht rasti me bibliotekën CS50, 201 00:11:53,550 --> 00:11:57,040 ju jo vetëm të zbatojë funksionet tuaja në diçka si cs50.c, 202 00:11:57,040 --> 00:12:02,790 ju gjithashtu vënë prototipa jo në krye të kësaj dosje, por në krye të një file header. 203 00:12:02,790 --> 00:12:07,170 Atëherë kjo fotografi header është ajo që miqtë dhe kolegët përfshijnë 204 00:12:07,170 --> 00:12:09,760 me # përfshijë në kodin e tyre. 205 00:12:09,760 --> 00:12:12,210 Pra, gjithë kësaj kohe, ju keni qenë të përfshirë të gjitha këto prototipa, 206 00:12:12,210 --> 00:12:16,580 efektive në krye të dosjes tuaj, por me anë të këtij mekanizmi # include, 207 00:12:16,580 --> 00:12:20,070 e cila në thelb kopje dhe pastat këtë fotografi në tuaj. 208 00:12:20,070 --> 00:12:23,070 Këtu është një dokumentacion mjaft të detajuar. 209 00:12:23,070 --> 00:12:25,640 Ne kemi shumë e shumë të marrë për të dhënë se GetInt merr një int, 210 00:12:25,640 --> 00:12:27,640 por ajo rezulton se ka disa raste qoshe. 211 00:12:27,640 --> 00:12:31,810 Çfarë ndodh nëse përdoruesi lloje në një numër që është mënyrë shumë e madhe, një quintillion, 212 00:12:31,810 --> 00:12:35,490 që thjesht nuk mund të përshtatet në brendësi të një int? Çfarë është sjellja e pritshme? 213 00:12:35,490 --> 00:12:38,020 Idealisht, kjo është e parashikueshme. 214 00:12:38,020 --> 00:12:40,280 Pra, në këtë rast, në qoftë se ju në të vërtetë lexuar shkruar gjobë, 215 00:12:40,280 --> 00:12:44,500 në fakt ju do të shihni se nëse linja nuk mund të lexohet, këtë INT_MAX kthimit. 216 00:12:44,500 --> 00:12:48,320 Ne kurrë nuk kemi folur për këtë, por bazuar në kapitalizimin e saj, çfarë është ajo ndoshta? 217 00:12:48,320 --> 00:12:50,640 [Student] A konstante. >> Kjo është një konstante. 218 00:12:50,640 --> 00:12:54,770 Kjo është një konstante të veçantë që është deklaruar ndoshta në një nga ato fotografi header 219 00:12:54,770 --> 00:13:00,090 që është më lart në dosjen, dhe INT_MAX është ndoshta diçka si rreth 2 miliardë, 220 00:13:00,090 --> 00:13:04,990 Ideja është se për shkak se ne kemi nevojë për të ditur se diçka disi shkoi keq, 221 00:13:04,990 --> 00:13:10,700 Ne, po, kanë 4 miliard numrat në dispozicionin tonë: -2000000000 më deri në 2 miliardë, të japë ose të marrë. 222 00:13:10,700 --> 00:13:14,710 E pra, ajo që është e zakonshme në programimin është që ju vjedhin vetëm një nga ato numra, 223 00:13:14,710 --> 00:13:18,920 ndoshta 0, ndoshta 2 miliardë, ndoshta -2000000000, 224 00:13:18,920 --> 00:13:23,280 kështu që ju kaloni një nga vlerat tuaja të mundshme në mënyrë që ju mund të angazhohen në botë 225 00:13:23,280 --> 00:13:26,820 se nëse diçka shkon keq, unë do të kthehem këtë vlerë super të mëdha. 226 00:13:26,820 --> 00:13:31,030 Por ju nuk doni të shtypni diçka përdorues fshehta si ... 234, një numër i madh të vërtetë. 227 00:13:31,030 --> 00:13:34,060 Ju përgjithësuar atë vend si një konstante. 228 00:13:34,060 --> 00:13:38,060 Pra me të vërtetë, në qoftë se ju ishin duke u anal javëve të fundit, çdo herë që quhet GetInt, 229 00:13:38,060 --> 00:13:42,900 ju duhet të keni qenë të kontrolluar me një kusht nëse bënë llojin e përdoruesit në INT_MAX, 230 00:13:42,900 --> 00:13:46,590 ose, më saktësisht, bëri INT_MAX GetInt kthimit, sepse në qoftë se ai e bëri, 231 00:13:46,590 --> 00:13:51,830 që në fakt do të thotë se ata nuk e shkruani atë. Diçka shkoi keq në këtë rast. 232 00:13:51,830 --> 00:13:56,080 Pra, kjo është ajo që është e njohur përgjithësisht si një vlerë sentinel, të cilat vetëm do të thotë të veçantë. 233 00:13:56,080 --> 00:13:58,120 >> Le të kthehemi tani në dosje. C. 234 00:13:58,120 --> 00:14:01,340 File C ka ekzistuar në aplikim për disa kohë. 235 00:14:01,340 --> 00:14:06,840 Dhe në fakt, ajo ka aplikim para-hartuar për ju në atë gjë, ne të quajtur kod objekt, 236 00:14:06,840 --> 00:14:09,540 por ai thjesht nuk ka rëndësi për ju, ku ajo është për shkak se sistemi di 237 00:14:09,540 --> 00:14:11,730 në këtë rast kur ai është: aplikim. 238 00:14:11,730 --> 00:14:17,400 Le të lëvizni poshtë për të GetInt tani dhe shikoni se si GetInt ka qenë duke punuar gjithë këtë kohë. 239 00:14:17,400 --> 00:14:19,460 Këtu kemi komente të ngjashme nga më parë. 240 00:14:19,460 --> 00:14:21,660 Më lejoni të zoom në në vetëm pjesë të kodit. 241 00:14:21,660 --> 00:14:23,900 Dhe ajo që ne kemi për GetInt është në vijim. 242 00:14:23,900 --> 00:14:25,700 Ajo nuk merr input. 243 00:14:25,700 --> 00:14:29,510 Ajo kthen një int, ndërsa (e vërtetë), kështu që ne kemi një lak të pafund të qëllimshme, 244 00:14:29,510 --> 00:14:33,180 por me sa duket ne do të thyer nga kjo disi ose të kthehen nga brenda këtë. 245 00:14:33,180 --> 00:14:34,870 >> Le të shohim se si punon kjo. 246 00:14:34,870 --> 00:14:39,240 Ne duket të jetë duke përdorur getString në këtë linjë të parë brenda loop, 166. 247 00:14:39,240 --> 00:14:43,780 Kjo është tani praktikë e mirë, sepse në çfarë rrethanash mund të kthehen getString 248 00:14:43,780 --> 00:14:47,660 NULL veçantë fjalen? >> [Student] Nëse diçka shkon keq. 249 00:14:47,660 --> 00:14:51,630 Nëse diçka shkon keq. Dhe çfarë mund të shkojnë keq kur ju telefononi diçka si getString? 250 00:14:54,960 --> 00:14:57,640 Po. >> [Student] malloc dështon për të dhënë atë ints. 251 00:14:57,640 --> 00:14:59,150 Po. Ndoshta malloc dështon. 252 00:14:59,150 --> 00:15:03,190 Diku nën kapuç, getString është duke bërë thirrje malloc, e cila akordon kujtesës, 253 00:15:03,190 --> 00:15:06,020 e cila lejon të dyqan kompjuter të gjitha personazhet 254 00:15:06,020 --> 00:15:07,750 se përdoruesi lloje në tastierë. 255 00:15:07,750 --> 00:15:11,590 Dhe mendoj përdorues kishte një të tërë shumë kohë të lirë dhe më të shtypur, për shembull, 256 00:15:11,590 --> 00:15:16,160 se 2 miliardë karaktere në, karaktere më shumë se kompjuteri ka edhe RAM. 257 00:15:16,160 --> 00:15:19,250 GetString duhet të jetë në gjendje për të ditur se për ju. 258 00:15:19,250 --> 00:15:22,560 Edhe në qoftë se kjo është një super, super rast i pazakontë qoshe, 259 00:15:22,560 --> 00:15:24,340 ajo duhet të jetë disi në gjendje për të trajtuar këtë, 260 00:15:24,340 --> 00:15:28,750 dhe kështu getString, në qoftë se ne kemi shkuar mbrapa dhe lexoni dokumentacionin e saj, e bën në fakt e kthimit NULL. 261 00:15:28,750 --> 00:15:34,460 Deri tani, nëse dështon getString duke u kthyer NULL, GetInt do të dështojë duke u kthyer INT_MAX 262 00:15:34,460 --> 00:15:37,690 vetëm si një Sentinel. Këto janë vetëm konventat njerëzore. 263 00:15:37,690 --> 00:15:41,450 E vetmja mënyrë ju do të dini ky është rasti është duke lexuar dokumentacionin. 264 00:15:41,450 --> 00:15:45,040 >> Le të lëvizni poshtë për të ku int është marrë në të vërtetë. 265 00:15:45,040 --> 00:15:51,160 Nëse unë lëvizni poshtë pak më tej, në përputhje 170, ne kemi një koment mbi këto linja. 266 00:15:51,160 --> 00:15:55,100 Ne shpallim në 172 një int n, dhe një char, C, dhe pastaj këtë funksion të ri, 267 00:15:55,100 --> 00:15:58,930 që disa prej jush kanë ngecur nëpër para, sscanf. 268 00:15:58,930 --> 00:16:00,870 Kjo qëndron për scanf string. 269 00:16:00,870 --> 00:16:05,700 Me fjalë të tjera, më jep mua një varg dhe unë do të scan atë për pjesë të informacionit të interesit. 270 00:16:05,700 --> 00:16:07,360 Çfarë do të thotë kjo? 271 00:16:07,360 --> 00:16:11,800 Le të supozojmë se unë lloji në, fjalë për fjalë, 123 në tastierë dhe pastaj goditi Enter. 272 00:16:11,800 --> 00:16:16,470 Çfarë është lloji dhënat e 123, kur u kthye nga getString? >> [Student] String. 273 00:16:16,470 --> 00:16:18,380 Kjo është padyshim një varg, apo jo? Unë kam një varg. 274 00:16:18,380 --> 00:16:23,220 Pra, 123 është me të vërtetë, të japin kuotën e-mbyll thonjëzat, 123 me 0 \ në fund të tij. 275 00:16:23,220 --> 00:16:27,110 Që nuk është një int. Kjo nuk është një numër. Ajo duket si një numër, por kjo nuk është e vërtetë. 276 00:16:27,110 --> 00:16:29,080 Pra, çfarë ka GetInt duhet të bëni? 277 00:16:29,080 --> 00:16:35,750 Ajo ka për të skanoni atë varg majta në të djathtë - 123 \ 0 - dhe disi të konvertohet në një numër të plotë aktuale. 278 00:16:35,750 --> 00:16:37,850 Ju mund të kuptoj se si ta bëni këtë. 279 00:16:37,850 --> 00:16:41,450 Nëse ju mendoni përsëri në pset2, ju me sa duket mori një pak më të rehatshme me Cezarit 280 00:16:41,450 --> 00:16:44,820 ose Vigenere, kështu që ju mund iterate mbi një varg, ju mund të konvertohet chars të ints. 281 00:16:44,820 --> 00:16:46,710 Por dreq, kjo është një tërësi shumë të punë. 282 00:16:46,710 --> 00:16:49,860 Pse të mos thërrasë një funksion si sscanf që bën që për ju? 283 00:16:49,860 --> 00:16:54,230 Kështu sscanf pret një argumenti - në këtë rast quajtur linjë, e cila është një varg. 284 00:16:54,230 --> 00:17:01,840 Ju pastaj të specifikojë në thonjëza, shumë të ngjashme me printf, çfarë ju presim të shohim në këtë varg. 285 00:17:01,840 --> 00:17:09,000 Dhe atë që unë jam duke thënë se këtu është unë pres për të parë një numër decimal dhe ndoshta një karakter. 286 00:17:09,000 --> 00:17:12,000 Dhe ne do të shohim se pse ky është rasti i vetëm një moment. 287 00:17:12,000 --> 00:17:15,869 Dhe kjo rezulton se ky simbol është tani kujton gjëra kemi filluar duke folur për 288 00:17:15,869 --> 00:17:17,619 vetëm mbi një javë më parë. 289 00:17:17,619 --> 00:17:21,740 Çfarë është & n & dhe c bërë për ne këtu? >> [Student] Adresa e n dhe adresa e c. 290 00:17:21,740 --> 00:17:25,400 Po. Është dhënë mua adresën e n dhe adresa e c. Pse është se e rëndësishme? 291 00:17:25,400 --> 00:17:30,220 Ju e dini se me funksionet në C, ju gjithmonë mund të kthehen një vlerë apo pa vlerë fare. 292 00:17:30,220 --> 00:17:34,530 Ju mund të kthehet një int, një varg, një noton, një char, çfarëdo, ose ju mund të kthehen zbrazëti, 293 00:17:34,530 --> 00:17:38,030 por ju mund të kthehen vetëm një gjë maksimalisht. 294 00:17:38,030 --> 00:17:42,760 Por këtu ne duam të kthehen sscanf mua ndoshta një int, një numër decimal, 295 00:17:42,760 --> 00:17:46,220 dhe gjithashtu një char, dhe unë do të shpjegojë se pse char në një moment. 296 00:17:46,220 --> 00:17:51,460 Ju doni në mënyrë efektive sscanf të kthehen dy gjëra, por kjo nuk është e mundur vetëm në C. 297 00:17:51,460 --> 00:17:55,200 Ju mund të punojnë rreth se duke kaluar në dy adresat 298 00:17:55,200 --> 00:17:57,370 sepse sa më shpejt që ju të dorëzojë një funksion dy adresat, 299 00:17:57,370 --> 00:18:00,470 çfarë mund të bëni që të funksionojnë me to? >> [Student] Shkruani me ato adresa. 300 00:18:00,470 --> 00:18:02,010 Ajo mund të shkruani në adresat ato. 301 00:18:02,010 --> 00:18:05,770 Ju mund të përdorni operacion yll dhe shkoni atje, në secilën prej këtyre adresave. 302 00:18:05,770 --> 00:18:11,260 Kjo është lloj i këtij mekanizmi prapa-derë, por shumë e zakonshme për ndryshimin e vlerave të variablave 303 00:18:11,260 --> 00:18:14,870 më shumë se vetëm një vend - në këtë rast, dy. 304 00:18:14,870 --> 00:18:21,340 Tani vini re unë jam duke kontrolluar për == 1 dhe pastaj kthehen n në qoftë se ka, në fakt, për të vlerësuar e vërtetë. 305 00:18:21,340 --> 00:18:26,170 Pra, çfarë po ndodh? Teknikisht, të gjithë ne të vërtetë duan të ndodhë në GetInt është kjo. 306 00:18:26,170 --> 00:18:30,740 Ne duam të kuptoj, kështu që të flasin, ne duam të lexuar string - citim-mbyll thonjëzat 123 - 307 00:18:30,740 --> 00:18:34,560 dhe në qoftë se kjo duket si ka një numër atje, ajo që ne jemi duke thënë sscanf për të bërë 308 00:18:34,560 --> 00:18:38,190 është vënë atë numër - 123 - në këtë variabël n për mua. 309 00:18:38,190 --> 00:18:42,090 Pra, pse atëherë nuk kam të vërtetë kanë këtë si? 310 00:18:42,090 --> 00:18:48,220 Çfarë është roli i sscanf duke thënë se ju mund të merrni edhe një karakter këtu? 311 00:18:48,220 --> 00:18:53,470 [Përgjigja e padëgjueshme Studenti] >> Një pikë decimale në fakt mund të punojnë. 312 00:18:53,470 --> 00:18:56,330 Le të thonë se mendohet për një moment. Çfarë tjetër? 313 00:18:56,330 --> 00:18:59,270 [Student] Kjo mund të jetë NULL. Mirë >> mendimi. Kjo mund të jetë personazhi null. 314 00:18:59,270 --> 00:19:01,660 Kjo nuk është në fakt në këtë rast. Po. >> [Student] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Ose më lejoni të përgjithësuar edhe më tej. 316 00:19:04,340 --> 00:19:06,640 C% nuk ​​është vetëm për kontrollin gabim. 317 00:19:06,640 --> 00:19:09,300 Ne nuk duam që të ketë një karakter pas numrin, 318 00:19:09,300 --> 00:19:11,870 por ajo që kjo lejon mua që të bëni është siç vijon. 319 00:19:11,870 --> 00:19:18,210 Ajo rezulton se sscanf, përveç ruajtjen e vlerave në n dhe c në këtë shembull këtu, 320 00:19:18,210 --> 00:19:24,890 ajo gjithashtu nuk është ajo kthen numrin e variablave të vënë vlerat in 321 00:19:24,890 --> 00:19:30,260 Pra, nëse ju vetëm shkruani në 123, atëherë vetëm% d do të shkojë, 322 00:19:30,260 --> 00:19:33,880 dhe vetëm merr n ruajtur me një vlerë si 123, 323 00:19:33,880 --> 00:19:35,640 dhe asgjë nuk merr vënë në c. 324 00:19:35,640 --> 00:19:37,620 C mbetet një vlerë e mbeturinave, kështu që të flasin - 325 00:19:37,620 --> 00:19:40,730 mbeturina, sepse ajo kurrë nuk është initialized për disa vlera. 326 00:19:40,730 --> 00:19:45,520 Pra, në këtë rast, sscanf kthehet 1 sepse unë populluar 1 e këtyre pointers, 327 00:19:45,520 --> 00:19:50,190 në të cilin rast e madhe, unë kam një int kështu që unë liruar linjë të lirë deri kujtesës 328 00:19:50,190 --> 00:19:54,000 se getString ndarë në fakt, dhe atëherë unë kthehen n, 329 00:19:54,000 --> 00:19:58,500 tjetër në qoftë se keni menduar ndonjëherë se ku Riprovo deklaratë vjen nga, ajo vjen nga të drejtë këtu. 330 00:19:58,500 --> 00:20:04,390 Pra, nëse, nga ana tjetër, unë lloji në 123foo - vetëm disa sekuenca të rastit të tekstit - 331 00:20:04,390 --> 00:20:08,490 sscanf do të shohim, numri numrin numrin,, f, 332 00:20:08,490 --> 00:20:16,410 dhe kjo do të vihet në 123 n, ajo do të vënë në f c dhe pastaj kthehen 2. 333 00:20:16,410 --> 00:20:20,640 Pra, ne kemi, vetëm duke përdorur përkufizimin bazë të sjelljes sscanf, një mënyrë shumë të thjeshtë - 334 00:20:20,640 --> 00:20:23,900 edhe, komplekse në shikim të parë, por në fund të ditës mekanizmit mjaft e thjeshtë - 335 00:20:23,900 --> 00:20:28,320 e duke thënë se ka një int dhe nëse është kështu, është se e vetmja gjë që kam gjetur? 336 00:20:28,320 --> 00:20:29,860 Dhe hapësira të bardha këtu është e qëllimshme. 337 00:20:29,860 --> 00:20:34,000 Nëse keni lexuar dokumentacionin për sscanf, ajo ju tregon se në qoftë se ju të përfshijë një pjesë të whitespace 338 00:20:34,000 --> 00:20:38,810 në fillim apo në fund, edhe sscanf do të lejojë përdoruesit, për çfarëdo arsye, 339 00:20:38,810 --> 00:20:41,860 për të goditur bar hapësirë ​​123 dhe që do të jetë legjitim. 340 00:20:41,860 --> 00:20:44,150 Ju nuk do të çirrem në përdoruesi vetëm për shkak se ata e goditi space bar 341 00:20:44,150 --> 00:20:48,640 në fillim apo në fund, e cila është vetëm pak më shumë përdorues-miqësor. 342 00:20:48,640 --> 00:20:52,300 >> Çdo pyetje pastaj në GetInt? Po. >> [Student] Çfarë ndodh nëse ju vetëm vënë në një char? 343 00:20:52,300 --> 00:20:54,030 Mirë pyetje. 344 00:20:54,030 --> 00:20:59,890 Çfarë ndodh nëse ju shtypur vetëm në një char si f dhe hit Enter pa ndonjëherë shtypja 123? 345 00:20:59,890 --> 00:21:02,420 Çfarë mendoni se sjellja e kësaj linje të kodit atëherë do të jetë? 346 00:21:02,420 --> 00:21:04,730 [Përgjigja e padëgjueshme Student] 347 00:21:04,730 --> 00:21:08,790 Yeah, kështu që mund të mbulojë sscanf se edhe për shkak se në këtë rast, kjo nuk do të plotësoni n ose c. 348 00:21:08,790 --> 00:21:15,310 Ajo do të kthehet në vend 0, rast në të cilin unë jam gjithashtu infektues atë skenar 349 00:21:15,310 --> 00:21:18,750 sepse vlera e pritur që unë dua është 1. 350 00:21:18,750 --> 00:21:22,000 Unë vetëm dua një dhe vetëm një gjë për t'u mbushur. Mirë pyetje. 351 00:21:22,000 --> 00:21:24,290 >> Të tjerët? Dakord. 352 00:21:24,290 --> 00:21:26,250 >> Le të mos të kalojnë nëpër të gjitha funksioneve në këtu, 353 00:21:26,250 --> 00:21:29,500 por ai që duket të jetë ndoshta e interesit të mbetur është getString 354 00:21:29,500 --> 00:21:32,790 sepse kjo rezulton se GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 gjitha sandall një shumë të funksionimit të tyre në getString. 356 00:21:36,260 --> 00:21:39,750 Pra, le të marrin një sy se si ai po zbatohet këtu. 357 00:21:39,750 --> 00:21:43,630 Ky i fundit duket një kompleks pak, por ai përdor bazat njëjta 358 00:21:43,630 --> 00:21:45,670 se kemi filluar duke folur për javën e kaluar. 359 00:21:45,670 --> 00:21:49,490 Në getString, e cila merr asnjë argument sipas pavlefshme deri këtu 360 00:21:49,490 --> 00:21:53,730 dhe ajo kthen një varg, unë jam deklaruar me sa duket një varg quajtur buffer. 361 00:21:53,730 --> 00:21:56,270 Unë vërtetë nuk e di se çka do të përdoren për, por ne do të shohim. 362 00:21:56,270 --> 00:21:58,390 Ajo duket si kapaciteti është nga default 0. 363 00:21:58,390 --> 00:22:01,350 Nuk jam i sigurt ku po shkon kjo, jo të sigurt se çfarë po ndodh n që do të përdoret për të ende, 364 00:22:01,350 --> 00:22:03,590 por tani ajo është duke marrë një pak më shumë interesante. 365 00:22:03,590 --> 00:22:06,520 Në linjë 243, ne deklarojmë një int, c. 366 00:22:06,520 --> 00:22:08,800 Kjo është lloj i një detaj stupid. 367 00:22:08,800 --> 00:22:15,820 Një char është 8 bits, dhe 8 bit mund të ruajë sa vlera të ndryshme? >> [Student] 256. 256 >>. 368 00:22:15,820 --> 00:22:20,730 Problemi është në qoftë se ju dëshironi të keni 256 karaktere ASCII ndryshme, të cilat nuk janë 369 00:22:20,730 --> 00:22:23,340 në qoftë se ju mendoni përsëri - dhe kjo nuk është diçka për të mësuar përmendësh. 370 00:22:23,340 --> 00:22:25,710 Por në qoftë se ju mendoni përsëri në atë tabelë të madhe ASCII kishim javë më parë, 371 00:22:25,710 --> 00:22:30,600 ka pasur në atë rast 128 ose 256 karaktere ASCII. 372 00:22:30,600 --> 00:22:32,940 Ne kemi përdorur të gjitha modelet e lart 0s dhe 1s. 373 00:22:32,940 --> 00:22:36,210 Kjo është një problem në qoftë se ju doni të jetë në gjendje për të zbuluar një gabim 374 00:22:36,210 --> 00:22:40,190 sepse në qoftë se ju jeni tashmë duke përdorur vlerat për 256 karaktere tuaj, 375 00:22:40,190 --> 00:22:43,050 ju nuk e keni të vërtetë të planifikuar përpara, sepse tani ju keni asnjë mënyrë për të thënë, 376 00:22:43,050 --> 00:22:46,270 kjo nuk është një karakter legit, ky është një mesazh i gabuar. 377 00:22:46,270 --> 00:22:50,270 Pra, atë që bota nuk është se ata përdorin vlerën e ardhshëm më të madhe, diçka si një int, 378 00:22:50,270 --> 00:22:54,720 kështu që ju keni një numër të çmendur të bit, 32, 4 miliardë për vlerat e mundshme 379 00:22:54,720 --> 00:22:58,860 kështu që ju thjesht mund të përfundojnë duke përdorur në thelb 257 prej tyre, 380 00:22:58,860 --> 00:23:01,720 1 e cila ka disa domethënie të veçantë si një gabim. 381 00:23:01,720 --> 00:23:03,120 >> Pra, le të shohim se si punon kjo. 382 00:23:03,120 --> 00:23:07,760 Në linjë 246, unë kam këtë lak të madhe ndërkohë që është duke bërë thirrje fgetc, 383 00:23:07,760 --> 00:23:11,090 f fotografi kuptimi, kështu getc, dhe pastaj STDIN. 384 00:23:11,090 --> 00:23:15,520 Kjo rezulton nga kjo është vetëm mënyra më e saktë për të thënë të lexuar të dhëna nga tastierë. 385 00:23:15,520 --> 00:23:19,300 Standard mjete input tastierë, prodhimi standarde do të thotë ekran, 386 00:23:19,300 --> 00:23:23,310 dhe gabimi standard, të cilat ne do të shohim në pset4, do të thotë ekran 387 00:23:23,310 --> 00:23:27,490 por një pjesë të veçantë të ekranit në mënyrë që ajo nuk është conflated me prodhim aktual 388 00:23:27,490 --> 00:23:30,750 që ju qëllim për të shtypur. Por më shumë se në të ardhmen. 389 00:23:30,750 --> 00:23:34,440 Pra fgetc thjesht do të thotë të lexuar një karakter nga tastierë dhe ruajtur atë ku? 390 00:23:34,440 --> 00:23:37,350 Ruajtur atë në c. 391 00:23:37,350 --> 00:23:41,360 Dhe pastaj shikoni - kështu që unë jam vetëm duke përdorur disa bashkime boolean këtu - 392 00:23:41,360 --> 00:23:46,000 kontrolloni se ai nuk ka të barabartë - \ n, kështu që përdoruesi ka goditur Enter, ne duam të ndalemi në këtë pikë, 393 00:23:46,000 --> 00:23:49,850 fund të lak - dhe ne gjithashtu duam të kontrolloni për EOF veçantë të vazhdueshme, 394 00:23:49,850 --> 00:23:53,610 që nëse ju e dini apo me mend, çfarë e bën atë të qëndrojë për? >> [Student] Fundi i file. Fundi >> e dosjes. 395 00:23:53,610 --> 00:23:56,560 Kjo është lloj i pakuptimtë, sepse në qoftë se unë jam i shtypur në tastierë, 396 00:23:56,560 --> 00:23:58,870 vërtetë nuk ka asnjë fotografi të përfshira në këtë, 397 00:23:58,870 --> 00:24:01,150 por kjo është vetëm lloj i term gjenerik që përdoret për të nënkuptuar 398 00:24:01,150 --> 00:24:04,220 se asgjë tjetër po vjen nga gishtat e njeriut. 399 00:24:04,220 --> 00:24:06,460 EOF - fundi i file. 400 00:24:06,460 --> 00:24:09,920 Si një mënjanë, në qoftë se ju keni goditur ndonjëherë Kontrollit D në tastierën tuaj, jo që ju do të keni ende - 401 00:24:09,920 --> 00:24:15,230 ju keni goditur Kontrollit C - Kontrolli D dërgon këtë konstante të veçantë të quajtur EOF. 402 00:24:15,230 --> 00:24:19,850 Deri tani ne vetëm duhet disa alokimin dinamik kujtesës. 403 00:24:19,850 --> 00:24:23,440 >> Pra, në qoftë se (n + 1> kapaciteteve). Tani unë do të shpjegojë n. 404 00:24:23,440 --> 00:24:26,100 N është vetëm sa bytes jemi aktualisht në tampon, 405 00:24:26,100 --> 00:24:28,620 vargu që ju jeni duke ndërtuar nga përdoruesi. 406 00:24:28,620 --> 00:24:33,450 Nëse ju keni më shumë karaktere në tampon tuaj se ju keni kapacitet në tampon, 407 00:24:33,450 --> 00:24:37,410 intuitivisht se çfarë ne duhet të bëjmë atëherë është ndajë më shumë kapacitet. 408 00:24:37,410 --> 00:24:43,330 Kështu që unë jam duke shkuar për të skremuar mbi disa nga aritmetike këtu dhe të përqëndrohet vetëm në këtë funksion këtu. 409 00:24:43,330 --> 00:24:46,070 Ju e dini se çfarë është ose malloc të paktën në përgjithësi të njohur. 410 00:24:46,070 --> 00:24:48,970 Merrni me mend se çfarë realloc bën. >> [Student] Adds kujtesës. 411 00:24:48,970 --> 00:24:52,920 Kjo nuk është mjaft shtuar memorie. Ai bënë një rialokim kujtesë si më poshtë. 412 00:24:52,920 --> 00:24:57,220 Nëse ka ende vend në fund të vargut të ju jap më shumë se kujtesa 413 00:24:57,220 --> 00:25:00,000 se ajo fillimisht ju jep, atëherë ju do të merrni atë memorie shtesë. 414 00:25:00,000 --> 00:25:03,460 Kështu që ju mund të mbani vetëm vënë personazhet e vargut të kthehet prapa për të kthyer prapa. 415 00:25:03,460 --> 00:25:05,830 Por në qoftë se nuk është rasti për shkak se ju ka pritur shumë gjatë 416 00:25:05,830 --> 00:25:07,940 dhe diçka të rastit u plopped në kujtesën atje 417 00:25:07,940 --> 00:25:10,290 por ka memorie ekstra këtu poshtë, kjo është në rregull. 418 00:25:10,290 --> 00:25:13,100 Realloc do të bëjë të gjitha heqjen e rëndë për ju, 419 00:25:13,100 --> 00:25:16,750 lëvizin string keni lexuar në mënyrë shumë larg nga këtu, e vënë atë atje poshtë, 420 00:25:16,750 --> 00:25:19,460 dhe pastaj ju japin më shumë në pistë disa atë pikë. 421 00:25:19,460 --> 00:25:22,550 >> Pra, me një valë të dorës, më lejoni të them se ajo që po bën getString 422 00:25:22,550 --> 00:25:26,330 është ajo e filluar me një tampon të vogël, ndoshta një karakter të vetëm, 423 00:25:26,330 --> 00:25:30,820 dhe në qoftë se përdoruesi lloje në dy karaktere, getString përfundon thirrje realloc dhe thotë 424 00:25:30,820 --> 00:25:33,150 një karakter nuk ishte e mjaftueshme, jepni dy karaktere. 425 00:25:33,150 --> 00:25:35,950 Pastaj në qoftë se ju lexoni me anë të logjikës së lak, kjo do të thotë 426 00:25:35,950 --> 00:25:39,600 përdoruesi shtypur në 3 shkronja; jep mua tani nuk 2 por 4 karaktere, 427 00:25:39,600 --> 00:25:42,320 pastaj jepni 8, atëherë jepni 16 dhe 32. 428 00:25:42,320 --> 00:25:45,000 Fakti që unë jam duke dyfishuar kapacitetin e çdo kohë 429 00:25:45,000 --> 00:25:48,570 do të thotë se tampon nuk do të rritet ngadalë, ajo do të rritet shpejtë super. 430 00:25:48,570 --> 00:25:51,380 Dhe çfarë mund të jetë përparësi e se? 431 00:25:51,380 --> 00:25:54,600 Pse jam unë dyfishuar madhësinë e tampon 432 00:25:54,600 --> 00:25:58,020 edhe pse përdoruesit mund të duhet vetëm një karakter shtesë nga tastierë? 433 00:25:58,020 --> 00:26:01,750 [Përgjigja e padëgjueshme Studenti] >> Çfarë është ajo? >> [Student] Ju nuk duhet të rritet atë sa më shpesh. 434 00:26:01,750 --> 00:26:03,300 Saktësisht. Ju nuk duhet të rritet atë sa më shpesh. 435 00:26:03,300 --> 00:26:05,510 Dhe kjo është vetëm lloj i ju jeni mbrojtëse baste tuaj këtu, 436 00:26:05,510 --> 00:26:10,850 Ideja është se ju nuk doni të telefononi realloc shumë për shkak se ajo tenton të jetë i ngadalshëm. 437 00:26:10,850 --> 00:26:12,910 Çdo herë që ju kërkoni sistemin operativ për kujtesën, 438 00:26:12,910 --> 00:26:16,990 si ju së shpejti do të shihni në një sërë problemeve të ardhmen, ajo tenton të marrë disa kohë. 439 00:26:16,990 --> 00:26:20,010 Pra, duke minimizuar atë sasinë e kohës, edhe në qoftë se ju jeni të humbur një hapësirë, 440 00:26:20,010 --> 00:26:21,900 tenton të jetë një gjë e mirë. 441 00:26:21,900 --> 00:26:24,060 >> Por nëse lexojmë nëpër pjesën e fundit të getString këtu - 442 00:26:24,060 --> 00:26:27,950 dhe përsëri të kuptuarit çdo linjë të vetme këtu nuk është aq e rëndësishme sot - 443 00:26:27,950 --> 00:26:30,530 vëreni se ajo përfundimisht quan malloc përsëri 444 00:26:30,530 --> 00:26:33,880 dhe ajo ndan pikërisht si bytes shumë si ajo ka nevojë për vargun 445 00:26:33,880 --> 00:26:38,060 dhe pastaj hedh larg duke e quajtur buffer lirë e tepër të madh 446 00:26:38,060 --> 00:26:40,080 në qoftë se ajo vërtetë u dyfishua shumë herë. 447 00:26:40,080 --> 00:26:42,730 Pra me pak fjalë, kjo është se si getString ka qenë duke punuar gjithë këtë kohë. 448 00:26:42,730 --> 00:26:47,060 Të gjitha ai nuk është lexuar nga një karakter në një kohë përsëri dhe përsëri dhe përsëri, 449 00:26:47,060 --> 00:26:50,750 dhe çdo herë ajo ka nevojë për disa memorie shtesë, ai i kërkon sistemit operativ për të 450 00:26:50,750 --> 00:26:53,670 duke telefonuar realloc. 451 00:26:53,670 --> 00:26:57,890 >> Çdo pyetje? Dakord. 452 00:26:57,890 --> 00:26:59,270 >> Një sulm. 453 00:26:59,270 --> 00:27:04,060 Tani që ne e kuptojmë pointers ose të paktën janë gjithnjë e më të njohur me pointers, 454 00:27:04,060 --> 00:27:06,700 le të konsiderojnë si gjithë bota fillon të shembet 455 00:27:06,700 --> 00:27:10,030 në qoftë se ju nuk keni mjaft të mbrojtur kundër përdoruesve armiqësore, 456 00:27:10,030 --> 00:27:11,850 njerëz të cilët janë duke u përpjekur të kollitem në sistemin tuaj, 457 00:27:11,850 --> 00:27:16,890 njerëz të cilët janë duke u përpjekur për të vjedhur software tuaj duke iu shmangur disa kodin e regjistrimit 458 00:27:16,890 --> 00:27:19,090 që përndryshe mund të duhet të tipit in 459 00:27:19,090 --> 00:27:22,990 >> Hidhni një sy në këtë shembull këtu, e cila është vetëm kodi C që ka një funksion kryesor në pjesën e poshtme 460 00:27:22,990 --> 00:27:26,380 që e quan një foo funksion. Dhe çfarë është ajo kalon për të foo? 461 00:27:26,380 --> 00:27:29,680 [Student] Një argument i vetëm. >> [Malan] Një argument i vetëm. 462 00:27:29,680 --> 00:27:33,450 Pra, argv [1], që do të thotë fjalën e parë që përdoruesi typed në command line 463 00:27:33,450 --> 00:27:36,360 pas a.out apo çfarëdo programi është quajtur. 464 00:27:36,360 --> 00:27:41,680 Pra, foo në krye merr në një char *. Por * char është vetëm ajo? >> [Student] Një varg. 465 00:27:41,680 --> 00:27:43,350 [Malan] Një string, kështu që nuk ka asgjë të re këtu. 466 00:27:43,350 --> 00:27:45,420 Kjo është string arbitrarisht duke u quajtur bar. 467 00:27:45,420 --> 00:27:51,430 Në këtë linjë këtu, char c [12], në lloj gjysmë-teknik anglisht, çfarë është kjo linjë duke bërë? 468 00:27:51,430 --> 00:27:55,220 [Student] Një grup i - >> Array e? >> [Student] Personazhet. Personazhet. >> 469 00:27:55,220 --> 00:27:58,870 Më jepni një koleksion prej 12 karaktereve. Pra, ne mund të quajmë këtë një tampon. 470 00:27:58,870 --> 00:28:02,920 Ajo që quhet teknikisht c, por një tampon në programimin thjesht do të thotë një bandë e hapësirës 471 00:28:02,920 --> 00:28:04,800 që ju mund të vënë disa sende in 472 00:28:04,800 --> 00:28:07,940 Pastaj fundi, memcpy ne nuk e kam përdorur më parë, por ju ndoshta mund të me mend se çfarë ajo bën. 473 00:28:07,940 --> 00:28:10,480 Kjo kopje memorie. Çfarë e bën atë të bëjë? 474 00:28:10,480 --> 00:28:19,270 Ajo duket kopje bar, kontributi i saj, në të c por vetëm deri në gjatësinë e bar. 475 00:28:19,270 --> 00:28:24,930 Por ka një bug këtu. >> [Student] Ju duhet karakterin sizeof. Mirë >>. 476 00:28:24,930 --> 00:28:30,860 Teknikisht, ne duhet të vërtetë të bëjë strlen (bar) * sizeof (char)). Kjo është e saktë. 477 00:28:30,860 --> 00:28:33,930 Por në rastin më të keq këtu, le të supozojmë se that's - 478 00:28:33,930 --> 00:28:35,950 Rregull. Pastaj ka dy mete. 479 00:28:35,950 --> 00:28:39,160 Kështu sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Le të bëjnë këtë një pak më të gjerë. 481 00:28:41,290 --> 00:28:44,910 Deri tani nuk ka ende një bug, e cila është ajo? >> [Përgjigja e padëgjueshme Student] 482 00:28:44,910 --> 00:28:46,990 Kontrollo për çfarë? >> [Student] Kontrolloni for null. 483 00:28:46,990 --> 00:28:50,270 Ne përgjithësi duhet të jetë kontrolluar for null, sepse gjëra të këqija të ndodhë 484 00:28:50,270 --> 00:28:53,200 kur akrep juaj është NULL, sepse ju mund të përfundojnë duke shkuar atje, 485 00:28:53,200 --> 00:28:57,630 dhe ju kurrë nuk duhet të shkojnë në NULL duke dereferencing atë me operatorin yll. 486 00:28:57,630 --> 00:29:01,050 Pra, kjo është e mirë. Dhe çfarë tjetër po bëjmë? Logjikisht, ka një krisje edhe këtu. 487 00:29:01,050 --> 00:29:04,450 [Studenti] Kontrolloni nëse argc është> = tek 2. 488 00:29:04,450 --> 00:29:10,550 Pra kontrolloni nëse argc është> = 2. Mirë, kështu që nuk ka tre mete në këtë program këtu. 489 00:29:10,550 --> 00:29:16,630 Ne jemi tani duke kontrolluar nëse përdoruesi shtypur në të vërtetë në çdo gjë në argv [1]. Mirë. 490 00:29:16,630 --> 00:29:20,950 Pra, çfarë është bug tretë? Po. >> [Student] C nuk mund të jetë mjaft e madhe. 491 00:29:20,950 --> 00:29:23,320 Mirë. Ne kontrolluar një skenar. 492 00:29:23,320 --> 00:29:29,520 Ne kontrolluar në mënyrë implicite mos kopjoni memorie më shumë se do të kalojë gjatësinë e bar. 493 00:29:29,520 --> 00:29:32,510 Pra, nëse vargu përdoruesi është shtypur në 10 karaktere të gjatë, 494 00:29:32,510 --> 00:29:36,020 kjo është thënë vetëm kopje 10 karaktere. Dhe kjo është në rregull. 495 00:29:36,020 --> 00:29:39,940 Por çfarë ndodh nëse përdoruesi typed në një fjalë në të shpejtë si një fjalë 20-karakter? 496 00:29:39,940 --> 00:29:44,900 Kjo është thënë kopje 20 karaktere nga bar në çfarë? 497 00:29:44,900 --> 00:29:49,750 C, i njohur ndryshe si tampon tonë, që do të thotë që ju vetëm shkroi dhënat 498 00:29:49,750 --> 00:29:52,540 në 8 vende bajt se ju nuk bëni vet, 499 00:29:52,540 --> 00:29:54,870 dhe ju nuk bëni vet ato në kuptimin që ju kurrë nuk alokuar ato. 500 00:29:54,870 --> 00:30:00,370 Pra, kjo është ajo që është e njohur përgjithësisht si sulm del nga shtrati tampon apo muar tampon sulm. 501 00:30:00,370 --> 00:30:05,580 Dhe kjo është një sulm në kuptimin që nëse përdoruesi ose program që flet funksionin tuaj 502 00:30:05,580 --> 00:30:10,490 është duke bërë këtë me keqdashje, se çfarë ndodh në të vërtetë tjetër në fakt mund të jetë mjaft e keqe. 503 00:30:10,490 --> 00:30:12,450 >> Pra, le të marrin një sy në këtë foto këtu. 504 00:30:12,450 --> 00:30:16,060 Kjo foto paraqet turrë tuaj të kujtesës. 505 00:30:16,060 --> 00:30:19,580 Kujtojnë se çdo herë që të thërrasë një funksion që ju të merrni këtë kornizë të vogël në rafte 506 00:30:19,580 --> 00:30:21,520 dhe pastaj një tjetër dhe pastaj një tjetër dhe një tjetër. 507 00:30:21,520 --> 00:30:24,300 Dhe deri tani, ne kemi vetëm lloji i përhumbur këto si rectangles 508 00:30:24,300 --> 00:30:26,290 ose në dërrasë ose në ekran këtu. 509 00:30:26,290 --> 00:30:30,580 Por nëse ne zoom në në një nga ato rectangles, kur ju e quani një foo funksion, 510 00:30:30,580 --> 00:30:35,880 ajo rezulton se ka më shumë në brendësi të rafte atë kornizë në atë drejtkëndësh 511 00:30:35,880 --> 00:30:40,060 se vetëm x dhe y dhe a dhe b, si ne nuk flasim për shkëmbim. 512 00:30:40,060 --> 00:30:44,410 Ajo rezulton se ka disa detaje të nivelit të ulët, në mesin e tyre Adresa Kthim. 513 00:30:44,410 --> 00:30:49,550 Pra, ajo rezulton, kur e quan foo kryesore, kryesore duhet të informojë foo 514 00:30:49,550 --> 00:30:53,520 ajo adresa kryesor është në kujtesën e kompjuterit 515 00:30:53,520 --> 00:30:57,770 sepse përndryshe, sa më shpejt që foo është bërë ekzekutimin, si në këtë rast këtu, 516 00:30:57,770 --> 00:31:00,830 pasi të keni arritur këtë mbajtëse mbyllur kaçurrel në fund të foo, 517 00:31:00,830 --> 00:31:05,310 si dreq nuk e di se ku foo kontrolli i programit është menduar për të shkuar? 518 00:31:05,310 --> 00:31:08,970 Ajo rezulton se përgjigja e kësaj pyetje është në këtë drejtkëndësh të kuqe këtu. 519 00:31:08,970 --> 00:31:12,670 Kjo paraqet një tregues, dhe kjo është deri në kompjuter për të ruajtur përkohësisht 520 00:31:12,670 --> 00:31:17,030 në rafte ashtuquajturës adresën e kryesore në mënyrë që sa më shpejt foo është bërë ekzekutimin, 521 00:31:17,030 --> 00:31:21,120 kompjuteri e di se ku dhe çfarë vijë në kryesore për të shkuar mbrapa për të. 522 00:31:21,120 --> 00:31:23,940 Akrep ruajtur Frame lidhet në mënyrë të ngjashme me këtë. 523 00:31:23,940 --> 00:31:26,310 Bar char * ketu përfaqëson çfarë? 524 00:31:26,310 --> 00:31:31,350 Tani ky segment blu këtu është kornizë foo-së. Çfarë është bar? 525 00:31:31,570 --> 00:31:35,010 Bar është vetëm argumenti në funksion foo. 526 00:31:35,010 --> 00:31:37,500 Deri tani ne jemi kthyer në lloj foto njohur. 527 00:31:37,500 --> 00:31:39,850 Ka gjëra shumë dhe distractions më shumë në ekran, 528 00:31:39,850 --> 00:31:43,380 por ky segment të lehta blu vetëm është ajo që ne kemi qenë duke u bazuar në dërrasë 529 00:31:43,380 --> 00:31:45,790 për diçka si shkëmbim. Kjo është kornizë për foo. 530 00:31:45,790 --> 00:31:51,490 Dhe e vetmja gjë në të drejtë tani është bar, e cila është ky parametër. 531 00:31:51,490 --> 00:31:55,220 Por çfarë tjetër duhet të jetë në rafte në përputhje me këtë kod këtu? 532 00:31:55,220 --> 00:31:57,760 [Student] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Ne gjithashtu duhet të shohim 12 sheshet e kujtesës ndarë në një ndryshore të quajtur c, 534 00:32:02,810 --> 00:32:04,970 dhe në të vërtetë ne nuk kemi se në ekran. 535 00:32:04,970 --> 00:32:08,480 Shumë të lartë nuk është c [0], dhe pastaj autori i këtij diagram 536 00:32:08,480 --> 00:32:11,850 nuk bother duke tërhequr të gjithë sheshet, por ka të vërtetë nuk ka 12 537 00:32:11,850 --> 00:32:16,590 sepse në qoftë se ju shikoni në fund të drejtën, c [11] në qoftë se ju numërimin nga 0 është bajt 12 të tilla. 538 00:32:16,590 --> 00:32:18,400 Por këtu është problemi. 539 00:32:18,400 --> 00:32:22,390 Në cilin drejtim po c rritje? 540 00:32:22,390 --> 00:32:27,080 Lloj i lartë poshtë në qoftë se ajo fillon në krye dhe rritet deri në fund. 541 00:32:27,080 --> 00:32:30,110 Ajo nuk duket si ne e kemi lënë veten pistë shumë këtu në të gjitha. 542 00:32:30,110 --> 00:32:32,090 Ne kemi lloj të pikturuar veten në një cep, 543 00:32:32,090 --> 00:32:36,940 dhe se c [11] është e drejtë kundër bar, e cila është e drejtë kundër treguesin Frame Saved, 544 00:32:36,940 --> 00:32:39,960 që është e drejtë kundër Adresa e kthimit. Nuk ka vend më shumë. 545 00:32:39,960 --> 00:32:42,810 Pra, çfarë është implikimi atëherë nëse ju vidhos deri 546 00:32:42,810 --> 00:32:46,500 dhe ju provoni lexuar 20 bytes në një tampon 12-byte? 547 00:32:46,500 --> 00:32:50,060 Ku janë ato 8 bytes shtesë do të shkojnë? >> [Student] Brenda - 548 00:32:50,060 --> 00:32:53,200 Brenda çdo gjë tjetër, disa prej të cilave është super i rëndësishëm. 549 00:32:53,200 --> 00:32:57,260 Dhe gjëja më e rëndësishme, potencialisht, është kutia e kuqe atje, Adresa Kthehu, 550 00:32:57,260 --> 00:33:03,560 sepse mendoj se ju ose rastësisht ose adversarially prishësh ato 4 byte, 551 00:33:03,560 --> 00:33:07,260 se adresa pointer, jo vetëm me mbeturina, por me një numër 552 00:33:07,260 --> 00:33:09,810 që ndodh për të përfaqësuar një adresë aktual në kujtesë. 553 00:33:09,810 --> 00:33:13,880 Çfarë është implikimi, logjikisht? >> [Student] Funksioni do të kthehet në një vend tjetër. 554 00:33:13,880 --> 00:33:15,250 Saktësisht. 555 00:33:15,250 --> 00:33:19,170 Kur kthehet foo dhe hits qe mbajtëse kaçurrel, programi do të vazhdojë 556 00:33:19,170 --> 00:33:25,060 të mos kthehen në kryesore, ajo do të kthehet në çdo gjë që adresa është në atë kuti të kuqe. 557 00:33:25,060 --> 00:33:28,600 >> Në rastin e regjistrimit software anashkaluar, 558 00:33:28,600 --> 00:33:32,260 çka nëse adresa që është duke u kthyer në është funksion që normalisht merr quajtur 559 00:33:32,260 --> 00:33:35,690 pasi ju keni paguar për software dhe futur kodin e regjistrimit? 560 00:33:35,690 --> 00:33:39,870 Ju mund të lloj mashtrim e kompjuterit në mos shkuar këtu, por në vend që të shkojnë deri këtu. 561 00:33:39,870 --> 00:33:45,100 Ose në qoftë se jeni të vërtetë i zgjuar, një kundërshtar në fakt mund të shkruani në tastierë, për shembull, 562 00:33:45,100 --> 00:33:50,690 nuk është një fjalë e vërtetë, jo 20 karaktere, por mendoj se ai ose ajo në fakt në lloje 563 00:33:50,690 --> 00:33:52,770 disa karaktere që përfaqësojnë kodin. 564 00:33:52,770 --> 00:33:55,320 Dhe kjo nuk do të jetë kodi C, ajo është në të vërtetë do të jenë karaktere 565 00:33:55,320 --> 00:33:59,290 që përfaqësojnë kodin binar makine, 0s dhe 1s. 566 00:33:59,290 --> 00:34:01,290 Por mendoj se ata janë të zgjuar të mjaftueshme për të bërë këtë, 567 00:34:01,290 --> 00:34:06,500 në një farë mënyre ngjitur në diçka getString shpejtë që është hartuar kodi në thelb, 568 00:34:06,500 --> 00:34:09,980 dhe e fundit 4 bytes prishësh atë adresë të kthimit. 569 00:34:09,980 --> 00:34:13,360 Dhe çfarë bën që adresa input bëni? 570 00:34:13,360 --> 00:34:18,630 Ajo në fakt ruan në këtë drejtkëndësh të kuq adresën e bajt parë të tampon. 571 00:34:18,630 --> 00:34:23,070 Kështu që ju duhet të jetë me të vërtetë i zgjuar, dhe kjo është një shumë e gjykimit dhe gabim për njerëzit të këqija nga atje, 572 00:34:23,070 --> 00:34:25,639 por në qoftë se ju mund të kuptoj se sa e madhe kjo tampon është 573 00:34:25,639 --> 00:34:28,820 të tilla që bytes fundit në kontributin që japin për programin 574 00:34:28,820 --> 00:34:33,540 ndodhë që të jetë e barabartë me adresën e fillimit të tampon tuaj, ju mund ta bëni këtë. 575 00:34:33,540 --> 00:34:39,320 Nëse themi normalisht Përshëndetje dhe \ 0, kjo është ajo që përfundon deri në tampon. 576 00:34:39,320 --> 00:34:44,420 Por në qoftë se ne jemi më të zgjuar dhe ne buffer mbushur atë me atë që ne do të thërrasë përgjithësi kodin sulm - 577 00:34:44,420 --> 00:34:48,860 AAA,, sulm sulm, sulm - ku kjo është vetëm diçka që e bën diçka të keqe, 578 00:34:48,860 --> 00:34:51,820 çfarë ndodh në qoftë se ju jeni me të vërtetë i zgjuar, ju mund të bëni këtë. 579 00:34:51,820 --> 00:34:58,610 Në kutinë e kuqe këtu është një sekuencë të numrave - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Vini re se kjo përputhet me numrin që është deri këtu. 581 00:35:01,610 --> 00:35:04,430 Kjo është në mënyrë të kundërt, por më shumë në atë kohë tjetër. 582 00:35:04,430 --> 00:35:08,140 Vini re se kjo adresë kthimi është ndryshuar qëllimisht 583 00:35:08,140 --> 00:35:12,020 të barabartë adresën e deri këtu, jo adresa e kryesor. 584 00:35:12,020 --> 00:35:17,500 Pra, nëse djalë i keq është super i zgjuar, ai ose ajo do të përfshijë në këtë kod sulm 585 00:35:17,500 --> 00:35:20,930 diçka si të fshirë të gjitha dosjet e përdoruesit ose kopje fjalëkalimet 586 00:35:20,930 --> 00:35:24,680 ose krijoni një llogari përdoruesi që unë pastaj mund të hyni në të - asgjë në të gjitha. 587 00:35:24,680 --> 00:35:26,950 >> Dhe kjo është edhe rreziku dhe fuqia e C. 588 00:35:26,950 --> 00:35:29,840 Sepse ju keni qasje në kujtesë nëpërmjet pointers 589 00:35:29,840 --> 00:35:32,520 dhe ju mund të shkruani për këtë arsye çdo gjë që ju dëshironi në kujtesë të kompjuterit, 590 00:35:32,520 --> 00:35:35,080 ju mund të bëni një kompjuter të bëjë ndonjë gjë që ju dëshironi 591 00:35:35,080 --> 00:35:39,550 thjesht nga që ajo të hidhen rreth brenda hapësirës së vet kujtesës. 592 00:35:39,550 --> 00:35:44,650 Dhe kështu në këtë ditë kaq shumë programe dhe faqet e internetit kaq shumë që janë të kompromituar 593 00:35:44,650 --> 00:35:46,200 avulloj për njerëzit duke përfituar nga kjo. 594 00:35:46,200 --> 00:35:50,760 Dhe kjo mund të duket si një sulm super të sofistikuar, por kjo nuk ka gjithmonë të fillojë në këtë mënyrë. 595 00:35:50,760 --> 00:35:53,560 Realiteti është se ajo që njerëzit zakonisht e këqija do të bëni është, 596 00:35:53,560 --> 00:35:58,200 nëse kjo është një program në një command line ose një program GUI ose një faqe interneti, 597 00:35:58,200 --> 00:35:59,940 ju vetëm të fillojë ofrimin e pakuptimta. 598 00:35:59,940 --> 00:36:03,980 Ju shkruani një fjalë të vërtetë të madhe në fushën e kërkimit dhe hit Enter, 599 00:36:03,980 --> 00:36:05,780 dhe ju presin të shohin nëse internetit Rrëzohet 600 00:36:05,780 --> 00:36:09,990 ose ju të presim për të parë nëse programi manifeston disa mesazh gabimi 601 00:36:09,990 --> 00:36:14,330 sepse në qoftë se ju merrni me fat si djalë i keq dhe ju japin disa të dhëna çmendur 602 00:36:14,330 --> 00:36:18,980 se crashes programin, që do të thotë programues nuk parashikojnë sjelljen tuaj të keq, 603 00:36:18,980 --> 00:36:23,630 që do të thotë që ju mund ndoshta me përpjekje të mjaftueshme, gjykim dhe gabimi të mjaftueshme, 604 00:36:23,630 --> 00:36:26,650 kuptoj se si për të zhvilluar një sulm më të saktë. 605 00:36:26,650 --> 00:36:31,410 Pra, sa më shumë që një pjesë e sigurisë nuk është vetëm shmangur këto sulme krejt 606 00:36:31,410 --> 00:36:34,100 por zbulimin e tyre dhe në të vërtetë duke kërkuar në shkrimet 607 00:36:34,100 --> 00:36:36,780 dhe duke parë atë që inputet çmendur të ketë njerëz të shtypur në faqen tuaj te internetit, 608 00:36:36,780 --> 00:36:38,960 çfarë kushte kërkimi njerëzit kanë shtypur në faqen tuaj te internetit 609 00:36:38,960 --> 00:36:42,870 në shpresën e tejmbushur disa tampon. 610 00:36:42,870 --> 00:36:45,500 Dhe kjo të gjitha boils poshtë për bazat e thjeshta të asaj që është një grup 611 00:36:45,500 --> 00:36:49,080 dhe çfarë do të thotë të ndajë dhe të përdorin kujtesën. 612 00:36:49,080 --> 00:36:51,710 >> Lidhur me atë që atëherë shumë është kjo. 613 00:36:51,710 --> 00:36:54,280 Le të shikoj në brendësi të një hard drive përsëri. 614 00:36:54,280 --> 00:36:58,440 Ju kujtohet nga një ose dy javë më parë se kur ju drag fotografi në Recycle Bin tuaj ose plehra mund, 615 00:36:58,440 --> 00:37:03,710 çfarë ndodh? >> [Student] Asgjë. Absolutisht asgjë >>, apo jo? 616 00:37:03,710 --> 00:37:05,740 Përfundimisht, nëse ju drejtuar të ulët në hapësirë ​​në disk, 617 00:37:05,740 --> 00:37:08,190 Windows apo Mac OS do të fillojë grisësh fotografi për ju. 618 00:37:08,190 --> 00:37:10,390 Por në qoftë se ju drag diçka në atje, kjo nuk është aspak e sigurt. 619 00:37:10,390 --> 00:37:13,800 Të gjitha shokun tuaj apo mik apo anëtar i familjes ka të bëni është të klikoni dy herë dhe, voila, 620 00:37:13,800 --> 00:37:16,310 ka të gjitha dosjet që ju të paqarta u përpoqën për të fshirë. 621 00:37:16,310 --> 00:37:19,590 Shumica prej nesh të paktën e di se ju duhet të klikoni me të djathtën apo të Kontrollit klikoni 622 00:37:19,590 --> 00:37:22,310 dhe bosh plehra ose diçka të tillë. 623 00:37:22,310 --> 00:37:25,000 Por edhe atëherë se nuk ka fare të bëjë hile 624 00:37:25,000 --> 00:37:28,010 sepse ajo që ndodh kur ju keni një fotografi në hard drive tuaj 625 00:37:28,010 --> 00:37:32,770 që përfaqëson një dokument Word ose disa JPEG, dhe kjo paraqet hard drive tuaj, 626 00:37:32,770 --> 00:37:35,350 dhe le të thonë se kjo copë here paraqet atë skedar, 627 00:37:35,350 --> 00:37:38,390 dhe është e përbërë nga një bandë e tërë e 0s dhe 1s. 628 00:37:38,390 --> 00:37:42,470 Çfarë ndodh kur nuk jeni vetëm terhiq atë skedar në plehra mund, ose Recycle Bin 629 00:37:42,470 --> 00:37:48,020 por edhe zbrazët atë? Lloj asgjë. 630 00:37:48,020 --> 00:37:49,640 Kjo nuk është asgjë tani. 631 00:37:49,640 --> 00:37:54,290 Tani ajo është vetëm asgjë sepse një diçka pak ndodh në formën e këtij tabelën. 632 00:37:54,290 --> 00:37:58,370 Pra, ka disa lloj të dhënash ose tabelë në brendësi të kujtesës një kompjuter 633 00:37:58,370 --> 00:38:03,850 që në thelb ka një kolonë për dosjet 'emra dhe një kolonë për dosjet' vend, 634 00:38:03,850 --> 00:38:07,720 ku kjo mund të jetë vendndodhja 123, vetëm një numër të rastit. 635 00:38:07,720 --> 00:38:14,560 Pra, ne mund të kemi diçka si x.jpeg dhe lokacioni 123. 636 00:38:14,560 --> 00:38:18,800 Çfarë ndodh atëherë kur ju të vërtetë bosh plehra tuaj? 637 00:38:18,800 --> 00:38:20,330 Që shkon larg. 638 00:38:20,330 --> 00:38:23,610 Por ajo që nuk shkojnë larg, është 0s dhe 1s. 639 00:38:23,610 --> 00:38:26,270 >> Pra, çfarë është atëherë lidhja me pset4? 640 00:38:26,270 --> 00:38:31,240 E pra, me pset4, vetëm për shkak se ne kemi fshirë aksidentalisht kartë kompakt flash 641 00:38:31,240 --> 00:38:35,750 që kishte të gjitha këto foto ose vetëm për shkak se ajo me fat të keq u bë e korruptuar 642 00:38:35,750 --> 00:38:38,000 nuk do të thotë se 0s dhe 1s nuk janë ende atje. 643 00:38:38,000 --> 00:38:40,410 Ndoshta disa prej tyre janë humbur për shkak se diçka u korruptuar 644 00:38:40,410 --> 00:38:43,320 në kuptimin që disa 0s became 1s dhe 0s 1s became. 645 00:38:43,320 --> 00:38:47,240 Gjëra të këqija mund të ndodhë për shkak të programeve buggy apo dëmtuar hardware. 646 00:38:47,240 --> 00:38:50,370 Por shumë prej këtyre bit, ndoshta edhe 100% e tyre, janë ende atje. 647 00:38:50,370 --> 00:38:55,050 Është vetëm se kompjuteri apo kamera nuk e di ku JPEG1 filluar 648 00:38:55,050 --> 00:38:56,910 dhe ku JPEG2 filluar. 649 00:38:56,910 --> 00:39:01,070 Por në qoftë se ju, programues, e di me pak tru ku ato janë jpegs 650 00:39:01,070 --> 00:39:06,010 apo atë që ata të duken si kështu që ju mund të analizuar JPEG 0s dhe 1s dhe thonë, JPEG, 651 00:39:06,010 --> 00:39:09,440 ju mund të shkruani një program me thelb vetëm një për lak ose kur 652 00:39:09,440 --> 00:39:12,820 që rimëkëmbet çdo një prej këtyre dosjeve. 653 00:39:12,820 --> 00:39:16,030 Pra, mësimi është, pra, për të filluar sigurt fshirja dosjet tuaja 654 00:39:16,030 --> 00:39:18,340 në qoftë se ju dëshironi të shmangur këtë krejt. Po. 655 00:39:18,340 --> 00:39:21,010 >> [Student] Si të vijë ajo thotë se në kompjuterin tuaj 656 00:39:21,010 --> 00:39:23,550 që ju kanë kujtesë më shumë se ju bëri para? 657 00:39:23,550 --> 00:39:27,820 Kanë kujtesë më shumë se ju bëri para - >> [Student] memorie më në dispozicion. 658 00:39:27,820 --> 00:39:29,630 Oh. Mirë pyetje. 659 00:39:29,630 --> 00:39:32,360 Pra, pse pastaj pas zbrazjes plehra ka kompjuteri juaj të ju them 660 00:39:32,360 --> 00:39:34,910 se ju keni më shumë hapësirë ​​të lirë se ju e bëri më parë? 661 00:39:34,910 --> 00:39:36,770 Në pak fjalë, sepse kjo është gënjyer. 662 00:39:36,770 --> 00:39:40,740 Më teknikisht, ju keni më shumë hapësirë, sepse tani ju keni thënë 663 00:39:40,740 --> 00:39:43,680 ju mund të vendosni gjëra të tjera se ku dikur ishte fotografinë. 664 00:39:43,680 --> 00:39:45,450 Por kjo nuk do të thotë se BITS janë duke shkuar larg, 665 00:39:45,450 --> 00:39:48,590 dhe se nuk do të thotë se janë duke u ndryshuar bit të gjitha 0s, për shembull, 666 00:39:48,590 --> 00:39:50,150 për mbrojtjen tuaj. 667 00:39:50,150 --> 00:39:54,640 Pra, nga ana tjetër, në qoftë se ju të sigurt fshihet fotografi apo fizikisht shkatërruar pajisjen, 668 00:39:54,640 --> 00:39:57,300 që me të vërtetë është e vetmja mënyrë rreth se ndonjëherë. 669 00:39:57,300 --> 00:40:02,020 >> Pra, pse nuk kemi lënë në këtë shënim të gjysmë-të frikshme, dhe ne do të shohim ju në hënën. 670 00:40:02,020 --> 00:40:07,000 [Duartrokitje] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]