[MUZIKO ludi] DAVID J. Malan: Bone. [Ridado] Bonvenon dorso. Ĉi tiu estas CS50. Kaj jen la fino de semajno kvin. Kaj ĝis nun, ni sufiĉe multe estis prenante por koncedis ke ekzistas Ekzistas tiu tradukilo, Clang, ke vi havas estis alpreĝi pere de ĉi tiu alia ilo nomita Faru ke iel magie konvertas via fontkodo en celkodo, la nuloj kaj ke via komputiloj CPU, centra prilaborado unueco, vere komprenas. Sed rezultu ke estas nombro kiu estas okazas sub la kapuĉo en inter enigo kaj eligo. Kaj mi ŝatus proponi ke ni viandon ke el en iom pli detale en ĉi tiuj kvar paŝoj, ili havas ion nomatan antaŭ-prilaborado, iu vokis kompili, kion ni vidis, iu nomita kunmetado, kaj iu nomita kunligi. Do ĝis nun, en kelkaj el niaj programoj, ni havis akran inkludas. Pli lastatempe ni spertis akran difinas por konstantoj. Do rezultas ke tiuj aĵoj kiujn estas prefiksita per la hash simbolo aŭ la funto simbolo estas antaŭ-procesoro direktivojn. Tio estas nur imago maniero diri ĝin estas linio de kodo kiu estas vere konvertita en ion alian antaŭ la komputilo eĉ provi konverti vian programo en nuloj kaj. Ekzemple, akrajn inkludas normon I / O. H, preskaux nur signifas iri antaŭe, havigu la enhavo de la dosieroj stdio.h kaj gluu ilin ĝuste tie. Do ne nuloj kaj aĵoj en tiu punkto ankoraŭ. Estas vere nur anstataŭo. Kaj tio estas farita dum la tn antaŭ-prilaborado etapo, kiam vi fakte kuri Clang aŭ specife Faru en plej kazoj. Do ĉio tio estis okazante unua aŭtomate tiom. Tiam venas la kompilaĵon paŝo. Sed ni estis trosimpligita kompilaĵo. Kompilado de programo vere signifas prenu ĝin de iu kiel C, la fontkodon ni estis skribante, sube al iu nomita asembleo. Asembleo lingvo estas pli malalta nivelo lingvo kiu, feliĉe, ni ne volas esti multe okazon por skribi ĉi semestro. Sed ĝi estas en la plej malalta nivelo en la senco ke vi laŭvorte komenci skribi adicii kaj subtrahi kaj multigxu, kaj montru el memoro kaj savi al memoro, la tre bazaj instrukcioj ke komputilo, sub la kapuĉo, vere komprenas. Laste, ariganta prenas tiun lingvon al la nuloj kaj ke ni estis priskribante tiom. Kaj vere laste, ne estas la tn kunligi fazo, kiun ni instruos vin vidi en nur momenta, kiu kombinas via nuloj kaj kun nuloj kaj karaj aliaj personoj antaŭ ol vi kreis. Do konsideru ĉi tiu super simpla programo. Ĝi estis de Semajno 1. Ĝi nur diris, Saluton Mondo, en la ekrano. Ni kuris tiu tra Clang. Aŭ ni kuris tra Make kiu kuris Clang. Kaj outputted tiutempe kie iuj nuloj kaj. Sed rezultu ekzistas intera paŝo. Se mi transiru tie - ups, ne volas vidi lin ankoraŭ. Se mi iras tien al mia aparato kaj mi malfermas hello.c, jen estas tiu sama programo. Kaj kion mi tuj faros en mia fina stacio fenestro tie Mi tuj kuri Clang anstataŭ Faru, kion aŭtomatigas la kvar tiujn paŝojn por ni. Kaj mi faros clang-S kaj tiam hello.c kaj poste eniri. Mi ricevas palpebrumante prompto denove, kio estas bona. Kaj nun en iomete pli granda fenestro, Mi tuj malfermi gedit en ĉi tie. Kaj mi tuj malfermi dosieron kiu, Rezultas, nomiĝas hello.s ĉi enhavas tiu asembleo lingvo Mi raportis al pli frua. Kaj jen estas, kion oni nomas asembleo lingvo, sufiĉe malalta nivelo instrukcioj ke via Intel CPU aŭ kion estas kiu estas interne de komprenas. Kaj mov estas por movado. alvoko estas por nomante, tre malalta nivelo funkcio. sub estas por subtrahi. Do kiam vi havas apartan CPU ene de via komputilo, kio faras ĝin distinga, kontre aliaj CPU en la merkato, estas kion instrukcioj komprenas kaj ofte kiel efika ĝi estas, kiom rapide gi estas je ekzekuti iuj de tiuj instrukcioj. Nun por pli sur ĉi, vi povas preni sekva Aŭtuno CS61 ĉe la kolegio. Sed ĉi tie ni havas, ekzemple, malmultaj ensalutiloj kiuj povus rigardi familiara. hello.c estas la nomo de la programo. . Teksto - tie ne estas multe de intereso tie gxuste nun, memoru ke la teksto segmento, ekde lundo, estas kie en memoro via programo fakte finas. Do jen almenaŭ pigre familiara tie. Ĉi tie, kompreneble, estas mencio de nia ĉefa funkcio. Movo malsupren, tiuj referi al aĵoj nomita registroj, tre malgrandajn pecojn de memoro ene de via reala CPU. Kaj se mi rulu suben ĝis plu, mi vidas ian nerekta mencio de ASCII. Kaj tie, ja, estas ke kordoj, saluton, komo, mondo. Do longan rakonton, ĉi tio estis okazas al vi, aŭtomate, sub la kapuĉo ĉio ĉi tempo. Kaj kio estis okazante vere estas unufoje vi kuros Clang, aŭ pere de Faru, vi fariĝas unua, el la fonta kodo, la tn asembla lingvo. Tiam Clang estas konvertanta ĉi asembleo lingvo malsupren al nuloj kaj. Kaj jen estas la glito, ke ni komencis nian diskuton en Semajno 0 sur - kaj tiam Semajno 1 sur. Kaj poste fine, tiuj nuloj kaj estas kombinitaj kun la nuloj kaj de tiuj bibliotekoj ni iris prenante por donita kiel Standard I / O aŭ la String Biblioteko aŭ eĉ la CS50 biblioteko. Do por pentri tiun bildon pli vide, ni havas hello.c. Kaj, kompreneble, ĝi uzas la printf funkcii diri, saluton mondo. La kompilaĵo paŝo prenas sin al tiu dosiero ni vidis hello.s, eĉ kvankam tio estas tipe forigita aŭtomate por vi. Sed tio estas la asembleo kodo en la mezo paŝo. Kaj poste kiam ni kunvenigi la komunumon lingvo, por tiel diri, tio estas, kiam vi akiri tiujn nuloj kaj. Do ni zomita en efike hodiaŭ sur kion ni estis prenante por fakto, signifas iri fontkodo por kontesti kodo. Sed laste, nun tiu sama bildo - ni baton ĝin al la maldekstra flanko. Kaj rimarku, ke en la pinto Mi menciis stdio.h. Tio estas arkivo kiu ni inkludis en preskaŭ ĉiuj programoj ni skribis. Kaj tio estas la dosiero kies enhavon get kopio batitaj, efektive sur la pinto de via kodo. Sed rezultu ke, en komputilo Sistemo ie, tie estas supozeble stdio.c dosiero kiun iu skribis jaroj antaŭe ke implementa ĉiuj funkcioj, kiujn oni sciigis en stdio.h. Nun fakte estas probable ne sur Mac aŭ vian PC aŭ eĉ en la CS50 aparato estas kruda C kodo. Iu jam kompilita kaj inkludis . O dosiero por celkodo aŭ. A dosiero, kiu referencas al bindebla biblioteko ke tio estis antaŭ-instalita kaj antaŭ-kompilis por vi. Sed supozu ke ja ekzistas sur nia komputilo stdio.c en paralela kun Clang. Via kodo estas esti kompilita kaj kunvenis. stdio.c-ejon kodo estas kompilita kaj kunvenis, tiel ke tiu ĉi lasta treti, cxi tie, ni devas iel ligilo, por tiel diri, via nuloj kaj kun lia aŭ ŝia nuloj kaj en unu simpla programo kiu finfine estas nomata simple Saluton. Do jen ĉio de la magion kiu estas estis okazas tiom. Kaj daŭre prenos tiujn procezoj por koncedis, sed realigi ekzistas multajn sukajn detalojn okazas sube. Kaj ĉi tiu estas kion faras via komputilo kun Intel ene aparte klara. Do en tiu noto, se vi volas kuniĝi kun ni por tagmanĝi tiun vendredon, do iru al la kutima loko cs50.net/rsvp, 1:15 am ĉi vendredo. Kaj nun kelkaj anoncoj. Do ni havas kelkajn bonajn novaĵojn. Kaj ni havas iujn malbonajn novaĵojn. Komencu kun iu bona novaĵo ĉi tie. [Gxemadon] Ĉio bone. Nu, estas teknike ferio, do ĝi ne estas tiel donaco de ni. Sed tiam la malbonaj novaĵoj kompreneble. [Gxemadon] Mi pasigis multan tempon sur ĉi tiuj kuraĝigoj. [Ridado] Estos recenzo kunsido ĉi tiu venonta lundo. Ĝi tuj estos je 5:30 ptm. Ni memorigas vin pri cxiuj cxi tiuj detaloj per retpoŝto en la kurso de retejo en nur kelkaj tagoj tempo. Ĝi estos filmado kaj disponigitaj nelonge post tio. Do se vi ne povas fari tiun lundo nokto fendo, ne maltrankviliĝu. Sekcioj tiu venonta semajno vin ankaŭ enfokusigi recenzo por la kvizo. Se via alineo estas lunde, kiu estas ja universitato ferioj, ni faros ankoraŭ kunvenas en sekcio. Se vi simple ne povas fari tiun sekcio ĉar vi tuj for, tio estas bone. Ĉeesti dimanĉo aŭ mardo sekcio aŭ melodio-en al Jason la sekcio, kio estas disponebla rete. Do, pli malbonaj novaĵoj. Do laŭ la Syllabus, ni havas prelego venontan vendredon. Sed la bona novaĵo - klare, mi pasis tro da tempo en ĉi tio. [Ridado] Ni nuligi sekva vendreda prelegoj. Por ke estos donaco por ni, por vi povas vere havas belan faciligxo en inter ĉi tiu semajno kaj du semajnojn ĉi tie. Do ne prelegoj proksima semajno, nur eta iom kvizo, por kiu vi devas esti ekuzi pli ekscitita. Do ni nun turnu nian atenton al iu kiu ja estas pli vida kaj pli ekscita kaj starigi la scenejo por kio okazas al esti sur la horizonto en nur kelkaj semajnoj tempo. Post la unua kvizo, ni turnas la enfokusigi de nia problemo aroj al alia domajno specifa problemo, tiu de forensics aŭ sekureco pli ĝenerale. Fakte, la tradicio kun tiu problemo aro estas por mi unu el la instruante ulo aŭ CAS marŝi trans kampuso prenante iujn fotojn de identigebla sed ne evidenta popolo, lokoj, aux tion, tiam ĉiu jaro mi iel sukcesas hazarde forviŝi aŭ korupti la diĝita amaskomunikiloj karto kiu estas interne de nia ĉambro. Sed ne estas granda interkonsento. Mi povas antaŭeniri kaj ŝtopi ke en mia komputilo. Mi povas fari jura bildon de ĝi, do paroli, kopiante la nuloj kaj ones for de tiu memoro karto, ĉu lia SD karto aŭ kompakta flash karto aŭ kion ajn vi konas. Kaj tiam ni povas transdoni ke eksteren. Kaj tial la defio antaŭen, inter aliaj tion por vi, estos al skribi C-kodo kiu rekuperas tutan faskon da JPEG-oj por mi kaj malkaŝis estos tiuj homoj, lokoj, aŭ aĵoj. Kaj ni ankaŭ parolas, en ĉi tiu problemo aro kaj en la tempo estonta, pri grafiko pli ĝenerale. Ni uzas ilin, kurso, por rompi. Sed vi jam ia memkompreneble tie ekzistas tiuj alta nivelo nocioj de rektanguloj kaj ovaloj. Sed sub la kapuĉo estas rastrumeroj. Kaj vi devis komenci pensante pri tiuj. Aŭ vi donos por p-aro 4 devos pensi pri la diferenco inter via brikoj, kiel rapide vi pilko estas movanta tra la ekrano por rompi. Do ekzistas ĉi tiu nocio de la dots sur via ekrano kiu estas veni en ludo jam. Nun kion vi vidas, tamen, estas kion vi ricevas sur ekrano de komputilo. Se vi iam spektis kelkajn bonajn aŭ malbona TV, prognozoj estas ili sufiĉe multe trakti la publikon kiel technophobes kiuj ne vere scias multe pri komputado. Kaj tial ĝi estas tre facila por la policano detektivo diri, ĉu vi purigi ke por mi? Aŭ plibonigi, ĉu ne? Enhance estas kiel la zumado vorto en plej ajna krimo rilatajn spektaklo. Kaj la realaĵo estas, se vi prenos tre neklara bildo de suspekta fari io malbona, vi ne povas nur plibonigi ĝin. Vi ne povas zomi senfine. Vi ne povas vidi en la ekbrilon de ies okulo, kiu faris tiun aparta krimo, malgraŭ la superado de tiu en televido. Kaj tial kun tiu ni motivi ke venonta problemo starigis kun ekrigardo al iuj shows kun kiu vi eble familiara. [VIDEO reprodukto] -Akcepti. Nun, ni akiras bonan rigardon al vi. -Tenu ĝin. Kuru ke dorso. -Atendu minuton. Iru dekstren. -Tie. Frostigi tio. -Plena ekrano. -Akcepti. Frostigi tio. -Tighten supren sur tiu, estos ya? -Vektoraj en sur tiu ulo per la dorso rado. -Zoom en ĝuste ĉi tie sur ĉi tiu loko. -Kun la dekstra teamo, la fotita povas esti plivastigita kaj akraj. -Kio estas tio? -Ĝi estas plibonigo programo. -Ĉu vi povas purigi ke ĝis neniu? -Mi ne scias. Ni plibonigi ĝin. -Enhance sekcio A-6. -Mi plibonigis la detalo kaj - -Mi kredas, ke estas sufiĉa por plibonigi. Liberigas ĝin al mia ekrano. -Enhance la reflekto en sia okulo. -Ni kuru ĉi tra video plibonigo. -Edgar, vi povas plibonigi tion? -Atendu. -Mi estis laborante en ĉi reflekto. -Iu rebrilon. -Pripensoj. -Estas reflekto de la homa vizaĝo. -La interkonsiliĝo. -Tie estas reflekto. -Zomi en la spegulo. -Vi povas vidi reflekto. -Ĉu vi povas plibonigi la bildon de ĉi tie? -Ĉu vi povas plibonigi li ĝuste ĉi tie? -Ĉu vi povas plibonigi ĝin? -Ĉu vi povas plibonigi ĝin? -Ĉu ni povas plibonigi tion? -Ĉu vi povas plibonigi ĝin? -Atendu duan, mi plibonigas. -Zomi al la pordo. -X10. -Zoom. [Ridado] -Movu in -Atendu, halti. -Haltu. -Paŭzo ĝi. -Ĉu turni ĉirkaŭ 75 gradoj ĉirkaŭ la vertikala bv. [Ridado] -Haltu, kaj reen al la parto pri la pordon denove. -Got bildo mejorador kiu povas bitmap? -Eble ni povas uzi la Pradeep Sen metodo por vidi en la fenestroj. -Ĉi tiu programaro estas stato de la arto. -La ikono valoro estas malŝaltita. -Kun la ĝustan kombinon de algoritmoj. -Li estas prenita lumigado algoritmoj por la sekva nivelo kaj mi povas uzi ilin por plibonigi ĉi tiun foton. -Ŝlosu en kaj grandigas la z-akso. -Enhance. -Enhance. -Enhance. -Freeze kaj plibonigi. [FINO reprodukto de vídeo] DAVID J. Malan: Do Problemo Ara 5 estas kio kuŝas antaŭen tie. Do ni baldaŭ akiri pli bonan komprenon de kiam kaj kial vi povas kaj nia ne povas plibonigi en tiu vojo. Sed unue, ni revenos nian atenton al kelkaj el la blokoj ni instruos vin bezonas por povi diri ke rakonton. Do memoru, ke ni tiris tiu bildo en Lundo kaj iom pasinta semajno. Kaj tion priskribas la aranĝo de la aferoj en via komputilo memoro kiam kurante iu programo. La teknologio segmento ĝis supro, revokon, referas al la reala nuloj kaj kiuj formas via programo. Jen, sube, ke iuj inicializado aŭ uninitialized datumoj, kiuj tipe referencas al aĵoj kiel konstantaj aŭ kordoj aŭ mallokajn variablojn, kiuj havas estis deklarita anticipe. Estas la havaĵon, sed ni venos reen al kiu en iom. Kaj tiam tie estas la pilo. Multe kiel stako de pletoj en la kafejo, tio estas kie memoro gets manteloj kaj manteloj kiam ajn vi faras kion en programo? Kio estas la pilo uzo por? Jes? Voku de funkcio. Ajn vi nomas funkcio, ĝi estas donita al strio de memoro por lia lokaj variabloj aŭ ties parametroj. Kaj pictóricamente, ni vidas ke kun ĉiu pluaj funkcio vokita, kiam A alvokoj B alvokoj C alvokoj D, ili get manteloj sur la stako. Kaj ene de ĉiu el tiuj tranĉaĵoj de memoro estas esence unika atingo por tiu funkcio, kiu, kompreneble, estas problema se oni volas transdoni de unu funkcio al alia Peco de datumoj, kiujn vi volas ĝin al mutate aŭ ŝanĝi. Do kio estis nia solvo ebliganta Funkcio reprezentitaj de unu stako kadro por ŝanĝi la memoro ene de alia stack frame? Kiel fari tiujn du Debato unu al alia? Do, per vojo de montriloj aŭ adreson, kiu, denove, ĝuste priskribi kie en memoro, pere de specifaj mordo numero, la aparta valoro povas esti trovita. Do memoru lasta fojo tro ni daŭre la historio kaj rigardas sufiĉe kalesxon programo. Kaj tiu programo estas kalesxon por kelkaj kialoj, sed la plej preocupante estas ĉar ĝi mankas al kontroli kio? Jes, ĝi mankas al kontrolu la enigo. Pardonu? Se estas pli ol 12 signoj. Do tre smartly, nominte memcopy, kiuj, kiel la nomo sugestas, nur kopioj memoro de lia dua argumento en lia unua argumento. La tria argumento, tre smartly, estas kontrolis por certigi ke vi ne kopii pli, en tiu kazo, la longo de trinkejo, nombro da karakteroj, en la celloko, kiu estas tiu tabelo C. Sed la problemo estas ke tio, kion se C si mem ne estas sufiĉe granda manipuli tio? Vi tuj kopii la nombro de bajtoj ke vi donis. Sed kion vi fakte havas pli bajtoj ol vi havas ĉambron por? Nu, tiu programo tre malsagxe nur blinde procedas por preni kion ajn ĝi estas ĵetkubo, saluton backslash 0 estas granda se kordo estas mallonga sufiĉas, kiel kvin signoj. Sed se ĝi estas fakte 12 karakteroj aŭ 1200 karakteroj, ni vidis lasta fojo ke vi simple iras al tute anstataŭigi memoro kiun ne apartenas al vi. Kaj plej malbona kazo, se vi anstataŭigi ke ruĝa porcion tie ni nomas la revenu adreso - ĉi tio estas nur kie la komputilo aŭtomate, ĉar vi, malantaŭ la scenoj, tucks for de 32-bita valoro kiu memorigas al kion adreso ĝi devus reveni kiam foo, tiu alia funkcio, estas farita ekzekuti. Ĝi estas pano panero de varoj al kiu revenas. Se vi anstatauxigas ke, potenciale, se vi estas la malbona, ĉu povis potenciale transpreni ies komputilo. Kaj Vi certe frakasi ĝin en la plimulto de kazoj. Nun ĉi tiu problemo estis nur pligravigita kiel ni komencis paroli pri memoro demarŝo pli ĝenerale. Kaj malloc, por memoro atribuo, estas funkcio kiu ni povas uzi por destini memoro, kiam ni ne scias anticipe ke ni bezonas. Do, ekzemple, se mi reirus al la aparato tie. Kaj mi malfermas el lasta fojo hello2.c, memoras tiun programon tie, kiu aspektis iom io tiamaniere, nur tri linioj - deklari vian nomon, tiam string nomo, sur la maldekstra, egalas getstring. Kaj tiam ni presas ĝin, la uzanto nomo. Do tio estis super simpla programo. Por esti klaraj, lasu min iri antaŭen kaj faru saluton-2. Mi tuj faros dot oblikvo saluton-2. Deklari vian nomon - Davido. Eniru. Saluton David. Ĝi ŝajnas funkcii bone. Sed kio vere okazas sub kapuĉo tie? Unue ni senŝeligas reen kelkaj tavoloj. String estas nur sinonimo ni realigis por kio? Char stelo. Do ni faru ĝin iom pli arkaikaj sed pli teknike korekta ke tiu Estas char stelo, kio signifas, ke nomo, jes, estas variablo. Sed kion nomon tendencas estas la adreso de oni char, kiuj sentas iom stranga ĉar mi reatingas ĉenon. Mi reatingas multnombra signoj ne estas char. Sed kompreneble, vi nur bezonas la unua char la adreso por memori, kie la tuta ĉeno estas ĉar kial? Kiel vi povas diveni, kie la fino de la kordo estas koni la komenco? La backslash nulo. Do kun tiuj du postsignoj vi povas diveni, antaŭ la komenco kaj la fino de neniu kordo estas, tiel longe kiel ili estas adekvate formita kun tiu nula Terminator, ke backslash nulo. Sed ĉi tiu vokas getstring. Kaj ĝi rezultas ke getstring tiu tuta tempo estis speco de cheating por ni. Ĝi estis farante tiu laboro, certe, prenanta kordoj de la uzanto. Sed kie estas tiu memoro venas de? Se ni reiru al la bildo tie kaj aplikas la difinon de nur antaŭ momento, ke la pilo estas kie memoro iras kiam funkcioj estas vokitaj, de tiu logiko, kiam vi nomas getstring, kaj tiam mi tajpas en D-Al-V-mi-D Enter, kie estas D-Al-V-mi-D backslash nulo stokita, bazita sur la rakonto ni diris al ni nun? Ĝi ŝajnis esti en la pilo, ĉu ne? Kiam vi nomas akiri string vi ricevas iom tranĉaĵo de memoro en la pilo. Do estas logike rezoni ke D-Al-V-mi-D backslash nulo estas stokita tie en la stako. Sed atendu momenton, getstring revenas ke kordoj, por tiel diri, kio signifas ĝi estas pleto de la kafejo estas prenita for de la pilo. Kaj ni diris lastan fojon ke tiel frue kiel funkcio revenas, kaj vi prenas tiun pleto, por tiel diri, fronte al la pilo, kion vi povas supozi pri la spuroj de tiu memoro? Mi ia redrew ilin kiel demandosignojn ĉar ili efektive fariĝis nekonataj valoroj. Ili povas reuzi kiam iuj sekva funkcio estas nomita. En aliaj vortoj, se ni okazi esti stoki - Mi desegnas rapida bildo tie de la pilo. Se ni okazi esti desegnante la fundo de mia memoro segmento, kaj ni diru ke tiu estas la loko de memoro okupita de ĉefa kaj eble arg c kaj arg v kaj io ajn alia en la programo, kiam getstring estas nomita, supozeble getstring gets eron de memoro tie. Kaj tiam D-Al-V-mi-D iel finas en ĉi tiu funkcio. Kaj mi tuj oversimplify. Sed ni supozu, ke lia D-Al-V-mi-D backslash nulo. Do tio multaj bajtoj estas uzataj en la kadron por getstring. Sed tuj kiam getstring revenas, ni diris lasta fojo ke tiu memoro super tie ĉiuj iĝas - Woops! - ĉiuj iĝas efike viŝitaj. Kaj ni povas pensi pri tio nun kiel demando markoj ĉar kiu scias kio okazos al tiu memoro. Efektive mi tre ofte nomas funkcioj alia ol getstring. Kaj tuj kiam mi vokas iu alia funkcio ol getstring, eble ne en tiu aparta programo ni nur rigardis ĉe sed iuj aliaj, verŝajne iu alia funkcio povus fini donante ĉi sekva makulo en la pilo. Do ĝi ne povas esti, ke getstring tendencas D-Al-V-mi-D sur la pilo ĉar mi volus tuj perdos aliron al ĝi. Sed ni scias ke getstring nur revenas kio? Tio ne reveni al mi ses karakterojn. Kio estas tio vere reveni tute ni konkludi lasta tempo? La adreso de la unua. Do iel, kiam vi nomis getstring, ĝi estas atribuo eron de memoro por la kordo, ke la uzantoj tipo kaj tiam reveni adreso de ĝi. Kaj ĝi rezultas ke kiam oni volas funkcii por rezervi memoron en ĉi vojo kaj reveno al la persono kiu nomis tiun funkcion, la adreso de ke eron de memoro, vi absolute ne povas meti ĝin en la stako ĉe la fundo, ĉar funkcie estas nur tuj ne farigxu via tre rapide, do vi versxajne povas diveni kie ni probable tuj ĵeti ĝin anstataŭe, la tn havaĵo. Do inter la fundo de via memoro estas aranĝo kaj la supro de via memoro estas aranĝo estas tuta aro da segmentoj. Unu estas la pilo, kaj dekstra super ĝi estas la havaĵo. Kaj amaso estas nur malsama eron de memoro kiu ne estas uzata por funkcioj kiam ili estas nomata. Ĝi estas uzata por pli longa termino memoro, kiam vi volas unu funkcio kapti iun memoro kaj povi pendigi sur gxi sen perdi kontrolon super ĝi. Nun vi povus eble tuj vidas, ke ĉi tio ne estas nepre perfektan dezajno. Kiel via programo asignitaj memoro la pilo, aŭ kiel vi nomas pli kaj pli funkcioj, aŭ kiel vi destini memoro sur la havaĵon per malloc off kiel getstring faras, kio klare Ŝajnas esti neevitebla problemo? Ĝuste. Kiel la fakto ke tiuj sagoj notas sin reciproke ne aŭguras bone. Kaj efektive, ni povus tre rapide frakasas programo en ajna kvanto de manieroj. Fakte, mi kredas ke ni povus havi faris tion akcidente unufoje. Aŭ se ne, ni faru ĝin intence nun. Lasu min kaj skribi super rapide programo nomata dontdothis.c. Kaj nun mi iros en tie kaj do akraj inkludas stdio.h. Ni deklaras funkcio foo prenas neniu argumentoj, kiuj estas skribata tiel per malplena. Kaj la sola afero foo tuj fari estas alvoko foo, kio verŝajne ne estas la plej inteligenta ideo, sed tiel estu. Ent ĉefa malplena. Nun la sola afero ĉefa tuj fari estas voki foo tiel. Kaj ĝuste por piedbatoj, mi tuj iros antaŭen tie kaj diru printf "Saluton el foo. " Akcepti. Do, se mi ne faris neniun eraron, Faru dontdothis dot oblikvo. Kaj ni faru tion en pli granda fenestro - dot oblikvo, dontdothis. Venu. Uh oh. Ŝajne, vi povas fari ĉi tion. Damn it. Akcepti. Atendu. Stand by. Ĉu ni - Ni ne uzas ĝin kun Make. [Suspiroj] Mi scias, sed mi kredas ke ni nur forigita tio. Uh, jes. Damn it. Solvi tiun Rob. Kio? Ĝi estas tre simpla. Jes, ni turnis optimumigo malproksime. OK, staru adiaŭ. Nun mi sentas min pli bone. Akcepti. Ĉio bone. Do ni recompilar tiu - Faru vi dontdothis. Vi eble devus renomi ĉi tion al dothis.c en nur momento. Tie ni iru. Dankon. Akcepti. Do la fakto, ke mi estis presi ion estis fakte nur prokrastante la procezo per kiu ni estus atinginta tiu punkto. Akcepti. Phew! Do kio estas efektive okazas? La kialo estas, ĝuste kiel la rando, estas fari ion en terminoj de enigo kaj eligo emas esti pli malrapida, ĉar vi devas skribi karakteroj al la ekrano, ĝi devas rulumi. Do longan rakonton, se mi efektive okazis tiel terure, ni havus vidis tiun fina rezulto tiel. Nun ke mi ricevis promenado de la pres-ups, ni vidos tuj. Do kial estas tio okazas. Nu, la simpla klarigo, kompreneble, estas ke foo probable ne devus esti nomante sin. Nun en ĝeneralaj terminoj, ĉi tiu estas rekursio. Kaj ni pensis paron semajnoj antaŭe rekursie estas bona. Rekursio estas tiu magia vojo de esprimi vin mem super koncize. Kaj ĝuste funkcias. Sed estas ŝlosila trajto de ĉiuj la rekursiaj programoj ni parolis pri kaj rigardis tiel malproksime, kiuj estis, ke ili havis kio? Bazo kazo, kiu estis iom malfacile kodita kazo kiu diris en iuj situacioj ne nomas foo, kiu estas klare ne estas la kazo tie. Do kio vere okazas en terminoj de ĉi tiu bildo? Nu, kiam ĉefa nomas foo, ĝi ricevas tranĉaĵo de memoro. Kiam foo foo flamo, ĝi alvenas tranĉaĵo de memoro. Kiam foo foo flamo, ĝi alvenas tranĉaĵo. Ĝi alvenas tranĉaĵo. Ĝi alvenas tranĉaĵo. Ĉar foo neniam reveni. Ni neniam viŝante unu el tiuj, kadroj de la pilo. Do ni blovas tra la amaso, ne mencii kiu scias kion alian, kaj ni overstepping la limojn de nia tn segmento de memoro. Eraro iri segmentación falsaj. Do la solvo estas klare ne fari tion. Sed la pli granda signifo estas, ke, jes, tie absolute estas iu limo, eĉ se ĝi ne estas bone difinitaj, pri kiel multaj funkcioj povas nomi en programo, kiom da fojoj funkcio povas nomi sin. Do kvankam ni faris prediki rekursio kiel ĉi potenciale magia afero de paro de semajnoj por la sigmo funkcio, kaj kiam ni atingos la datumoj strukturoj kaj CS50, vi vidos aliajn aplikojn por ĝi, estas ne nepre la plej bona afero. Ĉar se funkcio nomas sin, nomas sin, eĉ se estas bazo kazo, se vi ne batis tiu bazo kazo por 1.000 alvokoj aŭ 10.000 alvokojn, por tiam vi povus kuri el ĉambron sur via tn pilo kaj sukceson iuj aliaj segmentoj de memoro. Do ĝi tro estas dezajno kompromiso inter eleganteco kaj inter solideco de via aparta efektivigo. Do ekzistas alia malfacilaĵo aŭ alia gotcha al kio ni estis farante tiom. Kiam mi vokis getstring - lasu min iri reen en saluton-2. Rimarku, ke mi vokas getstring, kiu estas revenante adreson. Kaj ni asertas hodiaŭ ke adreso estas el la havaĵo. Kaj nun mi presi el la kordo en tiu adreso. Sed ni neniam donis la malo de getstring. Ni neniam devis calll funkcio kiel ungetstring, kie vi manon tiu memoro. Sed sincere ni probable devus esti. Ĉar se ni observas petante la komputilo por memoro, pere de iu kiel getstring sed neniam redonas gxin, verŝajne ankaŭ tio nepre kondukas al problemoj per kiu ni elĉerpis de memoro. Kaj fakte, ni povas serĉi ĉi tiuj problemoj kun la nova ilo kies uzado estas iom enigmaj por tajpi. Sed lasu min antaŭeniri kaj ŝpruci ĝin sur la ekrano, en nur momento. Mi tuj iros antaŭen kaj kuri Valgrind kun parametro kies unua ordono linio argumento estas la nomo de tiu programo saluton-2. Kaj bedaŭrinde ĝi estas eligo estas atrociously kompleksa sen bona kialo. Do ni vidu cxion, kio salato. David estas elmontras mian nomon. Do jen la programo efektive funkcias. Kaj nun ni atingos ĉi eligo. Do Valgrind estas simila en spirito GDB. Ne erarserĉilo per si mem. Sed estas memoro kontrolilo. Ĝi estas programo kiu kuros via plani kaj diru al vi se vi petis komputilo por memoro kaj neniam donis ĝin dorso, per tio signifas, ke vi havas memoro liko. Kaj memoro likoj inklinas esti malbona. Kaj vi estas uzantoj de komputiloj havas probable sentis tion, ĉu vi havas Mac aŭ PC. Ĉu vi iam uzis komputilon por momenton kaj ne rebooted en pluraj tagoj, aŭ vi ĵus akiris multajn programoj ruliĝas, kaj la malbenita afero malrapidiĝas al muelantaj lama, aŭ almenaŭ ĝi estas super tedas uzi, ĉar ĉiun ĵus super malrapida. Nun tiu povas esti kiom ajn da kialoj. Ĝi povus esti malfinia ciklo, cimo en ies kodo, aŭ, pli simple, ĝi povus signifi, ke vi uzas pli memoro, aŭ provi, ol via komputilo fakte havas. Kaj eble tie estas cimo en iu programo kiu gardas petante memoro. Foliumiloj dum jaroj estis konata por tiu, petante pli kaj pli da memoro sed neniam cedi ŝin reen. Certe, se vi nur havas finia kvanto da memoro, vi ne povas demandi malfinie multfoje por iom de tiu memoro. Kaj do kion vi vidas tie, eĉ se denove Valgrind eligo estas nenecese kompleksa al ekrigard unue, tio estas la interesa parto. Multigu - en uzo ĉe eliro. Do jen kiom memoro estis en uzo en la havaĵo de la tempo mia programo eliris - ŝajne ses bitokoj en unu bloko. Do mi tuj skuos miaj manoj je kio bloko estas. Pensu pri ĝi estas nur chunk, pli teknika vorto por chunk. Sed ses bitokoj - kio estas la ses bitokoj ke estis ankoraŭ en uzo? Ekzakte. D-Al-V-mi-D backslash nulo, kvin letero nomo plus la nula terminator. Do tiu programo Valgrind rimarkis ke mi petis ses bitokoj, ŝajne, por vojo de getstring, sed neniam donis ilin reen. Kaj fakte, ĉi tiu eble ne estus tiel evidente se mia programo ne estas tri linioj, sed ĝi estas 300 linioj. Do ni vere povas doni alian komando linio argumento al Valgrind al fari ĝin pli abundajn. Estas iom ĝena por memori. Sed se mi faras - vidu. Filtri - Estis ĝin filtri - eĉ mi ne memoras kio estas ekstere mano. - Liko-ĉeko egalas plena. Yep, dankon. - Liko-ĉeko egalas plena. Eniru. Sama programo kuras. Tajpi en David denove. Nun mi vidas iom pli detale. Sed sub la havaĵon resumo, kiu estas identa al kvar - ah, ĉi tiu estas speco de agrabla. Nun Valgrind fakte serĉas iom pli malfacila en miaj kodo. Kaj ĝi estas dirante ke, ŝajne, malloc ĉe linio - ni malzomi. Ĉe linio - ni ne vidas kion linio estas. Sed malloc estas la unua kulpa. Tie estas blogo en malloc. Ĉio bone? OK, ne. Ĝuste? Mi vokis getstring. getstring ŝajne nomas malloc. Do kio linio de kodo estas ŝajne kulpis por havi asignitaj tiu memoro? Supozu ke ĉiu, kiu skribis malloc estis ĉirkaŭ sufiĉe longe, ke ĝi estas ne ilia kulpo. Do estas probable mia. getstring en cs50.c - do tio estas dosieron ie en la komputilo - en linio 286 ŝajnas esti la kulpa. Nun ni supozu, ke cs50 estis ĉirkaŭrigardis por deca kvanton de tempo, tiel ni tro estas senerara. Kaj tial ĝi estas probable ne en getstring ke la besteto mensogas, sed en saluton-2.c linio 18. Do ni rigardu kion tio linio 18 estis. Oh. Iel tiu linio ne estas nepre kalesxon, per, sed estas la kialo malantaŭ tiu memoro liko. Do super simple, kion farus intuicie esti la solvo ĉi tie? Se ni petas memoro, estis neniam donante ĝin, kaj kiu ŝajnas esti problemo ĉar la tempo mia komputilo kuru el la memoro, povus malrapidigi malsupren, malbona aĵoj povus okazi, bone, kio estas la simpla intuicia solvo? Nur donu ĝin reen. Kiel vi liberigi tiu memoro? Nu, feliĉe ĝi estas sufiĉe simpla por simple diri liberaj nomo. Kaj ni neniam faris tion antaŭe. Sed vi povas esence pensas libera kiel la malo de malloc. libera estas la malo de atribuo memoro. Do nun mi recompilar ĉi. Faru saluton-2. Permesu al mi kuri ĝin denove. saluton-2 Davido. Do ĝi ŝajnas funkcii en ĝuste la sama maniero. Sed se mi reirus al Valgrind kaj re-kuri tiu sama komando sur mian nove kompilita programo, tajpi en mia nomo kiel antaŭe - nice. Multigu resumo - en uzo ĉe eliro - nulo bajtoj en nulo blokoj. Kaj ĉi tiu estas super bela, ĉiuj amaso blokoj estis liberigitaj. Neniu fugoj estas eblaj. Do kiam li eliris, ne kun Problemo Serio 4, sed kun Problemo Serio 5, la forensics kaj plue, tio tro iĝos mezuro de la praveco de via programo, ĉu vi havas aŭ ne havas memoron likoj. Sed feliĉe, ne nur vi povas rezoni tra ili intuicie, kiu estas, eble, facila por malgrandaj programoj sed malfacila por pli grandaj programoj, Valgrind, por tiuj pli grandaj programoj, povas helpi vin identigi la aparta problemo. Sed estas alia problemo kiuj povus ekesti. Permesu al mi malfermu tiun dosieron ĉi tie, tio estas, denove, iom simpla ekzemplo. Sed ni enfokusigas sur kio tiu programo faras. Ĉi tio estas nomita memory.c. Ni afiŝi ĉi poste hodiaŭ en la zip de hodiaŭa fontkodo. Kaj rimarki, ke mi havas funkcion nomita f kiu prenas neniun argumenton kaj redonas nenion. En linio 20, mi ŝajne deklari puntero al int kaj nomante ĝin x. Mi asignanta estas la reveno valoro de malloc. Kaj nur por esti klara, kiom da bitokoj am Mi verŝajne reatingas de malloc en ĉi tiu situacio? Probable 40. Kiel vi akiras, ke de? Nu, se vi memoras, ke int estas ofte 4 bajtoj, almenaŭ ĝi estas en la aparato, 10 fojojn 4 estas evidente 40. Do malloc revenas adreson de eron de memoro kaj stokante ke trakti finfine en x. Do por esti klara, kion tiam okazas? Nu, lasu min ŝanĝi reen al nia bildo tie. Lasu min, ne nur desegni la fundo de mia komputilo memoro, lasu min antaŭeniri kaj desegni la tuta rektangulo kiu reprezentas la tutan mian RAM. Ni diros ke la pilo estas sur la fundo. Kaj tie estas teksto segmento en la uninitialized datumoj. Sed mi simple tuj abstrakta tiuj aliaj aferoj for kiel punkto, dot dot. Mi simple tuj raporti al ĉi tiu kiel la amaso ĉe la supro. Kaj poste ĉe la malsupro de tiu ĉi bildo, por reprezenti ĉefa, mi tuj doni al ĝi tranĉaĵoj memoro sur la stako. Por f, mi ĝin donacos tranĉaĵo de memoro en la pilo. Nu, mi alvenis al konsulti mia fontkodon denove. Kiuj estas la lokaj variabloj por ĉefan? Ŝajne nenio, tiel ke tranĉaĵo estas efektive malplena aŭ eĉ tiel granda kiel mi desegnis ĝin. Sed en f, mi havas lokan variablon, kiu estas nomata x. Do mi tuj iros antaŭen kaj donu f eron de memoro, nomante ĝin x. Kaj nun malloc de 10 fojoj 4, Do malloc 40, kie estas tiu memoro devenante? Ni ne desegnita bildo like this antaŭe. Sed ni supozu, ke ĝi estas efektive venas de ĉi tie, do unu, du, tri, kvar, kvin. Kaj nun mi bezonas 40 de tiuj. Do mi nur faras dot, punkto, ĝi pentras sugesti ke estas eĉ pli memoro revenanta el la havaĵo. Nun kio estas la adreso? Ni elektas niajn arbitrajn trakti kiel ĉiam - Ox123, kvankam ĝi estas probable tuj esti iu tute malsama. Tio estas la adreso de la unua bajto en memoro kiun mi petas malloc por. Do mallonge, unufoje linio 20 ekzekutas, kio estas laŭvorte stokita ene de x ĉi tie? Ox123. Ox123. Kaj la Bovo estas interesa. Ĝi nur signifas ĉi tie estas deksesuma nombro. Sed kio estas ŝlosilo estas tio kio mi havas vendejo en x, kiu estas loka variablo. Sed lia datumtipo, denove, estas adreso de int. Nu, mi tuj stoki Ox123. Sed denove, se tiu estas iom tro komplikas sennecese, se mi rulumas reen, ni povas abstrakta tiun for sufiĉe prudente kaj ĝuste diri ke x estas puntero al tiu bloko de memoro. Akcepti. Nun la demando en mano estas la sekva - linio 21, rezultas, estas kalesxo. Kial? Pardonu? Ĝi ne havas - diri, ke denove. Nu, ne libera. Do jen la dua sed. Do ekzistas unu alia sed specife ĉe linio 21. Ekzakte. Tiu simpla linio de kodo estas nur buffer overflow, buffer invadita. Al buffer nur signifas eron de memoro. Sed tio eron de memoro estas de amplekso 10, 10 entjeroj, kio signifas, se ni indekso en ĝin uzante la sintaksa sukero de tabelo skribmaniero, la kvadrata krampoj, vi havas aliron al x krampo 0 x krampo 1 x, krampo dot, punkto, ĝi pentras. x krampo 9 estas la plej granda unu. Do, se mi faras x krampo 10, kie Mi reale iras en memoro? Nu, se mi havas 10 int - ni vere desegni ĉiuj de tiuj el tie. Por ke estis la unuaj kvin. Jen la aliaj kvin ints. Do x krampo 0 estas ĉi tie. x krampo 1 estas tie. x krampo 9 estas ĉi tie. x krampo 10 estas tie, kio signifas, mi diras, en linio 21, la komputilo por meti la numeron kie? La nombro 0 kie? Nu, estas 0, jes. Sed nur la fakto, ke lia 0 estas speco da koincidoj. Ĝi povus esti la nombro 50, por ĉiuj ni gravas. Sed ni provas meti ĝin je x krampo 10, kiu estas kie ĉi demandosigno estas desegnita, kiu ne estas bona afero. Ĉi tiu programo povus tre bone frakasi kiel rezulto. Nun, ni iru antaŭen kaj vidu se tiu Estas, ja, kio okazas. Faru memoro, ekde la dosiero nomas memory.c. Ni iru antaŭen kaj ruli la programo memoro. Do ni havas sorton, efektive, ŝajnas. Ni akiris bonŝanca. Sed vidu se ni nun kuras Valgrind. Je unua vido, mia programo povus ŝajnas esti perfekte ĝustaj. Sed mi kuros Valgrind kun la - Liko-ĉeko egalas plena je memoro. Kaj nun, kiam mi kuros ĉi - interesa. Malvalida skribi de grandeco 4, je linio 21 de memory.c. Linio 21 de memory.c estas kiu? Ho, interese. Sed atendu. Grandeco 4, kio estas referenco al? Mi nur faris unu skribi, sed estas de amplekso 4. Kial estas 4? Ĝi estas ĉar ĝi estas int, kiu estas, denove, kvar bajtoj. Do Valgrind trovis cimon, ke Mi, rigardante mian kodo, ne. Kaj eble via TF volus aŭ ne. Kio Sed Valgrind por asekuro trovis ke ni eraris tie, eĉ kvankam ni havas sorton, kaj la komputilo decidis, eh, mi ne tuj frakasos nur ĉar vi tuŝis unu bajto, unu _int_ la valoron de memoro, ke vi ne efektive posedas. Nu, kion alian estas kalesxon tie. Adreso - tio estas freneza rigardante adreso en deksesuma. Tio nur signifas ie en la havaĵo estas nulo bitokoj post bloko de grandeco 40 estas publikita. Lasu min malzomi tie kaj vidi se ĉi tiu estas iom pli utila. Interesa. 40 bitokoj estas definitive perditaj en perdo rekordo 1 el 1. Denove, pli da vortoj ol estas utila tie. Sed bazita sur la emfazita linioj, kie mi probable enfokusigi mia atenton al alia cimo? Aspektas kiel linio 20 de memory.c. Do, se ni reiru al linio 20, tio estas la Kiu vi identigis antaŭe. Kaj ĝi ne nepre kalesxo. Sed ni ĉi renversis liajn efektojn. Do kiel mi korekti almenaŭ unu el tiuj eraroj? Kion mi povus fari post linio 21? Mi povus fari liberan de x, tia estas redoni ke memoro. Kaj kiel mi povas solvi ĉi tiun cimon? Mi devus definitive iri ne plu ol 0. Do mi provos kaj re-kuros ĉi. Pardonu, definitive iri ne plu ol 9. Faru memoron. Lasu min rerun Valgrind en pli granda fenestro. Kaj nun rigardu. Nice. Ĉiuj amason blokoj estis liberigitaj. Neniu fugoj estas eblaj. Kaj super tie, tie estas neniu mencio plu de la nevalidan pravas. Nur por akiri avida, kaj estu la vidu se alia pruvo ne iras tiel intencis - Mi ricevas bonŝanca antaŭ momento. Kaj la fakto ke ĉi tiu estas 0 estas eble nenecese iluzia. Ni nur faru 50, iom arbitraj nombro, fari memoro dot oblikvo memoro - ankoraŭ akiri bonŝanca. Nenio estas frakasi. Supozi Mi nur faras iun vere malprudentaj, kaj mi faru 100. Lasu min refari memoro, dot oblikvo memoro - atingis bonŝanca denove. Kiel ĉirkaŭ 1.000? ints tie, malglate, kie mi devus esti? Faru memoro - damn it. [Ridado] Akcepti. Ni ne salaton ĉirkaŭ plu. Rerun memoro. Tie ni iru. Ĉio bone. Do ŝajne vi indekso 100.000 ints tie, kie vi devus esti en memoro, malbonaj aĵoj okazas. Do tiu estas evidente ne malmola, rapida regulo. Mi estis speco de uzante juĝo kaj eraro por alveni tie. Sed tio estas ĉar, longan rakonton mallonga, via komputilo memoro estas ankaŭ dividita en tiuj aĵoj nomata segmentoj. Kaj kelkfoje, la komputilo fakte donis al vi iom pli da memoro ol vi petas. Sed por efikecon, nur pli facile ricevi pli da memoro sed nur diri al vi ke vi fariĝas parto de ĝi. Kaj se vi ekhavas bonŝanca kelkfoje, do, eble vi povos tuŝi memoro kiu ne apartenas al vi. Vi ne havas garantion ke kio valoro vi metis tie restos tie, ĉar la komputilo ankoraŭ pensas ĝi ne estas via, sed ĝi ne nepre tuj bati alian segmenton de memoro en la komputilo kaj induktas eraron kiel ĉi tie. Ĉio bone. Demandojn tiam memoro? Ĉio bone. Ni rigardu ĉi tie, tiam, je ion ni iris prenante por koncedita por sufiĉe tempo, kiu Estas en ĉi tiu dosiero nomata cs50.h. Do tiu estas dosiero. Ĉi tiuj estas nur aro faskon de komentoj supren supro. Kaj vi povintus rigardis ĉi se vi poked ĉirkaŭe en la aparaton. Sed rezultu ke la tuta tempo, kiam ni kutimis uzi kordo kiel sinonimo, la rimedoj, per kiuj ni deklaras ke sinonimo estis kun tiu ŝlosilvorto typedef, por tipo difino. Kaj ni esence dirante: fari String sinonimo por char stelo. Ke la rimedoj, per kiuj la stako kreis ĉi tiujn trejnado radoj konata kiel la kordo. Nun tie estas nur prototipo por getchar. Ni povus esti vidinta ĝin antaŭe, sed tio estas ĝuste kion ĝi faras. getchar prenas neniun argumenton, redonas char. getdouble prenas neniun argumenton, redonas duoble. getfloat prenas neniun argumenton, revenas kaleŝego, kaj tiel plu. getint estas en tie. getlonglong Estas en ĉi tie. Kaj getstring estas en tie. Kaj tio estas ĝi. Ĉi purpura linio estas alia antaŭtraktilo direktivo pro la etiketon al la komenco de ĝi. Ĉio bone. Do nun lasu min iri en cs50.c. Kaj ni ne parolu tro longe sur ĉi. Sed por doni al vi ekvidi, kio estas iris sur ĉiuj ĉi tempo, lasu min iri al - ni faru getchar. Do getchar estas plejparte komentojn. Sed ĝi aspektas kiel ĉi tio. Do tiu estas la reala funkcio getchar ke ni estis prenante por koncedis ekzistas. Kaj eĉ se ni ne uzas ĉi tiu ke ofte, se iam, estas almenaŭ relative simpla. Do valoras preni rapida rigardi tie. Do getchar havas senfinan buklon, intence tiel ŝajne. Ĝi tiam nomas - kaj ĉi tiu estas speco de bela reuzo de la kodo ni mem skribis. Ĝi alvokas getstring. Pro kio faras ĝin signifas akiri char? Nu, vi povus tiel provi atingi tuta linio de teksto de la uzanto kaj tiam nur rigardi unu de tiuj signoj. En linio 60, tie estas iom bito de prudento ĉeko. Se getstring revenis nula, ni ne iros. Io misokazis. Nun tio estas iom ĝena sed konvencia en C. char maks probable reprezentas kio ĵus bazita en lia nomo? Ĝi estas konstanta. Estas kiel la numera valoro de la grandaj char vi povas reprezenti kun unu mordo, kiu estas probable la nombro 255, kiu estas la plej granda nombro vin reprezenti ok bitoj, ekde nulo. Do mi uzos tiun, en ĉi tiu funkcio, kiam skribi tiun kodon, nur ĉar se iu iras malbone en getchar sed lia celo en la vivo estas resendas char, vi devas iel povos por signali al la uzanto kiu io iris malbone. Ni ne povas reveni nula. Ĝi rezultas ke nula estas puntero. Kaj denove, getchar havas reveni al char. Do la kongreso, se iu iras erara, estas vi, la programisto, aŭ en tiu kazo, mi kun la biblioteko, mi havis justa decidi arbitre, se io iras malbone, mi tuj redonas la numeron 255, kiu estas vere signifas ke ni ne povas, la uzanto ne povas tajpi la karaktero reprezentita de la numeron 255, ĉar ni havis ŝteli ĝin kiel tn gardostaranto valoron al reprezentas problemon. Nun ĝi rezultas ke la karaktero 255 ne estas io, kion vi povas tajpi sur via klavaro, do ĝi ne estas granda interkonsento. La uzanto ne rimarkas ke Mi ŝtelis tiun karakteron. Sed se vi iam vidos en paĝoj de man sur komputila sistemo iu referenco al ĉiuj kaskedoj konstanta kiel tiu kiu diras, en kazoj de eraro ĉi tiu konstanta forto esti redonita, jen ĉio iuj homaj faris jaroj estis arbitre decidis redoni tiun specialan valoron kaj nomas ĝin konstanta en kazo iu iras malbone. Nun la magio okazas cxi tie. Unue, mi deklarante en linion 67 du karakterojn, C1 kaj C2. Kaj tiam en linio 68, tie estas reale linio de kodo tio memoras nia amiko printf, donita ke ne havas procento Cs en citiloj. Sed rimarkas kio okazas tie. sscanf signifas ĉenon scan - signifas skani la formatan kordo, ergo sscanf. Kion tio signifas? Ĝi signifas pasas al sscanf ĉenon. Kaj linio estas kion ajn la uzanto tajpas in Vi pasas al sscanf formato kordo kiel tiu kiu rakontas scanf kio estas vi atendas la uzanto tajpas in Vi do pasi-en la adresoj de du pecoj de memoro, en ĉi tiu kazo, ĉar mi havas du anstataŭiloj. Do mi ĝin donacos la adreso de C1 kaj la adreson de C2. Kaj memoru, ke vi donas funkcio la adreso de iu variablo, kio estas la implikaĵo? Kion povas fari tiun funkcion kiel rezulto de doni al ĝi la adreson de variablo, kontraste al la variablo mem? Ĝi povas ŝanĝi ĝin, ĉu ne? Se vi havis iun mapon al fizika adreso, ili povas iri tie kaj fari kion ajn ili volas al tiu adreso. Sama ideo tie. Se ni pasas al sscanf, la adreso de du pecoj de memoro, eĉ tiujn etajn iom pecojn de memoro, C1 kaj C2, sed ni diru al ĝi la adreson de ili, sscanf povas ŝanĝi ĝin. Do sscanf la celo en la vivo, se ni legas la viro paĝon, estas legi kion la uzanto tajpita en, espero por la uzanto havanta tajpitaj en karaktero kaj eble alian karakteron, kaj kion la uzanto tajpitaj, la unua gravulo iras tie, la dua gravulo iras tien. Nun, kiel flanken, oriento, kaj vi farus nur scias tion en la dokumentadon, la fakto, ke mi metas malplenan spacon tie nur signifas ke mi ne gravas se la uzanto atingas la Spaco trinkejo kelkajn fojoj antaŭ ol li aŭ ŝi prenas karaktero, mi tuj ignori neniu blanka spaco. Tial, mi scias el la dokumentado. La fakto ke ekzistas duan% c sekvata de blanka spaco estas fakte intenca. Mi volas povi detekti se la uzanto ŝraŭbita supren aŭ ne kunlabori. Do mi esperas ke la uzanto nur tajpitaj en unu signo, do mi esperas ke sscanf nur tuj redoni la valoro 1 ĉar, denove, se mi legis la dokumentado, sscanf la celon en vivo estas reveni al la nombro de variabloj kiuj satiĝis kun uzanto enigo. Mi pasis en du variabloj adresoj, C1 kaj C2. Mi esperas, tamen, ke nur unu el ili prenas mortigita ĉar se sscanf Revenas 2, kio estas supozeble la implikaĵo logike? Ke la uzanto ne nur donu al mi unu karaktero kiel Mi diris al li aŭ ŝi. Ili verŝajne enigis je Almenaŭ du gravulojn. Do se mi anstataŭ ne havis la dua % C, mi nur havis unu, kiu sincere estus pli intuicia alproksimiĝo, mi kredas unua rigardo, vi ne tuj povos detekti se la uzanto estas doni al vi pli enigo ol vi vere volis. Do tiu estas implica formo de eraro checking. Sed rimarkas kion mi faras tie. Iam mi certas ke la uzanto donis al mi unu karaktero, mi liberigi la linio, farante la malo de getstring, kiu laŭvice Uzas malloc, kaj poste mi revenos C1, la karaktero, ke mi atendis la uzanto provizita kaj nur provizis. Tiel rapida duonvidis nur, sed demandojn sur getchar? Ni revenos al iuj de la aliaj. Nu, lasu min antaŭeniri kaj fari tion - supozu nun, nur por motivi nian diskuto en semajno plus tempo, ĉi Jen dosiero nomata structs.h. Kaj denove, ĉi tio estas nur gusto de iu kiu kuŝas antaŭe. Sed avertas ke multe de tio estas komentoj. Do lasu min reliefigi nur la interesa parto por nun. typedef - ekzistas tiu sama ŝlosilvorto denove. typedef ni uzas por deklari kordo kiel speciala datumtipo. Vi povas uzi typedef krei tutnova datumtipoj kiu ne ekzistis kiam C estis inventita. Ekzemple, int venas kun C. char venas kun C. duobla venas kun C. Sed ne estas nocio de studento. Kaj tamen ĝi estus sufiĉe utila por esti kapablaj skribi programon kiu stokas en variablo, iu studento ID numeron, lia nomo, kaj ilia domo. En aliaj vortoj, tri pecoj de datumoj, kiel oni int kaj ŝnuro kaj alia linio. Kun typedef, kio estas sufiĉe potenca pri tiu kaj la ŝlosilvorto sturct por strukturon, vi, la programisto en 2013, efektive povas difini vian propran la datumtipoj kiu ne ekzistis jaroj antaŭe sed ke laux viaj intencoj. Kaj tial ĉi tie, en linioj 13 tra 19, ni deklarante nova datumtipo, kiel an int, sed nomi ĝin studento. Kaj ene de tiu variablo tuj Tri aferoj - an int, ĉeno, kaj ĉenon. Do vi povas pensi pri kio estas vere okazis tie, kvankam ĉi tiu estas iom de plisimpligo por hodiaŭ, studento estas esence irante aspekti kiel ĉi tio. Lia tuj estos eron de memoro kun ID, nomo kampo, kaj domon kampo. Kaj ni povos uzi tiujn pecojn de memoro kaj konsenti ili jene. Se mi iros en struct0.c, jen relative longa, sed post mastro, de kodo ke Uzas tiu nova artifiko. Do unue permesu al mi atentigi vin al la interesaj partoj ĝis supro. Sharp difinas studentoj 3, deklaras konstanta nomita studentoj kaj atribuas ĝi arbitre la numero 3, nur tial mi havas tri studentoj uzante tiu programo por nun. Jen venas Artikolo. Kaj rimarki, kiel mi rakontu tabelo de studentoj? Nu, mi simple uzas la saman sintakson. La vorto lernanto estas evidente nova. Sed studento, klaso, krampo studentoj. Do bedaŭrinde restas multa el reuzado de terminoj ĉi tie. Tiu estas nur nombro. Do tiu estas kiel diri tri. Klaso estas precize kion mi volas nomi la variablo. Mi povus nomi studentoj. Sed klaso, tio ne estas klaso en objektema Java ia maniero. Estas nur klaso de studentoj. Kaj la datumtipo de ĉiu elemento en tiu tabelo estas studento. Do tiu estas iom malsama kaj el dirante ion kiel tiu, ĝi estas nur - Mi diris al mi tri studentoj kaj invitas ke tabelo klaso. Ĉio bone. Nun ĉi tie estas kvar buklo. Tiu ulo estas familiara - ripeti de nulo sur ĝis tri. Kaj jen la nova peco de sintakso. La programo tuj instigas min, la homo, por doni al ĝi studento ID, kiu estas int. Kaj jen la sintakson kun kiu vi povas stoki ion en la ID kampo ĉe situo klaso krampo I. Do tiu sintakso ne estas nova. Ĉi nur signifas doni al mi la oka studento en la klaso. Sed tiu simbolo estas nova. Ĝis nun, ni ne povas uzi punkton, almenaŭ en kodo ŝatas tion. Tio signifas iri al la struct konata kiel studento kaj metis ion tie. Simile, en la sekva linio, 31, iri antaŭeniris kaj metis ajn la uzanto tajpas Mia nomo tie kaj kion ili faras por domo, la samon, iru antaŭen kaj metis ĝin en. domo. Do kio faras ĉi programo finfine fari? Vi povas vidi iom teaser tie. Lasu min antaŭeniri kaj ne fari structs 0 dot oblikvo struct 0, studento ID 1, diru Davido Mather, studento ID 2. Rob Kirkland, studento ID 3. Lauren Leverit - kaj la sola afero ĉi programo faris, kio estas ĝuste tute arbitra, estas Mi volis fari ion kun tiu datumo, nun ke mi instruis nin kiel uzi structs, estas mi ĵus havis tiu ekstra buklo tie. Mi persisti sur la tabelo de studentoj. Mi uzis niaj, eble nun konata amiko, kordo kompari, stircomp al ĉeko estas 8a studenta domo egala al Mather? Kaj se jes, nur presi ion arbitre ŝatas, jes, ĝi estas. Sed denove, nur donante al mi ŝancojn uzi kaj reuzi kaj reuzi tiun novan dot skribmaniero. Do, kiuj zorgas, ĉu ne? Coming up kun studento programo estas iom arbitra, sed ĝi rezultas ke ni povas fari utilajn aĵojn kun tiu, ekzemple jene. Tio estas multe pli komplika struct en C. Ĝi atingis dekduo aŭ pli kampoj, iom crípticamente enoficigita. Sed se vi iam aŭdis pri grafiko formato de dosiero nomata bitmap, BMP, ĝi Rezultas ke la bitmap dosierformato sufiĉe similas ke ĉi. Estas stulta iom Smiley vizaĝo. Ĝi estas malgranda bildo kiun mi zomita en sur sufiĉe granda por ke mi povis vidi ĉiu de la individuo punktoj aŭ rastrumeroj. Nun, ĝi rezultas ni povas reprezenti nigra punkto kun, ekzemple, la nombro 0. Kaj blanka punkto kun la numero 1. Do, en aliaj vortoj, se vi volas desegni Smiley vizaĝo kaj savi tiun bildon en komputilo, ĝi sufiĉas por stoki nuloj kaj kiuj aspektas kiel oriento, kie, denove, karaj estas blankaj kaj nuloj estas nigraj. Kaj kune, se vi efektive havas oni zonu de kaj nuloj, vi havas krado de rastrumeroj, kaj se vi kuŝis ilin, vi havas bela iom Smiley vizaĝo. Nun, bitmap formato de dosiero, BMP, estas efektive, ke sub la kapuĉo, sed kun pli rastrumeroj sot ke vi efektive povas reprezenti kolorojn. Sed kiam vi havas pli kompleksan dosieraj formatoj kiel BMP kaj JPEG kaj GIF kun kiu vi povus esti familiara, tiuj dosierojn en disko tipe ne nur havi nuloj kaj por la rastrumeroj, sed ili havas iujn metadatumoj tiel - meta en la senco ke ne estas vere datumoj sed estas utile havi. Do tiuj kampoj ĉi tie estas implico, kaj ni vidos tion en pli detalo en P-aro 5, kiu antaŭ la nuloj kaj ke reprezentas la bildoj estas image, tie estas amaso de metadatumoj kiel la grandeco de la bildo kaj la larĝo de la bildo. Kaj rimarki Mi plukinte for iu ajnaj aferoj tie - larĝeco kaj alteco. Bito grafo kaj kelkaj aliaj aĵoj. Do tie estas kelkaj metadatumoj en dosiero. Sed per kompreno kiel dosieroj estas demetataj ekstere en tiu formo, vi povas efektive tiam manipuli bildojn, reakiri bildoj el disko, regrandigi bildoj. Sed vi ne povas nepre plibonigi ilin. Mi bezonis foto. Do mi reiris al RJ tie, kiu vin vidis sur la ekrano sufiĉe tempon. Kaj se mi malfermos Keynote tie, tio estas kio okazas se vi provas zomi kaj plibonigi RJ. Li ne ricevas iun pli bone vere. Nun Keynote estas speco de desdibujando ĝin iom, nur por forgliti super la fakto ke RJ ne ricevas aparte plibonigita kiam vi zomi in Kaj se faru ĝin tiamaniere, vidu la kvadratoj? Jes, vi povas definitive vidas la kvadratoj sur projekciilo. Tio estas kion vi akiras, kiam vi plibonigi. Sed kompreni kiel nia RJ aŭ la Smiley vizaĝo implementado lasos nin fakte skribi kodon kiu manipulas tion. Kaj mi pensis, ke mi volas fini ĉi tiun noton, kun 55 sekundoj de plibonigi tio, Mi kuraĝis, diru prefere iluzia. [VIDEO reprodukto] -Li mensogas. Pri kio, mi ne scias. -Do kion ni scias? -Tio je 9:15 Ray Santoya Estis en la kasisto. -Do la demando estas kion Estis li faras je 9:16? -Pafado la naŭ milimetro ĉe io. Eble li vidis la francotirador. -Aŭ laboris kun li. -Atendu. Reiru tiu. -Kion vi vidas? -Alportu lian vizaĝon supren, plena ekrano. -Lia okulvitroj. -Tie estas reflekto. -Tio estas la Neuvitas basbalo teamo. Tio estas ilia logo. -Kaj li parolas al kiu ajn estas portante ke jako. [FINO reprodukto de vídeo] DAVID J. Malan: Ĉi tiu volo esti Problemo Serio 5. Ni vidos vin venontsemajne. Vira parolanto: Je la sekvanta CS50. [Griloj pepado] [MUZIKO ludi]