SPEAKER 1: Saluton ĉiuj. Ni tuj komencu. Mi pensas, ke homoj ankoraŭ irante esti filtrita en. Sed en la intereso de tempo, tial ni povas ekiru infanoj el tie ĝustatempe, Ni tuj komencu. Do bonvenon al la CS50 Kvizo 0 recenzo. Por tiuj de vi kiu ne rimarkis tamen, vi havas demandon merkrede. Woo-hu. Se vi ne komencis studi ankoraŭ aŭ ne konsciis ke tio ekzistas ankoraŭ, estinteco kvizojn kaj ĉiuj informoj pri via kvizo estas sur cs50.net/quizzes. Ekzistas iuj sufiĉe bonaj aĵoj en tie, estinteco kvizojn el la lasta 10 jaroj tiel kiel informo pri tiu demandaro kaj temoj ke estos kovrita. Do ni komencu. Do vi uloj povas memori la unuan tago de klaso David tiuj lampoj sur. Do esence, ĉiu kiu iras sur sub la kapuĉo de komputilo estas farita en duuma. Duuma signifas kion ĝi sonas kiel, 0-aj kaj 1-oj. Ĝi havas du valoroj kiuj povas esti reprezentitaj. Do ĝuste kiel en la unua tago de la sekcio Kiam David ŝaltis lumon bulbo reprezenti, aŭ 1, nia komputilo komprenas binaran kiel 0-aj kaj 1-oj, sur aŭ ekstere. Bazaj de Binaraj. CXiu loko estas reprezentita en bazo du. Do vi aldonas 2 al la 0 al la 1 por la 2 tutan vojon supren. Kalkuli kio via binara estas decimala, vi nur sekvas ĉi ekvacio tipo afero. Se vi havas 1 en ajna el tiuj lokoj, vi multigos gxin per nenial bazi ĝi estas, aldonu ĝin, kaj vi havos la dekuma. Do jen kiel vi kalkuli 5 en duuma. Ĝuste kiel kion ni faris en la lasta diapozitivoj, jen kiel vi farus reprezenti 1 ĝis 5. Simile, simple ŝatas vin povas aldoni kaj subtrahi en dekuma aŭ bazo 10, aŭ vere neniun bazon, sur povas aldoni kaj subtrahi en duuma. Ĝuste kiel atendite kiam aldonu la du supren, se ĝi egalas granda ol 1, vi portas 1, faru gxin al 0, kaj fari la aldono ke vojo, nur kiel atendite per regulaj dekuma aŭ ajna alia bazo. Cool. Tiel kiel mi diris antaŭe, ĉio daŭrigas sub la kapuĉo de nia komputilo estas farita en 0-aj kaj 1-oj aux binaraj. Do kiel ni esprimas, ekzemple, literoj aŭ ciferoj, aŭ karakteroj? Kaj la respondo al tio estas ASCII. ASCII estas surĵeto inter karakteroj ke ni kutime vidas en la Angla lingvo kiel A'S B, C estas, substreki, streketoj, kaj io simila. Kaj mapas ke al ASCII valoro. An ASCII valoro estas nur numero kiu povas esti komprenita per via komputilo. Kaj kiel vi povas fari krom kaj subtraho kun nombroj, vi povas fari ilin per ASCII valoroj. Do en ĉi tiu ekzemplo, kion estos ĉi elprinti? Yeah, do nur Spaco B spaco C spaco D. Kien mia muso iras? Rimarku vi povas difini int ĉe 65. Kaj kiam vi presas ke el uzanta procento C, ĝi devos interpreti tion kiel karaktero kaj presi A. Simile, oni povas deklari kiel signo. Kaj kiam vi presas ĝin uzante procento C, ĝi devos interpreti ke procento D. Kaj ĝuste kiel vi povas aldoni nombro, vi povas aldoni rolantoj ASCII valoroj, en ĉi tiu kazo. Do iom puntero por ĉiuj. 5, kiel kordo, ne fakte egalas 5. Do kiom eble ni konverti la kordo 5 por la entjero 5? Ajna ideoj? Yeah. Do se ni havas 5 kiel kordo, ni povas subtrahi 0. Kaj tio donos al ni 5. Kaj simile, se ni havas 5 kiel entjera, aldoni ke la kordo 0. Kaj kiu donas al ni la ŝnuron 5. Cool. Nun, memoras reen al prelegi kie Ni parolis pri algoritmoj. Do kiel ni vere volas komputilo fari interesajn aferojn? Sciu, simple aldonante kaj forprenante nombroj kaj impreso aferojn ne ke ekscita. Kutime ni volas nian komputilon plenumi ian algoritmo. Iu iom pli kompleksa ol simpla aritmetiko. Algoritmo estas nur paŝo post paŝo aro de instrukcioj por kiel plenumi iu task-- nur ŝatas recepto. Vi eble memoras la unuan tagon de klaso kie David ni kalkulu ĉambron homoj kaj kiom da homoj estis en la ĉambro. Vi povus uzi por kalkula unu post unu. 1, 2, 3, 4. En tiu kazo, lineara tempa algoritmo. Sed David enkondukita algoritmo por vi kalkulu la popolon en la ĉambro kie ĉiuj ekstaras, vi diras via numeron alian personon, aldoni ke nombro, kaj unu persono sidiĝas. Kaj vi ripetis tion. Tio estas unu tipo de algoritmo. Ni povas analizi kiel efika ĝi algoritmo estas bazita sur ĝi estas kuri tempo. Sed ni parolos iomete pli pri tio poste. Do ĉiuj algoritmoj povas ankaŭ esti skribita en _pseudocode_. _pseudocode_ Estas nur angla kiel sintakso uzata por reprezenti programlingvo. Ekzemple, se ni volis demandi uzanto diveni mia ŝatata nombro, ni havu _pseudocode_ kiel tia. Akiru uzantoj diveni. Se la diveno estas ĝusta, diru ilin ili estas ĝentila, alie diri ilin ili ne estas korekta. Kaj _pseudocode_ estas maniero de facile reprezenti ideon aŭ algoritmo. Do nun ni eble volas reale skribi tion en la lingvo kiun la komputilo multobligita kompreno. Do ni povus skribi nian _pseudocode_ kaj interpreti ke en fontkodon. Ĝis nun, fontokodo devas aliĝi al certa sintakso de programlingvo. Kaj ĝis nun, en CS50, ni estis uzante plejparte c. Do eble ĉi fontkodon por c. Poste en la kurso, vi nokto venas en kontakton kun aliaj programado lingvoj kiel PHP. Aŭ se vi eĉ preni aliaj klasoj, vi plenumadu Java, Python, aŭ eĉ OCML. Sed en nia c programo lingvoregionoj, kiel ni povus skribi la kodon fonto la _pseudocode_ algoritmo kiu Mi nur priskribis antaŭe. Do kiel faras via komputilo reale kompreni tion? Kiel mi diris antaŭe, nur vere Komprenas nuloj kaj. Do kiel ĝi ricevas de la fonto kodo por iu kiu povas esti komprenis? Nu, ni havas ion nomata tradukilo. Se vi memoras reen en la plejparto de via psets, vi havis ian programon skribita en punkto c dosieron. Kaj tiam vi tajpi konsisto. Do kion fari faras? Vi povas tajpi make kompili via programo ĉar someone-- kiu skribis via p aro; verŝajne David-- kreis make dosiero. Kaj kiu rakontas fari scii kuri via tradukilo, nomita tin, ke volo tiam kompili vian fontkodon kontesti kodo, kiu estas nuloj kaj ke via komputilo komprenu. Sed iom pli poste, ni iros pli en profundo sur tradukiloj. Do memoru pset 0, where-- jes, vi havas demandon? Publiko: [inaudible]? SPEAKER 1: Jes. Mi pensas ke ili reale devus esti enreta. Yeah. Publiko: Ĉu kiel [inaudible]? SPEAKER 1: ĝi ne estas. La estas sur cs50.net/quizzes. Publiko: Slash kvizojn, slash 2013, slash 0, kaj simple premas per kvizojn 2013 kaj kvizo 0, revizii sekcio diapozitivoj. SPEAKER 1: Yeah, do se vi infanoj volos tiri ĝin kaj rigardu ĝin sur vian propra komputilo, jen delikata tro. Diru tion denove. Publiko: [inaudible]. SPEAKER 1: Yeah, [inaudible] estas la loka variablo. Ho, jes? Publiko: [inaudible]? SPEAKER 1: Ne, strikoj ne estas en la ekzameno. Pardonu, ŝia demando estis, estis strikoj en la ekzameno. Kaj ĝi ne estas. Do pset 0, vi uloj devus havi ĉiuj implementado ion uzante nulo. Kaj ni lernis kelkajn bazajn programado konstruelementoj uzante nulo. Do ni rigardu iujn de tiuj konstruelementoj konsistigantaj programon. Unue estas Bulea esprimo. Buleaj esprimoj estas bonaj kaj 0 aŭ de io kiu havas du eblajn valorojn. En tiu kazo, vera aŭ malvera, aŭ malŝalti, kaj jes aŭ ne. Ekzemplo de simpla, tre simpla, Programo kiu uzas Bulea esprimon ĉi tie. Do en ordo por bulea esprimoj utila, ni havas Bulea operatoroj. Tiuj estas telefonistoj kiuj povas esti uzitaj kompari iuj valoroj. Do ni havas kaj aŭ ne egalas, malpli ol aŭ egala al, pli granda ol aŭ egala al, kaj malpli ol aŭ pli granda ol. Sed ĉi tiuj operatoroj estas ne tre utila se ni povas kombini ilin en kondiĉoj. Do vi uloj povas memori de nulo kaj de viaj p prende ke ni havis kondiĉojn. Ili estas, esence, kiel forkoj en la logikon de via programo kiu ekzekutu dependanta sur ĉu kondiĉo estas konita. Do unu el la kondiĉoj kiujn ni devis uzis multfoje en ĉi tiu kurso estas la se, alie se, kaj alie kondiĉoj. Jen ekzemplo de kiel vi povus uzi tion. Ĉu iu scias la diferencon inter nur uzante se deklaroj ĉiuj la vojo malsupren versoj se, alie, se, kaj alie kombinita? Jes? Publiko: [inaudible]. SPEAKER 1: Ekzakte. Do se mi havus se la tuta vojo malsupren ĉi vojo, eĉ se tiu kondiĉo revenoj vera, ĝi ankoraŭ daŭrigas provante la venontaj du. Dum, kun alia-se, kiel ajn deklaro, se oni redonas vera, la aliaj ne provitaj. Demandojn pri tio? Cool. Do vi uzas se-alie de alia komunikaĵo se vi scias ke ĝi povas nur esti unu el tiuj kazoj. Do ni scias se x estas malpli ol 0, estas certe ne tuj estos pli granda ol 0. Tuj poste, alia konstruaĵo bloko ke ni lernis estas cikloj. Ni havas tri tipojn de cikloj. Por masxojn, dum maŝojn, kaj fari dum maŝojn. Kaj ĝenerale, kiam vi sidas malsupren skribi ion, vi devas decidi kiu el la tri kiun vi volas uzi. Do kiel ni decidi kiu unu? Ni ĝenerale uzas por buklo se ni scias kiom da fojoj ni volas persisti tra iu aŭ kiomfoje ni volas realigi taskon. Ni uzos dum maŝojn se ni bezonas iujn kondiĉo por esti vera teni kurado. Kaj ni uzas fari dum tre simila al dum, sed ni volas nian kodo kuri je Almenaŭ unu fojo. Do fari momenton, kio estas la la do volas ĉiam kuras almenaŭ unu fojo. Dum kiu, kun la tempo, ĝi ne kuras tute se la kondiĉo ne estas kontenta. Demandojn kun tiu? Do strukturo de a por buklo. Vi infanoj ĉiuj vidis ĉi. Vi pravalorizi ĝin. Vi havas ia kondiĉo. Do, ekzemple, ni povus pravalorizi kiel i egalas 0. i estas malpli ol 10. Kaj i ++. Tre simpla kiu ni faris. Dum momento buklo, simile, vi havas havi ian inicialización, ia kondiĉo, kaj ia ĝisdatigo. Do ni povas apliki niajn por buklo ankaŭ kiel dum buklo uzanta ĉi. Kaj simile kun la do dum buklo, ni havu iom inicialización, ekzekuti ion, ĝisdatigi ĝin, kaj tiam kontrolu la kondiĉo. Do nun funkcioj. Ni metu cxion kune. Ni eble volas skribi iun speco de funkcio. Komuna funkcio kiu vi povus vidis jam estas ĉefa. Ĉefa estas funkcio. Ĝi havas reveno tipo, int. Ĝi havas funkcion nomo, ĉefaj. Kaj ĝi havas argumentojn, argc kaj argv. Do ĉefa estas simple funkcio. Aliaj funkcioj vi povus esti uzita, printf-- printf estas function-- GetInt, toupper. Sed tiuj hazarde estis implementado por ni ian bibliotekon. Se vi uloj memori inkludante ĉi CS50.h bibliotekon aŭ la standard I / O biblioteko. Jes, pridubas? Publiko: Is ĉefa ĝuste imanenta en c? Ĉu ĝi simple speco de [inaudible]? SPEAKER 1: La demando estas se ĉefa estas imanenta en c. Kaj jes, ĉiuj funkcioj havas ĉefan funkcion. Estas speco de necesaj por la komputilo scii kie komenci kuri la kodon. Publiko: Do ​​vi ne volis [inaudible]? SPEAKER 1: Ne Ajna alia demandoj? Cool. Do kiel vi povas uzi funkcio ke estas skribita por vi, vi povas ankaŭ skribi vian propran funkcion. Tiu estas funkcio kiu iu potenco skribis kalkuli la volumo de q, ekzemple. Ekzistas reveno tipo tie, en tiu kazo int, nia funkcio nomo q kaj nia Listo de parametroj. Kaj rimarku, ke vi devas skribi la datumojn tipo de la parametro vi volas uzi alie la funkcio ne scii kia parametro mi devus esti akcepto. Do, en ĉi tiu kazo, ni volas entjero kiel nia eniro. Do kial povus ni volas uzi funkciojn? Unue, granda organizo. Ili helpas rompi vian kodon en pli organizita pecoj kaj fari pli facile legebla. Simpligo. Tio estas bona por la dezajno. Kiam vi legas koderon kaj la ĉefa funkcio estas vere, vere longaj, eble estus pli malfacile kialo pri kio okazas. Do se vi rompi ĝin malsupren en funkcioj eble estus pli facile legi. Kaj reutilizar-kapablecon. Se vi havas eron de kodo kiu estas esti nomita aŭ kuras multnombraj fojoj, anstataux reskribi ke kodo 10 fojojn en via ĉefa funkcio, vi povus volas reuzi ĝin. Kaj tiam ĉiu tempo vi bezonas uzi tiun koderon, nomita la funkcio. Do nun, se ni memoras reen al nulo, Ni ankaŭ parolis pri kelkaj konceptoj, unu el kiuj estas enhebrado. Fadeno estas la koncepto de multnombraj sekvencoj de kodo ekzekutinte samtempe. Do pensas reen al tago kie David vi uloj kalkulu la numeron de homoj en la ĉambro. Esence, kio okazas on estas vi ĉiuj infanoj estis kurante apartaj fadenoj. Kaj tiuj fadenoj venas kune akiri ian respondon. Simile, en Scratch, kiam vi havas multnombraj sprites, vi povus havas katon kaj hundon. Kaj ili estus samtempe kurante ilia propra skriptoj. Tio estas ekzemplo de threading. Kaj la alia koncepto kiu estis enkondukita en nulo estis okazaĵoj. Kaj eventoj estas kiam multnombraj partoj de via kodo interkomuniki. En Scratch, tio estis, kiam vi uzis la elsendo kontrolo kaj kiam mi Ricevu blokoj. Kaj ankaŭ, en Problemo Ara 4, ni vidis iom eventoj tiel. Vi uloj povus uzi la Gevent biblioteko. Kaj tie estis funkcio waitForClick en kiu vi staris por la uzanto klaku. Kaj via alklako, en ĉi tiu kazo, estus la evento kaj atendas klako estas via okazaĵo traktilo. Kaj ankaŭ, laŭlonge kurante vian psets kaj laborante sur via psets vi eble venis en kontakton kun kelkaj el tiuj ordonoj. Jen kion vi tajpis en vian terminalfenestro aŭ ajna fenestro kiu montras supren en via g redaktu al, esence, navigi via komputilo. Do ekzemple, LS listigas enhavon de dosierujo. Faru dosierujo kreas novan dosierujon. KD, ŝanĝo dosierujo. RM, demeti, forigas dosieron aŭ iu dosierujo. Kaj poste forigi la dosierujon forigas dosierujo. Publiko: [inaudible]? SPEAKER 1: Jes, certas. Pardonu, la demando estis se vi sugestus metante ĉi sur la lertaĵoj folio. Ĝi povus helpi. Se vi havas ĉambron, vi povas meti ĝin sur. Estas ankaŭ nur ĝenerale sufiĉe bona memori ke kiam vi uzas ĝin vi eble volas nur havas ĝin parkerigis. Tio faros vian vivon multe pli facila. Ĉu mi respondu vian demandon? Do nun, ni parolis iom mallonge pri bibliotekoj. Sed la du ĉefaj ke ni estis uzante ĝis nun en la kurso estas standard I / O kaj cs50. Kia ajn estas inkluditaj en la normo / S biblioteko? Yeah, do nun ni uzas printf. En cs50, ni uzis GetInt kaj GetString. Kaj la datumtipo kordo pasas ankaŭ esti deklarita en tiu cs50 biblioteko. Ni parolos iom pli en profundo sur kiom bibliotekoj labori kaj kiel oni interagi kun la resto de via kodo. Sed tiuj estas la du ĉefaj ke ni venis en kontakto kun tiel multe en la kurso. Tipoj. Tiuj estas bone memoras kiom ĉiu tipo estas reprezentita per aŭ kiel multaj bajtoj ĉiu tipo requires-- int, 4 bitokoj; char, 1 bajto. Float estas 4 bitokoj. Kio estas duobla? Publiko: [inaudible]. SPEAKER 1: Yeah, do kaleŝego sed duobligi la grandecon. Kio pri longa? Publiko: [inaudible]. SPEAKER 1: OK. Kio estas longa? Publiko: [inaudible]. SPEAKER 1: Yeah, duobligi la int. Jes. Publiko: [inaudible]. SPEAKER 1: Longa [inaudible]. Kaj poste longa tempo estas duobla tio. Publiko: Ne, ne. Longa estas nur int. Ĝi dependas de la arkitekturo antaŭ la [inaudible] kaj int havas la saman grandecon. [Inaudible]. SPEAKER 1: Do longan kaj kiel int estas samaj. Kaj poste longa tempo estas duobla la int. Cool. Kaj tiam, kio estas la lasta tipo? Publiko: Pointer. SPEAKER 1: Jes, tiel ni lernis iomete pri punteros. Kaj sendepende de kia puntero estas indikante to-- eblis char stelo aŭ int star-- ĝi estas ĉiam 4 bajtoj por montrilo. Demandojn pri tio? Jes? Publiko: [inaudible]? SPEAKER 1: Do longa kaj int estas la sama en ĉi cs50 aparato. Aŭdienco: La aparato estas tute interŝanĝeblaj. SPEAKER 1: Jes. Do tiam longa longa estas duobla kiel int. Spektantaro: tio estas la 32 bitoj? SPEAKER 1: 32 bitoj, yeah. Publiko: Tiel [inaudible]? SPEAKER 1: Jes, se li ne eksplicite diras vin devus alpreni 32 bitoj. Publikon: ĝi dirus ion kiel subkompreni arkitekturo kiel la aparato. Por 64 bitoj, la nuraj aĵoj kiuj ŝanĝo estas sopiras kaj punteros. Ili ambaŭ [inaudible]. SPEAKER 1: Jes? Publiko: Demando. Do unu el la praktiko kvizojn, petu pri unsigned int. Do kiel estus tiu determinos el la int [inaudible]? SPEAKER 1: An sensigna en estas ankaŭ 4 bitokoj. Sed kio estas malsama pri subskrib int kaj sensigna int? Publiko: [inaudible]. SPEAKER 1: Rajto. Oni povas reprezenti negativajn valorojn. Sed kiel faras ĝi fari? Publiko: [inaudible]. SPEAKER 1: Jes, ĝi ŝparas 1 iom reprezenti la signon. La subskribita havas iom ke reprezentas la signon. Kaj sensigna nur estas ĉiuj pozitivaj. Publiko: OK. Do vi dirus ke duoblan estas dufoje la grandeco de kaleŝego? SPEAKER 1: Duobla estas dufoje la grandeco de kaleŝego, jes. Publiko: Kiel funkcias puntero por longa tempo [inaudible]? SPEAKER 1: Do la demando estas kiel faras la montrilon al longa long-- kiel estas kiu nur kvar bajtoj kiam longa tempo liaj 8 bajtoj. Do memoru kio estas puntero, esence, je la tre baza valoro. Publiko: [inaudible]. SPEAKER 1: Yeah, do puntero estas nur memoro situo. Do ne gravas kiom spaco ke puntero notas al. Ĝi nur bezonas 4 bajtoj por konservi trako de tiu memoro situo. Ajna alia demandoj? Cool. Do la lasta afero mi estas normo eligo. Vi devus uzi ilin ofte sufiĉas ke vi povas memori. Sed tio estas kiam ni uzas printf, ekzemple. Kaj ni havas tiujn anstataŭiloj ke vokitaj formato kodoj. Do procento c char, procento i por int, kaj ni povas ankaŭ uzi procento d. Ĝi estas la sama aĵo. Sed, ĝenerale, en CS50 nin provu uzi procento i. Elcento f por kaleŝego. Elcento ld por longa tempo kaj procento s kordo. Simile, ni estis uzante kelkaj de tiuj eskapo sekvencoj. Ekzemple, backslash n por nova linio. Tiu estas nur por kiam vi formatado vian kodon por print f. Jes? Publiko: Kio estas procento d por? SPEAKER 1: Do la demando Estas kio procento d por? Elcento d estas por ints. Elcento d kaj procento i estas la sama. Publiko: Kio estas la diferenco inter backslash n kaj backslash r? SPEAKER 1: Do la demando estas kio estas la diferenco inter reagon n kaj reagon r? Mi kredas backslash r is-- Publiko: Do ​​backslash r nur implicas revenas al la komenco de la linio sen fakte tuj nova linio. Do se vi presi backslash r kaj vi reiri al la komenco de la linio tiam vi presi pli aĵoj, vi reskribi La aĵoj estas jam sur [Inaudible]. Dum, n reale iras al nova linio kaj iras al [inaudible]. SPEAKER 1: Nu, aliajn demandojn? Bone. Mi tuj transdonis ĝin al Dan kiu daŭros. [Aplaŭdo] DONAS: Ĉiuj righty. Do mi parolus pri alia larĝa gamo de ideoj de la klaso, kiuj estas malglate reprezentanto de semajno po la komenco de la semajno tri dividante kun malplenigita, kiu estas simple maniero de trakti valoro de certa tipo kiel valoron de malsama tipo. Do ni povas fari ĉi tion kun signoj por ints, flosas al ints kaj longe sopiras duobligi. Ĉiuj ĉi tiuj aferoj povas esti uzata kiel manieroj trakti iun numeran valoron minus char kiel iuj aliaj nombra valoro. Do tie estas iuj aferoj kun tiu, de Certe, kiu venas kiam vin jxetu aĵoj kiel float al ints. Do tio estas iom stranga. Ni havas kaleŝego kiu estas 1.31. Ni multobligos ĝin per 10,000. Kaj tiam ni presi ĝin kiel int. Kion faras ĉi eliro? 10.000 fojojn 1.31. Do 13.000, estas ke la diveno? Publiko: mi kredas ke estas 10.000. DONAS: Do mi multiplikante ĝin 10,000 antaux Mi jxetante gxin. Publiko: Ho. Ne estos sola 9 kaj iu 0 numerojn? DONAS: Vi havu iom bizara ciferoj. Do bone, estas 1,3 fojoj 10,000. Do tio estas 13.000. Kaj tiu ekstra weird-- Publiko: 13.100. DONAS: 13.100. Dankon, Rob. Kaj tiu ekstra weirdness-- ĉi 9,9-- Estas simple ĉar ĉi casting finis rondigas malsupren kie ĝi ne devus havi. Yeah. Aŭdienco: La casting okazas post io alia? DONAS: Do ĉar mi havas presita, ĝi faras ĉi multipliko antaŭ ĝi faras ĉi casting. Publiko: [inaudible]. Dan: Mi pensas ke estus jxetita unua, yeah, kio estus 10,000. Io alia? Cool. Do tio estas 13.099. Kial tiu okazos? Imprecision. Kaleŝegoj ne estas perfektaj. Ili povas nur reprezenti nombrojn al iu numero de signifaj ciferoj. Do se ni presi 8 sig figojn je ĉi kaleŝego, ni preni ian malbela rigardante nombro. Kaj tio estas pro 1,31 neniom precize esti reprezentita per simpla potencoj de du en la maŝino. Do ĝi finas portante la plej proksima divenu, kiu finu estante iom malalta. Sencon? OK. Nun, conmutación estas malsama maniero de faranta kondiĉa deklaroj kie ĉiuj Ni zorgas pri estas ununura variablo. Do en ĉi tiu aparta ekzemplo, ni ricevi entjeran de la uzanto. Kaj poste ni rigardis kion tio entjero estas. Supozeble, estas nombro inter unu kaj kvar. Tio estas kion ni petas. Do vi ŝaltilo de la variablo nomo. Tiam vi starigis kazoj de eblaj taksos eblus. Do tiu kazo, diras ke estas malalta. Kaj tiam vi rompi eliri de la ŝaltilo kondiĉo tiel vi ne plu iri. En la sekvanta case-- tiel kazo du kaj kazo three-- se estas kazo du tio nur gutas malsupren la unua linio de kodo vidas kiel kun majuskloj tri ĝis ĝi vidas ripozon. Do la kialon vi akiri kazo oni nur print malalta estas ĉar mi havas ĉi ripozon ĉi tie. Se mi, ekzemple, ignoris ĉi break-- se mi ĵetis ĉi breakaway-- estus presi malaltaj, kaj tiam donus presi mezo, kaj tiam rompigxus. Do paŭzoj estas grava parto de ŝanĝi kondiĉoj kaj ili devus esti tie. Ajna kazoj kiuj ne deklaris eksplicite estas manipulitaj de la defaŭlta kazo en la ŝaltilon kaj devus esti jxetitaj. Publiko: Do ​​1, 2, 3, kaj 4 estus n? Dan Valoroj ke n povas esti. Jes. Yeah? Publiko: Do ​​kiam vi havas ke [inaudible]? DONAS: Vi devus presi malaltaj, kaj tiam estus presi mezo, kaj tiam rompigxus. Publiko: Kial ĝi presas mezo se [inaudible]? DONAS: Do ĉio sub kazo antaŭ ripozon falas sub. Do se oni presas estas sube kazo kia estas ĉi jenaj print. Yeah? Publiko: [inaudible]? DONAS: Do tiu nombro estas nur aparta valoro ke tiu variablo povas, ĉu ne? Ĉu tio havas sencon? Yeah. Publiko: [inaudible]? DONAS: Jes, kazo du devus presi meza kaj tiam rompu. Publiko: [inaudible]? Dan: Mi pensas iu? Kio aliaj datumtipoj vi povas ŝalti super? Publiko: Vi povas ŝanĝi super ĉiu datumtipoj. Sed ĝi nur signifas io super signoj kaj ints kaj da tio, ĉar se vi ŝaltanta super puntero ke vere ne havas sencon, ŝaltanta super ŝarĝoj, se eĉ ni vi faros tion, ĉar de flosanta punkto en precizeco, vi ankaux ne vere volas fari tion ĉiuokaze. Do sufiĉe tre, nur ints kaj signoj kaj aĵoj tiel. DONAS: Yeah, estas kiam vi havas eksplicitan valorojn, kiujn vi konas, mi pensas, ĝi povas esti ke ŝaltilo estas fakte utila. Bona? OK. Medio estas la gamo kiu deklarita variablo etendas. Do en ĉi tiu malgranda bloko de kodo havas mi, estus plena de eraroj. Kaj la kialo estas mi deklaris ĉi int i ene de la medio de ĉi por buklo. Kaj tiam mi provas referenci ke i ekster ke por buklo medion. Do esence, vi povas pensi pri atingo kiel ion ke vi rakontu kun interne aro de frizita krampoj nur Ekzistas ene de tiuj buklaj krampoj. Kaj se vi provas kaj uzi tiun variablon eksteren de tiuj buklaj krampoj, vi ricevas eraron de la tradukilo. Yeah? Publiko: Do ​​ĉi tiu ne funkcias? DONAS: Ĉi tio ne funkcias, jes. Kordoj. String estas char *. Ili estas ekzakte la sama. Ili estas nur montriloj al karakteroj. Kaj neniu kordoj ke vi havas devus fini kun backslash nulo, kiu estas nur c konvencio. Ĝi nomiĝas NULL finilo. Kaj NULL-- ĉefurbo N, ĉefurbo U ĉefurbo L, ĉefurbo L-- ne estas la sama kiel la NULL finilo. Tiu estas montrilo. Tiu estas karaktero. Ili estas tre distinga. Memoras. Estos en la kvizo, verŝajne. Mi ne vidis la kvizo. Yeah? Publiko: Do ​​NULL estas, ni diru, la puntero? DONAS: Jes. Publiko: Kion faras [inaudible]? DONAS: Se diri, malloc nomas kiam ne havas sufiĉan memoron akiri ajn grandecon vi petante, malloc revenos NULL. Ĝi estas, esence, kiam funkcio estas supozis reveni puntero, vi bezonas kontroli kontraŭ NULL ĉar NULL estas bela good-- estas, speco de, la rubo valoro. Ĝi estas nulo ĝis punteros iri. Whenever vi nomas funkcio, kiu resendas montrilo. Vi tuj volas kontroli por certas ke tiu puntero estas NULL ĉar NULL estas tre komuna. Ĝi estas speco de rubo reveno. Do se io ne iru dekstren, nur reveni NULL anstataŭe. Publiko: [inaudible]? DONAS: Jes, kaj tio ĉi. Publiko: [inaudible]? Dan Literumada ĝin kiel ĉi. Ĝi estas la NULL finilo. Estas minuskle N-U-L-L se vi literumas ĝin. Publiko: Mi ĵus eliris revenis kaj provis ĝin. Kaj se vi provas meti glitpunkta valoron en ŝaltilo, ĝi estos krias al vi dirante aserto postulas esprimon de entjera tipo. DONAS: Tie vi iru. Sed jes, kio estas la demando denove? Publiko: [inaudible]? DONAS: Do ĉefurbo N, ĉefurbo U ĉefurbo L, ĉefurbo L estas reala c afero. Estas la NULL pointer kaj volo nur esti traktita kiel tia. Vi neniam provas kaj literumi la NULL karaktero kaj vidas neniun alia maniero ol tio. Yeah? Publiko: Do ​​redonante char max aŭ io en la notoj, ĉu korpigi la sama funkcio kiel [inaudible]? Publiko: Do ​​vi raportante al reveni char max el getchar aux kio ĝi estas? Publiko: Yeah. Publiko: Yeah, do la ĝenerala termino por ĉiuj tiuj aferoj estas gardostaranto valoroj. Do kiel reveni int max el GetInt kaj char max el getchar, estas supozitaj esti kiel, bone, se tio estas reveni al ni, iu iris malbone. Por punteros, ni nur hazarde havas tiu gardostaranto valoro kiu ĉiuj konvenas. Kaj jen estas tio, vi revenos Kiam aferoj iras malbone. Do char max estas kion ni uzas reprezenti ion kiel NULL aŭ getchar. Publiko: Do ​​se vi provas getchar, vi povus simple meti NULL? Ĉu tio faras diferencon? DONAS: Vi ne povus simple kontroli NULL. Vi devus kontroli char max ĉar la reveno valoro de la funkcio estas gravulo ne puntero. Yeah? Publiko: Tiu demando demandas por la kordo longo. Ĉu tio inkluzivas la NULL karakteron? DONAS: Ne Kaj tio estas vere kiel kordo longo scias halti ĉar ĝi iras tra via tabelo de signoj ĝis li vidas nula karaktero. Kaj tiam ĝi estas kiel cxiuj Bone, mi faris. Publiko: [inaudible] kvin? DONAS: Saluton estus kvin. Yep. Do arrays estas kontinua blokoj de memoro. Ili havas tujan aliron dirante la nomo de la tabelo kaj tiam, en krispa krampoj ajn indicon vi deziras iri al, ili estas indeksita de nulo per la longo de la tabelo minus 1. Kaj ili estas deklarita de la tipo de la kion vi stoki en la tabelo, la nomo de la tabelo, kaj poste sendepende de la grandeco estas de tiu tabelo. Do tio estas char tabelo de longo ses kiu havas tiujn valorojn. Yeah? Publiko: [inaudible]? DONAS: Yeah. Publiko: [inaudible]? DONAS: Se vi havas, kion tuj en la tabelo jam faris. Do vi povus indiki ĉi anstataŭ kiel, diru, char, kion ajn la nomo de via tabelo estas malplena krampoj egalas krispa prepari H komo E komo L komo L komo Ho komo NULL karaktero kaj frizita krampoj. Tio ankaŭ laboras kiel deklaro. Publiko: [inaudible]? DONAS: Tiam vi bezonas havi la grandeco jam faris. Publiko: [inaudible]? DONAS: Jes. Ĉiuj righty. Komandlinio argumentoj estas metodo ricevas enigon el la uzanto kiel argumentoj por ĉefa. Ĉefa prenas du argumentojn. La nombro de argumentoj kiuj estas estante preter la komandlinion kaj kordo vektoro aŭ ŝnureto tabelo ĉiu el la argumentoj. Do se mi, ekzemple, nomas funkcio kiel punkto el 1 spaco, 2 spaco, tri, argc estus 4. Kaj argv 0 estus dot ekstere. Argv1 devus esti 1. argv2 estus 2. argv3 estus 3, en tiu konkreta kazo. Yeah? Publiko: [inaudible]? DONAS: La lasta ero en la tabelo ĉar la tabelo estas longo argc plus unu el argb, la lasta elemento estas NULL pointer. Estas argc plus 1. Do, en la kazo kiun mi ĵus diris, estus argv 0 estas skalara ekstere. argv 1 estas 1 argv2 estas 2. argv 3 estas 3. argv 4, kiu estas unu granda ol argc estus NULL. Kaj tio estas la NULL pointer. Jes. Kaj tio estas ĉar kordo estas oni char stelo estas puntero. Do ĝi devas esti la sama tipo. Yeah? Publiko: Du demandoj. Do unu, kio estas la diferenco inter tiu kaj GetString aliaj ol unu tipo en la uzanto motoro? Kaj du, estas stokita ene via freŝa memoro? Do kiel, GetString farus esti [inaudible]? DONAS: Kie estas stokita? Mi ne scias, kie ĝi estas stokita. Publiko: Do, fakte, oni scias kiom ajn funkcii vi nomas estas argumentoj estas stokitaj en la pilo? Do argc kaj argv estas argumentoj por ĉefa kaj ili estas sur la stakon, aŭ vere nur super kio vi pensas tiel la komenco de la stako. Kio estis la alia parto de la demando? Publiko: Do ​​kio estas la [inaudible]? DONAS: Yeah, nur alimaniere de iĝi enigon el la uzanto. Ĉi onia iomete pli eficiente kaj ĝi estas handier por skriptoj ĉar vi povas simple pasi argumentojn por via ĉefa funkcio anstataŭ devi atendi por uzantoj, se vi ne havas ajnan uzantoj. Publiko: Kaj jes, iru kordoj estus [inaudible]. Estus stoki la aĵoj vi bezonas. DONAS: Yeah? Publiko: [inaudible]? DONAS: Jes, argv 0 ĉiam inkludas la dot slash de la funkcio alvokon. Yeah? Publiko: [inaudible]? DONAS: Jes, ĉiu el la argumentoj estas finiĝis NULL karaktero ĉar ili estas kordoj. Publiko: [inaudible]? DONAS: Jes, argv argc estas NULL pointer. Publiko: [inaudible]? DONAS: Oh yeah. Yeah, bedaŭras. Publiko: Tiel [inaudible]? DONAS: Do la demando estas se vi havis la komandlinio dot slash punkto el 1, 2, farus la nombro de komandlinion argumentoj esti du aŭ devus esti tri? Publiko: mi kredas ke ne vere gravas. Mi emas diri, ho, vi ne pasas ajna komandlinio argumentoj kiam, Evidente, vi nomas la funkcion. Do mi emas vocalmente ekskludi la funkcio de la komanda linio argumentoj kvankam estas inkluzivita en argv. DONAS: Sed se ĝi estis test-- yeah-- kaj ankaŭ se vi diros ion kiel argc egalas 3, Vi estas en sekura staranta. Yeah? Publiko: [inaudible]? Dan: Mi pensas, se anstataŭ nomi ĉi en argc kaj argv kordo krampoj sed konservis la samajn tipojn kaj simple nomas ili iun malsama kiel kaj b, estus ankoraŭ funkcias? Kaj ĝi ankoraŭ funkcios, vi just-- anstataŭ uzi argc-- Vi ŝatus uzi kaj b. Yeah? Publiko: [inaudible]? DONAS: Do la demando estas GetString estas tuj stoki memoron en la ruino ĉar GetString estas char *. Ĝi stokas memoro en la havaĵo, ĉar ĝi flamo nun malloc ene la efektiva efektivigo de GetString. OK, movante sur. Sekureco. Do por esti vere sekura vi fidi neniun kaj vi permesos neniu aliro al ajna de via informo, kiu estas kial ĉiuj konstruas siajn proprajn maŝinojn, iliaj propraj operaciumoj, ĉiuj iliaj programoj de nulo, kaj evidente ne konekti al ajna alia maŝinoj tra la interreto. Do komputiloj estas necerta. Ili vere estas. Ni devas fidi aliajn homojn. Kaj la ideo de sekureco estas ke vi estas klopodi limigi la kvanton de fidon, kiun vi bezonas. Kaj unu el la rimedoj vi faros tion Estas tra ĉifriko. Ĉifriko estas, esence, ni havas sekretojn. Kelkfoje ni devas pasi niajn sekretojn tra, ni diru, la interreto aŭ aliaj aferoj. Kaj ni ne volas homoj scii tiujn sekretojn. Do ni ĉifri niajn sekretojn en vojo ke ni esperas neniu povas diveni. Do ni used-- tra la kurso de ĉi class-- aĵoj kiel Cezaro kodita kaj [Inaudible], kiuj estas ambaŭ tre, tre nesekura manieroj kodi aĵoj. Ili estas facile diveni kion ili estas kaj kion via sekretoj estas. La reala mondo uzas multe pli komplika ĉifrado skemoj. Kaj ni ne eniros en multe pli ol tio. Depuración. GDB estas la plej bona. Mi iras emfazi ĉi denove. Uzu GDB tutan tempon ĉiun tempo vi havas problemon. Komandoj ke estas utilaj en GDB estas rompi, kiuj pasas ĉu linion nombro, funkcio nomo, esence kie en via kodo vi volas halti, kaj povi preni kontrolon. Print prenas variablon kaj presas el kion ajn tiu variablo estas en tiu punkto en via ekzekuto. Sekva movas vian ekzekuto kune unu paŝo. Kaj treti paŝoj ene funkcio en via ekzekuto. Aliaj aferoj estas kuri, kiu estas kiel vi fakte kuri via kodo. Continue prenas ĉiujn paŝojn bezonataj por atingi la najbaran rompo punkto. Kaj estas multaj, multaj aliaj. Rigardu ilin. Ili estas grandaj. Yeah? Publiko: [inaudible]? DONAS: Jes, kio estas erarserĉilo. Do erarserĉilo estas programo kiu permesas elpurigi vian programon. Tio ne estas programo kiu trovas insektojn por vi, kvankam tio estus granda. Kaj lasta por mi estas serĉo. Do la tipoj de serĉo kiu parolis proksimume en tiu klaso estas lineara serĉo, kio estas ĝuste, ke vi rigardu tra ĉiu ero de la serĉo spaco, unu ero en tempo, ĝis vi trovi kion vi serĉas aŭ ĝis vi atingos la finon de via serĉo spaco je kiu atentigi vin diras ke vi ne povis trovi la elemento kiun vi serĉis. Kaj ĉi tio portas en bona konstanta tempo, kio estas 0 de 1 kaj ĉe plej malbona linearaj tempo, kio estas 0 de n. Duuma serĉo, kiu bezonas sordida elementoj. Vi iras al la mezo de via elementoj, vidi se la ero vi serĉas estas pli granda aŭ pli malgranda ol la elemento ke vi estas en la mezo. Ĝi estas granda, vi diras, ke la fundo de via serĉo spaco estas via aktuala situo, meze, kaj vi restartigu la procezo. Se ĝi estas pli malgranda, vi rigardas diri ke the-- yeah, kio estas supre? Publiko: [inaudible]? DONAS: Jes. Ajna speco de varo kiun'S instruis en La klaso estas bela ludo por la testo. [Ridado] DONAS: Kaj la fakto ke vi ne havis fari ĝin por problemo aro, ĝi estas bela ludo por la testo. Publiko: Ĉu ni iru sur ĝi kiel to-- DONAS: Estos transiris. SPEAKER 2: La reala kodo [Inaudible] estas study.cs50.net. Do se vi rigardas la praktikon problemo en la merge speco paĝo de study.cs50.net, tie estas la kodo por implementar kunfandi varo. Do vi ne devos implementar ĝin mem ĉinokte. Sed certigi vin kompreni iom ol enmemorigi ĝin. Publiko: [inaudible]? SPEAKER 2: La merge speco paĝo sur study.cs50.net, estas praktiko problemo kiu, se vi premas per problemo, je la fino estas solvon, kiu estas la merge speco efektivigo. Sed certigi vin kompreni anstataŭ nur enmemorigo ĝi aŭ kopiante ĝin. Publiko: Kaj perfekte valida problemo por la ekzameno estus iu kiel ĉi tie estas listo. Kion tio lerta aspekti post unu paŝo de selektadoj varo aŭ inserción varo aŭ kion ajn. Unu plenan iteración de la listo. Do eĉ se vi ne finas bezonante kodo por tio, vi bezonos por kompreni ĝin sufiĉe por scii ke tuj esti modifi ĉi tabelo. DONAS: Estas tio por mi. [Aplaŭdo] LUCAS: Hey ĉiuj. Mia nomo estas Lucas. Mi iras paroli pri rekursio, ĉiuj la varoj kiujn ni lernis, kaj iom el ĉiuj punteros. OK? Do unue: rekursio. Kion ĝi volas diri ke funkcio estas komputebla? Publiko: Calls mem. LUCAS: OK, nomitaj mem, jes. Tiel kiel ĉi bildo, ekzemple. Estas kiel la bildo interne de pentraĵo kaj tiel plu. Do ekzemple, vi povas have-- Dan kiuj parolis pri duumaj serĉo. Unu manieron en kiu duuma serĉo estas rikura estas la fakto, ke vi estas provante trovi nombro. Do vi iras al la mezo. Kaj tiam vi kontrolu se la nombroj ne en la maldekstra kaj la dekstra. Kaj tiam, se vi trovu la nombro estas tuj estos sur la maldekstra, ĝi estas la sama aĵo kiel faras la serĉon denove sed ĝuste je la maldekstra de la listo. Do jen kiel ĝi sonas kiel ĝi estas rikura. Tial do vi uloj havas rekursie solvo por merge varo. OK, do jen ekzemplo. Do diru ke mi volas elekti ĉiuj nombroj de 1 al n. Mi povas rimarki, ke la sumo de la n nombro estas n plus n minus 1 ĝis 1. Sed tiam, se mi rigardas n minus 1 pli n minus 2 plus 1, tio estas la sama aĵo kiel sumante nombroj ĝis n minus 1. Do mi povas diri la sumo de egala sumo egalas n plus la sumo de n minus 1. Ĉu tio havas sencon? Kaj mi ankaŭ havus ion alian nomata la bazo kazo, kiu estas kiu la sumo de la nombroj ĝis nulo devus esti nulo. Do kiam mi atingas la nombron nulo, mi ĉesas rakonti. Ĉu tio havas sencon? Do jen ekzemplo de kiel Mi povas apliki tion. Do mi havas tiun funkcion en iuj. Tio bezonas entjero n. Do jen mi unue kontrolu se n estas malpli aŭ egalas al nulo. Do se estas malpli aŭ egalas al nulo, mi reveni nulo, kiu estas nia bazo kazo. Alie, mi povas simple reveni n plus la sumo de la ciferoj de unu al n minus unu. Sencon? OK. Do jen kiel tio aspektas. Vi havas sumo de 2 egaluloj 2 plus la sumo de 1. Kaj iuj de 1 estas 1 plus la sumo de 0, kio estas 0. Sencon? Do se ni rigardas la stako de via programo, tiu estas kio similas. Unue, ni devas la ĉefan funkcion. Kaj tiam la ĉefa funkcio nomata sumo 2. Kaj tiam sumo 2 tuj diros, ho, sumo 2 egalas 2 plus la sumo de unu. Do mi aldonos sumo de 1 al la stako. Kaj la sumo de 1 tuj voki sumo de 0, kiu ankaŭ tuj estos aldonita al la stako. Kaj tiam ĉiu el tiuj kiuj estas sur supro de alia devas reveni antaŭ la aliaj aĵoj povas plu iri. Do ekzemple, tie, sumo de 0, unue, tuj revenos 0. Kaj tiam elekti sumo de 1. Tiam sumo de 1 tuj reveni 1 al sumo de 2. Kaj fine, sumo de 2 tuj reveni 3 ĉefaj. Ĉu tio havas sencon? Ĝi estas vere grava por kompreni kiel la stako laboras kaj provi vidi se ĝi faras senton. OK, do ordigo. Do kial ordiga grava, unua el cxiuj? Kial ni zorgas? Iu ajn? Donu al mi ekzemplon? Yeah? Publiko: [inaudible]. LUCAS: Yeah, OK. Do vi povas sercxi pli kompetente. Tio estas bona maniero. Do, ekzemple, ni havas multe da aferojn, vere, en niaj vivoj kiuj estas ordo. Ekzemple, vortaroj. Estas tre grave havi ĉiujn vortoj ian ordon ke ni povas aliri facile. Do tio, kion li diras. Vi povas serĉi pli kompetente. Pensu kiel malfacile estus havi vortaro en kiu la vortoj estas en hazarda ordo. Vi devos rigardi, sufiĉe, ĉiu unuopa vorto, ĝis vi trovos la vorto, kiun vi serĉas. Se vi uzas Facebook ankaŭ, kiam vi rigardas viaj amikoj, vi estas tuj vidos ke Facebook metu vian proksima amiko estas sur supro de la aĵoj ke vi ne parolu kun tiu tiel. Se vi iras la tutan vojon al la malsupro de Via amiko listo, vi tuj vidos homoj kiuj vi probable eĉ ne memoru, ke vi estas amikoj kun. Kaj tio estas ĉar Facebook specoj viaj amikoj bazita sur kiom fermi Vi estas por ili. Do organizi datumojn. Ankaŭ Pokemon. Do vi vidas, ke ĉiuj pokémons havi numerojn. Kaj tio estas kiel facila vojo de aliro datumoj. Publiko: Aliri Pokemon. LUCAS: Yeah. Publiko: [inaudible]. LUCAS: Yep. OK, do elekto varo. Selektado varo tuj elektu malgranda Unsorted valoro de lerta ĉiu tempo en ĉiu ripeto. Ĝi estas speco de kiel la varo kiun vi faras en via kapo kiam vi provas ordigi liston en mano. Esence, ĉiuj vi estas vi rigardas por la plej malgranda nombro. Vi metis ĝin en la ordo listo. Kaj tiam vi serĉas la sekvanta malgranda nombro. Kaj tiam vi observos fari tio kaj tiel plu. Do selektado varo estas esence vi elektu ĉiufoje pli malgranda Unsorted valoro. Metis fine de la ordo parton de la listo. Kaj observu fari tion. Do ni rapide vidi kio tio aspektas. Do jen la ordo kaj Unsorted listo. Do por la ordo de lerta, ĝi estas komence malplena. Kaj poste mi iros elektu malgranda nombro ĉi tie, kiu estas 2. Do mi ricevas la numeron 2 kaj Mi metos en la fronto de la listo. Kaj tiam mi serĉos la sekvanta malgranda elemento, kiu estas 3. Do mi metis ĝin ĉe la fino de la ordo listo. Kaj tiam mi gardas fari tion. Mi trovos 4 kaj metis ĝin ĉe la fino. Trovi 5 kaj metis ĝin ĉe la fino. Kaj rigardu: cxiuj el tiuj tempoj kiuj Mi jene meti ĝin ĉe la fino, esence, interŝanĝante du valoroj. OK? Kaj tiam la lasta, vi simple havas pli elemento. Do ĝi estas jam ordo. OK, do inserción varo. Insertion speco vi tuj havos ankaŭ ke afero havi ordo kaj oni Unsorted listo. La sola afero estas ke ĉiu tempo vi aldoni elementon al la ordo listo, vi nur elektu la elemento kiu Estas antaŭ la Unsorted listo. Kaj tiam vi tuj trovos kion pozicio devus esti en la ordo parton de la listo. Vidu kion ĉi estas tiel Tio faras pli sentita. Do komence, ekzemple, mi provas enigi la numeron tri en la ordo parton de la listo. Do la listo ne havas ion. Do mi povas nur meti la numeron 3. Nun, mi volas aldoni la numeron 5 al la ordo parton de la listo. Do mi rigardas la nombro 5. Mi rimarkas, ke ĝi estas pli granda ol 3. Do mi scias, ke ĝi devas esti post 3. Do mi metis 3 kaj 5. Tiam mi volas enmeti la numeron 2. Mi rimarkis, ke la nombro 2 estas fakte daŭri tiam ambaŭ 3 kaj 5. Do mi efektive devas meti ĝin ĉiuj vojon en la komenco de la listo. Do mi devas, speco de, ŝanĝi la tutan elementoj en la ordo listo do mi povas cedu al la numero 2. Tiam mi vidas la numero 6. Mi vidas, ke gxi estu post 5. Do mi metis ĝin tie. Kaj fine, mi rigardas la numero 4. Kaj mi rimarkas devus esti inter 3 kaj 5. Kaj tiam mi metos ĝin tie kaj movo ĉiuj aliaj elementoj. Sencon? Bobelo Ordigi. Do bobelo varo estas esence kion vi tuj do-- ni nomas ĝin bobelo varo ĉar vi iros tra la list-- ĝi estas fakte pli bone se mi simple montri Vi ŝatus this-- kaj vi tuj kompari najbaraj nombroj. Kaj vi tuj interŝanĝu siajn pozicioj se ili ne estas en la dekstra ordo. Do esence, kio tuj okazi estas tie, ekzemple, vi havas la 8 kaj 6. Vi scias ke la ordo ordo fakte 6 kaj 5, dekstra? Do vi iras por interŝanĝi ordoj. Tiam mi vidas 8 kaj 4 tie. Kaj Mi faros la samon. Mi interŝanĝu denove. Kaj fine, 2 kaj 8. Mi ankaŭ interŝanĝi ilin. Ĝi nomiĝas Bobelo Ordigi ĉar post ĉiu el tiuj ripetoj, efektive, la plej granda nombro en la listo ricevas ĉiuj la vojon al la fino de la listo. Ĉu tio havas sencon? Ĉar ĝi gardas interŝanĝante ĝi kaj movas ĝin dekstren. OK, do tio estas la dua ripeto. Ĝi estus la sama afero. Mi faros unu swap kaj tiam la lasta. Mi, ke ne ekzistas svopoj kaj la listo estas ordigita. Do Bobelo Ordigi, ni esence konservi irante tra la listo kaj interŝanĝante tion ĝis mi rimarkis, ke mi ne faros ajna svopoj faranta ke ripeto, kiu signifas ke listo estas jam ordo. Sencon? Ni parolu iomete pri rultempo. Do vi uloj memori Big Ho, Omega, kaj Theta? Yeah? OK, kio estas Big O, unua el cxiuj? Publiko: [inaudible]. LUCAS: Yeah, ĝi estas nomata plej malbona kazo ekzekuto, kiu signifas nur ke ĝi estas kiom vi atendas la programon preni kuri. Kiel, en terminoj of-- en ĉi case-- n. La nombro de elementoj en la lerta en la plej malbona kazo. Kiel, en la plej malbona ebla kazo. Do por Bubble Ordigi, ekzemple, ni havos Big O de n kvadrato. Kial ni havas tion? Kial Bobelo Ordigi Big O n kvadrato? Publiko: [inaudible]. LUCAS: Yeah, do la plej malbona kazo estos ke mi devos fari n ripetoj. Do ĉiu el la ripetoj tuj alporti la plej granda ero al la fino el la listo. Do la plej malbona kazo estas, ke mi havas fari ecx n fojojn. Kaj por cxiu el tiuj fojoj mi devas faru n svopoj ĉar mi devas kompari ĉiu du elementoj. Tial do ĝi estas n kvadratoj ĉar ĝi estas n × n. Tiam, selektado varo estas ankaŭ n kvadrata ĉar, ĉiu ripeto, mi devas rigardas ĉiu unuopa ero en la listo. Kaj poste trovi la plej malgranda, kio signifas, ke mi devas trarigardi n elementoj. Kaj mi devas fari tion n fojojn ĉar Mi devas elekti ĉiuj la n elementoj. Inserción varo estas ankaŭ n kvadrato ĉar la plej malbona kazo scenaron volo esti, oni, mi devas enmeti n nombroj, dekstra? Do mi jam scias ke mi iros havi n ripetoj. Sed por ĉiu el tiuj numeroj, se mi rigardi ĉiujn numerojn en la ordo listo kaj meti la tutan vojon en la fronto, ke estos n kvadrato ĉar estos n × n denove. Sencon? Kio pri omega? Publiko: [inaudible]. LUCAS: Ĝi estas la plej bona kazo scenaro. Tiel estas kiel en multaj fojoj por ordig, la plej bona kazo scenaro estas kiam la listo estas jam ordo. Do vi ne vere havas fari nenion. Bobelo Ordigi havas la pli bonan kazo scenaro de n. Ĉu vi uloj scias kial? Publiko: [inaudible]. LUCAS: Yeah, se vi konservi trako de ĉu datumoj porcio havis ajnan svopoj aŭ Ne, se vi havas iun kiel aro al vera, se oni iteracion, se la listo estas jam ordo, esence, kio okazos estas mi tuj provu interŝanĝi ĉiu du najbaraj elementoj. Mi tuj vidas, ke ne estas svopoj. Kaj mi simple reveni tuj. Do signifas ke mi ĵus devis iru tra la listo unu fojo. Do estas n ĉar mi aspektas je n elementoj. Kial selektado speco n akordi? Jes, eĉ se la listo estas ordigita, por ĉiu ripeto de selektado speco, mi devas elekti la minimuman elementon. Do tio signifas ke mi havas ekstere rigardi en ĉiuj elementoj en la Unsorted listo kaj trovi la minimuma por ĉiu ripeto. Ĉu tio havas sencon? Kaj inserción glavo n ĉar en la kazo ke mi provas enmeti la nombroj kaj ĉiu el la nombroj, kiam mi provu enmeti ilin, mi vidas, ke oni estas en la dekstra pozicio. Mi ne devas iri kontroli ĉiujn aliajn nombroj en la Unsorted listo. Tial do tio estos n. Sencon? Kaj kio estas theta? Publiko: [inaudible]. LUCAS: Kion bedaŭras? Diru ĝin denove. Publiko: [inaudible]. LUCAS: Ekzakte. Do vi povas vidi ke nur selektado stokitaj en Merge speco havi thetas. Kaj tio estas ĉar vi havas nur theta se ambaŭ Granda O kaj Omega estas la sama. OK. Kaj fine, kunfandi varo en log n. Kaj tiam, kiel Dan diris, Kunfandi speco estas speco de kiel la sama formo kiu vi faras binaran serĉon. Do vi akiras la listo. Kaj vi tuj tranĉis en duono. Kaj tiam vi tranĉis ilin en malgrandaj duonoj. Kaj tiam vi kunigi ilin. Vi uloj memori ke, dekstra? OK, kiel Li diris. OK, punteros. Do kio estas puntero? Publiko: [inaudible]. LUCAS: An adreso. OK. Mi scias, ke David montras faskon de videos de Binky kaj aĵoj montrante reciproke. Sed mi ŝatas pensi de punteros kiel simple adreso. Do estas variablo kiu tuj stoki adreson. Do estas nur tiu speciala variablo ke estas kvar bajtoj longa. Memoru, ke puntero al nenio estas ĉiam kvar bajtoj longa por nia 32-bitoj Maŝino tiel la kazo la aparato. Kaj ĝi simple havas la situo de variablo ene de ĝi. OK, do tie estas tiu memoro, esence. Do ĉiu bloko de memoro efektive havas stampo, kiu estas la adreso de la slotty memoro. Do tio signifas ke mi povas havi puntero indikus iu el tiuj adresoj. Do la kialo kial ni uzas punteros estas se mi devas memori la situo ke specifa variablo estas memoro. Kaj vi uloj memoras ke unu el tiuj kazoj estis se mi havas funkcion se mi vere volas ke vi swap por reelaj nombroj, mi reale devas sendi puntero. Ne la variablo. Ĉu vi uloj memori tion? La diferenco between-- kio estas la nomo? Nomante de valoro kaj vokas per aludo, dekstra? OK, yeah. Do nomi por valoro. Kiam vi simple sendu variablo al funkcii vi simple sendante valoro. Do vi vere sendos kopion de la variablo. Kaj via programo ne povis zorgi malpli alproksimigas de se la sama variablo reale faras kopion. Kaj nomante por referenco signifas ke Mi vere sendas kopion de la Pointer al tiu variablo. Do signifas ke mi sendos la situo de tiu variablo. Do sensas mi havas la situo de la variablo, kiam mi vokas la funkcion kun montriloj, mi povis reale ŝanĝi la datumoj kiuj estis ĉefa. Sencon? Kvankam, la puntero estas kopio, la montrilo ankoraŭ havas la realan adreson de la variablo kiu mi deziras ŝanĝi. Sencon? Do krei punteros. Memoru, la puntero ĉiam la tipo ke ĝi estas indikante al kaj tiam stelon. Kaj tiam vi metas la nomon. Do memoru, ke kiam ajn vi ajn stelon, estas kiel puntero al ke cxio variablo tajpi, ke vi havis. Do jen en stelo, ekzemple, estas puntero kaj entjero. Kaj tiam char stelo estas puntero char stelo ks. Yeah? Publiko: Kio se ni havas puntero al n star x. Mi scias, kiu kreas puntero al x. Ĉu ĝi ankaŭ deklaras x entjero? LUCAS: OK, do kiam vi diras n stelo x, vi ne kreante puntero al variablon x. Vi kreante puntero nomis x. Publiko: [inaudible]. LUCAS: Do kiam mi diras n stelo x, mi dirante, hey, en memoro, mi tuj akiri unu el ĉi tiuj tri skatoloj. Kaj mi tuj diros, ke tiu tuj estos x, kiu estas tuj estos montrilo. Kaj ion interesan pri punteros estas ke ni diras ke ili havas 4 bajtoj por 32-bita maŝino. Kaj la kialo estas ĉar 4 bajtoj estas 32-bitoj. Kaj maŝinoj kiuj estas 64 bitoj efektive havas punteros adresoj ke estas 64 bitojn longa. Do ĝi nur signifas ke la grandeco de la adresoj en la maŝino estas malsama. Do referenco kaj Dereferencing. Ekzistas du operatorojn vi uloj devus memori. La unua estas signo. La dua estas stelo. Ne konfuzita de tiu stelo kaj ĉi STAR ĉar memoru ke, en tiu kazo, vi devas n stelon. Estas kvazaŭ tutan aferon kune. Mankas n spaco stelo. Do tio signifas ke ĝi estas la tipo. Memoru, ke kiam vi havas la ŝanĝiĝema stelo, vi estas parolante pri la tipo. Kiam vi havas nur stelo kaj tiam la nomo de la variablo, ĝi signifas ke vi dereferencing la montrilo, kio signifas ke vi rigardas la pointer, trovanta la adreso estas indikante, irante al tiu adreso, kaj rigardante ĉiam vi havas tie. Do mi diru miaj studentoj, ke kiam vi havas stelo, vi devus pensi ke ĝi estas la mallongigo de enhavo de. Do se vi havas puntero kaj vi fari stelo montrilo, estas la enhavo de la montrilo. Do vi iras ajn ĝi estas indikante kaj rigardu la konstanta enhavo. Kaj-signo estas la sama aĵo kiel adreso de. Do se mi havas ŝanĝiĝeman a-- kiel, ni diri ke mi faris int a egalas 3-- se mi volas trovi la adreson de tiu variablo memoro, mi povas simple fari signon al. Do estas adreso de. Sencon? Do jen ekzemplo. Ĉi mankas int b kaj int c. Do int a egalas 3 signifas ke Mi tuj iros al la memoro. Kaj mi tuj trovos fendo kaj metis la numero 3 tie. Kaj tiam int b egalas 4. Mi tuj faros la samon. Iru al la memoro kaj metis nombro 4 en unu el la skatoloj. Kaj int egalas 5. Trovu alian skatolon kaj metis numeron 5. Do kio estas tiu linio faranta ekstere? n stelo pa egalas signon al. Do unue: n stelo pa. Kio ĝi faras? Publiko: [inaudible]. LUCAS: Yeah, do n stelo pa, unue, deklaras puntero nomis pa. Kaj tiam ĝi estas atribuante la valoro de ke puntero al la adreso de. Do-simbolo al. Tiam, se mi faras stelo pb, kio estas stelo pb? Ho, pardonu. Ĉi tio ankaŭ mankas. n stelo pb. Mi volas diri stelo pc. Mi tiom pardonpetas. Ĝi estas la sama aĵo. Sed nun mi estas bona ar kreante montrilo al b kaj tiam puntero al c. Yeah? Publiko: [inaudible]? LUCAS: Jes. Do se vi iras al la memoro kaj vi iros al la skatolo kiu estas designador por pa, vi fakte tuj vidu adreson de. OK? Yeah? Publiko: [inaudible]? LUCAS: Yeah, puntero estas adreso. Neniam forgesu tion. Estas kiel la plej grava parton pri punteros. Ekzistas stokante kaj adreso iu variablo. Io alia? Ajna alia demandoj? OK. Do Pointers kaj arrays. Memoru ke kiam mi faras int tabelo 3, esence, kion mi faras estas mi, afabla de, deklarante en puntero. Do tabelo estas speco de kiel puntero al specifa loko en memoro en kiu mi asignitaj tri fendojn por entjeroj. Ĉu tio havas sencon? Do kiam mi faros int tabelo 3, kia mi estas faras, esence, estas kreante tri slots en memoro. Do mi simple trovos tri fendojn en memoro. Do se mi faras, tiam, stelo tabelo, ĝi esence signifas la enhavon de tabelo, kio signifas ke mi viŝos la montrilo, mi iras al tiu loko, ke ĝi estas indikante, Kaj mi metis la nombro unu. Kaj tiam, se mi faras stelo tabelo plus 1, tio estas la sama afero kiel fari tabelo krampoj unu, kiu signifas nur mi iru la loko kiun ĝi estas fingromontrante. Kaj tiam la plus 1 fabrikas mi ŝanĝos pozicion. Do mi iros al tiu pozicio, efektive, kaj metis la numeron du. Kaj poste, fine, kiam mi faras tabelo plus 2, mi iras al kie tabelo la montradon ĉe. Kaj tiam mi movi al memoro blokoj. Kaj tiam mi metis la numero tri ĉi tie. Yeah? Publiko: Do ​​stelo tabelo estas simple dirante la unua punkto. Kaj vi povas aldoni 1, nur ĉar ni estas nur vere referenco kiu unua adreso. LUCAS: Yeah. Kial ni, ekzemple, diri tabelo 0, tabelo 1, kaj batalarangxis 2? Mi diris: Kial vi faras 0, 1, 2, 3 anstataŭ 1, 2, 3? Unu el la kialoj estas: unu, komputilo programistoj preferas komenci rakonti de 0. Du estas ĉar kiam vi fari tabelo 0, ĝi estas la sama afero kiel fari tabelo plus 0, kiu signifas mi iru tiu pozicio, kaj mi ne skip ajna memoro blokoj. Do mi ne movi ajnan memoron blokoj. Yeah? Publiko: [inaudible]? LUCAS: Do ŝi demandis, kio estas la diferenco inter fari tiu aŭ fari malloc. Unu el la diferencoj estas ke int tabelo 3 estas kreante tabelo sur la stako. Kaj kiam mi faras malloc, ĝi kreas sur la monteto. Ĉu tio havas sencon? Do kiel malloc reale funkcias? Do kial ni ankoraŭ bezonas uzi malloc? Via tradukilo speco de figuroj el ĉiuj la variabloj kiujn vi deklaris. Li kreas spacon por ĉiuj de ili en la stako. Do ĉiuj viaj variabloj tuj esti ie en la stako. Do jen la medio variabloj. Do esence, spaco por tiuj variabloj en memoro estas asignitaj je kompili tempo. Do tio signifas ke via komputilo havas scii ĉiujn tiujn variablojn antemano. Ĝi ne bezonas scii kion valoro vi tuj metis en ili. Sed bezonas scii multan memoron vi bezonos. Sed nun diru ke, ekzemple, vi kreas tabelon aŭ preni kordo ke vi prenas de la uzanto. Vi ne scias kiom longe la kordo tuj estos, ekzemple. Do vi ne scias precize kiom da memoro blokoj vi malŝparas, dekstra? Do ne vere havas sencon por vi diri metis 100 karakteroj. Kaj tiam kion se la uzanto skribas 150? Vi tuj estos ŝraŭbita. Do esence vi ne povas esti certa pri kiom multan memoron vi bezonas atribui kiam vi kompili la programon. Vi nur scias ke en tempo de ekzekuto. Tial do vi havas la amason. Do la amaso tuj havos memoro ke vi atribuante dum la daŭro de la programo kuras. Do esence, kiam vi faras malloc, kio vi faras estas atribuo memoro ĉe ekzekuto, kio signifas, ke vi estas decidi ĝuste en tiu momento, ke vi devus havi tiun memoron. Do tio estas kiam vi atribuante ĝin. Ĉu tio havas sencon? Do memoru, la stako havas variabloj kiuj estas kreitaj sur kompila tempo. Kaj tiam la amaso havas variabloj kiuj estas kreitaj kiel vi iri kun malloc, ekzemple. Publiko: [inaudible]? LUCAS: Do GetString estas irante voki malloc. Lasu min paroli malloc kaj Mi klarigos GetString. Do malloc estas la sama aĵo kiel memoro atribuo. Do tuj rezervu memoro sur la monteto. Kaj tuj revenos puntero al kie tiu memoro estis asignitaj ĉe. Do kiam vi do-- tie example-- n stelo montrilo. Kaj tiam puntero egalas malloc grandeco de colo fojojn 10. Mi kreante montrilo. Kaj tiam mi atribuante ke puntero al la valoro de la montrilo ke malloc donas min. Do mi demandas malloc povas destini spaco por 10 entjeroj. Tion ĝi estas jene. Kaj malloc donas min al Pointer al tiu loko. Sencon? OK. Mi Kaj GetString estas, esence, farante nomas malloc tiel vi povas destini memoro dum ekzekuto. Ĉiam memoru kontroli por null ĉar malloc tuj revenos nula se ĝi ne povas atribui memoron. Diru ke vi petu ridindan kvanton da memoro. Via komputilo ne tuj estos povis atribui ke multe. Do malloc estas ĝuste tuj reveni nula. Do ĉiam memoros por kontroli se la puntero ke vi ricevis de malloc estas nulan aŭ ne ĉar, se ĝi estas, eble vi esti dereferencing puntero kaj kaŭzante flanko faŭltoj. Kaj fine, ne forgesu via libera memoro. Malloc kreas memoro en la havaĵo. Kaj vi devas liberigi la memoron antaŭ la programo finiĝas. OK, nenio por mi. Pardonu, Rob. Dankon. [Aplaŭdo] LUCAS: Ajna lastaj demandoj antaŭ Rob venas? Neniu? Yeah? Publiko: Mi ne vidis ĉi tiu linio. Ĉu vi alŝutis ĝi ankoraŭ? LUCAS: Mi pensas Dave estas alŝuti ĝin frue. DAVE: Ĝi estos eldonita. LUCAS: Estos enreta. Publikon: ĝi dependas. LUCAS: Ĝi dependas? OK. Yeah? Publiko: [inaudible]? LUCAS: Jes, vi devus liberigi ĉiujn memoro kiu estas metita en la havaĵo. Publiko: [inaudible]? LUCAS: Jes. Ajna tempo vi havas kulturon malloc, Vi devus havi kulturon liberaj kiam vi ĉesas uzi tiu variablo. Do malloc kaj libera estas ĉiam kune. Iliaj plej bonaj amikoj. Yeah. Rob? ROB: Mi iros rapide. Kaj ankaŭ la video estos metita supren. Mi havas la mic sur. OK, do semajnon kvin stuff. Unua afero ni havas estas la stako. Do memoru, ke ekzistas nur unu pilo kadron por aktiva funkcio alvokon. Ni vidos ke en dua. Kaj ankaŭ memoras kio efektive iras en ĉiu stako kadro tuj estos la lokaj variabloj de niaj funkcioj, la argumentoj kiuj pasis en nian funkcioj, kune kun paro aliaj aĵoj vi faras ne vere bezonas zorgi pri. Do jen ekzemplo programo kie, avizo, ĉefaj estas printfing la reveno valoro de foo 4. foo estas ĝuste tuj revenos la valoro de trinkejo 4 komo 6. Kaj trinkejo tuj metis iujn lokajn variablon n egalas al 4 fojoj 6. Kaj tiam reveni n. Do ni rigardu la stako dum la reala ripeto de tiu programo. Do tie estas la fundo de nia stako. Memoru ke la pilo kreskas. Do, je la fundo de nia stako, ni havi pilo kadro por ĉefa. Kiam la programo komenciĝas, ĉefa ĉiam tuj estos ĉe la fundo de nia stako. Kaj kio estas ene de nia pilo kadro por ĉefaj? Do kvankam ekzistas neniu loka variablojn ĉefaj, kiel mi diris antaŭe, ni argc kaj rgv prenante supren spaco ene de ĉefa pilo kadro. Do ĉefaj nun tuj alvoki funkcio foo. Kaj tio signifas foo tuj akiri propran pilo kadro. Do nun ni estas interne La funkcio foo. Kaj kio bezonas iri foo la pilo kadro? Nu, foo havas argumenton n. Kaj n estas egala al 4 ĉar tio estas kion ĉefa preterpasas kiel foo argumento. Do nun foo tuj voki stangon. Kio estas trinkejo tuj havas interne el lia 'stack kadro? Ĝi havas x egalas al 4 y egalas ses. Tio ne estas ĉio, kion ni tuj havos en la pilo kadro ĉar trinkejo ankaŭ havas lokan variablon n. Kaj n ni tuj starigu egalas 24. Do nun trinkejo tuj revenos n. Do stango reveni 24 al la pilo kadro foo. Kaj ĉar trinkejo nun reveninte, ke signifas ni krevi la pilo kadro por trinkejo off de la stako. Do ĉiuj memoro kiun trinkejo estis uzante nun ekiras al la stako. Nun, foo ankaŭ iri reveni 24 ĉefaj. Do nun tiu foo revenas, la memoro ke foo uzis en ĝia ' pilo kadro ankaŭ malaperis. Kaj nun, ĉefaj tuj voki printf. Do printf estas nur alia funkcio. Kiam ni nomas printf, ĝi tuj estos alia pilo kadro por printf funkcio alvokon. Kion ni pasante printf? Tion tuj iros sur lia pilo kadro. Almenaŭ, ni pasante ke procento i backslash n kaj la argumento 24. Ĝi povus havi pli estas pilo kadro se printf okazas esti uzante kelkaj lokaj variabloj. Ni ne scias. Sed cxiuj, kiuj iras en printf La pilo kadro. Ĝi tuj ekzekuti la printf. Tiam printf finos. Ĝi revenos. Fine, ĉefaj estas farita. Ĉefa revenos. Kaj tiam nia programo estas farita. Yeah? Publiko: Cxu vi vidas [inaudible] argumentoj [inaudible] parametrojn? ROB: Do ekzistas subtila diferenco inter argumentoj kaj parametroj. Kaj vere, en komuna ekparolos, homoj emas justaj miksi ilin la tutan tempon. Sed parametroj estas la formala nomo de la aĵoj. Do argc kaj argv estas parametrojn al ĉefa. Argumentoj estas kion vi reale Iam en kiel tiuj parametroj. Do, kiam mi vokas foo de 4, 4 estas la argumento mi pasante. Kaj la parametro n, interne de foo, prenas la valoron 4 ekde 4 estis la argumento. Publiko: [inaudible]? ROB: n estas loka variablo al drinkejo. n estas ankoraŭ lokaj al foo, sed estas parametro al Foo. Ne loka variablo. Yeah? Publiko: [inaudible]? ROB: foo estas simple nomante trinkejo kaj reveni ajn trinkejo revenas. Publiko: [inaudible]? ROB: Yeah, simple vidi multnombrajn pilo kadroj. Yeah? Publiko: Kial foo nomata antaŭ printf? ROB: Kial foo nomis antaux printf? Do mi povus havi, anstataŭ, farita io kiel int x egalas foo de 4 kaj tiam presitaj x. Sed anstataŭe mi kombinis la funkcio vokas en la printf argumento. Sed rimarki ke ni ne povas reale ekzekuti la alvokon al printf ĝis ni elkompreni foo de 4 estas. Do ni iras por taksi tion. Kaj nur fojo ke estas farita iras reveni kaj taksi ĉi. Yeah? Publiko: Ekde ambaŭ trinkejo [inaudible] valoro, kial ni ne havas [inaudible]? ROB: Ili tute devus esti int. Tio ne estis kaptita super multnombraj pasas. Do ĝi devus esti int trinkejo kaj int foo ĉar ambaŭ de tiuj estas reveni entjeroj. Void estas nur se ili ne tuj reveni realaj valoroj. Yeah? Publiko: Se vi havis linion supre la reveno, [inaudible]? ROB: Linio super la reveno? Publiko: Yeah. Kiel se vi faris printf kaj [inaudible], ĉu presi dufoje? ROB: Do ene de foo? Se ni havis printf ĝuste ĉi tie? Publiko: Yeah. ROB: Do se ni havis printf dekstra tie, estus presi unufoje. Ekde ni nomas foo unufoje dekstren tie, tiam ni batis la printf. Poste ni vokos stangon. Kaj tiam foo revenos. Kaj tio estas ĝi. Ni nur iam renkontas la printf unufoje. Yeah? Publiko: [inaudible] printf nomante foo ĉar ni unue nomante printf kaj tiam ni pasante la argumentoj. ROB: Do teorie, estas ne printf nomante foo? Do ne. Nur la ordo kiu c tuj ekzekuti tiujn aferojn estas, antaŭ ol ni povas nomas funkcio, ĉiu el la argumentoj la funkcio devas esti tute taksita. Do estas tiu tute taksis? Jes, ĝi estas nur kordo. Estas nur valoro. Tiam ni havas tute taksi ĉi. Iam ĉi tiu estas farita, nun ĉiuj liaj argumentoj estas taksitaj. Kaj nun ni povas fari la vokas al printf. Yeah? Publiko: Unu demando. Se vi havas nula funkcio devas vi havas revenon punktokomo? ROB: Vi ne revenon punktokomo se vi havas nula funkcio. OK. Do nun iu amason stuff. Do amaso estas kiel ni tuj trakti kun dinamika memoro mastrumado. Kaj tio rekte kontrastas kun la pilo kiu nomus aŭtomata memoro mastrumado. Tial en la stako, vi neniam vere havis trakti kiel la lokaj variabloj estas puŝata kaj pusxis la tutan tiuj pilo kadroj kaj ĉiuj kiuj stuff. Vi ne bezonas zorgi pri tio. Ĝi estas aŭtomata. Do la monteto estu manlibro. Kaj la [inaudible] devenas tiuj funkcioj malloc kaj libera. Do jen alia programo. Ĉiuj ni faras estas mallocing entjero. Ni stokante ĝin en stelo x. Kompreneble, ni devas kontroli vidi se x estas nula. Tiam ni tuj ĝuste starigis kio x estas montranta al 50. Presi kio x indikante, print x, kaj tiam libera x. Do kial tio efektive tuj serĉos se ni rigardas nian pilo kaj amason? Do ni komencu denove. La fundo de nia stako kiel antaŭe. Memoru ke vi amasigu rekte kontraŭas la pilo? Do ni tuj havos la supron de nia amaso tie supre. Do la fundo de nia stako, ni havas nia stako kadron por ĉefa. Ĝi havas la spacon por argc, argv, kaj ni nun havas lokan variablon x, kiu estas int stelo. Do ni iras persisti tra ĉi tiu programo. Unua afero ni estas alvoko al malloc. Do ni faras alvokon al malloc. Malloc estas funkcio. Ĝi tuj akiri pilo kadro. Kion ni pasante al malloc? Tio tuj iros interne de la pilo kadro. Ni pasante grandeco de n, kiu estas 4. Tiel ke ĝi pasis al malloc. Kion malloc fari? Ĝi altiras nin iuj spaco sur la monteto. Do ni tuj iru al la havaĵo. Kaj ni iras ekpreni 4 bajtoj de la monteto. Do ni nur donos ke arbitran adreso. 0x123 Nur ŝajnigi ke estas adreso, kiu estas sur la muro. Do kio estas fakte ene de tiu regiono de memoro ĉe adreso Ox123? Garbage. Do ni ne stokas ion en ĝi. Do kiom ni scias, povus esti io. Vi ne devus supozi estas nulo. Estas plej verŝajne ne nulo. Do nun malloc revenas. Kaj kion ni faros kiam malloc revenas? Ni starigis kion revenas. Ni starigis x egala al kio estas reveni. Do kio estas tio reveni? Ĝi estas reveni 0x123 ĉar tio estas la adreso de la bloko de memoro, ke nur asignitaj en la havaĵo. Tiel revenos 0x123 x estas nun tuj enkadrigeblajn egalas 0x123 kiu, pictóricamente, ni ofte desegni kiel x havanta realan arrow indikante ke bloko. Sed x estas simple stoki tiu adreso. Do nun ni devas kontroli ĉu x estas nula. Ne nula. Ni asertas, ke tiu malloc sukcesis. Do nun stelo x egalas 50. Do stelo memoras signifas iri al tiu adreso. Do 0x123 Ni tuj iri al tiu adreso. Do kiu alportas nin tie. Kion ni faras en tiu adreso? Ni stokante 50. Do post tiu linio, kiu estas kio aferoj tuj aspekti. Do nun ne plu rubo tie. Nun ni scias, ke 50 estas en tiu aparta adreso ĉar Ni starigu ĝin al tio. OK? Do nun ni tuj presi f. Do unue ni tuj presi stelo x. Do kio estas stelo x? Denove, stelo x signifas iri al la afero ke x estas montranta. Tiel x estas stokante 0x123 Iru al tiu. Ni ricevas 50. Do presi f tio. Kaj tio signifas ke tuj presi 50. Kaj tiam kiu revenas. Kaj tiam ni havas la duan printf. Ni nun procento p. Se vi ne vidis lin, ke estas ĝuste kiel vi presi montrilo. Do ni havas procento i, procento f, kaj ĉiuj el tiuj jam. Do procento p, presi montrilo. Tiel x estas montrilo. Do se ni tuj presi x mem, ni presi kio estas fakte ene x, kiu estas 0x123 Do la unua print f tuj presi 50. La dua print f tuj presi 0x123 Yeah? Publiko: Ĉu vi uzas procento x al presi puntero? ROB: Do vi uzas procento x al presi puntero? Do vi povas sed procento x estas justa, Ĝenerale, por kiel se vi havas iuj entjera kaj kiun vi volas presi kiel deksesuma. Tio estas ĝuste kio vi faras tion. Dum, procento d farus presi kiel dekuma. Tio estis ni ricevas procento d. i estas nur entjero. procento p estas specife por punteros. Tiel x estas montrilo. Ni volas uzi procento p. Sed procento x povus funkcii. Yeah? Publiko: [inaudible]? ROB: Yeah. Almenaŭ por tiu call-- do mi ne inkluzivas ĝin en ĉi tie. Sed tiuj du argumentoj estas nepre ene de tiu stako framo kune kun ajna loka variabloj printf pasas al uzi. Kaj tiam la venonta alvoko al printf nun ene de printf pilo kadro estas procento p backslash n kaj kion ajn la valoro de x estas, kio estas 0x123. Yeah? Publiko: [inaudible]? ROB: ĝi devos printi ion kiuj aspektas kiel tiu. Publiko: [inaudible]. ROB: Do ĝi presas ĝin adreso formo. Ĝi aspektas kiel adreson. Yeah? Publiko: [inaudible]? ROB: Kial estas kio? Publiko: [inaudible]? ROB: Kial estas ĉi puntero 4 bajtoj? Do estas tuta fasko de 0 estas antaŭ tiu. Do estas vere 0x0000000123. Sur 64-bita sistemo, ne estus tutan aron da pli nuloj. Yeah? Publiko: [inaudible]. ROB: Do la unuaj printf tuj print-- Publiko: [inaudible]. ROB: Jes, ĝi tuj presi kio x notas al. Stelo diras kion estas ĉi afero indikante. Grab ĝin. Do kio estas tio montrante? 50. Grab ĝin. Tio estas kion ni tuj presi. Dum la venonta unu, ni nur presi x mem. Kio estas ene de f? 0x123. OK. Kaj poste, fine, ni havas la liberaj. Kion ni pasante por liberigi? Ni pasas x. Mi tiam efektive montriĝas en la pilo kadro. Do ni pasante la valoron 0x123 liberigi. Do nun libera scias tute certe, Mi devas iri al la ruino kaj liberaj ke memoro. Ĝi ne uzas kia estas je adreso 0x123. Do libera tuj liberigi ke de la monteto. Nun niaj monteto estu malplena denove. Ni ne havas memoron filtraciones. Nun libera revenos. Rimarku ke x estas ankoraŭ 0x123. Sed tio estas nun ne validas memoro. Ni devus ne plu dereference x. Yeah? Publiko: Ĉu reveni 0 redunda? ROB: Ĉu returen 0 redunda? Jes. Ni nur enkalkulu tie ĉar ni havos reveno por aero. Tiel estas kiel, yeah, lasas inkluzivas la reveno 0. Yeah? Publiko: [inaudible]? ROB: Do post libera x, kio okazas se Ni provu dereference la montrilo? Eblas, ke nenio eliras malbone. Eblas, ke ni ankoraŭ ricevas 50. Ĝi estas ebla ankaŭ, ke tiu memoro estas nun uzata por io alia. Do estas nedefinita konduton. Kaj nedifinita signifas ion povas okazi. Yeah? Publiko: [inaudible]? ROB: Ne, do se vi asigni x al io alia. Do se ĉi tie ni diris x egalas malloc io else-- malloc grandeco event-- tiam tiu originala bloko de memoro ne liberigita. Kaj ni oficiale perdis ĝin. Tio estas memoro liko. Ni perdis ĉiujn referencoj por ke bloko de memoro. Do estas neniu vojo ni povos iam liberigi ĝin. OK, do tiam reveni 0 rimedoj faris. Bone, do stako. Kio estas la ideo tie? Do memoru, havaĵo estas subiron. Stack plialtiĝas. Do tio estis la ekzemplo el prelego, Mi kredas, kie ĉefan estas ĝuste tuj nomas tiun funkcion foo, kiu tuj nomi sin rekursie superfluaj super denove. Do pilo kadroj tuj funkcios ekzakte la sama. Do ni tuj komencos kun ĉefaj kiel la malsupro pilo kadro. Tiam ĉefa tuj voki foo, kiu tuj alvenos pilo kadro. Tiam foo tuj voki foo denove, kiu tuj akiri alia pilo kadro. Kaj cetere, kaj denove, kaj denove, kaj denove ĝis, fine, ni kuras en la muro. Do jen kiel ni preni oni stako. Kaj je tiu punkto, vi seg kulpo. Aŭ vi povus vere seg kulpo antaŭe tiu punkto sed jes. Publiko: Ĉu kerno renversi la sama kiel seg kulpo? ROB: Do vi vidos segmentación kulpo kerno renversita. Vi akiras kernan nekropsia kiam vi seg kulpo. Kaj ĝi kiel vertedero de ĉiuj enhavo de via nuna memoro tiom ke vi povas provi identigi kial vi SEG faulted. Yeah? Publiko: [inaudible]? ROB: Do segmentación kulpo rimedoj tie estas stako. Do ne nepre. A segmentación kulpo signifas ke vi estas tuŝi memoro en maniero Vi ne devus esti. Do unu maniero de ke okazas estas, kiam vi stako, ni komencas tuŝi memoro en maniero, ke ni ne devas esti. Yeah? Publiko: [inaudible]? ROB: Do ene de senfina ciklo. Kiel, tio estas kiel rekursia malfinio loop kaj tiel ni povos havi alian pilo kadro ĉiu tempo. Sed ĝuste interne de regula malfinia dum one-- bone, ni ne eĉ printi f-- fari ion. Kion ajn. Ni ne tuj estos atingi alia pilo kadro. Ni nur tuj subteni looping sur tiu sola instrukcio. La stako ne kreskas. Ĝi estas la fakto ke ĉiu rekursie alvoko, donas al ni pilo kadro. Tial ni preni stako. Yeah? Publiko: Do ​​se vi diris al akiri la dum buklo kaj tiam [inaudible]? ROB: Do se ene de la dum buklo estis printf, vi ankoraŭ farus ne seg kulpo. Mi simple ne volis konfuzi aferoj. Estus buklo. Vi ŝatus akiri sola pilo enmarcar la printf. Tiam printf revenus. Tiam vi estos plej buklo denove. Vi ŝatus akiri sola pilo enmarcar la printf. Ĝi revenus. Sola pilo kadro. Do vi ne akiranta ĉi malfinio apilando pilo kadroj. Publiko: [inaudible]? ROB: Jes. Do tiu stako okazas ĉar neniu el tiuj alvokoj al foo revenas. Do se ni revenus, tiam ni havus komencos perdi pilo kadroj. Kaj tiam ni ne stako. Kaj tio estas kial vi bezonas bazon kazo por via persona funkcioj. Yeah? Publiko: Ĉu la potencialo grandeco kaj la pilo por la amaso la sama por ĉiuj programoj? ROB: Malglate. Estas la potencialo grandeco de la stako kaj la amaso la sama por ĉiuj programoj? Malglate. Ekzistas iuj aleatorización al kie la stako komenciĝas kaj kie la havaĵon startas. Se vi hazarde havas amason de tutmondaj variabloj kaj aĵoj, vi povus forpreni de iu spaco por via muro. Sur 64-bita sistemo, vi virtuale havi senfinan memoron. Estas ĝuste tiel. Inter 32 bitoj kaj 64 bitoj, kiu estas signifa diferenco. Vi tuj ricevos amason pli pilo kaj amason spaco sur 64 bitoj sistemo ĉar estas simple pli turnas ke ili povas uzi. Sed sur individua sistemo, ĝi volas esti malglate la sama kvanto de pilo kaj amason spaco. Bone. Do lasta aĵo estas kompilita. Do vi devas scii ĉi procezo. Ekzistas kvar grandaj paŝoj. Do la unua devus facile memoras. Pre-prilaborado. Ĝi havas la prefikson pre en ĝi. Do temas antaŭ ĉio alia. La afero memori estas la hash. Do hash difinas kaj hash inkludas en ĉiuj el tiuj. Tiuj estas ĉiuj pre-procesoro directivas. Jen estas la aferoj, ke la pre-procesoro prizorgas. Do kion signifas la antaŭ-procesoro fari? Ĝi estas vere stulta afero. Ĉio estas kapabla de ĉiuj el tiuj Kopio kaj kortego, kaj alglui operacioj. Do hash inkludas normon i0 dot h. Kio estas tiu faras? Ĝi grabbing la norma i0 dot h enarkivigi kaj alglui ĝin en la supron kien li diras hash inkludas norma i0 dot h. Kaj neniu hash difini ke ni vidis, kion tiu faras? Lia kopiado la valoro kiun la hash difinita estas difinita kiel kaj interglui ke kien vi estas uzanta la valoro. Do la antaŭtraktilo nur faras vere Simpla teksto bazita operacioj. Ĝi faras nenion inteligenta. Do ĉio alia estas pli komplika. Do nun ke antaŭtraktilo estas farita, ni fakte kompili. Do kion signifas kompilante signifas? Ni nun iras de c kodo al asembleo kodo. Yeah? Publiko: [inaudible]? ROB: Yeah, ni kaptis tion. Do kompiladon. Ni iras el c al asembleo. Do tiu estas reala lingvo ŝanĝon. Kompilante signifas irante de altan nivelon lingvo suba nivelo lingvon. Kaj c estas altnivela lingvo kompare al asembleo. Kio estas asembleo? Lia instrukcioj kiuj estas, bela da, farita por via CPU. Sed via komputilo ankoraŭ faras kompreni asembleo. Nur komprenas kaj nuloj. Do la sekva paŝo estas kunmetado, kiuj nin el tiuj komandoj via CPU komprenas kaj reale tradukas ilin al la kaj nuloj. Do C al asembleo por duuma. Sed mi ne havas plenumeblan ankoraŭ. Do pensu pri la cs50 biblioteko. Ni provizis vin per duuma por ĉi cs50 biblioteko, kiu havas GetString kaj GetInt kaj ĉiu tio. Sed la cs50 library-- en kaj de itself-- ne plenumebla. Ĝi ne havas ĉefan funkcion. Estas nur faskon de duumaj kiun vi povas uzi. Do sinsekvon Tiel ni kunvenos ĉiuj de tiuj malsamaj duumaj dosierojn en reala plenumebla. Kiu eblas tajpi dot slash punkto ekstere. Do ĉi tio estas kiel la dosiero kiun vi skribis, - kio ajn vian programon is-- Ceaser dot c. Sed nun ĝi estas kompilis malsupren al duuma. Do Ceaser dot o. Kaj tiu estas nia cs50 bibliotekoj duuma. Kaj ili estas kombinante en sola plenumebla. Yeah? Publiko: [inaudible]? ROB: Do unue inkluzivi, memoru, la hash inkluzivi estas reale pre-procesoro paŝo. Sed tio apartan. Se vi ne uzas ajnan funkcioj kiuj estas ekster via sola dosiero tiam, Ne, vi ne bezonas ligi ion ĉar vi ĉion. Dirita, printf estas ligita en. Se vi iam uzi printf, ke io kiu bezonu esti ligita en ĉar vi ne skribis tion. Kaj, fakte, printf estas aŭtomate ligita en. Vi scias, kiel ĉe la komandlinio aŭ kiam Vi tajpas fari, vi vidos havas haltostreko l cs50, kio havas ligon en la cs50 biblioteko? Printf, kaj da tio, tuj esti ligita en aŭtomate. Ajna alia demandoj pri io? Publiko: [inaudible]? ROB: Ligi? Ni havas tutan faskon da malsamaj duumaj dosieroj. Tiu estas la kanona ekzemplo ke ni uzas estas cs50 biblioteko. Ni kompilis kaj donis al vi la duuma por ĉi cs50 biblioteko. Vi volas uzi GetString en via programo. Do vi iru kaj uzi GetString. Sed sen mia duuma kodo GetString, kiam vi kompili via kodo malsupren, vi ne povas reale kuri via programo ĉar GetString String estas ankoraŭ ne tute difinitaj. Ĝi estas nur kiam vi ligas en mia duuma kiu enhavas GetString ke nun, ĉiuj Bone, mi povas reale ekzekuti GetString. Mia dosiero estas kompleta. Kaj mi povas kuri ĉi. Yeah? Publiko: Ĉu sinsekvon konverti la binara al plenumebla? Do eĉ se vi ne havas aliajn bibliotekoj, ĉu ne ankoraŭ necese traduki la [inaudible]? ROB: Do plenumebla Ankoraŭ en duuma. Ĝi simple kombinante tutaj fasko de binaraj. Publiko: Dankon tiom. ROB: Neniu problemo. Ajna alia demandoj? Alie, ni ĉiuj starigis. Bone. Dankon. [Aplaŭdo] Publiko: Dankon. ROB: Yeah.