[MUZIKO Ludante] DAVID J. Malan: Ĉi tio estas kiel unuajarulo seminario hodiaŭ. BONE. Do pluva eksteren. Ĉi inklinas okazi merkrede, sed des pli ŝanco por demandoj hodiaŭ. Do ni dividi reale kun la filmo en nur momento. Sed ni komencu grandioze kiel ĉiam. Jen CS50, kaj ĉi tiu estas la fino de semajno 4. Do se vi iam spektis TV aŭ filmo en kiu ekzistas iuj komputilaj spertuloj kaj la polico, aŭ la FBI, aŭ iu agentejo provas kapti iun kontraŭulo, nu, vi havas probable aŭdis la esprimon "plibonigi" whereby ke teknikisto iel magie zooms en malfinie malproksime vidi la krimulojn identecon aŭ la numerplaton nombro en eĉ la brilanta spegulo aŭ la ekbrilon de ies okulo. Do ja, ni rigardu kelkaj tiaj scenoj de Hollywood. [VIDEO reprodukto] -OK, Nun ni akiri bonan rigardu. -Hold Ĝin. Kuru ke reen. -Atendu minuton. Iru dekstren. -There, Frosti tio. -Plenekrane. -OK, Frosti tio. -Tighten Sur tio, ĉu vi? -Vector Super tiu ulo de la rado trasera. -Zoom En ĝuste ĉi tie sur ĉi tiu loko. -Kun La dekstra teamo, la bildo povus esti pligrandigita kaj akraj. -Kio estas tio? -ĝi An plifirmigo programo. -Can Vi certe ke ĝis ajna? -Mi ne scias. Ni plibonigos gxin. -Enhance Sekcio Al6. -I Plibonigita detale, kaj-- Mi kredas, ke estas sufiĉas plibonigi, liberigas ĝin al mia ekrano. -I Plibonigita la reflekto en ŝia okulo. -Let Kuros ĉi tra video plibonigo. -Edgar, Vi povas plibonigi ĉi? -Atendu. -Mi Laboris pri ĉi tiu interkonsiliĝo. -Someone Rebrilon. -Reflection. -There Estas reflektado de la homa vizaĝo. -La Reflekto. -There Estas reflekto. -Zoom En la spegulo. -Vi Povas vidi reflekto. -Can Vi plibonigas la bildon de ĉi tie? -Can Vi plibonigas lin ĝuste ĉi tie? -Can Vi plibonigi ĝin? Ĉu vi povas plibonigi ĝin? -Can Ni plibonigi ĉi? -Can Vi plibonigi ĝin? -Hold Sur dua, mi plibonigas. -Zoom En sur la pordo. -Times 10. -Zoom. -Move En. -More. -Wait, Ĉesi. -Stop. -Pause Ĝin. -Rotate Ni 75 gradoj ĉirkaŭ la vertikala, bonvolu. -Stop. Reiru al la parto pri la pordon denove. -Got Bildon enhancer kiu povas bitmap? -Hey, Eble ni povas uzi la Pradeep Sen metodo vidi en la fenestroj. -Ĉi Programaro estas stato de la arto. -La Ajgeno estas for. -Kun La dekstra kombino de algorithm-- -Li Estas prenita elimino algoritmoj al la sekva nivelo, kaj mi povas uzi ilin Plibonigi tiu fotografaĵo. -Lock Sur kaj disvastigu la z-akso. -Enhance. -Enhance. -Enhance. -Freeze Kaj plibonigi. [FINO reprodukto] DAVID J. Malan: Bone, do ĉiuj el tiuj estas fakte vortojn. Ili ĵus laĉis kune en maniero kiu estas ne reale saĝa. Kaj, fakte, CS50 kaj kursoj kiel ĝi inklinas ruinigi multon de TV kaj filmoj por vi. Ĉar kiam tiuj komputilaj fakuloj klakas for terminoj kaj dirante fancy aĵojn kiel ajgenvektoroj, kaj la z-akso, kaj ajna nombro da aliaj reale pli teknikaj terminoj, ili estas vere nur petoladi vortoj kune ĉiuj tro ofte. Estas tiu de nia espero estas ke, kiel kromefikon de preno kursoj kiel tiu, volo pli personoj en la mondo fakte povos levar en kaj nur iam tiel iomete influi la kvalito kaj precizeco de tiuj filmoj? Fakte, ni rigardu realaĵo. Do jen estas la personaro foto de Mary, unu el niaj instruado uloj. Kaj supozu ŝi estas suspektis ion. Kaj tamen, ekzistas eklumo de iu peco de evidenteco en ŝia okulo, aŭ en la reflekto de ŝia anteojos. Nu, se ni faros ĝuste kiel la filmoj proponi, kiun ni zomi kaj "plibonigi", ĉi estas kiom informo Estas en Mary vizaĝo kiam vi kapti bildon kun tiu originala distingivo. Kaj, fakte, vi povas vidi ĉi tiujn punktojn. Kaj tiuj estas kio estas nomata rastrumeroj, P-mi-x-E-L-S, kio estas nur kvadrata tipe ke estas skalara kiu formas bildon. Kaj reen en la tago, kaj fakte eĉ hodiaŭ kun iuj el hodiaŭa LED TVs aŭ LCD TVs, se vi hvas unu en via ĉambro aŭ en la domo, se vi iros super proksime al ĝi, kaj speciale se ĝi estas iom pli malnovaj televido, vi versxajne povas eĉ vidi tiujn punktojn kaj tio komponi bildon. Kaj ne ekzistas pli informo ol ĉi tiu. Ni povis "Plibonigi", en la senco de alisado aĵoj super kaj ia infiriendo ia, ia kio koloro devus esti apud Maria okulo tiel ke ĝi ne estas vere tiel pixelated. Sed se Mi tenas zoom en, ekzistas estas la fiulo en ŝia okulo. Kiel tio estas des informo ni havas. Vi ne povas krei informo el nenio. Ekzistas nur finia numeron de bitoj tie. Do en Problemo Serio 4, kie vi havos ŝancon ludi kun tiu speco de mondo. En Problemo Serio 4, vi esplori la mondo de grafikaĵoj kaj jura, kaj fakte skribi kodon kiu rekuperas perdis bildoj. Vi skribos kodo ke Manipulas ekzistantaj bildoj kaj finfine kompreni kio estas daŭriganta sub la kapuĉo. Kaj, verŝajne, ĝi estas fakte Ne ĉiuj kiuj komplika. Ekzemple, se ni volis reprezenti smiley vizaĝo kie kun tiuj nigraj rastrumeroj, aŭ tiujn nigrajn punktojn, Nu, ni povus simple reprezenti ilin kiel vere bitmap. Kaj se vi iam aŭdis ke esprimo bitmap, eble ĝi nun komencas fari iom pli sentita hodiaŭ. Ni jam scias kio iom estas. Ĝi estas 0 aŭ 1. Kaj mapo estas nur io Kiel peco de papero kiu donas al vi direktoj kaj havas eble krado de x- kaj y-koordinatoj. Do tie estas bitmap. Estas mapo de bitoj per a 1 estas ŝajne tuj reprezenti blankan bildero, kaj 0 tuj reprezenti nigra pikselo. Sed ni certe povus klaki ĝin ĉirkaŭ. Fakte ne gravos longe kiel ni estas konsekvenca. Kaj tie estas kiel, en binary-- interne de komputila memoro, aŭ eĉ interne de dosiero sur via malfacila drive-- povis memori la plej simpla de smiley vizaĝo bildoj. Sed kio estas ni, kompreneble, mankas en tiu bildo? Koloro, dekstra? Ĝi estas evidenta sekva paŝo aŭ plifirmigo plibonigi tiun kun koloro. Do bedaŭrinde kun nur unu bita, 0 aŭ 1, ni povus reprezenti koloro. Tio povus esti ruĝa, aŭ blua, aŭ nigra, aŭ blanka, aŭ verdaj aŭ rozkoloraj, aŭ ajna paroj da koloroj. Sed por simpleco, kalkaj, ni nur supozi nigra kaj blanka. Do kio logike fari ni bezonas se ni volas apliki koloro en bildo? Kion ni devas fari? Kiel se la limiganta faktoro tie estas ke per unu bito vi povas nur reprezenti du statojn, 0 aŭ 1, blanka aŭ nigra, kion vi volas fari? Publiko: Pli datumoj. DAVID J. Malan: Pli bitoj, yeah pli datumoj, pli bitojn. Kaj, efektive, jen precize kiel koloro bildoj estas reprezentitaj. Anstataŭ uzi solan iom, oni 0 aŭ 1 por ĉiu bildero, ĉiu punkto, vi nur uzu multnombraj. Eble uzi 8, eble, pli komune uzi 24, kaj ja, en Problemo Ara 4, ĉu vi ludas kun dosiero formato kiu uzas 24 bitojn tipe. Sed precipe oni verŝajne familiara kun JPEG-oj. Se vi iam prenita foton sur via telefono, aŭ alŝutis aŭ vidis ion sur Facebook, aŭ Flickr, ajna nombro de foto-bazitaj retejoj, vi havas verŝajne vidis JPEG bildo antaŭe. Kaj ĝi rezultas, tiu estas la dosieron formato ni tuj uzi en pset 4, whereby vi tuj devas rekuperi bildoj ke mi akcidente forigita de koruptita memoro karto en la ĉambron, se vi volas. Kaj ĝi rezultas ke eĉ se JPEG estas bela sophisticated-- ĝi estas multe pli malnaiva ol la nigraj kaj blankaj punktoj ni vidis antaŭ momento, ĉar estas fakte imago algoritmoj kiuj estas uzataj por kunpremi JPEG, do ke vi povas havi vere bela, kvalito bildon sed uzante relative malmultajn bitoj. Kaj ni revenos al kunpremado antaŭ longe. Ĝi rezultas ke la unua tri bajtoj en JPEG image-- negrave kion vi prenis foton of-- estas la valoroj 255, 216, 255. Alivorte, se vi nur vidu ŝablono de bitoj, reprezentita tie kiel tri bajtoj, aŭ 24 bitoj entute, kun alta probablo povas konkludi ke vi rigardas ĝin ĉi unuaj tri bajtoj de JPEG. Kaj tiu estas kio estas konata kiel la signumo de JPEG. Multa dosiero formatojn tie ekstere emas komenci kun certaj ŝablonoj de _0s_ kaj _1s_, por ke Windows kaj Mac VIN kaj iOS, kaj Android scias kia dosiero ili Estas, aldone al la tn dosieron etendo ke multajn dosierojn havas. Se vi .jpg, jen Alia aŭtoveturejo al la komputilo. Do ni nun rigardas ĉi iom pli teknike. Ni scias la dekuma sistemo estas 0 tra 9. Ni scias duuma estas 0 kaj 1. Kaj se vi pensas reen al pset 0, ni devis lukti kun vi, por iomete, io nomata deksesuma, kie vi havas 16 ciferoj, anstataŭ 10 aŭ anstataŭ 2. Kaj tiuj ciferoj, per konvencio, Estas 0 tra 9 kaj tiam tra f, kie f reprezentas kio dekuma nombro, same rapidan prudento kontroli? Do, 15. Kaj devas reprezenti la 10, kun nur naturo de la ordenamiento ke mi donis. Estas nur arbitra konvencio, sed ĝi estas sufiĉe normo. Do se ni rigardas tiun skemon de tri bitokoj ni komencu rigardi ĝin en maniero kongrua kun kiel komputikistoj ĝenerale rigardi kaj pensi pri dosieroj. Vi certe povas pensi pri dosieroj en _0s_ kaj _1s_, kaj decimala, sed fakte, ni inklinas uzi duuma aŭ pli tipe hexadecimal-- reen de pset 0. Do mi proponas ke 255, 216, kaj 255 estas nur tiuj ŝablonoj de _0s_ kaj _1s_. Kaj vi povas kontroli ĝin se vi deziras fari la math de Semajno 0. Sed, nuntempe, nur supozas ke cxi tiu estas vere ĝentilaj. Mi ĵus reskribita tri decimalaj numerojn kiel tri binarajn valorojn. Nun kio mi tuj faros estas nur aldoni iu blanka spaco, nur por legibilidad gajno. Kaj rimarki, mi simple tuj movi aferojn dise. Do antaŭ, post, antaŭ, post. Mi faras nenion interesan aliaj ol nur disvastigado aferojn tiel ke avizo ĉiu aro de ok bitoj estas nun du aroj de kvar bitoj. Tio estas utila ĉar deksesuma estas aparte modo ĉar ĉiu deksesuma cifero 0 tra f, aŭ pli specife 0 tra 15, povas esti prezentita kun precize kvar bitoj. En aliaj vortoj, en deksesuma se volas reprezentas 0, estas nur 0000, kvar nuloj. Kaj se vi volas reprezenti 15 ĝi estas 1111, kiu estas kvar bitoj. Kaj se vi faros la math, se tiu estas la ones loko, tiu estas la 16s loko, ke tuj doni you-- prefere ke tuj to-- bedaŭras, en duuma, ke tuj donos vin 15, tiuj loko, duope loko, kvarpiede kaj Eights loko. Do mi proponas ke tiu aro de kvar bitoj maldekstre estas kion ni tuj voki f. Ĝi estas la plej granda nombro vi povas reprezenti kun kvar bitoj. Kaj ni jam scias el deksesuma, f estas la plej granda cifero en deksesuma. Ni havas alian f tie, du pli tie. Kaj nuntempe, nur prenu sur fidon ke mi faris la math dekstra kaj ke la maldekstra duono de tiuj bitoj, 1101, Estas la sama afero kiel d en deksesuma. Kaj dekstre, 1000, estas nur 8. Kaj ke onia facile vidi, ĉu ne? La 8 represents-- pravas sub tiu Eights loko. Do ni havas unu en la Eights kolumno kaj nenio en la kvarpiede, duope aŭ ones. Do nun pli konvencie, homoj emas skribi deksesumaj ciferoj kiel tiu, vi nur squish ilin kune, kaj tiam vi prefiksu ilin kun 0x. Ĝi signifas nenion alian ol vida indico al human-- tie venas deksesuma value-- ĉar ĝi povus ne alie esti evidentaj. Kiu estas, finfine, ke desegnon de nuloj kaj, aŭ la bildon de deksesuma ciferoj ekvivalente ke vi estas tuj komenci serĉi en Problemo Serio 4 estas this-- kaj la Problemo Ara 4 spec piediros vin tra ĉi en pli detail-- sed konscias kiel ia arcano kiel ĉi povus rigardi unua rigardo, vi tuj komencu vidante tiun amason. Kaj fakte, eĉ en GDB, La erarserĉilo ni enkondukis lundon kaj Dan enkondukas en pset 3, tuj ofte montras vin deksesumaj valoroj nur ĉar ili inklinas esti pli konvencia ol dekuma aŭ duuma en la mondo de komputiloj. Nun ni kunigu ĉi en kunteksto. Multaj de vi eble memoras tiun bildigi tie, kiuj venis de kio? Vido, tiel eĉ pli frue ol ke, Vindozo XP faris ĉi debuto. Do tiu estas belega pejzaĝo. Kaj fakte, se vi poke ĉirkaŭ online-- Mi kredas ke estas Vikipedia artikolo, kien iu tre mirige eliris trovis tiun lokon en la mondo starigita sian ĉambron en precize la dekstra place-- kaj tio hodiaŭ aspektas like-- sed ĝi estas precize la sama scenaro. Ĉi tiu bildo, tamen, estas en dosiero formato nomata bitmap, b-m-p. Kaj ni iras preni la super fulman ekrigardon al kion tio signifas. Sed bitmap estas nur malsama maniero de reprezentanta bildoj ankoraŭ uzanta rastrumeroj en _0s_ kaj _1s_, finfine. Sed ĉe rapida ekrigardo, ĝi havas pli interesa subskribo komence de la dosiero. Ĝi estas ne nur tri bajtoj, prefere ekzistas tuta aro da ŝablonoj de bajtoj kiuj antaŭdeterminita signifon. Ekzemple, ie en la unuaj bajtoj de bitmap bildo tuj estos la grandeco de la bildo, la larĝo de la bildo, la alteco de la bildo, tiel utila metadatenojn, se vi volas. Utilaj informoj Photoshop aŭ ajna grafiko plani vi uzas efektive povus zorgi pri. Do pli en tiu en Problemo Ŝanĝu 4, sed ĉi Nur diri ke ĉe la fino de la tago ĉiuj dosierformojn vi estis uzante por years-- Microsoft Word dosierojn, Nombroj dosieroj, Excel dosierojn, ajna nombro de dosieraj formatoj ke havu iom konata dosiersufikso estas nur _0s_ kaj 1s sub la kapuĉo. Kaj homoj decidis kion la konvencioj estas, kion ŝablonoj de _0s_ kaj _1s_ reprezenti Vorto file kontre Excel dosiero, kontre ajnan numeron de aliaj dosieraj formatoj. Do en pset 4, vi havos ŝanco ludi kun tio. Sed kion ĝi signifas havi struct. Tiu estas fakte bela segue nun en C, kiu havas nur kelkajn de suplementaj ĉefaĵoj ke Ni ne rigardis ankoraŭ. Ĝi estas bela malgranda lingvo kaj unu el la agrablaj trajtoj pri C estas struct. Ekzemple, se vi volis represent-- ni diru vi volis havi variablo kiu reprezentas studento en iu programo. Eble vi skribis kurson registriĝo programon, aŭ kernon butikumado ilo, aŭ io simila. Kio estas pecoj de datumoj rilatigitaj al studento kiu venas al la menso? Kiel studento estas reprezentitaj kun kio valoroj? Yeah? Vi havas nomon kiel studento. Kion alian pruvas tipa studento havas? Spektantaro: [inaudible] DAVID J. Malan: Do, pardonon. Publiko: Aĝo. DAVID J. Malan: An o naskiĝtago ekvivalente, Yep. Kion alian? Publiko: ID numeron? DAVID J. Malan: Do IRU nombro, eble telefonnumero, eble dormejo, aŭ domo, aŭ altlernejo, aŭ io simila. Ajna numero de pecoj de datumoj kiuj vi havu en via kontaktolisto Estas kion povus difini studento. Do se ni volis fari tiun, en kodo, ni povus fari ion simplan kiel tiu. Ni povus havi programon por ke Havas ni diru, int main (void). Kaj se mi volas reprezenti studento mi havu, ekzemple, ŝnuro nomita nomo por tiu lernanto, ŝnuro nomita dormejo por tiu lernanto, eble int nomata ID por tiu studento. Kaj ĉar mi uzas ĉenon, mi bezonas iri returne, kaj starigu cs50.h. Eble mi tuj bezonas stdio.h. Do lasu min preemptively fari tiujn kaj mi estas tuj nomas tiun student.c nuntempe kaj savi tion. Kaj nun mi povas fari ion kun ĉi tiuj variabloj. Kaj ni ĵus tuj skribi ke kiel komento en pseŭdo kodo, ĉar ĝi ne estas interesa kion ni faru nun. Bone, do ĉi estas programo kiu iel stokas studento. Kion mi volas fari se mi volas konservi du studentoj? Do mia unua instinkto tuj esti bone, atendu minuton, se mi havas alian studenton kial ne mi nur faru ŝnuron nomo 2, kordoj dormejo 2, int id2. Kaj ni faris iritaj malsupren ĉi vojo antaŭ kaj kio estis nia solvo al kio ŝajnas esti afabla de hackish kopion pasto laboron tie? Publiko: Tabelo. DAVID J. Malan: Yeah, Ni povus uzi tabelo. Dekstra tiu tre rapide iĝas maloportunaj. Vi devas ordigi de arbitre komenci enoficigi ĉiuj de ĉi tiuj variabloj. Kaj vi, la homo, devas konservi spuri ke OK Nomo 2 respektivas kun dorm2 korespondas kun id2. Ĝi nur iĝas salaton. Do estas multe pli facile, memoras de antaŭ kelkaj semajnoj, nur devi nomita kordoj nomoj kaj eble doni nin tri el tiuj. Kaj tiam eble ni havas string dormejoj kaj havas tri el tiuj, aŭ kun konstanta, int ids kaj havas tri el tiuj. Sed eĉ nun tiu sentas iom fuŝa, dekstre. Ni parolas pri studentoj kaj tamen Mi vere logxado sur la malalta nivelo efektivigo detaloj. La studento estas nomo kaj dormejo kaj ID. Kial mi ne simple deklaras variablon nomita studento kaj nomas ĝin s. Kaj se mi volas alia studento, kial ne mi simple nomas ĝin t. Aŭ se mi volas tutan faskon de studentoj, kial ne mi simple diri mi havas tuta klaso de studentoj, kaj estas tri de ili. Alivorte, kial mi ne povas veni supren kun mia propra datumtipo, nomita Studentoj, interne de kiu estas nomo, estas IRU, estas dormejo, estas ajna nombro da aliaj kampoj. Kaj ĝi rezultas vin povas fari precize tion. Do C havas ĉi trajto nomita struct. Ke estas lingvo karakterizaĵo kiu nin permesas fari ĝuste tion. Mi tuj iros antaŭen kaj malfermu structs.h kien ni iras, por rigardi la sekvante difino de lernanto. Rezultas - kaj ĉi tiu estas eĉ simpla ol la unu implikante ID antaŭ momento. Se vi volas veni kun via homemade datumtipo, kaj krome al int, kaj char kaj flosi kaj ĉiuj tiuj aliaj kiuj ekzistas, vi povas fari tion per laŭvorte skribanta typedef struct, tiam iuj krispa krampoj, ene de kiu vi listigi la variabloj vi volas asocii kun ĉi tiu nova kutimo datumoj tajpas kiel nomo kaj dormejo, kaj tiam post la krispa krampoj vi doni nomon al la nova datumtipo. Do, ekzemple, studento. Kaj kio estas agrabla pri tio estas ke nun se ni rigardas la responda kodo, la kongreso, unua de ĉiuj, estas meti tiun en dosiero nomita ion skalara h, header dosiero, kiun ni havas ne komencis uzi mem tro multe. Sed ni tuj komencos uzante sufiĉe nun. Kaj kion ni povas fari kun tio, finfine, en tiuj malmultaj linioj de kodo estas deklari ĝuste ke datumtipo, studento. Kaj nun ni uzas ĝin. Mi tuj iros en dosiero nomata structs1.c. Kaj ni rigardu la kelkaj karakterizaĵoj tie. Do la aĵoj supren tie estas plejparte familiara, kaj ni revenu al kio ne familiara en nur momento. Tiu kompreneble estas inkludita mia propra kaplinio dosiero, kiu estas nova tiel, krom pset 3 kie, revokon, ni havas helpers.h. Do vi eble memoras #include helpers.h. Kial tamen mi uzas citilojn anstataŭ angulajn krampojn? Kiam mi elektas inter ili? Preskaŭ ĉiam mi ŝajnas uzi angulaj krampoj. Kaj tiam, subite sur linion ses Mi uzas citiloj. Kial povus esti? Yeah? Spektantaro: [inaudible] DAVID J. Malan: Tio fakta, kio? Publiko: Jen via IDE. DAVID J. Malan: Yeah, jen en mia fakta IDE. Kaj ni ne logxas en la IDE, ĉar tio estas nur ilo kiu mi uzas. Jen en mia nuna dosierujo, specife. Do structs.h estas mia propra dosiero ne instalita en la IDE, en la mastruma sistemo mem, prefere ĝi estas en mia aktuala dosierujo. Do la konvencio estas se vi volas inkluzivi vian propran kaplinio dosiero, vi simple uzi citiloj. Kion ni nomas tion en linio 8, ĝenerale parolanta? Jen kio? #define ion. Ĉi reprezentas konstantoj, dekstra? Se vi volas havi valoron en via programo ke vi uzas tutan faskon da fojoj, ĝi estas bona konvencio al faktoro ĝin, montros, kun la hash simbolo difini, tiam, per konvencio, en ĉiuj majuskle word-- kvankam ĝi ne estas strikte necesa, sed ĝi estas homa konvencio kapitaligi konstantoj por ke ili elsaltos ĉe vi visually-- spaco kaj tiam la valoro vi volas esti ekvivalenta al tiu konstanta nomo. Neniu punktokomo, sed vi simple sekvi tiun skemon tie. Do kion mi faras en ĉi fakta kodo. Do ni rigardu la ĉefa programo tie. En linio 12 ĉar mi inkluzivis structs.h, Mi nun havas magie ĉe mia dispono nova datumtipo. Mi ne nur havas aliron al int, kaj char, kaj kaleŝego, kaj ŝnuro, kaj blua kaj aliaj. Mi nun havas aliron al studento datumtipo. Do en linio 12, mi kombinante du ideas-- unu kutimo datumtipo kaj du, uzante tabelo. Kaj tiel en tiu programo se Mi volas reale apogi tri malsamaj studentoj en mia programo, mi povas simple diri al mi variablon nomata lernantoj, ĉiu el kiuj estas de tipo studentoj, kiuj Estas mia kutimo datumtipo. Kaj, specife, al mi tri el tiuj en mia tabelo. Do nun kion ni faras en ĉi tiu programo? Ĉi tie estas nur por buklo ripetanta de 0 al 3, ĉar tio estas kio la valoro de studentoj estas. Mi nur instigante la uzanto donu al mi la studenta nomo. Kaj poste en linio 17, ni havas plejparte familiara linio. Ni havas nian malnovan amikon GetString dekstre. Kaj kio peco de sintakso estas ŝajne nova, se vi neniam planita en C antaŭe, kaj neniam uzis la structs? Yeah? Publiko: La .name. DAVID J. Malan: La .name. Sed ĉi tio ne estas tro bona salto, ĉar nun studentoj heligas i donas vin la ia studento. Kaj se vi volas plonĝi ene de tiu strukturo, vi simple uzi ununuran periodo kaj tiam la nomo de la variablo interne, aŭ la proprieto ene ol vi deziras akiri aliron al. Simile do se mi tiam instigas la uzanto, donu al mi la studenta dormejo, Vi povas simile stoki ke ŝnuro en la dormejo variablo interne de tiu studento strukturo. Kaj nun aĵoj iom imago. Kaj tiu tuj serĉos ĉe eble multe tute baldaŭ. Sed vi vidos ĉi multe pli en pset 4, do ni nur rigardeto nun. Ĝi rezultas ke en linio 23 tra 38 Kion vi pensas ke mi eble faras? Mi forigis la komentojn por hodiaŭ, sed la versio de la kodo linio por referenco havas cxiujn komentojn. Kion mi ŝajnas esti faranta? Publiko: Savante la dosieron kun ĉiuj la informoj kiujn la uzanto eniris. DAVID J. Malan: Yeah, ĝuste, ĉi estas nova vojo ke ni vidas du, alia karakterizaĵo de C, per kiu mi povas krei mian propran dosierojn. Tiel ege, preskaŭ ĉiu programo vi skribis estas sennacia. Apenaŭ ĝi estas farita kuri, tio estas ĝi. Mankas memoro aŭ rememoro de ĝi. Mankas dosiero savita. Sed se vi volas savi eniga kiu havas okazis, kiel en ludo aŭ programo tiel, ĝi rezultas ni povas fari tion. Kaj vi vidos tion pli en pset 4 kaj sur Sekcio. Sed ĉi tiu linio 23 esence kreas dosiero nomata students.csv. Kaj vi eble vidis tion antaŭe. Eĉ se vi neniam studis CS antaŭe, CSV estas komo-disigita variabloj. Estas kiel tre povrulon versio de Excel dosiero, kio signifas, ke ĝi povis esti malfermita en Excel kaj en Apple Nombroj, kaj ĝi havas vicoj kaj kolumnoj. Sed ĝi ne estas mallibera formato kiel Microsoft aŭ Apple. Estas nur komoj disigante la valoroj kiujn ni vidos en momento. Kaj nur preni diveni. En linio 23, je la tre Fine, mia dua argumento al tiu nova funkcio nomita f malfermita por dosiero malferma estas w. Kio povus w signifi? Yeah? Spektantaro: Ĝi ebligas verki al la dosiero? DAVID J. Malan: ĝi ebligas vi skribas al la dosiero. Do ekzistas kelkaj variantoj ke ni povas konekti ĉi tie. Sed se vi nur volas legi la dosieron, kiuj estas rigardi ĝin kaj legis ĝin en memoro, vi nur uzu citaĵon unquote "r". Se vi volas skribi al la dosiero, vi uzu citaĵon unquote "w". Ekzistas ankaux append kaj paro de aliaj aĵoj se vi volas modifi ekzistantajn dosierojn. Nun ni tuj daŭre vidas ĉi aferon, tiam ni revenos al linio 24. NULL, tio rezultas, estas speciala valoro kiu povas esti resendita fare certaj funkcioj se iu iris wrong-- se la dosiero ne ekzistas, se vi elĉerpas de memoro, aŭ aro da aliaj eraroj. Sed nuntempe, ni nur supozas ke ĉi estas nur konvencia eraro kontrolanta. Tie en linio 26, mi ripetanta de 0 al 3 super ĉiuj miaj studentoj. Kaj jen estas ia speco de nova funkcio, fprintf, sed nur preni diveni. Se printf estas ĵus presita formatan kordoj, kion fprintf probable signifas? Publiko: Printu al dosiero. DAVID J. Malan: presi formatitan kordoj al dosiero. Tion la aldonaj f rimedoj estas dosiero. Kaj la nova unua argumento devas esti la variablo kiu reprezentas vian dosieron. Tiam ni simple havi formaton ŝnuro simple kiel printf. Kaj eĉ se tiu sintakso estas nova, tiu simple signifas ŝtopi en la studenta nomo, plug-in la studenta dormejo, kaj tiam kun fclose, fermi la dosieron. Kaj tiam lastly-- ĉi novas kaj ni revenos al tiu antaŭ long-- Mi liberigante la studento por kialoj kiu okazis super tie. Sed ni revenos por ke antaŭ long-- jen pro kiel GetString estas fakte laboras sub la kapuĉo. Do ni prenu rapidan rigardon tie. Se mi tajpas ls en mia dosierujo, rimarkos ke mi ne faras havi dosiero nomata students.csv, nur ne ekzistas, ne ekzistas. Do se mi nun kompili tiun programon, fari structs-1,. / structs-1, kaj mi tuj iros antaŭen kaj entajpu Andi, kiu loĝas en Berkeley ĉe Yale. Ni tuj devas Rob kiuj vivas en Thayer tiuj tagoj. Kaj ni venis supre kun kie estas, mi pensas, Maria estas en Mather, se mi memoris korekte. Do nenio ŝajnas okazi. Sed se mi tajpas ls nun, ekzistas students.csv. Ni iru antaŭen kaj malfermita students.csv. CXi tiun jam tre malpeza dosierformato. Sed mi simple adoptis konvencio ke mi havas du vicoj kaj kolumnoj tie. La unua kolumno estas popola unua nomoj. La dua kolumno estas la studenta dormejo, aŭ kolegio, aŭ domo, aŭ whatnot. Kaj nun mi savis tiun konstante en dosiero. Do estas ne cxiuj interesaj. Sed tio estas nur ŝtupo nun por povi persisti informo konstante. Do ni vidu, kion diras pli ni povas fari kun tiuj kaj aliaj karakterizaĵoj. Sed unue, demandojn? Tio estis multe, kaj tio estis rapida. Sed vi vidos multe pli en pset 4, ankaŭ. Yeah? Spektantaro: Ĉu ekzistas maniero daŭrigi aldonante nomoj al tiu dosiero? DAVID J. Malan: Bona demando. Ĉu ekzistas maniero por daŭrigi aldonante nomoj al tiu dosiero? Jes. Kaj, fakte, se vi finas supren remalfermo la dosiero, vi uzus citaĵo unquote "al" por append, kiu ĵus aldonas nova linio, nova linio denove kaj denove, precize. Bona demando. Aliaj demandoj? Yeah? Publiko: Se vi kuris la programo denove nun, ĉu teni aldonante nomoj al la dosiero aŭ ĝi estus malfermi novan dosieron? DAVID J. Malan: Ha, bona demando. Se vi kuris la programo denove pravas nun, eble entajpis novajn nomojn, ĉu aldoni al la dosiero aŭ anstataŭigi la dosieron? La lasta, ĉar mi estas Ne uzante append modo. Kaj ĉar mi estas nur blinde malfermante la dosieron por skribado, Ĝi simple tuj anstataŭigi la dosieron. Do mi ja devas fari estas append, se mi volas vere havas longdaŭran datumbazo. Nun CSV estas utila, sincere, eĉ cxar kiel se vi estas writing-- kaj ni eventuale vidi ĉi poste en la semestro kiam ni uzu CSVs por aliaj celoj. Se vi volas konservi ĉiujn la homoj kiuj registris por iu evento, aŭ subskribis supre por via studento grupo, aŭ io simila, stokante la datumoj en tiu speco de formato estas super oportuna. Ĉar laŭvorte, se mi estis elŝuti tiun dosieron. Mi povus double-- kaj ni vere provi tion se mi havas Excel aŭ Nombroj tie. Mi tuj dekstra-klako aŭ kontrolo alklaku mia dosiero. Whoops. Dekstra-klaki aŭ kontrolo alklaku mia dosiero. Venu, mia muso ne kunlaboranta. Download-- mi tuj elŝuti ĉiujn dosierojn tie tiel nur do mi povas ekpreni ĉi tiu. Kaj ni vidos se ĉi verkoj students.csv-- unuafoje Mi jam aktivigita. Nun ili volas vidi miajn kontaktojn. Nun, mi devas enregistri. Vidu kiel facile estas uzi CSVs? Jes, gardu ĝin ĝis dato. OK, Nun ni estas pretaj por klaso. OK, ho, kio novas? OK, proksima. Tio estis magia. OK, nun ni devas ĝisdatigi. Kaj nun, ĝi forgesis kion file Mi origine malfermiĝis, sed kion a-- tie ni iras. Bone, do nun ni havas Excel dosiero. Dankon. Bone, do kion mi faris estis la facila parto. Kompreneble mi povus havas pre-instalita Excel aŭ Nombroj, aŭ kion ajn programo. Sed tio estas agrabla, ĉar nun mi povas manipuli la datumojn en norma formato. Do nun ni kunteksto ŝanĝi al kie ni cxesis lasta tempo, kiu estis funkciigi demeti trejnado radoj. Sed unue, Vi ne vidu ĉi frua tagmanĝo Ankaux estas okazanta ĉi tie ĉe la fajro kaj Glacio en Kembriĝo, sitar en New Haven. Registriĝi sur CS50s retejo ASAP aliĝi CS50 studentoj kaj personaro. Do ni prenis trejnado radoj ekstere lunde kiel follows-- ŝnuro estis deklarita en CS50s biblioteko por iu tempo. Kaj ĝi estas bela, ĉar ĝi permesas nin paroli pri variabloj kiel estante kompletaj vortoj kaj frazoj kaj pli. Sed rezultu kordo ne ekzistas. Tio estas simple sinonimo, aŭ alias, ke ni kreis por iu kiu fakte estas iom pli teknika nomita char *. Kaj efektive, ni vidis ekzemplon de programo lunde kiu ne kondutas tute kiel ni atendis. Tio estis la dosieron, komparu-0. Kaj memoras ke kompari-0, se Mi rekompili lundo la programo kaj kuri kompari-0 kaj entajpu panjon en minuskle, kaj panjo en minuskla denove. La programo insistis mi tajpu malsamajn aferojn, kvankam panjo, ĉiuj en minuskle, estas identa vide. Do kio estis la mallonga respondo Kial la komputilo pensas tiuj du kordoj estas malsamaj? Yeah? Spektantaro: [inaudible] DAVID J. Malan: Ĝuste. Do, panjo, unuafoje Mi tajpu ĝin en, Estas estanta stokis ie en mia komputilo memoro sed en malsama loko ol la dua fojo mi tajpas en panjo. Nun certe povus esti optimumigita. La komputilo povis esti inteligenta kaj realigi tiujn du kordojn, hej, ili estas identaj. Nur mi ne redunde stoki ĝin. Sed komputiloj ne faros tion optimumigo se vi ne diros al ili. Do, implicite, ili estas nur tuj finos en du malsamaj lokoj en memoro. Kaj tiel esti pli klara, kiam ni komparas la du kordoj, la unua estis nomita s, la dua estis nomata t, kio specife estis mi komparante tie sur linio 13? Yeah. Spektantaro: Ĝi estas la loko en memoro ke la variablo indikos al. DAVID J. Malan: Ĝuste, mi trovis komparante la loko en memoro ke tiuj variabloj indikis. Do konkrete, se panjo estis ĉe bajto numeron 1, kaj 2, kaj 3, kaj 4-- ĉar memori la backslash 0 bezonas esti tute fine. Kaj la alia petskribo de panjo, E-o-m, Estis ĉe Adreso 10, 11, 12, kaj 13. Mi komparis 1, tiu adreso, ke loko en memoro, kontraŭ 10, kio estas evidente ne la samaj. 1 ne 10. Do tiu estas bela en tiu ĝi estas bela simpla. Sed estas problema mezuro ni ne povas ŝajni kompari kordoj. Do fundamentally-- kaj je tiu malalta nivelo, se vi volis implementar programon por kompari du apartajn vortojn, ke la uzanto entajpis por kvalito, do ili laŭliniigi char por char, nur en ĝeneralaj terminoj, kion ni devas fari, ŝajne? Ĝi ne estas sufiĉa nur por rigardi tiujn du adresojn. Kion ni devas fari? Yeah? Publiko: persisti tra la kordoj [inaudible]. DAVID J. Malan: Yeah, ni persisti tra la kordoj. Ni uzos por ciklo, momenton buklo, aŭ ajn vi estas plej komforta kun. Kaj se ni havas du kordojn ie en memoro, ni rigardu ĉiu la unua signo, do ĉiu estas dua karaktero, tiam tria kaj kvara, kaj kvina, ĝis ni trafis kio specialaj sentinelo valoron? Spektantaro: [inaudible] DAVID J. Malan: Yeah, la backslash nulo, ĉe kiu punkto en ĉu kordo ni povas decidi kiuj estas ĝi. Ĉu ni kongruis ĉiu ununura karaktero? Se ne, reveni falsaj. Se jes, revenu vera. Kaj tiel tio estas ĝuste kio ĉi versio de la programo komparas-1.c faras. Estas identa al kion ni rigardis lundo krom ke mi liveris de la vorto ĉenon kvankam kiu havas neniun funkcian impact-- ĉiuj Mi faras nun forigado iuj vida trejnado radoj, sed vidi klare ke s kaj t estas adresoj. Kaj tio estas kion la stelo, la asterisko, ĝi reprezentas estas adreso, alie konata pli teknike kiel puntero. Do kiam mi deklaras s sur linio 9 kaj diri char * s, tio ne signifas al mi ŝnuro. Tio signifas doni al mi variablo kies celo en la vivo estas por stoki adreson. Ĉar mi intencas meti la Adreso de kordo en ĝin. Kaj efektive, GetString, esti klara, ne revenas kordo. Ĝi ne revenas panjon backslash nulo, por se. Kion GetString specife kaj precize reveni? Spektantaro: [inaudible] DAVID J. Malan: An adreson, la Adreso de la unua karaktero en iu kordo ĝi alvenis. Kaj tial nun ni vidas speciala ŝlosilvorto denove. Kaj, mi aludis al tiu pli frua. Ĉi tuj estos bona konvencio ke ni vidos denove kaj denove nun. Mi kontrolanta por certigi ke s ne nula kaj t estas ne nula. Ĉar bazita sur mia vere rapida mencio antaŭe, kio povus signifi se GetString revenas ne adreson sed N-U-L-L, kiu estas denove, iuj specialaj valoron? Publiko: Eraro. DAVID J. Malan: Estas eraro. Io misokazis. Kaj kio tipe povus okazi, speciale kun strings-- kiu povus esti de nekonata longo en advance-- eble la komputiloj ' el memoro, eble vi entajpis tia longa vorto aŭ frazo aŭ almetita tia grandega eseo tie estas nur ne sufiĉe memoro. Kaj tiel GetString ne povas reveni la adreso de la tuta afero, do ĝi nur redonas nenion. Kaj ĝi diras eraro okazis per reveno la specialan nulan valoron. Ĝi estas la nula adreso, por tiel diri. Nun ĝi rezultas C venas kun funkcio kiu faras ke ripeto. Ni ne devas apliki tion kun por buklo aŭ momenton buklo mem. Ni povas uzi funkcio, vokis koncize, moveti comp, aŭ ŝnuro kompari, kies celo en la vivo estas fari ĝuste tion. Vi donas al ĝi du punteros, du adresojn, kaj ĝi iros al tiuj adresoj kaj poste kompari literon por letero por letero por kvalito, haltante nur kiam kio estas vera? Kiam intuicie reekbruligu comp ĉesas ripetanta, nur por esti klara? Kiam kolizias backslash 0 en ĉu kordo, ĉe kiu punkto ĝi povas decidi havas ĉiu parigitaj, aŭ jam tie estis discrepancia? Do, se ni kuras ĉi nun kaj provu nia malgranda capitalización ludo, Tiel faro kompari-1, ./compare-1, kaj tajpu panjo en minuskla ambaŭ fojojn. Nun estas la sama afero. Kaj se mi faros ĝin denove kun minuskle kaj tiam eble majuskle. Nun ĝi ja distingas inter majuskloj kaj minuskla. Do finfine ne malmoligu magiaj, sed tio nun klarigi kio okazas sub la kapuĉo. Do kio pli povas ĉerpas el tiu speco de lecionon? Do ni rigardu tiun. Mi tuj iros antaŭen kaj skribi rapida programo tie nomita kopio-0. Kaj nun ni iru antaŭen kaj reale ni faru this-- kun kopio-0, rigardu kion mi havas ĉi tie. Mi unue diri al la uzanto, diru ion. Tiam mi ricevas cxeno kaj mi gardis ŝin en s. Tiam mi kontrolu se s egalas egalas NULL, simple reveni 1. Do tio estas nur norma eraro kontrolanta. Nenio interesa okazis. Kaj fakte, se ni forigi la eraran kontrolanta, tio aspektas kiel semajno 1 kodo nuntempe. Sed mi komencis ricevi iom pli bone pri tio. Nun en linio 16, antaŭ unu semajno, eble eĉ paron tagoj aŭ minutoj, vi eble dirus linio 16 estas kreante variablo nomita t kaj kopiado s en ĝin. Kaj tio estas perfekte racia takeaway. Sed esti pli preciza nun. Kio okazas en linio 16? Kio estas akiranta kopiita de dekstre maldekstren? Yeah? Spektantaro: Ĉu t ricevi adreson de s? DAVID J. Malan: Ĝuste, t estas akiranta la adreso de s. Do esti klara nun, se mi iros revenigu frua ekzemplo kaj Mi nudigos afero mi jam tajpis en. Kaj kion mi tajpis in-- jen s, kaj tie Tion mi jam tajpis en ie en memoro, panjo kaj tiam backslash 0 kiu estas aldonita por mi. Kion mi stokitaj en tie, memoras, ĉi estas ĉe situo 1, 2, 3, 4, tiu estas kio estas nuntempe en s. Do se sur linio 16, mi diras al mi alia variablo nomas t kaj vendejo tra la valoro de s, kio gets stokita tie ne faros panjon sed prefere nur la numeron 1. Do se ni rigardas antaŭen en tiu programo nun, kio okazos? Do rimarki ke ekzistas tiu funkcio vi eble uzis tiun antaŭ kelka tempo Cezaro, aŭ Vigenère, aŭ eble ne. Mi asertas per mia printf, mi estas tuj kapitaligi la kopion t. Unue en linio 19, rapida prudento kontrolu, strlen ĉekojn la longo de t. Ĉar mi ne volas provu kapitaligi ion se estas neniu kordo tie. Se la uzanto nur batis Enter, nenio estas kapitaligi. Do mi ne volas fari linion 21. Do linio 21 estas kapitaligado kiu litero, ŝajne, en t? Publiko: m? DAVID J. Malan: Aspektas kiel ĝi estas kopiado kiu unu? Publiko: m. DAVID J. Malan: Uh, m. Bone, do la unua m, ĉar rimarkos ke mi pasante al toupper, kiu se vi neniam vidis ĝin estas nur funkcio por kapitaligi kiel ĝia enigo. t krampo nulo signifas doni mi la nul karaktero de t. Kaj tiel kiel faras tiu bildo ŝanĝo, esti klara? Kio bezonas get reskribita aŭ ŝanĝita kun respekto al s kaj t kaj panjo backslash nula. Spektantaro: [inaudible] DAVID J. Malan: Yeah, do ĉi tiu tie simple bezonas get ŝanĝis to-- ripari this-- bezonas get ŝanĝis al ĉefurbo m. Sed rigardu poste en la programo, se mi presi s kaj t kiel mi purigas tie, spekti kio estas okazos presi el s kaj t. Do fari kopion-0, ./copy-0. Lasu min kaj tajpu en panjo en ĉiuj minuskla. Rimarku kaj la originalan kaj la kopio estis kapitaligita. Kial? Nu, s kaj t estas ambaŭ montrante, se vi volas, la sama bloko de memoro. Kaj sincere, tiu fariĝas vere uninteresting-- la fakto ke ni uzas adreson nulo tie. Mi volas diri, mi ne vere zorgas kie aĵoj estas en memoro. Pardonu min viŝante iom tro multe. Sed mi ne vere zorgas kie ajn estas en memoro. Kaj do, ĝuste kion programistoj emas pensi pri estas ke kiam oni parolas pri adreson, aŭ puntero, kiu zorgas kie ĝi estas en memoro. Ne gravas se ĝi estas je bajto aŭ unu miliardo. Mi nur zorgas ke ĉi variablo estas efike montrante ke bloko de memoro. Do, de nun, anstataŭ quibble super arbitra memoro adresojn, ni nur komenci desegni punteros kiel punteros, kiel sagoj. Do kion s kaj t vere estas, laŭ tiu ĉi programo, pro kiel mi kreis t, estas nur du apartaj variabloj fingromontrante la sama bloko de memoro. Kaj ni ne zorgas kie ili estas. Do ni povas abstraktajn for tiun detalon. Do kiel mi riparos tion? Se mi volas skribi version de la kopio programo kiu fakte kopias la kordo kaj capitalizes nur la Kopio, ĝuste intuicie, kio estas alvenis al esti Ingredienco por nia solvo? Spektantaro: [inaudible] DAVID J. Malan: Ni bezonas kion? Publiko: Bloko de memoro. DAVID J. Malan: Ni bezonas alia bloko de memoro, ĉu ne? Ni ne scias kiel fari ĝin ankoraŭ, nepre. Sed mi specon de bezonos tio okazu tiel ke la originala panjo en minusklo finas en tiu ekstra eron de memoro. Kaj poste kiam mi ŝanĝas la kopion, mi ne volas ŝanĝi tiun kopion tie. Mi anstataŭe volas ŝanĝi nur tiun Kopio tiel ke la originala estas neŝanĝita. Do, ni vidu kiel ni povus fari tion. En kopio-1, kiu havas jam estis senvestigita de komento, sed estas diritaj en linio. Ni anstataŭe fari la following-- tiuj linioj estas identaj, Akiri min kordo kaj nomas ĝin s. Sed nun ni rigardu unu el niaj plej kompleksaj sed la lasta de la komplekseco dum kelka tempo, linio 16 faras ĝuste tion. Do se via comfy kun la bildo ni nur drew-- donu al mi novan eron de memoro, kopii ĉion en ĝi, ni vidu kiel ni tradukas ke al kodo. Do linio 16, sur la maldekstra flanko, char * t donas mi ĉi skatolon tien. Tio estas ĉio faras. Sur la dekstra flanko, m alloc, aŭ malloc, estas memoro atribuo, súper eleganta, kamufla vojo simple dirante donu al mi eron de memoro. Kiom memoro ni bezonas? Nu, estas speco de granda esprimo. Sed ni vidu kion diras tie. Do tiu, kompreneble, estas doni min la kordo longo de s. Do, panjo ĝi devus esti kio? Do nur tri, ĉu ne? panjo estas tri karakteroj. Vi ne kalkulu la backslash nulo kiam paroli pri la longo de kordo estas fakte la homa videblaj literoj. Do panjo, do tio donas al mi 3. Sed atendu momenton, mi nun aldonas 1. Kial mi fakte volas asigni 4 bajtoj kaj ne nur 3? Yeah? Publiko: Por la sentinelo valoron? DAVID J. Malan: Ĝuste, por ke sentinelo valoro. Por la backslash nulo, Mi bezonas 4 bajtoj entute. Do mi bezonas la longo de la kordo plus 1. Kaj tiam simple por bono measure-- kvankam en ĉi tiu sistemo, ĝi estas ĉiam tuj estos 1-- mi dirante multobligi tion per la grandeco de char. Rezultas sizeof estas operatoro en C kiu nur informas vin la nombro de bitokoj tio postulata por certa datumtipo. Ĝi ne funkcias por arrays, tipe, kelkfoje faras. Sed en la ĝenerala kazo, ne. Sed ĝi diras min kiom da bajtoj oni char estas, kio rezultas estas ĉiam 1. Do tiu estas kiel multiplikante per 1. Do súper kripta rigardas linio de kodo. Sed ĉiuj ĝi faras estas donas mi eron de memoro. Sed sxajnas esti kopianta ion en tiu memoro? Ankoraŭ ne. Kaj tiel kion mi sur linio 22, kaj 23, 24, 25, nu, mi simple fari tion. Kaj ĉi tiu estas speco de malnova lernejo havajxoj nun. Jen kiel pset 2, kie vi nur rampajxoj ĉirkaŭe en memoro, aŭ prefere en kordoj. Do mi ripetanta de 0 al la longo de la kordo s. Kaj mi kopiante la ia karaktero en s en la ia karaktero en t. Kaj ĉar mi, la programisto, faris Nepre rezervu precize kiel multaj bitokoj kiel mi bezonas, estas perfekta unu-al-unu rilato. Kaj mi kopiu panjon en minuskla al la nova. Kaj poste persiste, mi faras tiun linion. Kaj tiel la efiko estas nur kapitaligi ĉi t tie. Do multe sorbi, sed se vi nur pripensu kio vere okazas sur sub la kapuĉo estas nur movanta tiujn bajtoj ĉirkaŭe, ĉiuj kiuj bezonas solvi ĉi tiun problemon estas Nur donu al ni tiun eron de memoro. Nun riskante blindiga, lasu min montri unu alia ekzemplo, ke estas preskaŭ identa, krom ĉi tiu linio de kodo. Do tiu estas la hacker versio de tiu programo, se vi volas. Sed ni nur distili ĝin kio okazas. Linio 24 kutimis esti ĉi t krampo i ricevas s krampo i. Nun, mi ŝanĝas tiun al la multe pli kripta stelo t plus 1 egalas stelon s plus 1. Do kio okazas kaj kial ni havas stelon karaktero? Ni vidis la stelon antaŭ kaj ĝi estas uzata alimaniere tie. Ni antaŭe vidis char *, nun mi vidas stelo komence, kaj tio estas okej. Ĉar ĝi rezultas nin povas ia konkludi nur de tiuj unuaj principoj kio okazas. Do nur por esti klara, kio estas s? Pasintsemajne, estis ŝnuro. Tio ne sufiĉas plu. Kio estas s, specife? Spektantaro: [inaudible] DAVID J. Malan: ĝi estas puntero. Ĝi estas la adreso de la unua karaktero ni entajpis. OK, kio estas t? Spektantaro: [inaudible] DAVID J. Malan: La Adreso de la unua bajto en t, tiu bloko de memoro reallocated. Do rezultas ke kiam ni persisti de 0 sur ĝis la kordo length-- unue, mi dividu je 0, ĉar de tiu malnova lernejo por buklo afero. Do simple por simpleco, ni supozi ke la unua linio de kodo Estas vere nur tiu, dekstre. Se i estas nulo, aldonante nulo al io supozeble ne tuj havos efikon. Do kio estas tiu parolo? Ĝi rezultas ke la stelo operatoro en tiu kunteksto estas la dereference operatoro, kiu estas nur fantazio maniero diri iri al la jena adreso. Do se s estas la adreso de la unua karaktero en tiu bloko de memoro, * s signifas iri tien. Kaj ĉar ni tiris la bildo en ĉi tiu maniero, vi povas adopti la sekvante mensa modelo. Se tiu estas s, kaj vi diras * s, * s ia kiel chutes kaj ŝtupetarojn, se vi memoras la ludo de infanaĝo, estas kiel sekvas ke sagon kaj iru al la adreso. * t estas la sama afero. Do komencu tie, iri al lia bloko. Mi ne povas simple desegni sur tiu ekrano tiel. * t signifas iri tien. Kaj tiam, la por buklo estas ĝuste dirante movas tiu karaktero tie, movi ĉi karaktero tie, movi ĉi karaktero tie. Sed kiel mi faras tion incrementation? Mi bezonas malfari kion mi ĵus forigita. Tiu estas kio ĝenerale nomis puntero aritmetiko, kiu signifas math kun adresoj. Se, en ĉi por buklo, Mi tenas pliigante i, kaj s estas adreso kaj t estas adreso, se mi daŭre aldonante 1, ke nur signifas teni movas antaŭen, kaj plue kaj plue en la memoro. Estas kiel Oxford Street, la strato ke la CS konstruaĵo estas sur. La CS konstruaĵoj estas ĉe 33 Oxford Street. Do se vi estus fari 33 Oksfordostrato plus 1, kiu alportas vin al 34 Oxford Strato, tiam 35 Oksfordostrato, tiam 36 Oksfordostrato, kion ajn tiuj konstruaĵoj vere estas - se ili ekzistas. Kaj do, jen ĉio ni faras tie kun puntero aritmetiko. Do estas súper arcano vojo de esprimi nin. Sed cxio, kio estas okazanta sub la kapuĉo estas nur sekvante tiujn adresojn, kiel sekva mapon, se vi volas, aŭ sekvante sagojn kiel ni tirita sur la ekrano. OK, multe digesti. Ajna demando sur sintakso, konceptoj, punteros, malloc, aŭ simile. Yeah, ĉi tie unue. Publiko: Do ​​kie tiu diras * t egalas toupper * t, estas ke tuj kapitaligi ĉiuj leteroj aŭ just-- DAVID J. Malan: Ha, vere bona demando. Do en ĉi tiu linio tie, 31 estas tiu iranta kapitaligi la unua litero aŭ ĉiuj de la literoj. Do ni respondu ke irante reen al unuaj principoj. Kaj komencaj elementoj tie mi signifas nur iri al la bazaj difinoj de kio implikita. Do toupper estas funkcio ke capitalizes char. Tio estas ĉio. * t signifas iri al la first-- iri al la adreso en t. Do, en la bildo, se tiu estas la statu de memoro ni asignitaj kun malloc, kaj tio estas t, * t signifas iri tien. Dume, vi pasanta ke valoro, minuskla m al toupper, vi fariĝas reen ĉefurbo M, kie vi incitas ĝin? Vi metas ŝin en tiu sama loko. Kaj tiel per tiu logiko de tiuj bazaj difinoj estas nur kapitaligi la unuan literon krom se vi persisti kun i aŭ por buklo aŭ momenton buklo, ĝi ne tuj fari ion pli ol vi demandas lin. Bona demando. Yeah? Publiko: Kial vi uzas la dereference metodo prefere ol la tabelo? DAVID J. Malan: Ha, bona demando. Kial vi uzas la dereference metodo anstataŭ la tabelo metodo? Neniu aparta kialo, por esti honesta. Kaj, fakte, por tio speco de ekzemplo, dekstra, Mi nur argumentante farante la programo pli komplika, pli okuloj glazing super, homoj estas kontrolanta ĉar tio aspektas súper arcano, sed kvankam ĝi estas faranta la saman aferon. Do, sincere, tiu estas nenecese vide kompleksa solvo al la problemo. Ĝi estas ankoraŭ bona dezajno, kvin el kvin por dezajno, ĉu ĝi estas en la krampo skribmaniero aŭ la montrilon skribmaniero. Sed- speciale kiam ni atingos poste en la kurso en pset 5 kiam ni planas akcepti vortaro ke Mi jam menciis kelkajn times-- ni vere zorgas pri la malalta nivelo memoro adresoj ke ni vere komprenu Kio okazas. Sed, nuntempe, ĝi rezultas ke ĉi linio de kodo tie rektaj krampoj ne vere ekzistas. Ili estas kio nomiĝas sintaksa sukero, kiu estas nur strange malvarmeta maniero diri la tradukilo konvertas kvadrataj krampoj esti ke matematika esprimo. Do estas homa konvencio por povi ĝuste skribi tiuj tre uzantamika krampoj. Sed kion la tradukilo, Clang, estas vere faranta ajna tempo vi skribas kion oni reliefigis en linio 24, sub la kapuĉo estas vere konvertado al tiu. Estas nur pli plezura kiel homa legi kaj skribi kodon kiel linio 24. Sed fine tiuj trejnado radoj tro elspezas kiam onia propra komforto ricevas pli forta. Bone, do memoras tiam ke tiu estis la speco de plej granda problemo ni eniris. Kaj tio estas kio ekfunkciigis tiun tutan malbenita konversacio pri punteros, kaj adresojn, kaj kopiado aferojn. Ĝi estis ĉar ni stumblis ĉi stulta, stulta demando, per kiu Mi implementado logically-- kun Lauren tie supre en la demo kaj la oranĝa suko en la milk-- perfekte algorítmicamente korektan funkcion por interŝanĝi du variabloj ' valorojn, sed la malbenita afero ne havis ajnan persista, aŭ permanenta, efekto sur mia kodo. Kaj kial tio okazis? Unuvorte, kial ĉi efektivigo de interŝanĝo logike ĝusta, sed havas neniun efikon sur la variabloj kiuj estas pasitaj al ĝi, kiel x kaj y por ĉefa? Kio estis la esencon de la afero? Yeah? Publiko: Ĉar variablo faris kopioj de variablo en la enirpermesilo tra funkcio. DAVID J. Malan: Ĝuste, kiam vi pasos variablojn en funkcio, aŭ argumentoj en funkcio, ili estas preteriris kopion, kiu signifas vi ricevas identan rigardanta mastro de bitoj por ambaŭ x kaj y, nomata tie a kaj b. Kaj vi povas fari ion vi volas kun tiujn kopiojn, sed ili tuj devas ne efikon sur la voko funkcio. Kaj, fakte, ni tiris ke bildo en la ekrano, revoko lasta tempo, per kiu se vi vere pensas pri kio estas daŭriganta sub la hood-- se tiu estas via komputilo memoro, kaj cxi tie estas la eron de memoro uzata por ĉefaj, tiu estas la eron de memoro uzata por interŝanĝi, kaj tiel eĉ se ĉefa havas du variabloj, x kaj y, interŝanĝa havu identaj rigardanta valoroj, kiuj ambaŭ estas 1 kaj 2, sed ili estas tute malsamaj pecoj de memoro. Do ni bezonas solvon al tiu. Kaj sincere, ĝi similus ke ni nun havas solvon al tiu problemo, dekstre. Se ni nun havas la kapablon manipuli aferojn pere de adresoj kaj, ia chutes kaj ŝtupetarojn stilo, sekvu tiujn sagoj kaj iri ie ni volas en memoro, ni ne povis solvi tiun problemon pasante de ĉefa interŝanĝi Ne la valorojn ni deziras interŝanĝa, sed nur intuicie kion ni povus pasi por interŝanĝi anstataŭe? [Intermetante VOĈOJ] DAVID J. Malan: Kial ni ne simple fordoni la adresoj, ĉu ne? Kial ni ne donu interŝanĝa a trezoro mapo, se vi volas, kiu kondukas lin al la efektivaj valoroj x kaj y. Ni swap, fakte ŝanĝi tiuj originalaj bitoj, prefere ol nur pasanta kopiojn de la bitoj. Kaj do, fakte, tio kio estas tuj estos la solvo. Tiu versio estas ĉi tie klare malbona kaj misa. Kaj nun, unuavide, ĝi nur aspektas kiel ni aldonis aron da steloj hazarde kaj transiris nia fingroj ke estus kompili. Sed, estus nun kompili. Sed ni vidu kion tio signifas. Kaj, bedaŭrinde, la aŭtoroj de C povus esti elektinta alian simbolon fari ĉi iom pli klara, sed la stelo operatoro havas malsamajn signifojn en du malsamaj kuntekstoj. Kaj ni jam vidis ambaŭ, sed ni distingi. Do supren al la supro tie, kiam mi ŝanĝis al kaj b plu int a en la malbona versio por int steloj, a kaj b, antaŭe, estis entjeroj. Kio estas a kaj b nun en la bona, verdaj versio? Ili estas adresoj. Adresoj de kio, esti klara? Adresoj de entjeroj. Do la fakto ke mi estas dirante int stelo rimedoj tiu estas la adreso de entjero, specife. Do nun rimarkas en la linioj de kodo, io alia ŝanĝis tro. tmp restas la sama, ĉar ĝi estas nur la intertempa entjero, neniu memoro magio tie. Sed nun bezonas stelon. Kaj, fakte, ĉiu alia mencio de a kaj b, rimarki ke ĉiuj tio ŝanĝante de ruĝa al verdo estas ke mi prefiksi tiuj variabloj kun steloj. Ĉar mi ne volas kopii kaj b. Ĉar se mi nur kopii kaj b kaj swap a kaj b, kion mi fakte interŝanĝante? Nur adresoj, mi volas interŝanĝi kio estas ĉe tiuj adresoj. Mi volas iri tien. Kaj tial la stelo operatoro interne de mia funkcio, Ne interne de la parametro listo, signifas vin iri al tiuj adresoj kaj reale ŝanĝi tiujn valorojn. Do kio faras la foton aspekti anstataŭe. Nu, se anstataŭ mi pasante enen por A kaj B ne 1 kaj 2-- Mi vere bezonas aldoni unu alia difino tie. Do supozu ke tiu bloko de memoro estas je loko 10. Jen ĉe situo 11, sed ĉi estas iom de simplificación, Mi nun havas du elektojn mi pasas x kaj y aŭ ĉu mi pasas iliajn adresojn? Se mi pasas iliajn adresojn ŝatas tion, mi nur nun bezonas implementar interŝanĝa po verdan kodo tiel ke kiam ĝi vidas kaj kiam vidas b, ne nur kopii kaj b kaj movi la lakto kaj oranĝa suko. La lakto kaj oranĝsuko metaforo nun rompiĝas, ĉar tiuj estas tasoj de likva kaj ne mapojn. Ni anstataŭe bezonas iri alparoli 10 kaj ni bezonas iri alparoli 11, kaj tiam elfaro swapping logiko. Do la logiko estas la sama, sed ni bezonas iomete malsaman vojon de aliranta tiuj variabloj. Kaj tiel en la fino, kion la programo devas aspekti estas tiu. En swap.c laŭvorte kopiita kaj almetita verdan versio. Sed mi bezonas fari unu ŝanĝo. Ĝi ne estas sufiĉa nur por ŝanĝi interŝanĝa. Kio alia linio de kodo do mi devas ŝanĝi? Yeah? Spektantaro: Kie faras la argumentoj. DAVID J. Malan: Kie ĝi prenas lian argumenton. Do se mi rulumu supren al ĉefa, mi ne povas simple pasas en x kaj y, kaj mi promesas, la lasta peco de nova sintakso hodiaŭ. Mi bezonas Iam en ne x kaj y sed la adreso de x kaj y. Kaj ĝi rezultas, la simbolo ke la aŭtoroj de C elektis estas se vi uzas simbolo tie, ne esti konfuzita kun la bitlarĝa ampersand, se vi uzas simbolo tie kaj-simbolo tie, ĉi ciferojn por vi, kio estas la adreso de x, Eble estas 10, kio estas la Adreso de y, eble estas 11, kaj pasas tiujn en anstataŭe. Do multe sorbi ĉiuj samtempe. Sed ni vidu nun rapide en niaj ceteraj kvar minutoj kie aferoj povas iri malbone. Kaj kiel flanken, reale Mi prenis tiun bildon, TF prenis tiun foton jaro aŭ du antaŭe. Do tiu estas la malantaŭa angulo de Eliot Dining Hall. Montriloj estas eble la plej malfacila temo kiun ni kovros en CS50. Do se vi maltrankvilas la speco de deklivo estas kiel eble estas pli de hockey bastono kiel tiu, realigi ni ia proksimiĝas pinto en laŭ la koncepta komplekseco. Tiam mi suprenirigis ĉi foto, ĉar mi ĵuras al dio, en aŭtuno 1996, kiam Mi prenis CS50 kun mia instruado ulo, Nishat Mehta, li sidigis min en la angulo de la Eliot D. Hall super lunĉo, aŭ vespermanĝo, aŭ io por provi helpi min kompreni punteros. Kaj tiu estas kie mi estis semajnojn post ĝi estis enkondukita en prelego kiam Mi fine komprenis punteros. Kaj mi estas esperema ke ĉi klakos multe pli frue por vi. Sed realigi ĉi absolute inter la pli kompleksaj temoj ni rigardis. Sed estas inter la plej potencaj. Kaj kiam vi ricevas ĝin, ĝi estas vere ĉiuj nur tuj fine kunfluas. Do estu certaj ĝi ne bezonas ĉiuj profundiĝi en hodiaŭ. Do jen la lasta programo ni tuj rigardi. Kaj ni tuj finos kun rapida tri minutoj de Claymation farita de nia amiko, Nick Parlante. Jen programo, ke sur la supraj du linioj deklaras variablon x kaj y. Ambaŭ estas adresoj de entjeroj, AKA punteros. Ni tiam asigni sufiĉan memoro por stoki int kaj stoki la adreson de tiu memoro en x. Do, estas eĉ pli simpla ol la ekzemplo antaŭe. Donu al mi kvar bajtoj de memoro, tio estas la grandeco de int, kaj metis tiun adreson en x. Tiu linio tie signifas iri al la adreso en x kaj metis la signifon de vivo, la numero 42 tie. Sed tiu linio maltrankviligas min. Star y signifas iri al la adreso en y, kaj metis la malbonŝanca numero 13 tie. Kial estas danĝera, ĉe tiu punkto en la story-- kvankam rapide rakontis en nia velkantan minutoj here-- kial malbona por mi diri, iru al la adreso en y? Spektantaro: Vi ne havas [inaudible]. DAVID J. Malan: Mi ne meti ion en y. Do kio estas la valoro de y, ĉe tiu punkto en la rakonto? Ni ne havas ideon. Estas iuj rubo valoro kaj nek Binky scias. Se ni povus fini sur tiu noto. [VIDEO reprodukto] -Hey, Binky, veki. Estas tempo por montrilo amuza. -Kio estas tio? Lernu pri punteros? Ho, Goody. -Well, Por komenci, mi supozas ke ni estas tuj bezonas paron punteros. -BONE. Tiu kodo allocates du punteros Kiu povas indiki al entjeroj. -OK, Bone mi vidas la du punteros, sed ili ne ŝajnas esti indikante nenion. -Tio Pravas. Komence Pointers ne indikas ion ajn. La aferoj oni indikas estas nomata pointees kaj fiksante ilin estas aparta paŝo. -Ho, Dekstra, rajto. Mi sciis tion. La pointees estas apartaj. Do kiel vi rezervu pointee? -OK, Bone ĉi kodo allocates nova entjero pointee, kaj tiu parto aroj x atentigi al tio. -Hey, Kiu aspektas pli bone. Do fari ion. -OK, Mi dereference la puntero x por stoki la numero 42 en ĝian pointee. Por tiu lertaĵo, mi bezonas mian magian bastonon de dereferencing. -Your Magian bastonon de dereferencing? Uh, ke, tio estas granda. -Ĉi Tio estas kion la kodo aspektas. Mi ĵus instalis la nombro kaj-- [POP SOUND] -Hey, Rigardu tien iras. Do, farante dereference sur x sekvas la sago por aliri lia pointee. En tiu kazo, por stoki 42 en tie. Hej, provu uzi ĝin stoki la nombro 13 tra la alia puntero, y. -BONE. Mi simple iri tien al y, kaj akiri la numero 13 aro supren. Kaj tiam preni la sceptron de dereferencing kaj just-- [Zumilo SOUND] -Ho, Hey ke ne funkciis. Diru, uh, Binky, mi ne faras pensas dereferencing y estas bona ideo, ĉar opcio ĝis la pointee estas aparta paŝo. Kaj mi ne kredas ke ni iam faris. -Hmm, Bona punkto. -Yeah, Ni asignitaj la puntero, y, sed ni neniam starigis ŝin atentigi al pointee. -Hmm, Tre observema. -Hey, Vi serĉas bonan tie, Binky. Ĉu vi povas ripari ĝin tiel ke y punktoj al la sama pointee kiel x. -Sure, Mi uzas mian magian bastonon de puntero farita. -is Ke tuj estos problemo, kiel antaŭe? -No, Ĉi tio ne tuŝas la pointees. Ĝi nur ŝanĝas unu montrilon atentigi al la sama thing-- [Krevanta SOUND] --as alia. -Ho mi vidas. Nun y punktoj al la sama loko kiel x. Do, atendu, nun y estas fiksita. Ĝi havas pointee. Do vi povas provi la sceptron de dereferencing denove sendi la 13 pli. -Ho, Bone, ĉi tie iras. -Hey, Rigardu tion. Nun dereferencing verkoj sur y. Kaj ĉar la punteros dividas ke oni pointee, ili ambaŭ vidas la 13. -Yeah, Interŝanĝado, uh, ajn. Do, ni tuj ŝanĝos lokojn nun? -Ho, Cxu ni estas el la tempo. -But-- -por Trovi memoras la tri montrilo reguloj. Nombro 1, la baza strukturo estas ke vi havas puntero, kaj notas super al pointee. Sed la montrilo kaj pointee estas apartaj. Kaj la komuna eraro estas starigi puntero sed forgesi doni ĝin pointee. Numero 2, pointer dereferencing komenciĝas je la montrilon kaj sekvas lian sagon super aliri lia pointee. Kiel ĉiuj scias, ĉi nur funkcias se Estas pointee, kiu ia ricevas reen regi numero 1. Numero 3, pointer asigno prenas unu puntero kaj ŝanĝas ĝin al punkto al la sama pointee kiel alia puntero. Do post la farita, la du montriloj indikos al la sama pointee, kelkfoje ke nomiĝas interŝanĝo. Kaj jen ĉio estas al ĝi, vere. Bye-bye nun. [FINO reprodukto] DAVID J. Malan: Estas tio por CS50. Danke al profesoro Nick Parlante. Ni vidos vin proksima semajno. [ELECTRONIC MUSIC Ludante]