[Powered by Google Translate] [Дел 6] [поудобно]
[Роб Бауден] [Универзитетот Харвард]
[Ова е CS50.] [CS50.TV]
>> Ние можеме да се упатат кон нашата секција на прашања.
Пратив URL-то за просторот пред.
На почетокот на делот од прашањата велат-
очигледно не сум целосно unsick-е многу лесно прашање
на само она што е valgrind?
Што значи valgrind направам?
Секој сака да каже што valgrind не?
[Студентски] Проверки меморија протекување.
Да, valgrind е општ меморија Проверка на.
Тоа, на крајот, ви кажува ако имате било какви меморија протекување,
која најчесто е она што ние го користите за, бидејќи ако сакате да
не и во проблем во собата или ако сакате да
се качат на голем одбор, треба да немаат меморија протекување она,
и во случај да имате меморија излегуваат во јавноста дека не може да се најде,
исто така, имајте на ум дека секогаш кога ќе отворите датотека
и ако не го затвори, тоа е меморија излегуваат во јавноста.
>> А многу луѓе се во потрага по некои јазол дека тие не се ослободува
кога навистина, тие не го затвори речник во првиот чекор.
Таа, исто така ви кажува ако имате било какви неважечки чита или пишува,
што значи ако се обидете и да поставите вредност
тоа е по завршувањето на куп и да не се случи да сегмент вина
но valgrind го фаќа, како што всушност и не треба да се пишува таму,
и така да дефинитивно не треба да има било која од овие или.
Како да го користите valgrind?
>> Тоа е општо прашање на
вид на се пушта и се погледне на излез.
Излезот е огромна многу пати.
Има исто така забавна грешки каде што ако имате некои ужасно погрешна работа
случува во еден циклус, а потоа на крајот ќе каже, "Начин премногу грешки.
Одам да престане пребројување сега. "
Тоа е во основа текстуалните излезни дека треба да се интерпретира.
На крајот, тој ќе ви каже било меморија протекување дека имате,
колку блокови, кои можат да бидат корисни поради
ако тоа е еден блок unfreed, тогаш тоа е обично полесно да се најдат
од 1.000 блокови unfreed.
1.000 блокови unfreed веројатно значи дека не си заштедувате
Вашиот поврзани листи соодветно или нешто.
Тоа е valgrind.
>> Сега имаме нашата секција на прашања,
која не треба да ја преземете.
Можете да кликнете на моето име и повлечете ги во просторот.
Сега кликнете на мене.
Ревизија 1 ќе биде магацинот, што правиме во прв план.
Ревизија 2 ќе биде на дното, и ревизија 3 ќе биде одделно поврзани листа.
Поаѓање со нашите оџак.
Како што се вели овде, говедо е еден од најосновните,
основните структури на податоци на компјутерските науки.
На многу блиски до прототипа пример е
магацинот на коцки во јадење салата.
Тоа е во основа секогаш кога ќе се воведе на магацинот,
некој ќе каже: "О, како магацинот на коцки."
Можете магацинот на коцки до.
Тогаш кога ќе одат да се повлече послужавник,
првата лента што е добивање повлече е последниот оној кој беше ставен на магацинот.
Магацинот, исто така, како што се вели овде-
имаме сегмент на меморија наречен оџак.
И зошто е наречен оџакот?
>> Бидејќи како оџак податочна структура,
тоа турка и се појавува магацинот рамки на магацинот,
каде што магацинот рамки се како специфичен повик на функција.
И како оџак, вие секогаш ќе треба да се вратат
од повикот на функцијата пред да се фаќате во долниот магацинот рамки повторно.
Вие не може да има главна повик foo повик бар и бар враќање до главна директно.
Тоа секогаш мора да го следи правилно магацинот туркање и пукање.
На две операции, како што реков, се притисни и поп.
Тоа се универзални термини.
Треба да знаете притисни и поп во однос на Купишта без разлика што.
Ќе видиме редици се вид на различни.
Тоа навистина не имаат универзална рок, но притисни и поп се универзални за Купишта.
Притисни е само да ги ставите на магацинот.
Поп е полетување на магацинот.
И гледаме тука ние имаме typedef struct оџакот,
па ние имаме знак ** жици.
Не се плаши од било **.
Ова ќе заврши се низа на стрингови
или низа од покажувачи на ликовите, каде
совети како да се ликови имаат тенденција да бидат жици.
Тоа не мора да биде жици, но тука, тие ќе бидат жици.
>> Имаме низа на стрингови.
Имаме големина, што претставува колку елементи се во моментов на магацинот,
а потоа имаме капацитет, што е колку елементи можат да бидат на магацинот.
Капацитетот треба да започнете како нешто поголема од 1,
но големината ќе започнете како 0.
Сега, во основа постојат три различни начини можете да мислам на оџак.
Па, постојат веројатно повеќе, но двете главни начини се
можете да го спроведе со користење низа, или можете да го спроведе со користење на поврзани листа.
Поврзани листи се вид на тривијални да се направи Купишта од.
Тоа е многу лесно да се направи оџак користење на поврзани листи,
па овде, ние ќе треба да се направи оџак користење на низи,
и потоа со употреба низи, исто така има два начина може да се размислува за тоа.
Пред тоа, кога реков дека имаме капацитет за магацинот,
па ние може да се вклопат елемент на магацинот.
>> На еден начин тоа би можело да се случи е веднаш штом ќе погоди 10 елементи, а потоа ќе завршиш.
Може да знаете дека постои горна граница од 10 работи во светот
дека никогаш нема да имаат повеќе од 10 нешта на вашиот магацинот,
во кој случај може да имаат горна граница за големината на вашиот оџак.
Или би можеле да имаат вашите магацинот се Недогледна,
но ако правиш низа, што значи дека секој пат кога ќе ја погоди 10 елементи,
тогаш ќе мора да се зголеми на 20 елементи, и кога ќе се погоди 20 елементи,
ви се случува да мора да расте на вашата низа до 30 елементи или 40 елементи.
Сте ќе треба да се зголеми капацитетот, што е она што ние ќе треба да направите тука.
Секој пат кога ќе стигнеме до максималната големина на нашата оџакот,
кога ќе им помогнам на нешто друго, ние се случува да треба да се зголеми капацитетот.
Еве, ние сме притисни декларирани како bool притисни (char * ул).
Char * ул е стринг кој се врши притисок врз оџакот,
и bool само вели дали успеавме или не.
>> Како можеме да пропадне?
Што е единствената околност што може да мислам на
каде што ќе треба да се врати лажни?
Да.
[Студентски] Ако тоа е целосна и ние сме со користење на ограничен имплементација.
Да, па како да се дефинираат-тој одговори
ако тоа е целосна и ние сме со користење на граничи имплементација.
Тогаш ние дефинитивно ќе се врати лажни.
Штом ќе погоди 10 работи во низа, ние не може да се вклопат 11, па ние се врати лажни.
Што ако е неограничен? Да.
Ако не можете да се прошири на низа поради некоја причина.
Да, па меморија е ограничен ресурс,
и на крајот, ако ги пазиме туркање работи врз оџакот одново и одново,
ние ќе се обидеме и да се распределат поголем спектар за да ги собере
поголем капацитет, а Примерок или што ние сме со користење ќе се врати лажни.
Па, Примерок ќе се врати нула.
>> Запомнете, секој пат кога ќе некогаш повик Примерок, треба да се проверуваат да видат дали тоа
враќа нула или друго што е точноста одбивање.
Бидејќи ние сакаме да имаат неограничен оџакот,
единствениот случај ние ќе се врати лажни е ако се обидеме да
зголеми капацитетот и Примерок или што враќа false.
Потоа pop се без аргументи,
и го враќа стринг кој е на врвот на магацинот.
Она што беше неодамна турна на магацинот е она што поп се враќа,
а исто така ја отстранува од магацинот.
И ќе забележите дека го враќа нула ако не постои ништо на магацинот.
Таа е секогаш можно дека магацинот е празен.
Во Јава, ако сте навикнати на тоа, или други јазици,
се обидува да pop од празен стек може да предизвика исклучок или нешто.
>> Но во C, нула е вид на многу од случаите како ние се справи со овие проблеми.
Враќање нула е како ние ќе значи дека магацинот е празен.
Ние се предвидени код кој ќе тестира функционалноста на вашиот магацинот е,
спроведување притисни и поп музиката.
Ова нема да биде многу код.
Јас ќе-всушност, пред да го направи тоа, навестување, навестување-
ако не сте го виделе, Примерок не е единствената функција
дека распределува меморијата на грамада за вас.
Постојат семејството на alloc функции.
Првиот е Примерок кој сте навикнати.
Потоа, тука е calloc, што го прави истото како Примерок,
но тоа ќе нула се за вас.
Ако некогаш сте сакале да го поставите се што на нула по mallocing нешто
треба да се користат само calloc на прво место наместо на пишување
А за јамка на нула на целиот блок од меморија.
>> Realloc е како Примерок и има многу посебни случаи,
но во основа она што realloc не е
потребно е показател дека веќе се распределени.
Realloc е во функција сакате да се обрнувајќи внимание на овде.
Таа ги зема покажувач што веќе се вратени од Примерок.
Да речеме дека побара од Примерок покажувач на 10 бајти.
А потоа сфаќаш дека ти сакаше 20 бајти,
па ти се јавам realloc на тој покажувач со 20 бајти,
и realloc автоматски ќе копирајте над сè за вас.
Ако само се нарекува Примерок повторно, како што има еден блок од 10 бајти.
Сега е потребно блок од 20 бајти,
па ако јас Примерок 20 бајти, тогаш мора рачно да го копирате во текот на 10 бајти од првото нешто
во Втората работа и тогаш слободно првото нешто.
Realloc ќе се справи со тоа за вас.
>> Обрнете внимание на потпис ќе биде неважечки *,
која е само враќање на покажувачот на блок од меморија,
потоа празнина * кон меморија.
Можете да мислите на празнина * како генерички покажувач.
Општо земено, никогаш не се справи со празнина *,
но Примерок се враќа празнина *, а потоа тоа само се користи како
ова е, всушност, ќе биде знак *.
Претходната празнина * кои беа вратени од Примерок
е сега ќе биде предадена realloc, а потоа големина
е новиот број на бајти дека сакате да го одвои, така што вашиот нов капацитет.
Ќе ти дадам неколку минути, и направете го тоа во нашиот простор.
Започнете со верзии 1.
Ќе запре по надевам за доволно време за спроведување на притисок,
а потоа јас ќе ви даде уште една пауза да се направи поп.
Но тоа навистина не е толку код на сите.
Најмногу кодот е веројатно проширување работи, проширување на капацитетот.
Океј, без притисок да биде целосно направено,
но се додека вие се чувствувате како да сте на вистинскиот пат, тоа е добро.
>> Дали некој има било код тие се чувствуваат удобно со мене влече нагоре?
Да, јас ќе, но не секој имате било код можам да се повлече до?
Океј, можете да почнете да, освен тоа, што е тоа?
Јас секогаш забораваат тој чекор.
Океј, гледајќи притисок,
Дали сакате да се објасни вашиот код?
[Студентски] Прво на сите, јас зголемување на големината.
Претпоставувам дека можеби и јас треба да го имаат тоа-секој случај, јас зголемување на големината,
и јас се види дали тоа е помалку од капацитетот.
И ако тоа е помалку од капацитетот, јас го додадете во низа што веќе го имаме.
И ако тоа не е, јас се множи со капацитет од 2,
и јас се реалоцираат конците низа на нешто со поголем капацитет големина сега.
А потоа ако тоа не успее, јас му кажете на корисникот и да се врати лажни,
и ако тоа е во ред, тогаш стави стринг во новиот спот.
>> [Роб Б] Исто така забележите дека ние се користи убав bitwise оператор тука
да множи со 2.
Запомнете, лево поместување е секогаш ќе биде помножена со 2.
Право промена се дели со 2 онолку долго колку што се сеќавам дека тоа значи
подели со 2, како и во цел број поделен со 2.
Тоа би можело да се скрати на 1 тука или таму.
Но промена од лево со 1 е секогаш ќе биде помножена со 2,
освен ако претекување границите на број, и тогаш тоа не ќе биде.
А од страна на коментар.
Ми се допаѓа да се направи-тоа нема да се промени кодирање каков било начин,
но ми се допаѓа да се направи нешто како ова.
Тоа всушност се случува да се направи тоа малку подолго.
Можеби ова не е совршен случај да се покаже ова,
но сакам да сегмент го во овие блокови на-
океј, ако ова ако се случи, тогаш јас ќе одам да се направи нешто,
и тогаш функцијата е направено.
Јас не треба да тогаш движете очите на целиот пат на функција
да видиме што се случува по друго.
Тоа е ако ова ако се случи, тогаш јас само се вратат.
Исто така има убав дополнителна корист од се надвор од оваа
е сега се префрли лево еднаш.
Јас веќе не треба да-ако некогаш во близина смешно долги линии,
тогаш оние 4 бајти може да помогне, а исто така и повеќе лево нешто е,
помалку совладан сметаш дека ако сакал-во ред, морам да се сеќавам
Јас сум моментално во време јамка во внатрешноста на друго место во внатрешноста на за телефонска линија.
Каде што може да го направите ова враќање веднаш, јас вид на како.
Тоа е целосно опционални и не очекува во било кој начин.
>> [Студентски] Треба да има големина - во пропаднат состојба?
На пропаднат услов тука е што не успеа да realloc, така да.
Забележи како во пропаднат состојба, веројатно,
освен ако не сме слободни нешта подоцна, ние сме секогаш ќе пропадне
без разлика колку пати ние се обидуваме да им помогнам нешто.
Ако се продолжи со туркање, ние го задржи зголемување, големина,
иако ние не се стави нешто врз оџакот.
Обично ние не прираст големината до
откако успешно го стави на магацинот.
Ние ќе го стори тоа, да речеме, или тука и тука.
А потоа наместо да се каже s.size ≤ капацитет, тоа е помалку од капацитетот,
само затоа што се пресели каде што сè е.
>> И запомнете, единственото место каде што ние би можеле да се вратат лажни
е тука, каде realloc враќа нула,
и ако се случи да се сетам на стандардната грешка,
можеби може да се разгледа овој случај каде што сакате да печатите стандардна грешка,
па fprintf stderr наместо само печатење директно на стандарден излез.
Повторно, тоа не е очекување, но ако тоа е грешка,
тип printf, тогаш можеби ќе сакате да го направите да се печати стандардна грешка, наместо на стандарден излез.
>> Секој имате било што друго да се напомене? Да.
[Студентски] можете да одиме во текот на [недоловим]?
[Роб Б] Да, вистинските binariness на тоа или само што е тоа?
[Студентски] Така да тоа множи со 2?
[Роб Б] Да, во основа.
Во бинарен земјиште, ние секогаш имаме множество на бројки.
Менувањето на овој левата страна 1 во основа, го внесува тука на десната страна.
Вратете се на ова, само да заборавиме дека се што е во бинарен
е моќта на 2, така што ова претставува 2 до 0,
ова 2 до 1, ова 2 до 2.
Со вметнување на 0 на десната страна, едноставно смени сето готово.
Што користи за да биде 2 до 0 е сега 2 на 1, е 2 на 2.
На десната страна дека ние вметнува
е нужно да биде 0,
што го прави смисла.
Ако некогаш се размножуваат голем број од 2, тоа не се случува да се заокружи чудно,
па 2 до 0 место треба да биде 0,
и тоа е она што половина предупреди за пред се ако не се случи да се префрлат
надвор од бројот на битови во цел број,
тогаш ова 1 се случува да се заокружи случува надвор.
Тоа е единствената грижа ако се случи да се занимаваат со навистина големи капацитети.
Но, во тој момент, тогаш си имаш работа со низа милијарди нешта,
што не може да се вклопат во меморијата во секој случај.
>> Сега можеме да дојдеме до поп, што е уште полесно.
Вие би можеле да ми се допаѓа, ако се случи да pop-еден куп,
и сега сте на половина капацитет повторно.
Вие би можеле да realloc да се намали количината на меморија имате,
но вие не мора да се грижите за тоа, па само realloc случај ќе биде
расте меморија, никогаш не се намалува меморијата,
која се случува да се направи поп супер лесно.
Сега редици, кој се случува да биде како Купишта,
но со цел дека ќе се работи надвор е обратен.
На блиски до прототипа пример на дното е линија,
па Претпоставувам, ако сте биле Македонски, јас би рекол
на блиски до прототипа пример на ред е ред.
Значи како една линија, ако сте првата личност во линија,
што се очекува да биде првиот човек надвор од линија.
Ако сте последниот човек во линија, ви се случува да биде последниот човек сервисираат.
Ние го нарекуваме дека правилото FIFO шема, додека магацинот е LIFO шема.
Овие зборови се прилично универзални.
>> Како Купишта и за разлика од низи, редици обично не дозволуваат пристап до елементите во средината.
Еве, говедо, имаме притисни и поп.
Тука, ние се случи да ги вика Стави во ред и dequeue.
Јас сум исто така слушнав ги повика смена и unshift.
Слушнав луѓе велат притисни и поп да се применуваат редици.
Слушнав вметнете, избришете,
па притисни и поп, ако зборуваме за Купишта, ќе се туркаат и пукање.
Ако зборуваме за редици, можете да изберете на зборови сакате да ги користите
за вметнување и отстранување, и не постои консензус за тоа што треба да се нарекува.
Но, еве, имаме Стави во ред и dequeue.
Сега, struct изгледа речиси идентично на магацинот структурата.
Но, ние треба да ги пратите на главата.
Претпоставувам дека тоа вели долу тука, но зошто не ни треба на главата?
На прототипи се во основа исти да им помогнам и поп музиката.
Можете да мислите на тоа како притисни и поп.
Единствената разлика е во поп се враќа-наместо на последната, тоа е враќање на прв план.
2, 1, 3, 4, или нешто.
И тука е почеток.
Нашата задача е целосно исполнет, па затоа четири елементи во неа.
На крајот на нашата задача е моментално 2,
и сега одиме за да вметнете нешто друго.
>> Кога ќе сакате да го вметнете дека нешто друго, она што го правевме за магацинот верзија
е ние продолжен нашиот блок од меморија.
Што е проблемот со ова?
[Студентски] Што се движат од 2.
Што реков пред околу крајот на редот,
тоа не дава никаква смисла да почнеме од 1,
тогаш ние сакаме да dequeue 1, а потоа dequeue 3, а потоа dequeue 4,
тогаш dequeue 2, тогаш dequeue оваа.
Ние не можеме да го користите realloc сега,
или во најмала рака, мора да се користат realloc во еден поинаков начин.
Но најверојатно не само треба да се користи realloc.
Ви се случува да мора рачно да ја копирате вашата меморија.
>> Постојат две функции за копирање меморија.
Има memcopy и memmove.
Јас сум во моментов читање на човекот страници, за да видиме кој сте ќе сакате да го користите.
Океј, memcopy, разликата е
дека memcopy и memmove, еден справува со случајот правилно
каде сте копирање во регионот што се случува да се преклопуваат регионот
сте копирање од.
Memcopy не ја рачката. Memmove прави.
Можете да мислите на проблемот, како-
да речеме сакам да го копирате овој човек,
овие четири до овој човек повеќе.
На крајот, она што низата треба да изгледа
по примерок е 2, 1, 2, 1, 3, 4, а потоа некои нешта на крајот.
Но ова зависи од редоследот по кој ние всушност копија,
бидејќи ако ние не се разгледа на фактот дека регионот ние сме копирање во
се поклопува со еден ние сме копирање од,
тогаш може да се направи како почеток овде, копирате 2 во место ние сакаме да одиме,
потоа преминете нашите совети напред.
>> Сега ние ќе бидеме тука и тука, и сега сакаме да го копирате
овој човек над овој човек и да се движат нашите совети напред.
Она што се случува да заврши добивање е 2, 1, 2, 1, 2, 1
наместо на соодветни 2, 1, 2, 1, 3, 4, бидејќи
2, 1 overrode оригиналниот 3, 4.
Memmove се справува со тоа правилно.
Во овој случај, во основа, само секогаш користете memmove
поради тоа што таа се справува правилно.
Тоа обично не вршат какви било полошо.
Идејата е, наместо од почетокот и копирање на овој начин
како што само не тука, тоа почнува од крајот и копии во,
и во тој случај, вие никогаш не може да има проблем.
Нема перформанси изгубени.
Секогаш користете memmove. Никогаш не се грижи за memcopy.
И тоа е каде што ви се случува да мора да се одделно memmove
на обвиткана околу дел од вашиот задача.
Не се грижи ако не целосно завршена.
Ова е потешко од оџакот, притисни и поп.
>> Секој имате било какви код можеме да работиш?
Дури и ако целосно нецелосни?
[Студентски] Да, тоа е сосема нецелосни, иако.
Целосно нецелосни е во ред додека ние-може да ве спаси ревизија?
Јас се заборави дека секој пат.
Океј, игнорирајќи што се случува кога ние треба да се промени големината работи.
Целосно се игнорира големината.
Објасни овој код.
Јас сум проверка прв од сите ако големината е помала од копија прв од сите
а потоа и по тоа, јас вметнете-земам главата + големина,
и јас бидете сигурни дека тоа обвива околу капацитетот на низа,
и јас вметнете нова низа на таа позиција.
Тогаш јас се зголеми големината и враќање вистина.
>> [Роб Б] Ова е дефинитивно една од оние случаи каде што ви се случува да сакаат да бидат со користење современи.
Секаков вид на случај, каде што се завиткување околу, ако мислите дека завиткување околу,
непосредна мисла треба да биде МО.
Како брзо оптимизација / направи вашиот код една линија пократко,
ќе забележите дека линијата веднаш по оваа
е само големината + +, така да се спојат дека во оваа линија, големина + +.
Сега овде, имаме случај
каде што немате доволно меморија,
па ние сме зголемување на нашите капацитети со 2.
Претпоставувам дека би можеле да имаат истиот проблем тука, но можеме да го игнорираме сега,
каде што ако не успеа да го зголеми вашиот капацитет,
тогаш сте ќе сакате да се намали вашата способност за 2 повторно.
Уште една кратка белешка е само како можете да направите + =,
исто така можете да го направите << =.
Речиси ништо може да се оди пред еднакви, + =, | =, и =, << =.
Char * нови е нашиот нов блок од меморија.
О, овде.
>> Што луѓето мислат за видот на нашиот нов блок од меморијата?
[Студентски] Тоа треба да биде знак **.
Размислување назад кон нашите struct се тука,
жици е она што се преразпределение.
Ние се прави цела нова динамика складирање за елементите во редот.
Она што ние ќе треба да се доделуват на вашиот жици е она што ние го mallocing токму сега,
и така новата ќе биде знак **.
Тоа се случува да биде низа на стрингови.
Тогаш што е случај со кој ние ќе се врати лажни?
[Студентски] Треба ли да се прави char *?
[Роб Б] Да, добар повик.
[Студентски] Што беше тоа?
[Роб Б] Сакавме да го направите големината на char * затоа што ние веќе не се-
ова всушност ќе биде многу голем проблем, бидејќи sizeof (знак) ќе биде 1.
Sizeof char * ќе биде 4,
па многу пати кога си имаш работа со ints,
ќе имаат тенденција да се извлечеш со тоа, бидејќи големината на int и големината на int *
на 32-битен систем се случува да биде истото.
Но, овде, sizeof (знак) и sizeof (char *) сега се случува да биде истото.
>> Што е околноста каде што се врати лажни?
[Студентски] Нови е нула.
Да, ако ново е нула, ние се врати лажни,
и јас одам да се фрли долу тука-
[Студентски] [недоловим]
[Роб Б] Да, тоа е во ред.
Можете или да го направите 2 пати капацитет или капацитет смена 1 и потоа само го постави овде или whatever.
Ние ќе го направи тоа како што го имал.
Капацитет >> = 1.
И никогаш не се случува да мора да се грижите за губење на 1 е место
затоа што те оставил префрлени од 1, така што 1 е место е нужно 0,
па десно поместување од 1, ти си уште ќе биде во ред.
[Студентски] Дали треба да го направи тоа пред да се врати?
[Роб Б] Да, тоа го прави апсолутно никаква смисла.
>> Сега се претпостави што се случува да се заокружи враќање вистина до крај.
Начинот на кој ние се случува да се направи овие memmoves,
ние треба да се биде внимателен со тоа како ние ги прават.
Дали некој има било какви предлози за тоа како ние ги правиме?
Ова е нашиот почеток.
Неизбежно, ние сакаме да започне на почетокот повторно
и копија работи во од таму, 1, 3, 4, 2.
Како го правиш тоа?
Прво, морам да погледнеме во човек страница за memmove повторно.
Memmove, со цел на аргументи секогаш е важно.
Ние сакаме нашата дестинација прво, извор секунда, големината третина.
Постојат голем број на функции кои се јават изворот и дестинацијата.
Дестинација, извор има тенденција да биде конзистентна малку.
Потег, што е тоа враќање?
Го враќа покажувач на дестинација, за која било причина можеби ќе сакате тоа.
Јас слика може да се чита, но ние сакаме да се преселат во нашата дестинација.
>> Која е нашата дестинација ќе биде?
[Студентски] Нови.
[Роб Б] Да, и каде сме ние копирање од?
Првото нешто што ние се копирање е ова 1, 3, 4.
Што е-ова 1, 3, 4.
Што е адресата на овој 1?
Што е адресата на која 1?
[Студентски] [недоловим]
[Роб Б] Раководител + адресата на првиот елемент.
Како да ја добиете првиот елемент во низата?
[Студентски] задача.
[Роб Б] Да, q.strings.
Запомнете, тука, нашата глава е 1.
Ебам тоа. Само мислам дека е магично-
Еве, нашата глава е 1. Одам да ги променам моите бои премногу.
И тука е жици.
Ова, ние или да го напише како што направивме овде
со глави + q.strings.
Многу луѓе исто така пишува дека и q.strings [шеф].
Ова не е навистина било помалку ефикасни.
Можете да мислите на тоа како сте го dereferencing, а потоа добивам адреса на,
но компајлерот ќе го преведеме на она што го имавме пред секој случај, q.strings + главата.
Или начинот на кој сакате да се размислува за тоа.
>> И колку бајти сакаме да го копирате?
[Студентски] Капацитет - глава.
Капацитет - глава.
И тогаш секогаш може да напише пример
да дознаам ако тоа е во право.
[Студентски] Тоа треба да се подели со 2 тогаш.
Да, па претпоставувам треба да ги користиме големина.
Ние се уште имаат големина да биде-
користење на големина, ние имаме големина еднаква на 4.
Нашата големина е 4. Нашата глава е 1.
Ние сакаме да го копирате овие 3 елементи.
Тоа е разумност проверете дали големината - глава е правилно 3.
И се врати тука, како што рековме порано,
ако ние се користи капацитет, тогаш ние ќе треба да се подели со 2
бидејќи ние веќе прерасна нашиот капацитет, па наместо тоа, ние ќе треба да користите големина.
Тоа копии тој дел.
Сега, ние треба да го копирате друг дел, делот кој е лево од самиот почеток.
>> Тоа ќе memmove во каква положба?
[Студентски] Плус големина - глава.
Да, ние веќе копирани во големина - глава бајти,
и така таму каде што сакате да го копирате останатите бајти е ново
а потоа големина минус-и, бројот на бајти што веќе копирани внатре
И тогаш каде сме ние копирање од?
[Студентски] Q.strings [0].
[Роб Б] Да, q.strings.
Ние или може да се направи и q.strings [0].
Ова е значително помалку честа од ова.
Ако тоа е само ќе биде 0, тогаш ќе имаат тенденција да се види q.strings.
Тоа е каде што ние сме копирање од.
Колку бајти ќе ти преостане да го копирате? >> [Студентски] 10.
Право.
[Студентски] Дали треба да се размножуваат 5-10 пати поголема од големината на бајти или нешто?
Да, така што ова е местото каде-што точно сме ние копирање?
[Студентски] [недоловим]
Што е тип на работа ние сме копирање?
[Студентски] [недоловим]
Да, па char * а дека ние сме копирање, не знаеме каде тие доаѓаат од.
Па, каде што тие се укажува на, како стрингови, на крајот ќе заврши туркање кон дното
или enqueuing кон дното.
Каде што тие доаѓаат од, немаме идеја.
Ние само треба да ги пратите на char * s себе.
Ние не сакаме да го копирате големина - глава бајти.
Ние сакаме да го копирате големина - глава char * s,
па ние ќе ја помножиш оваа страна sizeof (char *).
Исто тука долу, главата * sizeof (char *).
>> [Студентски] Што е [недоловим]?
Ова право тука?
[Студентски] Не, под тоа, големината - глава.
[Роб Б] Ова право тука?
Покажувачот аритметика.
Како покажувачот аритметичка е оди на работа е
тој автоматски се множи со големина од типот дека ние сме се занимаваат со.
Исто како овде, нови + (големина - глава)
е токму еквивалентно на и нови [size - шеф]
додека ние очекуваме дека може да функционира правилно,
бидејќи ако ние не се занимаваат со int низа, тогаш ние не индекс од int-
или ако тоа е со големина од 5 и сакате 4 елемент, тогаш ние индекс во
int низа [4].
Можете don't-[4] * големината на инт.
Дека таа се справува автоматски, и овој случај
е буквално еквивалент, па заградата синтакса
е само ќе се конвертира во оваа веднаш штом ќе ги собере.
Тоа е нешто што треба да бидат внимателни за тоа
кога ќе се додавајќи големина - глава
сте додавајќи не еден бајт.
Ти си додавање на една char *, која може да биде еден бајти или whatever.
>> Други прашања?
Океј, dequeue ќе биде полесно.
Јас ќе ти дадам една минута да се имплементира.
О, и претпоставувам дека тоа е истата ситуација каде што
што Стави во ред случај, ако ние сме enqueuing нула,
можеби сакаме да се справи, можеби не.
Ние нема да го направат тоа повторно тука, но исто како и нашите магацинот случај.
Ако ние Стави во ред нула, ние би сакале да ја игнорираат.
Секој има некои код можам да се повлече до?
[Студентски] Јас само имаат dequeue.
Верзија 2 е дека-во ред.
Сакате да се објасни?
[Студентски] Прво, осигурајте се дека има нешто во ред
и дека големината паѓа од 1.
Што треба да го направи тоа, а потоа ќе се врати на глава
а потоа се пресели на главата нагоре 1.
Океј, па таму е аголот случај ние треба да се разгледа. Да.
[Студентски] Ако вашата глава е во последен елемент,
тогаш не сакате глава до точка надвор од низа.
>> Да, па штом глава хитови на крајот од нашиот низа,
кога dequeue, нашата глава треба да се modded назад на 0.
За жал, не можеме да го направи тоа во еден чекор.
Претпоставувам дека начинот на кој јас би веројатно ја поправите тоа е
ова ќе биде char *, она што ние го врати,
без оглед на вашата променлива името сака да биде.
Потоа сакаме да МО глава од нашиот капацитет
а потоа се врати изгнивам.
А многу луѓе тука би можеле да се направи-
ова е случај на-you'll видите луѓе прават ако главата
е поголем од капацитетот, дали главата - капацитет.
И тоа е само работа околу тоа што МО е.
Раководител современи = капацитет е многу почиста
на обвивката околу отколку ако глава поголем од капацитетот главата - капацитет.
>> Прашања?
Океј, последното нешто што сме го оставиле е нашиот поврзани листа.
Може да се користи за некои од поврзани листа однесување, ако не
поврзани листи во вашиот хаш маси, ако не хаш табелата.
Силно препорачувам прави хаш табелата.
Можеби веќе направено Trie,
но обиди се потешко.
Во теорија, тие се асимптоматично подобро.
Но, само погледнете во големите одбор,
и се обидува никогаш не го направи подобро, а тие заземаат повеќе меморија.
Сè за се обидува завршува се полошо за повеќе работа.
Тоа е она решение Дејвид Malan е секогаш е
тој е секогаш мислења неговиот Trie решение, и да видиме каде што е сега моментално.
Она што беше тој под, Дејвид J?
Тој е # 18, па тоа не е страшно лошо,
и дека ќе биде еден од најдобрите обидува можете да замислите
или еден од најдобрите обидува на Trie.
Зарем тоа не е дури и неговата оригинална решение?
Се чувствувам како Trie решенија имаат тенденција да бидат повеќе во овој опсег на RAM меморија употреба.
>> Оди до самиот врв, и RAM меморија употреба е во едноцифрена бројка.
Оди надолу кон дното, а потоа можете да започнете да гледате обидува
каде што ќе добиете апсолутно масивни RAM меморија употреба,
и се обидува се потешко.
Не е целосно достоен за тоа, но образовна искуство, ако не една.
На последната работа е наша поврзани листа,
и овие три нешта, Купишта, редици, а поврзани листи,
какви било идни нешто што некогаш стори по компјутерски науки
ќе ја преземе имате блискоста со овие работи.
Тие се толку фундаментално значење за сè.
>> Поврзани листи, и тука имаме одделно поврзани листа ќе биде нашата институција.
Што значи одделно поврзани значи за разлика од двојно поврзани? Да.
[Студентски] Тоа само укажува на следното покажувачот наместо на покажувачи,
како оној пред него и оној по него.
Да, па во сликата формат, што никако не можев само да направам?
Имам две работи. Имам слика и слика.
Во сликата формат, нашите одделно поврзани листи,
неизбежно, имаме некој вид на покажувачот на чело на нашата листа,
а потоа во рамките на нашата листа, ние само треба покажувачи,
а можеби и ова укажува на нула.
Тоа ќе биде вашиот типичен цртеж на одделно поврзани листа.
А двојно поврзана листа, можете да се врати назад.
Ако јас ви даде секое јазол во листата, тогаш ќе мора да се дојде до
било кој друг јазол во листа доколку таа е двојно поврзана листа.
Но, ако јас ќе го добиете третиот јазол во листата и тоа е одделно поврзани листа,
нема начин сте некогаш ќе дојде до првиот и вториот јазли.
И има бенефиции и detriments, и еден очигледно една
е ве однесе до повеќе големина, а вие треба да ги пратите на тоа каде овие работи се укажува сега.
Но, ние само се грижат за одделно поврзани.
>> Неколку работи што ќе мора да ги спроведе.
Вашиот typedef struct јазол, int i: struct јазол * следниот; јазол.
Тоа typedef треба да се изгорени во вашиот ум.
Квиз 1 се би сакал даде typedef на поврзани листа јазол,
и треба да бидете во можност да веднаш драсканица дека надолу
дури и без размислување за тоа.
Претпоставувам неколку прашања, зошто не ни треба struct тука?
Зошто не можеме да кажеме јазол *?
[Студентски] [недоловим]
Да.
Единственото нешто што ги дефинира еден јазол како нешто
е typedef себе.
Но, како на овој момент, кога сме вид на парсирањето преку овој struct јазол дефиниција,
ние не го завршиле нашите typedef уште, па со оглед на typedef не е завршена,
јазол не постои.
Но struct јазол прави тоа, и овој јазол овде,
Ова исто така може да се нарече нешто друго.
Ова би можело да се нарече n.
Тоа би можело да се нарече поврзани листа јазол.
Тоа би можело да се нарече нешто.
Но, ова struct јазол треба да се нарекува истото како овој struct јазол.
Што ти се јавам ова има исто така да биде тука,
и така што, исто така одговори на втората точка на прашањето
кој е зошто-многу пати кога ќе видите structs и typedefs на structs,
ќе видите анонимни structs, каде што само ќе видите typedef struct,
имплементација на struct, речник, или whatever.
>> Зошто тука ние треба да се каже јазол?
Зошто не може да биде анонимен struct?
Тоа е речиси ист одговор.
[Студентски] Вие треба да се однесуваат на тоа во рамките на структурата.
Да, во рамките на структурата, што треба да се однесуваат на struct себе.
Ако не даде struct име, ако тоа е анонимен struct, вие не може да се однесува на него.
И последно, но не и најмалку важно, сите тие треба да биде малку јасна,
и тие треба да ви помогнат да сфатат ако сте пишување на оваа надолу
дека сте прави нешто погрешно, ако овие видови на нештата не го прават смисла.
Последно, но не и најмалку важно, зошто тоа треба да биде структурата јазол *?
Зошто не може едноставно да се struct јазол следно?
[Студентски] Покажувач на следниот struct.
Тоа е неизбежно она што го сакаме.
Зошто да не се биде struct јазол следно?
Зошто тоа мора да биде struct јазол * следно? Да.
[Студентски] Тоа е како бесконечна јамка.
Да.
[Студентски] сето тоа ќе биде во една.
Да, само мислам на тоа како ние би го направил големината на или нешто.
Големина на struct е во основа + или - некои шема тука или таму.
Тоа е во основа ќе биде сумата на големини на работите во структурата.
Ова право тука, без да се менува ништо, големината ќе биде лесно.
Големина на struct јазол ќе биде големината на i + големината на следната.
Големина на i ќе биде 4. Големина на следната ќе биде 4.
Големина на struct јазол ќе биде 8.
Ако ние не го имаат *, мислејќи на sizeof,
тогаш sizeof (i) ќе биде 4.
Големина на struct јазол следната ќе биде големината на i + големината на struct јазол следната
+ Големината на i + големината на struct јазол следната.
Тоа ќе биде бесконечна рекурзија на јазли.
Ова е причината зошто ова е како работите треба да биде.
>> Повторно, дефинитивно запаметат дека,
или барем да го разбере доволно што може да биде во можност да
Причината преку она што треба да изгледа.
Работите што сте ќе сакате да се имплементира.
Ако должината на листа-
можете да лажеш и да ја задржите околу
глобалната должина или нешто, но ние нема да го направат тоа.
Ние ќе се смета должината на листата.
Имаме содржи, па тоа е во основа како пребарување,
па ние имаме поврзани листа на цели броеви да се види дали овој број е во поврзани листа.
Ставете пред се случува да го вметнете на почетокот на листата.
Додадете ќе се вметне на крајот.
Insert_sorted се случува да го вметнете во подредени позиција во листата.
Insert_sorted вид на претпоставува дека никогаш не сте користеле ставете пред или додаваат во лоши начини.
>> Insert_sorted кога сте спроведување insert_sorted-
Да речеме дека ние имаме поврзани листа.
Тоа е она што во моментов изгледа, 2, 4, 5.
Сакам да внесете 3, па се додека листата по себе е веќе сортирани,
тоа е лесно да се најде каде 3 припаѓа.
Јас со почеток во 2.
Океј, 3 е поголем од 2, па сакам да продолжувам да одам.
О, 4 е премногу голема, па знам 3 се случува да одам помеѓу 2 и 4,
и морам да го надминете совети и сите нешта.
Но, ако ние не се строго се користи insert_sorted,
како да речеме јас ставете пред 6,
тогаш мојата поврзани листа ќе стане ова.
Тоа сега не прави никаква смисла, така и за insert_sorted, вие само може да се претпостави
дека листата е сортирана, иако операции постојат
која може да предизвика таа да не се подредени, и тоа е тоа.
Најди корисен вметнете толку тие се главните работи што ќе мора да ги спроведе.
>> За сега, за момент да се направи должина и содржи,
и оние кои треба да биде релативно брзо.
Доближат затворање на време, така што секој има нешто за должина или содржи?
Тие ќе бидат речиси идентични.
[Студентски] Должина.
Ајде да видиме, ревизија.
Во ред.
Сакате да се објасни?
[Студентски] Јас само се создаде покажувачот јазол и иницијализира до првата, која е нашата глобална променлива,
а потоа ќе провериш да се види дали тоа е нула, па јас не добие сегмент вина и врати 0, ако тоа е случај.
Инаку, јас поминете, следење на рамките број
колку пати сум пристапи следниот елемент од листата
и во исто прираст операција, исто така пристапите дека вистинските елемент,
а потоа континуирано се направи проверка за да видат дали тоа е нула,
и ако тоа е нула, тогаш тоа прекинува и само го враќа бројот на елементи сум пристапува.
>> [Роб Б] Дали некој има било какви коментари за ништо?
Ова изгледа фино точноста мудар.
[Студентски] јас не мислам дека ви треба јазол == NULL.
Да, па ако јазол == NULL враќање 0.
Но, ако јазол == null тогаш ова-ох, постои точноста прашање.
Тоа беше само ти си ми се враќа, но тоа не е во опсегот токму сега.
Вие само треба int i, па јас = 0.
Но, ако јазол е нула, тогаш јас се уште ќе биде 0,
и ние ќе се врати 0, па овој случај е идентична.
Друга заедничка работа е да се задржи декларација
на јазол во внатрешноста на за телефонска линија.
Може да се каже-ох, бр.
Да го чувам како оваа.
Јас веројатно ќе ја стави int i = 0 тука,
тогаш јазол * јазол = прво тука.
И ова е веројатно како-да се ослободиме од оваа сега.
Ова е најверојатно како јас би го напишал.
Вие исто така може-да гледа во неа се допаѓа ова.
Ова за јамка структура, токму тука
треба да биде речиси како природно на вас, како за int i = 0
i е помала од должината на низата i + +.
Ако тоа е начинот на кој можете iterate преку низа, ова е како да iterate во текот на поврзани листа.
>> Ова треба да биде втора природа во некоја точка.
Со тоа на ум, тоа ќе биде речиси иста работа.
Сте ќе сакате да iterate во текот на поврзани листа.
Ако јазол-Јас немам идеја што вредност се нарекува.
Јазол i.
Ако вредноста на тој јазол = i враќање вистина, и тоа е тоа.
Забележете дека само начинот на кој ние некогаш се врати лажни
е ако ние iterate во текот на целиот поврзани листа и никогаш не се врати точно,
па тоа е она што овој го прави тоа.
Како од страна на белешка, ние најверојатно нема да добие за да се додаде или ставете пред.
>> Брзи последен белешка.
Ако видите статички клучни зборови, така да речеме статички int count = 0,
тогаш што правиме брои + +, што во основа може да мислам на тоа како глобална променлива,
иако јас само рече дека ова не е како ние ќе спроведе должина.
Јас го правам ова тука, а потоа брои + +.
Било кој начин можеме да внесете јазол во нашиот поврзани листа ние сме зголемување, нашите брои.
Поентата на ова е тоа што на статички клучен збор значи.
Ако јас само имаше int count = 0 тоа би било редовните стари глобалната променлива.
Што статички int count значи дека тоа е глобалната променлива за оваа датотека.
Невозможно е за некоја друга датотека,
како мислам на pset 5, ако имате отворени.
Имате и speller.c, и имаш dictionary.c,
и ако само се изјасни за работа на глобално ниво, тогаш ништо speller.c
може да се пристапи во dictionary.c и обратно.
Глобални променливи се достапни од било кој. В датотека,
но статички променливи се достапни само во рамките на самата датотека,
па внатрешноста на правопис Проверка или во внатрешноста на dictionary.c,
ова е заслужен за тоа како јас ќе прогласи мојата променлива за големината на мојата низа
или големината на мојот број на зборови во речникот.
Бидејќи не сакам да се изјасни за глобалната променлива дека секој има пристап до,
Јас навистина само се грижат за тоа за мојата цели.
>> Добрата работа во врска со ова е, исто така, целата име судир нешта.
Ако некои други датотека се обидува да се користи глобалната променлива наречена брои, работите одат многу, многу лошо,
па ова убаво држи работите сигурно, и само вие можете да имате пристап до него,
и никој друг не може, а ако некој друг декларира глобална променлива наречена брои,
тогаш тоа нема да се меша со вашиот статички променлива наречена брои.
Тоа е она што статични е. Тоа е датотека глобалната променлива.
>> Прашања за ништо?
Сите во собата. Bye.
[CS50.TV]