1 00:00:00,000 --> 00:00:03,381 >> [Гуляе музыка] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [Прайграванне відэа] 4 00:00:11,610 --> 00:00:13,640 >> -Ён Хлусіць. 5 00:00:13,640 --> 00:00:14,380 >> -О Чым? 6 00:00:14,380 --> 00:00:17,182 >> -Не ведаю. 7 00:00:17,182 --> 00:00:19,990 >> -Так Што мы ведаем? 8 00:00:19,990 --> 00:00:23,145 >> -Гэта У 9:15, Рэй Сантойя быў у банкамаце. 9 00:00:23,145 --> 00:00:23,644 -Так. 10 00:00:23,644 --> 00:00:27,030 Такім чынам, пытанне, што ён робіць у 09:16? 11 00:00:27,030 --> 00:00:29,720 >> -Съемки 9-міліметровага на нешта. 12 00:00:29,720 --> 00:00:31,540 Можа быць, ён убачыў снайпера. 13 00:00:31,540 --> 00:00:33,412 >> Ужо ці не разагнаўся Працаваў з ім. 14 00:00:33,412 --> 00:00:34,340 >> Пачакай. 15 00:00:34,340 --> 00:00:36,200 Зварот на адзін. 16 00:00:36,200 --> 00:00:36,975 >> -Што Ты бачыш? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Яго тварам уверх поўным экране. 19 00:00:47,805 --> 00:00:48,680 >> -яго Ачкі. 20 00:00:48,680 --> 00:00:50,060 >> -Ёсць Гэта адлюстраванне. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Гэта Бейсбольнай каманды Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Гэта іх лагатып. 24 00:01:03,110 --> 00:01:05,820 >> -А Ён размаўляе з хто носіць гэтую куртку. 25 00:01:05,820 --> 00:01:06,670 >> [КАНЕЦ ПРАГЛЯДУ] 26 00:01:06,670 --> 00:01:07,628 >> Дэвід малая: Добра. 27 00:01:07,628 --> 00:01:11,210 Гэта CS50 і гэта трохі больш з [неразборліва], з якой вы 28 00:01:11,210 --> 00:01:12,890 ўмешваюцца з праблемай ўсталяваць чатыры. 29 00:01:12,890 --> 00:01:16,606 Сёння мы пачынаем выглядаць трохі больш глыбока ў гэтых рэчах, званых паказальнікаў, 30 00:01:16,606 --> 00:01:18,480 які, хоць гэта даволі таямніцай тэма, 31 00:01:18,480 --> 00:01:20,813 Аказваецца, што ён збіраецца быць сродкам, з дапамогай якога мы 32 00:01:20,813 --> 00:01:24,320 можа пачаць будаўніцтва і мантаж значна больш складаныя праграмы. 33 00:01:24,320 --> 00:01:28,150 Але мы зрабілі гэта ў апошнюю сераду пасродкам некаторага claymation першай. 34 00:01:28,150 --> 00:01:30,190 Так што гэта, нагадаем, з'яўляецца Бинки, і мы выкарыстоўвалі яго 35 00:01:30,190 --> 00:01:33,148 каб зірнуць на праграму, якая ня сапраўды што-небудзь цікавае, 36 00:01:33,148 --> 00:01:34,950 але ён раскрыць некалькі праблем. 37 00:01:34,950 --> 00:01:38,570 Такім чынам, каб пачаць сёння, чаму мы не хадзіць хутка праз некалькі з гэтых крокаў, 38 00:01:38,570 --> 00:01:41,920 паспрабуйце, каб адагнаць ва ўмовах чалавечы ў менавіта тое, што тут адбываецца 39 00:01:41,920 --> 00:01:45,410 і чаму гэта дрэнна, а затым перайсці на а на самай справе пачаць будаваць нешта 40 00:01:45,410 --> 00:01:46,309 з гэтай тэхнікай? 41 00:01:46,309 --> 00:01:48,350 Так што гэта былі першы дзве лініі гэтай праграмы 42 00:01:48,350 --> 00:01:51,340 і з пункту гледжання непрафесіяналы, тое, што якія гэтыя дзве лініі робяць? 43 00:01:51,340 --> 00:01:55,600 Хтосьці, хто досыць камфортна з тым, што заявіў на экране? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Якія гэтыя дзве лініі робяць? 46 00:02:00,120 --> 00:02:02,070 Гэта не ўсё, што адрозніваецца ад тыдня адзін, 47 00:02:02,070 --> 00:02:03,611 але ёсць некаторыя новыя спецыяльныя сімвалы. 48 00:02:03,611 --> 00:02:04,152 Да? 49 00:02:04,152 --> 00:02:05,628 Вярнуцца там. 50 00:02:05,628 --> 00:02:07,092 >> АЎДЫТОРЫЯ: Аб'ява паказальнікі? 51 00:02:07,092 --> 00:02:08,050 Дэвід малая: раз сказаць? 52 00:02:08,050 --> 00:02:08,860 АЎДЫТОРЫЯ: Аб'ява паказальнікі? 53 00:02:08,860 --> 00:02:11,776 Дэвід малая: Аб'ява паказальнікі і давайце ўдакладніць яго крыху больш. 54 00:02:11,776 --> 00:02:14,050 АЎДЫТОРЫЯ: [неразборліва] адрас, а затым х у. 55 00:02:14,050 --> 00:02:15,300 Дэвід малая: А потым звярнуцца. 56 00:02:15,300 --> 00:02:18,550 Так што канкрэтна мы робім што мы аб'яўляем дзве зменныя. 57 00:02:18,550 --> 00:02:21,252 Гэтыя зменныя, хоць, збіраюцца да тыпу INT зоркі, 58 00:02:21,252 --> 00:02:23,210 больш канкрэтна азначае яны збіраюцца захоўваць 59 00:02:23,210 --> 00:02:26,450 адрас з Int, адпаведна, х і у. 60 00:02:26,450 --> 00:02:27,660 Зараз ёсць якія-небудзь каштоўнасці? 61 00:02:27,660 --> 00:02:32,621 Ці ёсць нейкія фактычны адрасы ў іх дзве зменныя ў дадзены момант? 62 00:02:32,621 --> 00:02:33,120 Няма. 63 00:02:33,120 --> 00:02:35,030 Гэта проста так называецца значэння смецця. 64 00:02:35,030 --> 00:02:38,120 Калі вы на самой справе не прызначаць Пераменная, усё, што было ў памяці 65 00:02:38,120 --> 00:02:42,224 раней збіраецца запоўніць нулямі і тыя, абодва з гэтых зменных. 66 00:02:42,224 --> 00:02:44,140 Але мы яшчэ не ведаем, якія яны ёсць, і гэта 67 00:02:44,140 --> 00:02:47,060 будзе ключом да чаму Binky страціў галаву на мінулым тыдні. 68 00:02:47,060 --> 00:02:49,980 >> Так што гэта быў claymation Ўвасабленне гэтага 69 00:02:49,980 --> 00:02:53,580 у выніку чаго ў вас ёсць толькі дзве зменныя, маленькія кругавыя часткі гліны, 70 00:02:53,580 --> 00:02:57,330 які можа захоўваць зменныя, але, як абгорнутых стрэлкі прапанаваць, 71 00:02:57,330 --> 00:03:00,640 яны на самой справе не паказваючы у любую кропку па сабе вядомыя. 72 00:03:00,640 --> 00:03:03,670 Такім чынам, мы мелі гэтую лінію, і гэта была новай на мінулым тыдні, Таноса на памяць 73 00:03:03,670 --> 00:03:07,130 размеркаванне, які з'яўляецца толькі мудрагелісты спосаб распавядаць аперацыйную сістэму Linux, 74 00:03:07,130 --> 00:03:09,750 або Mac OS або Windows, Цэнтр эй, дайце мне памяць, 75 00:03:09,750 --> 00:03:11,780 і ўсё, што вы павінны сказаць аперацыйная сістэма 76 00:03:11,780 --> 00:03:14,699 гэта тое, што, калі яго просяць на памяць. 77 00:03:14,699 --> 00:03:16,990 Гэта не збіраецца клапаціцца, што Вы збіраецеся з ім рабіць, 78 00:03:16,990 --> 00:03:19,786 але вы павінны сказаць аперацыйнай Сістэма, што шляхам Таноса. 79 00:03:19,786 --> 00:03:20,286 Да? 80 00:03:20,286 --> 00:03:21,078 >> АЎДЫТОРЫЯ: Колькі? 81 00:03:21,078 --> 00:03:21,994 Дэвід малая: Колькі? 82 00:03:21,994 --> 00:03:25,280 Наколькі ў байтах, а гэта так, то, зноў жа, надуманы прыклад, проста кажучы, 83 00:03:25,280 --> 00:03:27,360 даць мне памер у міжнар. 84 00:03:27,360 --> 00:03:30,550 Цяпер, памерам з Int чатыры байта ці 32 біта. 85 00:03:30,550 --> 00:03:32,850 Так што гэта проста спосаб кажучы, эй, аперацыйная сістэма, 86 00:03:32,850 --> 00:03:37,290 дайце мне чатыры байта памяці што я магу выкарыстоўваць у маім распараджэнні, 87 00:03:37,290 --> 00:03:40,560 і, у прыватнасці, тое, што робіць Таноса вяртанне па 88 00:03:40,560 --> 00:03:41,795 у гэтым фрагменце з чатырох байтаў? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 АЎДЫТОРЫЯ: Адрас? 91 00:03:44,860 --> 00:03:45,901 Дэвід малая: Адрас. 92 00:03:45,901 --> 00:03:47,580 Адрас гэтай порцыі з чатырох байтаў. 93 00:03:47,580 --> 00:03:48,190 Дакладна. 94 00:03:48,190 --> 00:03:51,430 І вось што ў канчатковым рахунку захоўваецца х, і таму мы сапраўды ня 95 00:03:51,430 --> 00:03:55,240 ўсё роўна, што колькасць, што адрас, няхай гэта будзе OX1 ці OX2 96 00:03:55,240 --> 00:03:57,110 ці некаторыя загадкавыя адрас шаснаццатковай. 97 00:03:57,110 --> 00:03:59,850 Мы проста клапоцімся графічна што пераменная х цяпер 98 00:03:59,850 --> 00:04:01,630 паказваючы на ​​тое кавалак памяці. 99 00:04:01,630 --> 00:04:05,570 Такім чынам, стрэлка ўяўляе сабой паказальнік або Больш канкрэтна, адрас памяці. 100 00:04:05,570 --> 00:04:09,120 Але, зноў жа, мы звычайна не клапоцяцца што гэтыя фактычныя адрасы. 101 00:04:09,120 --> 00:04:11,780 Цяпер, кажа, што гэта лінія тое, што з пункту гледжання непрафесіяналы? 102 00:04:11,780 --> 00:04:14,330 Зорка х атрымлівае 42 з коскі. 103 00:04:14,330 --> 00:04:17,390 Што гэта значыць? 104 00:04:17,390 --> 00:04:18,200 Ты хочаш пайсці? 105 00:04:18,200 --> 00:04:20,102 Не падрапаць вашу шыю. 106 00:04:20,102 --> 00:04:22,360 >> Аўдыторыя: адрас х знаходзіцца ў 42. 107 00:04:22,360 --> 00:04:24,300 >> Дэвід малая: Адрас х знаходзіцца ў 42. 108 00:04:24,300 --> 00:04:25,190 Не зусім. 109 00:04:25,190 --> 00:04:28,485 Так блізка, але не зусім, таму што ёсць зорка, якая, папярэднічаючы гэты х. 110 00:04:28,485 --> 00:04:29,860 Такім чынам, мы павінны наладзіць няшмат. 111 00:04:29,860 --> 00:04:31,032 Да? 112 00:04:31,032 --> 00:04:36,044 >> АЎДЫТОРЫЯ: Значэнне, якое Паказальнік х паказваючы на ​​гэта 42. 113 00:04:36,044 --> 00:04:36,710 Дэвід малая: ОК. 114 00:04:36,710 --> 00:04:40,840 Значэнне, паказальнік х паказваючы на, скажам, будзе 42, 115 00:04:40,840 --> 00:04:44,165 або іншымі словамі, зоркі х кажа, перайдзіце да любой адрас 116 00:04:44,165 --> 00:04:48,340 у х, няхай гэта будзе 1 Оксфард Вуліца або 33 Оксфард-стрыт 117 00:04:48,340 --> 00:04:51,850 або OX1 ці ox33, незалежна што лікавае адрас, 118 00:04:51,850 --> 00:04:54,380 зоркавы х з'яўляецца разнаймення х. 119 00:04:54,380 --> 00:04:57,297 Так што па гэтым адрасе і Затым пакласці туды лік 42. 120 00:04:57,297 --> 00:04:59,380 Так што было б Эквівалентны спосаб сказаць, што. 121 00:04:59,380 --> 00:05:01,860 Так што ўсё нармальна, а затым мы будзе прадстаўляць карціну 122 00:05:01,860 --> 00:05:05,370 наступным, дзе мы дадалі 42 да гэтага кавалак чатырох 123 00:05:05,370 --> 00:05:09,370 байты на правай баку, але Гэтая лінія была, дзе ўсё пайшло наперакасяк 124 00:05:09,370 --> 00:05:11,120 і кіраўнік Бинки выскачыў ад ў гэтай кропцы, 125 00:05:11,120 --> 00:05:15,290 таму што дрэнныя рэчы здараюцца, калі Вы разнаймення значэння для смецця 126 00:05:15,290 --> 00:05:18,210 ці вы разнаймення несапраўдным паказальнікі, і я кажу несапраўдным 127 00:05:18,210 --> 00:05:21,020 таму што ў дадзены момант у гісторыя, тое, што знаходзіцца ўнутры ў? 128 00:05:21,020 --> 00:05:24,440 Што значэнне у на аснове на апошнія некалькі крокаў? 129 00:05:24,440 --> 00:05:25,360 Да? 130 00:05:25,360 --> 00:05:26,115 Што гэта? 131 00:05:26,115 --> 00:05:26,990 >> АЎДЫТОРЫЯ: адрас. 132 00:05:26,990 --> 00:05:28,460 Дэвід малая: адрас. 133 00:05:28,460 --> 00:05:31,910 Гэта павінен быць адрас але я яе ініцыялізацыі? 134 00:05:31,910 --> 00:05:32,800 Так што ў мяне яшчэ няма. 135 00:05:32,800 --> 00:05:35,430 Так што, як вядома, там? 136 00:05:35,430 --> 00:05:37,590 Гэта проста некаторы значэнне смецця. 137 00:05:37,590 --> 00:05:41,500 Гэта можа быць любы адрас ад нуля да 2 млрд, калі ў вас ёсць два гігабайтамі аператыўнай памяці, 138 00:05:41,500 --> 00:05:44,289 або ад нуля да 4 млрд калі ў Вас ёсць атрымаў чатыры гігабайта аператыўнай памяці. 139 00:05:44,289 --> 00:05:46,080 Гэта некаторы значэнне смецця, але праблема ў тым, 140 00:05:46,080 --> 00:05:48,200 што ў аперацыйнай сістэме, калі ён не даў вам 141 00:05:48,200 --> 00:05:51,140 што частка памяці спецыяльна што вы спрабуеце ісці, 142 00:05:51,140 --> 00:05:54,650 гэта наогул будзе выклікаць што мы бачылі, як памылкі сегментацыі. 143 00:05:54,650 --> 00:05:57,810 Такім чынам, на самай справе, любы з вас, хто змагаўся на праблемы ў працоўны час 144 00:05:57,810 --> 00:06:00,393 або ў праблемах, якія больш як правіла, у спробе высветліць, 145 00:06:00,393 --> 00:06:02,150 памылкі сегментацыі, што звычайна азначае, 146 00:06:02,150 --> 00:06:05,017 ты датыкаешся сегмент памяці, што вы не павінны быць. 147 00:06:05,017 --> 00:06:07,350 Вы дакранаючыся памяці, аперацыйная сістэма не мае 148 00:06:07,350 --> 00:06:10,450 дазволіў вам дакрануцца, няхай гэта будзе па заходзіць занадта далёка ў вашым масіве 149 00:06:10,450 --> 00:06:12,870 ці пачынаючы з сённяшняга дня, будзь гэта таму, што ты датыкаешся 150 00:06:12,870 --> 00:06:14,780 памяці, проста некаторы значэнне смецця. 151 00:06:14,780 --> 00:06:18,230 >> Так робяць зоркі х тут накшталт нявызначанага паводзін. 152 00:06:18,230 --> 00:06:22,030 Вы ніколі не павінны рабіць гэта, таму што шанцы якія, праграма проста будзе крах, 153 00:06:22,030 --> 00:06:24,050 таму што вы кажаце, перайсці на гэты адрас 154 00:06:24,050 --> 00:06:27,000 і вы паняцця не маю, дзе што адрас на самай справе. 155 00:06:27,000 --> 00:06:30,300 Такім чынам, аперацыйная сістэма, хутчэй за ўсё, збіраецца да краху праграмы 156 00:06:30,300 --> 00:06:33,840 у выніку і на самай справе, што гэта што там адбылося на Бинки. 157 00:06:33,840 --> 00:06:37,210 Так у канчатковым рахунку, Бинки фіксаванай гэтая праблема з гэтым. 158 00:06:37,210 --> 00:06:38,909 Так гэтай праграмы сам быў сапсаваны. 159 00:06:38,909 --> 00:06:41,450 Але калі вы як бы прасоўвацца наперад і выканаць гэты радок замест 160 00:06:41,450 --> 00:06:45,580 у роўны х проста азначае тое, што адрас з'яўляецца х, таксама пакласці яго ў у. 161 00:06:45,580 --> 00:06:48,740 >> І так наглядна, мы прадстаўлены ў гэтым з двума стрэлкамі 162 00:06:48,740 --> 00:06:51,570 ад х і ад у паказваючы у тое ж месца. 163 00:06:51,570 --> 00:06:55,760 Так семантычна, х роўны каб у таму што абодва з іх 164 00:06:55,760 --> 00:07:00,300 захоўваеце той жа адрас, такім чынам, паказваючы на ​​42, 165 00:07:00,300 --> 00:07:04,910 і цяпер, калі вы кажаце, зоркі у, перайсці па адрасе ў к, 166 00:07:04,910 --> 00:07:06,790 гэта мае цікавы пабочны эфект. 167 00:07:06,790 --> 00:07:10,320 Такім чынам, адрас у ў з'яўляецца Тое ж самае, як адрас у х. 168 00:07:10,320 --> 00:07:15,060 Так што, калі вы кажаце, ісці па адрасе у у і зменіце значэнне на 13, 169 00:07:15,060 --> 00:07:17,140 хто яшчэ ўплывае? 170 00:07:17,140 --> 00:07:21,100 Х, кропка D, так бы мовіць, павінны быць закрануты таксама. 171 00:07:21,100 --> 00:07:24,340 >> І на самай справе, як Нік звярнуў гэтую карціну у claymation менавіта гэта. 172 00:07:24,340 --> 00:07:28,665 Нават калі мы будзем прытрымлівацца паказальнік у, мы апынуліся ў тым жа месцы, 173 00:07:28,665 --> 00:07:32,780 і таму, калі мы павінны былі раздрукаваць з х ці pointee Y, у 174 00:07:32,780 --> 00:07:35,720 то мы ўбачылі б значэнне 13. 175 00:07:35,720 --> 00:07:37,927 Зараз, я кажу pointee быць у адпаведнасці з відэа. 176 00:07:37,927 --> 00:07:39,760 Праграмісты, на мой веданне, на самай справе ніколі не 177 00:07:39,760 --> 00:07:42,460 кажуць слова pointee, што з'яўляецца вострым 178 00:07:42,460 --> 00:07:44,650 у, але для паслядоўнасці з відэа, разумеюць, 179 00:07:44,650 --> 00:07:47,520 гэта ўсё, што было азначала ў такой сітуацыі. 180 00:07:47,520 --> 00:07:54,190 Дык якія-небудзь пытанні па claymation або паказальнікі або Таноса толькі пакуль? 181 00:07:54,190 --> 00:07:54,850 Няма? 182 00:07:54,850 --> 00:07:55,470 Добра. 183 00:07:55,470 --> 00:07:58,560 >> Так што без далейшага шуму, давайце зірнем 184 00:07:58,560 --> 00:08:00,700 у якім гэта мае на самай справе былі выкарыстаныя на працягу некаторага часу. 185 00:08:00,700 --> 00:08:03,580 Такім чынам, мы мелі гэтую бібліятэку CS50 што ёсць усе гэтыя функцыі. 186 00:08:03,580 --> 00:08:06,810 Мы выкарыстоўвалі GetInt шмат, GetString, верагодна, GetLongLong раней 187 00:08:06,810 --> 00:08:09,840 ў маім Pset адзін або так, але што на самой справе адбываецца? 188 00:08:09,840 --> 00:08:12,920 Ну, давайце зірнем пад капотам на праграму, якая 189 00:08:12,920 --> 00:08:17,017 натхняе таму мы даем вам CS50 бібліятэка, і на самай справе, як на мінулым тыдні, 190 00:08:17,017 --> 00:08:18,850 мы пачалі прымаць тых, навучальныя колы ад. 191 00:08:18,850 --> 00:08:21,080 Так што гэта зараз сартуюцца з таго, што пасмяротных 192 00:08:21,080 --> 00:08:23,690 мае ўжо на у бібліятэцы CS50, 193 00:08:23,690 --> 00:08:27,250 нават калі мы зараз пачне рухацца ад яго для большасці праграм. 194 00:08:27,250 --> 00:08:29,460 >> Так што гэта праграма называецца зсапЕ 0. 195 00:08:29,460 --> 00:08:30,510 Гэта супер кароткі. 196 00:08:30,510 --> 00:08:33,909 Гэта проста ёсць гэтыя радкі, але гэта уводзіць функцыю называюць зсапЕ 197 00:08:33,909 --> 00:08:36,909 што мы на самай справе адбываецца, каб бачыць у момант ўнутры бібліятэкі CS50, 198 00:08:36,909 --> 00:08:38,600 хоць і ў некалькі іншай форме. 199 00:08:38,600 --> 00:08:41,330 Так што гэта праграма на лініі 16 аб'яўляе зменную х. 200 00:08:41,330 --> 00:08:43,150 Так дайце мне чатыры байта для Int. 201 00:08:43,150 --> 00:08:45,750 Гэта было распавядаць карыстачу, Колькасць калі ласка, а затым 202 00:08:45,750 --> 00:08:49,010 гэта цікава, што лінія на самай справе звязвае мінулым тыдні 203 00:08:49,010 --> 00:08:49,790 і гэта. 204 00:08:49,790 --> 00:08:53,230 Scanf, і звярніце ўвагу на тое, што займае Радок фармату, як Printf, 205 00:08:53,230 --> 00:08:57,480 % Я азначае Int, а затым яна займае Другі аргумент, які выглядае крыху 206 00:08:57,480 --> 00:08:58,260 фанкі. 207 00:08:58,260 --> 00:09:01,880 Гэта Ампэрсанд х, і ўспомніць, мы бачылі толькі адзін раз на мінулым тыдні. 208 00:09:01,880 --> 00:09:03,465 Што Ампэрсанд х ўяўляюць? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Што рабіць у Ампэрсанд C? 211 00:09:08,450 --> 00:09:08,950 Да? 212 00:09:08,950 --> 00:09:10,024 >> Аўдыторыя: адрас. 213 00:09:10,024 --> 00:09:11,190 Дэвід малая: Адрас. 214 00:09:11,190 --> 00:09:13,190 Так гэта наадварот зорнага аператара, 215 00:09:13,190 --> 00:09:17,270 у той час як зорка аператар кажа, перайдзіце да гэты адрас, Ампэрсанд аператар 216 00:09:17,270 --> 00:09:20,280 кажа, высветліць адрас гэтай зменнай, 217 00:09:20,280 --> 00:09:23,530 і такім чынам гэта з'яўляецца ключавым, таму што Мэта Scanf ў жыцці 218 00:09:23,530 --> 00:09:26,320 гэта для сканавання карыстальніка ўвесці з клавіятуры, 219 00:09:26,320 --> 00:09:29,970 у залежнасці ад усё, што ён ці яна тыпы, а затым чытаць ўвод дадзенага карыстальніка 220 00:09:29,970 --> 00:09:32,970 ў зменную, але мы бачылі ў апошнія два тыдні 221 00:09:32,970 --> 00:09:36,080 што гэтая функцыя падпампоўкі, што мы спрабаваў намаганняў для рэалізацыі 222 00:09:36,080 --> 00:09:37,110 проста разбітыя. 223 00:09:37,110 --> 00:09:42,470 Нагадаем, што з функцыяй падпампоўкі, калі мы толькі што абвясцілі А і У, цэлых лікаў, 224 00:09:42,470 --> 00:09:47,040 мы сапраўды паспяхова своп дзве зменныя ўнутры своп 225 00:09:47,040 --> 00:09:50,080 проста падабаецца з малаком і OJ, але як толькі вярнуўся падпампоўкі, 226 00:09:50,080 --> 00:09:55,200 які быў вынік па х і у, арыгінальныя значэння? 227 00:09:55,200 --> 00:09:55,700 Нічога. 228 00:09:55,700 --> 00:09:56,200 Так. 229 00:09:56,200 --> 00:09:59,754 Нічога не адбылося, што час, таму што свопы змяніць толькі свае лакальныя копіі, 230 00:09:59,754 --> 00:10:01,670 які павінен сказаць, усё на гэты раз, кожны раз, калі мы ў 231 00:10:01,670 --> 00:10:04,010 былі перадаючы аргументаў да функцый, мы 232 00:10:04,010 --> 00:10:05,939 проста праходзячы копіі гэтых аргументаў. 233 00:10:05,939 --> 00:10:07,980 Вы можаце рабіць з гэтым што вы хочаце з імі, 234 00:10:07,980 --> 00:10:10,890 але яны збіраюцца мець не Ўплыў на зыходныя значэння. 235 00:10:10,890 --> 00:10:13,650 Так што гэта праблематычна, калі вам хочаце мець функцыю, як зсапЕ 236 00:10:13,650 --> 00:10:17,170 у жыцці, мэта якога складаецца ў сканаванні уваход карыстальніка з клавіятуры 237 00:10:17,170 --> 00:10:22,010 а затым запоўніць прабелы, так кажуць, што гэта, даюць зменную х, як 238 00:10:22,010 --> 00:10:25,410 значэнне, таму што, калі б я быў проста перадаць х у Scanf, 239 00:10:25,410 --> 00:10:28,790 калі вы лічыце, логіку ў мінулым тыдзень, зсапЕ можа рабіць усё, што ён хоча 240 00:10:28,790 --> 00:10:33,100 з копіяй х, але яна не магла назаўжды змяніць х, калі мы не дамо 241 00:10:33,100 --> 00:10:37,120 Scanf карту скарбаў, так бы мовіць, дзе х пазначае месца, у выніку чаго 242 00:10:37,120 --> 00:10:41,860 мы праходзім ў адрас х, так што зсапЕ можаце пайсці туды і фактычна змена 243 00:10:41,860 --> 00:10:42,920 значэнне х. 244 00:10:42,920 --> 00:10:45,080 І так сапраўды, усё што гэтая праграма робіць 245 00:10:45,080 --> 00:10:53,180 калі я зсапЕ 0, на мой крыніцы Каталог 5м, зрабіць зсапЕ 0, 246 00:10:53,180 --> 00:10:57,730 кропка слэш зсапЕ, нумар калі ласка, 50, дзякуй за 50. 247 00:10:57,730 --> 00:11:01,020 >> Так што гэта не ўсё, што цікава, Але тое, што сапраўды адбываецца 248 00:11:01,020 --> 00:11:04,820 з'яўляецца тое, што, як толькі я называю Scanf тут, значэнне х 249 00:11:04,820 --> 00:11:06,410 у цяперашні час пастаянна змяняецца. 250 00:11:06,410 --> 00:11:08,335 Цяпер, гэта, здаецца, добры і добра, а на самай справе, гэта 251 00:11:08,335 --> 00:11:11,200 Падобна на тое, мы сапраўды не трэба бібліятэка CS50 наогул больш. 252 00:11:11,200 --> 00:11:13,960 Напрыклад, давайце працаваць гэта яшчэ раз тут. 253 00:11:13,960 --> 00:11:15,750 Дазвольце мне адкрыць яго на працягу секунды. 254 00:11:15,750 --> 00:11:20,600 Давайце паспрабуем нумар, калі ласка, і замест таго каб сказаць 50, як раней, 255 00:11:20,600 --> 00:11:22,810 давайце проста сказаць няма. 256 00:11:22,810 --> 00:11:24,000 ОК, гэта крыху дзіўна. 257 00:11:24,000 --> 00:11:25,270 ДОБРА. 258 00:11:25,270 --> 00:11:28,680 І толькі некаторыя глупства тут. 259 00:11:28,680 --> 00:11:31,170 Так што, здаецца, не апрацоўваць памылковыя сітуацыі. 260 00:11:31,170 --> 00:11:33,620 Такім чынам, мы павінны мінімальна старт дадаўшы некаторыя праверкі памылак 261 00:11:33,620 --> 00:11:37,460 каб пераканацца, што карыстальнік мае надрукаваная ў фактычная колькасць як 50, 262 00:11:37,460 --> 00:11:40,720 таму што відавочна набраўшы слоў не выяўлена праблематычным, 263 00:11:40,720 --> 00:11:42,020 але гэта, верагодна, павінна быць. 264 00:11:42,020 --> 00:11:46,450 >> Давайце паглядзім на гэтую версію цяпер гэта мая спроба перавызначыць GetString. 265 00:11:46,450 --> 00:11:48,437 Калі зсапЕ ўсё гэта мае Функцыянальнасць убудаваная, 266 00:11:48,437 --> 00:11:51,270 чаму мы былі з імі песціцца навучальныя дыскі, як GetString? 267 00:11:51,270 --> 00:11:55,450 Ну, вось, мабыць, мая ўласная простая версія GetString 268 00:11:55,450 --> 00:12:00,766 у выніку чаго тыдзень таму, я б сказаў даць мне радок і называюць гэта буфер. 269 00:12:00,766 --> 00:12:03,390 Сёння, я збіраюся пачаць толькі кажучы сЬаг зоркі, які, нагадаем, 270 00:12:03,390 --> 00:12:04,400 гэта проста сінонімы. 271 00:12:04,400 --> 00:12:06,629 Гэта выглядае страшней, але гэта дакладна такая ж рэч. 272 00:12:06,629 --> 00:12:09,420 Так дайце мне зменнай называецца буфер што збіраецца захоўваць радок, 273 00:12:09,420 --> 00:12:12,780 скажыце калі ласка, радок карыстальніка, а затым, як і раней, 274 00:12:12,780 --> 00:12:17,760 давайце паспрабуем заняць гэты ўрок зсапЕ % S гэты час, а затым перадаць у буферы. 275 00:12:17,760 --> 00:12:19,310 Цяпер, хуткая праверка здаровае. 276 00:12:19,310 --> 00:12:22,120 Чаму я не кажу, Ампэрсанд буфер на гэты раз? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Вывад з папярэдняга прыкладу. 279 00:12:26,625 --> 00:12:28,000 АЎДЫТОРЫЯ: Чар зорка паказальнік. 280 00:12:28,000 --> 00:12:29,920 Дэвід малая: Роўна, таму што гэты час, гольца 281 00:12:29,920 --> 00:12:34,080 зорка ўжо паказальнік, адрас, па вызначэнні гэтай зоркі быць там. 282 00:12:34,080 --> 00:12:37,530 І калі зсапЕ чакае адрас, дастаткова толькі прайсці ў буферы. 283 00:12:37,530 --> 00:12:39,260 Мне не трэба, каб сказаць, Ампэрсанд буфер. 284 00:12:39,260 --> 00:12:42,177 Для цікаўных, вы маглі б зрабіць нешта накшталт гэтага. 285 00:12:42,177 --> 00:12:43,510 Гэта будзе мець іншае значэнне. 286 00:12:43,510 --> 00:12:47,240 Гэта дасць вам паказальнік на паказальнік, які на самай справе 287 00:12:47,240 --> 00:12:50,050 сапраўдны рэч у C, але для Цяпер, давайце трымаць яго простая 288 00:12:50,050 --> 00:12:51,750 і трымаць гісторыю ў адпаведнасці. 289 00:12:51,750 --> 00:12:54,100 Я проста хачу, каб перадаць у буфер і гэта правільна. 290 00:12:54,100 --> 00:12:56,487 Праблема, аднак, заключаецца ў наступным. 291 00:12:56,487 --> 00:12:58,820 Дазвольце мне ісці наперад і працаваць у гэтым Праграма пасля кампіляцыі. 292 00:12:58,820 --> 00:13:00,902 Зрабіць зсапЕ 1. 293 00:13:00,902 --> 00:13:02,610 Чорт вазьмі, мой кампілятара лавіць сваю памылку. 294 00:13:02,610 --> 00:13:04,090 Дайце мне адну секунду. 295 00:13:04,090 --> 00:13:05,460 Clang. 296 00:13:05,460 --> 00:13:06,990 Скажам Scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 ДОБРА. 299 00:13:11,380 --> 00:13:12,720 Там мы ідзем. 300 00:13:12,720 --> 00:13:14,280 Мне гэта трэба. 301 00:13:14,280 --> 00:13:16,750 CS50 ID мае розныя Параметры канфігурацыі 302 00:13:16,750 --> 00:13:18,280 што абароніць вас ад сябе. 303 00:13:18,280 --> 00:13:21,300 Мне трэба адключыць тыя, па працуе ляск уручную ў гэты раз. 304 00:13:21,300 --> 00:13:22,140 Так радок калі ласка. 305 00:13:22,140 --> 00:13:25,560 Я збіраюся ісці наперад і ўвесці у маім каханым свеце прывітанне. 306 00:13:25,560 --> 00:13:26,490 ОК, нуль. 307 00:13:26,490 --> 00:13:27,700 Гэта не тое, што я набраў. 308 00:13:27,700 --> 00:13:29,690 Так што гэта сведчыць аб то памыліцца. 309 00:13:29,690 --> 00:13:33,920 Дазвольце мне ісці наперад і ўвесці на самай справе доўгай радкі. 310 00:13:33,920 --> 00:13:37,210 Падзяку за нуль, і я не ведаю, калі я збіраюся быць у стане разбіць яго. 311 00:13:37,210 --> 00:13:40,240 Давайце паспрабуем трохі копію ўставіць і паглядзець, калі гэта дапамагае. 312 00:13:40,240 --> 00:13:43,290 Проста ўстаўце многае з гэтага. 313 00:13:43,290 --> 00:13:47,310 Гэта, безумоўна, больш Радок, чым звычайна. 314 00:13:47,310 --> 00:13:51,450 Давайце проста сапраўды напісаць яго. 315 00:13:51,450 --> 00:13:51,950 Няма. 316 00:13:51,950 --> 00:13:52,650 Чорт вазьмі. 317 00:13:52,650 --> 00:13:53,480 Каманда не знойдзена. 318 00:13:53,480 --> 00:13:54,550 Дык вось не звязаныя. 319 00:13:54,550 --> 00:13:56,440 Гэта таму, што я ўставіў некаторыя дрэнныя персанажы, 320 00:13:56,440 --> 00:13:59,780 але гэта аказваецца не будзе працаваць. 321 00:13:59,780 --> 00:14:03,510 >> Давайце паспрабуем гэта яшчэ раз, таму што гэта больш цікава, калі мы на самай справе крах яго. 322 00:14:03,510 --> 00:14:09,116 Давайце друкую гэта, і цяпер, я збіраецца капіяваць сапраўды доўгую радок 323 00:14:09,116 --> 00:14:10,990 а цяпер давайце паглядзім, калі мы можа прывесці да збою гэтую рэч. 324 00:14:10,990 --> 00:14:14,235 Звярніце ўвагу, я апусціў прасторы і новыя лініі і кропкі з коскай 325 00:14:14,235 --> 00:14:16,035 і ўсе незразумелыя сімвалы. 326 00:14:16,035 --> 00:14:16,535 Enter. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 І цяпер у сеткі проста быць павольным. 329 00:14:22,880 --> 00:14:27,460 Я трымаў ўніз Command-V занадта доўга, ясна. 330 00:14:27,460 --> 00:14:28,190 Чорт вазьмі! 331 00:14:28,190 --> 00:14:29,260 Каманда не знойдзена. 332 00:14:29,260 --> 00:14:29,780 >> ДОБРА. 333 00:14:29,780 --> 00:14:32,240 Ну, справа ў тым, тым не менш, пасля. 334 00:14:32,240 --> 00:14:36,910 Так што на самай справе адбываецца з гэтай дэкларацыяй 335 00:14:36,910 --> 00:14:39,240 Чар зорак буфера на лініі 16? 336 00:14:39,240 --> 00:14:41,820 Так што я атрымліваю Калі я абвяшчаю паказальнік? 337 00:14:41,820 --> 00:14:47,440 Усё, што я атрымліваю значэнне байта чатыры званая буферная, але тое, што ўнутры яго 338 00:14:47,440 --> 00:14:49,540 на дадзены момант? 339 00:14:49,540 --> 00:14:50,930 Гэта проста некаторы значэнне смецця. 340 00:14:50,930 --> 00:14:54,170 Таму любы час вы аб'яўляеце зменную ў C, гэта проста некаторы значэнне смецця, 341 00:14:54,170 --> 00:14:56,220 і мы пачынаем Паездка па гэтай рэальнасці. 342 00:14:56,220 --> 00:14:59,720 Цяпер, калі я кажу зсапЕ, перайсці на гэты адрас 343 00:14:59,720 --> 00:15:01,520 і пакласці ўсе тыпы карыстальнікаў у. 344 00:15:01,520 --> 00:15:06,400 Калі карыстальнік ў прывітанне Свет, ну, куды я паклаў яго? 345 00:15:06,400 --> 00:15:07,750 Буфер значэнне смецця. 346 00:15:07,750 --> 00:15:11,510 >> Так што накшталт як страла які, паказваючы, хто ведае, дзе. 347 00:15:11,510 --> 00:15:13,880 Можа быць, гэта паказвае прама тут, у маёй памяці. 348 00:15:13,880 --> 00:15:16,560 І таму, калі карыстальнік тыпы ў свеце, здравствулте! 349 00:15:16,560 --> 00:15:22,380 праграма спрабуе паставіць Радок прывітанне свет зваротны слеш 0 350 00:15:22,380 --> 00:15:23,910 у гэтым кавалку памяці. 351 00:15:23,910 --> 00:15:27,070 Але з вялікай доляй верагоднасці, але відавочна не 100% верагоднасць, 352 00:15:27,070 --> 00:15:30,440 кампутар будзе крах, то Праграма, таму што гэта не 353 00:15:30,440 --> 00:15:32,490 памяці я павінен быць дазволена дакрануцца. 354 00:15:32,490 --> 00:15:36,330 Карацей кажучы, гэтая праграма недахопы менавіта па гэтай прычыне. 355 00:15:36,330 --> 00:15:38,070 Я прынцыпова не робіць? 356 00:15:38,070 --> 00:15:42,366 Якія крокі я апушчаны, як мы апусцілі з першага прыкладу Бинки? 357 00:15:42,366 --> 00:15:42,866 Да? 358 00:15:42,866 --> 00:15:43,710 >> АЎДЫТОРЫЯ: размеркаванне памяці? 359 00:15:43,710 --> 00:15:45,001 >> Дэвід малая: размеркаванне памяці. 360 00:15:45,001 --> 00:15:48,400 Я на самой справе не выдзелены любая памяць для гэтага радка. 361 00:15:48,400 --> 00:15:50,270 Такім чынам, мы можам выправіць гэта ў некалькі спосабаў. 362 00:15:50,270 --> 00:15:52,700 Адзін з іх, мы можам захаваць яго простым і на самай справе, цяпер ты 363 00:15:52,700 --> 00:15:55,116 збіраецца пачаць бачыць размыванне ліній паміж тым, што 364 00:15:55,116 --> 00:15:58,520 Масіў, то, што радок з'яўляецца, тое, што сімвал зорка, якая масіў сімвалаў 365 00:15:58,520 --> 00:15:59,020 ёсць. 366 00:15:59,020 --> 00:16:02,450 Вось другі прыклад з удзелам струнных і апавяшчэння 367 00:16:02,450 --> 00:16:05,690 Усё, што я зрабіў на лініі 16, замест таго каб сказаць 368 00:16:05,690 --> 00:16:09,530 што буфер будзе сімвал зорка, паказальнік на кавалак памяці, 369 00:16:09,530 --> 00:16:14,057 Я збіраюся вельмі актыўна даюць сам буфер 16 сімвалаў, 370 00:16:14,057 --> 00:16:16,390 і на самай справе, калі вы знаёмыя з тэрмінам буферызацыі, 371 00:16:16,390 --> 00:16:20,570 верагодна, са свету відэа, дзе відэа буферызацыі, буферызацыя, 372 00:16:20,570 --> 00:16:21,175 буферызацыі. 373 00:16:21,175 --> 00:16:22,550 Ну, якая сувязь тут? 374 00:16:22,550 --> 00:16:24,960 Ну, унутры YouTube і ўнутры відэаплэераў 375 00:16:24,960 --> 00:16:27,200 як правіла, уяўляе сабой масіў гэта больш, чым 16 гадоў. 376 00:16:27,200 --> 00:16:30,340 Гэта можа быць масіў памеру аднаго мегабайт, можа быць, 10 мегабайт, 377 00:16:30,340 --> 00:16:34,330 і ў гэтым масіве робіць ваш браўзэр спампаваць цэлую кучу байтаў, 378 00:16:34,330 --> 00:16:37,500 цэлая куча мегабайт відэа, і відэа-плэер, 379 00:16:37,500 --> 00:16:40,930 YouTube, альбо хто б там ні, пачынаецца чытаць байты з гэтага масіва, 380 00:16:40,930 --> 00:16:43,530 і ў любы час вы бачыце Слова буферызацыі, буферызацыя, 381 00:16:43,530 --> 00:16:46,350 гэта азначае, што гулец мае дайшлі да канца масіва. 382 00:16:46,350 --> 00:16:50,430 Сетка настолькі павольна, што гэта не мае напоўніў масіў з больш байт 383 00:16:50,430 --> 00:16:55,610 і так вы з бітаў для адлюстравання карыстальніку. 384 00:16:55,610 --> 00:16:59,430 >> Так буфера з'яўляецца ўдалы тэрмін тут у тым, гэта проста масіў, кавалак памяці. 385 00:16:59,430 --> 00:17:02,530 І гэта будзе выправіць таму што гэта аказваецца 386 00:17:02,530 --> 00:17:07,410 што вы можаце звяртацца масівы, як быццам яны адрасы, нават калі буфер 387 00:17:07,410 --> 00:17:10,710 гэта проста сімвал, гэта паслядоўнасць знакаў, буфер 388 00:17:10,710 --> 00:17:14,760 гэта карысна для мяне, праграміст, Вы можаце перадаць сваё імя вакол 389 00:17:14,760 --> 00:17:17,079 як калі б гэта былі паказальнік, як бы гэта 390 00:17:17,079 --> 00:17:21,000 былі таксама адрас кавалак памяці для 16 знакаў. 391 00:17:21,000 --> 00:17:24,530 Дык вось, каб сказаць, што я магу прайсці зсапЕ менавіта гэтае слова 392 00:17:24,530 --> 00:17:30,670 і цяпер, калі я гэтую праграму, зрабіць зсапЕ 2, кропка слэш зсапЕ 2, 393 00:17:30,670 --> 00:17:35,386 і ўвядзіце ў прывітанне свет, Калі ласка, увядзіце, што time-- 394 00:17:35,386 --> 00:17:37,590 >> Хм, што здарылася? 395 00:17:37,590 --> 00:17:39,340 Радок калі ласка. 396 00:17:39,340 --> 00:17:41,430 Што я зрабіў не так? 397 00:17:41,430 --> 00:17:43,800 Прывітанне свет, буфер. 398 00:17:43,800 --> 00:17:44,705 Прывітанне свет. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ах, я ведаю, што ён робіць. 401 00:17:49,420 --> 00:17:49,920 ДОБРА. 402 00:17:49,920 --> 00:17:51,628 Так што чытае да да першага прабелу. 403 00:17:51,628 --> 00:17:55,680 Так што давайце падмануць на імгненне і сказаць, што я проста хацеў, каб нешта тыпу 404 00:17:55,680 --> 00:18:01,408 сапраўды доўга, як гэта доўгае прапанову гэта адна, дзве, тры, чатыры, пяць, 405 00:18:01,408 --> 00:18:04,420 шэсць, сем, восем, дзевяць, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 ДОБРА. 407 00:18:05,300 --> 00:18:07,600 Гэта сапраўды доўгае прапанову. 408 00:18:07,600 --> 00:18:10,710 Такім чынам, гэта прапанова з'яўляецца больш, чым 16 сімвалаў 409 00:18:10,710 --> 00:18:13,670 і таму, калі я ударыў Enter, што адбудзецца? 410 00:18:13,670 --> 00:18:16,940 Ну, у гэтым выпадку з гісторыя, я абвясціў буфер 411 00:18:16,940 --> 00:18:22,190 на самай справе з'яўляецца масіў з 16 сымбалі гатовы да працы. 412 00:18:22,190 --> 00:18:27,426 Так адзін, два, тры, чатыры, пяць, шэсць, сем, восем, дзевяць, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Так 16 сімвалаў, і цяпер, калі я чытаць нешта, як гэта доўга 415 00:18:34,410 --> 00:18:43,950 Прысуд, што адбудзецца ў што я збіраюся чытаць у гэта доўга 416 00:18:43,950 --> 00:18:49,660 S-Е-Н-Т-Е-Н-С-Е, прапанову. 417 00:18:49,660 --> 00:18:52,270 >> Так што гэта наўмысна дрэнна, што я 418 00:18:52,270 --> 00:18:55,060 працягваць пісаць за межамі Межы майго масіва, 419 00:18:55,060 --> 00:18:56,660 за межамі майго буфера. 420 00:18:56,660 --> 00:19:00,100 Я мог бы атрымаць пашанцавала, і праграма будзе працягваць працаваць і не хвалюе, 421 00:19:00,100 --> 00:19:03,450 але, наогул кажучы, гэта сапраўды крах маю праграму, 422 00:19:03,450 --> 00:19:06,440 і гэта памылка ў маім код момант, калі я крок 423 00:19:06,440 --> 00:19:08,576 за мяжы з гэтага масіва, таму што я 424 00:19:08,576 --> 00:19:10,450 не ведаю, калі гэта абавязкова ўрэжацца 425 00:19:10,450 --> 00:19:12,120 або калі я проста хачу, каб павезці. 426 00:19:12,120 --> 00:19:15,750 Так што гэта праблематычна, таму што ў гэты выпадак, ён, здаецца, працуюць 427 00:19:15,750 --> 00:19:20,931 і давайце спакушаць лёс тут, хоць інтэграванае асяроддзе, здаецца, трываць зусім няшмат 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Там мы ідзем. 430 00:19:22,040 --> 00:19:23,240 Нарэшце-то. 431 00:19:23,240 --> 00:19:26,470 Так што я адзіны, хто можа гэта ўбачыць. 432 00:19:26,470 --> 00:19:29,630 Так што я проста было шмат весялосці, набраўшы з вельмі доўгі фактычнай фразу 433 00:19:29,630 --> 00:19:32,800 што гэта, вядома, перавысіла 16 байт, таму што я 434 00:19:32,800 --> 00:19:38,050 набралі ў гэтым вар'яцкім працяглага мульты-лініі Фраза, і звярніце ўвагу на тое, што адбылося. 435 00:19:38,050 --> 00:19:41,110 Праграма спрабавала яго друку а затым атрымаў памылку сегментацыі 436 00:19:41,110 --> 00:19:44,430 і памылкі сегментацыі, калі нешта падобнае 437 00:19:44,430 --> 00:19:47,650 і аперацыйная сістэма кажа няма, не могуць дакрануцца да памяці. 438 00:19:47,650 --> 00:19:49,570 Мы збіраемся, каб забіць Праграма ў цэлым. 439 00:19:49,570 --> 00:19:51,180 >> Такім чынам, гэта ўяўляецца праблематычным. 440 00:19:51,180 --> 00:19:54,540 Я палепшыў праграму, з дапамогай якой па меншай меры, ёсць памяць, 441 00:19:54,540 --> 00:19:58,000 але гэта, здавалася б абмежавацца функцыя GetString, каб атрымаць 442 00:19:58,000 --> 00:20:00,780 струны некаторай канчатковай даўжыні 16. 443 00:20:00,780 --> 00:20:04,200 Так што, калі вы хочаце падтрымліваць больш прысуды, чым 16 сімвалаў, 444 00:20:04,200 --> 00:20:04,880 што ты робіш? 445 00:20:04,880 --> 00:20:07,970 Ну, вы можаце павялічыць Памер гэтага буфера да 32 446 00:20:07,970 --> 00:20:09,190 або, што здаецца збольшага кароткім. 447 00:20:09,190 --> 00:20:12,260 Чаму б нам не проста зрабіць гэта 1000, але адсунуць. 448 00:20:12,260 --> 00:20:17,100 Што адказ інтуітыўна з проста пазбегнуць гэтай праблемы шляхам 449 00:20:17,100 --> 00:20:20,660 мой буфер больш, як 1000 знакаў? 450 00:20:20,660 --> 00:20:23,470 Рэалізуючы GetString гэты шлях. 451 00:20:23,470 --> 00:20:27,130 Тое, што добра ці дрэнна тут? 452 00:20:27,130 --> 00:20:28,033 Да? 453 00:20:28,033 --> 00:20:30,574 АЎДЫТОРЫЯ: Калі вы звязваць шмат прасторы, і вы не выкарыстоўваеце яго, 454 00:20:30,574 --> 00:20:33,500 то вы не можаце пераразмеркаваць гэта прастора. 455 00:20:33,500 --> 00:20:34,500 Дэвід малая: Вы маеце рацыю. 456 00:20:34,500 --> 00:20:38,480 Гэта марнатраўна, паколькі, калі вы не на самай справе трэба 900 байт з гэтых 457 00:20:38,480 --> 00:20:41,057 і яшчэ вы просіце 1000 у агульнай складанасці ў любым выпадку, 458 00:20:41,057 --> 00:20:44,140 вы проста спажываць больш памяці на кампутар карыстальніка, чым трэба, 459 00:20:44,140 --> 00:20:45,740 і ў рэшце рэшт, некаторыя з Вы ўжо сустракаліся 460 00:20:45,740 --> 00:20:47,620 у жыцці, што, калі вы працуе мноства праграм 461 00:20:47,620 --> 00:20:50,470 і што яны ядуць да шмат памяці, гэта сапраўды можа паўплываць на прадукцыйнасць 462 00:20:50,470 --> 00:20:52,220 і вопыт карыстальніка на кампутары. 463 00:20:52,220 --> 00:20:56,090 Так што быццам лянівы рашэнне, напэўна, і, наадварот, 464 00:20:56,090 --> 00:21:00,140 гэта не толькі марнатраўна, тое, што праблема па-ранейшаму застаецца, нават калі я магу зрабіць мой буфера 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Да? 467 00:21:02,600 --> 00:21:04,475 >> Аўдыторыя: радок даўжынёй 1,001. 468 00:21:04,475 --> 00:21:05,350 Дэвід малая: Дакладна. 469 00:21:05,350 --> 00:21:08,280 Калі радок даўжынёй 1001, ў вас ёсць сапраўды такі жа праблемай, 470 00:21:08,280 --> 00:21:10,705 і мой аргумент, я б толькі затым зрабіць яго 2000 471 00:21:10,705 --> 00:21:12,830 але вы не ведаеце, у загадзя, наколькі вялікі гэта павінна быць, 472 00:21:12,830 --> 00:21:16,890 і ўсё ж, я павінен сабраць сваю праграму перш чым даць людзям выкарыстоўваць і спампаваць 473 00:21:16,890 --> 00:21:17,390 гэта. 474 00:21:17,390 --> 00:21:21,490 Так што гэта менавіта тое, рэчы, якія бібліятэка спрабуе CS50 475 00:21:21,490 --> 00:21:24,750 каб дапамагчы нам з, і мы будзем толькі погляд на некаторыя з базавай рэалізацыі 476 00:21:24,750 --> 00:21:29,790 тут, але гэта CS50 кропка С. Гэта гэта файл, які быў на CS50 IDE 477 00:21:29,790 --> 00:21:31,420 усе гэтыя тыдні, што вы выкарыстоўваеце. 478 00:21:31,420 --> 00:21:34,280 Гэта папярэдне складзены і ў Вас ёсць выкарыстоўвае яго аўтаматычна 479 00:21:34,280 --> 00:21:38,780 па характары, які мае працяжнік L CS50 сцяг з ляскам, 480 00:21:38,780 --> 00:21:42,300 але калі я пракруціць ўніз праз усе гэтыя функцыі, вось GetString, 481 00:21:42,300 --> 00:21:44,636 і проста каб даць вам густ таго, што адбываецца, 482 00:21:44,636 --> 00:21:46,760 давайце хуткі погляд на адносную складанасць. 483 00:21:46,760 --> 00:21:48,870 Гэта не супер доўга Функцыя, але мы не зрабілі 484 00:21:48,870 --> 00:21:52,530 павінны думаю, што ўсе цяжка аб як ісці аб атрыманні радкоў. 485 00:21:52,530 --> 00:21:55,660 >> Такім чынам, вось мой буфер, і я па-відаць, яго ініцыялізацыі да нуля. 486 00:21:55,660 --> 00:21:57,990 Гэта, вядома, з'яўляецца Тое ж самае, як паўкокс зоркі, 487 00:21:57,990 --> 00:22:00,585 але я вырашыў у рэалізацыі бібліятэкі CS50 488 00:22:00,585 --> 00:22:02,460 што калі мы збіраемся цалкам дынамічны, 489 00:22:02,460 --> 00:22:05,770 Я не ведаю, загадзя, наколькі вялікая ў радок карыстальнікі будуць хочаце атрымаць. 490 00:22:05,770 --> 00:22:08,140 Так што я збіраюся пачаць толькі з пустым радком 491 00:22:08,140 --> 00:22:11,507 і я збіраюся пабудаваць столькі памяці, як мне трэба, каб адпавядаць радок карыстальніка 492 00:22:11,507 --> 00:22:13,340 і калі я не дастаткова, я папрашу 493 00:22:13,340 --> 00:22:15,010 аперацыйная сістэма для атрымання дадатковай памяці. 494 00:22:15,010 --> 00:22:17,510 Я збіраюся перамясціць іх радок ў большы кавалак памяці 495 00:22:17,510 --> 00:22:21,847 і я збіраюся выпусціць або вызваліць недастаткова вялікі кавалак памяці 496 00:22:21,847 --> 00:22:23,680 і мы толькі збіраемся зрабіць гэта шматкроць. 497 00:22:23,680 --> 00:22:25,570 >> Такім чынам, хуткі погляд, вось толькі зменнай 498 00:22:25,570 --> 00:22:28,780 з якой я іду, каб адсочваць ёмістасці маёй буфера. 499 00:22:28,780 --> 00:22:30,071 Колькі байт я магу адпавядаць? 500 00:22:30,071 --> 00:22:32,070 Вось пераменная п з які я буду трымаць 501 00:22:32,070 --> 00:22:36,200 трэк колькі байт на самай справе ў буфер, ці што карыстач увёў. 502 00:22:36,200 --> 00:22:39,900 Калі вы не бачылі гэта раней, вам можна паказаць, што пераменная, як Int 503 00:22:39,900 --> 00:22:46,370 без знака, які, як вынікае з назвы, азначае, што гэта не-адмоўным, а чаму б 504 00:22:46,370 --> 00:22:50,590 Я калі-небудзь хацеў турбаваць удакладненнем што INT гэта не проста INT, 505 00:22:50,590 --> 00:22:52,540 але гэта беззнаковое INT? 506 00:22:52,540 --> 00:22:55,064 Гэта неадмоўнага Int. 507 00:22:55,064 --> 00:22:56,355 Што азначае [неразборліва] на ўвазе? 508 00:22:56,355 --> 00:22:58,910 >> АЎДЫТОРЫЯ: Гэта апісанні колькасць памяці, які можа быць [неразборліва]. 509 00:22:58,910 --> 00:22:59,660 >> Дэвід малая: Так. 510 00:22:59,660 --> 00:23:03,710 Так што, калі я кажу без знака, гэта на самай справе даючы вам адзін біт дадатковай памяці 511 00:23:03,710 --> 00:23:07,440 і, здаецца, па-дурному, але калі вы ёсць адзін біт дадатковай памяці, што 512 00:23:07,440 --> 00:23:09,940 азначае, што вы павінны ў два разы больш значэння можна ўявіць, 513 00:23:09,940 --> 00:23:11,570 таму што гэта можа быць 0 або 1. 514 00:23:11,570 --> 00:23:14,660 Так, па змаўчанні, цэлалікавых можа быць прыкладна адмоўнае 2 млрд ўвесь шлях 515 00:23:14,660 --> 00:23:16,030 да станоўчага 2 млрд. 516 00:23:16,030 --> 00:23:18,540 Тыя вялікія дыяпазоны, але ён па-ранейшаму выгляд марнатраўна 517 00:23:18,540 --> 00:23:21,280 калі вы толькі клапаціцца пра памеры, якія проста інтуітыўна 518 00:23:21,280 --> 00:23:24,620 не павінны быць адмоўнымі або станоўчае або 0, ну а потым, 519 00:23:24,620 --> 00:23:28,884 чаму вы марнуеце 2 млрд Магчымыя значэння для адмоўных лікаў 520 00:23:28,884 --> 00:23:30,300 калі вы ніколі не збіраецеся іх выкарыстоўваць? 521 00:23:30,300 --> 00:23:35,350 Так, кажучы без знака, цяпер мая Int можа быць паміж 0 і прыкладна 4 млрд. 522 00:23:35,350 --> 00:23:39,280 >> Так вось проста INT C па прычынах, мы не зможам атрымаць у цяпер, як 523 00:23:39,280 --> 00:23:42,280 чаму гэта цэлалікавых замест з гольца, але вось 524 00:23:42,280 --> 00:23:44,630 сутнасць таго, што адбываецца на, і некаторыя з вас 525 00:23:44,630 --> 00:23:48,340 могуць выкарыстоўваць, напрыклад, fgetc функцыя нават у чатыры Pset 526 00:23:48,340 --> 00:23:51,580 або пасля таго, што мы ўбачым яго зноў ў задачы ўсталяваць пяць, 527 00:23:51,580 --> 00:23:55,410 fgetc прыемна, таму што, як імя выгляд, накшталт arcanely мяркуе, 528 00:23:55,410 --> 00:23:57,940 гэта функцыя, якая атрымлівае характар ​​і таму, 529 00:23:57,940 --> 00:24:00,690 што прынцыпова адрозніваецца пра тое, што мы робім у GetString 530 00:24:00,690 --> 00:24:03,110 гэта мы не выкарыстоўваем зсапЕ такім жа чынам. 531 00:24:03,110 --> 00:24:07,550 Мы проста паўзе крок за крокам на працягу любога карыстальнік ўвёў у, 532 00:24:07,550 --> 00:24:10,970 таму што мы заўсёды можам вылучыць адзін сімвал, і такім чынам, мы заўсёды можам смела 533 00:24:10,970 --> 00:24:15,599 глядзець у адну гольца ў той час, і магія пачынае адбывацца тут. 534 00:24:15,599 --> 00:24:17,890 Я збіраюся пракруціць ўніз да сярэдзіна гэтай функцыі 535 00:24:17,890 --> 00:24:20,360 проста коратка прадставіць гэтую функцыю. 536 00:24:20,360 --> 00:24:22,670 Многае, як ёсць Функцыя Таноса, ёсць 537 00:24:22,670 --> 00:24:27,740 функцыя Realloc дзе Realloc дазваляе вам пераразмеркаваць частку памяці 538 00:24:27,740 --> 00:24:29,570 і зрабіць яго больш ці менш. 539 00:24:29,570 --> 00:24:33,060 Так Карацей кажучы, і з хваля майго боку на сённяшні дзень, 540 00:24:33,060 --> 00:24:35,620 ведаю, што GetString робіць гэта свайго роду 541 00:24:35,620 --> 00:24:39,720 магічна расце або скарачаецца буфер як карыстальнік 542 00:24:39,720 --> 00:24:41,440 тыпы ў яго ці яе радка. 543 00:24:41,440 --> 00:24:43,962 >> Так што, калі карыстач уводзіць Кароткая радок, гэты код 544 00:24:43,962 --> 00:24:45,920 толькі выдзяляе дастаткова памяці, каб адпавядаць радок. 545 00:24:45,920 --> 00:24:48,086 Калі карыстальнік захоўвае ўвод як я зрабіў гэта зноў і зноў 546 00:24:48,086 --> 00:24:50,330 і зноў, і, калі буфера першапачаткова гэты вялікі 547 00:24:50,330 --> 00:24:53,310 і праграма рэалізуе, каб пачакай, я з космасу, 548 00:24:53,310 --> 00:24:55,410 гэта збіраецца падвоіць памер буфера 549 00:24:55,410 --> 00:24:59,110 і затым два разы памер буфера і код, які робіць падваенне, 550 00:24:59,110 --> 00:25:03,170 калі мы паглядзім на яго тут, гэта толькі гэтая разумная адзін ўкладыш. 551 00:25:03,170 --> 00:25:06,830 Вы, магчыма, не бачыў гэты сінтаксіс раней, але калі вы кажаце, зоркі роўная, 552 00:25:06,830 --> 00:25:10,470 гэта тое ж самае, кажучы раз Умяшчальнасць 2. 553 00:25:10,470 --> 00:25:13,390 Так ён проста працягвае падваенне ёмістасць буфера 554 00:25:13,390 --> 00:25:17,480 а затым распавядаць Realloc даць Сам, што значна больш памяці. 555 00:25:17,480 --> 00:25:19,720 >> Цяпер, як у бок, там іншыя функцыі ў тут 556 00:25:19,720 --> 00:25:23,680 што мы не будзем глядзець у дэталі акрамя як паказаць у GetInt, 557 00:25:23,680 --> 00:25:26,150 мы выкарыстоўваем GetString ў GetInt. 558 00:25:26,150 --> 00:25:28,192 Мы правяраем, што гэта не NULL, які, нагадаем, 559 00:25:28,192 --> 00:25:30,400 гэта спецыяльнае значэнне, што азначае што-то пайшло не так. 560 00:25:30,400 --> 00:25:31,233 Мы з памяці. 561 00:25:31,233 --> 00:25:32,310 Лепш праверыць гэта. 562 00:25:32,310 --> 00:25:33,710 І мы вяртаем значэнне дазорнай. 563 00:25:33,710 --> 00:25:37,850 Але я адкласці на каментары адносна таго, чаму, а затым мы выкарыстоўваем гэтую стрыечны брат зсапЕ 564 00:25:37,850 --> 00:25:42,100 называецца sscanf і атрымліваецца, што sscanf, або радок зсапЕ, 565 00:25:42,100 --> 00:25:45,310 дазваляе вам зірнуць на лініі, карыстач увёў у вас, і хай 566 00:25:45,310 --> 00:25:49,610 прааналізаваць яго па сутнасці і тое, што я робім тут, я кажу sscanf, 567 00:25:49,610 --> 00:25:54,440 прааналізаваць усе карыстальнік набралі ў і пераканайцеся,% I, 568 00:25:54,440 --> 00:25:59,250 існуе цэлы лік у ім, і мы не будзем трапіць у сёння дакладна, чаму ёсць таксама 569 00:25:59,250 --> 00:26:03,760 A% C тут, але ў двух словах дазваляе нам выявіць, калі карыстальнік увёў 570 00:26:03,760 --> 00:26:06,050 у чымсьці фіктыўныя пасля нумары. 571 00:26:06,050 --> 00:26:11,766 Так што прычына, што GetInt і GetString сказаць вам, каб паўтарыць спробу, паўторыце, паўторыце спробу 572 00:26:11,766 --> 00:26:13,640 з-за ўсіх што код, які мы напісалі, 573 00:26:13,640 --> 00:26:17,900 гэта свайго роду погляд на ўваходзе карыстальніка у пераканаўшыся, што ён цалкам лічбавая Гэта 574 00:26:17,900 --> 00:26:21,700 ці гэта рэальная плавае значэнне кропкі і да т.п., 575 00:26:21,700 --> 00:26:24,233 у залежнасці ад таго, якой велічыні функцыянаваць вы выкарыстоўваеце. 576 00:26:24,233 --> 00:26:25,060 >> Вось так. 577 00:26:25,060 --> 00:26:25,710 ДОБРА. 578 00:26:25,710 --> 00:26:27,592 Гэта быў глыток але справа тут 579 00:26:27,592 --> 00:26:29,550 што прычына ў нас было гэтыя навучальныя дыскі па 580 00:26:29,550 --> 00:26:32,880 у тым, што на самым нізкім узроўні, Ёсць толькі так шмат рэчаў, якія 581 00:26:32,880 --> 00:26:35,674 можа пайсці не так, што мы хацелі прэвентыўна апрацоўваць 582 00:26:35,674 --> 00:26:38,090 гэтыя рэчы, вядома, у Першыя тыдні класа, 583 00:26:38,090 --> 00:26:42,230 але зараз з Pset чатыры і пяць, і Pset за вы ўбачыце, што гэта больш да 584 00:26:42,230 --> 00:26:45,570 Вы, але і вы больш здольныя вырашэння гэтых праблем віды 585 00:26:45,570 --> 00:26:47,180 самастойна. 586 00:26:47,180 --> 00:26:51,770 Любыя пытанні па GetString або GetInt? 587 00:26:51,770 --> 00:26:52,630 Да? 588 00:26:52,630 --> 00:26:55,130 >> АЎДЫТОРЫЯ: Чаму б вам падвоіць ёмістасць буфера 589 00:26:55,130 --> 00:26:57,630 а не проста павелічэнне гэта па дакладнай сумы? 590 00:26:57,630 --> 00:26:58,100 >> Дэвід малая: Добры пытанне. 591 00:26:58,100 --> 00:27:00,474 Чаму мы ўдвая ёмістасць буфера, у адрозненне 592 00:27:00,474 --> 00:27:02,800 проста павялічваючы яго некаторай пастаяннай велічыні? 593 00:27:02,800 --> 00:27:03,900 Гэта было дызайнерскае рашэнне. 594 00:27:03,900 --> 00:27:08,590 Мы проста вырашылі, што, таму што гэта, як правіла, быць трохі даражэй часу мудра спытаць 595 00:27:08,590 --> 00:27:10,440 аперацыйная сістэма на памяць, мы не 596 00:27:10,440 --> 00:27:13,210 хочаце ў канчатковым выніку атрымаць у сітуацыя для вялікіх радкоў 597 00:27:13,210 --> 00:27:14,960 што мы прасілі АС зноў і зноў 598 00:27:14,960 --> 00:27:17,500 і зноў, і зноў у Хуткая змена на памяць. 599 00:27:17,500 --> 00:27:20,387 Такім чынам, мы проста вырашылі, некалькі адвольна, але мы спадзяемся, што разумна, 600 00:27:20,387 --> 00:27:22,720 што, вы ведаеце, што, давайце паспрабаваць атрымаць наперадзе сябе 601 00:27:22,720 --> 00:27:25,520 і проста працягваць падвойвае яго так, што мы мінімізуем колькасць разоў 602 00:27:25,520 --> 00:27:29,010 мы павінны называць Таноса або Realloc, але ў агульнай складанасці суд 603 00:27:29,010 --> 00:27:31,820 назваць у адсутнасць ведаючы тое, што карыстальнікі, магчыма, захочаце, каб увесці ў. 604 00:27:31,820 --> 00:27:33,600 Абодва спосабу могуць быць спрэчным. 605 00:27:33,600 --> 00:27:35,430 Магчыма добра. 606 00:27:35,430 --> 00:27:39,240 >> Такім чынам, давайце зірнем на пару іншых пабочных эфектаў памяці, 607 00:27:39,240 --> 00:27:41,610 рэчы, якія могуць пайсці не так і інструменты, якія вы можаце 608 00:27:41,610 --> 00:27:43,880 выкарыстоўваць, каб злавіць гэтыя віды памылак. 609 00:27:43,880 --> 00:27:47,800 Аказваецца ўсё з вас, нават калі check50 ня сказаў вам, як шмат, 610 00:27:47,800 --> 00:27:50,050 пішу багі Код, паколькі тыдня адзін, 611 00:27:50,050 --> 00:27:53,630 нават калі ўсе тэсты з'яўляюцца check50 прайшло, і нават калі вы і ваш TF 612 00:27:53,630 --> 00:27:56,010 супер ўпэўненыя, што Ваш код працуе, як меркавалася. 613 00:27:56,010 --> 00:27:59,190 Ваш код быў багі або недахопы ў тым, што ўсё з вас, 614 00:27:59,190 --> 00:28:02,540 пры дапамозе бібліятэкі CS50, былі ўцечкі памяці. 615 00:28:02,540 --> 00:28:06,040 Ты пытаўся аперацыйную сістэму на памяць у большасці праграм 616 00:28:06,040 --> 00:28:08,850 Вы напісалі, але вы ніколі не вярнула яго. 617 00:28:08,850 --> 00:28:12,110 Вы назвалі GetString і GetInt і GetFloat, 618 00:28:12,110 --> 00:28:15,270 але з GetString, вы, ніколі не называў unGetString або Дайце 619 00:28:15,270 --> 00:28:19,890 Радок Назад або да т.п., але мы бачылі, што робіць GetString вылучыць памяць 620 00:28:19,890 --> 00:28:22,810 шляхам Таноса ці гэта Функцыя Realloc, які знаходзіцца ўсяго 621 00:28:22,810 --> 00:28:25,670 вельмі падобныя па духу, і ўсё ж, мы былі 622 00:28:25,670 --> 00:28:28,629 прасіць аперацыйную сістэму для памяць і памяць зноў і зноў 623 00:28:28,629 --> 00:28:29,670 але ніколі не даючы яго назад. 624 00:28:29,670 --> 00:28:33,550 >> Цяпер, як у бок, то атрымліваецца, што калі праграма завяршае працу, уся памяць 625 00:28:33,550 --> 00:28:34,870 аўтаматычна вызваляецца. 626 00:28:34,870 --> 00:28:36,150 Такім чынам, гэта не было велізарная справа. 627 00:28:36,150 --> 00:28:38,590 Гэта не збіраецца зламаць IDE або павольна рэчы ўніз, 628 00:28:38,590 --> 00:28:40,670 Але калі праграмы не як правіла, ўцечка памяці 629 00:28:40,670 --> 00:28:42,170 і яны працуюць на працягу доўгага часу. 630 00:28:42,170 --> 00:28:45,640 Калі вы калі-небудзь бачылі дурная маленькая пляжны мяч у Mac OS або пясочныя гадзіны 631 00:28:45,640 --> 00:28:51,160 У Windows, дзе гэта выгляд запаволенне або думаць або думаць 632 00:28:51,160 --> 00:28:53,770 ці проста сапраўды пачынае каб замарудзіцца, 633 00:28:53,770 --> 00:28:56,960 вельмі магчыма, можа быць вынікам ўцечкі памяці. 634 00:28:56,960 --> 00:28:59,970 Праграмісты, якія пісалі праграмнае забеспячэнне вы карыстаецеся 635 00:28:59,970 --> 00:29:03,570 прасіць аперацыйную сістэму для памяці кожныя некалькі хвілін, кожную гадзіну. 636 00:29:03,570 --> 00:29:05,570 Але калі вы выканаўшы Праграмнае забеспячэнне, нават калі гэта 637 00:29:05,570 --> 00:29:08,680 звесці да мінімуму ў вашым кампутары на працягу некалькіх гадзін або дзён запар, 638 00:29:08,680 --> 00:29:11,980 Вы маглі б прасіць больш і больш памяці і ніколі не выкарыстоўваць яго на самай справе 639 00:29:11,980 --> 00:29:15,180 і так што ваш код можа быць, або праграмы могуць быць ўцечка памяці, 640 00:29:15,180 --> 00:29:18,350 і калі вы пачынаеце ўцечка памяці, ёсць менш памяці для іншых праграм, 641 00:29:18,350 --> 00:29:21,220 і эфект у запаволіць ўсе ўніз. 642 00:29:21,220 --> 00:29:23,600 >> Цяпер, гэта, безумоўна, адзін з Найбольш жорсткія праграмы 643 00:29:23,600 --> 00:29:26,350 Вы будзеце мець магчымасць працаваць у той CS50 644 00:29:26,350 --> 00:29:31,650 а яго выхад яшчэ больш эзатэрычных, чым ляск Ці зрабіць або любой каманды 645 00:29:31,650 --> 00:29:35,930 Праграмы лініі мы запускаем раней, але На шчасце, убудаваныя ў яго выхадзе 646 00:29:35,930 --> 00:29:39,810 гэта некаторыя супер карысныя парады, што будзе карысная як для Pset чатыры 647 00:29:39,810 --> 00:29:41,510 або, вядома, Pset пяць. 648 00:29:41,510 --> 00:29:44,250 Так Valgrind з'яўляецца інструментам які можа быць выкарыстаны, каб паглядзець 649 00:29:44,250 --> 00:29:46,930 уцечак памяці ў вашай праграме. 650 00:29:46,930 --> 00:29:48,570 Гэта адносна проста працаваць. 651 00:29:48,570 --> 00:29:51,420 Вы запускаеце Valgrind, а затым, нават хоць гэта крыху шматслоўны, 652 00:29:51,420 --> 00:29:54,440 працяжнік праверка ўцечка працяжнік роўная поўнай, а затым кропка 653 00:29:54,440 --> 00:29:56,320 слэш і імя вашай праграмы. 654 00:29:56,320 --> 00:30:00,010 Так Valgrind будзе запусціць праграму і ў самым канцы сваёй праграмы 655 00:30:00,010 --> 00:30:02,240 працуе, перш чым ён сыходзіць і дае вам яшчэ падкажыце, 656 00:30:02,240 --> 00:30:04,980 ён збіраецца для аналізу Праграма пакуль яна бегла 657 00:30:04,980 --> 00:30:07,740 і сказаць, што ты вы ўцечка любая памяць і яшчэ лепш, 658 00:30:07,740 --> 00:30:10,610 ты Touch Memory, што не належыць вам? 659 00:30:10,610 --> 00:30:13,700 Ён не можа злавіць ўсе, але гэта вельмі добра пры лоўлі большасць рэчаў. 660 00:30:13,700 --> 00:30:19,700 >> Дык вось прыклад маёй прабегшы гэтая праграма, прабегшы Valgrind, 661 00:30:19,700 --> 00:30:21,470 на праграму пад назвай памяці, і я збіраюся 662 00:30:21,470 --> 00:30:24,730 вылучыць радкі, якія у канчатковым рахунку, для нас цікавая. 663 00:30:24,730 --> 00:30:27,690 Так што яшчэ больш адцягвацца што я выдалены з слайда. 664 00:30:27,690 --> 00:30:30,930 Але давайце паглядзім, што гэта Праграма здольная сказаць нам. 665 00:30:30,930 --> 00:30:34,800 Ён здольны распавядаць нам рэчы як несапраўднай запісу памерам 4. 666 00:30:34,800 --> 00:30:38,020 Іншымі словамі, калі вы дакранаецеся памяць, у прыватнасці 4 байт памяці 667 00:30:38,020 --> 00:30:40,350 што вы не павінны мець, Valgrind магу сказаць вам, што. 668 00:30:40,350 --> 00:30:41,660 Няправільны запісу памерам 4. 669 00:30:41,660 --> 00:30:43,640 Вы закранулі чатыры байта што вы не павінны мець. 670 00:30:43,640 --> 00:30:44,840 Дзе ты гэта зрабіў? 671 00:30:44,840 --> 00:30:45,900 Гэта прыгажосць. 672 00:30:45,900 --> 00:30:50,000 Кропка памяці з лініі 21, дзе вас аблажаліся, і менавіта таму гэта карысна. 673 00:30:50,000 --> 00:30:53,410 Многае, як GDB, ён можа дапамагчы пазначыць вам на памылкі фактычнага. 674 00:30:53,410 --> 00:30:57,170 >> Цяпер, гэты трохі больш шматслоўны, калі не блытаю. 675 00:30:57,170 --> 00:31:01,307 40 байт 1 блокаў, безумоўна, страцілі ў страты запісу 1 з 1. 676 00:31:01,307 --> 00:31:02,140 Што гэта азначае? 677 00:31:02,140 --> 00:31:05,920 Ну, гэта проста азначае, што вы прасілі 40 байт і ты ніколі не даў яго назад. 678 00:31:05,920 --> 00:31:08,930 Вы назвалі Таноса ці вы назваць GetString і аперацыйная сістэма 679 00:31:08,930 --> 00:31:12,450 ня даў вам 40 байт, але вы ніколі не вызваленыя або вызваленыя, што памяць, 680 00:31:12,450 --> 00:31:15,400 і быць справядлівымі, мы ніколі не паказваем Вы, як аддаць памяць. 681 00:31:15,400 --> 00:31:17,910 Аказваецца, ёсць супер простая функцыя называецца свабодным. 682 00:31:17,910 --> 00:31:21,170 Прымае адзін аргумент, рэч Вы хочаце, каб вызваліць або аддаць, 683 00:31:21,170 --> 00:31:23,430 але 40 байт, па-відаць, у гэтай праграме 684 00:31:23,430 --> 00:31:27,300 былі страчаныя ў радку 20 памяці кропка гр. 685 00:31:27,300 --> 00:31:28,650 >> Такім чынам, давайце паглядзім гэтую праграму. 686 00:31:28,650 --> 00:31:31,020 Гэта супер бескарысна. 687 00:31:31,020 --> 00:31:33,980 Гэта толькі дэманструе гэта канкрэтная памылка. 688 00:31:33,980 --> 00:31:34,920 Такім чынам, давайце зірнем. 689 00:31:34,920 --> 00:31:39,920 Вось асноўныя і галоўныя, апавяшчэнне, званкі функцыя называецца F, а затым вяртаецца. 690 00:31:39,920 --> 00:31:41,550 Так што не ўсё, што цікава. 691 00:31:41,550 --> 00:31:42,664 Што е рабіць? 692 00:31:42,664 --> 00:31:44,330 Звярніце ўвагу, я не стаў з прататыпам. 693 00:31:44,330 --> 00:31:46,520 Я хацеў, каб захаваць код як мага менш. 694 00:31:46,520 --> 00:31:49,530 Так што я паклаў п вышэй асноўнай і гэта нармальна, вядома, 695 00:31:49,530 --> 00:31:51,500 для кароткіх праграм, як гэта. 696 00:31:51,500 --> 00:31:56,910 Так е нічога не вяртае і робіць не ўзяць што-небудзь, але гэта зрабіць. 697 00:31:56,910 --> 00:31:59,620 Гэта заяўляе, падобна у прыкладзе Binky, 698 00:31:59,620 --> 00:32:02,682 паказальнік называецца х, што адбываецца захоўваць адрас у міжнар. 699 00:32:02,682 --> 00:32:03,890 Дык вось левы бок. 700 00:32:03,890 --> 00:32:07,230 У ангельскай мове, што з'яўляецца Правая рабіць? 701 00:32:07,230 --> 00:32:09,770 Хто-небудзь? 702 00:32:09,770 --> 00:32:13,665 Што гэта робіць для нас? 703 00:32:13,665 --> 00:32:14,651 Да? 704 00:32:14,651 --> 00:32:16,623 >> АЎДЫТОРЫЯ: [неразборліва] раз памер з Int 705 00:32:16,623 --> 00:32:19,175 што ў 10 разоў больш, чым [неразборліва] 706 00:32:19,175 --> 00:32:20,800 Дэвід малая: Добра, і дазвольце мне падвесці вынік. 707 00:32:20,800 --> 00:32:25,480 Так вылучыць досыць месцы для 10 лікаў або 10, што памерам з Int, 708 00:32:25,480 --> 00:32:29,340 гэта чатыры байта, таму ў 10 разоў 4 40, так што з правага боку, што я 709 00:32:29,340 --> 00:32:33,930 выдзелены гэта даць мне 40 байт і захаваць адрас першага байта 710 00:32:33,930 --> 00:32:34,940 у х. 711 00:32:34,940 --> 00:32:38,380 А цяпер, нарэшце, і вось, дзе гэтая праграма глючыць, што 712 00:32:38,380 --> 00:32:41,540 так з лініі 21 на аснове гэтай логікі? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Што здарылася з лініяй 21? 715 00:32:46,280 --> 00:32:46,780 Да? 716 00:32:46,780 --> 00:32:49,550 АЎДЫТОРЫЯ: Вы не можаце індэкс у х [неразборліва]. 717 00:32:49,550 --> 00:32:50,300 Дэвід малая: Так. 718 00:32:50,300 --> 00:32:52,270 Я не павінен індэкс у х, як, што. 719 00:32:52,270 --> 00:32:53,850 Так сінтаксічна, гэта нармальна. 720 00:32:53,850 --> 00:32:56,990 Што прыемна, гэтак жа, як вам можа ставіцца да імя масіва 721 00:32:56,990 --> 00:33:01,080 як быццам гэта паказальнік, аналагічна Вы можаце лячыць паказальнік як быццам гэта 722 00:33:01,080 --> 00:33:06,425 масіў, і таму я магу сінтаксічна кажуць нешта х кранштэйн, кранштэйны х я, 723 00:33:06,425 --> 00:33:07,800 але 10 з'яўляецца праблематычным. 724 00:33:07,800 --> 00:33:09,096 Чаму? 725 00:33:09,096 --> 00:33:10,910 >> АЎДЫТОРЫЯ: Таму што гэта не ўнутры. 726 00:33:10,910 --> 00:33:12,390 >> Дэвід малая: Гэта не ўнутры гэтага кавалка памяці. 727 00:33:12,390 --> 00:33:15,306 Што найбольшае значэнне я павінен класці ў гэтых квадратных дужках? 728 00:33:15,306 --> 00:33:16,870 Да 9 верасня, 0. 729 00:33:16,870 --> 00:33:18,160 З-за нулявой індэксацыі. 730 00:33:18,160 --> 00:33:20,190 Так ад 0 да 9 будзе ў парадку. 731 00:33:20,190 --> 00:33:23,960 Кранштэйны 10 не добра, і але, нагадаем, аднак, кожны раз, 732 00:33:23,960 --> 00:33:27,017 Я, здаецца, каб паспрабаваць зрабіць CS50 IDE аварыі, набраўшы ў фіктыўных каштоўнасцяў, 733 00:33:27,017 --> 00:33:29,100 гэта не заўсёды супрацоўнічаць, і, сапраўды, часта 734 00:33:29,100 --> 00:33:31,460 пашанцуе толькі таму, што Аперацыйная сістэма не 735 00:33:31,460 --> 00:33:35,467 Вы заўважыце, што ледзь-ледзь прайсці некаторы кавалак памяці, 736 00:33:35,467 --> 00:33:38,300 таму што вы засталіся ў тэхнічна Ваш сегмент, але пра гэта 737 00:33:38,300 --> 00:33:40,940 у класе аперацыйных сістэм, і так нешта накшталт гэтага 738 00:33:40,940 --> 00:33:43,000 можа вельмі лёгка застацца незаўважанымі. 739 00:33:43,000 --> 00:33:48,120 Ваша праграма ніколі не будзе ўрэзацца паслядоўна, але, магчыма адзін раз у некаторы час. 740 00:33:48,120 --> 00:33:50,610 >> І так давайце паспрабуем Valgrind на гэта, і вось 741 00:33:50,610 --> 00:33:52,870 дзе мы перагружаныя па выхадзе на імгненне. 742 00:33:52,870 --> 00:34:00,810 Так што праверку на уцечку памяці Valgrind роўная поўнай памяці кропка слэш. 743 00:34:00,810 --> 00:34:03,040 І вось чаму я абяцаю гэта сьцерці. 744 00:34:03,040 --> 00:34:05,700 Вось тое, што Valgrind, вось што праграміст, некалькі гадоў ago- 745 00:34:05,700 --> 00:34:08,469 вырашыў, што гэта будзе добрая ідэя, для выхаду выглядаць. 746 00:34:08,469 --> 00:34:09,750 Такім чынам, давайце разабрацца ў гэтым. 747 00:34:09,750 --> 00:34:13,120 Так усю дарогу на левай бок без паважнай прычыны 748 00:34:13,120 --> 00:34:16,620 ідэнтыфікатар працэсу праграмы мы проста запусціць, унікальны ідэнтыфікатар 749 00:34:16,620 --> 00:34:18,030 для праграмы мы проста беглі. 750 00:34:18,030 --> 00:34:19,738 Мы выдалілі, што з слайд, але 751 00:34:19,738 --> 00:34:22,190 гэта некаторая карысная інфармацыя тут. 752 00:34:22,190 --> 00:34:24,684 >> Давайце пракруткі да самага верху. 753 00:34:24,684 --> 00:34:25,600 Вось дзе мы пачалі. 754 00:34:25,600 --> 00:34:27,040 Так што гэта не ўсё, што многае выхад. 755 00:34:27,040 --> 00:34:30,429 Вось, што пішуць несапраўдным памер 4 на лініі 21. 756 00:34:30,429 --> 00:34:31,760 Ну, тое, што было 21 лінія? 757 00:34:31,760 --> 00:34:34,500 Лінія 21 была дакладна гэта і ёсць сэнс 758 00:34:34,500 --> 00:34:37,290 што я знаходжуся ў валіднасці пісаць 4 байта, таму што я 759 00:34:37,290 --> 00:34:40,389 спрабуюць паставіць гэты цэлае, які можа быць што заўгодна, 760 00:34:40,389 --> 00:34:42,370 гэта проста адбываецца, каб быць нуля, але я спрабую 761 00:34:42,370 --> 00:34:44,940 пакласці яго на месцы што не належыць мне. 762 00:34:44,940 --> 00:34:50,900 Больш за тое, тут, 40 байт ў адным блокі, безумоўна, страціў у запісе 1. 763 00:34:50,900 --> 00:34:56,500 Гэта таму, што, калі я называю Таноса тут, я ніколі не вызваліць памяць. 764 00:34:56,500 --> 00:34:58,140 >> Так як мы можам гэта выправіць? 765 00:34:58,140 --> 00:35:02,970 Дазвольце мне ісці наперад і быць трохі бяспечней і рабіць там 9, і хай мяне тут бясплатна X. 766 00:35:02,970 --> 00:35:04,820 Гэта новая функцыя на сённяшні дзень. 767 00:35:04,820 --> 00:35:11,520 Калі цяпер я паўторна зрабіць кропкавы памяці рысу, давайце працаваць Valgrind на яго зноў, 768 00:35:11,520 --> 00:35:14,990 павялічыць маё акно і націсніце Enter. 769 00:35:14,990 --> 00:35:16,900 Цяпер, гэта добра. 770 00:35:16,900 --> 00:35:19,590 Яны хаваюць добрыя навіны усяго гэтага выхаду. 771 00:35:19,590 --> 00:35:20,810 Усе блокі кучы былі вольныя. 772 00:35:20,810 --> 00:35:23,604 Мы вернемся да таго, што кучы ёсць, але ніякіх уцечак ня магчыма. 773 00:35:23,604 --> 00:35:25,520 Так што гэта проста яшчэ адзін інструмент для вашага набору інструментаў 774 00:35:25,520 --> 00:35:30,220 з якой вы можаце пачаць зараз знайсці памылкі, як, што. 775 00:35:30,220 --> 00:35:34,532 >> Але давайце паглядзім, што больш можа пайсці не так тут. 776 00:35:34,532 --> 00:35:38,890 Давайце пераход зараз на самай справе вырашыць праблему. 777 00:35:38,890 --> 00:35:42,440 Як у баку, калі гэта пазбавіць трохі блытаніны або напружанасці, 778 00:35:42,440 --> 00:35:43,430 цяпер гэта смешна. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Так. 781 00:35:46,900 --> 00:35:49,040 Гэта вельмі добра. 782 00:35:49,040 --> 00:35:50,890 Таму што паказальнікі адрасы і адрасы 783 00:35:50,890 --> 00:35:53,098 як правіла, па пагадненні напісана шаснаццатковым выглядзе. 784 00:35:53,098 --> 00:35:54,650 Ха-ха, гэта смешна сёння. 785 00:35:54,650 --> 00:35:58,390 Ва ўсякім разе, так што давайце прама цяпер на самай справе вырашыць праблему. 786 00:35:58,390 --> 00:36:00,840 Гэта было супер, супер нізкага ўзроўню да гэтага часу, 787 00:36:00,840 --> 00:36:03,950 і мы можам на самай справе карысна рэчы з гэтых нізкаўзроўневых дэталяў. 788 00:36:03,950 --> 00:36:06,710 >> Такім чынам, мы ўвялі некалькі тыдняў таму паняцце масіва. 789 00:36:06,710 --> 00:36:09,177 Масіў быў добры, таму што цяжка ачысціць наш код 790 00:36:09,177 --> 00:36:11,760 таму што, калі мы хацелі, каб напісаць Праграма з некалькімі студэнтамі 791 00:36:11,760 --> 00:36:15,270 або некалькі імёнаў і дома, і інтэрната і каледжаў, і ўсё, што, 792 00:36:15,270 --> 00:36:19,430 мы маглі б захоўваць усе больш чыста ўнутры масіва. 793 00:36:19,430 --> 00:36:23,039 Але прапанаваць адзін недахоп масіва да гэтага часу. 794 00:36:23,039 --> 00:36:26,080 Нават калі вы не пакутавалі самі у праграме, проста інстынктыўна, 795 00:36:26,080 --> 00:36:30,870 тое, што гэта дрэнна аб масіве, можа быць? 796 00:36:30,870 --> 00:36:32,337 Я чуў некаторыя шумы. 797 00:36:32,337 --> 00:36:34,170 АЎДЫТОРЫЯ: Гэта складана змяніць памер. 798 00:36:34,170 --> 00:36:36,128 Дэвід малая: Цяжка змяніць памер. 799 00:36:36,128 --> 00:36:38,660 Вы не можаце змяніць памер масіва, на самай справе, як такія 800 00:36:38,660 --> 00:36:43,040 у C. Вы можаце вылучыць яшчэ адзін масіў, перамясціць усё, што ад старога 801 00:36:43,040 --> 00:36:45,380 у новае, і ў цяперашні час ёсць некаторы дадатковае прастору, 802 00:36:45,380 --> 00:36:47,469 але гэта не як мова, як Java або Python 803 00:36:47,469 --> 00:36:49,760 або любую колькасць іншых мовы, з якімі некаторыя з вас 804 00:36:49,760 --> 00:36:52,070 можа быць знакам дзе вы можна проста працягваць дадаваць рэчы 805 00:36:52,070 --> 00:36:53,930 млоснасці да канца масіва. 806 00:36:53,930 --> 00:36:57,880 Калі ў вас ёсць масіў Памер 6, гэта значыць яго памер, 807 00:36:57,880 --> 00:37:01,970 і так шмат, як раней ідэя якія маюць буфер пэўнага памеру, 808 00:37:01,970 --> 00:37:05,940 вы павінны здагадацца з варот які памер вы хочаце быць? 809 00:37:05,940 --> 00:37:07,880 Калі вы адгадаеце занадта вялікі, вы марнуеце прастору. 810 00:37:07,880 --> 00:37:10,950 Калі вы адгадаеце занадта малы, вам не можа захоўваць гэтыя дадзеныя, па меншай меры, 811 00:37:10,950 --> 00:37:12,940 без шмат працы. 812 00:37:12,940 --> 00:37:18,180 >> Такім чынам, сёння дзякуючы паказальнікаў, мы можам пачаць шыць разам наш уласны звычай 813 00:37:18,180 --> 00:37:20,989 структуры дадзеных, і ў Тое, тут што-то 814 00:37:20,989 --> 00:37:23,030 што выглядае крыху больш загадкавыя на першы погляд, 815 00:37:23,030 --> 00:37:26,440 але гэта тое, што мы называем звязаны Спіс, і яго імя роду сумуе 816 00:37:26,440 --> 00:37:26,940 гэта. 817 00:37:26,940 --> 00:37:29,550 Гэта спіс лікаў, або ў гэты выпадак, спіс нумароў, 818 00:37:29,550 --> 00:37:33,480 але гэта можа быць спіс што-небудзь, але гэта звязана разам шляхам стрэлак, 819 00:37:33,480 --> 00:37:36,380 і проста зрабіць здагадку з тым, што тэхніка 820 00:37:36,380 --> 00:37:38,310 мы збіраемся, каб мець магчымасць пашыць разам, 821 00:37:38,310 --> 00:37:42,540 накшталт папкорна з разьбой, звязаны спісы прастакутнікі тут? 822 00:37:42,540 --> 00:37:43,936 Яго нумара? 823 00:37:43,936 --> 00:37:45,560 Што функцыя асноўны мову? 824 00:37:45,560 --> 00:37:46,350 >> АЎДЫТОРЫЯ: Паказальнік. 825 00:37:46,350 --> 00:37:47,308 >> Дэвід малая: Паказальнік. 826 00:37:47,308 --> 00:37:51,700 Такім чынам, кожны з гэтых стрэл тут уяўляе паказальнік або проста адрас. 827 00:37:51,700 --> 00:37:54,590 Такім чынам, іншымі словамі, калі я хачу захоўваць спіс нумароў, 828 00:37:54,590 --> 00:37:59,040 Я не магу проста захоўваць яго, калі я хачу здольнасць павялічвацца і памяншацца 829 00:37:59,040 --> 00:38:00,990 мой структура дадзеных у масіве. 830 00:38:00,990 --> 00:38:03,000 Таму мне трэба, каб мець трохі больш вытанчанасць, 831 00:38:03,000 --> 00:38:05,720 але заўважыць, што гэта карціна выгляд мяркуе 832 00:38:05,720 --> 00:38:08,650 што калі вы толькі што атрымалі маленькія тэмы падлучэння ўсе разам, 833 00:38:08,650 --> 00:38:13,100 верагодна, гэта не так складана зрабіць прастору паміж двума гэтымі прастакутнікамі 834 00:38:13,100 --> 00:38:16,750 ці два з гэтых вузлоў, як мы пачнем называючы іх, пакласці ў новы вузел, 835 00:38:16,750 --> 00:38:19,547 а затым з нейкай новай ніткі, проста канаву тры вузла разам, 836 00:38:19,547 --> 00:38:22,880 першы, апошні, і той, што вы толькі што ўставілі ў сярэдзіну. 837 00:38:22,880 --> 00:38:26,000 >> І сапраўды звязаны спіс, у адрозненне ад масіва, з'яўляецца дынамічным. 838 00:38:26,000 --> 00:38:27,840 Ён можа расці і можа скарачацца і вы не 839 00:38:27,840 --> 00:38:32,434 павінны ведаць, ці сыходу загадзя, як шмат дадзеных вы збіраецеся быць захоўвання, 840 00:38:32,434 --> 00:38:35,600 але, аказваецца, мы павінны быць трохі асцярожныя аб тым, як ажыццявіць гэта. 841 00:38:35,600 --> 00:38:39,070 Такім чынам, спачатку давайце разгледзім, як мы рэалізуем адзін з гэтых маленькіх прастакутнікаў. 842 00:38:39,070 --> 00:38:40,690 Гэта лёгка рэалізаваць Int. 843 00:38:40,690 --> 00:38:44,000 Вы проста кажаце Int N, а затым Вы атрымліваеце 4 байта для Int, 844 00:38:44,000 --> 00:38:49,089 але як я магу атрымаць Int, назавем яго N, а затым паказальнік, давайце называць яго побач. 845 00:38:49,089 --> 00:38:50,880 Мы маглі б назваць гэта рэчы ўсё, што мы хочам 846 00:38:50,880 --> 00:38:53,590 але мне трэба структуру карыстацкіх дадзеных. 847 00:38:53,590 --> 00:38:54,257 Да? 848 00:38:54,257 --> 00:38:57,020 >> АЎДЫТОРЫЯ: Ампэрсанд [неразборліва]. 849 00:38:57,020 --> 00:39:00,940 >> Дэвід малая: Так Ампэрсанд мы будзем выкарыстоўваць для атрымаць адрас вузла патэнцыйна. 850 00:39:00,940 --> 00:39:02,740 Але нам патрэбны яшчэ Функцыя С у парадак 851 00:39:02,740 --> 00:39:06,700 каб даць мне магчымасць ствараць гэты звычай прастакутнік, гэты звычай 852 00:39:06,700 --> 00:39:08,919 Пераменная, калі хочаце, у памяці. 853 00:39:08,919 --> 00:39:09,710 Залы: структура. 854 00:39:09,710 --> 00:39:10,626 Дэвід малая: а структурай. 855 00:39:10,626 --> 00:39:14,310 Нагадаем, на мінулым тыдні, мы ўвялі структура, гэта адносна простае ключавое слова, 856 00:39:14,310 --> 00:39:16,254 што дазваляе нам зрабіць такія рэчы, як гэта. 857 00:39:16,254 --> 00:39:18,420 З не прыйшоў з дадзеным Структура называецца студэнта. 858 00:39:18,420 --> 00:39:22,190 Ён пастаўляецца з Int і плаваць і гольца і напрыклад, але ён не прыходзіць са студэнтамі, 859 00:39:22,190 --> 00:39:26,750 але мы можам стварыць тып дадзеных студэнтам, студэнт структура, з гэтым сінтаксісам 860 00:39:26,750 --> 00:39:27,250 тут. 861 00:39:27,250 --> 00:39:28,350 І вы ўбачыце, што гэта зноў і зноў. 862 00:39:28,350 --> 00:39:30,426 Так што не турбуйцеся аб запамінання слоў, 863 00:39:30,426 --> 00:39:33,300 але ключавое слова, што гэта важна, толькі той факт, што мы сказалі, структура 864 00:39:33,300 --> 00:39:37,590 і тады мы называлі гэта студэнт і ўнутры студэнта было імя і дом 865 00:39:37,590 --> 00:39:39,390 або агульны нумар ці таму падобнае. 866 00:39:39,390 --> 00:39:41,980 >> І так вось сёння, давайце прапаноўваць гэта. 867 00:39:41,980 --> 00:39:45,240 Я дадаў некалькі слоў, але калі я хачу ажыццявіць гэты прастакутнік, што гэта 868 00:39:45,240 --> 00:39:48,440 атрымаў адначасова Int і А паказальнік, вы ведаеце, што я 869 00:39:48,440 --> 00:39:51,540 збіраецца абвясціць на структуру пад назвай вузел. 870 00:39:51,540 --> 00:39:55,630 Я таксама, унутры яго, хачу сказаць, што вузел, гэты прастакутнік, мае Int 871 00:39:55,630 --> 00:39:59,730 і мы будзем называць яго п і яна мае наступны паказальнік. 872 00:39:59,730 --> 00:40:02,540 І гэта крыху шматслоўны, але калі вы думаеце пра гэта, 873 00:40:02,540 --> 00:40:07,300 стрэлкі, якія былі на малюнку момант назад, якога тыпу дадзеных? 874 00:40:07,300 --> 00:40:12,330 Дзе кожны з гэтых стрэлак паказвае які тып структуры дадзеных? 875 00:40:12,330 --> 00:40:14,332 Гэта не паказваючы толькі на міжнар на сабе. 876 00:40:14,332 --> 00:40:16,165 Гэта паказвае на Уся прастакутная рэч 877 00:40:16,165 --> 00:40:18,720 і што прастакутная рэч, мы сказалі, называецца вузлом. 878 00:40:18,720 --> 00:40:21,720 І такім чынам, мы збольшага павінны рэкурсіўна вызначыць гэта такое 879 00:40:21,720 --> 00:40:26,270 што вузел, мы будзем казаць, будзе ўтрымліваць Int пад назвай п 880 00:40:26,270 --> 00:40:31,070 і паказальнік называецца побач і тып структуры дадзеных, да якіх 881 00:40:31,070 --> 00:40:35,770 што паказальнік паказвае, па-відаць будзе структура вузла. 882 00:40:35,770 --> 00:40:41,550 >> Так што гэта прыкра, шматслоўным і проста быць педантычным, 883 00:40:41,550 --> 00:40:44,100 прычына, чаму мы не можам проста сказаць, што гэта, што, шчыра кажучы 884 00:40:44,100 --> 00:40:46,860 выглядае нашмат больш чытэльным, таму, што нагадаем, што C чытання 885 00:40:46,860 --> 00:40:48,710 рэчы зверху ўніз, злева направа. 886 00:40:48,710 --> 00:40:54,120 Гэта не пакуль мы не атрымаем кропку з коскі што вузел ключавое слова на самай справе існуе. 887 00:40:54,120 --> 00:40:57,980 Так што, калі мы хочам мець такую цыклічны спасылкі ўнутры дадзеных 888 00:40:57,980 --> 00:41:02,120 Структура, што мы павінны зрабіць гэта, калі мы кажам структуры вузла ў верхняй частцы, якая 889 00:41:02,120 --> 00:41:06,770 дае нам доўгі шлях апісання гэтага рэч, то ўсярэдзіне мы гаворым структуры вузла, 890 00:41:06,770 --> 00:41:09,560 а затым у самы апошні лініі мы кажам, усё ў парадку, З, дарэчы, 891 00:41:09,560 --> 00:41:12,060 проста патэлефануеце ўвесь гэты пракляты што вузел і спыніць 892 00:41:12,060 --> 00:41:14,360 выкарыстоўваючы ключавое слова-структуру ў цэлым. 893 00:41:14,360 --> 00:41:18,030 Так што гэта проста свайго роду сінтаксічны Хітрасць у канчатковым рахунку, дазваляе, што нам стварыць 894 00:41:18,030 --> 00:41:21,370 тое, што выглядае гэтак жа, як гэта. 895 00:41:21,370 --> 00:41:25,010 >> Так што, калі мы выкажам здагадку цяпер, мы можам рэалізаваць гэтую рэч у C, 896 00:41:25,010 --> 00:41:28,040 Як мы на самай справе пачаць абыход гэтага? 897 00:41:28,040 --> 00:41:32,360 Ну, на самай справе, усё, што мы павінны зрабіць, гэта ітэрацыі злева направа і проста 898 00:41:32,360 --> 00:41:35,960 выгляд ўставіць вузлы або выдаляць вузлы або шукаць рэчы там, дзе мы хочам, 899 00:41:35,960 --> 00:41:39,560 але каб зрабіць гэта, давайце ісці наперад і зрабіць рэчы крыху больш рэальным, таму што гэта 900 00:41:39,560 --> 00:41:42,560 быў супер нізкага ўзроўню да гэтага часу. 901 00:41:42,560 --> 00:41:45,700 Хто літаральна хацелі б быць першым? 902 00:41:45,700 --> 00:41:46,200 ДОБРА. 903 00:41:46,200 --> 00:41:47,092 Давай до. 904 00:41:47,092 --> 00:41:47,800 Ваша імя? 905 00:41:47,800 --> 00:41:48,499 >> Дэвід: Дэвід. 906 00:41:48,499 --> 00:41:49,290 Дэвід малая: Дэвід. 907 00:41:49,290 --> 00:41:49,998 Вельмі прыемна. 908 00:41:49,998 --> 00:41:50,960 Я таксама. 909 00:41:50,960 --> 00:41:52,450 Добра. 910 00:41:52,450 --> 00:41:53,990 І нам спатрэбіцца шэраг 9. 911 00:41:53,990 --> 00:41:55,240 Не так добра, як па-першае, магчыма. 912 00:41:55,240 --> 00:41:56,430 ОК, нумар 9. 913 00:41:56,430 --> 00:41:59,667 Шэраг 17, калі ласка. 914 00:41:59,667 --> 00:42:01,000 Дазвольце мне вярнуцца крыху далей. 915 00:42:01,000 --> 00:42:03,980 Колькасць 22, калі ласка, і як пра далей таму 916 00:42:03,980 --> 00:42:06,344 калі я бачу якіх-небудзь рукі з усімі святла ці не. 917 00:42:06,344 --> 00:42:08,010 Хтосьці падахвоціўся быць прама там. 918 00:42:08,010 --> 00:42:08,968 Вы хочаце, каб прыдумаць? 919 00:42:08,968 --> 00:42:10,450 Ваша перадплечча прымусова ідзе ўверх. 920 00:42:10,450 --> 00:42:12,340 ОК, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 спускаецца. 923 00:42:15,120 --> 00:42:18,450 Нехта яшчэ хацелі б forcefully-- Давай да. 924 00:42:18,450 --> 00:42:21,030 Фактычны грамадскіх пачатках. 925 00:42:21,030 --> 00:42:23,330 >> Так вельмі хутка, калі вы, хлопцы, маглі б арганізаваць 926 00:42:23,330 --> 00:42:26,550 самі проста хацеў вузлы на экране. 927 00:42:26,550 --> 00:42:27,510 Дзякуй. 928 00:42:27,510 --> 00:42:29,234 І вы будзеце 26. 929 00:42:29,234 --> 00:42:30,650 Усе правільныя і хуткія ўвядзення. 930 00:42:30,650 --> 00:42:32,139 Так што я Дэвід, і вы таксама? 931 00:42:32,139 --> 00:42:32,680 Дэвід: Дэвід. 932 00:42:32,680 --> 00:42:33,721 Дэвід малая: А вы? 933 00:42:33,721 --> 00:42:34,229 Джэйк: Джэйк. 934 00:42:34,229 --> 00:42:34,729 ГУП: Сью. 935 00:42:34,729 --> 00:42:35,229 АЛЕКС: Алекс. 936 00:42:35,229 --> 00:42:36,475 Рафаэль: Рафаэль. 937 00:42:36,475 --> 00:42:37,100 Тэйлар: Тэйлар. 938 00:42:37,100 --> 00:42:37,466 Дэвід малая: Тэйлар. 939 00:42:37,466 --> 00:42:37,590 Выдатна. 940 00:42:37,590 --> 00:42:39,810 Такім чынам, гэтыя нашы валанцёры сёння і ісці наперад 941 00:42:39,810 --> 00:42:43,090 і зрух мала што шлях, і проста ісці наперад і трымаць 942 00:42:43,090 --> 00:42:47,024 правядзенне вашыя нумары, як вы ці вашы Першы прыкмета і левай рукой, 943 00:42:47,024 --> 00:42:48,940 ісці наперад і проста рэалізаваць гэтыя стрэлкі, толькі 944 00:42:48,940 --> 00:42:51,360 так што ваша левая рука літаральна паказваючы на ​​тое, што вы павінны паказаць 945 00:42:51,360 --> 00:42:54,610 на, і даць сабе некаторую пакой так, што мы можам наглядна ўбачыць вашыя рукі на самай справе 946 00:42:54,610 --> 00:42:58,120 паказваючы, і вы можаце проста паказаць роду на зямлю ў парадку. 947 00:42:58,120 --> 00:43:03,040 >> Так вось у нас ёсць звязаны спіс аднаго, два, тры, чатыры, пяць вузлоў на пачатковым этапе, 948 00:43:03,040 --> 00:43:05,860 і звярніце ўвагу, у нас ёсць гэтая спецыяльная паказальнік на пачатак, хто 949 00:43:05,860 --> 00:43:09,770 ключавым, таму што мы павінны адсочваць з усяго спісу даўжыні нейкім чынам. 950 00:43:09,770 --> 00:43:13,590 Гэтыя хлопцы, нават калі яны застаюцца направа, спіной да спіны ў памяці, 951 00:43:13,590 --> 00:43:15,950 яны сапраўды могуць быць у любым месцы ў памяці кампутара. 952 00:43:15,950 --> 00:43:18,240 Такім чынам, гэтыя хлопцы маглі б быць стоячы на ​​любым этапе 953 00:43:18,240 --> 00:43:20,960 і гэта нармальна, так доўга, як яны на самай справе, паказваючы адзін на аднаго, 954 00:43:20,960 --> 00:43:22,770 але трымаць рэчы чысты і просты, мы будзем 955 00:43:22,770 --> 00:43:25,728 проста звярнуць іх злева направа, як гэта, але не можа быць масіўныя прамежкі 956 00:43:25,728 --> 00:43:26,790 паміж гэтымі вузламі. 957 00:43:26,790 --> 00:43:30,710 >> Цяпер, калі я хачу на самай справе ўставіць некаторыя новае значэнне, давайце ісці наперад і рабіць гэта. 958 00:43:30,710 --> 00:43:33,720 У нас ёсць магчымасць у цяперашні час выбраць іншы вузел. 959 00:43:33,720 --> 00:43:39,820 Скажыце давайце пачнем з mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Ці будзе хто-супраць таго Таноса? 961 00:43:41,320 --> 00:43:42,280 ОК, давай да. 962 00:43:42,280 --> 00:43:42,992 Ваша імя? 963 00:43:42,992 --> 00:43:43,700 РАДУГА: Вясёлка. 964 00:43:43,700 --> 00:43:44,050 Дэвід малая: Вясёлка? 965 00:43:44,050 --> 00:43:44,810 Добра. 966 00:43:44,810 --> 00:43:46,600 Маллок Вясёлка. 967 00:43:46,600 --> 00:43:47,450 Давай до. 968 00:43:47,450 --> 00:43:51,610 Так што цяпер мы павінны спытаць сябе, алгарытмічных, дзе мы можам паставіць 55. 969 00:43:51,610 --> 00:43:53,610 Такім чынам, усе мы ведаем ,, відавочна, дзе яна, верагодна, 970 00:43:53,610 --> 00:43:55,401 належыць, калі мы спрабуем каб гэтая сартуюцца 971 00:43:55,401 --> 00:43:58,299 і калі вы, хлопцы, можа прыняць адно крок назад, таму мы не ўпасці 972 00:43:58,299 --> 00:43:59,590 этап, што было б выдатна. 973 00:43:59,590 --> 00:44:01,420 Так на самой справе, Вясёлка, пачаць тут са мной, 974 00:44:01,420 --> 00:44:04,200 таму што мы, як кампутар цяпер можа ўбачыць толькі адну зменную адначасова. 975 00:44:04,200 --> 00:44:05,190 Такім чынам, калі гэта першы вузел. 976 00:44:05,190 --> 00:44:07,160 Звярніце ўвагу, што ён не з'яўляецца вузлом, ён проста паказальнік, 977 00:44:07,160 --> 00:44:10,270 і вось чаму ён звяртаецца, каб быць толькі памер паказальніка, а не 978 00:44:10,270 --> 00:44:11,780 адзін з тых поўных прастакутнікаў. 979 00:44:11,780 --> 00:44:16,650 Такім чынам, мы збіраемся, каб праверыць адзін на ітэрацыя 55 менш, чым 9? 980 00:44:16,650 --> 00:44:17,150 Няма. 981 00:44:17,150 --> 00:44:19,060 Ёсць 55 менш 17? 982 00:44:19,060 --> 00:44:19,720 Няма. 983 00:44:19,720 --> 00:44:20,800 Менш за 22? 984 00:44:20,800 --> 00:44:22,020 Менш за 26? 985 00:44:22,020 --> 00:44:23,390 Менш за 34? 986 00:44:23,390 --> 00:44:25,890 І вось цяпер, відавочна, Вясёлка належыць у канцы. 987 00:44:25,890 --> 00:44:27,270 Такім чынам, каб было ясна, і тое, што быў ваша імя, Тэйлар? 988 00:44:27,270 --> 00:44:27,895 >> Тэйлар: Тэйлар. 989 00:44:27,895 --> 00:44:32,510 Дэвід малая: Так сярод Тэйлар левая рука і рукі вясёлкі тут, 990 00:44:32,510 --> 00:44:38,324 Чыя рука павінна паказваць на тое, што ў Каб ўставіць 55 у гэтым спісе? 991 00:44:38,324 --> 00:44:39,240 Што нам трэба рабіць? 992 00:44:39,240 --> 00:44:39,700 Да? 993 00:44:39,700 --> 00:44:41,140 >> АЎДЫТОРЫЯ: ручная Тэйлара трэба паказаць левай. 994 00:44:41,140 --> 00:44:41,680 >> Дэвід малая: Дакладна. 995 00:44:41,680 --> 00:44:43,800 Так ўстаўцы вузла ў канцы спісу 996 00:44:43,800 --> 00:44:47,140 даволі проста, таму што Тэйлар проста павінен паказваць, а не на зямлі 997 00:44:47,140 --> 00:44:49,640 ці мы будзем называць яго пустым, нуль з'яўляецца свайго роду адсутнасць 998 00:44:49,640 --> 00:44:51,640 паказальніка або спецыяльны нулявы паказальнік, вы 999 00:44:51,640 --> 00:44:53,740 будзем паказваць з левай руку на Вясёлка Вясёлка, а затым, 1000 00:44:53,740 --> 00:44:55,910 дзе, калі ваш левы рука, верагодна, паказваюць? 1001 00:44:55,910 --> 00:44:56,570 Ўніз 1002 00:44:56,570 --> 00:45:00,140 Гэта не добра, калі яе рука накшталт ўказваць тут або ад свайго роду любы 1003 00:45:00,140 --> 00:45:00,640 якім чынам. 1004 00:45:00,640 --> 00:45:02,407 Гэта будзе разглядацца значэнне смецця, 1005 00:45:02,407 --> 00:45:04,240 але калі яна паказвае на некаторыя вядомыя значэнне, мы будзем 1006 00:45:04,240 --> 00:45:07,360 называюць яго нуля або нулявы, гэта нармальна таму што ў нас у гэтым тэрмін 1007 00:45:07,360 --> 00:45:09,390 і мы ведаем, што спіс у цяперашні час завершана. 1008 00:45:09,390 --> 00:45:11,550 >> Так што яшчэ адзін адносна просты выпадак? 1009 00:45:11,550 --> 00:45:13,125 Ці можам мы Таноса 5? 1010 00:45:13,125 --> 00:45:14,010 Давай до. 1011 00:45:14,010 --> 00:45:14,782 Ваша імя? 1012 00:45:14,782 --> 00:45:15,490 Ціфані: Ціфані. 1013 00:45:15,490 --> 00:45:16,000 Дэвід малая: Я прашу прабачэння? 1014 00:45:16,000 --> 00:45:16,470 Ціфані: Ціфані. 1015 00:45:16,470 --> 00:45:16,880 Дэвід малая: Ціфані. 1016 00:45:16,880 --> 00:45:17,110 Добра. 1017 00:45:17,110 --> 00:45:19,071 Ціфані была malloced са значэннем 5. 1018 00:45:19,071 --> 00:45:19,570 Давай до. 1019 00:45:19,570 --> 00:45:23,820 Гэты параўнальна лёгка занадта, але давайце разгледзім парадак аперацый у цяперашні час. 1020 00:45:23,820 --> 00:45:25,820 Гэта было даволі лёгка з Тэйларам у канцы. 1021 00:45:25,820 --> 00:45:30,302 Нумар 5, вядома, менш, чым 9, і таму мы павінны Давіда, у нас ёсць Ціфані, 1022 00:45:30,302 --> 00:45:31,260 і тое, што было ваша імя? 1023 00:45:31,260 --> 00:45:31,680 >> Джэйк: Джэйк. 1024 00:45:31,680 --> 00:45:32,470 >> Дэвід малая: Джэйк. 1025 00:45:32,470 --> 00:45:34,300 Ціфані, Джэйк, і Дэвід. 1026 00:45:34,300 --> 00:45:36,580 Чыя рука павінна быць абноўлена ў першую чаргу? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Што вы хочаце зрабіць тут? 1029 00:45:40,590 --> 00:45:45,244 Там ёсць пара магчымых шляхоў, але ёсць таксама адзін або больш няправільныя спосабы. 1030 00:45:45,244 --> 00:45:46,620 >> АЎДЫТОРЫЯ: Пачніце з крайняга левага. 1031 00:45:46,620 --> 00:45:47,800 >> Дэвід малая: Пачніце з крайняга левага. 1032 00:45:47,800 --> 00:45:49,008 Хто крайні левы тут тады? 1033 00:45:49,008 --> 00:45:49,700 АЎДЫТОРЫЯ: Па-першае. 1034 00:45:49,700 --> 00:45:50,366 >> Дэвід малая: ОК. 1035 00:45:50,366 --> 00:45:53,781 Так што пачніце з першай і дзе вы хочаце абнавіць рукі Давіда, каб быць? 1036 00:45:53,781 --> 00:45:54,780 АЎДЫТОРЫЯ: Да 5. 1037 00:45:54,780 --> 00:45:55,446 Дэвід малая: ОК. 1038 00:45:55,446 --> 00:45:59,026 Давід, кропка, у пяці або Ціфані тут, а цяпер? 1039 00:45:59,026 --> 00:46:01,072 >> АЎДЫТОРЫЯ: Ціфані паказвае на 9? 1040 00:46:01,072 --> 00:46:04,030 Дэвід малая: Цалкам, за выключэннем таго, Бинки Кіраўнік толькі выгляд ўпаў, ці не так? 1041 00:46:04,030 --> 00:46:06,820 Таму што тое, што здарылася з гэтая карціна літаральна? 1042 00:46:06,820 --> 00:46:08,070 АЎДЫТОРЫЯ: Нішто не паказвае. 1043 00:46:08,070 --> 00:46:09,945 Дэвід малая: Нішто не з'яўляецца паказваючы на ​​Джэйка ў цяперашні час. 1044 00:46:09,945 --> 00:46:13,360 Мы літаральна асірацеў 9 і 17, і мы літаральна 1045 00:46:13,360 --> 00:46:18,450 ўцечка ўся гэтая памяць, таму што абнаўлення руку Давіда першае, гэта 1046 00:46:18,450 --> 00:46:21,660 ў парадку, паколькі гэта правільна паказваючы на ​​Ціфані зараз, 1047 00:46:21,660 --> 00:46:25,410 але калі ніхто не меў прадбачліва паказваюць на Джэйка, 1048 00:46:25,410 --> 00:46:27,490 Затым мы страцілі Сукупнасць гэтага спісу. 1049 00:46:27,490 --> 00:46:28,200 Такім чынам, давайце адмяніць. 1050 00:46:28,200 --> 00:46:30,950 Так што гэта добрая рэч, каб спатыкнуцца, але давайце выправім сучаснасць. 1051 00:46:30,950 --> 00:46:33,624 Тое, што мы павінны зрабіць у першую чаргу, а? 1052 00:46:33,624 --> 00:46:34,124 Да? 1053 00:46:34,124 --> 00:46:35,791 >> АЎДЫТОРЫЯ: Ціфані павінна паказваць на 9? 1054 00:46:35,791 --> 00:46:37,582 Дэвід малая: я не магу атрымаць так блізка да вас. 1055 00:46:37,582 --> 00:46:38,720 Хто павінен паказаць на 9? 1056 00:46:38,720 --> 00:46:39,220 >> АЎДЫТОРЫЯ: Ціфані. 1057 00:46:39,220 --> 00:46:39,390 >> Дэвід малая: Добра. 1058 00:46:39,390 --> 00:46:41,200 Так Ціфані павінна першая кропка на 9. 1059 00:46:41,200 --> 00:46:43,550 Так Ціфані павінны прыняць на аднолькавым значэннем 1060 00:46:43,550 --> 00:46:45,820 Давіду, які, здаецца, залішнім на імгненне, 1061 00:46:45,820 --> 00:46:48,820 але гэта нармальна, таму што цяпер, па-другое крок, мы можам абнавіць руку Давіда 1062 00:46:48,820 --> 00:46:52,680 каб паказаць на Ціфані, а затым, калі мы толькі збольшага ачысціць рэчы 1063 00:46:52,680 --> 00:46:55,740 як быццам гэта свайго роду вясны-як, вось гэта правільны ўстаўкі. 1064 00:46:55,740 --> 00:46:56,700 Так выдатна. 1065 00:46:56,700 --> 00:46:57,970 Так што цяпер мы амаль там. 1066 00:46:57,970 --> 00:47:01,075 Давайце ўставіць адзін фінал значэнне як значэнне 20. 1067 00:47:01,075 --> 00:47:03,010 Калі б мы маглі Таноса адзін заключны добраахвотнікам? 1068 00:47:03,010 --> 00:47:04,140 Давай до. 1069 00:47:04,140 --> 00:47:06,224 Так што гэта адно крыху больш складана. 1070 00:47:06,224 --> 00:47:08,390 Але на самой справе, код мы пісаць, хоць і ў вуснай форме, 1071 00:47:08,390 --> 00:47:10,610 гэта ўсё роўна, што кучу з, калі ўмовы зараз, праўда? 1072 00:47:10,610 --> 00:47:12,318 Мы мелі стан праверкі, калі ён належыць 1073 00:47:12,318 --> 00:47:13,840 У рэшце рэшт, можа быць, з самага пачатку. 1074 00:47:13,840 --> 00:47:15,940 Мы павінны нейкі цыкл у знайсці месца ў сярэдзіне. 1075 00:47:15,940 --> 00:47:17,400 Так давайце зробім гэта з тым, што ваша імя? 1076 00:47:17,400 --> 00:47:17,700 >> Эрык: Эрык. 1077 00:47:17,700 --> 00:47:18,340 >> Дэвід малая: Эрык? 1078 00:47:18,340 --> 00:47:18,660 Эрык. 1079 00:47:18,660 --> 00:47:19,368 Вельмі прыемна. 1080 00:47:19,368 --> 00:47:20,490 Такім чынам, мы маем 20. 1081 00:47:20,490 --> 00:47:21,220 Менш за пяць? 1082 00:47:21,220 --> 00:47:21,530 Няма. 1083 00:47:21,530 --> 00:47:22,160 Менш за дзевяць? 1084 00:47:22,160 --> 00:47:22,410 Няма. 1085 00:47:22,410 --> 00:47:23,050 Менш за 17? 1086 00:47:23,050 --> 00:47:23,550 Няма. 1087 00:47:23,550 --> 00:47:23,740 ДОБРА. 1088 00:47:23,740 --> 00:47:25,701 Ён належыць тут і Вашы імёны зноў ёсць? 1089 00:47:25,701 --> 00:47:26,200 ГУП: Сью. 1090 00:47:26,200 --> 00:47:26,880 Дэвід малая: Сью. 1091 00:47:26,880 --> 00:47:27,379 АЛЕКС: Алекс. 1092 00:47:27,379 --> 00:47:28,790 Дэвід малая: Сью, Алекс, а? 1093 00:47:28,790 --> 00:47:29,290 Эрык: Эрык. 1094 00:47:29,290 --> 00:47:30,120 Дэвід малая: Эрык. 1095 00:47:30,120 --> 00:47:32,140 Чые рукі павінны атрымаць абнаўленне ў першую чаргу? 1096 00:47:32,140 --> 00:47:32,930 >> АЎДЫТОРЫЯ: Эрык. 1097 00:47:32,930 --> 00:47:33,429 ДОБРА. 1098 00:47:33,429 --> 00:47:35,200 Так Эрык павінен паказаць на тое, дзе? 1099 00:47:35,200 --> 00:47:35,930 У 22. 1100 00:47:35,930 --> 00:47:36,430 Добра. 1101 00:47:36,430 --> 00:47:38,180 А цяпер, што будзе далей? 1102 00:47:38,180 --> 00:47:40,800 Сью можа паказваць на Эрыка і цяпер, калі вы, хлопцы, проста 1103 00:47:40,800 --> 00:47:44,077 пацясніцца, які выдатны візуальна, зараз мы зрабілі ўстаўку. 1104 00:47:44,077 --> 00:47:47,160 Дык няхай зараз разгледзім пытанне, але дзякуй так шмат для нашых валанцёраў. 1105 00:47:47,160 --> 00:47:48,090 Вельмі добра зроблена. 1106 00:47:48,090 --> 00:47:50,831 Вы можаце захаваць тыя, калі вам падабаецца. 1107 00:47:50,831 --> 00:47:54,140 І ў нас ёсць выдатны падарунак, калі развітальны вы кожны хацеў узяць стрэс мяч. 1108 00:47:54,140 --> 00:47:56,030 Дазвольце мне перадаць гэта ўніз. 1109 00:47:56,030 --> 00:47:58,430 Так што вынас гэта? 1110 00:47:58,430 --> 00:48:02,430 Гэта, здаецца, дзіўна паколькі мы маем цяпер 1111 00:48:02,430 --> 00:48:06,360 прадставіла альтэрнатывай Масіў, які не так абмежаваныя 1112 00:48:06,360 --> 00:48:07,780 на масіў некаторага фіксаванага памеру. 1113 00:48:07,780 --> 00:48:09,380 Яны могуць расці дынамічна. 1114 00:48:09,380 --> 00:48:13,220 >> Але гэтак жа, як мы бачылі на працягу некалькіх тыдняў мінулае, мы ніколі не атрымаем нічога бясплатна, 1115 00:48:13,220 --> 00:48:15,740 як, безумоўна, ёсць кампраміс тут. 1116 00:48:15,740 --> 00:48:18,890 Так з патэнцыялам росту звязаны Спіс, гэта дынамізм? 1117 00:48:18,890 --> 00:48:21,590 Гэтая здольнасць расці і, шчыра кажучы, мы маглі б зрабіць выдалення 1118 00:48:21,590 --> 00:48:23,570 і мы маглі б сціснуць па меры неабходнасці. 1119 00:48:23,570 --> 00:48:24,710 Якую цану мы плацім? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 У два разы больш прасторы, у першую чаргу. 1122 00:48:30,340 --> 00:48:34,010 Калі вы паглядзіце на карціну, больш не я захоўваць спіс цэлых лікаў. 1123 00:48:34,010 --> 00:48:36,740 Я захоўвання спісу цэлыя плюс паказальнікі. 1124 00:48:36,740 --> 00:48:38,240 Так што я падваенне колькасці прасторы. 1125 00:48:38,240 --> 00:48:40,740 Цяпер, можа быць, гэта не такая вялікую справу 4 байта, 8 байт, 1126 00:48:40,740 --> 00:48:43,160 але гэта, безумоўна, можа дадаць на вялікіх набораў дадзеных. 1127 00:48:43,160 --> 00:48:45,570 Што іншы недахоп? 1128 00:48:45,570 --> 00:48:46,070 Да? 1129 00:48:46,070 --> 00:48:48,010 >> АЎДЫТОРЫЯ: Мы павінны прайсці іх адзін за адным. 1130 00:48:48,010 --> 00:48:48,760 Дэвід малая: Так. 1131 00:48:48,760 --> 00:48:50,260 Мы павінны прайсці іх адзін за адным. 1132 00:48:50,260 --> 00:48:53,860 Вы ведаеце, што мы адмовіліся ад гэтай супер зручная функцыя квадратнага кранштэйна 1133 00:48:53,860 --> 00:48:57,240 абазначэння, больш правільна вядомы як адвольнага доступу, 1134 00:48:57,240 --> 00:48:59,280 дзе мы можам проста скокнуць да асобнага элемента 1135 00:48:59,280 --> 00:49:01,470 але цяпер, калі я да гэтага часу мае добраахвотнікі тут, 1136 00:49:01,470 --> 00:49:04,660 калі б я хацеў, каб знайсці № 22, я не магу проста 1137 00:49:04,660 --> 00:49:06,620 перайсці да кранштэйны-небудзь што-небудзь. 1138 00:49:06,620 --> 00:49:10,530 Я павінен глядзець на спіс, шмат як нашы прыклады пошуку лінейна, 1139 00:49:10,530 --> 00:49:12,260 каб знайсці нумар 22. 1140 00:49:12,260 --> 00:49:14,340 Такім чынам, мы, здаецца, заплацілі цану там. 1141 00:49:14,340 --> 00:49:16,430 Але, тым не менш, мы можам вырашыць іншыя праблемы. 1142 00:49:16,430 --> 00:49:18,587 >> На самай справе, дазвольце мне прадставіць толькі пару візуальныя эфекты. 1143 00:49:18,587 --> 00:49:20,920 Так што, калі вы былі да Сталовая Mather нядаўна, 1144 00:49:20,920 --> 00:49:23,320 вы памятаеце, што іх стэкі падносаў, як гэта, 1145 00:49:23,320 --> 00:49:26,300 мы запазычылі іх з Анненберга перад класам. 1146 00:49:26,300 --> 00:49:28,930 Такім чынам, гэта чарка талерак, хоць, з'яўляецца прадстаўніком на самай справе 1147 00:49:28,930 --> 00:49:30,860 структуры дадзеных кампутарнай навукі. 1148 00:49:30,860 --> 00:49:32,910 Існуе структура дадзеных у інфарматыцы 1149 00:49:32,910 --> 00:49:38,010 Вядома, як стэк, які вельмі прыгожа паддаецца менавіта гэта візуальна. 1150 00:49:38,010 --> 00:49:41,380 Такім чынам, калі кожны з гэтых латкоў ня латок, але, як і шэраг, і я хацеў 1151 00:49:41,380 --> 00:49:45,010 для захоўвання нумары, я можа паставіць адзін тут, 1152 00:49:45,010 --> 00:49:48,320 і я мог бы паставіць іншы сюды, і працягнуць кладку лік 1153 00:49:48,320 --> 00:49:53,180 на верхняй частцы адзін аднаго, і тое, што патэнцыйна карысным пра гэта 1154 00:49:53,180 --> 00:49:55,450 гэта тое, што гэта маецца на ўвазе гэтай структуры дадзеных? 1155 00:49:55,450 --> 00:49:58,045 Які лік я магу выцягнуць у першую чаргу найбольш зручна? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Найбольш нядаўна выказаўся адзін там. 1158 00:50:03,030 --> 00:50:06,430 >> Так што гэта тое, што мы называем ў інфарматыка структура дадзеных ЛИФО. 1159 00:50:06,430 --> 00:50:08,070 Апошні прыйшоў, першы. 1160 00:50:08,070 --> 00:50:10,800 І мы ўбачым, у хуткім часе, чаму што можа быць карысным, але цяпер, 1161 00:50:10,800 --> 00:50:12,200 проста разгледзець ўласнасць. 1162 00:50:12,200 --> 00:50:15,158 І гэта збольшага па-дурному, калі вы думаеце, пра тое, як сталовая гэта робіць. 1163 00:50:15,158 --> 00:50:17,910 Кожны раз, калі яны чыстыя латкі і пакласці свежыя з іх на вяршыні, 1164 00:50:17,910 --> 00:50:22,160 вы маглі б раней чыстая але ў рэшце рэшт вельмі брудны і пыльны 1165 00:50:22,160 --> 00:50:24,360 латок на самым дне калі вы на самой справе ніколі не 1166 00:50:24,360 --> 00:50:26,820 трапіць у ніжняй частцы, што стэк, таму што вы проста 1167 00:50:26,820 --> 00:50:29,380 трымаць пакласці новы і чыстыя тыя, на вяршыні гэтага. 1168 00:50:29,380 --> 00:50:31,840 Тое ж самае можа здарыцца у супермаркеце таксама. 1169 00:50:31,840 --> 00:50:35,450 Калі ў вас ёсць вітрыну малака і кожны раз CVS 1170 00:50:35,450 --> 00:50:37,610 або той, хто атрымлівае больш малака, вы проста засунуць малако 1171 00:50:37,610 --> 00:50:39,880 ў вас ужо ёсць на спіне і Вы змяшчаеце новыя наперадзе, 1172 00:50:39,880 --> 00:50:43,088 Вы будзеце мець некаторыя даволі брыдка Малако ў канцы структуры дадзеных, 1173 00:50:43,088 --> 00:50:46,390 таму што гэта заўсёды на дне або што тое ж самае, гэта заўсёды на спіне. 1174 00:50:46,390 --> 00:50:50,407 >> Але ёсць яшчэ адзін спосаб думаць аб выстройваюцца дадзеных і, напрыклад, гэты. 1175 00:50:50,407 --> 00:50:53,490 Калі вы адзін з тых людзей, хто любіць выбудоўвацца за межамі Apple, крамы 1176 00:50:53,490 --> 00:50:55,610 калі новы прадукт пастаўляецца з, вы, верагодна, 1177 00:50:55,610 --> 00:50:58,780 не выкарыстоўваючы дадзеныя стэка Структура, таму што вы 1178 00:50:58,780 --> 00:51:03,070 адштурхне ўсіх, хто знаходзіцца выстройваюцца, каб купіць некаторыя новыя цацкі. 1179 00:51:03,070 --> 00:51:06,610 Хутчэй за ўсё, вы, верагодна, з выкарыстаннем якія структуры дадзеных 1180 00:51:06,610 --> 00:51:10,050 або якая сістэма у рэальным свеце? 1181 00:51:10,050 --> 00:51:13,493 Спадзяюся, гэта лінія, або больш правільна ці больш брытанскі, як, чэргі. 1182 00:51:13,493 --> 00:51:17,700 І атрымліваецца, чаргу таксама Структура дадзеных у інфарматыцы, 1183 00:51:17,700 --> 00:51:19,700 але чаргу мае вельмі адрозніваецца ўласцівасць. 1184 00:51:19,700 --> 00:51:20,820 Гэта не ЛИФО. 1185 00:51:20,820 --> 00:51:21,990 Апошні прыйшоў, першы. 1186 00:51:21,990 --> 00:51:22,800 Не дай Бог. 1187 00:51:22,800 --> 00:51:24,280 Гэта замест таго, каб FIFO. 1188 00:51:24,280 --> 00:51:26,110 Па-першае, першым сышоў. 1189 00:51:26,110 --> 00:51:27,970 І гэта добра Дзеля справядлівасці 1190 00:51:27,970 --> 00:51:30,428 вядома, калі вы выстройваюцца да супер рана раніцай. 1191 00:51:30,428 --> 00:51:33,400 Калі вы там спачатку, Вы хочаце, каб выйсці спачатку ў якасці добра. 1192 00:51:33,400 --> 00:51:35,880 >> І так усе гэтыя дадзеныя структуры, чэргі і стэкі 1193 00:51:35,880 --> 00:51:39,220 і гронкі іншых, аказваецца вас можа думаць пра гэта, як толькі што масіў. 1194 00:51:39,220 --> 00:51:41,820 Гэта масіў, можа быць, фіксаваны памер 4, але гэта было б 1195 00:51:41,820 --> 00:51:44,990 быць свайго роду добра, калі мы маглі б проста куча Латкі амаль бясконца высокі, калі мы 1196 00:51:44,990 --> 00:51:46,780 ёсць, што многія падносы або лічбы. 1197 00:51:46,780 --> 00:51:48,840 Так, можа быць, мы хочам, каб выкарыстоўваць звязаны спіс тут, 1198 00:51:48,840 --> 00:51:51,800 але кампраміс будзе патэнцыйна, што нам трэба больш памяці, 1199 00:51:51,800 --> 00:51:55,930 займае крыху больш часу, але мы не абмяжоўваюць вышыню чаркі, 1200 00:51:55,930 --> 00:51:59,550 гэтак жа, як вітрыне Мазер можа абмежаваць памер стэка, 1201 00:51:59,550 --> 00:52:03,117 і такім чынам, яны праектныя рашэнні ці варыянты, даступныя для нас у канчатковым рахунку. 1202 00:52:03,117 --> 00:52:04,950 Так што з гэтымі дадзенымі структуры, мы пачалі 1203 00:52:04,950 --> 00:52:09,360 бачачы новыя верхнія межы патэнцыйна на тое, што раней было супер хутка 1204 00:52:09,360 --> 00:52:11,260 і дзе мы пакінем ад сёньня і дзе 1205 00:52:11,260 --> 00:52:13,200 мы спадзяемся атрымаць у на сераду, мы будзем 1206 00:52:13,200 --> 00:52:15,740 пачаць глядзець на дадзеных Структура, што дазваляе нам шукаць 1207 00:52:15,740 --> 00:52:18,260 праз дадзеныя ў канцы часу часопіса зноў. 1208 00:52:18,260 --> 00:52:21,470 І мы ўбачылі, што, памятаю, у нулявы тыдні і адзін з бінарнага пошуку або разрыву 1209 00:52:21,470 --> 00:52:22,180 і ўладар. 1210 00:52:22,180 --> 00:52:26,240 Гэта вяртаецца, і яшчэ лепш, Святы Грааль для гэтага сераду 1211 00:52:26,240 --> 00:52:29,510 будзе прыдумаць з структура дадзеных, якая працуе сапраўды 1212 00:52:29,510 --> 00:52:32,070 або тэарэтычна Пастаянная часу, у выніку чаго 1213 00:52:32,070 --> 00:52:34,760 гэта не мае значэння, колькі мільёны або мільярды рэчаў 1214 00:52:34,760 --> 00:52:38,470 мы маем у структуры дадзеных, гэта будзе ўзяць нас пастаяннае час, можа быць, адзін крок 1215 00:52:38,470 --> 00:52:41,387 ці два кроку або 10 крокаў, але пастаянныя колькасці крокаў 1216 00:52:41,387 --> 00:52:42,970 шукаць у гэтай структуры дадзеных. 1217 00:52:42,970 --> 00:52:46,300 Гэта сапраўды будзе Святой Грааль але пра гэта ў сераду. 1218 00:52:46,300 --> 00:52:49,045 Ўбачымся тады. 1219 00:52:49,045 --> 00:52:53,704 >> [Гуляе музыка] 1220 00:52:53,704 --> 00:56:08,448