[Powered by Google Translate] [Недела 5]
[Дејвид Џ Malan, Универзитетот Харвард]
[Ова е CS50.] [CS50.TV]
[Жена] Тој лежи, околу што, не знам.
[Човекот] Значи она што го знаеме ова?
[Жена] Тоа во 09:15, Реј Santoya беше на банкомат.
[Човекот] Значи, прашањето е, што правел во 09:16?
[Жена] Снимањето на 9 мм во нешто.
Можеби виде снајперист.
[Човекот] Или тој работи со него.
[Жена] Чекај. Вратете се назад едно.
[Човекот] Што гледате?
[♫ напнато музика ♫]
[Жена] Донеси лицето нагоре. Цел екран.
[Човекот] очилата. >> Има рефлексија.
[♫ напнато музика ♫]
[Човекот] Тоа е безбол тим Nuevita е. Тоа е нивното лого.
[Жена] И тој зборува за секој кој е облечен дека јакна.
>> [Дејвид Malan] Значи, ова е CS50 недела 5, а денес ние го уништи малку на телевизија и филм за вас.
Значи секогаш кога ќе гледате шоу како овој овде,
и полицајци велат дека "може да се чисти кои се?" или "Подобрување"
не постои подобрување во реалниот свет.
Всушност, она што навистина се е малку нешто како ова.
Сум го зафрла еден од вработените фотографии од страната.
Ова е програма наречена Фотошоп. Ова е 1 од 2 Bowdens,
1 од 3 Bowdens всушност, денес, бидејќи имаме г-ѓа Бауден тука, како и со Роб и Павле.
Но, тука е Роб на екранот, и ако зумирате на кои трепкаат тој секогаш имаше во неговите очи,
она што всушност се види е дека она што го гледате е она што го добивате.
Ова е "подобрена", па "CSI" имаат малку погрешно.
Има една друга клип, ако можеме да ги собереш на "CSI" само малку подолго.
Ова е еден убав фраза да ја изговори отсега ако сакате да
звук технички се со вашите пријатели кога, навистина, ти си велејќи дека апсолутно ништо.
>> [Човекот] Со недели сум бил истражување на Cabby убиец убиства
со одреден морбидно фасцинација.
[Жена # 1] Ова е во реално време.
[Жена # 2] Јас ќе создаде GUI интерфејс со користење на Visual Basic, да видам дали можам да ги пратите IP адреса.
>> [Malan] Значи аудио надвор од синхронизирате настрана, создавајќи GUI интерфејс со користење на Visual Basic
да ги пратите IP адреса е целосна глупост.
Овие денови не ќе го користи Visual Basic,
нема потреба за GUI, и IP адресата е технички точни мандат.
Па да се внимава од за нив, и еден од моите омилени:
Оваа една е малку повеќе таинствени, затоа што треба да се знае на друг јазик.
Има еден јазик се нарекува Objective-C, која е superset на В
Што значи тоа е C плус некои дополнителни функции, меѓу нив и објектно-ориентираното програмирање.
И ова е јазикот на кој Епл ја популаризира за iOS програмирање.
И така тука е сцена од различни шоу целосно, од "броеви"
дека ако навистина се погледне одблизу на вашиот TiVo и пауза во вистински момент,
ќе видите дека она што го барате не е сосема она што се опишува.
И дозволете ми да се обиде на различни аудио приклучок тука и да видиме ако не можеме да
задржи на аудио во синхронизација тоа време.
Јас ви даде "броеви".
>> [Човекот # 1] Тоа е 32-битен IPv4 адреса.
[Човекот # 2] IP адреса, тоа е на интернет. >> Приватна мрежа. Тоа е приватна мрежа на Anita.
[Malan] Во ред. Ова е Objective-C, а тоа е за боење програма некои детски,
како што можеби може да заклучиме од името на променливата таму.
Така што, тогаш, е "броеви". Така, денес и оваа недела ќе се воведат
малку на светот на криминолошки науки и контекстот во проблеми поради тоа.
Денес ќе биде скратен предавање бидејќи има специјален настан во тука
потоа, па ние ќе се погледнеме и душманке и учениците и родителите, така и денес
со некои од работите кои се на хоризонтот.
Меѓу нив, од понеделник, ќе имате уште неколку соученици.
Edx, Харвард и mits нова онлајн иницијатива за отворени курсеви
и повеќе, е подигнувањето на кампусот на Харвард во понеделникот.
Што значи дојде понеделник ќе имаат - како на последно брои,
86.000 дополнителни соученици ќе бидат следниве заедно со предавања CS50 е
и секции и walkthroughs и проблемот комплети.
И како дел од ова, ќе станат членки на инаугуративната класа на
CS50 и сега CS50x.
>> Како дел од ова, сега, свесни дека ќе има некои квит, како и.
Да се ​​подготвени за тоа, за голем број на студенти,
доволно е да се каже дека иако имаме 108 TFS и CAS,
не е сосема најдобар ученик / наставник сооднос еднаш сме го погоди 80.000 други студенти.
Па ние нема да се оценување толку многу проблем поставува рачно.
Значи воведе оваа недела во проблемот собата ќе биде CS50 Проверете,
која ќе биде командната линија за комунални услуги во рамките на апаратот
дека ќе добиете откако ќе го ажурирате подоцна овој викенд,
и ќе бидете во можност да извршите команда, проверете 50,
на свој pset, и ќе добиете некои повратни информации за тоа дали вашата програма е
точни или неточни според различни спецификации за дизајнот што се предвидени.
Па повеќе за тоа и проблемот сет спецификација и
на CS50x соученици ќе биде со користење на овој, како и.
>> Значи проблемот сет 4 е за сите науки.
И ова парче бил инспириран од некои реални нешта,
при што, кога бев во дипломиран училиште, јас интерниран за некое време со
Канцеларијата Middlesex Каунти Окружниот правобранителство прави форензичар работа
со олово форензичар иследник, и што тоа изнесува
е, мислам дека јас спомнав изминатите неколку недели, е масовно држава полицијата или другите
ќе дојдат, тие ќе заспивам работи како хард дискови и компакт дискови и дискети
и слично, а потоа целта на криминолошки науки канцеларија беше да се утврди дали
имало или не беше доказ на некој вид.
Ова беше специјални истраги единица, па тоа беше чиновнически криминал,
тоа беше повеќе вознемирувачки вид на кривични дела,
ништо вклучуваат некој вид на дигиталните медиуми, излегува дека не дека многу луѓе
напишете е-маил велејќи: "Јас го направив тоа."
Па доста често овие криминолошки науки пребарувања не се претвори до сите дека многу овошје,
но понекогаш луѓето ќе пишуваат такви пораки.
Па понекогаш напори беа наградени.
>> Но да се доведе до оваа судска pset, ќе биде воведување во pset 4 малку графика.
Па најверојатно ги преземат овие нешта здраво за готово, JPEG слики, GIFs и слично овие денови,
но ако навистина мислиш за тоа, слика, слично како лице на Rob,
може да се моделираат како низа од точки, или пиксели.
Сега, во случај на лицето на Rob, има сите видови на бои,
и почнавме да ја видите поединечни точки, otherwide познати како пиксели,
еднаш почнавме да зумирате внатре
Но, ако ги поедностави светот малку, и само велат дека ова тука е Rob
во црно и бело, добро, да ги претставуваат црна и бела ние само може да се користи бинарни.
И ако ние се случува да се користи бинарни, 1 или 0, можеме да ги изразат оваа иста слика
на насмеано лице Rob со овој модел на битови: 11000011 претставува
бела, бела, црна, црна, црна, црна, бела бела боја.
И така тоа не е огромен скок, а потоа, да почнам да зборувам за шарени фотографии.
Работи што ќе видите на Фејсбук или се со дигитална камера,
но, секако, кога станува збор за боите, ви треба повеќе битови.
И доста честа појава во светот на фотографии е да се користи не 1-bit-на боја,
како ова сугерира, но 24-битна боја, каде што всушност милиони бои.
Така што кога ќе зумира во на око на Rob во случајот,
тоа беше било кој број на милиони различни шарени можности.
>> Па ние ќе се воведе ова проблем сет 4, како и во Walkthrough,
кој ќе биде денес во 03:30 наместо вообичаените 02:30 поради предавање во петокот тука.
Но, на видео ќе биде онлајн, како и обично, утре.
Ние исто така ќе ве запознаам со друг формат на датотека.
Значи ова е намерно со цел да изгледа застрашувачки на прв,
но ова е само некоја документација за struct Ц.
Излегува дека Мајкрософт, пред неколку години, помогна во промовирањето на овој формат,
наречен bitmap формат на датотека, BMP, и ова е супер-едноставни,
шарени графички формат на датотека која се користи за сосема извесно време
а понекогаш уште за позадини за десктоп компјутерите.
Ако мислите назад на Windows XP и ридови и сино небо,
тоа беше обично BMP, или bitmap слика, и bitmaps
се забавуваат за нас, бидејќи тие имаат малку повеќе комплексност.
Тоа не е толку едноставно како ова решетка од 0 и 1 е;
наместо тоа, имаш работи како насловот на почетокот на датотека.
Значи со други зборови, во внатрешноста на. BMP датотека е целиот куп на 0 и 1 е,
но има некои дополнителни 0 и 1 во таму.
И излегува дека она што веројатно зема здраво за готово со години,
формати на датотеки како. doc или. xls или. mp3 или. Mp4,
без оглед на формати на датотеки кои сте запознаени со.
Па, она што е дури и значи да се биде формат на датотека?
Бидејќи на крајот на денот, сите овие датотеки ние ги користиме имаат само 0 и 1 е
а можеби и оние 0 и 1 ги претставува, б, в, преку ASCII или слично,
но до крајот на денот, тоа е само 0 и 1 е.
>> Значи луѓето само повремено одлучи да измисли нов формат на датотека
каде што се стандардизира какви модели на битови, всушност, ќе значи.
И во овој случај тука, на луѓе кои дизајниран bitmap формат на датотека
рече дека во првиот бајт во битмапа датотеки, како означува со офсет 0, таму,
таму ќе биде некои cryptically име променлива наречена bfType,
кои само се залага за bitmap тип на датотека, каков тип на bitmap датотека е оваа.
Можете да заклучиме, можеби, од вториот ред што офсет 2, бајт број 2,
има модел на 0 и 1 дека претставува она?
Големината на нешто, и тоа оди од таму.
Значи во проблем сет 4, ќе се одеше преку некои од овие работи.
>> Ние нема да заврши се грижат за сите од нив, но забележите тоа ќе почне да се интересни
околу линија или бајт 54, rgbtBlue, зелена и црвена.
Ако некогаш сте слушнале акроним RGB, црвени зелени сини, ова е референца за тоа.
Поради тоа што излегува можете да наслика сите бои на виножитото
со некоја комбинација од сина и црвена и зелена боја.
И, всушност, родителите во собата може да се потсетиме на некои од најраните проектори.
Овие денови, можете само да видите 1 светлина излегува на објективот.
Но, во тоа време, сте имале црвена леќа, сини леќи, и зелени леќа
и заедно во насока на екранот и формираше шарени сликата.
И доста често средните училишта и средните училишта ќе имаат оние леќи
некогаш толку малку askew, па сте биле вид на гледање двоен или троен слики,
но тоа беше идејата. Сте имале црвена и зелена и сина светлина сликарство слика.
И дека истиот принцип се користи во компјутерите.
>> Значи меѓу предизвици, а потоа, за вас во проблемот постави 4
ќе бидат неколку нешта, еден е всушност менување на големината на сликата.
Да се ​​земе во модел на 0 и 1 е,
дознаам што делови од 0 и 1 ги претставува она што во структурата како оваа,
а потоа дознаам како да се реплицираат во пиксели: на црвена, блуз, зелена
внатре, така што кога сликата изгледа вака на почетокот, може да изгледа вака наместо после тоа.
Меѓу другите предизвици, исто така, ќе биде што ќе биде предаден
форензичар сликата на вистински датотека од дигитална камера
и на тој апарат, еднаш многу одамна, беа еден куп фотографии.
Проблемот е, ние случајно избришани или имале сликата расипана некако.
Лоши работи се случуваат со дигитални камери, и така ние брзо копирани сите на 0 и 1 е
на тој картичка за вас, ги спасил сите во 1 голема датотека, а потоа ние ќе им рака за да ви
во проблемот постави 4, така што ќе може да напише програма во C со што да се опорави
сите оние JPEG слики, идеално.
И излегува дека JPEG слики, иако тие се малку на комплексни формат на датотека,
тие се многу посложени од тоа насмеано лице тука.
Излегува дека секој JPEG започнува со истите модели на 0 и 1 е.
Значи со користење додека јамка или за телефонска линија или слично,
можете да iterate во текот на сите 0 и 1 во оваа судска сликата
и секој пат кога ќе видите специјална шема, која е дефинирана во спецификацијата на проблемот во собата,
може да се претпостави, "Ах, тука е, со многу голема веројатност,
почетокот на JPEG, 'и веднаш штом ќе ги најдете на иста шема,
некои број на бајти или kilobytes или мегабајти подоцна,
може да се претпостави, "Ooh! Тука е вториот JPEG, фото отидов по првиот.
Дозволете ми да престане читањето дека првиот фајл, почнете со пишување на овој нов. "
И излез на вашата програма за pset 4 ќе биде колку што е 50 JPEG слики.
И ако тоа не е 50 JPEG слики, имате малку на јамка.
Ако имате неограничен број на JPEG слики, имаш бесконечна јамка.
Така што, исто така, ќе биде доста чест случај.
Тоа е она што е на хоризонтот.
>> Квиз 0, зад нас. Реализира, на мојот е-мејл, дека секогаш има луѓе
кои се истовремено среќни, сортирање на неутрални и тажни околу квиз 0 време.
И немојте да допрат до мене, шеф TFS, Zamyla, свој ТФ
или еден од Кас дека знаете ако би сакале да разговараат за тоа како се одвиваа работите.
>> Така да импресионира родители тука во собата,
што е CS50 библиотека? Добра работа.
Што е CS50 библиотека? Да? [Студентски одговори, неразбирливо]
>> Океј, добро. Па тоа е prewritten сет на кодот кој ние, вработените, пишува,
ние обезбеди за вас, да се обезбедат некои заеднички функционалности.
Работи како мене добие стринг; ме добие int, сите функции кои се наведени тука.
Почнувајќи од сега, ние почнуваме да навистина се овие обука тркала надвор.
Па ние ќе почне да потрае "стринг" од вас,
кои потсетиме, беше само синоним за каков тип на податоци? char *.
Така и за родителите, кои, најверојатно, - тоа е добро, па char * ние ќе почнете да ја видите
на екранот сè повеќе и повеќе како што ние ги отстрани "стринг" од нашиот речник,
барем кога станува збор за навистина пишување на код.
Слично на тоа, ние ќе престане да го користи некои од овие функции како многу,
бидејќи нашите програми се случува да добиете повеќе софистицирани
наместо само пишуваат програми кои седат таму со брза трепка,
чекање за корисникот да напишеш нешто внатре
Ќе ја добиете вашата влезови од друго место.
На пример, ќе ги добиете од серија на битови на локален хард диск.
Ти наместо ќе ги добие во иднина од некоја мрежна конекција, некои веб некаде.
Значи, да лупам назад овој слој, за прв пат, а се повлече до CS50 апаратот
и оваа датотека се нарекува CS50.h, кои сте биле остри вклучувајќи недели.
>> Но, ајде да всушност гледаат она што е внатре за тоа.
Така на врвот на датотека во плава е само еден куп на коментарите,
гаранција информации и лиценцирање. Ова е вид на заедничка парадигма
во софтвер, бидејќи многу софтвер овие денови е она што се нарекува "отворен код"
што значи дека некој има напишано код
и го направи слободно достапна, а не само да се кандидира и да се користи,
но всушност читање и менување и да се интегрираат во својата работа.
Значи тоа е она што сте биле користење на софтвер со отворен код,
иако во многу мала форма.
Ако јас дојдете минатото на коментарите, сепак, ќе почнете да видите некои повеќе познати работи.
Значи забележите на врвот тука, дека датотеката CS50.h вклучува целиот куп на насловот датотеки.
Сега, повеќето од овие не сме виделе порано, но едно е
запознаени, што од нив не сме виделе, иако кратко, досега?
Да, стандардни библиотеки. Stdlib.h има Примерок,
па откако почнавме да зборуваме за динамичка меморија распределба,
која ќе се врати на следната недела, како и, почнавме вклучувајќи таа датотека.
Излегува дека bool и вистински и лажни всушност не постои во C, сам по себе,
освен ако не се вклучи оваа датотека тука.
Значи имаме, за неколку недели, е вклучувајќи стандардни bool.h
така што можете да го користите идејата за bool, точно или неточно.
Без ова, вие ќе треба да се најде на лажни и користете int
и само произволно да се претпостави дека 0 е лажна и 1 е вистина.
>> Сега, ако се движите надолу понатаму, тука е нашата дефиниција на стринг.
Излегува, како што рековме порано, дека таму каде што тоа * е не е важно.
Можете дури и да имаат простор наоколу.
Ние, овој семестар, се го промовира како ова да го направи јасно дека * има врска со видот.
Но се реализира, само како заеднички, ако не малку повеќе заеднички, да го стави таму
но функционално тоа е иста работа.
Но, сега, ако читаме долу понатаму, ајде да ги разгледаме во речеме, GetInt,
затоа што се користат, кои, можеби, пред било што друго овој семестар.
И тука е GetInt. Тоа е она?
Ова е прототип. Толку често, имаме стави прототипи на врвот на нашата. В датотеки,
но вие исто така може да се стави прототипови во насловот датотеки. ж датотеки,
како овој овде, така што кога ќе напишам некои функции
што сакате другите луѓе да можат да ги користат, што е точно во случајот со CS50 библиотека,
вие не само спроведување на вашиот функции во нешто како CS50.c,
исто така, се стави на прототипови не на врвот на таа датотека, но на врвот на хедер датотека,
тогаш тоа хедер датотека е она пријатели и колеги вклучуваат,
со остри вклучат во нивните сопствени код.
Значи сето ова време сте биле вклучувајќи ги и сите на овие прототипови
ефикасно на врвот на вашата датотека, но по пат на овој остар вклучуваат механизам
што во суштина копии и пасти оваа датотека во вашиот сопствен.
Сега, тука е некои прилично детални документација.
>> Ние сме доста зема здраво за готово дека GetInt добива int,
но излегува дека е некој агол случаи, нели?
Што се случува ако корисник видови во број кој е премногу голема?
А quintillion, дека едноставно не може да се вклопи во внатрешноста на int?
Кое е очекуваното однесување? Па, идеално, тоа е предвидлив.
Значи во овој случај, ако навистина го прочитате парична казна печати,
ќе видите дека ако линијата не може да се чита, тоа се враќа INT_MAX.
Ние никогаш не сум зборуваше за ова, но врз основа на неговата капитализација,
што е тоа, веројатно?
Тоа е постојана, па тоа е некои посебни константа што е веројатно прогласи
во една од тие насловот датотеки што е горе високо во датотека,
и INT_MAX е веројатно нешто како, грубо, 2 милијарди долари.
Идејата е дека бидејќи ние мораме некако да значи дека нешто не беше во ред,
ние, да, има 4 милијарди броеви на располагање,
негативни 2 милијарди на до 2 милијарди долари, или дава да потрае.
Па, што е честа појава во програмирање е да украдат само еден од тие бројки.
Можеби 0, можеби 2 милијарди, можеби негативни 2 милијарди долари.
Така да поминат една од вашите можни вредности, така што ќе можат да се посветат на светот
дека ако нешто тргне наопаку, ќе се вратам овој супер-голема вредност.
Но, вие не сакате на корисникот пишување нешто криптичната како "2, 3, 4 ..."
на навистина голем број, каде што се генерализира, наместо како константа.
Значи, навистина, ако сте биле тоа анален изминатите неколку недели,
во секое време ви се јави GetInt, треба да се проверува со доколку состојба.
Дали корисникот тип во INT_MAX, или поконкретно,
не GetInt враќање INT_MAX? Затоа што ако тоа го правеше,
што всушност значи дека тие не го напишеш, нешто не беше во ред во овој случај.
Значи тоа е она што е општо познато како "стража" вредност, која едноставно значи посебно.
>> Па, ајде сега се претвори во на. В датотеки.
На датотеката C постои во апаратот за некое време,
и, всушност, апаратот го има прекомпилиран за вас
во тоа нешто што се нарекува "објектен код"
но тоа едноставно не е важно за вас, каде што тоа е затоа што системот знае,
во овој случај, таму каде што е апаратот.
Но, ајде да дојдете долу сега да GetInt, и да видиме како GetInt работи сето ова време.
Значи тука имаме слични коментари од порано.
Дозволете ми да зумирате на само кодот дел,
и она што го имаме за GetInt е следниот.
Тоа не носи влез и го враќа int, додека (вистинска), па ние имаме намерно бесконечна јамка
но, најверојатно, ќе се пробие на ова некако, или да се вратат од рамките ова.
Да видиме како тоа функционира. Па, како да ја користите GetString
во оваа прва линија во внатрешноста на јамка, 166.
Ова е сега добра практика, бидејќи под какви околности
GetString може да се врати оваа специјална клучни зборови, NULL?
Ако нешто тргне наопаку. Што би можело да тргне наопаку кога ќе се јавите нешто како GetString?
Да? [Студентски одговор, неразбирливо] >> Да. Па можеби Примерок не успее.
Некаде под хауба GetString повикува Примерок,
која доделува меморија, која им овозможува на компјутер продавница
сите карактери кои на корисникот видови во тастатурата.
И да претпоставиме на корисникот имаше едночудо слободно време
и внесе повеќе, на пример, од 2 милијарди карактери.
Повеќе ликови од компјутер дури има и RAM меморија.
Па, GetString мора да биде во можност да значи дека до вас,
дури и ако тоа е супер, супер е невообичаено агол случај.
Таа има некако да биде во можност да се справи со тоа, и така GetString,
ако ние одиме назад и да прочитате неговата документација, не, всушност, се врати NULL.
Сега ако GetString не со враќање NULL, GetInt се случува да не успее
со враќање INT_MAX, само како стража.
Овие се само човечките конвенции. Единствениот начин ќе знаете ова е случај
е со читање на документација.
Па ајде дојдете до местото каде што int е всушност GotInt.
>> Значи, ако јас движете надолу малку понатаму, во согласност 170 имаме коментар над овие линии.
Па ние да изјави, во 172, е int n и знак в, а потоа оваа нова функција
што некои од вас имате тетеравеше низ порано, но sscanf.
Ова се залага за низа скенирање ѓ.
Со други зборови, дај ми низа и јас ќе го скенира за парчиња на информации од интерес.
Значи она што значи тоа? Па, претпоставувам дека јас напишете буквално 1 2 3 на тастатурата,
а потоа притиснете ентер. Што е податоци за видот на 1 2 3 кога се вратија од GetString?
Тоа е очигледно низа, нели? Добив стринг, па 1 2 3 е навистина "1 2 3"
со \ 0 на крајот од неа. Тоа не е int.
Тоа не е број. Тоа изгледа како број, но тоа не е всушност.
Значи она што не GetInt треба да направите? Тоа мора да го скенира дека низа од лево кон десно,
1 2 3 \ 0, и некако го претворат во вистински број.
Сега, можете да дознаам како да го направите тоа.
Ако мислите назад кон pset 2, веројатно добија малку удобно
со Цезар или vigenere па можете да iterate во текот на еден стринг,
можете да ги конвертирате карактери да ints со мотиката. Тоа е целина многу работа.
Зошто да не се јавите на функција како sscanf дека прави тоа за вас?
Значи sscanf очекува аргумент, во овој случај се нарекува линија, која е стринг.
Тогаш наведете, во наводници, многу слични на printf,
што очекувате да се види во оваа низа?
Што сакам да кажам дека тука е, очекувам да видам децимален број, а можеби и карактер.
И ќе видиме зошто ова е случај во само еден миг.
Излегува дека оваа нотација е сега потсетува на нешто
почнавме да зборуваме за нешто повеќе од пред една недела.
>> Што е & n и и в прави за нас овде? [Студентски одговори, неразбирливо]
>> Да. Тоа ми даде адресата на n и адреса на в.
Сега, зошто е тоа важно? Па, знаеш дека со функции во C
секогаш може да се врати на вредност или никаква вредност на сите.
Можете да се врати int, стринг, плови, char, сеедно.
Или може да се врати празнина, но вие може само да се врати 1 нешто максимално.
Но тука ние сакаме sscanf да ми се врати можеби еден цел број, децимален број,
а исто така знак, и јас ќе објасни зошто знак во еден момент.
Па можете успешно сакате ѓ да се вратат 2 работи, а тоа не е само можно во C.
Така може да се работи околу тоа со полагање во 2 адреси,
затоа што веднаш штом ќе предаде функција 2 адреси, она што може таа функција се направи со нив?
Тоа може да напише на тие адреси. Можете да ги користите * операција и "одиме таму" за секоја од овие адреси.
Тоа е еден вид на овој задна врата механизам, но многу честа појава за менување на вредностите на променливите
во повеќе од само 1 место, во овој случај 2.
Сега, забележиш јас сум проверка за == to1, а потоа се враќа n, ако тоа се случи, всушност, се оцени на true.
Значи она што се случува? Па, технички, сите ние навистина сакаме да се случи во GetInt е ова.
Ние сакаме да го анализирам, така да се каже, ние сакаме да го прочитате низа
"1 2 3" и ако изгледа има голем број таму,
она што го кажува sscanf да направите е да се стави тој број, 1 2 3, во оваа променлива n за мене.
Зошто, тогаш, никако не можев да ја имаат оваа како?
Која е улогата на, исто така, велејќи sscanf, исто така, може да добијат карактер тука.
[Студентски земено, неразбирливо] >> Не - децимална точка би можеле да работат.
Ајде да се одржи таа мисла за момент. Што друго?
[Студент, неразбирливо] >> Значи, добра мисла, тоа би можело да биде NULL карактер.
Тоа не е всушност, во овој случај. Да? [Студент, неразбирливо]
>> >> ASCII. Или, дозволете ми да се генерализира дури и подалеку.
На% c постои само за грешка проверка.
Ние не сакаме да има карактер по број,
но она што оваа ми дозволува да направите е следново:
Излегува дека sscanf, покрај складирање вредности во n и в, во овој пример тука,
што исто така не е го враќа бројот на променливи го стави вредности внатре
Значи, ако само напишете 1 2 3, тогаш само% d ќе одговара
и само N добива чуваат со вредност како 1 2 3 и ништо не добива стави во C;
в останува ѓубре вредност, така да се каже.
Ѓубре, бидејќи тоа никогаш не била иницијализирана како што некои вредност.
Значи во тој случај, sscanf враќа 1, бидејќи јас населен еден од оние покажувачи,
во кој случај, одлично. Имам int, па јас ослободи линија за да се ослободи меморија
дека GetString всушност распределени, а потоа ќе се вратам n.
Друго, ако некогаш сте се запрашале каде што се обидете повторно изјава доаѓа, доаѓа од овде.
Ако, пак, јас напишете 1 2 3 foo,
само некои случајна секвенца на текст, sscanf се случува да се види,
ooh, број, ooh, број, ooh, број, ooh - ѓ.
И тоа се случува да се стави 1 2 3 во Н.
Тоа се случува да се стави на f во C, а потоа се врати 2.
Значи имаме, само со користење на основните дефиниција на однесување Scanf е,
еден многу едноставен начин - добро, комплекс на прв поглед, но на крајот на денот,
прилично едноставен механизам да се каже, е таму int, и ако е така, е дека единственото нешто што најдов?
И белиот простор тука е намерно. Ако го прочитате документацијата за sscanf,
тоа ви кажува дека ако вклучуваат парче бел простор на почетокот или на крајот,
sscanf исто така ќе им овозможи на корисникот, за која било причина, да ја погоди spacebar 1 2 3, и дека ќе бидат легитимни.
Тоа нема да се развикам на корисникот само затоа што тие хит на spacebar на почетокот или на крајот,
што е само малку повеќе user-friendly.
>> Било какви прашања, а потоа, на GetInts? Да?
[Студентски збор, неразбирливо]
>> Добро прашање. Што ако само ја внеле во знак, како f, и притиснете ентер
без воопшто да пишувате 1 2 3; што мислите однесувањето на оваа линија код, тогаш ќе биде?
Значи sscanf може да ги покрие дека премногу, бидејќи во тој случај,
тоа не се случува да се пополни n или в; тоа се случува да наместо вратат 0.
Во кој случај, јас сум исто така, фаќање на тоа сценарио, бидејќи очекуваната вредност што сакам е 1.
Јас само сакам 1, а само 1 нешто што треба да бидат пополнети. Добро прашање. Другите?
>> Добро, така нека не одат низ сите функции во тука,
но оној кој се чини дека е, можеби, на останатите интерес
е GetString бидејќи излегува дека GetFloat, GetInt,
GetDouble, GetLongLong сите залог многу на нивната функционалност да GetString.
Па ајде да ги разгледаме во тоа како тој се спроведува тука.
Оваа една изгледа малку комплексна, но тоа го користи истиот основи
што почнавме да зборуваме за минатата недела. Значи во GetString,
што се нема аргумент како на празнина се тука,
и враќа стринг, па јас сум прогласување на низа наречен тампон.
Јас навистина не знам што се случува да се користи за уште, но ќе видиме.
Изгледа капацитет е, по дифолт, 0; не се сосема сигурни каде ова се случува.
Не сум сигурен што n се случува да се користи за уште.
Но, сега тоа е добивање малку повеќе интересно, па во согласност 243,
ние прогласи int в, ова е вид на глупави детали.
А знак е 8 бита и 8 битови може да се сместат колку различни вредности?
256. Проблемот е, ако сакате да имате 256 различни ASCII карактери,
кои постојат, ако се сетам, и тоа не е нешто што треба да се запаметат.
Но, ако се сетам на толку голема ASCII табелата имавме недели,
имало, во тој случај, 128 или 256 ASCII карактери.
Ние се користат сите модели на 0 и 1 е до.
Тоа е проблем ако сакате да бидете во можност да детектира грешка.
Затоа што ако веќе сте користење на 256 вредности за вашите карактери,
не сте навистина се планира напред, бидејќи сега немаш начин да се каже,
"Ова не е legit карактер, ова е некоја погрешна порака."
Значи она што во светот не е, тие ги користат следната најголема вредност,
нешто како int, така што ќе имаат луди број на битови,
32 за 4 милијарди можни вредности, така што можете едноставно да заврши користење,
суштина, 257 од нив, од кои 1 има некои посебни значење како грешка.
>> Да видиме како тоа функционира. Во согласност 246, имам овој голем додека јамка
кој е повикувајќи fgetc ѓ значење датотека, getc, а потоа stdin.
Излегува ова е само повеќе прецизен начин на велејќи: "чита влез од тастатура."
Стандарден влез средства тастатура, стандарден излез значи екран,
и стандардна грешка, што ќе видиме во pset 4, значи на екранот,
но посебен дел на екранот, така што тоа не е измешано
со реалните излез кој сте имале намера да печати, но повеќе за тоа во иднина.
Значи fgetc само значи чита еден карактер од тастатура, и чувајте го каде?
Чувајте го во C, а потоа проверете, па јас сум само користење на некои логичка сврзници тука,
провери дека не е еднаква \ n, па така корисниците нема притиснете ентер.
Сакаме да престанат во тој момент, на крајот од циклусот, и ние исто така сакаме да се провери
за посебните константна, EOF, што ако знаете или се погоди - она ​​што не го штанд за?
Крајот на датотеката. Па ова е вид на бесмислени, бидејќи ако јас сум пишување на тастатура,
има навистина нема датотеки се вклучени во овој,
но ова е само вид на генерички термин кој се користи да значи
дека ништо друго не доаѓа од прстите на човечкиот. EOF. Крајот на датотеката.
Како настрана, ако некогаш сте хит контрола г на вашата тастатура,
не дека ќе имаат уште, вие сте хит контрола в.
Но контрола г праќа оваа специјална постојана наречен EOF.
>> Па сега ние само треба некои динамичен алокација на меморија.
Значи, ако n + 1> капацитет, сега јас ќе објаснам n.
n е само колку бајти сте моментално во тампон,
стринг тоа дека во моментов градење од корисникот.
Ако имате повеќе карактери во вашиот тампон отколку ти што имаш капацитет во тампон,
интуитивно, она што треба да направите потоа е додели повеќе капацитет.
Одам да обезмаслен преку некои од аритметички тука
и да се фокусира само на оваа функција овде.
Знаеш што Примерок е, или барем генерално познати.
Земете погоди што realloc прави. [Студентски одговор, неразбирливо]
>> Да. И тоа не е сосема додавање на меморија, тоа reallocates меморија како што следува:
Ако има уште простор на крајот од стрингот да ви даде повеќе од таа меморија
отколку што првично ти дава, тогаш ќе се добие дека дополнителна меморија.
Па можете да само ставање на низи карактери да се врати назад да се врати да се врати.
Но, ако тоа не е случај, затоа што чекаше премногу долго
и нешто случаен доби plopped во меморијата таму, но има дополнителни
меморија тука долу, тоа е во ред. Realloc се случува да се направи сите кревање на тешки предмети за вас,
поместите стринг ќе ги прочитате во тоа далеку од тука,
стави таму долу, а потоа да ви даде некои повеќе пистата во тој момент.
Така да со еден бран на страна, дозволете ми да кажам дека она што GetString прави
е тоа е почнуваат со мали тампон, можеби 1 еден лик,
и ако корисникот видови во 2 карактери, GetString завршува
повикувајќи realloc и вели, "Ooh, 1 лик не беше доволно.
Дај ми 2 знаци. " Потоа, ако се чита преку логиката на јамка,
тоа се случува да се каже, "Ooh, корисникот ја внеле во 3 карактери.
Дај ми сега не 2 туку 4 карактери, тогаш ми даде 8, а потоа ми даде 16 и 32 ".
Фактот дека јас сум удвојување на капацитетот секој пат
значи дека тампон нема да растат бавно.
Тоа се случува да расте супер брз, и она што може да биде предност на тоа?
Зошто сум удвојувањето на големината на баферот, иако на корисникот
само можеби ќе треба 1 екстра лик од тастатура?
[Студентски одговор, неразбирливо]. >> Што е тоа?
Точно. Вие не треба да расте толку често.
И ова е само вид на - Ти си хеџинг вашиот облози тука.
Идејата е во тоа што вие не сакате да се јавите realloc многу, бидејќи тоа се стреми да биде бавен.
Секое време да побара оперативниот систем за меморија, како што наскоро ќе видиме
во иднина проблем во собата, тоа се стреми да потрае некое време.
Значи минимизирање дека износот на време, дури и ако си трошат малку простор, има тенденција да биде добра работа.
>> Но, ако ги чита преку завршниот дел од GetString тука,
и повторно, разбирање секоја линија тука не е толку важно денес.
Но, забележуваат дека на крајот повици Примерок повторно, и распределување
точно колку бајти како што треба за низа
а потоа фрла со повик бесплатно, прекумерно голем тампон,
ако навистина доби двојно премногу пати.
На кратко, тоа е како GetString работи сето ова време.
Сите тоа го прави се чита еден карактер во време повторно и повторно и повторно
и секој пат кога ќе треба некои дополнителни меморија, таа прашува оперативен систем за тоа со повик realloc.
Било какви прашања? Во ред.
>> Напад. Сега дека ние се разбираме покажувачи, или барем
се повеќе запознаени со покажувачи,
ајде да се разгледа како целиот свет ќе почне да пропадне
ако не доста брани против непријателски корисници,
луѓе кои се обидуваат да се пробие во вашиот систем.
Луѓе кои се обидуваат да го украдат вашиот софтвер со заобиколување некои кодот за регистрација
кои што инаку би можеле да имаат да напишеш внатре
Фрлите поглед на овој пример тука, што е само C код
кој има функција главна на дното, која повикува функција foo,
И што е тоа поминува на foo? [Студентски] Еден аргумент.
>> Еден аргумент. Значи avg [1], што значи првиот збор на корисникот внеле
на командната линија по a.out или што на програмата се нарекува.
Значи foo, на врвот, се во char *, но char * е токму она што?
Стринг. Нема ништо ново тука, и дека стрингот е произволно се нарекува бар.
Во оваа линија тука, знак в [12], во вид на полу-технички англиски јазик, што е оваа линија правиш?
Низа на - Карактери. Дај ми низа од 12 знаци.
Па ние може да се нарече ова тампон. Тоа е технички нарекува в, но тампон во програмирање
само значи еден куп на простор кој може да се стави некои работи внатре
>> Тогаш на крај, memcpy, ние не го користат пред.
Но, што веројатно може да се погоди она што го прави тоа. Тоа копии меморија.
Што значи тоа? Па, тоа очигледно копии бар, нејзиниот влез, во в,
но само до должината на бар.
Но, има бубачка тука.
Океј, па технички ние навистина треба да направите strlen (bar) x sizeof (знак), тоа е точно.
Но, во најлош случај тука, да претпоставиме дека that's - така, во ред.
Потоа, тука е 2 грешки. Значи sizeof (знак), во ред, ајде да се направи ова малку пошироко.
Така, сега таму е уште една грешка, што е она?
[Студентски одговор, неразбирливо] >> Проверете за што? Океј, па ние треба да се проверува
за NULL, бидејќи лоши работи се случуваат кога покажувачот е NULL,
Бидејќи може да заврши случува таму, а ти не секогаш треба да се оди на NULL
од dereferencing тоа со * оператор.
Па тоа е добро, а што друго правиме ние? Логично има пукнатина тука.
[Студентски одговор, неразбирливо]
>> Значи провери дали argc ≥ 2?
Океј, па има 3 грешки во оваа програма тука.
Ние не сме проверка ако корисникот навистина внесе во нешто во avg [1], добро.
Значи она што е трета грешка? Да?
[Студентски одговор, неразбирливо] >> Добро.
Значи ние проверуваат едно сценарио. Ние имплицитно проверени не копија повеќе меморија
отколку што би ги надминуваат должина од бар.
Значи, ако стрингот на корисникот внесе во е 10 карактери,
ова е велејќи: "Само копирајте 10 карактери."
И тоа е во ред, но што ако корисникот ја внеле во еден збор во конзолата
како 20 карактери збор, тоа е, велејќи копија 20 ликови од бар во што?
в, инаку позната како нашите тампон, што значи дека само напишав податоци
до 8 бајт локации кои не поседувате,
и не ги поседувате во смисла дека никогаш не сте ги распределени.
Значи тоа е она што е општо познато како на buffer overflow напад,
или тампон превишаването напад, а тоа е нападот во смисла дека ако корисникот
или програма која е повикувајќи вашата функција е тоа злобно,
она што всушност се случува понатаму може да биде многу лошо.
>> Ајде да ги разгледаме во оваа слика овде.
Оваа слика претставува вашиот магацинот на меморија.
И се потсетиме дека секој пат кога ќе се јавите на функција,
ќе добиете оваа мала рамка на магацинот, а потоа уште еден, а потоа уште еден, а потоа друг.
И досега ние сме само вид на апстрахирани овие далеку како правоаголници
или има на одборот или на екранот овде.
Но, ако ние зумирате на еден од оние правоаголници,
кога ќе се јавите на функција foo, излегува дека има уште на магацинот
внатрешноста на таа рамка и дека правоаголник
од само x и y и А и Б, како што се зборува за swap.
Излезе дека постојат некои пониско ниво детали,
меѓу нив вратат адреса.
Значи испаѓа кога главната повици foo, главни треба да го извести foo
она адреса главната е во меморијата на компјутерот.
Затоа што во спротивно, штом foo е направено извршување, како во овој случај тука,
Откако ќе стигнат до оваа блиску кадрава голема заграда на крајот на foo,
како што е грижам не foo знаат каде контрола на програмата треба да се оди?
Се испоставува дека одговорот на тоа прашање е во тоа црвено правоаголник тука.
Ова претставува покажувач, и тоа е до компјутер за чување, привремено,
на т.н. магацинот на адреса на главниот така што веднаш штом foo е направено извршување,
на компјутерот знае каде и што линија во главниот да се врати.
Зачувани рамка покажувачот се однесува слично на ова.
Char * бар тука претставува она?
Па, сега овој сино сегмент тука е рамка на foo, она што е бар?
Океј, па бар е само аргумент на функцијата foo.
>> Па сега ние сме назад во запознаени слика.
Има уште работи и повеќе одвлекување на вниманието на екранот
но ова светло сина сегмент е она што ние сме биле цртање на таблата за нешто како swap.
Тоа е рамка за foo и единственото нешто во неа во моментов е бар,
кој е овој параметар.
Но, што друго треба да биде во магацинот, во согласност со овој код овде?
Char в [12]. Така и ние треба да се види 12 квадрати на меморија,
доделени на променлива наречена в.
И навистина ние немаме оној на екранот.
На самиот врв има в [0], а потоа авторот на овој дијаграм
не се мачи цртање на сите плоштади, но таму навистина се 12 има
бидејќи, ако се погледне во долниот десен, в [11], ако смета од 0, е 12 такви бајти.
Но, тука е проблемот: Во која насока се в расте?
Вид на врвот надолу, нели? Ако тоа почнува на врвот и расте до дното,
не изгледа како ние самите остави многу пистата тука на сите.
Ние сме вид на се насликани во еден агол,
и дека в [11] е право против бар, кој е во право против магацинот рамка покажувач,
кој е во право против враќањето адреса; нема повеќе простор.
Значи она што е импликација, а потоа, ако зафркнам,
и ќе се обидат читање 20 бајти во 12-бајт тампон?
Каде се оние 8 дополнителни бајти ќе одат?
Внатре пак речиси сè друго, од кои некои се супер важно.
И најважно, потенцијално, е црвено поле таму, враќање адреса.
Бидејќи претпоставувам дека сте или случајно или adversarially
пребришете овие 4 бајти, што покажувачот адреса,
не само со ѓубре, но со голем број што се случува да претставуваат вистинската адреса во меморијата?
Што е implicaiton, логично?
[Студентски одговори, неразбирливо] >> Токму така. Кога foo враќа
и хитови што кадрава голема заграда, програмата ќе продолжи да не се врати во главната,
тоа се случува да се врати на она што адресата е дека црвено поле.
>> Сега, во случај на заобиколување софтвер регистрација,
она што е адресата и тоа е се врати се во функција
кои нормално добива распишани откако сте платени за софтвер и внесуваат вашата регистрација код?
Можете да ги сортирате на трик на компјутерот во нема тука, но наместо тоа, ќе се тука.
Или, ако сте навистина паметна, противник всушност може да напишете на тастатурата,
на пример, не е вистинскиот збор, а не 20 карактери, но претпоставувам тој или таа
видови во некои знаци кои претставуваат код?
И тоа нема да биде C код, тоа се случува да бидат ликови
кои претставуваат бинарни машина кодови, 0 и 1 е.
Но, претпоставувам дека си паметен доволно за да го направи тоа, некако ставете во GetString брза
нешто што е суштина Составувач код,
и последната 4 бајти запише дека враќањето адреса, и она адреса е дека влезот направам?
Тоа продавници во црвено правоаголник адресата на првиот бајт од тампон.
Значи мора да биде навистина паметна, и ова е многу обиди и грешки
за лоши луѓе таму, но ако можете да дознаам колку е голема оваа тампон е,
така што во последните неколку бајти во влезот дека ќе им обезбеди на програмата
се случи да биде еквивалент на адресата на почетокот на вашиот тампон,
можете да го направите тоа. Ако кажеме, нормално, здраво, и \ 0, тоа е она што завршува во тампон.
Но, ако ние сме повеќе умен, а ние ја пополни таа тампон со она што генерички Ќе му се јавам напад код,
А, А, А, А: напад, напад, напад, напад, каде што ова е само нешто што прави нешто лошо.
Па, она што се случува ако сте навистина паметна, може да го направите ова:
Во црвената кутија тука е низа од броеви: 80, CO, 35, 08.
Забележете дека тоа се совпаѓа со бројот што е овде горе.
Тоа е во обратен редослед, но повеќе за тоа друг пат.
Забележете дека ова враќање адреса е намерно изменети
да се изедначи со адреса се тука, а не на адреса на главниот.
Значи, ако лошо момче е супер паметни, тој или таа се случува да се вклучат во тој напад код
нешто како, "Избриши ги сите датотеки на корисникот."
Или "Копија на лозинки," или "Креирај корисничка сметка дека можам да се логирам во. '
Ништо на сите, а тоа е и опасноста и моќта на Ц
Бидејќи имате пристап до меморијата преку совети
и затоа може да напише нешто што сакате во меморијата на компјутерот.
Може да се направи компјутерски направи нешто што сакате со едноставно
откако ја скокаат околу во рамките на својата мемориски простор.
И така, на овој ден, толку многу програми и толку многу веб-сајтови кои се компромитирани
се сведуваат на луѓето да ги искористат предностите на ова.
И ова може да изгледа како супер-софистицирана напад,
но тоа не секогаш ќе започне на тој начин.
>> Реалноста е дека она што лоши луѓе обично ќе направите, е,
дали тоа е програмата на командната линија или програма GUI или веб-сајт,
е ли само ја стартувате обезбедување глупости.
Можете да напишете во еден навистина голем збор во полето за пребарување и притиснете ентер,
и ќе чекате да се види дали на веб-сајтот се урна.
Или ќе чекате да се види дали на програмата манифестира некои порака за грешка.
Бидејќи ако имаат среќа, како негативец,
и ви обезбеди некои луди влез што се урна на програмата,
тоа значи дека на програмерот не се антиципираат вашите лошо однесување
што значи дека може да веројатно, со доволно напор,
доволно обиди и грешки, да дознаам како да се отпочне попрецизно напад.
Така што голем дел од безбедноста не е само избегнување на овие напади целосно, но откривање на нив
а всушност во потрага на регистрите и види што луди влезови има луѓе ја внеле во вашиот вебсајт.
Што услови за пребарување се луѓе ја внеле во вашиот веб-сајт во надеж дека ќе преплавени некои тампон?
И, сето тоа се сведува на едноставна основите на она што е низа,
и што значи тоа за алоцирање и употреба меморија?
И во врска со тоа, исто така, е ова.
>> Па да се загледувам во внатрешноста на хард дискот уште еднаш.
Така да се потсетиме од една недела или две пред тоа кога ќе повлечете датотеки
до ѓубрето или корпата за ѓубре, што се случува?
[Студентски] Ништо. >> Да, апсолутно ништо. Конечно, ако се намалат
простор на дискот, Windows или Mac OS ќе започне бришење на датотеки за вас.
Но, ако повлечете нешто таму, тогаш тоа не е воопшто безбедно.
Сите ваши roomate, пријател или член од семејството треба да направите е да кликнете двапати, и Voila.
Има сите површни датотеки кои сте се обиделе да ги избришете.
Па повеќето од нас барем знам дека треба да се десен клик или контрола клик
и празни ѓубрето, или нешто слично.
Но, дури и тогаш, тоа сосема не го направите трик.
Затоа што она што се случува кога имате фајл на вашиот хард диск
кој претставува некои Word документ или некои JPEG?
И ова претставува вашиот хард диск, и да речеме оваа треска тука претставува таа датотека,
и тоа е составен од целиот куп на 0 и 1 е.
Што се случува кога не сте само повлечете таа датотека на trashcan или ѓубрето,
но, исто така, го испразните?
Вид на ништо. Тоа не е апсолутно ништо сега.
Сега тоа е само ништо, бидејќи малку нешто се случува во форма на оваа табела.
Значи има некој вид на база на податоци или маса во внатрешноста на меморија на компјутерот
што во суштина има 1 колона за датотеки имиња,
и 1 колона за локација датотека, каде што ова може да биде локација 123, само случаен број.
Значи, ние би можеле да имаат нешто како x.jpg и локација 123.
И што се случува потоа, кога ќе го испразните ѓубрето?
Што оди далеку. Но, она што не оди далеку е 0 и 1 е.
>> Значи она што е, тогаш, врската со pset 4?
Па, со pset 4, само затоа што ние сме случајно избришани
на Compact Flash картичка, која имаше сите овие фотографии,
или само затоа што од лоша среќа стана оштетени,
не значи дека 0 и 1 не се сè уште таму.
Можеби неколку од нив се изгубени затоа што нешто доби оштетени
во смисла дека некои 0 стана 1 и 1 стана 0 е.
Лоши работи може да се случи поради кабриолет софтвер или неисправни хардвер.
Но, многу од оние битови, можеби дури и 100% од нив се уште се таму,
тоа е само дека компјутерот или камерата не знае каде JPEG 1 почна
и каде JPEG 2 отворени, но ако, програмер,
Знаеш, со малку такт, каде што оние JPEG слики, или она што тие изгледаат,
може да се анализира 0 и 1, и велат, "Ooh. JPEG. Ooh, JPEG ".
Можете да напишете програма со суштина само за или додека јамка
која го обновува секој еден од овие датотеки.
Така лекција тогаш, е да се започне "безбедно" бришење на вашите датотеки
ако сакате да се избегне ова заедно. Да?
[Студентски збор, неразбирливо]
>> Имаат повеќе меморија отколку што направи пред -
Ох! Добро прашање. Па зошто, тогаш, по празнење на ѓубрето,
Дали вашиот компјутер да ви кажам дека имате повеќе слободен простор отколку што беше пред тоа?
Во мало, затоа што тоа е лажење. Повеќе технички, имате повеќе простор.
Бидејќи сега вие рековте, може да се стави други нешта каде таа датотека некогаш беше,
но тоа не значи дека битови се оди,
и тоа не значи дека на битови се промени сето 0, на пример, за ваша заштита.
Спротивно на тоа, ако "безбедно" избрише датотеки, или физички уништи уред,
дека навистина е единствениот начин, понекогаш, околу тоа.
Па зошто да не се остави на тој полу-страшно белешка, и ние ќе се видиме в понеделник.
CS50.TV