>> [MUZIKO Ludante]
DAVID J. Malan: Bone.
Jen CS50, kaj ĉi Estas la fino de Semajno Kvar.
Kaj unu el la temoj hodiaŭ estas tiu de cifereca jura,
La arto de rekuperi informon.
Kaj efektive, kvankam vi estas en la mezo
nun de Paco ĉe Tri kaj Breakout, la proksima semajno,
la fokuso estos sur ĝuste tiu domajno.
>> Do unu el la malvarmaj laborpostenoj mi iam havis estis reen en postdiploma lernejo,
kiam mi laboris por la loka Middlesex County District Attorney La
oficejo, farante jura labori.
Do esence la Masaĉuseco Ŝtata Polico, foje,
kiam laborante en kazoj farus konduku aĵojn kiel malmolaj diskoj
kaj disketojn kaj kartoj de memoro kaj similaj.
Kaj ili transdonos ilin mi kaj mia mentoro,
kaj nia celo estis trovi provojn, se estis iu, pri tiuj komunikiloj.
Nun, eble vi vidis ekvidojn de tiu mondo de jura
en la amaskomunikiloj, televido kaj kino.
Sed la tasko mi havis, kaj daresay tiu mondo,
ne estas tute kiel vi vidus ĝin.
Ni rigardu kion vi probable vidis.
[VIDEO Playback]
-OK.
Nun, ni akiras bonan rigardon ĉe vi.
>> [MUZIKO Ludante]
>> -Hold Ĝin.
Kuri ke dorso.
>> -Wait Minuton.
Iri dekstren.
-There.
Frostigi tion.
-Full Ekrano.
>> -OK.
Frostigi tion.
-Tighten Sur tio, ĉu vi?
>> -Vector En sur tiu ulo de la malantaŭa rado.
>> -Zoom En ĝuste ĉi tie sur ĉi tiu loko.
>> -kun Rajtas teamo, la bildo povas esti pligrandigita kaj akraj.
>> -Kio Estas tio?
>> -ĝi An plifirmigo programo.
>> -Can Vi certe ke ĝis neniu?
>> -Mi Ne scias.
Ni plibonigi ĝin.
>> -Enhance Sekcio A6.
Mi plibonigis la detalon, kaj-
-Mi Pensas ke estas sufiĉe por plibonigi.
Ĵeti ĝin al mia ekrano.
>> -Mi Plibonigita reflekto en ŝia okulo.
-Let Run ĉi per video plibonigo.
>> -Edgar, Vi povas plibonigi ĉi?
>> -Hang Plu.
>> -Mi Estis laborante en ĉi tiu interkonsiliĝo.
>> -There De ies reflekto.
>> -Reflection.
-There Estas spegulbildo de la homa vizaĝo.
>> -la Reflekto!
-There Estas reflekto.
-Zoom En la spegulo.
Vi povas vidi reflekto.
>> -Can Vi plibonigi la bildon de ĉi tie?
-Can Vi plibonigi ĝin?
-Can Ni plibonigi ĉi?
-Can Vi plibonigi ĝin?
-Hold Je sekundo.
Mi plibonigos.
-Zoom En la pordo.
-Times 10.
-Zoom.
-Move En.
-More.
-Wait, Halti.
-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?
>> -Maybe Ni povas uzi la Pradeep Singh metodo vidi en la fenestrojn.
>> -la Programaro estas stato de la arto.
>> -la Ajgeno estas malŝaltita.
>> -kun Dekstre kombino de algorithms--
>> -li La prenita lumigado algoritmoj por la sekva nivelo,
kaj mi povas uzi ilin plibonigi tiun foton.
>> -Lock Sur kaj disvastigu la z-akso.
>> -Enhance.
Plibonigi.
-Enhance.
-Freeze Kaj plibonigi.
[FINO VIDEO Playback]
DAVID J. Malan: Do tiuj estas ĉiuj vortoj, sed ili ne estis
uzata en frazoj korekte.
Kaj efektive en la estonteco, ajna momento, bonvolu, vi aŭdas iun diri la vorton,
"Plibonigi" kluketo malmulta.
Ĉar kiam vi provas plibonigi, Ekzemple, tiu estas kio okazas.
>> Do jen belega foto.
Jen CS50 propra Daven.
Kaj supozu ke ni volas enfokusigi en la sekundo en la okulon,
aŭ la reflekto de la malbona ulo, kiu estis klare
kaptita de la ĉambro de sekureco.
Jen kio okazas kiam vi zomi sur bildo kiu
havas nur finia nombro de bitoj asociita kun ĝi.
>> Tio estas kion vi ricevas.
Kaj efektive, en Daven okulo estas nur kvar, eble ses rastrumeroj
kiuj formas precize kion Estis glimante tie.
Do Problemo Ara Kvar finfine havas Esplorante tiun mondon, aparte
nature ion ni nomas dosiero i / o, kie
i / o estas nur ornama metodo dirante enigo kaj eligo.
>> Do ĝis nun, ĉiuj el la interagoj ni havis kun komputilo
estis plejparte kun via klavaro kaj ekrano,
sed ne tiel kun la malmola disko, aŭ ŝparado de dosieroj preter tiujn vi
vi skribas.
Viaj programoj tiel malproksime havas ne krei kaj savi,
kaj ĝisdatigi siajn proprajn dosierojn.
>> Nu, kio estas dosiero?
Nu, iu kiel JPEG.
Tiu estas bildo vi povus havi aŭ alŝuti al Facebook,
aŭ vidi ie en la reto.
Ja, tiu foto oni nur segilo de Daven estis JPEG.
Kaj kio estas interesa pri dosierojn kiel JPEG-oj
estas ke ili povas esti identigita, tipe, por iuj ŝablonoj de bitoj.
>> Alivorte, kio okazis, ke distingas JPEG de GIF
el PING el Vorto dokumento el Excel dosiero?
Nu, estas nur malsama mastroj de bitoj.
Kaj tiuj diversaj ŝablonoj estas kutime ĉe la komenco de tiuj dosieroj.
>> Tiel ke kiam via komputilo malfermas Vorto doc aŭ kiam komputilo malfermas JPEG,
ĝi aspektas tipe ĉe la unuaj pluraj bitoj en la dosiero.
Kaj se ĝi rekonas mastro, ĝi diras, ho, tiu estas bildo.
Lasu min montri ĝin la uzanto kiel grafika.
Aŭ, ho, tio aspektas kiel Word doc.
Lasu min montri al la uzanto kiel eseon.
>> Do ekzemple, JPEG-oj, rezultas, estas
sufiĉe kompleksa sub la kapuĉo.
Sed la unuaj tri bajtoj en plej ĉiun JPEG starti kun tiuj tri nombroj.
Do bajto nulo, unu kaj du estas, plej ĉiu JPEG, 255, tiam la nombro
216, tiam la nombro 255.
>> Kaj kion vi povos komenci fari proksiman semajnon
Efektive ŝovas sube la kapuĉo de dosieroj kiel JPEG-oj
kaj kiel bitmap dosierojn, kaj vidante kio ĉiam estis tie por tiel longe
kiel vi estis uzante komputilon.
>> Sed kio estas tie ne estas tipe skribita kiel dekuma nombro ŝatas ĉi.
Komputila sciencistoj ne inklinas paroli en dekuma.
Ili ne vere parolas en duuma.
Tipe, kiam ni volas esprimi nombrojn,
ni vere uzas deksesuman, kiun eble vi memoras
de, ni diru, Problemo Ara Unu, kiu defiis
vi pensi malsama sistemo.
>> Ni, kompreneble, estas familiara kun decimala, nula tra naŭ.
Ni parolis pri duumaj.
Kaj ni ne vere havas uzi ke multe ĉi tie
sur ekstere, ĉar komputiloj uzos tion.
Sed programistoj tre Ofte, sed ne ĉiam,
uzi deksesuman, kiu signifas nur vi havos 16 literojn en via alfabeto
kontraste al du aŭ 10.
>> Do kiel vi bontrovas altaj ol naŭ en deksesuma?
Vi iru 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, nur konvencio.
Sed kio estas ŝlosilo estas ke ĉiu tiuj estas sola simbolo.
Ne estas 10.
Ne estas 11, per, ĉar ĉiu viaj ciferoj, ĝuste kiel en dekuma
kaj ĝuste kiel en duuma, devus simple esti sola karaktero, per konvencio.
>> Tial do estas la alfabeto ni havas je nia dispono por deksesuma.
Do kion signifas al JPEG simila se vi estis verki tiujn unuajn tri
bajtoj ne kiel dekuma sed, Ekzemple, kiel deksesuma?
Kaj kial estas hex cxiuj tiom utila?
>> Nu, rapidan rigardon al ekzemplo.
Do se mi skribas la bitoj kiuj reprezentos tiuj decimalaj numbers--
tio povus esti iom rusta nun de kelkaj semajnoj reen,
sed la maldekstra kaj la dekstra estas sufiĉe facila.
255 estis la plej granda nombro ni povus reprezenti per ok bitoj.
Ĉio estis karaj.
Do la sola kiu estas milde Interesa estas la meza.
Kaj se vi speco de fari la math, vi deduktas ke, efektive,
ke mastro de unu kaj nuloj reprezentas 216.
Do ni nur kondiĉas por nun ke ili estas ĝustaj.
Sed kial estas tiu interesa?
>> Nu, bajto, kompreneble, estas ok bitoj.
Kaj ĝi rezultas ke se vi opinias de bajto kiel du pecoj de kvar bitoj,
kiel tiu.
Lasu min nur aldoni iun spacon.
Do antaŭ, post.
Mi ĵus aldonis kelkajn blanka spaco por videbligo la bono tie.
Kiom eble ni nun reprezentas en, diru, deksesuma ĉiu quad de bitoj,
ĉiu aro de kvar bitoj?
>> Do ekzemple, en la maldekstra Nun ni havas 1111 en duuma.
Kio estas tiu nombro en dekuma, se vi faros la math?
Vi havas la lokon de unuoj, la duope loko, la kvarpiede loko kaj la eights loko.
>> Publiko: 15.
DAVID J. Malan: Estas 15.
Do se ni faras ok plus kvar plus du plus unu, ni ricevas 15.
Do mi povus noti 15 sube 1111, sed la tuta punkto tien
estas deksesuma, ne decimala.
Do anstataŭ notante 15, 1-5, Mi tuj skribos, ke en deksesumajn,
kio se vi pensas reen, se vi havas nulo per f, kio estas 15 tuj estos?
Publiko: f.
DAVID J. Malan: Do rezultas ke la f.
Kaj vi povas labori ke el dirante, bone, se estas 10, tiam OK, f estas 15.
Do ja, ni povus reverki tiu sama aro de nombroj kiel f f.
Kaj tiam se ni faras iom de math, ni deduktas ke tio d.
Ok estas sufiĉe facila, ĉar ni havas unu en la eights loko.
Kaj tiam ni havas paron pli f f-aj jaroj.
>> Do kion homoj inklinas fari per konvencio kiam uzi deksesuman estas simple
skribi ĉi iom pli koncize, forigi plimulton de tiu blanka spaco.
Kaj simple esti súper klara al legantoj, ke tiu estas deksesuma,
la simpla konvencio inter homoj estas vi skribas nulo
x, kiu havas neniun signifon aliaj ol vida ensalutilo de,
tien venas hex nombro.
>> Kaj tiam, vi metis la du ciferojn, f f en ĉi tiu kazo, tiam d a, tiam f f.
Do longan rakonton, deksesuma simple inklinas
esti utila ĉar ĉiu de liaj ciferoj, nula tra f, perfekte linioj
kun ŝablono de kvar bitoj.
>> Do se vi havas du deksesumaj ciferoj, nulo tra F, denove kaj denove,
kiu donas al vi perfekte ok bitoj aŭ unu bajto.
Tial do inklinas esti konvencie utila.
Mankas intelektulo enhavo vere preter tio,
alia ol lia reala utileco.
>> Nun JPEG-oj ne estas la sola dosiero formatoj por grafikaĵoj.
Vi eble memoras ke ekzistas dosierojn kiel tiu en la mondo,
almenaŭ de kelkaj jaroj reen.
>> Do tio estis fakte instalita en Windows XP
sur milionojn da komputiloj ĉirkaŭ la mondo.
Kaj tio estis bitmap dosieron, BMP.
Kaj bitmap dosiero, kiel vi vidos apud semajno, nur signifas mastron de dots,
rastrumeroj kiam ili estas vokitaj, mapo sur bitoj, vere.
>> Do kio estas interesa, kvankam, pri tiu dosiero formato, BMP, estas
ke sub la kapuĉo, ĝi havas pli ol tri bitokoj
kiuj formas lian kaplinion, do paroli, la unuaj malmultaj pikoj.
Ĝi vere aspektas iom komplikita unuavide.
Kaj vi vidos tion en la P aro.
Kaj ekhavi ion aparta el tiu nun
ne estas tiel grava, kiel ĝuste la fakto ke komence de ĉiu bitmap
dosiero, grafika formato, tie estas tuta aro de nombroj.
>> Nun Microsoft, La aŭtoro de ĉi tiu formato,
inklinas nomi tiujn aferoj ne ints kaj signoj
kaj flosas sed vortoj kaj d vortoj kaj sopiras kaj bajtoj.
Do ili estas simple malsamaj datumtipoj.
Ili estas malsamaj nomoj por la sama afero.
Sed vi vidos ke en P Ara Kvar.
>> Sed tio estas nur por diri, ke se homo duoble klakas iun .BMP dosieron sur sia
aŭ ŝi malmola disko, kaj fenestro malfermiĝas supren montranta lin aŭ ŝin tiu bildo,
ke tio okazis ĉar la mastruma sistemo supozeble rimarkis ne nur
la .BMP dosiersufikso en la dosiernomo,
sed ankaŭ la fakto, ke ekzistas iuj konvencio al la ŝablono de bitoj
en la komenco de tiu bitmap dosieron.
>> Sed ni nun enfokusigi tiom komplika dosieron,
sed anstataŭe sur iu kiel ĉi tio.
Supozi tie en gedit, mi nur havi la komencoj
de programo kiu estas sufiĉe simpla.
Mi havas kelkajn inkludas ĝis supro.
Nun mi havas #include "structs.h" sed Mi revenos al tio en momento.
Sed tio estas utila por nun.
Do tiu estas programo ke tuj apliki
kiel la matrikulisto datumbazo.
Do datumbazon de studentoj, kaj ĉiu lernanto en la mondo
havas nomon kaj domon kaj verŝajne iuj aliaj aferoj, sed ni tenu ĝin simpla.
Ĉiu studento havas nomon kaj domo.
>> Do se mi volis skribi programo kies celo en la vivo
Estis nur persisti el nulo en ĝis tri,
se estas tri studentoj Harvard University.
Mi nur volas, uzante GetString, ĉiu studenta nomo kaj domo,
kaj tiam simple presi tiujn ekstere.
>> Tiu estas speco de kiel Semajno Unu, Semajno Du aferojn nun,
kie Mi nur volas por buklo aŭ io simila.
Kaj mi volas nomi GetString kelkaj fojojn, kaj tiam presi f kelkajn fojojn.
Do kiel povus mi tion faras, kvankam, kiam ambaŭ nomon kaj domo
estas implikitaj por ĉiu studento?
>> Do mia unua instinkto multobligita esti fari ion kiel tiu.
Mi povus unua diri, nu, al mi, diri, tabelo de kordoj nomita nomojn.
Kaj mi ne volas hardcode tri ĉi tie.
Kion mi volas meti tie?
Do studentoj, ĉar tio estas nur konstanta deklaris ĉe la supro,
ĝuste tiel mi ne devos hardcode tri en multnombraj lokoj.
Tiu vojo, mi povas ŝanĝi ĝin en unu lokon, kaj tio efikas ŝanĝon ĉie.
Kaj poste, mi povus fari kordo gastigas studentojn.
>> Kaj nun, mi povas fari ion kiel por (int i = 0; i <studentoj; i ++.
Do mi tajpas rapida, sed tio estas verŝajne familiara sintakson nun.
>> Kaj nun, tiu estis pli freŝa.
Se mi volas meti en la i-a studenta nomo, mi kredas ke mi faros.
Kaj tiam, ne nomoj sed domoj heligas i.
Mi faros tion, GetString kaj lasu mi reiri kaj korekti tiun linion.
Konsentas?
Malkonsentas?
Ne tre uzantamika.
Mi ne diris al la uzanto kion fari.
>> Sed nun, se mi ankaŭ volis poste, ni
diru, presi tion out-- tiom FARENDAĴOJ poste.
Mi iras fari pli kun this-- ĉi defendeble IS
ĝusta apliko de ricevas nomojn kaj domoj, tri
ili entute de ĉiu, de uzanto.
>> Sed tio ne estas tre bona dezajno, dekstra?
Kio se lernanto havas ne nur nomo kaj domo, sed ankaŭ ID nombro,
kaj telefonan numeron, kaj retadreson,
kaj eble ĉefpaĝon kaj eble Twitter tenilo,
kaj ajna numero de aliaj detaloj asociita kun studento aŭ persono,
pli ĝenerale.
Kiel ni komencos aldonu funcionalidad al tiu programo?
>> Nu, mi sentas min kiel la plej simpla maniero multobligita esti fari ion kiel, diru,
int ids studentoj.
Do mi povas meti ĉiujn liajn IDs tie.
Kaj tiam, por io kiel telefonnumerojn,
Mi ne certas kiel reprezenti ke ĝuste nun.
Do ni iru antaŭen kaj nur alvoko ĉi pepado lernantoj, kiuj
estas iom stranga, but-- kaj faskon pli kampoj.
>> Mi komencis efike kopii kaj alglui ĉi tie.
Kaj tio tuj kreskos bela _unwieldy_ bela rapide, ĉu ne?
Ĉu ne estus bele se ekzistus en la mondo datumstrukturo konata
Ne kiel int aŭ ŝnuro, sed io alta nivelo, abstraktaĵo, do
paroli, konata kiel studento?
C ne venis kun konstruita-en funcionalidad por studentoj,
sed kio se mi volis doni ĝin tia?
>> Nu, verŝajne, mi tuj malfermi dosieron nomatan structs.h tie,
kaj vi povas fari ĝuste tion.
Kaj ni tuj komenci fari ĉi nun.
Kaj sub la kapuĉo de P Ara Tri, vi jam faras tion nun.
Ne ekzistas tia aĵo kiel g rect aŭ g ovalo en la programlingvo C.
>> Folks Stanford implementado tiuj datumtipoj uzante tiu alproksimiĝo tie,
deklarante sian propran novan datumoj tipoj uzante nova ŝlosilvorto
nomata struct kaj alia nomata typedef.
Kaj efektive, kvankam la sintakso aspektas iom malsama stuff
ni vidis antaŭe, en principo, estas súper simpla.
>> Tiu nur signifas "difini tipo."
Tio tuj estos strukturo kaj strukturo
Estas ĝuste kiel ujo por multnombraj aĵoj.
Kaj tiu strukturo tuj havi ĉenon vokis nomon
kaj ŝnuro nomita domo.
Kaj ni vokos, simple por oportuneco, tiu tuta datumstrukturo studento.
>> Do la momento vi alvenas al la punktokomo, vi havas nun
kreis vian propran datumoj tipo nomita studento
kiuj nun staras apud int, kaj kaleŝego, kaj char, kaj kordo,
kaj g rect, kaj g ovala, kaj ajna numero aliajn aferojn oni inventis.
>> Do kio estas utila pri tiu nun estas ke se mi reirus
al struct 0 kaj fini ĉi efektivigo, kiun mi verkis
anticipe tie, rimarki ke ĉiuj la nepra messiness ke
estis ekironta okazas kiel mi aldonis telefonnumerojn kaj pepado kaj ĉiuj
tiuj aliaj aferoj studento difino,
nun ĝi estas konciza enpakis kiel nur unu tabelo de studentoj.
>> Kaj ĉiu el tiuj studentoj nun havas plurajn aferojn ene de ĝi.
Tiel ke nur lasas unu demandon.
Kiel vi akiras la nomon, kaj la domo, kaj la ID,
kaj ĉion, kion estas ene de la lernanto?
Super simpla, tiel.
Nova sintakso, sed simpla ideo.
>> Vi simple indekson en la tabelo, kiel ni faris lasta semajno kaj ĉi.
Kaj kio estas klare la nova peco de sintakso?
Ĝuste., Kion signifas "iri ene la strukturo kaj akiri la kampo nomata
nomo, akiri la kampo nomata domo akiri la kampo nomita studento. "
>> Do en P Ara Tri, se vi daŭre laboras en tio,
kaj plej uloj ankoraŭ estas, rimarkas ke kiel vi
ekuzi aĵojn kiel g rects kaj g ovaloj
kaj aliaj aferoj kiuj ne ŝajnas devenas Semajno Zero, Unu aŭ Du,
rimarkas ke tio estas ĉar Stanford deklaris iujn novajn datumtipoj.
>> Kaj efektive, jen ĝuste kion ni do, tiel, en P Ara Kvar, kiam
ni komencos trakti aferojn kiel bildoj, bitmaps, kaj pli.
Do tio estas nur teaser kaj mensa modelo por kio estas por veni.
Nun, mi procrastinated iom ĉimatene.
Mi estis afabla de stranga por vidi kion Microsoft fonbildo reale
aspektas kiel hodiaŭ.
Kaj ĝi rezultas ke iu en 2006 fakte iris al preskaŭ precize
samloke foti reale kio similas ke ĉi tiuj tagoj.
La kampo estas nun iom kovrita.
>> Tiel parolante nun de bildoj, ni revenigos Daven tie
sur la ekrano kaj Nikolao, kaj simple memorigi vin
ke se vi ŝatus aliĝi nin por tagmanĝo ĉi tiu vendredo, la kapo al nia kutima retadreso
tie.
>> Do kie ni chesos lunde?
Ni enkondukis tiu problemo, ĉu ne?
Tio estis ŝajne ĝentilan efektivigo de swap,
per vi prenante du ints, oni nomas, oni nomas b,
interŝanĝi ilin, ĝuste kiel Laura faris tie sur scenejo kun la lakto kaj la akvo,
uzante provizoran variablon, aŭ malplena taso,
tiel ke ni povus meti b en kaj en b sen fari salaton de aĵoj.
Ni uzas variablon.
Ĝi nomiĝas temp.
>> Sed kio estis la fundamenta problemo kun tiu kodo en lundo?
Kio estis la problemo ĉi tie?
Yeah.
>> Publiko: Ĝi okupas pli da spaco.
>> DAVID J. Malan: Takes ĝis pli spaco, ĉar mi uzas variablon,
kaj tio estas okej.
Tio estas vera, sed mi dironta tio OK.
Estas nur 32 bitoj en la grandioza skemo de aferoj, do ne estas granda interkonsento.
Aliaj pensoj?
Publikon: ĝi nur interŝanĝas variablojn loke.
DAVID J. Malan: Ĝuste.
Nur interŝanĝas la variabloj loke.
Ĉar ajna tempo vi nomas function-- Kiam mi havis la pletoj de Annenberg
lasta tempo vi havas ĉefan sur la fundo.
Kiam vi nomas funkcio nomita swap, swap ne ricevas x kaj y,
la originalaj valoroj.
Kion faras swap get, ni asertas?
Publiko: Kopioj.
DAVID J. Malan: Do kopiojn de ili.
Do metas unu kaj du, se vi memori la ekzemplo de la lasta fojo,
sed kopio de unu kaj du kiuj sukcese interŝanĝis.
Sed bedaŭrinde la fino, tiuj valoroj estas ankoraŭ la sama.
Do ni povas vidi per niaj nova amiko, mi esperas GDB,
ke vi aŭ la TFS kaj Ca informoj havas estis gvidante vin al jene.
>> Do neniu swap recall aspektas like-- ni malfermi this-- rigardojn kiel ĉi.
Ni inicializado x al unu, y al du.
Havis aron da print f-aj jaroj.
Sed tiam, la ŝlosilo alvoko tie estis interŝanĝi, kiu
Estas ĝuste la kodo ni nur vidis antaŭ momento.
Kiu estas korekta unue rigardo, sed funkcie,
tiu programo ne funkcias, ĉar ne konstante interŝanĝas x kaj y.
>> Do ni vidas tiun, rapida varma supren tie kun GDB, oni ./noswap.
Faskon da blindiga informoj Mi forigi per Kontrolo L nun.
Kaj nun, mi tuj antaŭeniri kaj ruli ĝin.
Kaj bedaŭrinde, ke ne estis tiom utila.
Ĝi kuris la programon ene de tiu programo nomata GDB, erarserĉilo,
sed ne lasu min Poke ĉirkaŭe.
>> Do kiel mi povas reale paŭzi ekzekuto ene ĉi programo?
Do rompi.
Kaj mi povus rompi neniun linio numeron, unu, 10, 15.
Sed mi povas same rompi simbole dirante rompo ĉefa.
Kaj ke tuj starigis ripozon punkton, ŝajne ĉe linio 16 en ĉefa.
Kaj kie estas la linio 16?
Ni iru al la kodo kaj aliru noswap.
Kaj efektive, linio 16 estas la unua en la programo.
>> Do nun, se mi iru antaŭen kaj tipon kuri ĉi tempo, Enter, ĝi paŭzis.
Do ni poke ĉirkaŭe.
Printi x-- kial estas x nulo?
Kaj ignori la dolaro signo.
Tio estas nur por amatoro uzado de la programo.
Kial estas x nulo je la momento?
Yeah.
>> Publikon: ĝi paŭzis tuj antaŭ linio 16, ne vere en linio 16.
DAVID J. Malan: Ĝuste.
GDB, implicite, ĝi paŭzis ekzekuto ĝuste antaŭ linio 16.
Do ĝi ne ekzekutitaj, kiu signifas x estas de iu nekonata valoro.
Kaj ni akiris bonŝanca ke ĝi estas ion pura kiel nulo.
Do nun, se mi tajpas proksima, nun ĝi ekzekutis 16.
Ĝi atendis min ekzekuti 17.
Lasu min kaj presi x.
Ĝi estas unu.
Lasu min kaj presitaj kaj.
Kion mi vidas nun?
>> Publiko: [inaudible]
>> DAVID J. Malan: Iom pli laŭte.
>> Publiko: [inaudible]
DAVID J. Malan: Ne tute konsenton.
Do jes, ni vidas iom rubo valoro.
Nun, y estas 134514064 tie.
Nu, estas nur kelkaj rubo valoro.
Mia programo uzas RAM por malsamaj celoj.
Ekzistas aliaj funkcioj.
Aliaj homoj skribis en mia komputilo.
Do tiuj bitoj uziĝis por aliajn valorojn, kaj kion mi vidas
estas la restaĵoj de kelkaj antaŭan uzon de tiu memoro.
>> Do ne estas granda interkonsento, ĉar tiel frue dum mi tajpas proksima kaj tiam presi y,
ĝi estas inicializado al La valoro kiun mi volas.
Do nun, ni iru antaŭen iom rapida.
N por proksima.
Ni faru ĝin denove.
Sed mi ne volas trafi ĝin ĉi tie, ĉar se mi
volas vidi kio okazas interne de swap, kio estas la komando?
>> Publiko: paŝoj.
>> DAVID J. Malan: paŝoj.
Do tiu paŝas min en funkcio, prefere ol pri tio.
Kaj nun, estas iom kamufla Honeste, sed ĉi tio estas nur
diri al mi Mi estas en linio 33 nun.
Kaj ni faru tion denove.
Print temp.
Garbage valoro, negativa tiu fojo, sed tio estas nur ankoraŭ rubo valoro.
Do ni faru, print temp.
Ĝi inicializado al 1, kiu estis la valoro de x, alias al.
>> Nun, kie estas niaj a kaj x devenante?
Nu, rimarkis en ĉefa, ni nomis tiujn valorojn x kaj y.
Ni tiam preterpasis ilin interŝanĝi kiel sekvas.
X venis unue, komo y.
Kaj tiam, swap povis nomi ilin x kaj y.
Sed por klareco, estas nomante ilin a kaj b.
Sed a kaj b estas nun tuj estos kopioj de x kaj y, respektive.
>> Do se mi reirus al GDB, temp estas nun unu kaj nun estas unu.
Sed se mi faras apud nun fari print a, a jam movis super.
La lakto estis verŝita en la iama oranĝa suko de vitro, aŭ inverse.
>> Kaj se mi faras apud denove, kaj nun se mi presi kiel prudento ĉeko,
a estas ankoraŭ du, sed b estas nun unu.
Sincere, estas ankoraŭ tie.
Mi ne zorgas kion temp estas.
Sed kiam mi nun tajpas, diru, daŭrigi iri reen, nun mi estas ĉe la fino
la programo.
Kaj bedaŭrinde, x estas ankoraŭ unu kaj y estas ankoraŭ du.
>> Do kio estas la utileco de GDB tie?
Ĝi ne helpis min ripari la problemo per,
sed espereble helpos min kompreni gxin rimarki
ke jes, mia logiko pravas, sed mia kodo ne estas finfine havanta
permanentan trafon.
Do tio estas problemo ni tuj nun solvi hodiaŭ.
>> Sed ni atingos tien tra tiu.
Kordo estas mensogo.
Ĝi ankaŭ ne datumtipo kiu ekzistas en C. Estas
estis sinonimo por iu tempo por io alia,
kaj ni povas malkaŝi ke jene.
>> Lasu min kaj malfermu programo nomita komparu-0.
Kaj anstataŭ entajpi tiu unu ekstere, ni komencu marŝi tra la kodo
Mi jam skribis, sed ĝi estas nur kelkaj linioj.
Do tio estas kompari-0.
Kaj la unua afero mi faras estas prenanta linio de teksto.
>> Sed rimarki kion mi faras unuafoje.
Kio malsamas klare pri linio 21?
Efektive, atendu minuton.
Jen kopio du.
Tio estas eĉ ne la rajton programo.
Bone, spoiler garde.
Bone, do ne gravas kiu.
Tio estas la respondo al estonteco demando.
>> Jen estas kompari-0, kaj mi proksimume akiri linion de teksto.
Programo multe pli simpla.
Do tio estas simpla.
Ĉi tio estas kiel Semajno Unu, Semajno Du stuff nuntempe. string s = GetString.
Nun, mi diras ĝin denove malsupren tie.
kordo t = GetString.
Kaj tiam, la lasta afero en tiu programo, kiel ĝia nomo sugestas,
Estas mi tuj provos kompari ilin.
>> Do se s, la unua linio, egalas = t, tiam mi estas
dironta vi tajpi la samon.
Alie, mi intencis diri entajpas malsamaj aĵoj.
Do ni kompilos kaj kuri ĉi programo.
Do fari kompari nulo.
Aspektas bona.
Neniu kompilita eraroj.
>> Lasu min nun kaj tajpu ./compare-0.
Lasu min kaj diru ion : Daven kaj io: Rob.
Kaj mi tajpas malsamaj aĵoj.
Ĝis nun tiel bona.
Programo ŝajnas esti ĝusta.
>> Sed ni ruli ĝin denove.
Diru ion: Gabe.
Bone.
Eble mi batis spaco trinkejo aŭ io funky.
Ni faru ĝin denove.
Do Zamyla.
Zamyla.
Malsamaj aferoj.
Do, kio okazas?
>> Do ni havas tiujn du liniojn de kodo, GetString vokite dufoje.
Kaj poste, mi simple provas kompari s kaj t.
Sed kio vere poste okazas?
Nu, mia manskribo estas estonta tranĉa ĉi ekzemplon tiel.
Kaj ni vere ĵeti tiu super ĉi tie, ankaŭ.
>> Do ni havas linion kiel string s = GetString.
Do tio estas simple la unua interesa linio de tiu programo.
Sed kion ĉiu ĉi tiu tempo estis irante sur sub la kapuĉo?
Nu, sur la maldekstra flanko estas ŝnuro, kiu estas iu tipo de variablo,
kaj ĝi nomiĝas s.
Do mi scias, ke ĉi tiu estas uzanta memoro, aŭ RAM, en mia komputilo iel.
Do mi tuj abstrakte desegni ke kiel kvadrato.
32 bitoj, ĝi rezultas, sed pli en kiuj en la estonteco.
Kaj poste, kio okazas ĉi tie?
>> Nu, GetString evidente ricevas ĉenon de la uzanto.
Kaj GetString akiris Zamyla aŭ Gabe aŭ Daven.
Do ni elektos la unuan de tiuj, kiuj estis Daven.
Do efektive, kion GetString akiris mi en tiu unua kazo estis D-al-v-e-n.
Kaj tiam, kion alia faris Ĝi donas al mi kasxe?
Publiko: [inaudible]
DAVID J. Malan: Jes, la / 0 aŭ nula karaktero.
Do efektive donis min kordo.
Sed ni jam scias per antaŭa aspektas tiu ĉeno estas nur tabelo
de karakteroj, kaj ĝi estas eksigita de tiu speciala gardostaranto karaktero, / 0.
>> Sed se tio estas vera kaj tio estas kvadrato,
tio estas klare multe pli granda ortangulo.
Kaj efektive, tio estas, Mi asertas, nur 32 bitoj.
Kaj tio estas klare pli ol 32 bitoj, ĉar tiu estas probable
ok plus ok plus ok plus ok plus ok,
ĝuste pro bajtoj en ASCII.
Kiel la heck ni sidus Daven en tiu malgranda skatolo tie?
>> Nu, kio estas GetString reale fari?
Nu, tiu krado tie reprezentas mia komputilo memoro aŭ RAM.
Do ni arbitre diri ke se ĉiu el tiuj reprezentas bajto,
tiam ni povas elpensi ĉiun bajto kiel havanta adreso,
kiel 33 Oxford Street, aŭ 34 Oxford Street, aŭ 35 Oksfordostrato.
>> Do ĝuste kiel hejmoj havas adresoj kaj konstruaĵoj havas adresojn,
tiel faru individuaj bajtoj de memoro havas adresojn aŭ nombroj
ke unike identigi ilin.
Nu, temas arbitra.
Sed teni ĝin simpla, mi tuj uzi deksesuman nur konvencio,
sed la 0x signifas nenion alian ol "tiu estas deksesuma."
kaj mi tuj asertas, ke la "D" finas ĉe Bajto Unu en memoro.
>> Mi ja nenion alian okazas en memoro, tiel Daven atingis la unuan lokon
ĉe Bajto Unu.
Jen, do, tuj estos 0x2.
Tiu tuj 0x3.
Ĉi tuj estos 0x4.
Tiu tuj 0x5.
Ĉi tuj estos 0x6.
>> Sed unufoje vi komencas pensi pri kio la komputilo afero
sub la kapuĉo, Vi povas komenci konkludi
kiel vi, antaŭ kelkaj jaroj, cxu implementado C mem.
Kio estas GetString probable returning-- ĉar
sentas ŝatas ĝin ne reveni Daven, per,
ĉar li certe ne tuj persvadi en tiu malgranda box--
do kio GetString probable reveni?
>> Publiko: [inaudible]
>> DAVID J. Malan: La situo de Daven.
Kaj ĝi estas estinta farante ĉi ekde Week One.
Kio GetString estas vere reveni ne ĉenon, por se.
Tio estas unu el la malgrandaj blankaj mensogoj.
Ĝi revenas la adreso de la kordo en memoro, la sola adreso.
Daven vivas 33 Oksfordostrato.
Sed pli koncize, Gavin vivas je 0x1, Nomo Numero Unu.
>> Do kio akiras metita en tiu kesteton do esti klara,
estas nur la adreson de tiu ĉeno.
Do ĉiu ĉi tiu tempo, tiu estis okazanta.
Sed kion tio sugestas, je nun estas ke se ĉiu s
Estas nombro ene de ĝi, kiuj estas halti vi, la programisto,
el metante ajna nombro en ajna variablo kaj simple saltante
tiun eron de memoro?
Kaj efektive, ni jam vidos tio minaco venontfoje.
>> Sed nuntempe, tiu sentas nesufiĉa.
Se mi diras, min oni kordo, vi donos al mi Daven.
Sed vi ne vere donas min Daven.
Ĉiuj vi donos al mi estas Daven la adreso.
Kjel mi tiam scias al scienco kie Daven komencas kaj ends--
la rakonto iĝas weird-- kie Daven komencas kaj finas,
kaj tiam, la sekvantan kordo memore komenciĝas?
>> Nu, se vi disdonado mi la komenco de Daven,
esence, kiom mi scias kie la fino de lia nomo estas?
Ke speciala nula karaktero, kiu Estas des pli grava nun
se ŝnuroj sub la kapuĉo simple identigi
unike per sia situo en la memoro.
Do ĉiu ĉi tiu tempo, tio kio estis okazanta.
>> Do kiam ni rigardas nun la kodo tie klarigi
se vi farus la cimon en linio 26.
Kial Zamyla kaj Zamyla malsamaj?
Kial Gabe kaj Gabe malsamaj?
Jes, en dorso.
>> Publiko: Ili havas malsamajn direktojn.
>> DAVID J. Malan: Simple ĉar Ili havas malsamajn direktojn.
Ĉar kiam vi vokas GetString denove, kion mi faru rapide tie,
Se ĉi estas la dua linio, ŝnuro t, kiel mi faris en tiu programo,
egalas alian alvokon al GetString.
La proksima fojo mi vokas GetString, mi tuj
por akiri malsaman parton de memoro.
>> GetString estas permesita demandi la mastruma
sistemo por pli kaj pli memoro.
Ĝi ne tuj reuzi la saman ses bitokoj ĉiu ununura tempo.
Ĝi tuj akiri novajn eron de memoro, kiu
signifas t tuj akiri iu alia valoro super tie.
>> Do kiam mi faras s egalas = t, vi ne komparante
D kontraŭ ĉi kaj A kontraŭ ĉi kaj V kontraŭ tio.
Vi komparas ĉi kontraŭ tiu, kiu
sincere estas bela useful-- useless-- estas sufiĉe netaŭga, ĉar kiu vere
zorgas kie la kordoj estas en memoro?
>> Kaj efektive, ni ne havas.
Kaj ni ne tuj komenci aparte zorgado.
Nur al la punkto ke cimoj povas ŝpruci kaj sekureco minacoj povas ekesti volo
ni fakte komencas zorgi pri tio.
Do ni ripari tiun problemon.
Rezultas, vi riparu ĝin super simple.
>> Kaj ni efektive, antaŭ mi malkaŝi tion denove, kion farus
vi farus se en CS50 klaso, kaj vi devis implementar
komparo kontraŭ du ŝnuroj.
Vi klare ne povas simple uzi s egalas = t.
Sed nur logike, kiom vi komparas ĉi kordo
kontraŭ ĉi ŝnuro uzante C kodo?
Yeah.
>> Aŭdienco: Nur faru la por buklo [inaudible]
DAVID J. Malan: Perfekta.
Publiko: [inaudible]
DAVID J. Malan: Jes.
Simple por buklo aŭ dum buklo aŭ kion ajn.
Sed ĝuste apliki la bazan ideon ke se tio eron de memoro aŭ tabelo
kaj tio estas, persisti super ambaŭ samtempe.
Kaj simple kompari la literoj.
>> Kaj vi havas esti iom zorgema, ĉar vi
ne volas unu fingro iri preter la aliaj
ĉar unu cxeno estas longa ol la alia.
Do vi tuj volas kontroli tiu speciala valoro fine, nula.
Sed ĝi vere estas, la fino, tiel simpla kiel tiu.
Kaj sincere, ni ne bezonas reinventar ke rado.
Jen Version Two.
Kaj kion mi tuj diros ĉi tie estas ke anstataŭ komparante s egalas = t,
Mi anstataŭe dironta, se kordo komparo de s komo t egalas = 0.
Nun, kio kordo kompari?
>> Rezultas, estas funkcio kiu venas kun C, kies celo en la vivo
estas kompari du ŝnuroj.
Kaj stir kompari, se ni legas liajn viro paĝo aŭ dokumentaron aŭ CS50
aludo, gxi simple diri al vi ke ekscitigxo
kompari revenoj ĉu negativa numeron aŭ pozitiva nombro aŭ nulo,
kie nulo signifas ke ili estas egalaj.
>> Do nur konjekto.
Kion povus signifi se instigi kompari revenoj
negativa valoro aŭ pozitiva valoro?
Publiko: Plej granda ol aŭ malpli ol.
DAVID J. Malan: Jes, pli granda ol aŭ malpli ol.
Do se vi volas ordigi tutan faskon da kordoj en dictionary--
kiel ni volas eventuale malsupren la road-- perfektan funkcion uzi potenciale,
ĉar ĝi faros ke komparo de ŝnuroj por vi, kaj diru
vi faras venas antaŭ B, aŭ faras b veni antaŭ alfabete.
Ni povas fari ĝuste tion.
>> Kaj avizo Mi faris unu alia en ĉi tiu ekzemplo.
Kio alia ŝanĝis pli altaj en tiu ĉefa funkcio?
Char *.
Kaj cxi tiu estas alia blanka mensogo.
Ĉiuj ĉi tiu tempo, kiam vi havas estis skribante kordo,
ni sekrete reskribi ĉeno kiel char * tiel ke tin reale
komprenas vin.
>> En aliaj vortoj, en CS50.h kaj kiel ni fine vidos,
Ni faris sinonimo nomita kordo tio estas la sama afero kiel char *.
Kaj nun, scias nur, ke la *, En tiu kunteksto, almenaŭ,
signifas la adreso.
>> La adreso de kio?
Nu, la fakto, ke mi diris char *, kaj ne int * aŭ flosi *,
signifas ke char * estas la adreso de char.
Do tiu malgranda skatolo tie, alias kordo, estas vere de tipo char *,
kio estas simple fantazio maniero diri, en tiu skatolo iros adreson.
Kaj kion signifas tiu adreso aludas al?
Ŝajne, char.
>> Sed ni povis absolute havi int * kaj aliaj aĵoj.
Sed nuntempe, char * estas vere la plej simpla kaj de intereso.
Do tiu problemo tuj levi, kvankam, denove.
>> Supozi Mi malfermu tiun programon.
Vidu se nun ni povas antaŭdiri kio estas malĝusta kun tiu kodo.
Do en tiu programo, kopii-0, mi tuj iros antaŭen kaj denove vokas
GetString kaj stoki la valoro en s.
>> Kaj tiam, kial mi faras tion, kiel recordatorio de semajnoj pasinteco?
Ni faris diri ke GetString kelkfoje revenas nula.
Kion tio signifas, se GetString revenas nula?
Io misokazis.
Ĝi probable signifas la kordo estas tro granda, la komputilo el memoro.
Okazas super, super, super malofte, sed povus okazi.
Ni volas kontroli ĝin, kaj tio estas kion ni faras.
>> Ĉar ni vidos nun, se vi ne komenci kontrolanta kutime por aĵoj
kiel nulan, vi povus efektive komencos iri
al adresoj en memoro kiu estas nevalida.
Kaj vi tuj komencu indukti pli kaj pli segmentación faŭltoj.
Aŭ en Mac aŭ PC, nur kaŭzante komputilo pendigu
aŭ programo frosti, potenciale.
>> Do nun, mi asertas en kopio-0.c, ke mi Tuj kopii tiujn ŝnurojn per vojo
de la linio 28.
Kaj poste mi iros pretendi je la malsupro
ke mi iras ŝanĝi unu el ili.
>> Do rimarki ĉi.
Mi vokas nian malnovan amikon strlen.
Kaj ĝuste ekspliki en Esperanto kion ĉi linio 34 estas faranta?
Kion faras t krampo 0 reprezenti maldekstre.
Yeah.
>> Publiko: Unua karaktero de t?
DAVID J. Malan: Unua karaktero de t.
Estas tio.
Unua karaktero de t, mi volas atribui la majuskla versio
de la unua signo en t.
Do tiu estas kapitaligi la unua litero.
Kaj tiam, la lasta afero mi faras en ĉi tiu programo estas mi asertas jen
la originalo, s, kaj jen la kopio, t.
>> Sed bazita sur la rakonto ni ĵus raportis pri kio kordoj vere estas,
kio estas linio 28 vere faras, kaj kio estas
la rezultan cimon iri esti sur la ekrano?
>> Do unue, la unua demando, 28.
Kio kordo t = s vere faras?
Se ni havas sur la maldekstra mano flanko tie kordo t = s;
kiu donas al mi unu skatolo tie kaj unu skatolon ĉi tie.
Kaj supozu ĉi adreso estas 0x, diru, 50 tiu tempo, arbitre.
Kion faras ĉenon t = s faru sub la kapuĉo?
>> Publiko: [inaudible]
>> DAVID J. Malan: ĝi stokas la memoro alparoli tie, tiel 0x50 iras tien.
Do se nun mi iras al la unua karaktero en t kaj majuskloj ĝi,
kion mi efektive faris al s?
Mi vere fari la samon, dekstra?
Ĉar se Adreso 0x50-- kaj justa, mi malmuta ĉambro sur la tabulo tien,
sed supozas ke tio estas 0x50 malsupren tie, ie en mia komputilo la memoro.
>> Mi, ekzemple, Gabe en minuskla tie, kiel tiu.
Kaj mi diris t krampo 0 prenas majusklon.
Nu, t krampo 0 estas la unua letero en t.
Do eta g tuj fariĝi granda G. Sed la problemo
estas, kion tio s ankaŭ notas al?
>> Aŭdienco: La sama.
>> DAVID J. Malan: La sama ĝusta afero.
Tiel simpla klarigo eble, eĉ se la sintakso estas iom stranga.
Do ni faros.
Faru kopion-0 kaj tiam ./copy-0.
Diru ion: Gabe.
Kaj bedaŭrinde, ambaŭ ili nun estis majuskle,
sed por ke subkuŝanta tial ke ni estas simple
nun kontraktanta kun adresoj.
>> Do kiel ni komencas address-- neniu pun intended--
Kiel do ni komencos trakti tiu aparta problemo?
Nu, en copy1.c, aferoj iras akiri iom pli komplika.
Sed mi asertas, ke ekzistas koncepte simplan solvon.
>> Tiel malfacile akiri unuavide.
Ne tuj estos facila por la unua tempo vi tajpas ĝin, eble,
sed se la problemo estas ke simple faranta t = s simple
kopioj la adreson, kio, denove se mi povas preni sur vin,
tuj estos la solvo por vere kopiado ĉeno?
>> Publiko: Ni probable uzi buklo denove.
>> DAVID J. Malan: Jes.
Do ni tuj bezonas buklo denove.
Kaj ĉar se ni volas kopii ŝnuro s en alian ĉenon,
ni probable volas fari ĝin karaktero de karaktero.
Sed la problemo estas, se tio estas origine s,
Nun ni bezonas komenci eksplicite atribuante memoro por t.
>> En aliaj vortoj, ni redesegni ĉi tiu lasta tempo.
Se tiu estas kordoj s = GetString.
Kaj ni metu ĉi tien, tiel.
Jen GetString.
Kaj poste, la bildo de iu kiel kiu tuj estos kiel antaŭe,
g-a-b-e- / 0.
Tio aspektas iom io tiamaniere.
Kaj s do ni nomas tiun 0x50, kaj ke tuj estos 51, 52.
>> Do tiu estas 0x50.
Kaj poste, mi faras ĉenon t.
En memoro, tio simple tuj donu al mi iom kvadrata ŝatas ĉi.
Do kio estas la ŝlosilo paŝo nun?
Se mi volas kopii s en t, kio blank Kion ni bezonas plenigi ĉi tie?
Aux kion ni bezonas faru al alta nivelo?
Yeah?
Iu?
Yeah.
>> Publiko: Ni bezonas [inaudible].
DAVID J. Malan: Jes, ni bezonas plenigi tion malplena.
Mi ne povas kopii kaj tiam capitalizar Gabe nomon
ĝis mi petos la mastruma sistemo alian eron de memoro
tio estas almenaŭ same granda kiel la originala.
Por ke nin lasas kun demando.
>> Kjel mi petos la mastruma sistemo ne nur por simpla iom pointer--
kiel tio nomiĝas, estas adreso, oni pointer-- ne
por simpla malgranda skatolo kiel tiu nomita ĉeno?
Kjel mi petos la mastruma sistemo por granda bloko de memoro?
Tiel nun, mi nur alvenis ke reen malrekte nomante GetString.
Do kial GetString inkluzive alvenante lia memoro?
>> Nu, ĝi rezultas ke ne estas tiu alia funkcio ĉi tie
ke ni nun komencu uzi.
Nun, tio aspektas vojon pli kamufla than-- kaj mi estas la sola kiu povas vidi it--
tiu linio aspektas vojon pli kamufla tiam devus unuavide.
Sed ni turmentus ĝin aparte.
>> Sur la maldekstra flanko, mi havas char * t.
Do en angla, ni komencu formuli taŭga frazoj en teknika ĵargono.
Do tiu estas atribuo de variablon de tipo char * nomas t.
Nun, kion signifas tio vere signifas?
>> Nu, tio signifas, kion mi tuj meti en tiu variablo nomita t?
Adreso de char.
Do tio estas nur la simpla, pli racia maniero
priskribi la maldekstra flanko.
Do kiu kreas ĉi skatolon tie nur.
Do la dekstra flanko supozeble, tuj
destini ke granda eron de memoro kiel?
Do ni turmentus tiu aparte.
>> Ĝi estas abrumadora unuavide, sed kio okazas interne tie?
Unue, ekzistas malloc, kiu estas ŝajne nia nova amiko,
"Memoro destini."
Do tio estas la argumento aprobotaj en ĝin, do ĝi estas iom granda argumento.
Do ni turmentus tiu aparte.
>> strlen de s kompreneble reprezentas the--
Aŭdienco: La nombro de karakteroj.
DAVID J. Malan: Ĝuste la nombro de signoj en s.
Do la longeco de s, la originalo kordo.
Do G-a-b-e.
Do estas probable kvar en tiu kazo.
Kial mi faras +1 post nomante strlen de s?
Publiko: [inaudible]
DAVID J. Malan: Por speciala nula karaktero.
Se vi demandas min kio estas la longo de Gabe nomon, mi tuj diros kvar.
Sub la kastris, kvankam mi bezonos ke kvina bajton por la nula karaktero.
Tial do mi faras la +1.
>> Nun ĉiaokaze vi kuras ĉi programo en komputilo escepte, diru,
la CS50 aparaton, kie la grandeco de char
povus esti malsama de miaj propraj computer--
Rezultas ke mi povas nomi ĉi operatoro sizeof, simple peti la komputilon,
kio estas la grandeco de char en tiu komputilo?
>> Kaj multiplikante kvin en tiu Ekzemple per la grandeco de char, kiu
en plej komputiloj nur unu, malloc
tuj rezervu por mi tiu granda eron de memoro super tie dekstre.
Kaj tuj return-- estas function-- do estas
tuj revenos mi, kio?
Aŭdienco: La adreso?
DAVID J. Malan: La adreso de kio?
Publiko: De la memoro ĝi destinis?
DAVID J. Malan: De la memoro gxin destinis.
Do mi ne havas ideon, sincere, kie tiu tuj finos.
Mi tuj proponas ke ĝi tuj finos en 0x88.
Tute arbitra, sed ie escepte 0x50,
ĉar la mastruma sistemo, kio Windows kaj Mac VIN fari por mi,
certiĝu ke ĝi estas donante Min malsamaj pecoj de memoro RAM.
>> Do ĉi tio estas la valoro kie ĉi eron de memoro povus fini.
Do jen kion finas ĉi tie, 0x88.
Do nun klare, mi povas kompreni ke tio ne estas la sama kiel tiu,
ĉar ili fingromontrante malsamaj blokoj de memoro.
Do se mi nun vere volas kopii ĉi en, ni faru viajn proponis solvon.
>> Ni simple iru, krei por buklo, kaj fari t krampo i akiras s krampo i.
Ĉar mi nun povas uzi tiu tabelo simila skribmaniero,
ĉar kvankam malloc tre genéricamente atribuas al mi memoro,
memoro estas nur apudan bajtoj.
Bajto, bitoko, bajto, malantaŭo al malantaŭo al dorso.
>> Mi povas certe kiel programisto trakti ĝin kiel tabelo, kiu
signifas mi povas uzi tiun fine familiara skribmaniero de nur kelkaj kvadrataj krampoj.
>> Do lasu min paŭzi tie, ĉar tio estas multa ĉiuj samtempe, eĉ
kvankam la baza ideo recap estas tiu linio, ĉiu ĉi tiu tempo,
ne estas nova datumtipo mem.
Estas nur tiel nomataj montrilo, adreso de gravulo,
kiu signifas nur estas nombro ke per homa konvencio
Ni emas skribi kiel 0x ion.
>> Sed estas nur nombro, kiel 33 Oxford Street,
kio okazas al esti la CS konstruaĵa adreso.
Demandojn pri tiuj detaloj?
Yeah?
>> Publiko: Kial ni kontrolu por t egalas Nula?
>> DAVID J. Malan: Kial ni kontroli t egalas Nula?
Se ni legas la documentation-- grandan question-- por malloc,
ĝi tuj diros en fajna print, kelkfoje malloc povus reveni nula,
ĝuste kiel GetString.
Kaj efektive, GetString revenas nula se, laŭvice, malloc revenas nula,
ĉar GetString uzas malloc.
>> Kaj tio eble okazus se la VIN, Mac OS, Vindozo, kio ajn, simple
el memoro por vi.
Do jen kio okazis tie.
>> Kaj lasu min malkaŝi unu alia afero kiuj povus simple forblovi menso
aŭ plene estos malproksima super la linio.
Sed lasu min eltiri supren la sama por buklo por kopiado,
kiuj antaŭ momento, recall estis ĉi. t krampo i akiras s krampo i.
>> Nice kaj uzanto-amika.
Sentas Semajno Du denove.
Sed tiu versio efektive povas esti reskribita kiel tiu, kiu aspektas kamufla.
Estas tekniko nomita montrilo aritmetiko, adreso aritmetiko.
Sed kial tio funkcias?
>> Nun annoyingly, La aŭtoroj de C decidis uzi
la * simbolo por malsamaj celoj.
Ni vidis gxin uzata fojon jam, char *, kiu signifas "doni al mi variablo
ke tuj enhavos la adreso de char ".
Do char * en tiu kunteksto signifas "doni al mi variablo."
>> Bedaŭrinde, se vi uzas la * sen vorto antaŭ ĝi, kiel signo,
ĝi nun nomata la dereference operatoro.
Kaj ni vidos pli de ĉi antaux longe.
Sed ĝi nur signifas "iri tien."
Estas kiel diri: se iu enmanigis al mi sur peco de papero "33 Oxford Street"
se mi faras "* 33 Oxford Street," kiu signifas "Iru laŭ la vojo al la CS konstruaĵo."
>> Do * simple signifas iri tien se ne estas vorto antaŭ ĝi.
Do kio estas t, esti klara?
t estas la adreso de la eron de memoro kiu estis redonita al mi.
s estas la adreso de kio, por esti klara, en la ekzemplo ni estis diskutante,
de minuskla Gabe?
s estas la adreso of--
Aŭdienco: La ŝnuro.
DAVID J. Malan: De Gabe originala nomo.
Do estas la adreso de tio eron de memoro.
Do se mi diras t + i-- i, avizo, Estas nur nia malnova amiko.
Estas nur indekso variablo ke estas ripetanta el nulo sur supren
la longo de la kordo s.
Do tuj estos nulo, tiam, poste du, poste tri, kvar.
Do ni invitu tiujn novajn Scratch-kiel puzlo pecoj, se vi volas,
kvankam, denove, la sintakso Estas multe pli arcano ol Scratch.
Do t estas adreso + i tuj donas al mi
numero, ĉar tiuj estas ĉiuj numeroj kiuj ni estis desegno kiel deksesuma.
Sed ili estas nur ciferoj.
>> Do se la adreso de t ni diris Estis 0x88, kio estas 0x88 plus nulo.
Eĉ se vi ne estas komforta kun hex tamen prenu diveno.
>> Aŭdienco: La originala.
>> DAVID J. Malan: Ankoraŭ 0x88.
Do kion signifas * 0x88 signifas?
Ĝi signifas, "iru tie" signifas efektive, "metu vian fingron tien."
Kaj nun en la dekstra flanko de tiu esprimo, * kaj tiam en parens,
s + i signifas s, kiu estas la alparoli tien la malgranda g.
s + 0 estas, kompreneble, s ajn s.
>> Do nun, estas * s, kiu same kiel * 33 Oxford Street signifas iri al la adreso
ejon.
Do jen tiu fingro, dekstra mano.
Do kion mi povos kopii en kio?
La afero sur la dekstra, kiu estas Gabe, iom g tie, en ĉi tie.
>> Kaj tial la efiko de tiu unua ripeto de la ciklo,
kiel vi proponis, kvankam ĝi aspektas freneza pli komplika ol nenio
ni vidis antaŭe, estas simple diri iri tie kaj kopii tiun karakteron tie.
Ĝi donas al vi mapon al ambaŭ lokoj.
>> Kaj ni vidos multe pli de tio.
Sed nuntempe, la espero estas nur enkonduki iujn de tiujn bazajn ideojn.
Kaj efektive, ni rigardu unu fina programo tie ĉi,
kaj tiam la promesita Claymation, kiu faros ĉiu ordo.
Bone.
Do lasu min malfermi up-- tie ni iros.
Do lasu me-- ni revenos al ĉi foton antaŭ longe.
Lasu min malfermi tiu fina ekzemplo tie.
>> Do tie estas super, super Programo kiu plenumas
nenio en la vivo kiu faras la sekvan.
Ĝi unue deklaras du variabloj x kaj y, kiuj ne estas nombroj tiu fojo,
mem.
Ili ne estas entjeroj mem.
Ili estas ŝajne int *.
Do nur iu, kion ĝi signifas se via datumtipo, vian variablon,
estas de tipo int * stelo?
Jen la adreso de int.
>> Do mi havas neniun ideon kie ankoraŭ.
Ĝi simple signifas "meti, eventuale, la adreso de int tie. "
0x50, 0x88, kie ajn ĝi estas en memoro, adreso iras tien.
Kaj tio estas kion y estas tuj estos, kiel bone.
>> Se mi nun diras x = malloc (sizeof (int)) tio estas fantazio maniero diri,
hey mastruma sistemo, pere malloc, donu al mi sufiĉan memoron por la grandeco
de int, kiu estas probable tuj estos 32 bitoj aŭ kvar bitokoj.
>> Do kion signifas malloc reveni?
Malloc revenas adreson.
Do kio okazas al get stokitaj en x?
La adreso de la eron de memoro, la kvar bajtoj, kiuj malloc
nur trovis min demandante la mastruma sistemo.
>> Nun dume, linio kvar tie, la * x = 42.
Nur por esti klara, kio okazas tie?
Sur la maldekstra flanko, * x.
jen kiel * 33 Oksfordostrato.
Do * x signifas kion?
>> Publiko: Iru.
>> DAVID J. Malan: Iru al tiu adreso.
Kien tiu bloko de memoro estas, iru al ĝi.
Kaj metu kio, evidente?
Publiko: 42.
DAVID J. Malan: 42.
Bone, * y, sama ideo.
Iru al la adreso en y.
Metu la numero 13 tie, sed kio estas y en la momento?
Publiko: Ne estas memoro por y.
DAVID J. Malan: Tie Estas neniu memoro por y.
Do kio faras y probable enhavas, kiel ni estis dirante?
>> Publiko: Garbage.
>> DAVID J. Malan: Kelkaj rubo valoro.
Nun, rubo valoro ankoraŭ estas numero.
Ĝi povas ankoraŭ esti konfuzita adreson.
Estas kvazaŭ iu haste ion malsupren,
kaj mi malinterpretado kiel signifo iu konstruaĵo laŭ la strato.
Kaj se vi simple provu iri en iu konstruaĵo vi ne posedas,
aŭ iun eron de memoro vi havas ne estis donita, malbonaj aferoj povus okazi.
Komputila povus frakasi, aŭ iuj aliaj nedifinitaj konduto povus okazi.
>> Do la intro do al Binky estas tiu.
Mi ankoraŭ memoras, 20 iuj neparaj jaroj poste,
kie mi estis kiam mi fine komprenis punteros.
>> Kio estas, se vi lasi tie en tri minutoj
kaj ke mi ne faras kompreni punteros, realigi
Mi memoris 20 jaroj por iu freneza kialo
Kiam kaj kial ĝi fine enprofundigita en, sidis kun mia instruado
ulo, Nishat Mehta en la dorso de Eliot Dining Hall.
Nun, mi memoris ĉar tio estis
unu el la temoj mi, aparta, baraktis kun.
Kaj tiam, ĝi fine klakis, kiel mi kuraĝas diri multajn temojn
eventuale volos.
Kaj nun, por ke senti ĉiuj feliĉaj kaj ĉiuj pli konvinka,
ni prenu lastan rigardon en nia lastaj tri minutoj tie ĉe Binky,
de nia amiko, Nick Parlante de Stanford.
>> [VIDEO Playback]
>> -Hey, Binky.
Vekiĝu!
Estas tempo por montrilo amuza.
>> -Kio Estas tio?
Lernu pri punteros?
Ho, Goody!
>> -Well, Por komenci, mi supozas ke ni estas tuj bezonos paron punteros.
>> -OK.
Tiu kodo atribuas du punteros, kiu povas noti al entjeroj.
-OK.
Nu, mi vidas la du punteros, sed Ne ŝajnas esti indikante nenion.
>> -Tio Pravas.
Komence, punteros ne indikas ion.
Tion notas al nomiĝas pointees kaj fiksante ilin la
aparta paŝo.
>> -Oh, Dekstra, rajto.
Mi sciis tion.
La pointees estas apartaj.
Er, do kiel vi rezervu pointee?
>> -OK.
Nu, tiu kodo atribuas nova entjero pointee,
kaj tiu parto aroj x atentigi al tio.
>> -Hey, Kiuj aspektas bona.
Do fari ion fari.
>> -OK.
Mi timige dereference la montrilo x stoki la numero 42 en ĝian pointee.
Por tiu lertaĵo, mi bezonas mian Magia Sceptro de Dereferencing.
>> -Your Magic Wand de Dereferencing?
That-- tio granda.
>> -tio Estas kion la kodo aspektas.
Mi ĵus starigis la numeron, kaj [POP]
>> -Hey Rigardu.
Tie iras.
>> -So Faras dereference sur x sekvas la sago por aliri lia pointee.
En tiu kazo, oni tendencas 42 en tie.
Hej provos uzi ĝin por stoki la nombro 13 tra la alia puntero, y.
>> -OK.
Mi simple iri tien al y, kaj ricevi la numeron 13 aro supren.
Kaj tiam prenu la Sceptro de Dereferencing kaj ĝuste [Buzz]
>> -Oh!
>> -Oh, Hey!
Tio ne funkcios.
Diru, Binky, mi ne kredas dereferencing y estas bona ideo, ĉar vi scias,
starigadon de la pointee estas aparta paŝo.
Kaj mi ne kredas ke ni iam faris.
>> -Good Punkto.
-Yeah.
Ni asignitaj la montrilo y, sed ni neniam starigis ŝin atentigi al pointee.
>> -Very Observanto.
-Hey, Vi serĉas bonon tie, Binky.
Ĉu vi povas ripari ĝin tiel ke y punktoj al la sama pointee kiel x?
>> -Sure.
Mi uzas mian Magian Wand de Pointer Assignment.
>> -is Ke tuj estos problemo kiel antaŭe?
-No.
Ĉi tio ne tuŝas la pointees.
Ĝi nur ŝanĝas unu puntero al notas al la sama aĵo kiel la alia.
>> -Oh, 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 Sceptro de Dereferencing denove sendi la 13 pli.
>> -Uh, OK.
Tie iras. [POP]
>> -Hey, Rigardu tiun.
Nun dereferencing verkoj pri y.
Kaj ĉar la punteros estas dividi ke oni pointee, ili ambaŭ vidas la 13.
-Yeah.
Dividi ajn.
Do ni tuj ŝanĝi lokojn nun?
>> Ho, rigardu.
Ni estas el la tempo.
>> -But--
>> -Just Memoras la tri montrilo reguloj.
Number One, la baza strukturo estas ke vi havas puntero,
kaj antaŭ ol al pointee.
Sed la puntero kaj pointee estas apartaj,
kaj la komuna eraro estas starigi montrilo,
sed forgesi doni pointee.
>> Numero Du, puntero dereferencing komenciĝas ĉe la montrilo
kaj sekvas lian sagon super aliri lia pointee.
Kiel ni ĉiuj scias, tiu nur funkcias se estas
oni pointee, kiu speco de ricevas reen al Rule Number One.
>> Nombro Tri, montrilo asigno prenas unu montrilo
kaj ŝanĝas ĝin al punkto al la sama pointee kiel alia puntero.
Do post la farita, la du montriloj
notos al la sama pointee.
Foje, kiuj nomiĝas dividi.
Kaj jen ĉio estas al ĝi, vere.
Bye-bye nun.
[FINO VIDEO Playback]
DAVID J. Malan: Estas tio por CS50.
Ni vidos vin proksima semajno.