1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> Дејвид MALAN: Сите во право, добредојде назад. 3 00:00:12,580 --> 00:00:13,290 Ова е CS50. 4 00:00:13,290 --> 00:00:15,130 Ова е почеток на недела седум. 5 00:00:15,130 --> 00:00:18,890 Така што е време, па мислев дека ние би земе виорот турнеја на тоа каде ние 6 00:00:18,890 --> 00:00:20,760 застанавте и каде што ние сега се случува. 7 00:00:20,760 --> 00:00:23,310 >> Значи ова нешто овде би можеле да имаат предизвика некои гнев во прв. 8 00:00:23,310 --> 00:00:27,680 Но се надевам, ти си почнуваат да аклиматизирам на она што ова означува тука - 9 00:00:27,680 --> 00:00:32,670 ѕвезда претставува покажувач, што е само она што, во смисла повеќе лаик? 10 00:00:32,670 --> 00:00:33,400 Па тоа е адреса. 11 00:00:33,400 --> 00:00:35,490 >> Па тоа е адресата на нешто во меморијата. 12 00:00:35,490 --> 00:00:38,260 И почнавме да лупам назад на слоеви неколку недели, работите се допаѓа 13 00:00:38,260 --> 00:00:41,800 GetString и други такви функции сето ова време се враќаат 14 00:00:41,800 --> 00:00:46,010 адресите на работите во меморијата, како адресата на првиот карактер во 15 00:00:46,010 --> 00:00:46,990 некои низа. 16 00:00:46,990 --> 00:00:50,360 >> Па ние исто така, воведе valgrind, која ќе започне да се користи за овој проблем 17 00:00:50,360 --> 00:00:53,380 во собата, особено за следната проблем во собата, како и. 18 00:00:53,380 --> 00:00:54,980 И valgrind го прави она што за нас? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Тоа проверки за меморија протекување, и тоа исто така, проверки за злоупотреба на меморија. 21 00:01:01,020 --> 00:01:05,890 >> Тоа може да, со некои веројатност, детектира, ако вашиот код се случува да се допре меморија 22 00:01:05,890 --> 00:01:07,100 дека тоа едноставно не треба. 23 00:01:07,100 --> 00:01:10,410 Па не мора да излегуваат во јавноста, но ако оди подалеку од границите на некои 24 00:01:10,410 --> 00:01:14,730 низа, и ти всушност се кандидира valgrind и предизвика таквото однесување додека 25 00:01:14,730 --> 00:01:17,870 valgrind работи во вашата програма е работи во него, ќе добиете 26 00:01:17,870 --> 00:01:21,460 пораки вака - "невалидна пишуваат на големина од 4 ", која, да се потсетиме на неколку 27 00:01:21,460 --> 00:01:25,880 недели значеше дека имав случајно како на еден int предалеку 28 00:01:25,880 --> 00:01:27,250 надвор од границите на низата. 29 00:01:27,250 --> 00:01:30,790 И така со големина од 4 значи тука на големината на тој конкретен Инт. 30 00:01:30,790 --> 00:01:35,260 >> Па се земе успокојување во фактот дека valgrind е излез, форматот на тоа, 31 00:01:35,260 --> 00:01:36,170 е само крволочен. 32 00:01:36,170 --> 00:01:40,180 Тоа е навистина тешко да се види низ хаос за интересни информации. 33 00:01:40,180 --> 00:01:42,910 Па што ние го направивме овде е само извадок некои од неколку повеќе 34 00:01:42,910 --> 00:01:43,850 интересни линии. 35 00:01:43,850 --> 00:01:46,760 Но сфати дека 80% од valgrind е излез ќе биде малку 36 00:01:46,760 --> 00:01:47,650 одвраќање. 37 00:01:47,650 --> 00:01:52,820 >> Само се погледне за моделите како овие - неправилен право, неправилен чита, 40 бајти 38 00:01:52,820 --> 00:01:56,690 и некои број на блокови се дефинитивно изгубени, клучни зборови, како тоа. 39 00:01:56,690 --> 00:02:01,920 И она што се надевам дека ќе видиме некои вид на трага од она што функционира 40 00:02:01,920 --> 00:02:03,340 грешка е всушност внатре 41 00:02:03,340 --> 00:02:07,195 Во овој случај тука, во она што линијата на мојот код беше грешка очигледно? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 во датотека наречена memory.c, кој беше на пример ние игравме со 44 00:02:14,130 --> 00:02:14,890 во тоа време. 45 00:02:14,890 --> 00:02:16,460 Па тоа не е веројатно во Примерок. 46 00:02:16,460 --> 00:02:18,630 Тоа е веројатно во мојот код наместо тоа. 47 00:02:18,630 --> 00:02:20,910 Па ќе видиме ова повторно и повторно пред долго. 48 00:02:20,910 --> 00:02:24,080 >> Па scanf, ова излезе во неколку форми досега. 49 00:02:24,080 --> 00:02:26,410 Видовме sscanf кратко. 50 00:02:26,410 --> 00:02:28,330 Тоа беше нешто голем број на ви се нурна во во вашиот 51 00:02:28,330 --> 00:02:29,535 подготовките за квиз. 52 00:02:29,535 --> 00:02:33,130 И scanf е, всушност, она што CS50 библиотека е со користење под 53 00:02:33,130 --> 00:02:36,560 качулка за сосема извесно време, со цел да се добие влез од корисникот. 54 00:02:36,560 --> 00:02:40,420 >> На пример, ако јас се движат во текот на CS50 апаратот тука, дозволете ми да се отвори 55 00:02:40,420 --> 00:02:45,315 пример денес дека се вика scanf-0.c И тоа е супер едноставен. 56 00:02:45,315 --> 00:02:46,590 Тоа е само неколку линии на код. 57 00:02:46,590 --> 00:02:50,880 Но тоа покажува навистина како getInt работи сето ова време. 58 00:02:50,880 --> 00:02:54,710 >> Во оваа програма тука, во линија 16 , Известување дека јас прогласи Инт. 59 00:02:54,710 --> 00:02:57,270 Па нема покажувачи, ништо магично таму, само Инт. 60 00:02:57,270 --> 00:03:00,330 Потоа, во линија 17, јас го извести корисникот за голем број, те молам. 61 00:03:00,330 --> 00:03:02,930 Потоа, во крајот на 18, јас го користам scanf тука. 62 00:03:02,930 --> 00:03:06,910 И јас одредено, вид на како printf, дека јас сум очекува цитат 63 00:03:06,910 --> 00:03:08,110 unquote проценти i. 64 00:03:08,110 --> 00:03:10,920 >> Значи проценти Јас, се разбира, означува Инт. 65 00:03:10,920 --> 00:03:14,580 Но се забележи она што на вториот аргумент да scanf е. 66 00:03:14,580 --> 00:03:17,350 Како би ја опишале вториот аргумент по запирката? 67 00:03:17,350 --> 00:03:19,450 Што е тоа? 68 00:03:19,450 --> 00:03:20,670 >> Тоа е адресата на х. 69 00:03:20,670 --> 00:03:25,490 Значи ова е корисно, бидејќи со обезбедување на scanf со адреса на x, она што не 70 00:03:25,490 --> 00:03:29,560 кои ги поттикне таа функција да направам? 71 00:03:29,560 --> 00:03:33,010 Не само одат таму, но, исто така, го направи она што? 72 00:03:33,010 --> 00:03:34,060 >> Направи промена на неа. 73 00:03:34,060 --> 00:03:38,080 Бидејќи можете да одат таму, тоа е вид на како на сајтот на локација во меморијата. 74 00:03:38,080 --> 00:03:41,900 И толку долго како што се обезбеди scanf, или било функција со една таква карта, која 75 00:03:41,900 --> 00:03:45,840 функција може да оди таму, и не само погледне на вредност, но исто така може 76 00:03:45,840 --> 00:03:49,670 промена на таа вредност, што е корисно ако целта во животот на scanf е да се 77 00:03:49,670 --> 00:03:53,060 скенирање на влез од корисникот, посебно од тастатурата. 78 00:03:53,060 --> 00:03:57,830 И ѓ означува форматиран, исто како и printf, ѓ означува форматиран 79 00:03:57,830 --> 00:03:58,930 стринг кој сакате да печатите. 80 00:03:58,930 --> 00:04:04,430 >> Значи во кратки, оваа линија 18 едноставно вели, обидете се да прочитате int од корисникот 81 00:04:04,430 --> 00:04:10,420 тастатура и чувајте го во внатрешноста на x, на без оглед адреса х случува да се живее во. 82 00:04:10,420 --> 00:04:14,860 А потоа на крај, линија 19 само вели, Ви благодариме за int, во овој случај. 83 00:04:14,860 --> 00:04:15,940 >> Па дозволете ми да оди напред и да се направи овој. 84 00:04:15,940 --> 00:04:18,570 Така бидете scanf 0. 85 00:04:18,570 --> 00:04:20,130 Дозволете ми да оди напред и да зумирате внатре 86 00:04:20,130 --> 00:04:22,960 Ќе одам да ја извршите оваа со точки коса црта scanf 0. 87 00:04:22,960 --> 00:04:24,020 Број, те молам? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Ви благодариме за 50. 90 00:04:25,730 --> 00:04:27,270 Па тоа е прилично едноставна. 91 00:04:27,270 --> 00:04:28,160 >> Сега што не го прави тоа? 92 00:04:28,160 --> 00:04:29,940 Тоа не го прави целиот куп на грешка проверка. 93 00:04:29,940 --> 00:04:33,000 На пример, ако јас не соработуваат, и не ми напишеш во голем број, но 94 00:04:33,000 --> 00:04:37,860 наместо да пишувам нешто како "Здраво" тоа е само вид на чудно. 95 00:04:37,860 --> 00:04:41,130 И така една од работите на CS50 библиотека е тоа за нас за некое 96 00:04:41,130 --> 00:04:43,440 време е дека reprompting и reprompting. 97 00:04:43,440 --> 00:04:49,320 >> На retry фраза потсетиме беше во cs50.c, и тоа е причината што getInt во 98 00:04:49,320 --> 00:04:51,670 библиотеката CS50 е, всушност, целиот куп на линии долги, бидејќи ние сме 99 00:04:51,670 --> 00:04:53,190 проверка за глупави работи како оваа. 100 00:04:53,190 --> 00:04:55,730 Не на корисникот даде нас, всушност, int? 101 00:04:55,730 --> 00:04:57,910 Дали тој или таа ни даде нешто како по азбучен писмо? 102 00:04:57,910 --> 00:05:01,410 Ако е така, ние сакаме да се открие што и се развикам нив. 103 00:05:01,410 --> 00:05:03,915 >> Но, работите стануваат поинтересни во следниот пример. 104 00:05:03,915 --> 00:05:09,840 Ако одам во scanf-1.в, што е еден нешто што е фундаментално се промени во 105 00:05:09,840 --> 00:05:11,135 овој следната пример? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Јас сум со користење char *, се разбира, наместо int. 108 00:05:16,010 --> 00:05:19,210 >> Значи ова е интересно, бидејќи char *, потсетиме, дали е навистина само 109 00:05:19,210 --> 00:05:20,190 истото како стринг. 110 00:05:20,190 --> 00:05:23,840 Па таа се чувствува како можеби ова е супер едноставна имплементација на GetString. 111 00:05:23,840 --> 00:05:26,010 Но јас сум излупени назад слој на CS50 библиотека, па јас сум 112 00:05:26,010 --> 00:05:27,550 повикувајќи овој char * сега. 113 00:05:27,550 --> 00:05:30,070 Да видиме каде што, ако било каде, ние да тргне наопаку. 114 00:05:30,070 --> 00:05:30,840 >> Линија 17 - 115 00:05:30,840 --> 00:05:33,950 Јас повторно се каже, молам да ми даде нешто, во овој случај, низа. 116 00:05:33,950 --> 00:05:37,940 А потоа и во следната линија, јас го нарекувам scanf, повторно, давајќи му формат код, 117 00:05:37,940 --> 00:05:39,310 но овој пат проценти s. 118 00:05:39,310 --> 00:05:41,900 А потоа овој пат, јас сум давајќи тампон. 119 00:05:41,900 --> 00:05:43,550 >> Сега забележите, јас не сум со користење на симболот. 120 00:05:43,550 --> 00:05:47,120 Но, зошто е тоа што веројатно во ред овде? 121 00:05:47,120 --> 00:05:49,760 Затоа што она што е тампон веќе? 122 00:05:49,760 --> 00:05:50,770 Тоа е веќе покажувач. 123 00:05:50,770 --> 00:05:51,650 Тоа е веќе адреса. 124 00:05:51,650 --> 00:05:54,510 >> И ајде овој збор "збуни", дозволете ми само ја нарекуваат е, на пример, за 125 00:05:54,510 --> 00:05:55,050 едноставност. 126 00:05:55,050 --> 00:05:58,250 Но јас сум го нарече тампон затоа што во Генерално, во програмирање, ако имате 127 00:05:58,250 --> 00:06:02,130 парче на меморија, која низа навистина само е, може да го наречеме тампон. 128 00:06:02,130 --> 00:06:04,460 Тоа е место за складирање на информации. 129 00:06:04,460 --> 00:06:07,400 >> Слични на нешта како YouTube, кога тие се визуелниот, така да се каже, дека 130 00:06:07,400 --> 00:06:10,270 само значи тоа е симнување на битови од на интернет и чување на нив во 131 00:06:10,270 --> 00:06:14,160 локалните низа, локален парче на меморија, па што може да се види тоа подоцна, без 132 00:06:14,160 --> 00:06:16,830 тоа скокнеш или виси на ви, додека изведувате назад. 133 00:06:16,830 --> 00:06:20,930 >> Значи има проблем тука иако, бидејќи јас сум ти го кажувам scanf, се очекува 134 00:06:20,930 --> 00:06:22,320 стринг од корисникот. 135 00:06:22,320 --> 00:06:24,410 Тука е адресата на парче меморија. 136 00:06:24,410 --> 00:06:26,180 Стави дека низа таму. 137 00:06:26,180 --> 00:06:31,230 Зошто е тоа така врзани даде ни проблеми, иако? 138 00:06:31,230 --> 00:06:33,490 >> Што е тоа? 139 00:06:33,490 --> 00:06:35,510 Сум дозволено за пристап тој дел од меморијата? 140 00:06:35,510 --> 00:06:36,250 Знаете, јас не знам. 141 00:06:36,250 --> 00:06:39,210 Бидејќи нема тампон е иницијализиран да нешто? 142 00:06:39,210 --> 00:06:39,820 Навистина не. 143 00:06:39,820 --> 00:06:43,090 И така тоа е она што ние сме биле нарекувајќи ѓубре вредност, која 144 00:06:43,090 --> 00:06:44,040 не е формален збор. 145 00:06:44,040 --> 00:06:49,200 Тоа само значи дека ние немам идеја што битови се во внатрешноста на четири бајти кои 146 00:06:49,200 --> 00:06:51,240 Имам распределени како тампон. 147 00:06:51,240 --> 00:06:52,450 >> Не сум се нарекува Примерок. 148 00:06:52,450 --> 00:06:53,940 Јас сум дефинитивно не наречен GetString. 149 00:06:53,940 --> 00:06:56,380 Па кој знае што е, всушност, внатрешноста на тампон? 150 00:06:56,380 --> 00:07:00,550 А сепак кажувам scanf слепо, оди таму и го стави она што корисникот внесе. 151 00:07:00,550 --> 00:07:04,460 >> Значи она што е најверојатно може да предизвика во нашиот код, ако ние го извршите? 152 00:07:04,460 --> 00:07:05,700 Веројатно segfault. 153 00:07:05,700 --> 00:07:07,970 Можеби не, но веројатно segfault. 154 00:07:07,970 --> 00:07:10,620 И јас велам можеби не затоа што понекогаш ќе го направите, понекогаш 155 00:07:10,620 --> 00:07:11,380 да не добие segfault. 156 00:07:11,380 --> 00:07:14,280 Понекогаш едноставно имаат среќа, но не е сеедно ќе биде 157 00:07:14,280 --> 00:07:15,340 на бубачка во нашата програма. 158 00:07:15,340 --> 00:07:17,060 >> Па дозволете ми да оди напред и да собере. 159 00:07:17,060 --> 00:07:18,280 Одам да го направи тоа на старата школа начин. 160 00:07:18,280 --> 00:07:23,825 Па ѕвекот цртичка 0, scanf-1, scanf-1.в, Enter. 161 00:07:23,825 --> 00:07:24,720 Упс, исто старата школа. 162 00:07:24,720 --> 00:07:26,550 Ајде да видиме. 163 00:07:26,550 --> 00:07:28,440 Каде и да одам? 164 00:07:28,440 --> 00:07:29,700 Ох, char * тампон. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 О, ти благодарам - 167 00:07:35,130 --> 00:07:36,930 Спаси, во ред - 168 00:07:36,930 --> 00:07:37,690 многу старата школа. 169 00:07:37,690 --> 00:07:38,900 Сите во право, тоа е време. 170 00:07:38,900 --> 00:07:41,720 >> Па јас само го зачувале фајлот по одлуки кои привремено 171 00:07:41,720 --> 00:07:42,700 промена пред еден миг. 172 00:07:42,700 --> 00:07:46,090 И сега јас го состави рачно со ѕвекот. 173 00:07:46,090 --> 00:07:49,500 И сега ќе одам да се оди напред и да ја стартувате scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 Стринг молам. 175 00:07:50,290 --> 00:07:51,600 Јас ќе напишете "Здраво". 176 00:07:51,600 --> 00:07:54,070 >> А сега, еве, каде што, искрено, printf може да е малку досадни. 177 00:07:54,070 --> 00:07:56,020 Тоа не е всушност ќе segfault во овој случај. 178 00:07:56,020 --> 00:07:59,860 Printf е малку посебна, бидејќи тоа е толку супер најчесто се користи дека 179 00:07:59,860 --> 00:08:03,570 суштина printf прави ни корист и реализација, 180 00:08:03,570 --> 00:08:04,830 тоа не е валидна покажувач. 181 00:08:04,830 --> 00:08:09,080 Дозволете ми да го земе врз себе само да се печати во заграда нула, дури и 182 00:08:09,080 --> 00:08:13,340 иако тоа не е нужно што ние самите се очекуваше. 183 00:08:13,340 --> 00:08:16,940 >> Па ние навистина не може лесно да предизвикаат segfault со ова, но јасно ова 184 00:08:16,940 --> 00:08:18,600 не е однесувањето сакав. 185 00:08:18,600 --> 00:08:19,800 Значи она што е едноставно решение? 186 00:08:19,800 --> 00:08:25,650 Па, во scanf-2, дозволете ми да предложи наместо всушност само доделување на 187 00:08:25,650 --> 00:08:30,100 char *, дозволете ми да биде малку попаметно за ова, и дозволете ми да ги распредели тампон 188 00:08:30,100 --> 00:08:32,940 како секвенца од 16 карактери. 189 00:08:32,940 --> 00:08:34,200 >> За да можам да го направите тоа во неколку начини. 190 00:08:34,200 --> 00:08:35,610 Јас апсолутно може да го користи Примерок. 191 00:08:35,610 --> 00:08:38,980 Но, можам да се вратиме на недела две, кога Јас само се потребни на целиот куп на 192 00:08:38,980 --> 00:08:39,620 карактери. 193 00:08:39,620 --> 00:08:40,860 Тоа е само низа. 194 00:08:40,860 --> 00:08:44,870 Па да ми наместо редефинира тампон да биде низа од 16 знаци. 195 00:08:44,870 --> 00:08:47,340 >> И сега, кога јас помине тампон во - 196 00:08:47,340 --> 00:08:49,940 и ова е нешто што ние не зборуваме за во недела две - 197 00:08:49,940 --> 00:08:53,730 но можете да се третираат низа како иако тоа е адреса. 198 00:08:53,730 --> 00:08:56,390 Технички, како што видовме, тие се малку поинаква. 199 00:08:56,390 --> 00:09:01,290 Но scanf нема ум, ако го предадете името на низа, затоа што она што 200 00:09:01,290 --> 00:09:05,030 Ѕвекот ќе направи за нас е во суштина третираат името на таа низа како 201 00:09:05,030 --> 00:09:08,280 адресата на парче од 16 бајти. 202 00:09:08,280 --> 00:09:09,550 >> Значи ова е подобро. 203 00:09:09,550 --> 00:09:12,110 Ова значи дека сега можам да се надевам да го направите следново. 204 00:09:12,110 --> 00:09:16,800 Дозволете ми да одзумирате за момент и го прават scanf-2, составена ред. 205 00:09:16,800 --> 00:09:19,390 Сега дозволете ми да го доби коса црта scanf-2. 206 00:09:19,390 --> 00:09:22,430 Стринг молам. "Здраво". И тоа се чинеше да работат тоа време. 207 00:09:22,430 --> 00:09:26,020 >> Но некој може да предложи сценарио во кои уште не би можеле да работат? 208 00:09:26,020 --> 00:09:28,550 Да? 209 00:09:28,550 --> 00:09:30,640 Нешто подолг од 16 карактери. 210 00:09:30,640 --> 00:09:32,020 И всушност, можеме да бидеме малку попрецизни. 211 00:09:32,020 --> 00:09:36,540 Нешто подолг од 15 карактери, затоа што навистина треба да го имаме на ум 212 00:09:36,540 --> 00:09:39,920 дека ни се потребни што обратна коса црта нула имплицитно на крајот од стрингот, 213 00:09:39,920 --> 00:09:42,950 која е настрана scanf ќе обично се грижи за за нас. 214 00:09:42,950 --> 00:09:46,210 >> Па да ми се направи нешто како - 215 00:09:46,210 --> 00:09:48,040 понекогаш ние само може да оставете го како што. 216 00:09:48,040 --> 00:09:50,630 Добро, па сега сме предизвикана нашите сегментација вина. 217 00:09:50,630 --> 00:09:51,000 Зошто? 218 00:09:51,000 --> 00:09:54,940 Затоа што Јас ја внеле во повеќе од 15 ликови, и така ние сме всушност 219 00:09:54,940 --> 00:09:58,280 допре меморија дека јас всушност не треба да има. 220 00:09:58,280 --> 00:10:00,180 >> Значи она што е навистина решение тука? 221 00:10:00,180 --> 00:10:02,210 Па, што ако ние треба подолг стринг? 222 00:10:02,210 --> 00:10:03,960 Па, ние можеби го прават тоа 32 бајти. 223 00:10:03,960 --> 00:10:05,160 Па, што ако тоа не е доволно долго? 224 00:10:05,160 --> 00:10:06,040 Како за 64 бајти? 225 00:10:06,040 --> 00:10:07,080 Што ако тоа не е доволно долго? 226 00:10:07,080 --> 00:10:09,640 Како за 128 или 200 бајти? 227 00:10:09,640 --> 00:10:12,660 Она што навистина е решение овде, во општ случај, ако не знаеме во 228 00:10:12,660 --> 00:10:14,460 однапред што на корисникот ќе напишете? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Тоа е само вид на голема болка во газот, да бидам искрен, кој е зошто на 231 00:10:23,050 --> 00:10:29,050 CS50 библиотека има неколку десетина линии на код кој колективно имплементираат 232 00:10:29,050 --> 00:10:32,390 GetString низа во начинот на кој ние не треба да знаете однапред што 233 00:10:32,390 --> 00:10:33,430 корисникот е случува да напишеш. 234 00:10:33,430 --> 00:10:37,370 Особено, ако се погледне назад на cs50.c од пред две недели, ќе видите 235 00:10:37,370 --> 00:10:40,480 дека GetString всушност не Не користете scanf на овој начин. 236 00:10:40,480 --> 00:10:43,720 Наместо тоа, го чита еден карактер во исто време. 237 00:10:43,720 --> 00:10:46,010 >> Бидејќи оној убаво нешто во врска читање на еден лик е што можеме 238 00:10:46,010 --> 00:10:48,490 гарантира себе секогаш да да имаат најмалку еден знак. 239 00:10:48,490 --> 00:10:51,740 Јас само може да прогласи знак, а потоа да овие навистина бебе чекори за да се само 240 00:10:51,740 --> 00:10:54,380 чита еден карактер во во време од тастатурата. 241 00:10:54,380 --> 00:10:58,240 А потоа, она што ќе видите GetString не е секој пат кога истекува на, 242 00:10:58,240 --> 00:11:02,280 да речеме, 16 бајти од меморија, го користи Примерок или роднина од него, да 243 00:11:02,280 --> 00:11:06,810 одвои повеќе меморија, копирање на старите меморија во новата, а потоа индексирање 244 00:11:06,810 --> 00:11:09,900 заедно, добивање еден карактер во еден момент, и кога се работи надвор од таа 245 00:11:09,900 --> 00:11:13,370 парче на меморија, тоа фрла подалеку, ја зграпчува поголем парче на меморија, копии стари 246 00:11:13,370 --> 00:11:14,750 во нови, а се повторува. 247 00:11:14,750 --> 00:11:18,480 И тоа е навистина болка да всушност имплементираат нешто толку едноставно како 248 00:11:18,480 --> 00:11:19,710 добивање на влез од корисникот. 249 00:11:19,710 --> 00:11:21,090 >> Така можете да го користите scanf. 250 00:11:21,090 --> 00:11:22,430 Можете да користите други слични функции. 251 00:11:22,430 --> 00:11:25,420 И многу учебници и онлајн примери се направи, но сите тие се 252 00:11:25,420 --> 00:11:27,210 ранливи на проблеми како оваа. 253 00:11:27,210 --> 00:11:29,550 И на крајот, добивање на segfault е вид на досадни. 254 00:11:29,550 --> 00:11:30,680 Тоа не е добро за корисникот. 255 00:11:30,680 --> 00:11:33,560 >> Но, во најлош случај, она што го прави Тоа во основа го поставите вашиот 256 00:11:33,560 --> 00:11:37,160 код изложени на ризик од? 257 00:11:37,160 --> 00:11:39,250 Некој вид на напад, потенцијално. 258 00:11:39,250 --> 00:11:41,680 Ние разговаравме за еден таков напад - преполнети магацинот. 259 00:11:41,680 --> 00:11:44,660 Но, во принцип, ако сте дозволено да претекување тампон, како што правевме на 260 00:11:44,660 --> 00:11:48,070 пред неколку недели, со само пишување повеќе од "здраво" на магацинот, можете 261 00:11:48,070 --> 00:11:52,330 навистина може да го преземе, потенцијално, компјутер, или барем да се добие на податоците кои 262 00:11:52,330 --> 00:11:53,510 не припаѓа на тебе. 263 00:11:53,510 --> 00:11:55,970 >> Значи на кратко, ова е причината зошто имаме оние обука тркала. 264 00:11:55,970 --> 00:11:59,090 Но сега, да почнеме да ги симне, како нашите програми веќе не треба, 265 00:11:59,090 --> 00:12:00,610 нужно, влез од корисникот. 266 00:12:00,610 --> 00:12:03,960 Но, во случај на проблем постави шест, вашиот влез ќе дојдат од огромна 267 00:12:03,960 --> 00:12:07,520 речникот со 150 некои чудно илјада зборови. 268 00:12:07,520 --> 00:12:10,330 >> Така да не ќе мора да се грижите за на корисникот произволно влез. 269 00:12:10,330 --> 00:12:13,720 Ние ќе ви даде некои претпоставки за таа датотека. 270 00:12:13,720 --> 00:12:20,340 Било какви прашања за совети или scanf или корисник влез во воопшто? 271 00:12:20,340 --> 00:12:24,450 >> Сите во право, така брз поглед потоа во еден заостанува тема од пред две недели. 272 00:12:24,450 --> 00:12:28,590 И тоа беше овој поим на struct. 273 00:12:28,590 --> 00:12:34,180 Не дека - овој поим на struct, која беше она? 274 00:12:34,180 --> 00:12:35,430 Што struct стори за нас? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Дефинира - 277 00:12:39,860 --> 00:12:41,710 е жал? 278 00:12:41,710 --> 00:12:42,820 Дефинира променлива тип. 279 00:12:42,820 --> 00:12:44,410 Значи на некој начин. 280 00:12:44,410 --> 00:12:46,180 Ние сме всушност комбинирање на две теми. 281 00:12:46,180 --> 00:12:49,510 Така да со typedef, да се потсетиме дека можеме да прогласи еден вид на нашите сопствени, како 282 00:12:49,510 --> 00:12:51,500 синоним, како стринг за char *. 283 00:12:51,500 --> 00:12:56,200 Но со користење на typedef и struct, можеме да создаде вистински нашите сопствени структури на податоци. 284 00:12:56,200 --> 00:12:59,600 >> На пример, ако одам назад во gedit тука за само еден миг, и јас одам напред 285 00:12:59,600 --> 00:13:08,230 и направи нешто како, дозволете ми да ги зачувате ова како, да речеме, structs.c 286 00:13:08,230 --> 00:13:10,840 привремено, јас сум само ќе да се оди напред и вклучуваат 287 00:13:10,840 --> 00:13:14,360 standardio.h, int главната неважечки. 288 00:13:14,360 --> 00:13:18,960 А потоа во тука, да претпоставиме дека сакам да се напише програма која ги зачувува 289 00:13:18,960 --> 00:13:21,840 повеќе студенти од повеќе куќи, на пример. 290 00:13:21,840 --> 00:13:24,430 Па тоа е како една registrarial база на податоци на некој вид. 291 00:13:24,430 --> 00:13:29,550 >> Значи, ако јас треба името еден студент, јас може да се направи нешто како char * име, 292 00:13:29,550 --> 00:13:31,570 и јас ќе се направи нешто како - 293 00:13:31,570 --> 00:13:34,410 всушност, ајде да го користат CS50 библиотека за само еден миг да се направи овој 294 00:13:34,410 --> 00:13:38,380 малку поедноставно, па можеме да позајми оние десетици линии на код. 295 00:13:38,380 --> 00:13:39,340 И ајде само да биде едноставно. 296 00:13:39,340 --> 00:13:42,610 Ние ќе продолжиме да го стринг, и сега GetString. 297 00:13:42,610 --> 00:13:47,420 >> Така тврдам сега што сум ги чуваат името на некои студент, и на домот 298 00:13:47,420 --> 00:13:50,240 некои студент, едноставно користење на променливи како што правевме и во една недела. 299 00:13:50,240 --> 00:13:52,370 Но претпоставувам дека сега сакате да го поддржуваат повеќе студенти. 300 00:13:52,370 --> 00:13:58,460 Сите во право, па моите инстинкти се да се направи низа name2, добива GetString, стринг 301 00:13:58,460 --> 00:14:01,370 house2 добива GetString. 302 00:14:01,370 --> 00:14:05,850 А потоа нашиот трет студент, ајде да направиме name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Добро, така што ова е се надевам дека впечатлива вас, како вид на глупави, 304 00:14:09,170 --> 00:14:11,580 бидејќи овој процес навистина никогаш не е ќе заврши, и тоа е само ќе 305 00:14:11,580 --> 00:14:13,130 направи мојот код изгледа полошо и полошо и полошо. 306 00:14:13,130 --> 00:14:14,810 Но ние го решил овој премногу во недела две. 307 00:14:14,810 --> 00:14:19,450 Она што беше нашата релативно чисти решение кога имавме повеќе променливи од 308 00:14:19,450 --> 00:14:23,580 истиот тип на податок, кои се сите поврзани, но ние не сакаме овој крволочен хаос 309 00:14:23,580 --> 00:14:26,870 на сличен начин именуван променливи? 310 00:14:26,870 --> 00:14:30,060 Што правиме наместо неа? 311 00:14:30,060 --> 00:14:31,260 >> Па мислам дека слушнав неколку места. 312 00:14:31,260 --> 00:14:32,590 Имавме низа. 313 00:14:32,590 --> 00:14:37,110 Ако сакате повеќе примероци од нешто, зошто не ги исчисти сето ова 314 00:14:37,110 --> 00:14:39,540 и само велат, дај ми го низа наречен имиња? 315 00:14:39,540 --> 00:14:41,640 >> И сега за сега, ајде тешко код 3. 316 00:14:41,640 --> 00:14:44,450 И тогаш ми даде уште една низа наречен куќи, и дозволете ми за 317 00:14:44,450 --> 00:14:45,800 сега е тешко код 3. 318 00:14:45,800 --> 00:14:49,220 И јас сум масовно исчистени плеткаш дека јас само замислен. 319 00:14:49,220 --> 00:14:52,400 Сега, јас сум сепак тешко кодирани 3, но дури и 3 динамички може да дојде од 320 00:14:52,400 --> 00:14:54,350 корисник, или argv, или слично. 321 00:14:54,350 --> 00:14:55,720 Па ова е веќе почист. 322 00:14:55,720 --> 00:15:00,100 >> Но она што е досадно за ова е дека сега, иако името е некако 323 00:15:00,100 --> 00:15:02,280 фундаментално поврзани со на студентот куќа - 324 00:15:02,280 --> 00:15:04,720 тоа е еден студент дека јас навистина сакате да го претставуваат - 325 00:15:04,720 --> 00:15:08,080 Јас сега имаат две низи кои се паралелни во смисла дека тие се 326 00:15:08,080 --> 00:15:13,930 иста големина, и имиња заградата 0 веројатно мапи за куќи заградата 0, 327 00:15:13,930 --> 00:15:16,600 и имиња заградата 1 мапи на куќите заградата 1. 328 00:15:16,600 --> 00:15:19,280 Со други зборови, дека студент живее во таа куќа, и дека други студентот 329 00:15:19,280 --> 00:15:20,530 животи во таа друга куќа. 330 00:15:20,530 --> 00:15:23,720 Но сигурно ова може да биде направи дури и повеќе демонтирани. 331 00:15:23,720 --> 00:15:24,990 >> Па, тоа може, во факт. 332 00:15:24,990 --> 00:15:28,730 И дозволете ми да оди напред и да се отвори до structs.h, и ќе 333 00:15:28,730 --> 00:15:31,130 види оваа идеја тука. 334 00:15:31,130 --> 00:15:34,905 Забележите дека сум се користи typedef, како што алудираше на момент пред да го објавиме нашиот 335 00:15:34,905 --> 00:15:35,570 сопствен тип на податок. 336 00:15:35,570 --> 00:15:39,660 Но јас сум исто така со користење на овој другите клучни зборови наречен struct што ми дава нови 337 00:15:39,660 --> 00:15:40,790 податочна структура. 338 00:15:40,790 --> 00:15:43,980 >> И овие податоци структура тврдам се случува да имаат две работи во внатрешноста на 339 00:15:43,980 --> 00:15:47,060 тоа - низа наречен име, и низа наречен куќа. 340 00:15:47,060 --> 00:15:49,820 И името, ќе одам да се даде на оваа податочна структура се случува 341 00:15:49,820 --> 00:15:51,005 да се нарекува студент. 342 00:15:51,005 --> 00:15:54,030 Јас би можеле да го наречеме што сакам, но ова семантички направи 343 00:15:54,030 --> 00:15:55,810 смисла за мене во мојот ум. 344 00:15:55,810 --> 00:15:59,160 >> Па сега, ако јас отвори подобра верзија на програмата почнав да пишувам 345 00:15:59,160 --> 00:16:00,390 таму, дозволете ми да дојдете до врвот. 346 00:16:00,390 --> 00:16:03,190 И има некои повеќе линии на код тука, но дозволете ми да се фокусира за 347 00:16:03,190 --> 00:16:04,160 моментот на еден. 348 00:16:04,160 --> 00:16:07,790 Сум прогласи постојан наречен студенти и хард кодирани 3 за сега. 349 00:16:07,790 --> 00:16:11,110 Но сега, забележи како чиста мојот код започнува да се добие. 350 00:16:11,110 --> 00:16:15,030 >> Во линија 22, изјавувам низа на студентите. 351 00:16:15,030 --> 00:16:18,760 И ќе забележите дека ученикот е очигледно сега е тип на податок. 352 00:16:18,760 --> 00:16:23,360 Затоа што на врвот од оваа датотека, информации Сум вклучени дека хедер датотека 353 00:16:23,360 --> 00:16:24,820 дека јас го зафрла само еден миг пред. 354 00:16:24,820 --> 00:16:28,820 И дека хедер датотека сосема едноставно имаше оваа дефиниција на еден студент. 355 00:16:28,820 --> 00:16:32,470 >> Па сега, јас сум создаде мојата сопствени податоци тип дека авторите на C години 356 00:16:32,470 --> 00:16:33,890 Пред не мислам на однапред. 357 00:16:33,890 --> 00:16:34,570 Но нема проблем. 358 00:16:34,570 --> 00:16:35,870 Јас може да го направи сам. 359 00:16:35,870 --> 00:16:39,050 Па ова е низа наречен студенти, секој од чии членови 360 00:16:39,050 --> 00:16:41,100 е студент структура. 361 00:16:41,100 --> 00:16:44,270 И јас сакам три од овие во низа. 362 00:16:44,270 --> 00:16:46,030 >> И сега, она што го прави останатото на оваа програма направам? 363 00:16:46,030 --> 00:16:47,550 Ми требаше нешто малку произволни. 364 00:16:47,550 --> 00:16:51,450 Па од онлајн 24 наваму, Јас iterate 0-3. 365 00:16:51,450 --> 00:16:54,000 Јас тогаш побара од корисникот за на студентот име. 366 00:16:54,000 --> 00:16:56,110 И тогаш јас го користам GetString како порано. 367 00:16:56,110 --> 00:16:59,410 Тогаш го прашувам за куќа на студентот, и јас го користам GetString како порано. 368 00:16:59,410 --> 00:17:01,780 >> Но известување - малку нови парче синтаксата - 369 00:17:01,780 --> 00:17:07,010 Јас се уште може да индекс на I-та студент, но како можам да добијам на специфични податоци 370 00:17:07,010 --> 00:17:08,354 поле внатрешноста на struct? 371 00:17:08,354 --> 00:17:11,770 Па, она што е очигледно нова фигура на синтакса? 372 00:17:11,770 --> 00:17:13,339 Тоа е само точка оператор. 373 00:17:13,339 --> 00:17:14,510 >> Ние не сум видел тоа порано. 374 00:17:14,510 --> 00:17:17,819 Сте го виделе во pset пет ако сте нурна во веќе со битмапа датотеки. 375 00:17:17,819 --> 00:17:22,372 Но точката само значи внатрешноста на оваа struct или повеќе полиња, им даде на точка 376 00:17:22,372 --> 00:17:24,510 име, или да ми даде точка куќата. 377 00:17:24,510 --> 00:17:28,690 Тоа значи дека оди во внатрешноста на struct и да се оние одредени области. 378 00:17:28,690 --> 00:17:30,200 >> Што значи на остатокот од оваа програма се направи? 379 00:17:30,200 --> 00:17:31,190 Тоа не е сите дека секси. 380 00:17:31,190 --> 00:17:34,640 Забележете дека јас iterate 0-3, повторно, и јас едноставно креирање на англиски 381 00:17:34,640 --> 00:17:40,500 фраза од типот така и така е во таква и таква куќа, поминува во dot името од 382 00:17:40,500 --> 00:17:43,320 на i-тата студент и нивните куќа, како и. 383 00:17:43,320 --> 00:17:47,560 >> А потоа на крај, сега ќе почнеме да се добие анален за овој, сега дека ние сме 384 00:17:47,560 --> 00:17:49,580 запознаени со она што Примерок и други функции се 385 00:17:49,580 --> 00:17:50,570 прави сето ова време. 386 00:17:50,570 --> 00:17:54,220 Зошто морам да се ослободи двете името и куќата, иако јас 387 00:17:54,220 --> 00:17:56,960 не се јавите Примерок? 388 00:17:56,960 --> 00:17:58,020 >> GetString направив. 389 00:17:58,020 --> 00:18:00,930 И тоа беше валкана малку тајна за неколку недели, но GetString има 390 00:18:00,930 --> 00:18:03,530 протекување меморија целиот место сите семестар досега. 391 00:18:03,530 --> 00:18:05,990 И valgrand конечно ќе откријат овој за нас. 392 00:18:05,990 --> 00:18:10,730 >> Но тоа не е голема работа, бидејќи знам дека јас едноставно може да се ослободи името 393 00:18:10,730 --> 00:18:15,750 и куќата, иако технички, да се биде супер, супер безбедна, јас треба да биде 394 00:18:15,750 --> 00:18:17,890 прават некои грешка проверка тука. 395 00:18:17,890 --> 00:18:19,040 Кои се вашите инстинкти ви кажувам? 396 00:18:19,040 --> 00:18:22,480 Што треба да се проверуваат за пред јас да се ослободи она што е 397 00:18:22,480 --> 00:18:25,470 стринг, ака која char *? 398 00:18:25,470 --> 00:18:33,460 >> Јас навистина треба да се провери дали студенти заградата јас точка Името не 399 00:18:33,460 --> 00:18:34,840 еднакви нула. 400 00:18:34,840 --> 00:18:40,400 Тогаш тоа ќе биде во ред за да оди напред и слободни дека покажувач, и истиот или на друг 401 00:18:40,400 --> 00:18:41,160 една, исто така. 402 00:18:41,160 --> 00:18:46,860 Ако студенти заградата јас точка куќата не е еднаков на нула, ова сега ќе го заштити 403 00:18:46,860 --> 00:18:52,520 против агол случај во кој GetString се враќа нешто како ништовни. 404 00:18:52,520 --> 00:18:57,310 И видовме пред еден миг, printf ќе заштитат нас до тука од само велејќи 405 00:18:57,310 --> 00:18:58,990 нула, која се случува да се погледне чудно. 406 00:18:58,990 --> 00:19:02,340 Но барем тоа нема да segfault, како што видовме. 407 00:19:02,340 --> 00:19:05,990 >> Па, дозволете ми да се направи една друга работа тука. structs-0 е вид на глупави програма 408 00:19:05,990 --> 00:19:09,700 затоа што јас ги внесете сите овие податоци, а потоа тоа е загубено еднаш на програмата завршува. 409 00:19:09,700 --> 00:19:10,940 Но дозволете ми да оди напред и да го направите тоа. 410 00:19:10,940 --> 00:19:12,830 Дозволете ми да се направи терминал прозорец малку поголема. 411 00:19:12,830 --> 00:19:17,000 Дозволете ми да structs-1, кој е нова верзија на оваа. 412 00:19:17,000 --> 00:19:18,520 >> Јас ќе зумирате малку. 413 00:19:18,520 --> 00:19:21,620 И сега дозволете ми да се кандидира точка коса црта structs-1. 414 00:19:21,620 --> 00:19:22,590 Студентот име - 415 00:19:22,590 --> 00:19:31,500 Дејвид Mather, ајде да направиме Роб Киркланд, ајде да направиме Лорен Leverett. 416 00:19:31,500 --> 00:19:33,650 Она што е интересно сега е најава - 417 00:19:33,650 --> 00:19:35,540 а јас само знам затоа што Напишав на програмата - 418 00:19:35,540 --> 00:19:38,930 постои датотека сега на тековната ми директориумот наречен students.csv. 419 00:19:38,930 --> 00:19:40,420 Некои од вас можеби го виделе овие во реалниот свет. 420 00:19:40,420 --> 00:19:42,980 >> Што е CSV датотека? 421 00:19:42,980 --> 00:19:44,170 Одвоени со запирки вредности. 422 00:19:44,170 --> 00:19:46,670 Тоа е вид на како лош избор верзија на една датотека Excel. 423 00:19:46,670 --> 00:19:50,580 Тоа е табела на редови и колони кои можете да ја отворите во програма како Excel, 424 00:19:50,580 --> 00:19:51,800 или броеви на Mac. 425 00:19:51,800 --> 00:19:55,180 >> И ако јас ја отворите оваа датотека тука за gedit, информации - и бројките не се таму. 426 00:19:55,180 --> 00:19:57,360 Тоа е само gedit кажувам мене линија броеви. 427 00:19:57,360 --> 00:19:59,740 Забележите на првата линија на овој датотеката е Давид и Mather. 428 00:19:59,740 --> 00:20:01,450 На следната линија е Роб запирка Киркланд. 429 00:20:01,450 --> 00:20:04,170 И третата линија е Lauren запирка Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Па што сум создаден? 431 00:20:05,480 --> 00:20:09,580 Јас сум сега напишано програма C дека можат ефикасно да се генерираат табеларни пресметки 432 00:20:09,580 --> 00:20:11,840 кои може да се отвори во програма како Excel. 433 00:20:11,840 --> 00:20:15,520 Не сите дека огромна група на податоци, но ако имате многу поголеми парчиња 434 00:20:15,520 --> 00:20:18,440 податоци кои всушност сакаат да манипулира и да графикони на и 435 00:20:18,440 --> 00:20:21,260 допаѓа, ова е можеби една начин да се создаде дека податоците. 436 00:20:21,260 --> 00:20:25,370 Згора на тоа, CSVs се всушност супер заеднички само за складирање на едноставни податоци - 437 00:20:25,370 --> 00:20:28,940 Јаху финансии, на пример, ако добиете берзанските преку нивните т.н. 438 00:20:28,940 --> 00:20:33,180 API, бесплатна услуга која ви овозможува да добие моменталната до-на-на-датум акции 439 00:20:33,180 --> 00:20:35,650 цитати за компаниите, тие даде податоци назад во 440 00:20:35,650 --> 00:20:37,800 супер едноставен CSV формат. 441 00:20:37,800 --> 00:20:39,380 >> Па како не го правиме тоа? 442 00:20:39,380 --> 00:20:42,530 Па забележи, поголемиот дел од оваа програма скоро исти. 443 00:20:42,530 --> 00:20:46,870 Но информации тука долу, наместо печатење на учениците надвор, on-line 35 444 00:20:46,870 --> 00:20:51,040 наваму, тврдам дека јас сум заштеда на студенти на дискот, па заштеда на датотека. 445 00:20:51,040 --> 00:20:53,630 >> Па забележиш јас сум за прогласување на Датотека * - 446 00:20:53,630 --> 00:20:57,260 сега, ова е вид на аномалија во C. За која било причина, датотеката е сите капи, 447 00:20:57,260 --> 00:21:00,690 што не е како и повеќето други типови на податоци во C. Но, ова е вграден во 448 00:21:00,690 --> 00:21:02,320 тип на податоци, датотеки *. 449 00:21:02,320 --> 00:21:05,900 И јас сум за прогласување на покажувач кон датотека, е начинот на кој можете да мислам на тоа. 450 00:21:05,900 --> 00:21:08,070 >> fopen значи отворената датотека. 451 00:21:08,070 --> 00:21:09,470 Што фајл сакаш да се отвори? 452 00:21:09,470 --> 00:21:12,620 Сакам да отворите датотека дека јас ќе произволно се јавите students.csv. 453 00:21:12,620 --> 00:21:14,480 Јас може да се нарече дека нешто сакам. 454 00:21:14,480 --> 00:21:15,200 >> А потоа ги погоди. 455 00:21:15,200 --> 00:21:18,960 Она што го прави вториот аргумент да fopen веројатно значи? 456 00:21:18,960 --> 00:21:21,480 Право, w за пишување, може да биде r за читање. 457 00:21:21,480 --> 00:21:24,120 Има за додавај ако сакате да го додадете редови и не 458 00:21:24,120 --> 00:21:25,200 пребришете целата работа. 459 00:21:25,200 --> 00:21:28,005 >> Но сакам само да ја креирате оваа датотека еднаш, па јас ќе го користите цитат unquote w. 460 00:21:28,005 --> 00:21:31,880 И знам дека само од тоа читање документацијата, или човекот страница. 461 00:21:31,880 --> 00:21:35,100 Ако датотеката не е нула - со други зборови, ако ништо не беше во ред таму - 462 00:21:35,100 --> 00:21:37,820 дозволете ми да iterate во текот на студенти 0-3. 463 00:21:37,820 --> 00:21:40,410 >> И сега забележите дека е нешто некогаш толку малку различни 464 00:21:40,410 --> 00:21:42,110 за линија 41 тука. 465 00:21:42,110 --> 00:21:42,960 Тоа не е printf. 466 00:21:42,960 --> 00:21:46,530 Тоа е fprintf за датотеката printf. 467 00:21:46,530 --> 00:21:47,790 Па затоа се случува да запишам во датотеката. 468 00:21:47,790 --> 00:21:48,860 Која датотека? 469 00:21:48,860 --> 00:21:53,630 Оној чие покажувачот ќе се определи како прв аргумент. 470 00:21:53,630 --> 00:21:55,940 >> Тогаш ние наведете формат низа. 471 00:21:55,940 --> 00:21:59,660 Тогаш ние прецизира колкав низа сакаме да приклучок во за прв проценти с, и 472 00:21:59,660 --> 00:22:04,320 тогаш друга променлива или вториот проценти s. 473 00:22:04,320 --> 00:22:06,760 Тогаш ние затвори датотеката со запишам. 474 00:22:06,760 --> 00:22:09,380 Отколку што се ослободи меморија како и досега, иако Јас треба да се вратиме и да го додадете 475 00:22:09,380 --> 00:22:10,540 некои проверки за ништовни. 476 00:22:10,540 --> 00:22:12,090 >> И тоа е тоа. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, запишам ми дава способноста да се создаде текстуални датотеки. 478 00:22:16,960 --> 00:22:19,640 Сега, ќе видите во проблемот сет пет, која вклучува слики, ќе биде со користење на 479 00:22:19,640 --> 00:22:20,990 бинарни датотеки, наместо. 480 00:22:20,990 --> 00:22:24,200 Но, во основа, идејата е иста, иако функции да ќе 481 00:22:24,200 --> 00:22:28,710 види се малку различни. 482 00:22:28,710 --> 00:22:32,580 >> Па виорот турнеја, но ќе добиете сите премногу запознаен со датотека I/O-- 483 00:22:32,580 --> 00:22:34,960 влез и излез - со pset пет. 484 00:22:34,960 --> 00:22:38,607 И било какви прашања во врска со почетна основите тука? 485 00:22:38,607 --> 00:22:39,857 Да? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Што ако се обидете да се ослободи null вредност? 488 00:22:43,710 --> 00:22:48,880 Јас верувам, освен ако не слободно има добивано малку повеќе user-friendly, можете да 489 00:22:48,880 --> 00:22:49,890 потенцијално segfault. 490 00:22:49,890 --> 00:22:54,160 Поминува null се лоши бидејќи јас не Верувам бесплатно пречи да се провери за вас, 491 00:22:54,160 --> 00:22:57,330 поради тоа што потенцијално ќе биде отпад време за тоа да се направи за 492 00:22:57,330 --> 00:22:59,022 сите во светот. 493 00:22:59,022 --> 00:23:00,590 Добро прашање, иако. 494 00:23:00,590 --> 00:23:04,300 >> Сите во право, па овој вид на добива ни со една интересна тема. 495 00:23:04,300 --> 00:23:07,010 Темата на проблемот сет пет е криминолошки науки. 496 00:23:07,010 --> 00:23:08,420 Барем тоа е еден дел на проблемот во собата. 497 00:23:08,420 --> 00:23:12,030 Криминолошки науки генерално се однесува на наплата на информации кои може или 498 00:23:12,030 --> 00:23:14,110 не може да се избришани намерно. 499 00:23:14,110 --> 00:23:18,680 И така мислев дека сум ти даде брз вкусот на она што е навистина се случува на сите 500 00:23:18,680 --> 00:23:21,230 овој пат под хаубата на вашиот компјутер. 501 00:23:21,230 --> 00:23:23,960 >> На пример, ако имате внатрешноста на вашиот лаптоп или десктоп компјутер 502 00:23:23,960 --> 00:23:28,040 хард диск, тоа е или механички уред кој всушност се врти - 503 00:23:28,040 --> 00:23:31,650 има кружни нешта наречени Одмори плата кои изгледаат доста допаѓа она што го 504 00:23:31,650 --> 00:23:34,540 само имаше на екранот тука, иако ова е повеќе старото училиште. 505 00:23:34,540 --> 00:23:37,370 Ова е три-и-пол-инчен хард диск. 506 00:23:37,370 --> 00:23:40,070 И три и пол инчи однесува на со на работа кога ќе го инсталирате 507 00:23:40,070 --> 00:23:40,890 во компјутерот. 508 00:23:40,890 --> 00:23:44,890 >> Многу од вас момци во вашиот лаптопи сега имаат солидна држава дискови, или SSDs, 509 00:23:44,890 --> 00:23:46,260 кои немаат подвижни делови. 510 00:23:46,260 --> 00:23:49,170 Тие се повеќе како RAM меморија и помалку како овие механички уреди. 511 00:23:49,170 --> 00:23:51,450 Но идеи се уште се исти, сигурно како тие се однесуваат 512 00:23:51,450 --> 00:23:52,790 на проблемот постави пет. 513 00:23:52,790 --> 00:23:57,400 >> И ако мислите дека за сега на хард диск претставува биде кругот, кој 514 00:23:57,400 --> 00:23:58,930 Јас ќе подготви вака тука. 515 00:23:58,930 --> 00:24:02,290 Кога ќе се создаде датотека на вашиот компјутер, дали тоа е SSD, или во 516 00:24:02,290 --> 00:24:06,610 овој случај, еден постар училиште хард диск, таа датотека се состои од неколку бита. 517 00:24:06,610 --> 00:24:10,510 Да речеме дека тоа е овој 0 и 1, целиот куп на 0-ти и 1S. 518 00:24:10,510 --> 00:24:11,660 Значи ова е мојот целиот хард диск. 519 00:24:11,660 --> 00:24:13,225 Ова е очигледно прилично голема датотека. 520 00:24:13,225 --> 00:24:18,080 И тоа е со користење до 0-ти и 1S во тоа дел од физичкиот послужавник. 521 00:24:18,080 --> 00:24:19,750 >> Па, што е тоа што физичкиот дел? 522 00:24:19,750 --> 00:24:25,310 Па, излегува дека на хард диск, барем од овој тип, има 523 00:24:25,310 --> 00:24:27,340 овие малечки магнетни честички. 524 00:24:27,340 --> 00:24:32,630 И тие во суштина имаат север и југ столбови за нив, така што, ако 525 00:24:32,630 --> 00:24:35,710 се претвори еден од оние магнетни честички на овој начин, може да се каже дека тоа е 526 00:24:35,710 --> 00:24:36,720 што претставува 1. 527 00:24:36,720 --> 00:24:39,340 И ако тоа е наопаку југ кон север, може да се каже дека тоа е 528 00:24:39,340 --> 00:24:40,390 претставува 0. 529 00:24:40,390 --> 00:24:43,660 >> Па во реалниот физички свет, тоа е како би можеле да претставуваат нешто во 530 00:24:43,660 --> 00:24:45,670 бинарни држава на 0 и 1. 531 00:24:45,670 --> 00:24:46,720 Така што е сè датотеката е. 532 00:24:46,720 --> 00:24:49,300 Постојат еден куп на магнетни честички кои се нивните овој начин или 533 00:24:49,300 --> 00:24:51,920 на овој начин, создавајќи модели од 0-ти и 1S. 534 00:24:51,920 --> 00:24:56,760 >> Но излегува кога ќе ја зачувате датотеката, некои информации се зачувани одделно. 535 00:24:56,760 --> 00:25:00,000 Па ова е малку маса, директориумот, така да се каже. 536 00:25:00,000 --> 00:25:05,810 И јас ќе се јавам оваа колона име, и Ќе му се јавам оваа колумна локација. 537 00:25:05,810 --> 00:25:08,850 >> И јас одам да се каже, да претпоставиме ова е мојот биографија. 538 00:25:08,850 --> 00:25:14,050 Мојата resume.doc се чува во локација, да речеме 123. 539 00:25:14,050 --> 00:25:15,390 Јас секогаш се обратите за тој број. 540 00:25:15,390 --> 00:25:18,810 Но, тоа е доволно да се каже дека само како во RAM меморија, може да се земе на хард диск 541 00:25:18,810 --> 00:25:22,350 тоа е GIGABYTE или 200 гигабајти или Terabyte, и може да 542 00:25:22,350 --> 00:25:23,750 Бројот сите на бајти. 543 00:25:23,750 --> 00:25:26,480 Можете да нумерира сите парчиња од 8 бита. 544 00:25:26,480 --> 00:25:29,030 >> Па ние ќе се каже дека оваа е локација 123. 545 00:25:29,030 --> 00:25:32,070 Па овој директориум внатрешноста на мојата оперативен систем се сеќава дека мојот 546 00:25:32,070 --> 00:25:34,250 биографија е на локација 123. 547 00:25:34,250 --> 00:25:36,850 Но станува интересно кога ја избришете датотеката. 548 00:25:36,850 --> 00:25:37,820 >> Така на пример - 549 00:25:37,820 --> 00:25:40,790 и за среќа, поголемиот дел од светот има фатени врз тоа - она ​​што се случува кога 550 00:25:40,790 --> 00:25:45,040 ќе повлечете датотека на вашиот Mac OS Ѓубре или вашиот Windows Recycle Bin? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Која е целта на тоа го прават? 553 00:25:50,510 --> 00:25:53,860 Тоа е очигледно за да се ослободи од датотеки, но она што го прави чинот на влечење и 554 00:25:53,860 --> 00:25:57,550 пуштање во вашиот ѓубрето или вашиот Recycle Bin направи на компјутер? 555 00:25:57,550 --> 00:25:59,230 >> Апсолутно ништо, навистина. 556 00:25:59,230 --> 00:26:00,320 Тоа е исто како некој фолдер. 557 00:26:00,320 --> 00:26:01,800 Тоа е посебен фолдер, да бидете сигурни. 558 00:26:01,800 --> 00:26:04,460 Но, дали тоа всушност ја избришете датотеката? 559 00:26:04,460 --> 00:26:06,780 >> Па, не, затоа што некои од вас веројатно биле како, ох по ѓаволите, не сте го сториле 560 00:26:06,780 --> 00:26:07,420 значи да го стори тоа. 561 00:26:07,420 --> 00:26:09,130 Па ќе кликнете два пати на Ѓубрето или Recycle Bin. 562 00:26:09,130 --> 00:26:11,630 Сте појдов наоколу и си обнови на датотеката само со влечење 563 00:26:11,630 --> 00:26:12,110 од таму. 564 00:26:12,110 --> 00:26:14,420 Па јасно, тоа не е нужно да се избрише. 565 00:26:14,420 --> 00:26:15,990 >> Добро, ти си попаметен од тоа. 566 00:26:15,990 --> 00:26:18,860 Вие знаете дека само да го влечете во Ѓубрето или Recycle Bin не значи 567 00:26:18,860 --> 00:26:19,930 ти си празнење на ѓубрето. 568 00:26:19,930 --> 00:26:24,110 А ти оди до менито, и велиш Празни ѓубрето или Празна Recycle Bin. 569 00:26:24,110 --> 00:26:25,360 Тогаш што се случува? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Да, така е избришан повеќе. 572 00:26:32,530 --> 00:26:37,660 Но сето тоа се случува е тоа. 573 00:26:37,660 --> 00:26:45,350 На компјутерот заборава каде resume.doc беше. 574 00:26:45,350 --> 00:26:47,400 >> Но, она што не е променет очигледно на сликата? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 На битови, на 0-ти и 1S дека тврдам се на местото на некои физички аспект на 577 00:26:55,570 --> 00:26:56,280 на хардверот. 578 00:26:56,280 --> 00:26:57,110 Тие се уште е таму. 579 00:26:57,110 --> 00:26:58,930 Тоа е само на компјутер има заборави она што се. 580 00:26:58,930 --> 00:27:03,160 >> Така, тоа е во суштина ослободени на датотеката битови, така што тие можат да бидат пренаменети. 581 00:27:03,160 --> 00:27:06,940 Но не додека не се создадат повеќе датотеки, и повеќе додадени фајлови, и многу повеќе датотеки ќе 582 00:27:06,940 --> 00:27:12,150 probabilistically, оние 0-ти и 1S, оние магнетни честички, се пренаменети, 583 00:27:12,150 --> 00:27:16,220 Главата или десната страна нагоре, за други датотеки, 0-ти и 1S. 584 00:27:16,220 --> 00:27:17,980 >> Па имате овој прозорец на време. 585 00:27:17,980 --> 00:27:19,860 И тоа не е на предвидлив должина, навистина. 586 00:27:19,860 --> 00:27:22,240 Тоа зависи од големината на вашиот хард диск и колку додадени фајлови: имате и 587 00:27:22,240 --> 00:27:23,490 колку брзо ќе направиме нови. 588 00:27:23,490 --> 00:27:27,050 Но, има овој прозорец на време кои таа датотека се уште е совршено 589 00:27:27,050 --> 00:27:27,770 обновуваат. 590 00:27:27,770 --> 00:27:31,050 >> Па ако некогаш го користите програми како McAfee или Norton да се обиде да се опорави 591 00:27:31,050 --> 00:27:35,680 податоци, сите тие се прави се обидува да враќање на оваа т.н. директориум за 592 00:27:35,680 --> 00:27:37,340 дознаам каде вашата датотека беше. 593 00:27:37,340 --> 00:27:40,605 А понекогаш и Нортон и ќе каже, датотека е 93% обновуваат. 594 00:27:40,605 --> 00:27:42,020 Па, она што значи тоа? 595 00:27:42,020 --> 00:27:45,690 Тоа само значи дека некои други датотека случајно заврши со, да речеме, 596 00:27:45,690 --> 00:27:48,920 оние делови од вашиот оригиналната датотека. 597 00:27:48,920 --> 00:27:51,950 >> Значи она што е, всушност, се вклучени во обновувањето на податоците? 598 00:27:51,950 --> 00:27:55,720 Па, ако немате нешто како Нортон пре-инсталиран на вашиот компјутер, 599 00:27:55,720 --> 00:27:59,510 најдобро можете понекогаш може да направите е да се погледне на целиот хард диск во потрага за 600 00:27:59,510 --> 00:28:00,510 моделите на битови. 601 00:28:00,510 --> 00:28:05,350 И една од темите на проблемот сет пет е дека ќе се бара 602 00:28:05,350 --> 00:28:09,570 еквивалент на хард диск, на форензичката сликата на Compact Flash картичка од 603 00:28:09,570 --> 00:28:13,660 дигитален фотоапарат, во потрага за 0-ти и 1S дека обично, со висок 604 00:28:13,660 --> 00:28:16,720 веројатност, претставуваат почеток на еден JPEG сликата. 605 00:28:16,720 --> 00:28:21,120 >> А вие момци можат да повратат оние слики со претпоставувајќи, ако го видам овој модел на 606 00:28:21,120 --> 00:28:24,380 битови на форензичката слика, со голема веројатност, која го означува 607 00:28:24,380 --> 00:28:25,650 почетокот на JPEG. 608 00:28:25,650 --> 00:28:29,520 И ако видам истата шема повторно, што веројатно го означува почетокот на 609 00:28:29,520 --> 00:28:32,440 друг JPEG, и друг JPEG, и друг JPEG. 610 00:28:32,440 --> 00:28:34,970 И ова е типично како податоци за обновување ќе работат. 611 00:28:34,970 --> 00:28:37,870 Што е убаво за JPEG слики е иако форматот на датотеката сама по себе е малку 612 00:28:37,870 --> 00:28:44,400 комплекс, на почетокот на секоја таква датотека е всушност прилично препознатлива 613 00:28:44,400 --> 00:28:47,370 и едноставно, како што ќе видите, Ако не сте веќе. 614 00:28:47,370 --> 00:28:50,270 >> Па ајде да донесе поблиски се погледне под на хаубата како да се токму она што е 615 00:28:50,270 --> 00:28:53,360 случува, и она што овие 0-ти и 1S се, за да ви даде малку повеќе од 616 00:28:53,360 --> 00:28:55,330 контекст за овој посебен предизвик. 617 00:28:55,330 --> 00:28:55,510 >> [Видео репродукција] 618 00:28:55,510 --> 00:28:58,700 >> -Каде вашиот компјутер продавници повеќето на своите постојани податоци. 619 00:28:58,700 --> 00:29:03,390 Да го направите тоа, податоците патува од RAM меморија заедно со софтвер сигнали кои му налагаат 620 00:29:03,390 --> 00:29:06,110 на хард дискот како да се чуваат тие податоци. 621 00:29:06,110 --> 00:29:09,410 На хард дискот кола преведе оние сигнали во напон 622 00:29:09,410 --> 00:29:10,870 флуктуации. 623 00:29:10,870 --> 00:29:14,970 Овие, пак, контрола на хард диск подвижни делови, некои од неколкуте 624 00:29:14,970 --> 00:29:17,910 подвижни делови оставени во современиот компјутер. 625 00:29:17,910 --> 00:29:22,130 >> Некои од сигналите контрола на моторни која се врти метал-обложена Одмори плата. 626 00:29:22,130 --> 00:29:25,470 Вашите податоци е, всушност, чуваат на овие Одмори плата. 627 00:29:25,470 --> 00:29:28,610 Други сигнали се преселат на читање / запишување глави за читање или 628 00:29:28,610 --> 00:29:30,710 пишуваат податоци на Одмори плата. 629 00:29:30,710 --> 00:29:35,450 Оваа машинерија толку прецизни дека човечкиот коса дури и не можеше да помине помеѓу 630 00:29:35,450 --> 00:29:37,280 глави и се врти Одмори плата. 631 00:29:37,280 --> 00:29:40,316 Сепак, сето тоа се работи во страшно брзина. 632 00:29:40,316 --> 00:29:40,660 >> [Крај видео репродукција] 633 00:29:40,660 --> 00:29:42,190 >> Дејвид MALAN: Зголеми малку подлабоко сега во она што е 634 00:29:42,190 --> 00:29:44,360 всушност на оние Одмори плата. 635 00:29:44,360 --> 00:29:44,720 >> [Видео репродукција] 636 00:29:44,720 --> 00:29:47,660 >> -Ајде да погледнеме во она што ние едноставно видов во бавно движење. 637 00:29:47,660 --> 00:29:51,710 Кога еден краток пулсот на електрична енергија е испратени до читање / запишување глава, ако flips 638 00:29:51,710 --> 00:29:54,650 на мал електромагнетно за само мал дел од секунда. 639 00:29:54,650 --> 00:29:58,970 Магнет создава терен, што промени на поларитетот на ситното 640 00:29:58,970 --> 00:30:02,850 дел на метални честички кои палто секоја послужавник површина. 641 00:30:02,850 --> 00:30:05,940 >> Низа серија на овие мали, обвинет-ап области на дискот 642 00:30:05,940 --> 00:30:08,470 претставува еден малку на податоците во бинарен број 643 00:30:08,470 --> 00:30:10,530 систем кој се користи од компјутери. 644 00:30:10,530 --> 00:30:13,775 Сега, ако струјата е испратен еден начин преку читање / запишување глава, од областа 645 00:30:13,775 --> 00:30:15,970 е поларизирано во една насока. 646 00:30:15,970 --> 00:30:17,950 Ако сегашниот е испратена во спротивната насока, 647 00:30:17,950 --> 00:30:19,930 поларизација е обратна. 648 00:30:19,930 --> 00:30:22,370 >> Како може да се добијат податоци од хард дискот? 649 00:30:22,370 --> 00:30:24,090 Само јават на процесот. 650 00:30:24,090 --> 00:30:26,550 Така што е на честички на дискот кои се на струја во 651 00:30:26,550 --> 00:30:27,960 читање / запишување главата движат. 652 00:30:27,960 --> 00:30:30,700 Стави заедно милиони од овие магнетизирани сегменти, и 653 00:30:30,700 --> 00:30:32,160 имаш датотека. 654 00:30:32,160 --> 00:30:36,060 >> Сега, парчиња од една датотека може се расфрлани насекаде на диск е 655 00:30:36,060 --> 00:30:39,970 Одмори плата, на вид како на неред на трудови на вашиот монитор. 656 00:30:39,970 --> 00:30:43,500 Толку специјална дополнителна датотека следи на каде што сè е. 657 00:30:43,500 --> 00:30:45,985 Не сакате сте имале нешто слично на тоа? 658 00:30:45,985 --> 00:30:46,470 >> [Крај видео репродукција] 659 00:30:46,470 --> 00:30:47,820 >> Дејвид MALAN: Добро, веројатно не. 660 00:30:47,820 --> 00:30:52,070 Па, како и многумина од вас момци Пораснав со овие? 661 00:30:52,070 --> 00:30:53,970 Добро, така што е помалку и помалку раце секоја година. 662 00:30:53,970 --> 00:30:56,550 Но јас сум мило што си барем запознаени со нив, бидејќи тоа и нашиот сопствен 663 00:30:56,550 --> 00:31:00,520 книга демо, за жал, се умира многу бавна смрт тука на блискост. 664 00:31:00,520 --> 00:31:04,010 >> Но тоа е она што, барем, во грбот средно училиште, што се користи употреба за бекап. 665 00:31:04,010 --> 00:31:08,110 И тоа беше неверојатно, затоа што може да се сместат 1.4 мегабајти на 666 00:31:08,110 --> 00:31:08,930 ова особено диск. 667 00:31:08,930 --> 00:31:12,260 И тоа беше висока густина верзија, како што е наведено од страна на вашиот HD, кој има 668 00:31:12,260 --> 00:31:14,240 што значи пред HD видео денес. 669 00:31:14,240 --> 00:31:16,400 >> Стандард густина 800 килобајти. 670 00:31:16,400 --> 00:31:18,640 А пред тоа, имаше 400-килобајтен дискови. 671 00:31:18,640 --> 00:31:23,120 А пред тоа, имаше 5 и 1/4 инчен дискови, кои беа навистина флопи, 672 00:31:23,120 --> 00:31:25,680 и малку поширок и повисок од овие работи тука. 673 00:31:25,680 --> 00:31:29,150 Но вие всушност може да се види на т.н. флопи аспект на овие дискови. 674 00:31:29,150 --> 00:31:32,630 >> И функционално, тие се, всушност, прилично слична на хард дискови на на 675 00:31:32,630 --> 00:31:33,570 барем овој тип. 676 00:31:33,570 --> 00:31:37,270 Повторно, SSDs во поновите компјутери работи малку поинаку. 677 00:31:37,270 --> 00:31:41,530 Но ако се преселите дека малку метал табот, всушност можете да видите малку куки, 678 00:31:41,530 --> 00:31:42,560 или послужавник. 679 00:31:42,560 --> 00:31:43,830 >> Тоа не е метал како оваа. 680 00:31:43,830 --> 00:31:46,000 Оваа една е всушност некои поевтини пластичен материјал. 681 00:31:46,000 --> 00:31:46,750 И може да се вид на шаване тоа. 682 00:31:46,750 --> 00:31:50,310 И сте вистинско само збришан некои број на битови или магнетни честички 683 00:31:50,310 --> 00:31:51,220 од овој диск. 684 00:31:51,220 --> 00:31:52,710 >> Па за среќа, нема ништо на неа. 685 00:31:52,710 --> 00:31:55,790 Ако тоа нешто е во начинот на кој - и се покрива твоите очи и оние на вашиот сосед - 686 00:31:55,790 --> 00:31:58,865 можете да само вид на се повлече овој Целата обвивка надвор како што. 687 00:31:58,865 --> 00:32:01,900 Но, има малку пролет, па бидете свесни дека со твоите очи. 688 00:32:01,900 --> 00:32:03,620 Па сега ќе мора навистина флопи диск. 689 00:32:03,620 --> 00:32:07,090 >> И она што е извонреден за ова е дека во колку што ова е 690 00:32:07,090 --> 00:32:10,830 мал обем застапеност на поголема хард диск, овие работи се супер, 691 00:32:10,830 --> 00:32:11,590 супер едноставен. 692 00:32:11,590 --> 00:32:15,170 Ако изклинвам дното на тоа, сега дека дека метал нешто е надвор, и кора 693 00:32:15,170 --> 00:32:20,990 ги отвори, сите таму е е две парчиња почувствува и т.н. флопи диск 694 00:32:20,990 --> 00:32:22,930 со парче метал во внатрешноста. 695 00:32:22,930 --> 00:32:25,990 >> И таму оди половина од мојот диск е содржината. 696 00:32:25,990 --> 00:32:27,540 Таму оди уште половина од нив. 697 00:32:27,540 --> 00:32:31,375 Но тоа е сè што се вртеше во внатрешноста од вашиот компјутер во недалечното минато. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> И повторно, да се стави ова во перспектива, колку е голема е повеќето од вашите 700 00:32:38,310 --> 00:32:39,560 хард дискови, овие денови? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 гигабајти, една Terabyte, можеби во компјутер десктоп, 2 терабајти, 3 703 00:32:46,230 --> 00:32:47,630 терабајти, 4 терабајти, нели? 704 00:32:47,630 --> 00:32:52,480 Ова е еден мегабајт, дава или зема, кои дури и не може да се вклопат типична MP3 705 00:32:52,480 --> 00:32:55,310 повеќе, овие денови, или некои слични музичка датотека. 706 00:32:55,310 --> 00:32:59,500 >> Па малку сувенир за вас денес, и исто така, да ви помогне контекстуализираме што 707 00:32:59,500 --> 00:33:03,570 ние ќе да се донесе здраво за готово сега во проблемот постави пет. 708 00:33:03,570 --> 00:33:04,820 Значи тоа се твое да го задржи. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Па дозволете ми да транзиција кон каде ќе биде трошење на следните pset, како и. 711 00:33:13,370 --> 00:33:18,470 Па ние сме сега во собата оваа страница за - ох, неколку најави брзо. 712 00:33:18,470 --> 00:33:21,730 >> Овој петок, ако би сакал приклучат CS50 за ручек, одат на вообичаено место, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 И финалниот проект - 715 00:33:25,100 --> 00:33:28,520 така на наставната програма, ние сме испратени на Конечниот проект спецификација веќе. 716 00:33:28,520 --> 00:33:31,410 Сфатат дека тоа не значи дека тоа е поради особено наскоро. 717 00:33:31,410 --> 00:33:33,990 Тоа е објавена, навистина, само за да се добие вие момци размислување за тоа. 718 00:33:33,990 --> 00:33:37,620 И навистина, супер значајни процент од вас ќе биде справување со 719 00:33:37,620 --> 00:33:40,780 конечна проекти на материјалот што го не се ни добивано и во класата, 720 00:33:40,780 --> 00:33:42,730 но ќе им почетокот на идната недела. 721 00:33:42,730 --> 00:33:45,530 >> Забележете, сепак, дека спецификации повикува на неколку различни компоненти на 722 00:33:45,530 --> 00:33:46,190 конечниот проект. 723 00:33:46,190 --> 00:33:49,590 Првиот, за неколку недели, е пред-предлог, прилично секојдневен e-mail на 724 00:33:49,590 --> 00:33:52,760 Вашиот ТФ да му каже или она што сте размислува за за вашиот проект, со 725 00:33:52,760 --> 00:33:53,650 не се обврзува. 726 00:33:53,650 --> 00:33:56,710 Предлогот ќе биде вашиот особено посветеност, велејќи дека, еве, ова е она што 727 00:33:56,710 --> 00:33:57,770 Би сакал да се направи за мојот проект. 728 00:33:57,770 --> 00:33:58,250 Што мислите? 729 00:33:58,250 --> 00:33:58,650 Премногу голема? 730 00:33:58,650 --> 00:33:59,145 Премногу мал? 731 00:33:59,145 --> 00:34:00,330 Тоа е податлив? 732 00:34:00,330 --> 00:34:02,230 И ќе видите на спецификации за повеќе детали. 733 00:34:02,230 --> 00:34:05,060 >> Неколку недели после тоа е статусот Извештајот, што е слично 734 00:34:05,060 --> 00:34:08,260 неврзан-маил на вашиот ТФ да каже точно колку далеку зад себе сте во вашата конечна 735 00:34:08,260 --> 00:34:12,360 проектот имплементација, проследено со на CS50 Hackathon кои секој 736 00:34:12,360 --> 00:34:17,520 е поканет, која ќе биде настан од 20:00 за една вечер до 07:00 737 00:34:17,520 --> 00:34:19,150 AM следното утро. 738 00:34:19,150 --> 00:34:22,560 Пица, како што може да ги спомнав во недела нула, ќ бидат послужени во 09:00, 739 00:34:22,560 --> 00:34:24,120 Кинески храна во 01:00. 740 00:34:24,120 --> 00:34:27,929 И ако сте уште будни во 05:00, ние ќе ве однесе до IHOP за доручек. 741 00:34:27,929 --> 00:34:31,310 >> Па Hackathon е еден од повеќе незаборавни искуства во класата. 742 00:34:31,310 --> 00:34:35,290 Потоа спроведувањето се должи, и тогаш climactic CS50 саем. 743 00:34:35,290 --> 00:34:38,070 Повеќе детали за сите овие во неделите што доаѓаат. 744 00:34:38,070 --> 00:34:40,739 >> Но, ајде да се вратиме на нешто старата школа - 745 00:34:40,739 --> 00:34:41,920 повторно, низа. 746 00:34:41,920 --> 00:34:45,040 Па низа беше убаво, бидејќи тоа го решава проблеми како што видовме само 747 00:34:45,040 --> 00:34:49,290 момент пред со студентски структури добивање малку надвор од контрола, ако ние 748 00:34:49,290 --> 00:34:52,405 сакате да имате студент една, студент две, студент три, студент точки точка точка, 749 00:34:52,405 --> 00:34:54,400 некои произволен број на студенти. 750 00:34:54,400 --> 00:34:58,850 >> Па низи, пред неколку недели, swooped во и реши сите наши проблеми на не 751 00:34:58,850 --> 00:35:03,340 знаејќи однапред колку многу нешта на некои од типот ние би можеле да сакаат. 752 00:35:03,340 --> 00:35:07,390 И видовме дека structs може да ни помогне понатаму организира нашиот код и да ја задржите 753 00:35:07,390 --> 00:35:11,660 концептуално слични променливи, како име и куќа, заедно, така што ние 754 00:35:11,660 --> 00:35:15,570 можат да ги третираат како еден ентитет, во внатрешноста од кои постојат помали парчиња. 755 00:35:15,570 --> 00:35:17,810 >> Но низи имаат некои недостатоци. 756 00:35:17,810 --> 00:35:19,780 Кои се некои од недостатоците ние наишле 757 00:35:19,780 --> 00:35:22,320 со низи досега? 758 00:35:22,320 --> 00:35:23,450 Што е тоа? 759 00:35:23,450 --> 00:35:28,130 Фиксна големина - па иако може да биде во можност да алоцира меморија за 760 00:35:28,130 --> 00:35:32,310 низа, откако ќе се знае колку студенти имате, колку знаци можете да 761 00:35:32,310 --> 00:35:35,460 од корисникот, еднаш сте распределени на низата, сте вид на насликаните 762 00:35:35,460 --> 00:35:36,740 себеси во некој ќош. 763 00:35:36,740 --> 00:35:40,600 >> Бидејќи не можете да вметнете нови елементи во средината на низа. 764 00:35:40,600 --> 00:35:43,660 Вие не може да внесете повеќе елементи на крајот на низата. 765 00:35:43,660 --> 00:35:47,750 Навистина, ќе мора да прибегне кон создавање на цела нова низа, како што ние си дискутира, 766 00:35:47,750 --> 00:35:49,320 копирање на старата во новата. 767 00:35:49,320 --> 00:35:52,610 И повторно, тоа е главоболка која GetString се занимава со за вас. 768 00:35:52,610 --> 00:35:56,170 >> Но, повторно, не можеш ни да вметнете нешто во средината на низата 769 00:35:56,170 --> 00:35:58,200 доколку стапката не е целосно исполнет. 770 00:35:58,200 --> 00:36:03,010 На пример, ако оваа низа тука на големина шест има само пет нешта во него, 771 00:36:03,010 --> 00:36:06,080 Па, можете да само тактика нешто кон крајот. 772 00:36:06,080 --> 00:36:08,200 Но што ако сакате да вметнете нешто во средината на 773 00:36:08,200 --> 00:36:11,280 низа, иако тоа би можело да има пет од шест нешта во него? 774 00:36:11,280 --> 00:36:14,250 >> Па, она што го правиме кога имавме сите на нашите човечки волонтери на сцената во 775 00:36:14,250 --> 00:36:15,110 недели минатото? 776 00:36:15,110 --> 00:36:18,710 Ако сакавме да се стави некој тука, или овие луѓе како да се помести ова 777 00:36:18,710 --> 00:36:22,540 начин, или овие луѓе како да се помести ова начин, а тоа стана скапо. 778 00:36:22,540 --> 00:36:26,950 Менувањето на луѓето во внатрешноста на низа заврши додавање и чини 779 00:36:26,950 --> 00:36:31,240 ни време, па оттука и многу од нашите n квадрат водење времиња како вметнување вид, за 780 00:36:31,240 --> 00:36:32,550 пример, во најлош случај. 781 00:36:32,550 --> 00:36:36,520 Па низи се големи, но мора да знае однапред колку е голема што сакате. 782 00:36:36,520 --> 00:36:38,030 >> Па Добро, тука е решение. 783 00:36:38,030 --> 00:36:43,860 Ако не знам однапред колку студентите би можеле да имаат, и знам дека еднаш 784 00:36:43,860 --> 00:36:47,870 Јас одлучувам, иако, јас сум заглавен со тоа многу студенти, зошто не можам само секогаш 785 00:36:47,870 --> 00:36:51,740 распредели двојно повеќе простор како што можеле да помислат дека ми е потребно? 786 00:36:51,740 --> 00:36:54,450 Зарем не е тоа разумно решение? 787 00:36:54,450 --> 00:36:58,240 >> Реално, јас не мислам дека ние сме ќе треба повеќе од 50 слотови 788 00:36:58,240 --> 00:37:02,190 во низа за средни класа, па да се заокружи. 789 00:37:02,190 --> 00:37:07,040 Јас ќе се направи 100 слотови во мојата низа, само така што ние дефинитивно може да се добие 790 00:37:07,040 --> 00:37:10,330 број на студенти Очекувам да да биде во некои средни класа. 791 00:37:10,330 --> 00:37:14,320 Па зошто да не само се заокружи и да се распределат повеќе меморија, обично, за низа 792 00:37:14,320 --> 00:37:16,290 отколку што мислите вие ​​може дури да е потребно? 793 00:37:16,290 --> 00:37:20,190 Што е овој едноставен pushback на таа идеја? 794 00:37:20,190 --> 00:37:21,440 >> Сте само трошат меморија. 795 00:37:21,440 --> 00:37:25,350 Буквално секоја програма ти пишувам тогаш е можеби со користење двојно повеќе меморија, како 796 00:37:25,350 --> 00:37:26,680 што навистина треба. 797 00:37:26,680 --> 00:37:28,990 И дека едноставно не се чувствувам како особено елегантно решение. 798 00:37:28,990 --> 00:37:31,990 Покрај тоа, таа само ја намалува веројатноста за проблемот. 799 00:37:31,990 --> 00:37:35,300 Ако се случи да имаат популарна разбира еден семестар и имаш 101 800 00:37:35,300 --> 00:37:39,610 студенти, вашата програма е уште фундаментално соочува со истиот проблем. 801 00:37:39,610 --> 00:37:44,280 >> Па за среќа, постои решение за оваа реклама сите наши проблеми во форма 802 00:37:44,280 --> 00:37:46,790 на структури на податоци кои се посложени од оние 803 00:37:46,790 --> 00:37:47,970 ние сме виделе досега. 804 00:37:47,970 --> 00:37:50,530 Ова, тврдам, е поврзано листа. 805 00:37:50,530 --> 00:37:51,920 Ова е листа на броеви - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, и 34 - 807 00:37:54,970 --> 00:38:00,120 кои се поврзани заедно преку од она што сум подготвен како стрели. 808 00:38:00,120 --> 00:38:03,580 >> Со други зборови, ако сакав да претставуваат низа, можам да ја направам 809 00:38:03,580 --> 00:38:04,910 нешто како ова. 810 00:38:04,910 --> 00:38:07,310 И јас ќе се стави ова на надземни во само еден миг. 811 00:38:07,310 --> 00:38:09,970 Јас би можеле да го направи - 812 00:38:09,970 --> 00:38:12,520 Здраво, сите во право. 813 00:38:12,520 --> 00:38:14,470 Стојат од страна. 814 00:38:14,470 --> 00:38:17,360 Нов компјутер тука, јасна - 815 00:38:17,360 --> 00:38:18,090 сите во право. 816 00:38:18,090 --> 00:38:21,730 >> Па ако имам овие броеви во низа - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 не мора да скала. 819 00:38:30,530 --> 00:38:33,730 Сите во право, па тука е мојата низа - 820 00:38:33,730 --> 00:38:34,980 О, боже. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Сите во право, па тука е мојата низа. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 О, боже. 825 00:38:45,050 --> 00:38:48,820 >> [Смеа] 826 00:38:48,820 --> 00:38:49,440 >> Дејвид MALAN: се преправаат. 827 00:38:49,440 --> 00:38:52,330 Тоа е премногу напор да се вратиш назад и да ја поправите тоа, па таму - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Па ние имаме оваа низа на 9, 17, 22, 26, и 34. 830 00:38:57,650 --> 00:39:00,260 За оние од вас може да се види срамно грешка Јас само направи, 831 00:39:00,260 --> 00:39:00,830 таму е. 832 00:39:00,830 --> 00:39:04,490 >> Така тврдам дека ова е многу ефикасно решение. 833 00:39:04,490 --> 00:39:07,310 Сум распределени како многу ints како Ми треба - една, две, три, 834 00:39:07,310 --> 00:39:09,100 четири, пет или шест - 835 00:39:09,100 --> 00:39:11,660 и јас сум потоа се чуваат на броеви во внатрешноста на оваа низа. 836 00:39:11,660 --> 00:39:15,220 Но, да претпоставиме, тогаш, сакам да се вметне вредност, како на бројот 8? 837 00:39:15,220 --> 00:39:16,100 Па, каде се оди? 838 00:39:16,100 --> 00:39:18,530 Претпоставувам дека сакате да го вметнете голем број како 20. 839 00:39:18,530 --> 00:39:19,790 Па, каде се оди? 840 00:39:19,790 --> 00:39:23,160 Таму некаде во средината, или бројот 35 треба да оди 841 00:39:23,160 --> 00:39:24,010 некаде на крајот. 842 00:39:24,010 --> 00:39:25,320 Но, јас сум сите надвор од просторот. 843 00:39:25,320 --> 00:39:29,120 >> И така ова е основен предизвик на низи кои не се решение. 844 00:39:29,120 --> 00:39:32,280 Јас тврдеше дека пред еден миг, GetString решава овој проблем. 845 00:39:32,280 --> 00:39:37,380 Ако сакате да го вметнете шестиот број во оваа низа, што е најмалку една 846 00:39:37,380 --> 00:39:40,090 решение може да падне повторно на сигурно, исто како што го правиме со GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Што е тоа? 849 00:39:46,030 --> 00:39:48,190 >> Па, го прават тоа поголем е полесно, рече отколку да се направи. 850 00:39:48,190 --> 00:39:52,810 Ние не мора да може да се направи низа поголема, но она што можеме да направиме? 851 00:39:52,810 --> 00:39:56,570 Направете нова низа која е поголема, на големината 6, или можеби големина 10, ако сакаме 852 00:39:56,570 --> 00:40:00,490 да се понапред од работите, а потоа копирајте стариот низа во новата, а потоа 853 00:40:00,490 --> 00:40:01,680 ослободи стариот низа. 854 00:40:01,680 --> 00:40:05,770 >> Но она што е трчање време сега на тој процес? 855 00:40:05,770 --> 00:40:09,870 Тоа е големо O на n, бидејќи копирање се случува да ве чини некои единици на 856 00:40:09,870 --> 00:40:13,480 време, па не е толку идеален, ако ние треба да додели нова низа, која ќе 857 00:40:13,480 --> 00:40:15,610 да се консумираат двапати повеќе меморија привремено. 858 00:40:15,610 --> 00:40:16,660 Копирате старите во нови - 859 00:40:16,660 --> 00:40:18,800 Мислам, тоа е само главоболка, која е, повторно, зошто ние напиша 860 00:40:18,800 --> 00:40:19,920 GetString за вас. 861 00:40:19,920 --> 00:40:21,380 >> Така што можеме да го направите наместо неа? 862 00:40:21,380 --> 00:40:25,000 Па, што ако нашите податоци структура всушност има празнини во неа? 863 00:40:25,000 --> 00:40:30,790 Да претпоставиме дека јас се релаксираат мојата цел на постоење на соседни парчиња на меморија, каде што 9 864 00:40:30,790 --> 00:40:34,500 е веднаш до 17, што е Веднаш до 22, и така натаму. 865 00:40:34,500 --> 00:40:39,570 >> И претпоставувам дека 9 може да биде над тука во RAM меморија, и 17 може да биде над тука во RAM меморија, 866 00:40:39,570 --> 00:40:40,990 и 22 може да биде над тука во RAM меморија. 867 00:40:40,990 --> 00:40:43,610 Со други зборови, не ми требаат дури и назад да се врати повеќе. 868 00:40:43,610 --> 00:40:47,850 Јас само треба некако да се нишка игла преку секој од овие броеви, или секоја 869 00:40:47,850 --> 00:40:51,010 на овие јазли, како што ќе се јавите на правоаголници како што сум ги нацртано, да 870 00:40:51,010 --> 00:40:55,670 се сеќавам како да стигнете до последната како јазол од првиот. 871 00:40:55,670 --> 00:40:59,940 >> Значи она што е програмирање конструкција видовме неодамна со која се 872 00:40:59,940 --> 00:41:03,030 може да се спроведе таа тема, или подготвени тука, со која можам 873 00:41:03,030 --> 00:41:05,430 имплементираат оние стрели? 874 00:41:05,430 --> 00:41:06,500 Па покажувачи, нели? 875 00:41:06,500 --> 00:41:09,560 Ако не ги распредели само int, но еден јазол - и од страна на 876 00:41:09,560 --> 00:41:10,810 јазол, јас само значи сад. 877 00:41:10,810 --> 00:41:12,900 И визуелно, мислам правоаголник. 878 00:41:12,900 --> 00:41:16,420 Па еден јазол очигледно треба да содржи две вредности - 879 00:41:16,420 --> 00:41:21,490 на int себе, а потоа, како имплицирани од на долниот дел на правоаголник, 880 00:41:21,490 --> 00:41:23,010 доволно простор за Инт. 881 00:41:23,010 --> 00:41:26,130 >> Па само размислување напред тука, колкав е овој јазол, овој 882 00:41:26,130 --> 00:41:27,170 сад во прашање? 883 00:41:27,170 --> 00:41:29,250 Колку бајти за int? 884 00:41:29,250 --> 00:41:31,310 Веројатно 4, ако тоа е иста како и обично. 885 00:41:31,310 --> 00:41:33,270 А потоа колку бајти за покажувачот? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Значи ова сад, или овој јазол, е ќе биде на 8-бајт структура. 888 00:41:37,940 --> 00:41:41,760 Ох, и дека е среќен случајно тоа што ние само воведе овој поим на 889 00:41:41,760 --> 00:41:44,400 на struct, или структура Ц. 890 00:41:44,400 --> 00:41:48,890 >> Така тврдам дека сакам да се преземе чекор кон оваа пософистицирани 891 00:41:48,890 --> 00:41:52,560 имплементација на листа на броеви, поврзани листа на броеви, јас треба да се направи 892 00:41:52,560 --> 00:41:56,920 малку повеќе размислување до пред и изјаснат не само int, но struct 893 00:41:56,920 --> 00:41:58,620 дека јас ќе се јавам, конвенционално тука, јазол. 894 00:41:58,620 --> 00:42:01,630 Ние би можеле да го наречеме нешто што сакаме, но јазол ќе биде тематски во многу 895 00:42:01,630 --> 00:42:03,560 од работите да се свртиме кон сега. 896 00:42:03,560 --> 00:42:06,480 >> Внатре во тоа јазол е int n. 897 00:42:06,480 --> 00:42:09,350 А потоа оваа синтакса, малку чудно на прв поглед - 898 00:42:09,350 --> 00:42:12,960 struct јазол * следната. 899 00:42:12,960 --> 00:42:16,900 И сликовито, што е тоа? 900 00:42:16,900 --> 00:42:21,000 Тоа е дното половина од правоаголникот што сме го виделе 901 00:42:21,000 --> 00:42:22,730 само еден миг пред. 902 00:42:22,730 --> 00:42:27,600 >> Но, зошто сум јас велејќи struct јазол * за разлика од само јазол *? 903 00:42:27,600 --> 00:42:31,370 Бидејќи ако тоа покажувачот е да се покажува на друг јазол, тоа е само на 904 00:42:31,370 --> 00:42:32,760 адреса на јазол. 905 00:42:32,760 --> 00:42:35,630 Тоа е во согласност со она што ние сме дискутира за покажувачи досега. 906 00:42:35,630 --> 00:42:39,690 Но, зошто, ако тврдам оваа структура е наречен јазол, морам да кажам struct 907 00:42:39,690 --> 00:42:42,660 јазол внатре тука? 908 00:42:42,660 --> 00:42:43,190 >> Токму така. 909 00:42:43,190 --> 00:42:46,490 Тоа е вид на глупави реалноста на В На typedef, така да се каже, не има 910 00:42:46,490 --> 00:42:47,220 случило досега. 911 00:42:47,220 --> 00:42:48,510 Ц е супер буквално. 912 00:42:48,510 --> 00:42:51,050 Таа го чита вашиот код врвот до дното, лево кон десно. 913 00:42:51,050 --> 00:42:54,930 И додека таа хитови што запирка за крајна линија, погоди што не 914 00:42:54,930 --> 00:42:57,590 постои како тип на податок? 915 00:42:57,590 --> 00:42:59,060 Јазол, цитат unquote јазол. 916 00:42:59,060 --> 00:43:03,050 >> Но, бидејќи на повеќе опширниот декларација што го направив на првата линија - 917 00:43:03,050 --> 00:43:05,340 typedef struct јазол - 918 00:43:05,340 --> 00:43:08,790 затоа што доаѓа прво, пред кадрави загради, тоа е вид на како 919 00:43:08,790 --> 00:43:11,800 претходна едукација ѕвекот тоа, знаеш што, ми даде struct 920 00:43:11,800 --> 00:43:13,570 наречен struct јазол. 921 00:43:13,570 --> 00:43:16,270 Искрено, не ми се допаѓа повикувајќи работи struct јазол, struct јазол сите 922 00:43:16,270 --> 00:43:17,090 во текот на мојот код. 923 00:43:17,090 --> 00:43:20,660 Но јас само ќе го користите еднаш, само внатре, така што јас може ефикасно 924 00:43:20,660 --> 00:43:25,010 се создаде еден вид на кружни референца не, покажувач на себе по себе, туку 925 00:43:25,010 --> 00:43:29,400 покажувачот до друг на идентична тип. 926 00:43:29,400 --> 00:43:32,330 >> Значи излегува дека на податочна структура вака, има неколку 927 00:43:32,330 --> 00:43:34,470 операции кои би можеле да бидат од интерес за нас. 928 00:43:34,470 --> 00:43:37,460 Ние можеби ќе сакате да се вметне во листата вака. 929 00:43:37,460 --> 00:43:39,850 Ние можеби ќе сакате да ги избришете од листата вака. 930 00:43:39,850 --> 00:43:43,490 Ние можеби ќе сакате да пребарувате на листа за вредност, или поопшто, напречни. 931 00:43:43,490 --> 00:43:46,410 И напречни е само стилизиран начин на велејќи почетокот на лево и да се движат сите 932 00:43:46,410 --> 00:43:47,650 начинот на десно. 933 00:43:47,650 --> 00:43:52,640 >> И известување, дури и со оваа малку повеќе софистицирани податочна структура, нека 934 00:43:52,640 --> 00:43:56,510 ме предложи дека ние може да позајми некои од идеите на изминатите две недели и 935 00:43:56,510 --> 00:43:58,410 спроведување на функција наречена пребарување вака. 936 00:43:58,410 --> 00:44:01,360 Тоа се случува да се вратат точно или лажни, што укажува, да или 937 00:44:01,360 --> 00:44:03,390 Не, n е во листата. 938 00:44:03,390 --> 00:44:05,960 Својата втора аргумент е покажувач на листата по себе, па 939 00:44:05,960 --> 00:44:07,920 покажувач кон јазол. 940 00:44:07,920 --> 00:44:10,350 >> Сите Одам да потоа направите е да прогласат привремена променлива. 941 00:44:10,350 --> 00:44:12,730 Ние ќе го наречеме кон меморија од Конвенцијата, за покажувачот. 942 00:44:12,730 --> 00:44:15,220 И јас ја доделите еднаква на почнувајќи од листата. 943 00:44:15,220 --> 00:44:16,680 >> И сега забележите додека јамка. 944 00:44:16,680 --> 00:44:20,640 Толку долго како покажувач не е еднаква на нула, јас ќе одам да проверам. 945 00:44:20,640 --> 00:44:24,520 Е покажувачот стрелката n еднаква на на n, кој беше донесен во? 946 00:44:24,520 --> 00:44:26,410 И почекајте една минута - нова парче синтакса. 947 00:44:26,410 --> 00:44:29,324 Што е arrow одеднаш? 948 00:44:29,324 --> 00:44:30,574 Да? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Токму така. 951 00:44:34,810 --> 00:44:38,860 Па додека неколку минути, ние се користат нотација точка за пристап до нешто 952 00:44:38,860 --> 00:44:43,080 внатрешноста на на struct, ако променливата имате не е на struct 953 00:44:43,080 --> 00:44:47,420 себе, туку покажувач кон struct, за среќа, едно парче од синтаксата што 954 00:44:47,420 --> 00:44:48,620 конечно го прави интуитивно чувство. 955 00:44:48,620 --> 00:44:52,360 На стрелката значи да се следи покажувач, како и нашите стрели обично значи 956 00:44:52,360 --> 00:44:56,570 сликовито, и да одат на податочното поле внатре. 957 00:44:56,570 --> 00:44:59,700 Па стрелката е истото како точка, но го користиш, кога ќе имаат покажувач. 958 00:44:59,700 --> 00:45:05,270 >> Значи само да повториме тогаш, Ако полето n во внатрешноста на struct наречен покажувачот 959 00:45:05,270 --> 00:45:07,760 еднакво еднаква на n, врати вистина. 960 00:45:07,760 --> 00:45:11,970 Инаку, ова линија тука - покажувач еднакво покажувачот следната. 961 00:45:11,970 --> 00:45:17,540 Па што оваа е тоа, известување, е ако јас сум во моментов посочувајќи на struct 962 00:45:17,540 --> 00:45:21,430 кои содржат 9, и 9 не е број Јас сум во потрага за - Претпоставувам дека сум во потрага 963 00:45:21,430 --> 00:45:22,830 за n еднаква на 50 - 964 00:45:22,830 --> 00:45:25,930 Одам да се ажурира мојот привремено покажувачот да не укаже на овој јазол 965 00:45:25,930 --> 00:45:31,190 повеќе, но покажувачот стрелката, која се случува да ме стави тука. 966 00:45:31,190 --> 00:45:34,270 >> Сега, сфатив е виорот вовед. 967 00:45:34,270 --> 00:45:37,380 Во средата, ние всушност ќе го правиме ова со некои луѓе и со некои повеќе 968 00:45:37,380 --> 00:45:38,900 код со побавно темпо. 969 00:45:38,900 --> 00:45:42,990 Но сфати, ние сме сега ги направиме нашите податоци структури посложени, така што нашите 970 00:45:42,990 --> 00:45:45,780 алгоритми може да се добие поефикасен, која ќе биде услов за 971 00:45:45,780 --> 00:45:50,500 pset шест, кога ќе се вчита во, повторно, оние 150.000 зборови, но треба да го стори тоа 972 00:45:50,500 --> 00:45:55,650 ефикасно, и идеално, се создаде програма која работи за нашите корисници кои не се 973 00:45:55,650 --> 00:46:00,460 линеарна, не во N квадрат, но во постојана време, во идеален. 974 00:46:00,460 --> 00:46:02,300 >> Ќе се видиме во средата. 975 00:46:02,300 --> 00:46:07,240 >> Воведничар: На следниот CS50, Дејвид заборава својата база случај. 976 00:46:07,240 --> 00:46:12,770 >> Дејвид MALAN: А тоа е како ти пратам текстуални пораки со C. Што - 977 00:46:12,770 --> 00:46:14,020 >> [РАЗЛИЧНИ текстуална порака ИЗВЕСТУВАЊЕ звучи] 978 00:46:14,020 --> 00:46:19,734