>> [Muusika mängib]
>> DAVID J. Malan: Olgu.
>> [Naer]
>> Tere tulemast tagasi.
See on CS50.
Ja see nädala lõpuks viis.
Ja siiani oleme päris palju võtnud enesestmõistetavaks, et seal
olemas selle koostaja, rõkkama, et olete on tuginedes teel selle
muu tööriist nimega Mark, et kuidagi võluväel teisendab lähtekoodi
arvesse objekti kood, nulli ja need et teie arvuti protsessor, keskne
keskseade, tegelikult aru.
Aga selgub, seal on number, mis on toimub all kapuuts
sisendi ja väljundi vahel.
>> Ja ma tahaksin teha ettepaneku, et me liha et läbi veidi üksikasjalikumalt arvesse
Need neli sammu, on midagi, mida nimetatakse eeltöötlust, midagi
kutsutud, koostamise, mida me oleme näinud, midagi, mida nimetatakse kokkupanek ja
midagi, mida nimetatakse siduda.
Seega seni, mõned meie programmid, oleme olnud terav ka.
Hiljuti oleme olnud mõned teravad määranud konstandid.
Nii selgub, et need asjad, mis ees seisab hash sümbol või
nael sümbol on pre-protsessor direktiividele.
See on lihtsalt fancy viis öelda, et see on rida koodi, mis on tegelikult
ümber midagi enne arvuti isegi proovida muuta oma
Programm viiakse nulli ja ones.
>> Näiteks terav sisaldab standard I / O. H, päris palju tähendab lihtsalt minema
ees, ostke failide sisu stdio.h ja kleebi need seal.
Nii ei nulli ja need sel hetkel veel.
See on tõesti lihtsalt vahetuseks.
Ja see on tehtud ajal nn eeltöötlust etapis, kui te
tegelikult kulgema rõkkama või spetsiaalselt Tee enamikel juhtudel.
Nii et kõik see on toimunud esimene automaatselt seni.
>> Siis tuleb koostamise etapis.
Aga oleme olnud liiga lihtsustatult koostamine.
Koostamise programm tegelikult tähendab võta seda midagi C,
lähtekoodi oleme olnud kirjalikult, alla et midagi, mida nimetatakse koost.
Assembly on madalamal tasemel keeles, et õnneks ei saa me
on palju võimalust kirjutada see semester.
Aga see on madalaimal tasemel selles mõttes, et sa sõna otseses mõttes hakake
liita ja lahutada ja korrutada ja koormus mälust ja mällu salvestamiseks,
väga põhilised juhised, et arvuti, all kapuuts,
tegelikult aru.
>> Lõpuks kokkupanek võtab selles keeles et nullid ja need, kes me oleme
kirjeldab seni.
Ja tõesti lõpuks, seal on nn sidudes etapp, mida me tulen
vaata vaid hetk, mis ühendab oma nulle ja need nullidega ja
need teised inimesed enne olete loonud.
>> Nii leiavad selle super lihtne programm.
See oli 1. nädal.
Ta lihtsalt ütles, Hello World, ekraanil.
Meil oli see läbi rõkkama.
Või me jooksis ta läbi teha mis kestis rõkkama.
Ja väljastada ajal kui mõned nullid ja ones.
Aga selgub, seal on vaheetappi.
Kui ma lähen siia - oops, ei tahan teda näha veel.
Kui ma lähen siia, et mu seade ja ma avada hello.c siin
on see, et sama programmi.
Ja see, mida ma teen oma terminal aken siin ma lähen
joosta rõkkama mitte teha, mis automatiseerib kõik neli
need sammud meile.
Ja ma teen rõkkama-S ja siis hello.c ning seejärel sisestada.
>> Ja ma saan vilgub kiiresti jälle, mis on hea.
Ja nüüd veidi suurem aknas Ma lähen avama gedit siin.
Ja ma lähen avama faili, Selgub, nimetatakse hello.s see
sisaldab mis Assembly Mainisin.
Ja see on, mida nimetatakse kokkupanek keel, üsna madal
juhiseid, et oma Intel CPU või mis iganes see on, mis seal sees on
mõistab.
Ja mov on liikuda. kõne eest helistada, väga madalal tasemel funktsioon.
sub on lahutamine.
>> Nii et kui teil on konkreetne CPU sees arvutisse, mis muudab
selge, võrreldes teiste protsessoriga kohta turul, on mis juhiseid selle
mõistab ja sageli, kui tõhus see on, kui kiiresti see on täidesaatva mõned
juhendit.
Nüüd enam seda, mida saate teha Järgmine Fall CS61 Kolledžis.
Aga siin me oleme, näiteks mõne tunnused, mis võib tunduda tuttav.
hello.c on programmi nimi.
>> . Teksti -
seal ei ole palju huvi on olemas just, meelde tuletada, et tekst
segment, sest esmaspäeval, on koht, kus on mälu oma programmis tegelikult jõuab.
Nii et vähemalt ähmaselt tuttav seal.
Siin on muidugi mainida meie peamine ülesanne.
Kerides, need viitavad asjad nn registrite väga väike tükkideks
mälu sees oma tegelik CPU.
Ja kui ma keri isegi edasi, ma näen mingi
kaudne mainita ASCII.
Ja tõepoolest on, et string, tere, koma maailmas.
>> Nii pikk lugu lühike, see on olnud juhtub teile, automaatselt,
all kapuuts kõik see aeg.
Ja mis juhtunud on tõesti kord olete sattunud rõkkama või teel
Tee, et sa saad esimese, lähtekoodist,
niinimetatud Assembly.
Siis rõkkama toimub üleminek selle kokkupanek keele alla nulli ja ones.
Ja see on see slaid, alustasime meie arutelu Week 0 on -
ja siis nädal 1.
Ja siis lõpuks, need nullid ja need, kombineeritakse nulli ja need
nende raamatukogud oleme võtnud enesestmõistetavaks nagu Standard I / O või
String raamatukogu või isegi CS50 raamatukogu.
>> Nii, et maalida seda pilti enam visuaalselt, meil hello.c.
Ja see on muidugi kasutab printf toimida öelda, tere.
Koostamise etapis võetakse see alla et fail me just nägin hello.s isegi
kuigi see on tavaliselt kustutatud automaatselt ära.
Aga see on koost kood keset samm.
Ja siis, kui me kokku assamblee keel, nii et rääkida, see on kui sa
saada need nullid ja ones.
Nii oleme suumitud tõhusalt täna mida me oleme võtnud ette antud,
tähendab läheb lähtekoodi vastuväiteid kood.
>> Aga lõpuks, nüüd, et sama pilt - olgem pista see üle
vasakul pool.
Ja pange tähele, et top on Mainisin stdio.h.
See on fail, mis oleme lisanud peaaegu kõik
programme oleme kirjutanud.
Ja see on fail, mille sisu saada koopia kleebitud,
tõhusalt atop oma kood.
Aga selgub, et arvuti süsteem kuhugi, seal on arvatavasti
stdio.c fail, et keegi kirjutas aastat tagasi, mis rakendab kõik
funktsioonid, mis olid kuulutatud aastal stdio.h.
>> Nüüd tegelikult on see ilmselt mitte Mac või PC või isegi
CS50 seade on toores C kood.
Keegi juba koostatud, ja ka . O faili objekti kood või.
fail, mis viitab jagatud raamatukogu mis on olnud eelnevalt paigaldatud ja
eelkompileeritud teile.
Aga oletame, et on tõepoolest olemas meie arvuti stdio.c paralleelselt
koos rõkkama.
Sinu kood kuramuse koostatud ja kokku monteeritud.
stdio.c 's kood on koostatud ja kokku pandud, nii et see kõige viimane
samm, siia alla, peame kuidagi link, niiöelda oma nulle ja need
koos tema nullide ja need ühte lihtne programm, mis lõppkokkuvõttes on
nimetatakse lihtsalt Tere.
>> Nii et see kõik magic see on juhtunud siiani.
Ja jätkab nende protsesside enesestmõistetavaks, kuid realiseerida
seal on palju mahlane üksikasju toimub all olemas.
Ja see teebki oma Arvuti Intel inside
eriti selge.
>> Nii on see märkus, kui soovite liitu meiega lõunale see reede, ei lähe
tavalisi koht cs50.net/rsvp, 13:15 see reede.
Ja nüüd mõned teated.
Nii et meil on häid uudiseid.
Ja meil on halbu uudiseid.
Alusta mõned head uudised siin.
>> [Groaning]
>> Hea küll.
Noh, see on tehniliselt puhkus, nii see ei ole nii palju kingitus meile.
Aga halb uudis muidugi.
>> [Groaning]
>> Veetsin palju aega Nende animatsioone.
>> [Naer]
>> Tekib läbivaatamine istungil tuleval esmaspäeval.
See saab olema 05:30.
Me meelde kõik need detailid e-posti teel on kursuse
kodulehel vaid paar päeva aega.
See filmitakse ja kättesaadavaks varsti pärast seda.
Nii et kui te ei saa teha, et esmaspäev öö pesa, ärge muretsege.
Sektsioonid tuleval nädalal ka keskenduda läbivaatamine viktoriini.
Kui teie osa on esmaspäeval, mis on tõepoolest ülikooli puhkus, siis me
endiselt vastama punktis.
Kui sa lihtsalt ei saa teha, et jagu, sest sa lähed
ära, see on hea.
Osale pühapäev või teisipäev osa või tune-in Jasoni osa, mis on
saadaval online.
>> Niisiis, rohkem halbu uudiseid.
Seega vastavalt õppekava, meil loeng järgmisel reedel.
Aga hea uudis -
selgelt, veetsin liiga palju aega see.
>> [Naer]
>> Me katkestame järgmisel reedel loenguid.
Nii et on kingitus meile, et sa tõesti on kena kergendust
vahel selle nädala ja kahe nädala pärast on.
Seega ei ole loenguid järgmisel nädalal, lihtsalt väike väike viktoriin, mille abil peaks olema
üha rohkem põnevil.
>> Teeme nüüd tähelepanu pöörata midagi, mis on tõesti rohkem visuaalse
ja põnevam ning panema mida saab olema silmapiiril
vaid paar nädalat aega.
Pärast esimest viktoriin, me lülitage Keskenduda meie probleem komplekti teise
domeeni konkreetne probleem, mis kohtuekspertiisi või turvalisuse üldisemalt.
>> Tegelikult traditsioon selle probleemiga komplekt on minu jaoks üks
õpetamise mehe või pädevad kõndida üle campus võttes mõned fotod
tuvastatav kuid mitte ilmne inimesed, kohtades või asju, siis igal aastal I
kuidagi õnnestub kogemata kustutada või rikkuda digitaalmeedia kaart
mis seal sees on meie kaamera.
Aga pole hullu.
Võin minna ja ühendage et minu arvuti.
Võin teha kohtuekspertiisi pilt sellest, et rääkida, kopeerides nulli ja
need maha, et mälukaart, kas oma SD-kaardi või Compact Flash kaardi või
mis iganes te olete juba tuttav.
Ja siis saame käsi, mis välja.
>> Ja nii väljakutse ees, muu hulgas asju teile, saab kirjutada
C kood, mis taastab terve hunnik JPEG mulle ja selgus on
neid inimesi, kohti või asju.
Ja me ka rääkida, et see probleem kehtestatud ja päeva tulla, umbes
graafika üldisemalt.
Oleme kasutanud neid, muidugi, jaoks välja murda.
Aga sa oled justkui iseenesestmõistetavaks on olemas need kõrge mõisted
ristküliku ja ovaali.
Aga all kapuuts on pikslit.
Ja teil on olnud alustada mõtled neid.
Või siis p-set 4 mõtlema umbes lõhet oma tellised, kuidas
kiiresti sa pall liigub üle ekraani välja murda.
Seega on see mõiste dots ekraanil, mis on
tulevad mängu juba.
>> Nüüd, mida sa näed, kui see, mida saad arvutiekraanil.
Kui olete kunagi vaatasin mõned hea või halb TV, koefitsiendid on nad päris palju
ravida publik nagu technophobes kes tõesti ei
tea, palju arvuti.
Ja nii see on väga lihtne, et politsei detektiiv öelda, kas te
puhastada, et minu jaoks?
Või parandada, eks?
Tõsta on nagu buzz sõna kõige muu kuriteoga seotud show.
Ja reaalsus on see, kui te võtate väga udune pilt kahtlustatava teed
midagi halba, ei saa te lihtsalt parandada seda.
Sa ei saa suumida lõpmatult.
Sa ei saa näha helk kellegi silma pannud, et
eriti kuritegevuse, vaatamata levimus seda telekast.
>> Ja nii koos, et lähme motiveerida, et tulemas probleem komplekt pilguheit
mõned näitab, kellega võib olla tuttav.
>> [VIDEO PLAYBACK]
>> -OK.
Nüüd lähme hea pilk teile.
>> -Hoia seda.
Käivita see tagasi.
>> -Oota.
Mine õige.
>> -Ei.
Freeze et.
>> -Full screen.
>> -OK.
Freeze et.
>> Pingutage üles, et on ju?
>> -Vektor on see mees poolt tagarattal.
>> -Zoom in siinsamas kohapeal.
>> -Mis õige varustus, imaged on võimalik suurendada ja teritatud.
>> -Mis see on?
>> -See on suurendamise programmi.
>> -Kas sa selge, et kuni kõik?
>> -Ma ei tea.
Olgem suurendada seda.
>> -Tõsta osa-6.
>> -I suurendanud detail ja -
>> -Ma arvan, et seal on piisavalt tõhustada.
Vabastage see, et mu ekraanil.
>> -Tõsta peegeldus oma silmaga.
>> Vaatame käivitada kaudu video lisaseadmega.
>> -Edgar, sa saad parandada seda?
>> -Oota.
>> -Ma olen töötanud selles peegeldus.
>> -Kellegi peegeldus.
>> -Peegeldus.
>> -Seal on peegeldus on mehe nägu.
>> -Peegeldus.
>> -Seal on peegeldus.
>> -Suumida peegel.
>> -Näete peegeldus.
>> -Kas sa parema pildi siit?
>> -Kas teil suurendada teda siin?
>> -Kas sa parandada seda?
>> -Kas me saame parandada seda?
>> -Kas sa parandada seda?
>> -Oota üks sekund, ma suurendada.
>> -Suumida uks.
>> -X10.
>> -Zoom.
>> [Naer]
>> -Viige sisse
>> Oota, lõpetage.
>> -Lõpeta.
>> -Paus.
>> Pööramiseks 75 kraadi ümber vertikaalne palun.
>> [Naer]
>> -Stop ja tagasi osa umbes uks uuesti.
>> -Sain pildi tugevdaja et saab bitmap?
>> -Võib-olla saame kasutada Pradeep Sen meetod näha arvesse aknad.
>> -See tarkvara on nüüdisaegse.
>> -Ikoon väärtus on välja lülitatud.
>> -Õige kombinatsioon algoritme.
>> -Ta on võtnud valgustus algoritme järgmisele tasandile ja ma ei kasuta neid
suurendada selle foto.
>> -Lukusta ja suuremalt z-telg.
>> -Tõsta.
>> Külmutada ning parandada.
>> [END VIDEO PLAYBACK]
>> DAVID J. Malan: Nii Ülesanded 5 on mis ootab seal.
Nii et me varsti paremini mõista , millal ja miks te ei
ja meie ei saa suurendada sel viisil.
Aga kõigepealt, lähme tagasi pöörduda meie tähelepanu mõned ehitusplokkide paneme
pead suutma öelda, et lugu.
>> Nii meenutavad, et me selle joonistas pildi Esmaspäev ja natuke eelmisel nädalal.
Ja see kirjeldab paigutust asjad arvuti mälust
töötab mõned programmi.
Tech segment kuni top, mäletate, viitab tegeliku nulli ja need
et koostada oma programm.
Seal all, et mõned vormindatud või uninitialized andmed, mis tavaliselt
viitab asjad konstandid või stringid või globaalsed muutujad, mis on
tunnistatud ette.
Seal on hunnik, kuid me tuleme tagasi, et natuke.
>> Ja siis on stack.
Palju nagu virna plaate Kohvik on see, kui mälu saab
õhuline ja kihiline kui sa seda, mida programmis?
Mis on virnas kasutada?
>> Jah?
>> Helista funktsiooni.
Iga kord, kui helistada funktsioon, see on antud Kiip mälu selle
kohalike muutujate või parameetrite kohta.
Ja piltlikult, siis näeme, et iga järjestikuste funktsiooni nimetatakse, kui
kutsub B kõnede C kõned D, nad saada kihiline peale virna.
Ja igas neist viilud mälu on oma olemuselt unikaalne ulatus
selle ülesande täitmiseks, mis muidugi Probleemne on, kui soovite, et käsi
ühest funktsiooni teise tükk andmeid, mis sa tahad seda
muteeruda või muuta.
>> Mis siis oli meie lahendus, mis võimaldab Funktsioon esindab üks pinu
muutmiseks kaadri mälu sees teise freimi?
Kuidas need kaks üksteisega rääkivate?
Nii teel vihjeid või aadressi, mis jällegi lihtsalt kirjeldada, kus
mälu teel konkreetse hammustada number, eelkõige
väärtus võib leida.
Nii meenutada viimast korda liiga jätkasime lugu ja vaatasin
üsna lollakas programmi.
Ja see programm on lollakas mõne põhjusi, kuid kõige murettekitav üks on
sest ta ei suuda kontrollida, mida?
>> Jah, see ei vaadata sisend.
Vabandust?
>> Kui see on rohkem kui 12 tähemärki.
Nii väga uhkelt, helistades memcopy, mis, nagu nimigi ütleb, on lihtsalt
koopiad mälu Teise argumendiga arvesse selle esimene argument.
Kolmas argument, väga uhkelt, on kontrollitakse veendumaks, et te ei
kopeerida üle, antud juhul, pikkus baar, tähemärkide arv,
arvesse kohtades, mis on selle array C. Aga probleem on selles, et mida
kui C ise ei ole piisavalt suur, et hakkama?
Sa lähed kopeerida arvu bytes et olete saanud.
Aga mida sa tegelikult olla rohkem bytes kui teil on ruumi?
>> Noh, see programm väga rumalalt lihtsalt pimesi tulu võtta mis iganes see on
arvestades, tere Kenoviiva 0 on tore, kui string on lühike
piisavalt, nagu viis tähemärki.
Aga kui see on tegelikult 12 tähemärki või 1200 tähemärki nägime viimast korda
et sa oled lihtsalt läheb täielikult kirjutatakse mälu
ei kuulu teile.
Ja halvim, kui te kirjutada, et punane osa on, et me kutsusime
saatja aadress -
see on lihtsalt, kui arvuti automaatselt teie eest, taga
stseene, tucks ära 32-bitine väärtus meenutab seda, mida aadress see peaks
tagasi kui suva see teine ​​funktsioon, tehakse täidesaatva.
See leivaraasukese kehvasti millele ta naaseb.
Kui sa kirjutada, et potentsiaalselt kui sa oled paha poiss, ei saaks
potentsiaalselt üle võtma kellegi arvutis.
Ja sa kindlasti crash see enamikel juhtudel.
>> Nüüd on see probleem oli ainult süvendanud kui me hakkasime rääkima mälu
juhtimine üldisemalt.
Ja malloc, mälu eraldamist, on funktsioon, mida saame kasutada, et eraldada
mälu, kui me ei tea ette et me vajada.
Nii näiteks, kui ma lähen tagasi seadmele siin.
Ja ma avama alates viimane aeg hello2.c, mäletate seda programmi siin, mis tundus
natuke midagi sellist, ainult kolm rida -
oma nimi, siis string nimi, vasakul, võrdub getString.
Ja siis me välja trükkida, kasutaja nimi.
>> Nii et see oli super lihtne programm.
Et oleks selge, lubage mul minna ja teha tere-2.
Ma lähen tegema dot kaldkriipsuga tere-2.
Oma nimi -
David.
Enter.
Tere David.
Tundub, et töö OK.
Aga mis tegelikult toimub all kapuuts siin?
Esiteks olgem Tõmmake mõned kihid.
String on lihtsalt sünonüüm oleme aru milleks?
Char star.
Seega teeme seda pisut kauge kuid tehniliselt õige, et see
on char täht, mis tähendab, et nimi, jah, on varieeruv.
Aga mis nime kauplustes on aadress char, mis tundub natuke kummaline
sest ma saan tagasi string.
Ma saan tagasi mitmekordne sümbolid ei char.
>> Aga muidugi, sa pead ainult esimene char aadressi meeles pidada, kus
terve rida on, sest miks?
Kuidas aru saada, kus lõpuks string teades algusest?
Kenoviiva null.
Nii need kaks vihjeid nuputada enne algust ja lõppu
iga string on, nii kaua, kui nad nõuetekohaselt moodustatud, et null
terminaator et Kenoviiva null.
>> Aga see nõuab getString.
Ja selgub, et getString kõik see aeg on olnud omamoodi
petnud meid.
See on teinud seda tööd, et olla kindel, saada string kasutaja.
Aga kui see on mälu välja tuleb?
Kui me läheme tagasi pilt siin kohaldatakse määratlusega ainult
hetk tagasi, et stack on kui mälu läheb, kui ülesanded on kutsutud,
selle loogika, kui helistate getString, ja siis ma kirjutada
D-A-V-I-D Märkida vajaduse on D-A-V-I-D Kenoviiva null salvestatud, mis põhineb
lugu oleme rääkinud meile palju?
>> Tundub olevat korstnat, eks?
Kui helistate saada string saad väike tükk mälu stack.
Seega on loogiline, et D-A-V-I-D Kenoviiva null on salvestatud
seal pakis.
Kuid oodake minut, getString tulu et string, nii et rääkida, mis tähendab,
see salv kohviku võetakse ära pinu.
Ja me ütlesime, viimane aeg, et kiiresti tagastab funktsioon, ja sa võtad, et
salve, nii et rääkida, ära pinu mida sa saad endale umbes jäänused
et mälu?
Ma justkui redrew need küsimärgid sest nad tegelikult saada
tundmatu väärtused.
Neid võib uuesti kasutada, kui mõned Järgmise funktsiooni nimetatakse.
>> Teisisõnu, kui me juhtumisi tuleb hoidmine -
Ma joonistan kiire pilt siin virna.
Kui me juhtumisi joonistus alt minu mälu segment ja me öelda
et see on koht, mälu hõivatud peamine ja võib-olla arg c ja
arg v ja kõike muud programmi, kui getString nimetatakse,
arvatavasti getString saab tüki mälu siin.
Ja siis D-A-V-I-D kuidagi jõuab seda funktsiooni.
Ja ma lähen lihtsustavad.
Aga oletame, et selle D-A-V-I-D Kenoviiva null.
Nii et see palju baite kasutatakse raami getString.
>> Aga niipea, kui getString naaseb, me ütles viimane kord, et see mälu üle
siin kõik muutub - woops! -
kõik muutub tõhusalt kustutada.
Ja me ei mõtle seda praegu küsimus märgid, sest kes teab,
mis toimub, et saada selle mälu.
Tõepoolest, ma väga tihti kõne funktsioonid va getString.
Ja niipea, kui ma kutsun mõne muu funktsiooni kui getString, võibolla mitte
Selle konkreetse programmi me lihtsalt vaatas juures, kuid mõned teised, kindlasti mõned muud
funktsioon võib lõpuks antakse Selle kõrval koha stack.
>> Nii et see ei saa olla, et getString kauplustes D-A-V-I-D korstnat, sest ma tahan,
kohe kaotada juurdepääsu.
Aga me teame, et nad getString ainult naaseb mida?
See ei ole tagasi mulle kuus tähemärki.
Mis on see tõesti tagasi ei me järeldada, viimane kord?
Aadress esimene.
Nii kuidagi, kui sa helistasid getString, see eraldada tüki mälu
string, et kasutajad tüüpi ja siis jälle aadressi ta.
Ja selgub, et kui sa tahad toimida eraldada mälu selle
viis ja tagasi isik, kes nimetatakse et funktsioon, aadress
et tüki mälu, sa absoluutselt ei pane see korstnat
põhja, sest funktsionaalselt on see lihtsalt läheb ei saanud sinu väga
kiiresti, nii et saate ilmselt arvata, kui me ilmselt läheb Toss
selle asemel, nn hunnik.
>> Nii vahel allosas oma mälu on kujundus ja ülaosas oma mälu on
layout on terve hunnik segmentides.
Üks on korstna ja õigus Eespool on hunnik.
Ja hunnik on lihtsalt erinev tüki mälu, mis ei ole kasutatavad funktsioonid
kui neid kutsutakse.
Seda kasutatakse pikaajalise mälu, kui tahad üks funktsioon haarata mõned
mälu ja saaks riputada see kaotamata kontrolli selle üle.
>> Nüüd võid olla kohe näha, et see ei ole
tingimata täiuslik disain.
Nagu oma programmi eraldatud mälu korstnat, või kui helistate rohkem ja
rohkem funktsioone, või kui te eraldada mälu hunnik koos malloc välja nagu
getString teeb, mis selgelt tundub olevat vältimatu probleem?
>> Just.
Sarnaselt sellele, et need nooled on üksteisele suunatud
ei tõota.
Ja tõepoolest, me võiksime väga kiiresti krahhi Programmi mis tahes mitmel viisil.
Tegelikult ma arvan, et meil võiks olla seda teinud kogemata üks kord.
Või kui mitte, teeme ära tahtlikult nüüd.
Lubage mul minna ja kirjutada super kiiresti programmi nimega dontdothis.c.
Ja nüüd ma lähen siin ja ei terav hulka stdio.h.
Olgem kuulutada funktsiooni foo võtab ühtegi argumenti, mis on
tähistatakse samuti poolt tühine.
>> Ja ainus asi foo läheb vaja on Kõne suva, mis ilmselt ei ole
targem mõte, kuid olgu nii.
Ent peamine tühine.
Nüüd on ainus asi, peamine läheb teha, on helistada foo samuti.
Ja lihtsalt peksab, ma lähen käia siin ja öelda printf "Tere
suva. "
>> OK.
Nii et kui ma ei eksi, Tee dontdothis dot kaldkriips.
Ja teeme seda suurem aken -
dot slash, dontdothis.
Tule.
Uh oh.
Ilmselt saab seda teha.
Kurat.
OK.
Oota.
Oodake.
Kas me -
Me ei kasuta seda teha.
>> [Ohkab]
>> Ma tean, aga ma arvan, et me lihtsalt kustutada seda.
Uh, jah.
Kurat.
Lahenda see Rob.
Mida?
See on väga lihtne.
Jah, me pöördusime optimeerimise off.
OK, seista aega.
Nüüd ma ennast paremini.
OK.
Hea küll.
>> Teeme kompileeri see -
Tee sa dontdothis.
Te võib-olla ümber see, et dothis.c vaid hetk.
Vot nii.
Aitäh.
OK.
Nii, et ma olin trükkimine midagi välja oli tegelikult lihtsalt
aeglustab protsessi, millega me oleks nii kaugele jõudnud.
OK.
Phew!
>> Mis siis tegelikult toimub?
Põhjuseks on, just nagu kõrvale, on tee midagi nii panuse ja
väljund kipub olema aeglasem, sest sa on kirjutada märke
ekraan, see on kerida.
Nii pikk lugu lühike, oli mul tegelikult juhtus nii kannatamatu, oleks meil
näinud seda lõpptulemus ka.
Nüüd, kui ma sain sõita print-ups, näeme seda kohe.
Miks see nii on.
Noh, lihtne selgitus, muidugi, on see, et suva ilmselt ei tohiks
kutsudes ise.
>> Nüüd üldiselt see on rekursioon.
Ja me arvasime, paar nädalat tagasi rekursiivne on hea.
Recursion on see maagiline viis väljendada ennast super tabavalt.
Ja see lihtsalt toimib.
Aga seal on põhijoon kõik rekursiivne programmid oleme rääkinud
kohta ja vaatas seni mis oli see, et neil oli mis?
Tugipunkti, mis oli mõned kõva kodeeritud Juhul, ütles mõnes olukorras
ei sea suva, mis on selgelt ei ole siin.
>> Mis siis tegelikult toimub mõttes see pilt?
Noh, kui peamine nõuab suva, see saab viilu mälu.
Kui foo kutsub suva, kui ta saab viil mälu.
Kui foo kutsub suva, see läheb tükk.
Läheb tükk.
Sest suva kunagi tagasi.
Me ei ole kunagi kustutamine üks neist raamid pinu.
Nii et me puhub läbi hunnik, ei rääkimata, kes teab mida veel, ja
me ületamata meie niinimetatud segment mälu.
Viga minna killustatust vale.
>> Seega lahendus on olemas Loomulikult ei saa seda teha.
Aga suurem mõju on see, et jah, seal absoluutselt on mõned piirmäära
isegi kui see ei ole täpselt määratletud, selle kohta, kuidas palju funktsioone saab helistada
programm, mitu korda funktsiooni võib helistada ise.
Nii et kuigi me tegime jutlustama rekursioon kui see potentsiaalselt maagiline asi
Paar nädalat tagasi, et sigma funktsioon, ja kui me saada andmeid
struktuuride ja CS50, näete teisi taotlused, see ei ole
tingimata parim asi.
Sest kui funktsioon nõuab ise, kutsub ise, isegi kui seal on alus
juhul, kui sa ei tabanud, et aluspõhimõtted eest 1000 kõned või 10000 kõnede poolt
et aeg, mida oleks võinud otsa toas oma nn korstna ja vajuta
mõned teised segmendid mälu.
Nii see ka on disaini kompromiss vahel elegants ja vahel
stabiilsuses teie rakendamist.
>> Nii et seal on veel negatiivsed või teine ​​gotcha et me oleme
teinud siiani.
Kui ma helistasin getString -
lase mul minna tagasi tere-2.
Pange tähele, et ma helistan getString, tagastava aadress.
Ja me väidame täna sellele aadressile on hunnik.
Ja nüüd ma olen väljatrükk string sellel aadressil.
Kuid me pole kunagi kutsutud vastand getString.
Meil pole kunagi olnud CALLL funktsioon nagu ungetstring, kuhu käsi tagasi
et mälu.
Aga ausalt öeldes me ilmselt oleks pidanud olema.
Sest kui me küsime endiselt arvuti mälu teel keegi nagu
getString kuid ei anna see tagasi, kindlasti et liiga on kohustatud viima
probleeme, millega me otsa mälu.
>> Ja tegelikult, saame otsida need probleeme uue tööriista, mille kasutamine
on veidi segasena kirjutada.
Aga lubage mul minna ja tere it up ekraanil vaid hetk.
Ma lähen edasi minna ja käivitada Valgrind parameeter, mille esimene käsk
line argument on nimi kõnealuse programmi tere-2.
Ja kahjuks on see toodang on metsikult
keeruline mingit põhjust.
Nii me näeme kõik, et jama.
David on märgitud minu nimi.
Nii et see programm tegelikult töötab.
Ja nüüd me saame selle toodangut.
>> Nii Valgrind sarnaneb sisuga GDB.
See pole siluri iseenesest.
Aga see on mälu kontrollija.
See on programm, mis töötab teie programmi ja ütleb teile, kui teil palutakse
arvuti mälu ja kunagi andis ta tagasi, mis tähendab, et teil on
mäluleke.
Ja mälu lekked kipuvad olema halb.
Ja sa ei kasutajate arvutid on ilmselt tundis seda, kas teil on
Mac või PC.
Kas olete kunagi kasutanud oma arvutit kuigi mitte rebooted mitmes
päeva, või olete lihtsalt sain palju programmid töötavad, ja neetud asi
aeglustab järsult pidurdada, või vähemalt see on super tüütu kasutada, sest
kõike just super aeglane.
>> Nüüd, võib olla mis tahes mitmel põhjusel.
See võiks olla lõputu silmuse, viga kellegi kood, või lihtsamalt, see
võib tähendada, et te kasutate rohkem mälu või üritab, kui teie
arvuti tegelikult on.
Ja võib-olla seal on viga mõnes programmis et hoida paludes mälu.
Brauserid aastaid olnud tuntud see, paludes rohkem ja rohkem mälu
kuid kunagi teisaldus tagasi.
Kindlasti, kui teil on vaid piiratud mälu, sa ei saa küsida
lõpmatult palju kordi mõned, et mälu.
>> Ja mis sa näed siin, kuigi jälle Valgrind väljund on
tarbetult keeruline pilk Esiteks, see on huvitav osa.
Heap -
kasutusel väljumist.
Nii et siin on, kui palju mälu oli kasutusel hunnik juures
aeg minu programm lahkus -
ilmselt kuus baiti ühe ploki.
Nii et ma lähen laine mu käed millise plokk on.
Mõtle see on lihtsalt kamakas, rohkem tehniline sõna patakas.
Aga kuus baiti -
millised on kuus baiti et olid veel kasutusel?
>> Täpselt.
D-A-V-I-D Kenoviiva null, viis kirja nimi pluss null terminaator.
Nii et see programm valgrind märganud, et ma küsis kuus baiti ilmselt poolt
viis getString, kuid mitte kunagi andis neile tagasi.
Ja tegelikult, see ei pruugi olla nii selge kui mu programm ei ole kolme
rida, aga see on 300 rida.
Nii saame tegelikult annab teise käsu line argument Valgrind et
muuta see lobise.
See on natuke tüütu meeles pidada.
Aga kui mina -
vaatame.
Lekke -
Oli see lekkida -
isegi ma ei mäleta mis see on ära kasutatud.
>> - Lekke kontroll võrdub täis.
Jah, tänan.
- Lekke kontroll võrdub täis.
Enter.
Sama programm töötab.
Kirjuta David uuesti.
Nüüd ma näen veidi täpsemalt.
Aga alla hunnik kokkuvõte, mis on identne nelja - ah,
see on omamoodi tore.
Nüüd Valgrind tegelikult otsin natuke raskem minu kood.
Ja ta ütleb, et ilmselt malloc real -
me välja suumida.
Real -
me ei näe, mida liin on.
Aga malloc on esimene süüdlane.
Seal on blogi malloc.
>> Olgu?
OK, ei.
Õigus?
Ma helistasin getString.
getString ilmselt nõuab malloc.
Nii et mida koodirida on ilmselt süüdi selle eest, et
eraldatakse see mälu?
Oletame, et kes kirjutas malloc on olnud juba piisavalt kaua, et see on
ei ole nende süü.
Nii et see on tõenäoliselt minu.
getString in cs50.c - nii et see on fail kusagil arvutis -
vastavalt 286 tundub olevat süüdlane.
Nüüd oletame, et CS50 olnud ümber korralik summa aega, nii et
me liiga on eksimatu.
Ja nii on see ilmselt ei getString et viga peitub, vaid pigem
tere-2.c line 18.
>> Võtame pilk mida see rida 18 oli.
Oh.
Kuidagi see liin ei pruugi lollakas, per se, kuid see on ka põhjus,
taga, et mälu leke.
Nii super lihtsalt, milline oleks intuitiivselt olla lahendus siin?
Kui me palume mälu, ei ole kunagi olnud andes selle tagasi, ja mis tundub olevat
probleem, sest aja jooksul minu arvuti võib mälu täis, võib aeglustada
alla, halbu asju võib juhtuda ka, Mis on lihtne intuitiivne lahendus?
Lihtsalt anna see tagasi.
>> Kuidas vabastada, et mälu?
Noh, õnneks see on üsna lihtne lihtsalt öelda vaba nimi.
Ja me oleme seda varem teinud.
Aga sa võid sisuliselt mõelda vaba kui vastupidine malloc.
tasuta on vastupidine eraldades mälu.
Nüüd lubage mul kompileeri see.
Tee tere-2.
Lubage mul kasutada seda uuesti. tere-2 David.
Seega tundub, et töötada täpselt samamoodi.
Aga kui ma lähen tagasi Valgrind ja uuesti käivitada Sama käsu minu värskelt
koostatud programmi kirjutades minu nimi on enne -
kena.
Heap kokkuvõte -
kasutusel exit -
null baiti null plokke.
Ja see on super kena, kõik hunnik plokid vabastati.
Lekked on võimalikud.
>> Nii tulemas, mitte Ülesanded 4, kuid Ülesanded 5 kohtuekspertiisi
ja edasi, see liiga muutub Meetme õigsuse oma
programm, kas teil on või ei ole mälu lekked.
Aga õnneks mitte ainult võite põhjendada nende kaudu intuitiivselt, mis
on väidetavalt lihtne väikesed programmid kuid raskem suuremate programmide puhul
Valgrind, neile suuremate programmide puhul aitab tuvastada
erilist probleemi.
>> Aga on veel üks probleem mis võivad tekkida.
Lubage mul avada see fail siin, mis on, jälle veidi lihtne näide.
Kuid olgem keskenduda see programm teeb.
Seda nimetatakse memory.c.
Me postitada selle hiljem täna zip tänase lähtekoodi.
Ja teate, et mul on funktsioon nimega f, et ei võta argumente ja
tagasi midagi.
Vastavalt 20, ma olen ilmselt kuulutatakse pointer int ja nimetades seda x.
Ma määrates on tagasi väärtus malloc.
Ja just, et oleks selge, kui palju baite olen Ma ilmselt saan tagasi malloc
selles olukorras?
>> Ilmselt 40.
Kust sa selle said?
Noh, kui te mäletate, et int on sageli 4 baiti, vähemalt see on
aparaat, 10 korda 4 on ilmselt 40.
Nii malloc tagastava aadress tüki mälu ja ladustamiseks, mis
käsitleda lõppkokkuvõttes x.
Seega peab olema selge, mida siis toimub?
Noh, las ma vahetan tagasi meie pilt siin.
Ma ei või lihtsalt juhtida alt mu arvuti mällu, lubage mul minna ja
juhtida kogu ristküliku esindab kõiki minu RAM.
>> Me ütleme, et korstnat on põhjas.
Ja seal on tekst segmendis uninitialized andmed.
Aga ma lihtsalt abstraktne need muud asjad ära nagu dot, dot dot.
Ma lihtsalt viidata sellele nagu hunnik ülaosas.
Ja siis allosas see pilt, esindada peamine, ma lähen
anda see viiludeks mälu stack.
F, ma annan ta viil mälu kohta virna.
Nüüd sain konsulteerida oma lähtekoodi uuesti.
Millised on kohalike muutujate jaoks peamine?
Ilmselt mitte midagi, nii et viil on tõhusalt tühi või isegi mitte nii suur
kui ma olen ära,.
Aga f, mul on kohaliku muutuja, mida nimetatakse x.
Nii et ma lähen edasi minna ja f tüki mälu, nimetades seda x.
>> Ja nüüd malloc 10 korda 4, Nii malloc 40, kus see on
mälu tuleb?
Me ei tõmmatud pilt nagu seda enne.
Aga oletame, et see on tõhus tulevad siia, et üks,
kaks, kolm, neli, viis.
Ja nüüd ma pean neist 40.
Nii et ma lihtsalt ei dot, dot, dot soovitada et seal on isegi rohkem mälu
tulevad tagasi hunnik.
Nüüd sellest, mis on aadress?
Valime meie meelevaldne käsitleda nagu alati -
Ox123, kuigi see on ilmselt läheb olla midagi hoopis muud.
See on aadress esimene bait mälu, et ma küsin malloc eest.
>> Nii lühike, kui liin 20 hukatakse, mis on sõna otseses mõttes
ladestunud x here?
Ox123.
Ja Ox on ebahuvitav.
See tähendab lihtsalt, siin on kuueteistkümnendsüsteemis number.
Aga mis peamine on see, et mida ma poest aastal x, mis on kohaliku muutuja.
Aga selle andmetüübi jällegi on aadress int.
Noh, ma lähen hoida Ox123.
Aga jälle, kui see on liiga keeruline asjatult, kui ma leidke
tagasi, võime abstraktselt see ära üsna mõistlikult ja lihtsalt öelda, et x on
kursor et patakas mälu.
>> OK.
Nüüd on küsimus käepärast on järgmine -
liin 21, selgub, on lollakas.
Miks?
>> Vabandust?
See ei pea -
öelda, et veel kord.
Noh, see ei ole tasuta.
Nii et see teine ​​aga.
Nii et seal on üks teine ​​aga spetsiaalselt real 21.
>> Täpselt.
See lihtne rida koodi on vaid buffer overflow, puhvri ületäitumise.
Puhver tähendab lihtsalt tüki mälu.
Aga et patakas mälu suurus 10, 10 täisarvud, mis tähendab, et kui me
indeks, kasutades süntaktiline suhkur massiivi indeks, ruut
sulgudes, on teil juurdepääs x sulg 0 x sulg 1 x,
sulg dot, dot, dot.
x sulg 9 on suurim ühe.
Nii et kui ma teen x sulg 10, kus Ma olen tegelikult läheb mälu?
>> Noh, kui mul on 10 int -
olgem tegelikult teha kõik Nende siin.
Nii et oli esimese viie.
Siin on teine ​​viis ints.
Nii x sulg 0 on siin. x sulg 1 on siin. x sulg 9 on siin. x sulg
10 on siin, mis tähendab, ma ütlen, vastavalt 21, arvuti panna
number kus?
Number 0, kus?
Noh, see on 0, jah.
Aga asjaolu, et selle 0 on selline juhus.
See võib olla mitmeid 50, kõigi me hoolime.
Aga me üritame panna see x sulg 10, mis on koht, kus see
küsimärk on koostatud, mis see ei ole hea asi.
See programm võib väga hästi lennuõnnetuse tagajärjel.
>> Nüüd saab minna ja vaadata, kas see on tõepoolest see, mis juhtub.
Tee mälu, sest fail nimetatakse memory.c.
Lähme edasi ja joosta Programmi mälu.
Nii et meil vedas, tegelikult tundub.
Meil vedas.
Aga vaatame, kas me nüüd joosta Valgrind.
Esmapilgul minu programm võib näivad olevat täiesti õige.
Aga lubage mul joosta Valgrind koos - Lekke kontroll võrdub terve mälu.
>> Ja nüüd, kui ma saan seda -
huvitav.
Vigane kirjutada suurus 4 juures line 21 memory.c.
Line 21 memory.c on milline?
Oh, huvitav.
Aga oota.
Suurus 4, mis see on, viidates?
Ma ainult ei üks kirjutada, aga see on suurus 4.
Miks on 4?
See on sellepärast, et see on keskmine, mis on jällegi neli baiti.
Nii Valgrind leidnud vea, et mina, piilus minu kood, ei ole.
Ja võib-olla oma TF ja millal mitte.
Mis aga Valgrind kindlasti leidnud, et me teinud vea seal, isegi
kuigi me vedas ja arvuti otsustas, eh, ma ei kavatse krahhi
lihtsalt sellepärast, et sa puudutasid üks bait, üks int väärtuses mälu, et sa ei
tegelikult ise.
>> Noh, mida muud on lollakas siin.
Aadress -
see on hull otsin aadress kuueteistkümnendsüsteemis.
See tähendab lihtsalt kuskil kivikangur null baiti pärast ploki suurus 40
jaotatakse.
Lubage mul välja suumida siin ja vaata, kas see on natuke rohkem kasulik.
Huvitav.
40 baiti on kindlasti kadunud kaotus rekord 1 1.
Jällegi rohkem sõnu kui on kasulik siin.
Aga mis põhineb esile rida, kus ma peaks ilmselt keskenduda oma
tähelepanu veel viga?
Paistab line 20 memory.c.
>> Kui me läheme tagasi liin 20, mis on üks, mida tuvastatud varem.
Ja see ei ole tingimata lollakas.
Aga meil on see vastupidine mõju.
Niisiis, kuidas ma parandada vähemalt üks neist vigadest?
Mida ma tegema pärast rida 21?
Ma võiks teha tasuta x, nii on tagasi anda, et mälu.
Ja kuidas ma saan määrata see viga?
Ma peaks kindlasti minema mitte kaugemale kui 0.
Nii et lubage mul proovida ja uuesti käivitada.
Vabandust, kindlasti minna mitte kaugemale kui 9.
Tee mälu.
Lubage mul uuesti, Valgrind suuremas aknas.
Ja nüüd vaata.
Nice.
Kõik hunnik plokid vabastati.
Lekked on võimalikud.
Ja üles üle siin, seal ei mainita enam on kehtetu õigus.
>> Lihtsalt saada ahne, ja olgem kas teine ​​demonstratsioon
ei lähe nii nagu ette nähtud -
Ma ei saada õnnelik hetk tagasi.
Ja asjaolu, et see on 0 on ehk asjatult eksitav.
Teeme 50, mõnevõrra meelevaldne number, siis mälu dot kaldkriipsuga mälu -
ikka veab.
Midagi krahh.
Oletame, ma lihtsalt teha midagi tõeliselt rumal, ja ma teen 100.
Lubage mul uusversioon mälu dot kaldkriipsuga mälu -
vedas jälle.
Kuidas 1000?
ints kaugemale umbes nii, kus ma peaks olema?
Tee mälu -
kurat.
>> [Naer]
>> OK.
Ärme jändama enam.
Rerun mälu.
Vot nii.
Hea küll.
Nii ilmselt teil indeks 100000 ints kaugemale, kui te oleks pidanud
mälu, halbu asju juhtuda.
Nii et see ei ole ilmselt raske, kiire reegel.
Mul oli selline kasutades kohtuprotsessi ja viga saada seal.
Aga see on, sest pikk lugu lühike, arvuti mälu on ka jagatud
neisse asju nimetatakse segmentides.
Ja mõnikord, arvuti tegelikult on andnud teile natuke rohkem mälu
kui te küsite.
Aga efektiivsus, see on lihtsalt lihtsam rohkem mälu, aga ainult sulle
et sa saad selle osa.
>> Ja kui sul veab mõnikord seega sa võiksid puudutada
mälu, mis ei kuulu teile.
Teil ei ole garantiid, et see, mida raha paned sinna jääb sinna, sest
arvuti ikka arvab, et see ei sinu, kuid see ei ole tingimata positiivsed
lüüa teine ​​segment mälu arvuti ja põhjustada viga nagu
see siin.
Hea küll.
Küsimusi siis mälu?
>> Hea küll.
Võtame pilk siin, siis on midagi, mida me oleme võtnud vastu
antud üsna pikka aega, mis on see fail nimega cs50.h.
Nii et see on fail.
Need on lihtsalt terve hunnik kommentaaride up top.
Ja sa võisid vaatasid seda, kui sa torkasid ümber seadme.
Aga selgub, et kogu aeg, kui me kasutasid stringi
sünonüüm, mille abil me tunnistada et sünonüüm oli see
märksõna typedef, tüübi definitsioon.
Ja me põhiliselt öeldes teha string sünonüümina char star.
See vahend, mille pinu loodud neid Apupyörät tuntakse
string.
>> Nüüd siin on lihtsalt prototüüp jaoks getchar.
Me oleks võinud seda varem näinud, kuid see on tõesti see, mida ta teeb. getchar
ei võta argumente, tagastab char.
getdouble võtab ühtegi argumenti, tagastab topelt.
getfloat võtab ühtegi argumenti, naaseb float, ja nii edasi.
getint on siin. getlonglong on siin.
Ja getString on siin.
Ja ongi kõik.
See lilla joon on veel eeltöötluse Direktiivi tõttu
hashtag alguses ta.
>> Hea küll.
Nüüd lubage mul minna cs50.c.
Ja me ei räägi liiga kaua seda.
Aga teile pilguheit mis on kestnud kõik see
aeg, andke minna -
Teeme getchar.
Nii getchar on enamasti kommentaarid.
Aga tundub, et see.
Nii et see on tegelik funktsioon getchar et me oleme
võttes enesestmõistetavaks olemas.
Ja kuigi me ei kasuta seda üks et sageli, kui üldse, on see vähemalt
suhteliselt lihtne.
Nii et see on väärt võtmist Kiire pilk siia.
>> Nii getchar on lõputu silmuse, tahtlikult nii ilmselt.
Seejärel kutsub - ja see on selline kena taaskasutust kood me ise kirjutas.
Ta kutsub getString.
Sest mida see tähendab saada char?
Noh, võite samuti proovida saada terve rea teksti kasutaja ja
siis lihtsalt pilk üks nende tähemärki.
Vastavalt 60, siin on vähe natuke meelerahu kontrolli.
Kui getString tagastatakse null, ärme minna.
Midagi läks valesti.
>> Nüüd on see pisut tüütu, kuid tavalised C. char max arvatavasti
näitab, mida lihtsalt põhineb tema nimi?
See on pidev.
See on nagu numbriline väärtus Suurim char saab esindada koos
üks hammustus, mis on ilmselt number 255, mis on suurim arv, mida
esindavad kaheksa bitti, alates nullist.
Nii et ma olen seda, et see funktsioon, kui Kirjutan seda koodi, vaid sellepärast,
kui midagi läheb valesti getchar kuid tema eesmärk elus on naasta
char, pead kuidagi suutma märku, et kasutaja, et
midagi läks valesti.
Me ei saa naasta null.
Selgub, et null on osuti.
Ja jälle getchar on tagasi char.
>> Nii konventsiooni kui midagi läheb vale, on sul, programmeerija või
Sellisel juhul mulle raamatukogu, pidin lihtsalt otsustada suvaliselt, kui
midagi läheb valesti, ma lähen tagasi number 255, mis on ka tegelikult
tähendab, et me ei saa, ei saa kasutaja tippida iseloomu esindajad
nr 255, sest me pidime varastama kui nn valvur väärtust
esindama probleem.
Nüüd selgub, et märk 255 ei ole midagi, mida saab kirjutada edasi
klaviatuuril, nii et see ei ole suur asi.
Kasutaja ei märka, et Olen varastatud see märk.
Aga kui sa kunagi näha mees lehekülge arvutisüsteemi mõned viited
kõik mütsid pidevalt niimoodi, mis ütleb: juhtudel viga see pidev jõud
tagasi, et kõik on mõned inimeste tegi aastat tagasi oli otsustasin
tagasi see eriline väärtus ja nimetame seda pidevalt, kui
midagi läheb valesti.
>> Nüüd magic juhtub siin.
Esiteks, ma kuulutab line 67 kaks märki, C1 ja C2.
Ja siis vastavalt 68, seal on tegelikult koodirida see meenutab
meie sõber printf, arvestades, et see ei ole protsenti Cs jutumärkides.
Aga teate, mis siin toimub. sscanf tähendab string Scan -
tähendab skaneerida vormindatud string, ergo sscanf.
Mida see tähendab?
See tähendab, et sul läheb sscanf string.
Ja joon on ükskõik kasutaja tipib sisse
Sul läheb sscanf stringi nagu see, mis ütleb scanf millised on
sa lootes kasutaja on kirjutatud sisse
Seejärel liigu-in aadressid kaks tükkideks mälu, sel juhul
sest mul on kahe kohahoidjaga.
Nii et ma annan selle aadress C1 ja aadress C2.
>> Ja meenutada, et sa annad funktsioon aadress mõned muutuja, mis
Mõju?
Mida see funktsioon teha tulemusena anda see aadress
muutuja, mitte muutuja ise?
See võib muuta see, eks?
Kui sul oleks keegi kaart füüsilise aadress, võivad nad minna ja teha
mida iganes nad tahavad, et aadress.
Sama mõte siin.
Kui meil läheb sscanf, aadress kahest tükkideks mälu, isegi need tillukesed
vähe tükkideks mälu, C1 ja C2, kuid me öelda, et see aadress neist,
sscanf seda muuta.
>> Nii sscanf eesmärk elus, kui me loeme man, on lugeda, mida
kasutaja kirjutada, loodan, et kasutaja, kellel tipitud iseloomu ja võibolla
teise märgi, ja mis iganes kasutaja trükkida, esimene märk läheb
siin, teine ​​märk läheb siia.
Nüüd, kui kõrvale, see, ja sa tean vaid seda alates dokumentide
asjaolu, et panin tühja ruumi seal lihtsalt, et ma ei hooli, kui
kasutaja tabab Space bar paari korda enne kui ta võtab
iseloomu, ma lähen ignoreerida iga tühja ruumi.
Nii et, ma tean dokumentatsiooni.
>> Asjaolu, et seal on teine% c järgneb valge ruum on tegelikult
tahtlik.
Ma tahan, et oleks võimalik tuvastada, kas kasutaja silmamunad või ei teinud koostööd.
Nii et ma loodan, et kasutaja ainult trükkida aastal üks märk, seega ma loodan,
et sscanf on ainult kavatse tagasi väärtus 1, sest jällegi, kui ma lugesin
dokumentatsiooni sscanf eesmärk on elu on naasta arvu
muutujaid, mis olid täis kasutaja sisend.
>> Ma möödunud kahe muutuja aadressid, C1 ja C2.
Ma loodan siiski, et ainult üks neid saab surma, sest kui sscanf
tagastab 2, mis eeldatavasti Mõju loogiliselt?
See kasutaja ei anna mulle üks iseloomu nagu ma ütlesin talle.
Nad ilmselt kirjutate vähemalt kaks märki.
Nii et kui ma selle asemel ei ole teise % C, ma lihtsalt pidin ühe, mis
ausalt oleks intuitiivne lähenemine, ma arvan Esmapilgul
te ei kavatse olla võimeline avastama kui kasutaja on annab teile rohkem
sisend kui sa tegelikult tahtsid.
Nii et see on kaudne vorm vigade kontroll.
>> Aga teate, mida ma teen siin.
Kui ma olen kindel, et kasutaja andis mulle üks iseloomu, ma vaba rida, tehes
vastand getString, mis omakorda kasutab malloc ja siis ma tagasi
C1, iseloomu, et ma lootsin kasutaja ette ja ainult tingimusel.
Nii kiire ühtesid ainult, kuid lisaküsimusi getchar?
Me tuleme tagasi mõned teised.
>> Noh, lubage mul minna ja seda teha - Oletame nüüd, lihtsalt motiveerida meie
arutelu nädalas pluss aeg, seda on fail nimega structs.h.
Ja veel, see on lihtsalt maitse midagi, mis meid ees ootab.
Aga teate, et palju selle kohta on märkusi.
Nii et lubage mul rõhutada ainult Huvitav osa nüüd.
typedef -
seal on sama märksõna uuesti.
typedef me kasutame kuulutada string nagu erilist andmete liiki.
Võite kasutada typedef luua täiesti uus andmetüübid, et ei ole olemas, kui
C leiutati.
Näiteks int kaasas C. char Kaasas C. topelt kaasas C. Kuid
pole mõiste üliõpilane.
Ja veel, et oleks päris kasulik olla võimalik kirjutada programm, mis salvestab
muutuv, õpilase ID number, oma nimi ja oma maja.
Teisisõnu, kolm tükki andmeid, nagu int ja
string ja muu string.
>> Mis typedef, mis on päris võimas selle ja märksõna sturct eest
struktuur, sa, programmeerija 2013 saab tegelikult määrata oma
andmetüübid, et ei ole olemas aastat tagasi, vaid et see sobiks teie eesmärkidel.
Ja nii siin, read 13 kuni 19, me kuulutatakse uus andmetüüp, nagu
int, kuid nimetades seda üliõpilane.
Ja sees muutuja läheb Kolm asja - int, string,
ja string.
Nii et sa ei mõtle, mis on tõesti juhtus siin, kuigi see on
natuke lihtsamaks täna üliõpilane on sisuliselt läheb
näeb välja selline.
Selle saab tüki mälu ID nimi
valdkonnas, ja maja valdkonnas.
Ja me saaks kasutada neid tükkideks mälu ja neid kasutada järgmiselt.
>> Kui ma minema struct0.c, siin on suhteliselt pikk, kuid pärast
muster, kood, mis kasutab seda uut nippi.
Nii et esimene, las ma juhtida teie tähelepanu et huvitav osad üleval.
Sharp määratleb õpilased 3, teatab pidev nimetatakse õpilased ja määratud
ta omavoliliselt number 3, siis nii et mul on kolm õpilast kasutades
Selle programmi nüüd.
Siin on peamised.
Ja teate, kuidas ma kuulutada massiivi õpilased?
Noh, ma lihtsalt kasutada sama süntaks.
Sõna üliõpilane on ilmselt uus.
Kuid õpilane, klassi sulg õpilastele.
>> Nii kahjuks on palju taaskasutamise mõistete siin.
See on lihtsalt number.
Nii et see on nagu öelda kolm.
Klass on just see, mida ma tahan, helistada muutuja.
Ma võiks seda nimetada õpilastele.
Aga klass ei ole see klass objektorienteeritud Java liiki viisil.
See on lihtsalt klassi õpilastele.
Ja andmetüübi iga element selles massiivis on üliõpilane.
Nii et see on natuke erinev ja ütleb midagi
niimoodi, et see on lihtsalt -
Ma ütlen mulle kolm õpilast ja helistada, et massiivi klassi.
>> Hea küll.
Nüüd on neli silmus.
See mees on tuttav - Kerrata nullist kuni kolmel.
Ja siin on uus tükk süntaks.
Programm läheb küsib mind, inimese, anda talle üliõpilane
ID, mis on int.
Ja siin on süntaks, mille saate salvestada midagi ID väljal
Asukoht klassi sulg I. Nii Selle süntaks ei ole uus.
See tähendab lihtsalt, anna mulle kaheksas klassi õpilaste.
Aga see sümbol on uus.
Siiani oleme saa kasutada dot, vähemalt kood niimoodi.
See tähendab, minge struct tuntakse õpilane ja pane midagi.
Samamoodi see järgmisele reale 31, minge käia ja panna mida iganes kasutaja liigid
Nime siin ja mida nad teevad maja, sama asi, edasi minna ja
pane see. majas.
>> Mida see programm lõpuks teha?
Näete väike teaser seal.
Lubage mul minna ja ei tee structs 0 dot kaldkriipsuga struct 0, üliõpilase ID 1,
ütlevad David Mather, üliõpilane ID 2.
Rob Kirkland, üliõpilaspilet 3.
Lauren Leverit -
ja ainus asi, mida see programm tegi, mis on lihtsalt täiesti meelevaldne, on
Ma tahtsin teha midagi selle info, nüüd, et ma olen õpetas meile, kuidas
kasutada structs on ma lihtsalt pidin Selle pildi loop siin.
Ma Käi massiivi õpilastele.
Ma kasutasin meie, ehk nüüd tuttav sõber, string võrrelda stircomp et
kontroll on 8. õpilase maja võrdne Ema?
Ja kui on, siis lihtsalt printida midagi omavoliliselt meeldi, jah, on küll.
Aga jälle, lihtsalt annab mulle võimalusi kasutada ja taaskasutada ja
taaskasutada uue dot märke.
>> Kes hoolib, eks?
Tulemas üliõpilaste programmi mõnevõrra meelevaldne, kuid selgub,
et me saame teha kasulikke asju Selle näiteks järgmiselt.
See on palju keerulisem struct aastal C. See sai tosin või rohkem valdkondi,
mõnevõrra cryptically nimega.
Aga kui sa oled kunagi kuulnud graafika failivorming nimetatakse bitmap, BMP, see
Selgub, et bitmap failivorming päris palju tundub, et see.
See on rumal vähe smiley nägu.
See on väike pilt, mis ma olen suumitud on päris suur, nii et ma ei näe iga
üksikisiku dots või pikslit.
Nüüd selgub, saame esindada must täpp, ütleme, number 0.
Ja valge dot number 1.
>> Nii teisisõnu, kui sa tahad teha Naerusuu ja salvestada et pilt
arvuti, siis piisab, kui hoida nulli ja need, mis näeb välja selline, kus,
jälle need on valged ja nulle on mustad.
Ja koos, kui sa tegelikult on mõnitama ühtesid ja nulle, pead
ruudustik pikslit, ja kui te näha neile välja, siis on armas
vähe smiley nägu.
Nüüd bitmap failivorming, BMP, on tõhusalt, et selle all kapuuts,
kuid rohkem piksleid SOT et sa võib tegelikult esindavad värvid.
>> Aga kui teil on keerulisemad formaadid nagu BMP ja JPEG ja GIF
kellega võib olla tuttav, need failid kettal on tavaliselt mitte ainult
on nullid ja need, pikslit, kuid neil on mõned metaandmed samuti -
meta selles mõttes, et ei ole tõesti andmeid, kuid see on kasulik omada.
Nii et need väljad on siin tähendab, ja me näeme seda üksikasjalikumalt P-set
5, et enne nulli ja need, mis esindavad pikslit pilt,
seal on hunnik metaandmeid pildi ja
pildi laius.
Ja teate ma kitkumise välja mõned meelevaldsed asjad siin -
laius ja kõrgus.
Bit arv ja mõned muud asjad.
Nii et seal on mõned metaandmed faili.
>> Aga mõista, kuidas failid on sätestatud välja sel viisil, saab tegelikult
siis pilte töödelda, taastada pilte kettalt, resize pilte.
Aga sa ei pea tingimata arendamiseks.
Ma vajasin foto.
Nii et ma läksin tagasi RJ siin, kes nägid ekraanil juba mõnda aega tagasi.
Ja kui ma avada Keynote siin, see on mis juhtub, kui sa püüad suurendada ja
suurendada RJ.
Ta ei saa mingit parem tõesti.
Nüüd Keynote on selline hägustab see natuke, vaid ilustada
Asjaolu, et RJ ei saa eriti täiustuvad suumida
Ja kui teha seda nii, vaata väljakud?
Jah, saate kindlasti näha ruutu projektor.
>> See on see, mida sa saad, kui teil suurendada.
Aga mõista, kuidas meie RJ või Naerusuu ellu laseb meid
tegelikult kirjutada koodi, mis manipuleerib neid asju.
Ja ma mõtlesin, et ma lõpuks selle märkme juures 55 sekundi tõsta see,
Julgen öelda pigem eksitav.
>> [VIDEO PLAYBACK]
>> -Ta valetab.
Millest ma ei tea.
>> -Mida me teame?
>> -See on 09:15 Ray Santoya oli ATM.
>> -Nii et küsimus on, mis ta seal 9:16?
>> Shooting üheksa millimeetri juures midagi.
Äkki nägi ta snaiper.
>> -Või oli temaga koos töötada.
>> -Oota.
Mine tagasi üks.
>> Mida sa näed?
>> -Tooge oma pealpool täisekraanil.
>> -Tema prillid.
>> -Seal on peegeldus.
>> -See on Neuvitas pesapalli meeskond.
See on nende logo.
>> Ja ta räägib kes on seljas, et jope.
>> [END VIDEO PLAYBACK]
>> DAVID J. Malan: see olema Ülesanded 5.
Näeme järgmisel nädalal.
>> MALE SPEAKER: Järgmisel CS50.
>> [Crickets säutsumine]
>> [Muusika mängib]