>> [Muzikos grojimo]
David J. Malan: Gerai.
Tai CS50, ir tai yra Savaitės ketvertą pabaigos.
Ir viena iš temų šiandien yra ta, kad skaitmeninės ekspertizės,
atgauti informaciją menas.
Ir iš tiesų, nors esate viduryje
dabar taikos trimis ir Breakout, kitą savaitę,
Daugiausia dėmesio bus skiriama Būtent šioje srityje.
>> Taigi vienas iš super darbo aš kada nors turėjo grįžo į aukštosios mokyklos,
kai dirbau vietos Middlesex County apygardos prokuroro s
biuro, daro ekspertizės dirbti.
Taigi, iš esmės, Masačusetsas Valstybinės policijos, kartais,
Dirbdami atvejais būtų kad dalykų, pavyzdžiui, standžiųjų diskų
ir diskeliai ir atminties kortelės ir pan.
Ir jie būtų perduoti juos man ir mano mentorius,
ir mūsų tikslas buvo rasti įrodymų, jei ten buvo bet, šių laikmenų.
Dabar, jums gali mačiau žvilgsniai Šio ekspertizės pasaulyje
žiniasklaidos, TV ir filmus.
Bet darbas man teko, ir Manyti, kad pasaulis,
yra ne visai kaip galėtumėte jį peržiūrėti.
Leiskite pažvelgti, kas jūs tikriausiai matė.
[VIDEO PLAYBACK]
Ok.
Dabar galime gauti gerą pažvelgti jums.
>> [Muzikos grojimo]
>> -Hold Jį.
Paleiskite tą nugarą.
>> -Palauk Minutę.
Eiti į dešinę.
-Yra.
Freeze kad.
Pilno ekrano.
>> Ok.
Freeze kad.
Sugriežtinti ant, kad jūs?
>> -Vector Į apie tai vaikinas iš galinio rato.
>> -Zoom Į čia šioje vietoje.
>> -Daugiausia Tinkamą įrangą, Vaizdas gali būti išplėsta ir galąsti.
>> -Kas Kad?
>> -Tai Didinimo programa.
>> -Ar Jums aišku, kad iki tokių yra?
>> -Aš Nežinau.
Leiskite jį pagerinti.
>> -Enhance A6 skyrius.
Aš sustiprino detales, and--
-Aš Manau, kad yra pakankamai padidinti.
Atleiskite, kad mano ekrano.
>> -Aš Sustiprino į jos akis atspindys.
-ėlis Manimi paleisti tai per vaizdo didinimas.
>> -Edgar, Galite padidinti tai?
>> -Hang Ant.
>> -I've Dirbu šį atspindys.
>> -Yra Savo kažkieno atspindys.
>> -Reflection.
-Yra Yra iš žmogaus veido atspindys.
>> -The Atspindys!
-Yra Yra atspindys.
-Zoom Į ant veidrodžio.
Jūs galite pamatyti atspindys.
>> -Gali Jums padidinti atvaizdą iš čia?
-Gali Jūs jį pagerinti?
-Gali Mes padidinti tai?
-Gali Jūs jį pagerinti?
-Hold Sekundėlę.
Aš padidinti.
-Zoom Į ant durų.
-Times 10.
-Zoom.
-Move Į.
-Daugiau.
-Palauk, Sustoti.
Stop.
-Pause Jį.
-Rotate Mums 75 laipsnių aplink vertikalios, prašom.
>> Stop.
Grįžti į dalis apie duris vėl.
>> -Priimta Vaizdo stipriklis, kuris gali Bitmap?
>> -Maybe Mes galime naudoti Pradeep Singh būdas pamatyti į langus.
>> -The Programinė įranga yra moderniausias.
>> -The Tikrinių reikšmių yra išjungtas.
>> -Daugiausia Dešinę kombinacija algorithms--
>> -Jis Imtasi apšvietimas algoritmai į kitą lygį,
ir aš galiu naudoti juos sustiprinti šį nuotrauka.
>> -Lock Ant ir padidinti z ašį.
>> -Enhance.
Didinti.
-Enhance.
-Freeze Ir stiprinti.
[END VIDEO PLAYBACK]
David J. Malan: Taigi tie, kurie visi žodžiai, tačiau jie ne
naudojama sakinių teisingai.
Ir iš tiesų ateityje, bet kuriuo metu, Prašome, išgirsite ką nors pasakyti žodį,
"Sustiprinti" kudakuoti tik truputį.
Nes kai bandote padidinti, Pavyzdžiui, tai, kas vyksta.
>> Taigi čia yra spalvingas nuotrauka.
Tai CS50 savo Daven.
Ir manau, kad mes norėjome sutelkti dėmesį į MiG jo akių,
ar atspindys blogas vaikinas, kad buvo aiškiai
užfiksuotas saugumo kameros.
Tai, kas atsitinka, kai jūs priartinti vaizdą, kad
turi tik baigtinį skaičių Bitų, susijusių su juo.
>> Tai yra tai, ką jūs galėtumėte gauti.
Ir iš tiesų, Daven akis yra bet keturis, gal šešis pikselių
kad komponuoti, ką buvo Płomykowy ten.
Taigi Problema Nustatyti Keturi galiausiai turės jums ištirti šį pasaulį, ypač
gamta kažką mes vadiname failą I / O, kurioje
I / O yra tik išgalvotas būdas sakydamas įvestį ir išvestį.
>> Taigi iki šiol, visi sąveikos mes jau su kompiuteriu
buvo daugiausia susijusios su jūsų klaviatūra ir ekranas,
bet ne tiek daug su kietajame diske, arba taupymo failų už tuos, kuriuos
sau rašyti.
Jūsų programos iki šiol turi nebuvo sukurti ir išsaugoti,
ir atnaujinti savo failus.
>> Na, kas byla?
Na, kažkas panašaus į JPEG.
Tai paveikslėlis jums gali turėti arba įkelti į "Facebook",
ar pamatyti bet kur internete.
Iš tiesų, tai nuotrauka, mes tiesiog pjūklas iš Daven buvo JPEG.
Ir kas įdomu apie failus kaip JPEG
yra tai, kad jie gali būti identifikuoti, paprastai, tam tikrų modelių bitai.
>> Kitaip tariant, tai, kas jį, kad išskiria JPEG iš GIF
iš iš Word PING dokumentas iš Excel failo?
Na, tai tiesiog skirtingi modeliai bitai.
Ir tie skirtingi modeliai paprastai šių failų pradžios.
>> Taigi, kad kai jūsų kompiuteris atidaro Word doc, arba kai kompiuteris atidaro JPEG,
atrodo paprastai ne Pirmieji keli bitai failo.
Ir jei ji pripažįsta, modelį, ji sako, oi, tai yra paveikslėlis.
Leiskite parodyti jį vartotojas kaip grafinis vaizdas.
Arba, oh, tai atrodo Word doc.
Leiskite parodyti naudotojui, kaip esė.
>> Taigi, pavyzdžiui, JPEG, it turns out, yra
gana sudėtingas po gaubtu.
Tačiau pirmieji trys baitų dauguma kas JPEG pradėti su šiomis trimis skaičiais.
Taigi baitų nulis, vienas, o du yra iš dauguma kas JPEG, 255, tada skaičius
216, tada skaičius 255.
>> Ir ką jūs galėsite pradėti daryti kitą savaitę
iš tikrųjų išnyra po failų gaubtas kaip JPEG
ir kaip bitmap failus, ir pamatyti kas visada buvo ten, kol
kaip jūs buvote naudojant kompiuterį.
>> Bet kas yra paprastai nėra parašyta kaip dešimtųjų kaip šis.
Kompiuterių mokslininkai ne linkę kalbėti po kablelio.
Jie tikrai ne kalbėti dvejetainis.
Paprastai, kai mes norime išreikšti numerius,
mes iš tikrųjų naudoti šešioliktainis, kurį gali prisiminti
nuo, tarkim, problemą, Vienas, kuris ginčijo
jums galvoti apie kitą sistemą.
>> Mes, žinoma, esame susipažinę su dešimtosios nulio per devynių.
Mes kalbėjome apie dvejetainę.
Ir mes iš tikrųjų neturime naudoti, kad daug čia
laukan, nes kompiuteriai naudoti, kad.
Bet programuotojai bus labai dažnai, bet ne visada,
naudoti šešioliktainis, kuris tiesiog reiškia, jūs turite 16 raides savo abėcėlės,
, palyginti su dviejų ar 10.
>> Taigi, kaip jums suskaičiuoti iki didesnės nei devynių šešioliktainis?
Nueini 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, tik pagal susitarimą.
Bet kas svarbiausia yra, kad kiekvienas iš jų yra vieno simbolio.
Nėra 10.
Nėra 11 per se, nes kiekvienas Jūsų skaitmenų, tiesiog patinka dešimtosios
ir kaip dvejetainiu, turėtų tik būti vienas simbolis, pagal susitarimą.
>> Taigi, kad tada yra abėcėlė turime mūsų žinioje Šešioliktainiai.
Taigi, ką JPEG atrodyti, jei jums buvo surašyti tuos pirmuosius tris
baitų ne kaip dešimtosios tačiau, Pavyzdžiui, kaip šešioliktainis?
Ir kodėl hex net visa tai naudinga?
>> Na, greitai pažvelgti pavyzdys.
Taigi, jei aš rašau iš bitai, kad atstovauti šias dešimtainį numbers--
tai gali būti šiek tiek aprūdijęs dabar nuo kelių savaičių atgal,
bet kairysis ir teisingas yra gana lengva.
255 buvo didžiausias skaičius mes gali atstovauti aštuonis bitus.
Tai buvo visi tie.
Taigi tik vienas, kad yra šiek tiek Įdomu tai, viduriniosios vienas.
Ir jei jūs rūšies daryti iš matematikos, jūs padaryti išvadą, kad, iš tiesų,
kad vieno modelio ir nuliai yra 216.
Taigi tegul tiesiog nustatyti už dabar, kad tai yra teisinga.
Bet kodėl tai yra įdomu?
>> Na, baitų, žinoma, yra aštuonis bitus.
Ir paaiškėja, kad, jei jūs manote iš baitas kaip du gabaliukus keturis bitus,
kaip šis.
Leiskite pridėti šiek tiek erdvės.
Taigi, prieš, po.
Aš ką tik įdėjote šiek tiek baltos vietos vizualizavimo dėlei čia.
Kaip gali dabar mes atstovaujame, tarkim, šešioliktainis kiekvienas bitai quad,
kiekvienas iš keturių bitų rinkinys?
>> Taigi, pavyzdžiui, kairėje dabar mes turime 1111 dvejetainiu.
Kas yra tai, kad po dešimtainio skaičius, jei jūs iš matematikos?
Turite tie vietą, poromis vieta, Fours vieta, ir aštuonias vieta.
>> PUBLIKA: 15.
David J. Malan: Tai 15.
Taigi, jei mes darome aštuonių plius keturi plius du plius viena, mes gauname 15.
Taigi galėjau užrašyti 15 Toliau 1111, bet čia visa esmė
yra šešioliktainis ne dešimtainį.
Taigi vietoj užrašyti 15, 1-5, Aš ruošiuosi rašyti, kad hex,
kuris, jei jūs manote, kad atgal, jei turite nulis per f, kas 15 bus?
PUBLIKA: f.
David J. Malan: Taigi pasirodo, tai f.
Ir jūs galite dirbti, kad iš sakydamas, gerai, jei yra 10, tada spustelėkite Gerai, f 15.
Taigi iš tiesų, mes galime perrašyti tai tas pats rinkinys numerius kaip f f.
Ir tada, jei mes padaryti šiek tiek matematikos, mes padaryti išvadą, kad tai yra d.
Aštuoni yra gana lengva, nes mes turėti vieną į aštuonias vietoje.
Ir tada, mes turime pora daugiau f f-aisiais.
>> Taigi, ką žmonės linkę daryti pagal susitarimą kai jie naudoja šešioliktainis yra, jie tiesiog
rašau tai šiek tiek daugiau glaustai, atsikratyti dauguma tos baltos vietos.
Ir tik super aišku, skaitytojai, kad tai yra šešioliktainis,
paprastas konvencija tarp žmonės yra rašote nulį
x, kuris neturi prasmės kitą kaip vizualiai identifikatorius,
čia ateina šešioliktainis skaičius.
>> Ir tada jūs įdėti du skaitmenys, f f šiuo atveju, tada d, tada f f.
Taigi ilga istorija trumpa, šešioliktainis tiesiog linkęs
būtų naudinga, nes kiekvienas jo skaitmenys, nulis per f, puikiai linijos
su keturių bitų modelis.
>> Taigi, jei turite dvi šešioliktainius skaitmenis, nulis per F, vėl ir vėl,
kuri suteikia jums puikiai Aštuoni bitai arba vienas baitas.
Štai kodėl jis yra linkęs būti tradiciškai naudinga.
Nėra intelektinės turinys tikrai už, kad,
išskyrus faktinio naudingumas.
>> Dabar JPEG yra ne tik Failų formatai grafikos.
Galbūt jūs žinote, kad yra bylos, kaip šio pasaulio,
bent iš keletą metų atgal.
>> Taigi tai buvo iš tikrųjų įdiegta "Windows XP"
milijonuose kompiuterių visame pasaulyje.
Ir tai buvo Bitmap failas, BMP.
Ir Bitmap failas, kaip pamatysite šalia savaitę, tiesiog reiškia taškelių raštas,
pikselių, kaip jie vadinami, map ant bitai, tikrai.
>> Taigi, kas yra įdomu, nors, apie šį failo formatą, BMP, yra
kad po gaubtu, ją turi daugiau nei vien trijų baitų
kad kurti savo galva, todėl kalbėti, pirmuosius keletą įkandimų.
Jis tikrai atrodo šiek tiek sudėtinga iš pirmo žvilgsnio.
Ir jūs pamatysite tai P rinkinys.
Ir gauti kažką ypač iš šio dabar
nėra taip svarbu, kaip tik dėl to, kad kiekvieno bitmap pradžioje
failas, grafinis formatas, ten visa krūva skaičių.
>> Dabar "Microsoft", autorius šiuo formatu,
linkęs šaukti dalykų, ne ints ir simbolių
ir plūdės bet žodžiai ir d žodžiai ir ilgisi ir baitai.
Taigi jie tiesiog skirtingi duomenų tipai.
Jie skirtingus pavadinimus už tą patį dalyką.
Bet jūs pamatysite, kad P Nustatyti keturi.
>> Bet tai tik pasakyti, kad jei žmogus dukart spusteli kai bmp failą jo
ar jos kietąjį diską, ir langas parodančios jam ar jai, kad vaizdo,
kad atsitiko todėl, kad veiklos sistema turbūt pastebėjo ne tik
bmp failo plėtinys failo pavadinimą,
bet ir tai, kad yra keletas konvencija, ir bitų modelis
pačioje pradžioje tos bitmap failo.
>> Bet tegul dabar savo dėmesį į toks sudėtingas failas,
bet vietoj to kažką panašaus į tai.
Tarkime čia gedit, aš tiesiog turi pradžią
iš programos, tai gana paprasta.
Aš turiu kai yra iki viršaus.
Dabar aš turiu Include "structs.h", tačiau Grįšiu į tą, kuris yra šiuo metu.
Bet tai yra naudinga dabar.
Taigi, tai yra programa, kad ketina įgyvendinti
kaip registratoriaus duomenų bazę.
Taigi studentų duomenų bazė, ir kiekvienas studentas pasaulyje
turi pavadinimą ir namą ir tikriausiai kai kiti dalykai, bet mes laikyti jį paprasta.
Kiekvienas studentas turi savo vardą ir namą.
>> Taigi, jei aš norėjau parašyti programa, kurios tikslas gyvenime
buvo tik pakartoti iš nulio iki trijų,
jei ten tris studentus Harvardo universitete.
Ir aš tik noriu gauti naudojant GetString, kiekvieno studento vardas ir namo,
ir tada tiesiog atsispausdinti tiems iš.
>> Tai tarsi kaip savaitės Vienas, Savaitė Dvi stuff dabar
kur tik noriu už kilpa ar kažkas panašaus.
Ir aš noriu paskambinti GetString nedaugelis kartų, ir tada spausdinti f kelis kartus.
Taigi, kaip aš galiu tai padaryti, nors, kai abu pavadinimas ir namai
dalyvauja kiekvienam studentui?
>> Taigi mano pirmasis instinktas might būti padaryti kažką panašaus į tai.
Galėčiau pirmasis pasakyti, gerai, duok man, tarkim, eilučių, vadinamų pavadinimai masyvo.
Ir aš nenoriu hardcode tris čia.
Ką aš noriu ten įdėti?
Taigi studentų, nes tai tik pastovus paskelbė viršuje,
tiesiog taip aš neturiu hardcode trys keliose vietose.
Tokiu būdu, aš galiu jį pakeisti vieną vietą, ir tai turi įtakos pokyčius visur.
Ir tada, aš galėtų padaryti styginių namų studentams.
>> Ir dabar, aš galėtų padaryti kažką panašaus už (int i = 0; i <studentams; i ++.
Taigi aš rašyti greitai, tačiau tai tikriausiai, susipažinę sintaksė dabar.
>> O dabar, tai buvo neseniai.
Jei aš noriu įdėti į i-osios studento vardas, manau, kad tai padaryti.
Ir tada, ne pavadinimai bet namai laikiklis i.
Aš tai padaryti, GetString, ir tegul man grįžti ir išspręsti šią liniją.
Sutinku?
Nesutinku?
Tai nėra labai patogus.
Aš jos nepasakiau vartotojui, ką daryti.
>> Bet dabar, jeigu aš taip pat norėjo vėliau, tegul
tarkim, spausdinti šiuos dalykus out-- taip TODO vėliau.
Aš ruošiuosi padaryti daugiau su this-- tai, be abejo, tai yra
teisingas įgyvendinimas gauti vardus ir namus, tris
iš jų iš viso kiekvienas iš vartotojo.
>> Bet tai nėra labai geras dizainas, tiesa?
Ką daryti, jei studentas turi ne tik pavadinimą ir namas, bet ir ID numeris,
ir telefono numeris, ir elektroninio pašto adresas,
o gal namų puslapiu ir gal Twitter rankena,
ir bet koks kitas detales numeris susijęs su studento ar asmens,
apskritai.
Kaip mes pradėsime pridėti funkcionalumas šią programą?
>> Na, aš jaučiu, kaip paprasčiausiu būdu might būti padaryti kažką panašaus, tarkim,
int IDS studentų.
Taigi aš galiu įdėti visus savo ID ten.
Ir tada, nors kaip telefono numerius,
Nesu tikras, kaip atstovauti, kad tik dar.
Taigi eikime į priekį ir tik skambutis tai twitters studentų, kurie
yra šiek tiek keista, but-- ir krūva daugiau laukų.
>> Aš pradėjau efektyviai nukopijuokite ir įklijuokite čia.
Ir tai augs gana griozdiškas gana greitai, tiesa?
Ar nebūtų puiku, jei ten buvo pasaulyje žinomas duomenų struktūra
ne kaip int ar eilutę, bet kažkas aukštesnio lygio, abstrakcija, todėl
kalbėti, žinoma kaip studentas?
C neatėjo su built-in funkcionalumas studentams,
bet ką daryti, jei aš norėjau, kad tai toks?
>> Na, it turns out, aš ruošiuosi atidaryti failą, pavadintą structs.h čia
ir jūs galite padaryti būtent tai.
Ir mes ketiname pradėti tai daryti dabar.
Ir prispaudžia P nustatė tris gaubtu, jūs jau daro tai dabar.
Nėra tokio dalyko, kaip g liu arba g ovalo programavimo kalbos C
>> Žmonės Stanfordo įgyvendinti tuos duomenų tipai, naudojant šį metodą čia,
skelbiantis savo naują duomenis tipų, naudojant naują raktinį žodį
vadinamas konstrukto ir kita vienas vadinamas Typedef.
Ir iš tiesų, nors sintaksė atrodo šiek tiek skiriasi nuo dalykų,
mes matėme anksčiau, principas, tai super paprasta.
>> Tai tiesiog reiškia "apibrėžti tipą."
Tai ketina būti struktūra ir struktūra
yra tik kaip į konteinerį kelių dalykų.
Ir tai struktūra vyksta turėti eilutę, vadinamą vardas,
ir styginių vadinamas namas.
Ir tegul vadina, tiesiog, kad būtų patogiau, visa ši duomenų struktūra studentas.
>> Taigi momentas jums kabliataškis, turite dabar
sukurta savo duomenis tipas vadinamas studentas
kad dabar stovi šalia int, ir flotacinio ir char ir string,
ir g rect ir g ovalios, ir bet koks skaičius kitų dalykų, žmonės išrado.
>> Taigi, kas yra naudinga apie tai dabar yra tai, kad jei aš einu atgal
į turizmo infrastruktūrą 0 ir baigti tai įgyvendinimas, kurį aš parašė
iš anksto čia, pastebėsite, kad visi neišvengiamą Bałaganienie kad
buvo apie pradėti vyksta kaip aš pridėjo telefono numerius ir twitters ir visi
šie kitų dalykų studento apibrėžimas,
dabar jis glaustai apibendrinti kaip tik vienas masyvas studentams.
>> Ir kiekvienas iš tų studentų, dabar turi kelis dalykus viduje.
Taigi, kad tik palieka vieną klausimą.
Kaip jums tuo pavadinimu, ir namas, ir ID,
ir kokios dar yra viduje studentui?
Super paprasta, kaip gerai.
Naujas sintaksė, bet paprasta idėja.
>> Jūs galite tiesiog indeksas į masyvą, kaip mes padarėme praeitą savaitę, ir tai.
Ir kas aiškiai nauja gabalas sintaksė?
Tiesiog., Kuris reiškia "eiti į vidų struktūra ir gauti laukas vadinamas
vardas, gauti lauką, vadinamą namas, gauti lauką, vadinamą studentas. "
>> Taigi P nustatė tris, jei esate vis dar dirba, kad
ir dauguma žmonių vis dar yra, reikia suprasti, kad, kaip jūs
pradėti naudoti dalykų, pavyzdžiui, g rects ir g ovalai
ir kitų dalykų, kad neatrodo, kad iš savaitės nulis, vienas arba du,
suprasti, kad tai todėl, kad Stanfordo paskelbė keletą naujų duomenų tipus.
>> Ir iš tiesų, tai būtent tai, ką mes padaryti, taip pat, į P nustatytos keturios, kai
mes pradedame kovoti su dalykų kaip vaizdus, ​​rastrai, ir dar daugiau.
Taigi tai tiesiog erzina ir psichikos modelis, kas turi ateiti.
Dabar, aš delsė tiek šį rytą.
Buvau rūšies įdomu pamatyti, ką "Microsoft" ekrano užsklanda iš tikrųjų
atrodo šiandien.
Ir it turns out kažkas 2006 iš tikrųjų išvyko į beveik tiksliai
pačioje vietoje fotografuoti iš tikrųjų kas atrodo, kad šių dienų.
Laukas yra dabar šiek tiek apaugusi.
>> Taigi kalbant dabar vaizdų, tegul sugrąžinti Daven čia
ekrane ir Mikalojaus ir tiesiog priminti jums
kad, jei norite prisijungti prie mūsų pietų šį penktadienį, galva mūsų įprasta URL
čia.
>> Taigi, kur gi mes palikti ne pirmadienį?
Mes pristatėme šią problemą, tiesa?
Tai buvo, atrodytų teisinga įgyvendinimas apsikeitimo sandorio poziciją,
, kai vartojate du int, vienas vadinamas, vienas vadinamas b
apsikeitimo juos, kaip ir Laura padarė čia Scenoje su pienu ir vandeniu,
naudojant laikinas kintamasis arba tuščias puodelis,
kad galėtume įdėti b į ir A kategoriją b nedarant dalykų netvarka.
Mes naudojome kintamąjį.
Tai vadinama temp.
>> Bet tai, kas buvo svarbiausia problema su šiuo kodu pirmadienį?
Kokia buvo problema čia?
Taip.
>> PUBLIKA: Jis užima daugiau vietos.
>> David J. Malan: Užima daugiau erdvė, nes aš naudoju kintamąjį,
ir kad viskas OK.
Tai tiesa, bet aš tikiu, ketinate pasakyti, kad viskas OK.
Tai tik 32 bitai grand schema dalykų, todėl ne big deal.
Kitos mintys?
PUBLIKA: Tai tik apsikeitimo kintamieji lokaliai.
David J. Malan: Būtent.
Jis tik apsikeitimo kintamuosius vietoje.
Kadangi bet kuriuo metu galite skambinti function-- kai turėjau dėklus iš Annenberg
Paskutinį kartą, turite pagrindinis apačioje.
Kai skambinate funkcija vadinama apsikeitimo sandoris, apsikeitimo sandoris neturi gauti X ir Y
pradines reikšmes.
Ką apsikeitimo get, tai mes reikalauti?
Auditorija: kopijų.
David J. Malan: Taigi jų kopijas.
Taigi jis pasireiškia vienas ir du, jei Jums priminti pavyzdį iš paskutinį kartą,
bet vieno ir dviejų kopija kad sėkmingai pavertė.
Bet, deja, galų gale, tos vertės yra vis dar tas pats.
Taigi, mes galime pamatyti, tai su mūsų naujas draugas, tikiuosi GDB,
kad jūs arba TFS ir CA turi buvo nukreips jus link taip.
>> Taigi ne apsikeitimo priminti atrodo like-- tegul atverti this-- atrodo taip.
Mes inicializuoti x į vieną, y dvi dalis.
Turėjo spausdinimo f s krūva.
Bet tada, raktas skambutis čia buvo sukeisti, kuris
yra būtent mus kodas tik pamačiau prieš akimirką.
Kuris yra teisinga pirmoji žvilgsnis, bet funkciniu,
ši programa neveikia, nes ji neturi nuolat apsikeitimo X ir Y.
>> Taigi pažiūrėkime, tai, greitas šiltas čia su GDB, kad ./noswap.
Iš didžiulio informacijos krūva, kad Aš atsikratyti su kontrolės L dabar.
Ir dabar, aš ruošiuosi eiti į priekį ir paleisti jį.
Ir, deja, kad buvo ne tai, kad naudinga.
Jis bėgo programą viduje tai programa, vadinama GDB, debugerem,
bet jis neleido man baksnoti aplink.
>> Taigi, kaip aš iš tikrųjų gali sustabdyti vykdymas viduje šią programą?
Taigi pertrauka.
Ir aš galėtų nutraukti dėl bet eilutės numeris vienas, 10, 15.
Bet aš taip pat galite sulaužyti simboliškai sakydamas pertraukos Main.
Ir tai vyksta nustatyti pertraukos taškas, matyt, 16 pagrindinė linija.
Ir kur yra linija, 16?
Vykime iki kodas ir eiti į noswap.
Ir iš tiesų, linija 16 yra Pats pirmas programoje.
>> Taigi dabar, jei aš einu į priekį ir tipas paleisti šį kartą, "Enter", jis stabtelėjo.
Taigi leiskite baksnoti aplink.
Spausdinti būdai, ar kodėl x nulis?
Ir ignoruoti dolerio ženklas.
Štai tik mėgėjas naudojimas programoje.
Kodėl x nulinis šiuo metu?
Taip.
>> PUBLIKA: Tai stabtelėjo tiesiai prieš linija 16, o ne iš tikrųjų on line 16 d.
David J. Malan: Būtent.
GDB, pagal nutylėjimą, buvo pristabdytas vykdymas prieš line 16 d.
Taigi ji nebuvo įvykdyta, o tai tai x yra kai nežinoma vertę.
Ir mes pasisekė, kad tai kažkas švarus kaip nulis.
Taigi dabar, jei aš tipo šalia, dabar jis vykdomas 16.
Jis manęs laukia vykdyti 17.
Leiskite man eiti į priekį ir spausdinti x.
Tai viena.
Leiskite man eiti į priekį ir spausdinimo m.
Ką turėčiau pamatyti dabar?
>> PUBLIKA: [nesigirdi]
>> David J. Malan: tiek garsiau.
>> PUBLIKA: [nesigirdi]
David J. Malan: Ne visai sutarimas.
Taip taip, mes matome tam tikrą šiukšlių vertę.
Dabar, y 134514064 nėra.
Na, tai tik keletas šiukšlių vertė.
Mano programa naudoja RAM skirtingiems tikslams.
Yra kitas funkcijas.
Kiti žmonės rašė viduje mano kompiuteryje.
Taigi tie bitai buvo naudojami kitas vertybes, ir ką aš matau
yra kai kurių likučiai prieš naudojimą toje atmintyje.
>> Taigi ne big deal, nes kuo greičiau kaip aš tipo šalia ir tada spausdinti y,
tai inicializuoti vertė, kad aš noriu.
Taigi dabar eikime į priekį šiek tiek greičiau.
N šalia.
Darom vėl.
Bet aš nenoriu, kad pasiektų tai čia, nes jei I
norite pamatyti, kas vyksta viduje apsikeitimo, kas komanda?
>> PUBLIKA: žingsniai.
>> David J. Malan: žingsniai.
Taigi, tai žingsniai mane į funkcija, o ne per jį.
O dabar, tai šiek tiek paslaptingas sąžiningai, bet tai tik
pasakojo, aš 33 eilutėje dabar.
Ir tegul tai padaryti dar kartą.
Spausdinti temp.
Šiukšlių vertė neigiama šį kartą, bet tai tik dar šiukšlių vertė.
Taigi darykime kitą, spausdinimo temp.
Tai inicializuoti 1, kuris buvo x reikšmė, taip pat žinomas kaip.
>> Dabar, kur yra mūsų ir X tiekiamos iš?
Na, pranešimas pagrindinis, mes vadinamas šių vertybių x ir y.
Mes tada praėjo juos sukeisti taip.
X atėjo pirmas, kablelis m.
Ir tada, apsikeitimo galėtų juos vadinti x ir y.
Tačiau dėl aiškumo, tai vadindamas juos ir b.
Tačiau a ir b yra dabar bus kopijos X ir Y atitinkamai.
>> Taigi, jei aš einu atgal į GDB temp dabar yra viena ir dabar yra viena.
Bet jei man daryti toliau, o dabar tai padaryti spausdinti , jau persikėlė per.
Pienas buvo pilamas į buvusio Apelsinų sultys yra stiklas, arba atvirkščiai.
>> Ir jei man daryti toliau vėl, ir dabar jei aš atsispausdinti kaip normalumas patikrinti,
yra dar du, o b yra dabar vienas.
Atvirai kalbant, jis vis dar ten.
Man nerūpi, ką temperatūra yra.
Bet kaip tik dabar aš tipo, tarkim, toliau grįžti, dabar aš pabaigoje
programa.
Ir, deja, čia x yra dar viena ir y yra dar du.
>> Taigi, kas buvo iš GDB ten įrankis?
Tai nepadėjo man nustatyti problema per se,
tačiau tikiuosi man padėti jį suprasti suvokiant
kad taip, mano logika yra teisinga, tačiau mano kodas nėra galiausiai
nuolatinis poveikis.
Štai problema mes vyksta dabar išspręsti šiandien.
>> Bet tegul ten būdu tai.
Styginių yra melas.
Ji taip pat nėra duomenų tipas kad egzistuoja C. Tai
buvo kai sinonimas laikas kažkas,
ir mes galime matyti, kad taip.
>> Leiskite man eiti į priekį ir atverti Programa vadinama palyginti-0.
Ir užuot įveskite šį vieną iš, mes pradėsime vaikščioti per kodą
Aš jau rašė, bet tai tik keletas eilučių.
Taigi tai yra palyginti-0.
Ir aš pirmas dalykas, darau yra gauti teksto eilutę.
>> Tačiau pastebėti, ką aš daro pirmą kartą.
Kuo skiriasi aiškiai apie linijos 21?
Tiesą sakant, palauk.
Tai kopija du.
Tai net ne teisę programa.
Gerai, spoileris perspėjimas.
Gerai, kad tai nesvarbu.
Štai į būsimą klausimą.
>> Čia yra palyginti-0, ir aš apie gauti teksto eilutę.
Programos daug paprastesnis.
Taigi, tai yra paprasta.
Tai lyg Savaitės One Savaitės Dviejų dalykų metu. STRING s = GetString.
Dabar, aš pasakyti, kad tai vėl žemyn čia.
styginių t = GetString.
Ir tada, paskutinis dalykas šiame programa, kaip rodo jos pavadinimas,
yra aš ruošiuosi pabandyti juos palyginti.
>> Taigi, jei s, pirmą eilutę, lygus = T, tada aš tikiu,
ketinate pasakyti rašote tą patį.
Kita, aš ruošiuosi pasakyti įvedate skirtingus dalykus.
Taigi leiskite sudaryti ir vykdyti šią programą.
Todėl įsitikinkite, palyginti nuliui.
Atrodo gerai.
Nėra sudarymo klaidos.
>> Leiskite man eiti į priekį dabar ir įveskite ./compare-0.
Leiskite man eiti į priekį ir ką nors pasakyti : Daven ir kažkas: Rob.
Ir aš tipo skirtingus dalykus.
Iki šiol taip gerai.
Programa atrodo teisinga.
>> Bet tegul paleisti jį dar kartą.
Pasakyk ką nors: Gabe.
Viskas gerai.
Gal aš paspauskite tarpo ar kažkas madingas.
Darom vėl.
Taigi Zamyla.
Zamyla.
Skirtingi dalykai.
Taigi, kas vyksta?
>> Taigi, mes turime šiuos du linijos kodas, GetString vadinamas du kartus.
Ir tada, aš tiesiog bando lyginti s ir t.
Bet kas iš tikrųjų tada vyksta?
Na, mano rašysena yra apie mėsininkas šį pavyzdį šiek tiek.
Ir tegul iš tikrųjų mesti tai sudaro daugiau nei čia, taip pat.
>> Taigi, mes turime tokia eilutė STRING s = GetString.
Taigi, kad tiesiog pirmas Įdomu linija nuo šios programos.
Bet kas visą šį laiką buvo vyksta po gaubtu?
Na, kairėje pusėje yra eilutė, kuris yra kai kintamojo tipas,
ir tai vadinama s.
Taigi aš žinau, kad tai yra naudojant atminties, arba RAM į savo kompiuterį kažkaip.
Taigi, aš ruošiuosi abstrakčiai atkreipti, kad aikštėje.
32 bitai, it turns out, tačiau daugiau apie tai ateityje.
Ir tada, kas vyksta per čia?
>> Na, GetString akivaizdžiai gauna iš naudotojo eilutę.
Ir GetString gavo Zamyla arba Gabe arba Daven.
Taigi leiskite pasirinkti pirmą iš tų, kurie buvo Daven.
Taigi efektyviai, ką GetString gavo man toje pirmoje byloje buvo D--v-e-n.
Ir tada, ką dar darė tai duok man slapta?
PUBLIKA: [nesigirdi]
David J. Malan: Taip, / 0 arba NULL simbolių.
Taigi ji veiksmingai davė man eilutę.
Bet mes jau žinome iš ankstesnių atrodo, kad eilutė yra tik masyvas
simbolių, ir tai nutraukta šis specialus sarginio charakterio bruožų / 0.
>> Bet jei tai tiesa ir tai yra kvadratinis,
tai aiškiai daug didesni stačiakampis.
Ir iš tiesų, tai yra, Galiu reikalauti, tik 32 bitai.
Ir tai yra aiškiai daugiau nei 32 bitai, nes tai tikriausiai
aštuonių plius aštuonių plius aštuonių plius aštuonių plius aštuonių,
tik todėl, kad baitų ASCII.
Kaip gi mes einame, kad tilptų Daven į šį mažai langelyje čia?
>> Na, kas yra GetString tikrųjų daro?
Na, tai tinklelis čia atstovauja mano kompiuterio atmintyje arba atminties.
Taigi leiskite savavališkai pasakyti, kad jei kiekvienas iš jų atstovauja baitas,
tada mes galime galvoti apie kiekvieną baitų kaip turintys adresą,
kaip 33 Oxford Street, arba 34 Oxford Street, arba 35 Oxford Street.
>> Taigi tiesiog kaip namų turi adresai ir pastatai turi adresus,
taip daryti atskirus baitų atmintis turi adresus ar numerius
kad identifikuoti juos.
Dabar, tai yra savavališkas.
Bet keep it simple, aš ruošiuosi naudoti šešioliktainis tik pagal susitarimą,
bet 0x reiškia ne ką kitą, kaip "tai šešioliktainis."
ir aš ruošiuosi teigia, kad "D" baigiasi ne Byte One atminties.
>> Aš nieko dar vyksta į atminties, todėl Daven gavo pirmąją vietą
ne Byte One.
Tai, tada, tai bus 0x2.
Tai va 0x3.
Tai bus 0x4.
Tai va 0x5.
Tai bus 0x6.
>> Bet kai jums pradėti galvoti apie ką kompiuteris daro
po gaubtu, galite pradėti daryti išvadą,
kaip jums, prieš keletą metų, būtų įgyvendino C savaime.
Kas yra GetString tikriausiai returning-- nes juo
jaučiasi, kad tai nėra grįžti Daven per se,
nes jis tikrai nesiruošia kad tilptų į šį mažai box--
Taigi, kas yra GetString tikriausiai grįžta?
>> PUBLIKA: [nesigirdi]
>> David J. Malan: iš Daven vietą.
Ir tai buvo tai bet kada, nes vieną savaitę.
Kas GetString tikrai grąžinant nėra styginių per se.
Štai vienas iš mažų baltų melo.
Tai grąžinant adresą styginių atmintyje, unikali adresas.
Daven gyvena 33 Oxford Street.
Bet daugiau glaustai, Gavin gyvena ne 0x1, Adresas numeris vienas.
>> Taigi, ką gauna įdėti į šį mažai dėžutė tada, kad būtų aišku,
yra tik tos eilutės adresas.
Taigi visa tai laikas, tai buvo vyksta.
Bet ką tai užsimenama dabar yra tai, kad jei visi s
yra viduje, skaičių, kuris yra jus sustabdyti, programuotojas,
iš apkrautas numerį kintamosios ir tiesiog šokinėja
tos atminties riekė?
Ir iš tiesų, pamatysime tai grėsmė kitą kartą.
>> Bet dabar, tai jaučiasi nepakankami.
Jei aš sakau, get me eilutę, galite duoti man Daven.
Bet jūs neturite iš tikrųjų man Daven.
Viskas, ką jums duoti man yra Daven adresas.
Kaip man tada þinotu kur Daven prasideda ir ends--
istorija darosi weird-- kur Daven prasideda ir baigiasi,
ir tada kitas styginių atmintyje prasideda?
>> Na, jei jūs atiduodami man iš Daven pradžia
iš esmės, kaip aš žinau, kur jo vardo pabaiga?
Tai specialus null charakteris, kuris yra dar svarbiau dabar
jei stygos apačioje dangtis yra tiesiog nustatyti
unikaliai savo vietą atmintyje.
Taigi visą laiką, tai kas jau vyksta.
>> Taigi, kai mes žiūrime dabar kodas čia paaiškinti
Jei norite suderinti 26 klaidą.
Kodėl Zamyla ir Zamyla skiriasi?
Kodėl Gabe ir Gabe skiriasi?
Taip, iš nugaros.
>> PUBLIKA: jie turi skirtingus adresus.
>> David J. Malan: Tiesiog todėl, kad jie turi skirtingus adresus.
Nes kai skambinate GetString vėl, o aš tai greitai čia
jei tai yra antroji eilutė, styginių t, kaip aš toje programoje,
lygi kitą skambutį GetString.
Kitą kartą aš vadinu GetString, aš ruošiuosi
gauti kitą riekė atminties.
>> GetString leidžiama paklausti operacinės
sistema vis daugiau ir daugiau atminties.
Jis nesiruošia pakartotinai tas pats šešių baitų kiekvieną kartą.
Tai ketiname gauti naują riekė atminties, kuri
tai t ketina gauti kai kurie kiti vertė čia.
>> Taigi, kai aš s lygi = t, jūs ne lyginant
D prieš tai ir prieš tai ir V prieš tai.
Jūs lyginant tai prieš, o tai
atvirai yra gana useful-- useless-- yra gana nenaudinga, nes, kas tikrai
cares, kai stygos yra atminties?
>> Ir iš tiesų, mes turime ne.
Ir mes neketiname pradėti ypač rūpintis.
Tik tiek, kad klaidų gali atsirasti ir grėsmes saugumui gali kilti valią
mes iš tikrųjų pradėti rūpintis tai.
Taigi leiskite išspręsti šią problemą.
Pasirodo, ją išspręsti super tiesiog.
>> Ir tegul iš tikrųjų, prieš I rodo, kad vėl, kas būtų
tu darytum, jei į CS50 klasės, ir jums teko įgyvendinti
palyginimas su dviejų eilučių.
Jūs akivaizdžiai negali tiesiog naudokite s lygi = k.
Bet tik logiškai, kaip jūs palyginkite šį eilutę
prieš šią eilutę, naudojant C kodą?
Taip.
>> PUBLIKA: Just do for ciklas [nesigirdi]
David J. Malan: Perfect.
PUBLIKA: [nesigirdi]
David J. Malan: Taip.
Tiesiog naudokite už linijos arba o linijos ar whatever.
Bet tiesiog taikyti pagrindinę idėją, kad jei tai atminties ar masyvo riekė
ir tai, pakartoti per tiek tuo pačiu metu.
Ir tik palyginti raides.
>> Ir jūs turite būti tiek atsargūs, nes jums
nenoriu vieną pirštą prasiveržti pro kitas
nes viena eilutė yra ilgiau nei kiti.
Taigi jūs ketinate norite patikrinti šis specialus vertė pabaigoje, null.
Bet tai tikrai yra pabaigoje, taip paprasta, kaip kad.
Ir tiesą sakant, mums nereikia išradinėti tą ratą.
Štai Versija Du.
Ir tai, ką aš ruošiuosi pasakyti, kad čia yra vietoj lyginant s lygi = k,
Aš vietoj ketinate pasakyti, jei eilutė palyginimas ai kableliais t lygi = 0.
Dabar, kas yra eilutė palyginti?
>> Pasirodo, tai funkcija, kuri ateina su C, kurio gyvenimo tikslas
yra palyginti dvi eilutes.
Ir maišykite lyginti, jei mes skaityti jos vyras puslapis ar dokumentus arba CS50
nuoroda, jis bus tiesiog pasakyti, kad sąmyšį
palyginti grąžą arba neigiamas numeris arba teigiamas skaičius arba nulis,
kur nulis reiškia, kad jie lygūs.
>> Taigi tik spėjimas.
Ką jis galėtų reikšti, jei maišykite palyginti grąžą
neigiama reikšmė arba teigiamas vertė?
PUBLIKA: Didesnis ar mažesnis nei.
David J. Malan: Taip, didesnis ar mažesnis nei.
Taigi, jei norite rūšiuoti visumą krūva stygos į dictionary--
kaip mes galų gale žemyn road-- puikus funkcija naudoti potencialiai
, nes jis ketina daryti, kad palyginimas stygos už jus ir pasakys
jūs tikrai yra prieš b, arba daro b ateiti prieš abėcėlę.
Mes galime padaryti būtent tai.
>> Ir atkreipkite dėmesį aš vienas kitą dalykas šiame pavyzdyje.
Kas dar pasikeitė didesnis iki šios pagrindinės funkcijos?
Char *.
Ir tai yra tai, kad kita balta melas.
Visa tai laikas, kai jūs buvo raštu eilutę,
mes buvo slapta perrašyti Styga kaip char *, kad Zaszczękać tikrųjų
supranta jus.
>> Kitaip tariant, CS50.h ir kaip mes galų gale pamatyti,
mes padarė sinonimas vadinamas eilutę tai tas pats, kaip char *.
Ir dabar, tik žinau, kad *, Šiame kontekste, bent jau
reiškia adresą.
>> KĄ adresas?
Na, tai, kad aš sakiau char *, o ne int * ar plūduriuoti *
reiškia, kad char * yra iš char adresas.
Taigi ši maža dėžutė čia, dar žinomas kaip eilutė, tai tikrai tipo char *,
kuris yra tiesiog išgalvotas būdas pasakyti, šiame langelyje bus eiti adresą.
Ir ką, kad adresas kreiptis į?
Matyt, char.
>> Bet mes galime visiškai turi int * ir kitus dalykus.
Bet dabar, char * yra tikrai dauguma paprastas ir vienas iš interesų.
Taigi ši problema vyksta pakilti, nors vėl.
>> Tarkime, aš atverti šią programą.
Leiskite pamatyti, jei dabar mes galime prognozuoti kas yra negerai su šiuo kodu.
Taigi šioje programoje, kopijavimo 0, aš ketina eiti į priekį ir vėl skambinti
GetString ir saugoti s vertę.
>> Ir tada, kodėl aš darau tai, kaip priminimą savaites praeityje?
Mes padarėme pasakyti, kad GetString kartais grįžta null.
Ką tai reiškia, jei GetString atkreipia null?
Kažkas negerai.
Tai tikriausiai reiškia eilutė yra pernelyg didelis, kompiuterio iš atminties.
Taip atsitinka, super, super, super retai, bet tai gali atsitikti.
Mes norime patikrinti už jį, ir tai viskas, ką mes darome.
>> Nes mes matome dabar, jei jūs neturite pradėti tikrinti nuolat dalykų
kaip nulis, jums gali realiai pradėti eiti
į adresų atminties, kuri yra negaliojanti.
Ir jūs ketinate pradėti paskatinti vis daugiau ir daugiau segmentavimo klaidų.
Arba Mac arba PC, tiesiog sukelia kompiuterio pakabinti
arba programa, skirta užšaldyti, potencialiai.
>> Taigi dabar galiu reikalauti iš copy-0.c, kad I einu kopijuoti šiuos stygos būdu
Laidinės 28.
Ir tada, aš ruošiuosi reikalauti apačioje
čia, kad aš ruošiuosi pakeisti vieną iš jų.
>> Taigi pastebėti tai.
Aš paskambinę mūsų senas draugas strlen.
Ir tik paaiškinti anglų kalba ką ši eilutė 34 daro?
Ką t laikiklį 0 atstovauti kairėje.
Taip.
>> PUBLIKA: pirmasis simbolis t?
David J. Malan: pirmasis simbolis t.
Štai ir viskas.
Pirmas personažas t noriu priskirti didžiąją versiją
pirmojo simbolio t.
Taigi, tai yra kapitalizuojant pirmoji raidė.
Ir tada, aš labai paskutinis dalykas daryti Šioje programoje yra galiu reikalauti čia
originalus, S, ir čia kopija, t.
>> Tačiau remiantis istorija, mes tiesiog papasakojo apie tai, kas iš tikrųjų yra stygos,
kas yra linija, 28 tikrai daro, ir kas yra
todėl klaidų vyksta būti ekrane?
>> Taigi, pirmiausia, pirmasis klausimas, 28.
Kas yra eilutė t = s tikrai darai?
Jei mes turime kairėje rankoje pusė čia seka t = s;
kad man suteikia vieną langelį Čia ir vienas langelis čia.
Ir manau, kad šis adresas yra 0x, tarkim, 50 ir šį kartą, savavališkai.
Ką styginių t = S padaryti po gaubtu?
>> PUBLIKA: [nesigirdi]
>> David J. Malan: Tai saugo atmintį spręsti ten, kad 0x50 eina ten.
Taigi, jei dabar aš einu į pirmą charakteris t ir didžiąsias jį,
ką aš efektyviai daro s?
Aš tikrai daro tą patį, tiesa?
Nes jei Adresas 0x50-- ir tiesiog aš neturiu daug vietos ant lentos čia
bet manome, kad tai yra 0x50 žemyn čia kažkur mano kompiuterio atmintyje.
>> Ir aš, pavyzdžiui, gabe mažosiomis čia, kaip šis.
Ir sakiau t laikiklis 0 pasireiškia kapitalizuojamos.
Na, t laikiklis 0 yra Pirmoji raidė t.
Taigi mažai g ketina tapo didelis G. Bet problema
yra, ką s taip pat rodo?
>> PUBLIKA: tas pats.
>> David J. Malan: lygiai tas pats dalykas.
Taigi paprastas paaiškinimas galbūt, net jei sintaksė yra truputį keistai.
Taigi leiskite tai padaryti.
Padaryti kopiją-0 ir tada ./copy-0.
Pasakyk ką nors: Gabe.
Ir, deja, abu jiems jau buvo kapitalizuotos,
bet už tą pagrindinę finansinę Todėl, kad mes tiesiog
dabar susiduriame su adresais.
>> Taigi, kaip mes pradėti address-- ne kalambūras intended--
kaip mes pradėti spręsti tai ypač didelė problema?
Na, copy1.c, viskas vyksta gauti šiek tiek sudėtingiau.
Bet aš norėčiau teigti, konceptualiai paprastas sprendimas.
>> Taigi sunku gauti iš pirmo žvilgsnio.
Ne bus lengva pirmas laikas rašote jį, ko gero,
bet jei problema yra ta, kad tiesiog daro t = S tik
kopijos adresas, kas, dar kartą, jei aš galiu pasiimti ant jūsų,
bus sprendimas už faktiškai kopijuoti eilutę?
>> PUBLIKA: mes tikriausiai vėl naudoti kilpą.
>> David J. Malan: Taip.
Taigi mes ketiname reikia kilpą dar kartą.
Ir todėl, jei norime kopijuoti eilutė s į kitą eilutę,
mes tikriausiai norite padaryti herojus pobūdžio.
Bet problema yra, jei tai iš pradžių s
dabar turime pradėti aiškiai skirdama t atmintį.
>> Kitaip tariant, tegul perbraižyti šį vieną paskutinį kartą.
Jei tai STRING s = GetString.
Ir tegul įdėti šią čia, taip pat.
Tai GetString.
Ir tada, nors vaizdas kaip kad bus kaip ir anksčiau,
g-b-e / 0.
Tai atrodo šiek tiek kažką panašaus į tai.
Ir ai Todėl mes vadiname tai 0x50, ir kad tai bus 51, 52.
>> Taigi tai yra 0x50.
Ir tada, aš string k.
Be atminties, kad tiesiog vyksta duok man šiek tiek aikštėje panašaus į tai.
Taigi, kas yra svarbus žingsnis dabar?
Jei aš noriu nukopijuoti s į t, kas tuščias mums reikia užpildyti čia?
Arba ką turime padaryti aukšto lygio?
Taip?
Kažkas?
Taip.
>> PUBLIKA: Turime [nesigirdi].
David J. Malan: Taip, mes reikia užpildyti šią tuščią.
Aš negaliu nukopijuoti ir tada pasinaudoti Gabe vardą
kol aš paklausti operacinę sistemą kitos atminties riekė
tai bent toks pat didelis kaip ir originalas.
Taigi, kad palieka mus su klausimu.
>> Kaip man paprašyti operacinę sistemą nėra tiesiog paprastas mažai pointer--
kaip tai vadinama, adresas, pointer-- ne
paprastas mažai dėžutės kaip tai vadinama eilutę?
Kaip man paklausti operacinės sistema didelis riekė atminties?
Iki šiol aš tik Dotarłeś, kad nugarą netiesiogiai paskambinus GetString.
Taigi, kaip yra GetString net gauti savo atmintį?
>> Na, it turns out, kad yra tai kita funkcija čia
kad dabar mes pradėsime naudotis.
Dabar tai atrodo taip daugiau paslaptingas than-- ir aš esu tik vienas, kas gali matyti it--
ši eilutė atrodo taip daugiau paslaptingas tada ji turėtų iš pirmo žvilgsnio.
Bet leiskite erzinti jį išskiria.
>> Kairėje pusėje, turiu char * k.
Taigi anglų kalba, pradėkime suformuluoti tinkamas bausmes techninio žargono.
Taigi, tai yra skiriant kintamasis tipo char * vadinamas t.
Dabar, ką tai iš tikrųjų reiškia?
>> Na, tai reiškia, kad, ką aš ketinu įdėti į šį kintamąjį rodiklį, vadinamą t?
Iš char adresas.
Taigi, kad tik būtų paprasčiau, daugiau racionalus būdas
aprašyti kairiąją pusę.
Taigi, kad sukuria šis langelis čia tik.
Taigi dešinėje pusėje, matyt, vyksta
paskirstyti, kad didesnis riekė atminty kaip?
Taigi leiskite erzinti tai vienas nuo kito.
>> Tai didele pirmo žvilgsnio, Bet kas vyksta viduje čia?
Pirma, ten malloc, kuris matyt mūsų naujas draugas
"Atminties skirti."
Taigi tai yra argumentas buvo priimtas į jį, todėl gana didelis argumentas.
Taigi leiskite erzinti tai vienas nuo kito.
>> strlen iš s, žinoma, atstovauja the--
PUBLIKA: simbolių skaičius.
David J. Malan: Tiesiog simbolių skaičius s.
Taigi s ilgis, originalus eilutė.
Taigi G--b-e.
Taigi, tai tikriausiai keturių šiuo atveju.
Kodėl aš darau 1 po paskambinę strlen iš s?
PUBLIKA: [nesigirdi]
David J. Malan: Norėdami, kad ypatingą null simbolių.
Jei Jūs klausiate manęs, kas iš ilgis Gabe vardas, aš ketinu pasakyti keturis.
Priešais gaubtu, nors man reikia penktasis baitų už null pobūdžio.
Štai kodėl aš darau, kad 1.
>> Dabar tik tuo atveju, jei dirbate tai programa kompiuteryje, išskyrus, tarkim,
CS50 prietaisas, kur apie char dydis
gali būti skirtingi iš savo computer--
Pasirodo, kad aš galiu tai vadiname operatorius sizeof, tiesiog paprašykite kompiuterį,
kas yra dydis char šiame kompiuteryje?
>> Ir padauginus penkių šioje pavyzdžiui, dėl char dydį, kuris
daugelyje kompiuterių bus tik vienas, malloc
ketina skirti man tai didelis riekė atminties per čia dešinėje.
Ir tai vyksta return-- tai function-- todėl
ketina grįžti į mane, ką?
PUBLIKA: adresas?
David J. Malan: What adresas?
PUBLIKA: Iš atminties skyrė?
David J. Malan: Iš atminties skyrė.
Taigi, aš neįsivaizduoju, tiesą sakant, kur tai vyksta, kad galų gale.
Aš ruošiuosi pasiūlyti, kad ji ketina baigti ne 0x88.
Visiškai savavališkas, tačiau kažkur išskyrus 0x50,
nes operacinės sistemos, kas "Windows" ir "Mac OS" padaryti už mane, yra
įsitikinkite, kad ji suteikia man skirtingi gabalai RAM.
>> Taigi tai yra vertė, kai tai riekė atminties gali baigtis.
Taigi, tai yra tai, kas baigiasi čia, 0x88.
Taigi, dabar aišku, aš galiu suprasti kad tai ne tas pats, kaip šis,
nes jie nukreipta į skirtingi gabalai atmintyje.
Taigi, jei aš dabar iš tikrųjų norite nukopijuoti šį į, darykime savo pasiūlytą sprendimą.
>> Leiskite tiesiog eiti, kurti už linijos, ir padaryti t kronšteiną i gauna ai kronšteiną i.
Nes dabar galiu naudoti tai masyvas panašūs notacija,
nes nors malloc labai bendrai skiria man atmintį,
atmintis tik gretimi baitai.
Baitas, baitų, baitų, atgal atgal į nugarą.
>> Galiu tikrai kaip programuotojas traktuoti kaip masyvą, kuris
tai aš galiu naudoti tai pagaliau susipažinę žymėjimą tik kai kurių laužtiniuose skliaustuose.
>> Taigi leiskite man pristabdyti ten, nes tai daug vienu metu, net
nors pagrindinė idėja Priminti yra tai, kad seka, visa tai laikas,
nėra naujų duomenų tipas savaime.
Tai tiesiog vadinamasis žymeklis, iš kurio nors požymio, adresas,
kuris tiesiog reiškia, kad jis numeris kad žmogaus konvencijos
mes linkę rašyti kaip 0x kažką.
>> Bet tai tik skaičius, kaip 33 Oxford Street,
kuris atsitinka būti CS pastato adresas.
Bet apie tokias detales klausimų?
Taip?
>> PUBLIKA: Kodėl mes tikriname kai t yra lygi nuliui?
>> David J. Malan: Kodėl mes patikrinti t lygi nuliui?
Jei mes skaityti documentation-- puikus question-- už malloc,
jis ketina pasakyti smulkiu šriftu, kartais malloc gali grįžti nuliui,
kaip GetString.
Ir iš tiesų, GetString atkreipia null jei, savo ruožtu, malloc grąžina NULL,
nes GetString naudoja malloc.
>> Ir tai gali atsitikti, jei OS "Mac OS", "Windows", kas, yra tiesiog
iš atminties jums.
Taigi tai, kas ten nutiko.
>> Ir leiskite man atskleisti vieną kitą dalyką kad gali tiesiog smūgis jūsų protas
arba visiškai būtų per toli virš linijos.
Bet leiskite man atsigriebti pati kilpa kopijavimo,
kuris prieš akimirką, prisiminti buvo tai. t laikiklis i gauna ai kronšteiną i.
>> Gražus ir patogus.
Vėl Jaučia Savaitės Dviejų.
Tačiau ši versija gali būti iš tiesų perrašyti kaip šis, kuris atrodo sunkiai suvokiamas.
Tai metodas, vadinamas žymeklis aritmetika, adresas aritmetinis.
Bet kodėl tai veikia?
>> Dabar annoyingly, autoriai C nusprendė žaisti
* simbolis skirtingais tikslais.
Mes matėme tai naudojamas tik vieną kartą jau char *, o tai reiškia, "duok man kintamasis
kad ketina būti iš char adresas. "
Taigi char * tame kontekste reiškia "duoti man kintamąjį."
>> Deja, jei jūs naudojate * be žodis priešais jį, kaip char,
tai dabar vadinama dereference operatorius.
Ir mes pamatysime daugiau tai prieš ilgas.
Bet tai tik reiškia, kad "ten".
Tai tarsi sakydamas, jei kas nors ištiesė man ant popieriaus lapo "33 Oxford Street"
jei aš "* 33 Oxford Street," tai reiškia, kad "Eiti keliu į CS pastatą."
>> Taigi * tiesiog reiškia eiti ten, jei ten nė žodžio priešais jį.
Taigi, kas yra t, kad būtų aišku?
t yra apie riekė adresas atmintis, kuri buvo grąžinta į mane.
s kas, kad būtų aišku, adresas, Pavyzdyje mes jau aptarti,
mažųjų Gabe?
s adresas of--
PUBLIKA: eilutė.
David J. Malan: Iš Gabe originalus pavadinimas.
Taigi tai iš adresas Šis atminties riekė.
Taigi, jei aš sakau, t + i-- i pranešimas, yra tik mūsų senas draugas.
Tai tiesiog rodyklė kintamasis Štai Iteracja nuo nulio iki
į styginių s ilgio.
Taigi jis bus lygus nuliui, tada vienas, tada du, tada tris, tada keturi.
Taigi leiskite surinkti šiuos naujus Scratch-kaip puzzle vienetų, jei norite,
nors, vėlgi, sintaksė yra daug paslaptingų nei nulio.
Taigi t adresas + i ketina duoti man
skaičius, nes visa tai yra numeriai, kad mes buvo piešimo kaip hex.
Bet jie tik numerius.
>> Taigi, jei t adresas sakėme buvo 0x88, kas 0x88 plius nulis.
Net jei nesate patenkintas su hex dar spėti.
>> PUBLIKA: originalus.
>> David J. Malan: Vis dar 0x88.
Taigi, ką * 0x88 reiškia?
Tai reiškia, kad "ten", kuris reiškia efektyviai, "Įleisk čia pirštą."
Ir dabar ant dešinėje pusėje Ši sąvoka, * ir tada parens,
s + i tai s, kuri yra spręsti čia mažojo g.
s + 0, žinoma, ai, ką s.
>> Taigi dabar * s, kurios, kaip ir * 33 Oksfordo gatvė tai eikite į adresą
s.
Taigi čia yra tai pirštu, dešinėje.
Taigi, ką aš ketinu kopijuoti į ką?
Dėl teisės dalykas, kuris yra Gabe, mažai g čia į čia.
>> Ir taip to poveikis pirmas iteracijos kilpos,
kaip jums pasiūlė, nors ji atrodo proto daug sudėtingiau nei kas nors
mes matėme anksčiau, tiesiog pasakyti, eikite čia ir nukopijuokite tą simbolį čia.
Jis suteikia jums žemėlapį į abi vietas.
>> Ir mes pamatysime daug daugiau apie tai.
Bet dabar, tikiuosi, yra tik pristatyti kai kurie iš šių pagrindinių idėjų.
Ir iš tiesų, pažvelkime vienas galutinę programą čia
ir tada pažadėjo Claymation, kuris leis viskas gerai.
Viskas gerai.
Taigi leiskite man atidaryti up-- ten mes einame.
Taigi leiskite me-- mes grįžti šį paveikslėlį prieš ilgas.
Leiskite atverti šį galutinį pavyzdį čia.
>> Taigi čia yra super, super programa, kuri realizuoja
nieko gyvenime, kad daro taip.
Ji pirmą kartą pareiškia du kintamuosius X ir y, kad yra ne skaičiai šį kartą,
savaime.
Jie nėra sveikasis skaičius, per se.
Jie, matyt, int *.
Taigi tiesiog bet kas, ką tai reiškia jei jūsų duomenų tipą, jūsų kintamasis,
yra tipo int * žvaigždė?
Štai iš int adresas.
>> Taigi aš neįsivaizduoju, kur ji yra dar.
Tai tiesiog reiškia "įdėti, galų gale, iš int čia adresas. "
0x50, 0x88, kur ji yra atmintis, adresas vyksta ten.
Ir tai, kas y bus, taip pat.
>> Jeigu aš dabar pasakyti, x = malloc (sizeof (int)), tai išgalvotas būdas pasakyti,
ei operacinė sistema, per malloc, duok man pakankamai atminties dydis
iš int, kuris tikriausiai bus 32 bitų ar keturių baitų.
>> Taigi, ką malloc grįžti?
Malloc grąžina adresą.
Taigi, kas ketina gauti saugomi x?
Apie riekė adresas atmintis, keturi baitai, kad malloc
man tiesiog rasti klausia operacinė sistema.
>> Dabar tuo tarpu, linija keturių čia * x = 42.
Tiesiog kad būtų aišku, Kas vyksta ten?
Kairėje pusėje, * x.
tai kaip * 33 Oxford Street.
Taigi * x reiškia ką?
>> PUBLIKA: Eiti į.
>> David J. Malan: Eiti į šiuo adresu.
Kur ta riekė atmintis, eiti į jį.
Ir įdėti ką ten, žinoma?
PUBLIKA: 42.
David J. Malan: 42.
Visos teisės * y pati idėja.
Nueikite į y adresą.
Įdėkite skaičių 13 ten, bet kas y šiuo metu?
PUBLIKA: Nėra atminties y.
David J. Malan: Yra nėra atminties y.
Taigi, ką daro y tikriausiai yra, kaip mes buvo sakydamas?
>> PUBLIKA: Šiukšlių.
>> David J. Malan: Kai šiukšlių vertė.
Dabar, šiukšlių vertė vis dar yra skaičius.
Jis vis dar gali būti klaidingai adresą.
Tai tarsi kažkas parašė kažką žemyn,
ir aš neteisingai jį taip, kai gatve pastatas.
Ir jei jūs tiesiog pabandykite eiti į kai pastatas jūs neturite savo,
arba kai atminties riekė turite ne buvo suteikta, blogi dalykai gali atsitikti.
Kompiuterių gali strigti, arba kai kurie kiti Nenustatyta elgesys gali atsitikti.
>> Taigi intro, tada, kad Binky tai.
Aš vis dar prisimenu, 20 kai nelyginis metų,
kur buvau, kai aš pagaliau Suprantama, patarimų.
>> Kuris yra pasakyti, jeigu jūs palikti čia tris minutes
ir manau, kad aš ne suprasti patarimų, suvokti
Aš atsimenu 20 metų dėl kokių nors kvailai priežasties
kada ir kodėl ji pagaliau nuskendo į, sėdi su savo mokymo
darbuotojas, Nishat Mehta į atgal Eliot valgykla.
Dabar, aš prisiminiau tai, nes tai buvo
viena iš temų, aš, visų pirma, kovojo su.
Ir tada, pagaliau paspaudėte, kaip drįstu pasakyti temų daug
galiausiai bus.
Ir dabar, kad, kad jaučiasi visi laimingesni ir labiau įtikinamai,
tegul priima galutinį išvaizdą mūsų paskutiniai trys minutės čia Binky,
iš mūsų draugų, Nick Parlante iš Stanfordo universitete.
>> [VIDEO PLAYBACK]
>> Ei, Binky.
Pabuskite!
Atėjo laikas rodykle įdomus.
>> -Kas Kad?
Sužinokite daugiau apie rodykles?
Oi, geruolis!
>> Na, pradėti, manau, mes ketinate reikia pora patarimų.
>> Ok.
Šis kodas skiriami du patarimų, kuris gali nurodyti sveikaisiais skaičiais.
Ok.
Na, matau dvi rodykles, tačiau jie neatrodo, kad būti nukreipta į ką nors.
>> -Tai Teisus.
Pradžioje patarimų nenukreipkite nieko.
Dalykų, jie atkreipia dėmesį į taip vadinamą pointees ir nustatyti juos ųjų
atskiras žingsnis.
>> -Oh, Į dešinę, į dešinę.
Aš žinojau, kad.
Į pointees yra atskira.
Er, taip, kaip jūs skirti pointee?
>> Ok.
Na, šis kodas skiria nauja sveikas pointee,
ir Šioje dalyje nustatomi x atkreipti į jį.
>> Ei, tai atrodo geriau.
Taigi, kad jis ką nors daryti.
>> Ok.
Gausit dereference rodykle x saugoti skaičių 42 į savo pointee.
Dėl šios triukas, man reikės mano Magic Wand Dereferencing.
>> -Tavo Magic Wand Dereferencing?
That-- tai puiku.
>> -Tai Ką kodas atrodo.
Aš tik įsteigė numerį ir [POP]
>> Ei, atrodo.
Ten ji eina.
>> -Taigi Daro dereference ant x taip rodyklė prieiti prie savo pointee.
Šiuo atveju, 42 parduotuvė ten.
Ei pabandykite jį laikyti numerį 13 pro kitą rodyklę, m.
>> Ok.
Aš tiesiog eiti per čia y, ir gauti skaičius 13 išsidėstymą aikštelėje.
Ir tada, imtis Wand Dereferencing ir tiesiog [BUZZ]
>> -Oh!
>> -Oh, Ei!
Tai nepadėjo.
Pasakykite, Binky, aš nemanau, kad dereferencing y yra gera idėja, nes jūs žinote,
steigiant pointee yra atskiras žingsnis.
Ir aš nemanau, kad mes kada nors padarė.
>> -Labas Taškas.
-Taip.
Mes skyrė rodyklė m, bet mes niekada nustatykite, kad rodytų į pointee.
>> -Labai Pastabus.
Ei, jūs ieško gero ten, Binky.
Ar galite nustatyti taip, kad y punktai tuo pačiu pointee Kadangi X?
>> -Sure.
Aš naudoju mano Magic Wand iš Pointer užduotį.
>> -Ar Kad bus kaip ir anksčiau problema?
-Ne.
Tai neliečia pointees.
Jis tiesiog keičia vieną žymiklį į atkreipti dėmesį į tą patį dalyką, kaip ir kitas.
>> -Oh, Matau.
Dabar y nurodo toje pačioje vietoje kaip ir X.
Taigi laukti.
Dabar, y yra fiksuotas.
Ji pointee.
Taigi galite pabandyti su Wand Dereferencing vėl siųsti 13 perėmimą.
>> -Uh, Gerai.
Štai jis eina. [POP]
>> Ei, atrodo, kad.
Dabar dereferencing darbus y.
Ir dėl to, kad rodyklės dalintis kad viena pointee, jie abu pamatyti 13.
-Taip.
Dalijimasis, nesvarbu.
Taigi mes ketiname pereiti vietas dabar?
>> Oi, atrodo.
Mes pavėluotai.
>> -But--
>> -Just Prisiminti tris žymeklį taisykles.
Number One, pagrindinė struktūra yra tai, kad jūs turite žymeklį,
ir ji nurodo perkelti į pointee.
Bet žymeklis ir pointee yra atskiras,
ir bendra klaida yra įsteigti žymeklį,
bet pamiršti suteikti jai pointee.
>> Skaičius Du, žymeklis dereferencing prasideda rodyklė
ir taip savo rodyklę per prieiti prie savo pointee.
Kaip mes visi žinome, tai veikia tik tuomet, jei yra
pointee, kokios rūšies grįš į Darbo tvarkos taisyklių numeris vienas.
>> Number Three, žymeklis paskyrimas trunka vieną žymiklį
ir keičia ją, kad rodytų į pats pointee kaip kitą rodyklę.
Taigi po perleidimo, dvi rodykles
bus taškas į tą patį pointee.
Kartais, kad vadinama dalijimosi.
Ir kad viskas yra į jį, tikrai.
Bye-bye dabar.
[END VIDEO PLAYBACK]
David J. Malan: Štai jį CS50.
Mes jus pamatyti kitą savaitę.