[Powered by Google Translate] [5 SKIRSNIS mažiau patogūs]
[Nate Hardison, Harvardo universitetas]
[Tai CS50.] [CS50.TV]
Taigi welcome back, vaikinai.
Sveiki atvykę į 5 skyriuje.
Šiuo metu, baigęs viktorinoje 0 ir matęs, kaip tu padarei,
tikiuosi jums jaustis tikrai geras, nes man buvo labai sužavėtas šiame skyriuje balai.
Mūsų interneto žiūrovų, mes turėjo porą klausimų
apie problemą, apie paskutiniąsias dvi problemas - ar viktorinoje, o.
Taigi, mes ketiname eiti per tas tikrai greitai, kad visi mato, kas atsitiko
ir kaip eiti per konkretaus sprendimas, o ne tiesiog peržiūrėti sprendimą pats.
Mes ketiname eiti per pastaruosius porą problemų tikrai greitai, 32 ir 33.
Tik antrą kartą, tad, kad interneto žiūrovai gali pamatyti.
>> Jei kreiptis į jūsų problemą 32, 13 psl,
13 iš 16 32, problema yra visa informacija apie apsikeitimo sandorių.
Visa tai buvo apie Swapping du sveikieji skaičiai.
Tai problema, kad mes norime perėjo kelis kartus paskaitos.
Ir čia, ką mes klausė, jums reikia padaryti, yra greitai atminties pėdsakų.
Užpildyti kintamųjų reikšmių, nes jie yra kamino
kodas eina per šią apsikeitimo funkcija.
Visų pirma, tai, kas mes žiūri - Aš ketina pateikti šį iPad -
visų pirma, tai, ką mes ieškome yra ši eilutė sunumeruoti 6 čia.
Ir tai tik už artumą su ankstesne problema sunumeruoti 6.
Ką mes norime padaryti, rodyti arba ženklinti atminties būklę
nes ji yra tuo metu, kai mes vykdyti šį eilutės numeris 6,
kuri yra efektyviai grąžinti iš mūsų apsikeitimo funkciją čia.
Jei mes slinkti žemyn čia, pamatėme, kad viskas atminties adresai buvo suteikta mums.
Tai labai raktas, mes grįžti į ją tik akimirką.
Ir tada žemyn čia apačioje, mes turėjome šiek tiek atminties diagramą, kad mes ketiname kreiptis į.
Aš iš tikrųjų tai padarė mano iPad.
Taigi, aš ruošiuosi pakaitomis pirmyn ir atgal tarp iPad ir tik dėl prašymo priimti prejudicinį sprendimą šio kodekso.
>> Pradėkime. Pirma, galime sutelkti dėmesį į pirmuosius porą eilučių pagrindinis čia.
Norėdami pradėti, mes ketiname inicijuoti x 1 ir Y 2.
Taigi mes turime du sveikasis skaičius kintamųjų, jie abu bus ant kamino.
Mes ketiname juos įdėti 1 ir A 2.
Taigi, jei aš apversti mano iPad, tikiuosi, pažiūrėkime, -
"Apple TV" veidrodžius, ir čia mes einame. Gerai.
Taigi, jei aš apversti mano iPad,
Noriu inicijuoti X 1 ir Y 2.
Mes darome, kad paprasčiausiai rašyti 1 grafa x
ir 2 langelyje pažymėti y. Gana paprasta.
Taigi, dabar grįžkime prie nešiojamojo kompiuterio, pamatyti, kas vyksta šalia.
Taigi tai kitą eilutę, kai viskas pasidaro gana painu.
Mes pereiname x adresą ir y adresą parametrų a ir b apsikeitimo funkcija.
X ir y adresas adresas yra dalykų, kad mes negalime apskaičiuoti
nesikreipdama į šių kulka taškų, nustatančio teisę čia.
Ir, laimei, pirmieji du kulka taškų pasakykite mums, ką atsakymai.
X atminties adresas yra 10, ir y atminties adresas yra 14.
Taigi tie, kurie vertybės, gauti praėjo, kaip ir b iki viršaus mūsų apsikeitimo funkciją.
Taigi dar kartą, pereiti atgal į mūsų schemoje, galiu rašyti 10,
ir b 14.
Dabar, tai yra, jei mes toliau su apsikeitimo sandoriu.
Taigi prakeiktas atgal vėl prie nešiojamojo kompiuterio,
matome, kad būdas apsikeitimo veikia, aš pirmą kartą dereference ir parduotuvė tmp rezultatas.
Taigi dereference operatorius sako: "Ei, Gydyti kintamasis turinį adresą.
Eiti į kokia yra saugomi šiuo adresu ir įkelti jį. "
Ką jums įkelti kintamojo bus saugomi į mūsų tmp kintamąjį.
Velniškas atgal į iPad.
Jei mes einame spręsti 10, mes žinome, kad adresas 10 yra varible x
, nes mums buvo pasakyta, mūsų kulka, kad x atminties adresas yra 10.
Taigi, mes galime eiti ten, gaunate jį vertė, kuri yra 1, kaip matome mūsų iPad,
ir įkelti į tmp.
Vėlgi, tai nėra galutinis turinys.
Mes ketiname eiti per, ir mes susisieksime su mūsų galutinę būklę programos pabaigoje.
Bet dabar, mes turime vertė 1 saugomi tmp.
>> Ir ten greitas klausimas čia.
[Aleksandras] Ar dereference operatorius - tai tik žvaigždė prieš kintamojo teisė?
>> Taip. Taigi dereference operatorius, kaip mes apversti atgal į mūsų kompiuterį dar kartą,
yra tai priešais žvaigždė.
Ta prasme, tai - jums supriešinti ją su daugybos operatorius
kurioms būtini du dalykus; dereference operatorius Smūginės operatorius.
Tik vieną reikšmę o ne dvejetainiu operatoriaus,
jei taikote dviejų skirtingų reikšmių.
Taip, kad tai, kas vyksta šioje eilutėje.
Mes pakrautas vertė 1 ir saugomi jį į mūsų laikiną kintamąjį.
Kitą eilutę, mes saugome b turinį į
arba, tiksliau sakant, mes saugome turinį, kad b yra nukreipta į vietą, kurioje yra nukreipta.
Jei mes analizuojame iš dešinės į kairę, mes ketiname dereference b,
mes ketiname spręsti 14, mes ketiname patraukti sveikasis skaičius, kad yra ten,
ir tada mes ketiname pereiti nurodytu adresu 10,
ir mes ketiname mesti į tą erdvę rezultatą mūsų dereference b.
Velniškas atgal į mūsų iPad, kur mes galime padaryti tai šiek tiek daugiau konkrečių,
tai gali padėti, jei aš rašau numerius adresų.
Taigi mes žinome, kad y, mes esame Adresas 14 x 10 adresu.
Kai mes pradedame b, mes dereference b, mes ketiname patraukti vertė Vertė 2.
Mes ketiname patraukti šią vertę, nes tai yra vertė, kuri gyvena 14 adresu.
Ir mes ketiname įdėti jį į kintamąjį, kuri gyvena 10 adresu,
, kas yra teisinga, atitinkantys mūsų kintamasis X.
Taigi, mes galime padaryti šiek tiek perrašyti čia
kai mes atsikratyti mūsų 1, o vietoj to mes rašome 2.
Taigi, visi gerai ir gerai pasaulyje, nors mes jau perrašyti x.
Mes saugomi x seną vertę mūsų tmp kintamąjį.
Taigi, mes galime užbaigti apsikeitimo sandorio su į kitą eilutę.
Velniškas atgal į mūsų kompiuterį.
Dabar telieka imtis turinį iš mūsų laikiną kintamąjį
ir laikyti juos į kintamąjį, kuris gyvena tuo adresu, b.
Taigi, mes ketiname efektyviai dereference b gauti prieigą prie kintamasis
, kuri yra adresu, kad B turi,
ir mes ketiname stuff, kad tmp į jį akcijų vertę.
Velniškas atgal į iPad dar kartą.
Galiu ištrinti šią vertę, 2,
ir vietoj to, mes kopijuoti 1 teisę į jį.
Tada kitą eilutę, kuri vykdo, žinoma -
jei mes apversti atgal į nešiojamas - tai 6 punktas,
tai yra taškas, kuriame mes norėjome mūsų schema visiškai užpildyti.
Taigi prakeiktas atgal į iPad, dar kartą, tik, kad jūs galite pamatyti užpildytą diagramą,
galite matyti, kad mes turime į 10 a, 14 b, tmp 1, 2 x, ir y 1 a.
Ar yra kokių nors klausimų apie šį?
Ar tai, kad daugiau prasmės, ėjo per jį?
Padaryti mažiau prasmės? Tikimės, kad ne. Gerai.
>> Pointeriai yra labai sudėtinga tema.
Vienas iš vaikinų, mes dirbame su posakis yra labai dažnas:
"Norėdami suprasti nurodymus, jums reikia pirmiausia suprasti patarimų."
O aš manau, yra labai teisinga. Jis imtis šiek tiek laiko priprasti prie jo.
Piešimas daug nuotraukų, daug atminties diagramas kaip šis, yra labai naudinga,
ir po to, kai jūs einate per, pavyzdžiui, po pavyzdžiui, po to, kai, pavyzdžiui,
jis bus pradėti uždirbti šiek tiek daugiau prasmės ir šiek tiek daugiau prasmės ir šiek tiek daugiau prasmės.
Galiausiai, vieną dieną, jūs visa tai visiškai įsisavinti.
Kokių nors klausimų Prieš mes pereiti į kitą problemą? Gerai.
Taigi apversti pirmyn prie nešiojamojo kompiuterio.
Kita problema, mes turime, yra problema numeris 33 failą I / O.
Priartinti šioje šiek tiek.
Problema 33 - Taip?
>> [Daniel], aš tiesiog turėjo greitai klausimą. Ši žvaigždė ar žvaigždutė,
ji vadinama dereferencing, kai jūs naudojate žvaigždutę prieš.
Kas tai pavadinti, kai jūs naudojate ampersendo prieš?
>> Ampersand prieš adresas operatoriaus.
Taigi leiskite slinkti atgal iki.
Oi. Aš priartinimo režimu, todėl aš negaliu tikrai slinkties.
Jei pažvelgsime į šio kodekso tikrai greitai čia,
dar kartą, tas pats vyksta.
Jei pažvelgsime į šio kodekso čia, į šią eilutę, kurioje norite skambinti apsikeitimo,
tiesiog pasakyti, Ampersand "gauti adresu, kuriuo gyvena kintamasis X".
Kai jūsų sudarytojas kaupia savo kodą,
jis turi iš tikrųjų fiziškai išskirti vietą atmintyje visiems savo kintamiesiems gyventi.
Ir kas kompiliatorius gali tada daryti, kai jis jau parengė viską,
jis žino, "O, aš įdėti x 10 adresu. aš įdėti y 14 adresu."
Jis gali užpildyti šių jūsų vertybes.
Todėl jūs galite tada - jis gali tada pereiti tai ir pass ir Y taip pat.
Šie vaikinai gauti adresą, bet jie taip pat, kai pereisite į apsikeitimo funkcija,
šio tipo informacija, šis int * čia, sako, kompiliatorių,
"Gerai, mes ketiname būti aiškina šį adresą kaip kintamąjį adresą.
Kaip int adresą, kuris skiriasi nuo charakterio rodiklio adresą
nes int užima 32-bitų mašina, užima 4 baitų erdvės,
kadangi simbolis užima tik 1 baitas vietos.
, Todėl labai svarbu žinoti, taip pat, kas yra kas gyvena, ką tipo reikšmės
gyvena adresu, kad gavo praėjo.
Arba adresą, kad jūs esate, susijusius su.
Tokiu būdu, jūs žinote, kiek baitų informacijos, kad iš tikrųjų įkelti iš savo atminties.
Ir tada, taip, tai dereference operatorius, kaip jūs klausia,
eina ir pasiekia informaciją tam tikru adresu.
Todėl ji sako, šio kintamojo čia, gydyti turinį kaip adresas,
eiti tuo IP adresu, ir ištraukite, įkelti į procesorių, apkrovos į registrą
faktinių reikšmių arba turinį, kurie gyvena šiuo adresu.
Ar turite klausimų? Tai yra geras klausimai.
Tai nauja terminologija per daug.
Taip pat rūšies funky, matydamas & ir * skirtingose ​​vietose.
>> Gerai.
Taigi atgal į problemą 33, failą I / O.
Tai buvo viena iš tų problemų, kurias, manau, porą dalykų nutiko.
Viena, tai gana nauja tema.
Gana greitai ji buvo pristatyta prieš viktorinoje
ir tada aš manau, kad jis buvo natūra kaip vieną iš tų žodžių problemų matematikos
kur jie suteiks jums daug informacijos, bet jūs iš tikrųjų nereikia baigti naudoti jo toną.
Pirmoji dalis šios problemos yra aprašoma tai, ką CSV failą.
Dabar CSV failą, Pagal aprašymą, yra kableliais atskirtų reikšmių failas.
Priežastis, tai yra ne visi, kas įdomu, ir priežastis, jūs kada nors naudoti juos,
, nes, kaip daugelis iš jūsų kada nors naudojamas dalykų, kaip "Excel"?
Išsiaiškinti, dauguma iš jūsų, tikriausiai, arba naudoti tam tikru momentu savo gyvenime.
Jums naudoti kažką panašaus į "Excel".
Siekiant gauti duomenis iš Excel skaičiuoklę arba su juo daryti bet tvarkymo rūšiuoti,
jei norite parašyti C programa ar Python programą, "Java" programa,
kovoti su duomenų, kurie saugomi ten,
vienas iš labiausiai paplitusių būdų, kaip gauti jį į CSV failą.
Ir jūs galite atverti programą "Excel", ir kai jūs einate į "Save As" dialogo,
galite gauti iš faktinė CSV failą.
>> Patogu žinoti, kaip elgtis su šių dalykų.
Kaip ji veikia, yra tai, kad jis panašus į - turiu galvoje, tai iš esmės mėgdžiodami skaičiuoklę,
kur, kaip matome čia, labai kairę pačią gabalas,
mes turime visas pavardes.
Taigi, mes turime Malan, tada Hardison ir tada Bowden, MacWilliam ir tada Chan.
Visi pavardės. Ir tada kableliais atskiriami iš vardai pavardes.
David, Nate, Rob, Tommy, ir Zamyla.
Aš visada išmaišyti Robby ir Tom.
Ir tada, pagaliau, trečiasis stulpelis elektroninio pašto adresus.
Kai jūs suprantate, kad likusi programos dalis yra gana paprasta įgyvendinti.
Ką mes padarėme, siekiant imituoti tą pačią struktūrą, mūsų C programos
yra mes naudojame struktūrą.
Mes pradėsime žaisti su jais šiek tiek daugiau, taip pat.
Mes juos pamatė pirmą šiek tiek problemą, 3, kai mes buvo susijusios su žodynų.
Bet tai darbuotojai struct saugo pavardę, vardą ir elektroninio pašto adresą.
Tiesiog kaip mūsų CSV failą saugoti.
Todėl tai konvertuoti iš vieno formato į kitą.
Mes turime konvertuoti, šiuo atveju, Komisijos tarnybų struct į liniją,
atskirkite kableliais linija, kaip kad.
Ar tai prasminga? Jus vaikinai quiz,
todėl aš įsivaizduokite, kad turite bent jau turėjo šiek tiek laiko pagalvoti apie tai.
>> Nuomos funkcija, problema prašo mums imtis - we'll padidinti šioje šiek tiek -
personalo struktūrą, personalo struct, vardas-ai,
ir pridėti savo turinį į mūsų staff.csv failą.
Pasirodo, kad tai yra gana paprasta naudoti.
Mes rūšies pažaisti su šių funkcijų šiek tiek daugiau šiandien.
Tačiau šiuo atveju, fprintf funkcija yra tikrai labai svarbus.
Taigi fprintf, mes galime spausdinti, kaip jus vaikinai naudojant printf visą šį terminą.
Galite printf linija į failą.
Taigi, o ne tik įprastą printf skambutį, kai jūs suteikiate jai formato eilutę
ir tada jums pakeisti visus kintamuosius su šiais argumentais,
fprintf, jūsų labai pirmasis argumentas yra, o ne failą, kurį norite įrašyti į.
Jei mes pažvelgti į tai, į prietaisą, pavyzdžiui, vyras fprintf,
mes galime pamatyti skirtumą tarp printf ir fprintf.
Aš priartinti čia šiek tiek.
Taigi su printf, mes suteikiame jai format string ir tada vėlesni argumentai
yra visi kintamieji pakeitimo ar keičia į mūsų formato eilutę.
Kadangi fprintf, pirmasis argumentas iš tiesų yra upelis vadinamas šį failą *.
>> Juda atgal čia mūsų nuoma,
Mes jau mūsų failas * srautas atvėrė mums.
Štai ką pirmoji eilutė; ji atveria staff.csv failą,
ji atidaro papildymo režimui ir visi, kad liko mums daryti
personalo struktūros rašyti į failą.
Ir, pažiūrėkime, aš noriu naudoti iPad?
Aš naudoti iPad. Mes turime negaliojančiu - tegul tai ant stalo, kad aš galiu rašyti šiek tiek geriau -
netekti nuoma, ir tai trunka vieną argumentą, personalo struktūra, vadinama-ai.
Turime savo petnešos, mes turime mūsų failą * "failą,
mes turime fopen linija mums dovanotą,
ir aš tiesiog parašykite jį kaip taškai, nes tai jau į PEDIA.
Ir tada mūsų kitą eilutę, mes ketinate skambinti į fprintf
ir mes ketiname pereiti į failą, kad mes norime spausdinti,
ir tada mūsų format string, kuris -
Aš tegul jus vaikinai man pasakyti, kaip jis atrodo.
Kaip apie jus, Stella? Ar žinote, kas pirmoji dalis iš formato eilutę atrodo?
[Stella] Nesu tikras. >> Feel free to ask Jimmy.
Ar žinote, Jimmy?
[Jimmy] Ar tai tiesiog būti paskutinis? Nežinau. Aš nesu visiškai tikras.
>> Gerai. Kaip apie tai, ar kas nors į egzaminą gauti tai teisinga?
Nr Gerai.
Pasirodo, kad čia visi mes turime padaryti, norime kiekvienas mūsų personalo struktūros dalį
turi būti spausdinami taip, kaip į mūsų failo eilutę.
Mes tiesiog naudoti STRING Keitimas pobūdžio tris skirtingus kartus, nes mes turime pavardę
po kablelio, tada vardas, atskirti kableliais,
ir galiausiai jo elektroninio pašto adresą, kuris yra po - tai ne
montuoti ant mano ekrano, bet tai po naujos eilutės simboliai.
Taigi, aš ruošiuosi rašyti tik ten.
Ir tada po mūsų format string,
mes tiesiog keitimus, kuriuos mes pasiekti naudodami taškinę žymėjimą
kad mes matėme problemą, 3.
Mes galime naudoti s.last, s.first ir s.email
pakeisti šių trijų verčių į mūsų formato eilutę.
Taigi, kaip, kad eiti? Prasminga?
Taip? Ar ne? Galbūt? Gerai.
>> Galutinis dalykas, kad mes po to, kai mes spausdinami ir po to, kai mes atidarėme mūsų failą:
kai mes atidarė failą, mes visada turite prisiminti, kad jį uždaryti.
Nes kitaip mes galų gale nesandarus atminties,
naudojant failų aprašai.
Taigi, norint uždaryti, kuri funkcija mes naudojame? Daniel?
[Daniel] fclose? >> Fclose, tiksliai.
Taigi paskutinė dalis šios problemos buvo tinkamai uždarykite failą, naudojant fclose funkciją,
tik atrodo, kad.
Ne per kvailai.
Cool.
Taigi, kad viktorina 33 problema.
Mes turime tikrai daugiau failą I / O artėja.
Mes padarysime šiek tiek daugiau paskaitą šiandien, arba skyriuje šiandien
, nes tai, kas vyksta sudaro didžiąją šio artėjančius pset.
Pereikime nuo viktorinoje šiame taške. Taip?
>> [Charlotte]] Kodėl fclose (failas), o ne fclose (staff.csv)?
>> Ah. Nes paaiškėja, kad - taip į klausimą, kuris yra puikus vienas,
Štai kodėl, kai mes rašome fclose, mes raštu fclose (failas) žvaigždučių kintamąjį
, o ne į failo pavadinimą, staff.csv? Ar tai teisinga? Taip.
Taigi leiskite pažvelgti. Jei aš perjungiu atgal į mano nešiojamas,
ir pažiūrėkime tuo fclose funkcija.
Taigi fclose funkcija uždaro srautą, ir tai trunka, kad rodyklė prie upelio, kad mes norime uždaryti,
o ne faktinės bylos pavadinimą, kad mes norime uždaryti.
Ir tai yra todėl užkulisiuose, kai skambinate fopen,
kai atidarote failą, jūs iš tikrųjų skiriant atminties saugoti informaciją apie failą.
Taigi jūs turite failo rodyklę, kad turi informacijos apie failą,
pavyzdžiui, jis yra atviras, jo dydis, kur jūs esate šiuo metu į failą,
taip, kad jūs galite padaryti, skaityti ir rašyti toje konkrečioje vietoje per failo skambučius.
Jūs galų gale uždaryti rodyklę, o ne uždaryti failo pavadinimą.
>> Taip? [Daniel] Taigi, kad būtų galima panaudoti nuoma, norėtumėte pasakyti - kaip ji gauti vartotojo įvesties?
Ar fprintf veikti kaip GetString ta prasme, kad jis bus tiesiog laukti naudotojo įvesties
ir paprašys jūsų įvesti arba laukti, kol jums įrašyti šiuos tris dalykus?
Ar jums reikia naudoti kažką įgyvendinti nuoma?
>> Taip. Taigi, mes ne - klausimas buvo, kaip mes gauti vartotojo įvesties
siekiant įgyvendinti nuoma? Ir ką mes turime čia, yra nuomos skambintojo
priimtas šio darbuotojai struct visus saugomus duomenis struct jau.
Taigi fprintf gali tiesiog parašyti, kad duomenis tiesiogiai į failą.
Ten nereikia laukti naudotojo įvesties.
Vartotojo jau įvesties tinkamai išleisti jį šio darbuotojai struct.
Ir viskas, be abejo, būtų galima nutraukti, jei bet kuris iš šių rodykles null,
todėl mes pereikite atgal čia ir mes pažvelgti į mūsų struct.
Mes turime eilutės paskutinis, styginių pirma, styginių el.pašto.
Mes dabar žinome, kad visi iš tų, iš tikrųjų, po gaubtu, char * kintamieji.
, Kurie gali arba negali būti nukreipta į nulis.
Jie gali būti nukreipta į atmintį dėl krūvą,
gal atminties kamino.
Mes tikrai žinome, bet, jei bet kuris iš šių rodykles yra nulis, arba neteisingas,
, kad bus tikrai katastrofos mūsų nuomos funkciją.
Tai buvo kažkas, kad buvo natūra už egzaminą.
Mes ne nerimauti, kad.
Didysis. Gerai. Taigi, pereinant nuo viktorinoje.
>> Leiskite uždaryti šį vaikiną, ir mes ketiname pažvelgti į pset 4.
Taigi, jei jus vaikinai pažvelgti į pset spec, kai galite jį pasiekti, cs50.net/quizzes,
mes ketiname eiti per "Section problemų šiandien.
Aš Pereikite - Klausimų skyriuje prasideda iš pset spec trečiame puslapyje.
Ir pirmoji dalis prašo jūsų eiti ir žiūrėti trumpas ir detalaus vamzdžių.
, Kuris buvo natūra Cool short, rodo jums keletą naujų, cool komandų eilutės gudrybės, kad jūs galite naudoti.
Ir tada mes turime keletą klausimų jums, taip pat.
Šis klausimas apie srautus, į kurį printf rašo pagal nutylėjimą,
mes tipo tik šiek tiek užsiminė apie metu senumo.
Tai fprintf, kad mes buvome tik aptarti priima kaip savo argumentą, FILE * srautas.
fclose trunka FILE * srautas, taip pat,
ir gražinama reikšmė fopen suteikia jums FILE * srautas, taip pat.
Priežastis, kodėl mes nematėme tų, kurie buvo, kai mes nagrinėjami printf
yra nes printf turi numatytąjį srautą.
Ir numatytasis upelis, su kuriuo jis rašo
sužinosite apie per trumpą laiką.
Taigi tikrai atsižvelgti į jo išvaizdą.
>> Skyriuje šiandienos, mes ketiname kalbėti šiek tiek apie GDB,
nes labiau susipažinę esate su juo, daugiau praktikos jūs gaunate su juo,
gali geriau jums bus faktiškai medžioti žemyn klaidas savo kodą.
Tai pagreitina derinimo iki ypatingai.
Taigi, naudojant printf, kiekvieną kartą jums, kad jūs turite perkompiliuoti savo kodą,
turite paleisti jį dar kartą, kartais turite aplink perkelti printf skambutį,
komentaras iš kodo, tereikia šiek tiek laiko.
Mūsų tikslas yra išbandyti ir įtikinti jus, kad su GDB, galite iš esmės
printf nieko, bet savo kodą, ir jūs niekada neturite perkompiliuoti.
Jūs niekada neturite pradėti ir išlaikyti atspėti kur printf kitą.
Pirmas dalykas, kurį reikia padaryti, tai nukopijuokite šią eilutę ir gauti sekcijos kodą iš interneto.
Aš nukopijavę šią kodo eilutę, kad sako, "wget ​​http://cdn.cs50.net".
Aš ruošiuosi nukopijuokite jį.
Aš ruošiuosi eiti į mano prietaiso, nutolinti, todėl jūs galite pamatyti, ką aš darau,
įklijuodami jį ten, ir kai aš paspauskite "Enter", tai wget komanda tiesiog yra interneto gauti.
Ji ketina nugriauti šį failą iš interneto,
ir tai vyksta įrašyti jį į einamojo katalogo.
Dabar, jei aš sąrašą savo dabartinę direktoriją galite pamatyti, kad aš turiu šį section5.zip failą teisę ten.
Būdas kovoti su tuo vaikinu, išpakuokite jį,
tai galite padaryti į komandų eilutę, kaip tai.
Section5.zip.
Kad bus išpakuokite jį, sukurti man aplanką,
išpūsti turinį, juos ten.
Taigi, dabar aš galiu eiti į mano 5 skirsnis kataloge naudojant komandą cd.
Išvalyti ekraną, naudojant aiškius. Taigi išvalyti ekraną.
Dabar aš turiu gražų švarų terminalą spręsti.
>> Dabar, jei aš sąrašą visus failus, kad matau šiame kataloge,
matote, kad aš turiu keturi failai: buggy1, buggy2, buggy3, ir buggy4.
Aš taip pat gavo savo atitinkamas C failus.
Mes neketiname pažvelgti į C failus dabar.
Vietoj to, mes ketiname juos naudoti, kai mes atverti GDB.
Mes nuolat juos aplink, kad mes turime prieigą prie šaltinio kodą, kai mes naudojame GDB
tačiau šiame skyriuje tikslas Taisome aplink su GDB
ir pamatyti, kaip mes galime jį naudoti išsiaiškinti, kas vyksta negerai su kiekviena iš šių keturių Buggy programų.
Taigi, mes tiesiog vyksta aplink kambarį tikrai greitai,
ir aš norėčiau paprašyti ką nors paleisti vieną Buggy programų,
ir tada mes eiti kaip per GDB grupės, ir mes pamatyti, ką mes galime padaryti, kad išspręsti šias programas,
arba bent jau nustatyti, kas vyksta neteisingai kiekvienoje iš jų.
Pradėkime nuo čia Daniel. Bėgsi buggy1? Leiskite pamatyti, kas atsitiks.
[Daniel] Ji sako, kad prašymas sutrikimą. >> Taip. Tiksliai.
Taigi, jei aš paleisti buggy1, gaunu seg kaltės.
Šiuo metu, aš gali eiti ir atverti buggy1.c
išbandyti ir išsiaiškinti, kas vyksta neteisingai,
bet vienas iš labiausiai bjaurius dalykus apie šį SEG klaidos
yra tai, kad nėra pasakyti, ką linija programos dalykų iš tiesų nutiko ir sumušė.
Jūs rūšies pažvelgti kodą
ir išsiaiškinti, naudojant atspėti ir patikrinti, ar printf pamatyti, kas vyksta blogai.
Vienas iš super dalykų apie GDB yra tai, kad tikrai, tikrai paprasta
išsiaiškinti liniją, kurios jūsų programa sugenda.
Tai visiškai verta jį naudoti, net jei tik už tai.
Taigi, paleisti GDB, I tipo gdb, ir tada aš suteikti jai kelią į vykdomąjį failą, kad aš noriu paleisti.
Čia aš rašyti gdb ./buggy1.
Paspauskite Enter. Suteikia man visą šią informaciją apie autorines teises,
ir žemyn, čia pamatysite šią eilutę, kad sako, "skaito simbolius iš / home /
jharvard/section5/buggy1 ".
Ir jei viskas vyks gerai, pamatysite, kad jis išspausdinti pranešimą, kad atrodo taip.
Jis bus skaityti simbolius, jums pasakyti "Aš skaito simbolius iš savo vykdomąjį failą,
ir tada ji turės šį pranešimą "DONE" čia.
Jei matote, kai kurios kitos variacijos, arba matote, kad ji negalėjo rasti simbolius
ar kažkas panašaus, ką tai reiškia, kad jūs tiesiog nerenkami savo vykdomąjį tinkamai.
Kai mes kompiliuoti programas, skirtų naudoti su GDB, mes turime naudoti, kad specialios g vėliava,
ir tai daroma pagal nutylėjimą, jei sudaryti savo programas, tiesiog įvesdami padaryti
arba padaryti Buggy arba susigrąžinti, nors iš tų.
Bet jei jūs rankiniu būdu sudarant su Apsukite metalinis garsas, tada jūs turėsite eiti ir kad-g vėliava.
>> Šiuo metu, kad dabar mes turime gdb eilutę,
tai gana paprasta paleisti programą.
Mes galime įvesti paleisti, ar mes galime tiesiog įveskite r.
Dauguma GDB komandos gali būti pateikiami sutrumpintai.
Paprastai tik vieną ar dvi raidės, kuri yra gana gražus.
Taigi, Saad, jei įvesite R ir paspauskite "Enter", kas atsitiks?
[Saad] Aš turiu SIGSEGV, segmentavimo kaltės ir vėliau visa tai nesuprantama.
>> Taip.
Kaip mes matome ekrane dabar, ir kaip Saad sakė,
, kai mes įvesti paleisti arba R ir paspauskite "Enter", mes vis dar gauti tą patį seg kaltės.
Taigi, naudojant GDB nepadeda išspręsti mūsų problemą.
Bet jis suteikia mums šiek tiek nesuprantama, ir paaiškėja, kad tai nesuprantama
iš tikrųjų mums sako, kur jis vyksta.
Išanalizuoti truputį, šis pirmasis bitas yra funkcija, kurioje viskas vyksta blogai.
Ten tai __ strcmp_sse4_2, ir jis mums sako, kad tai vyksta šį failą
vadinamas sysdeps/i386, visa tai, dar kartą, netvarka rūšies - bet linija 254.
Tai tipo sunku apdoroti. Paprastai, kai pamatysite stuff like this,
tai reiškia, kad jis manimi seg klaida, viena iš sisteminių bibliotekų.
Taigi ką daryti su strcmp. Jus vaikinai matė strcmp anksčiau.
Ne per kvailai, bet ar tai reiškia, kad strcmp neveikia arba, kad yra problema su strcmp?
Ką manote, Aleksandras?
[Aleksandras] Ar tai - 254 linija? Ir - ne dvejetainis, bet tai ne jų viršutinių ribų,
ir tada kiekvienai funkcijai yra kita kalba. Yra tai, kad 254 tai veiklai, arba -?
>> Tai linija 254. Atrodo, kad šioje S failo, todėl asamblėja kodas tikriausiai.
>> , Bet aš manau, vis aktualesnis dalykas yra, nes mes Dotarłeś seg kaltės,
ir atrodo, kad jis ateina iš strcmp funkcija,
nereiškia, kad jis, tada, kad strcmp neveikia?
Jis neturėtų, tikiuosi. Taigi, tik todėl, kad jūs turite segmentavimo kaltės
sistemos funkcijų, paprastai tai reiškia, kad jūs tiesiog pavadino jį teisingai.
Greičiausias dalykas, kurį reikia padaryti, siekiant išsiaiškinti, kas iš tikrųjų vyksta
kai pamatysite kažką kvailai, kaip šis, Kai matote seg kaltės,
ypač jei turite programą, kuri naudoja daugiau nei vien tik pagrindinis,
naudoti pėdsako.
Mažėjo tokie žodžiai, pėdsako raštu BT, o ne į visą pėdsako žodį.
Bet Charlotte, kas atsitinka, kai jūs įvedate "BT" ir paspauskite Enter?
[Charlotte] Tai man rodo dvi eilutes, eilutės 0 ir 1 eilutė.
>> Taip. Taip, kad virvės 0 ir 1 eilutė.
Tai yra tikrieji kamino rėmeliai, šiuo metu žaidimą, kai jūsų programa sudužo.
Pradedant nuo viršutinės rėmo, rėmo 0, ir vyksta žemiausioje, kuris yra 1 kadrą.
Mūsų strateginę partnerystę svarbiausias rėmas yra strcmp rėmas.
Jūs galite galvoti apie tai, kaip panaši į šią problemą, mes buvome tik atlieka viktorinoje su rodyklės,
kur mes turėjome apsikeitimo kamino pagrindinio kamino rėmo ant rėmo,
ir mes turėjome kintamųjų, kurie apsikeitimo naudojami kintamųjų, kad pagrindinis naudojant ant.
Čia mūsų avarijos įvyko strcmp funkcija, kuri vadinosi mūsų pagrindinė funkcija,
ir Backtrace suteikia mums ne tik funkcijas, kurioje dalykai nepavyko,
tačiau ji taip pat sako mums, kur viskas buvo vadinamas.
Taigi, jei aš slenkant per šiek tiek daugiau į dešinę,
matome, kad taip, mes buvome šio strcmp sse4.s failo 254 eilutėje.
Bet buvo skambinta ne buggy1.c, 6 eilutė.
Taigi, tai reiškia, kad mes galime padaryti - tai mes galime tiesiog eiti patikrinti ir pamatyti, kas vyksta
ne buggy1.c, 6 eilutė.
Vėlgi, yra keletas būdų, kaip tai padaryti. Vienas iš jų yra išeiti iš GDB
arba, kad jūsų kodas atidaryti kitame lange ir kryžminė nuoroda.
, Kad ir pati, yra labai patogu, nes dabar, jei esate ne darbo valandomis
ir jūs turite seg kaltės ir jūsų TF manimi įdomu, kur viskas buvo nutraukti,
galite tiesiog pasakyti: "O, 6 eilutė. aš nežinau, kas vyksta,
bet kažkas apie LINE 6 sukelia mano programa pertraukos. "
Kitas būdas tai padaryti, galite naudoti šią komandą, pavadintą GDB sąrašas.
Taip pat galite jį mažinti su l.
Taigi, jei mes paspauskite l, ką mes gauname?
Mes gauname visa krūva Weird Stuff.
Tai yra faktinis surinkimas kodas
kad yra strcmp_sse4_2.
Tai atrodo rūšies funky,
ir priežastis, mes gauname tai yra todėl, kad dabar,
GDB mus rėmo 0.
>> Taigi, kada mes pažvelgti kintamųjų, bet kuriuo metu, mes pažvelgti į šaltinio kodą,
mes ieškome šaltinio kodą, kad yra susijęs su kamino tarpą mes šiuo metu in
Taigi, siekiant gauti ką nors prasmingo, turime
pereiti prie kamino rėmo, kuris suteikia daugiau prasmės.
Šiuo atveju, pagrindinis kamino rėmas būtų šiek tiek daugiau prasmės,
nes tai buvo iš tikrųjų kodas, mes parašėme.
Ne strcmp kodas.
Taip, kaip galite judėti tarp rėmų, šiuo atveju, nes mes turime du,
mes turime 0 ir 1,
jums padaryti, kad aukštyn ir žemyn komandų.
Jei aš perkelti vieną kadrą,
dabar aš pagrindinio kamino tarpą.
Galiu žemyn, grįžti į kur aš buvau,
vėl eiti, eiti vėl ir vėl eiti.
Jeigu jūs kada nors padaryti savo programą GDB, gausite avarijos, gausite pėdsako,
ir pamatysite, kad jis yra kai kuriuos failus, kad jūs nežinote, kas vyksta.
Jūs bandote sąrašą, kodas nėra pažįstama su jumis,
į jūsų kadrų išvaizdą ir išsiaiškinti, kur esate.
Jūs tikriausiai klaidingą kamino tarpą.
Arba bent jau esate kamino rėmo, kad yra ne vienas, kad jūs tikrai gali derinti.
Dabar, kad mes į atitinkamą kamino tarpą, mes pagrindinis
dabar mes galime naudoti sąrašo komandą išsiaiškinti, kas, linija buvo.
Ir jūs galite matyti jį, jis atspausdintas jį mums čia.
Tačiau mes galime nukentėjo sąrašą visi tą patį, ir sąrašas suteikia mums šią gražią spaudinį
faktinio šaltinio kodą, kas vyksta čia.
>> Visų pirma, mes galime pažvelgti 6 eilutėje.
Mes galime pamatyti, kas čia vyksta.
Ir atrodo, kad mes darome eilutę palyginimas
tarp eilutę "CS50 uolų" ir argv [1].
Kažkas apie tai buvo kritimo.
Taigi, Missy, ar turite kokių nors mintis apie tai, kas gali būti čia vyksta?
[Missy] Aš nežinau, kodėl ji genda. >> Jūs nežinote, kodėl ji genda?
Jimmy, kokių nors minčių?
[Jimmy] Nesu visiškai tikras, bet paskutinį kartą, mes naudojome eilutę palyginti
arba strcmp, mes turėjome kaip trimis skirtingais atvejais pagal ją.
Mes neturėjo ==, aš ne manau, toje pirmoje eilutėje.
Todėl buvo suskirstyti į tris, ir vienas == 0,
vienas buvo <0, manau, ir vienas buvo> 0.
Taigi, gal kažkas panašaus? >> Taip. Taigi šis klausimas
iš mes darome palyginimą teisingai?
Stella? Bet mintis?
[Stella] Nesu tikras. >> Nesate tikri. Daniel? Mintys? Gerai.
Pasirodo, tai, kas vyksta čia, kai mes bėgo programą
ir mes turime seg kaltės, kai jūs paleidote programą pirmą kartą, Daniel,
Ar jūs suteikiate jai jokių komandinės eilutės argumentai?
[Daniel] L. >> No Tokiu atveju, kas yra argv vertė [1]?
>> Nėra vertė. >> Teisė.
Na, nėra tinkamos eilutės reikšmė.
Tačiau yra vertė. Kas yra vertė, kad gauna saugomi ten?
>> Šiukšlių vertė? >> Tai tiek šiukšlių vertė arba, šiuo atveju,
argv masyvo pabaiga visada nutrauktas null.
Taigi, kas iš tikrųjų gavo saugomi yra tuščias.
Kitas būdas išspręsti šią problemą, o ne galvoti per
bandykite spausdinti jį.
Tai vieta, kur aš sakiau, kad naudojant GDB yra puikus,
, nes Jūs galite išspausdinti visus kintamuosius, visos nustatytos vertės, kad jūs norite
naudojant šį Handy-frantas p komandą.
Taigi, jei aš tipo P ir tada aš tipo kintamojo vertę arba kintamojo vardas,
pasakyti, argc, matau, kad argc yra 1.
Jei aš noriu atsispausdinti argv [0], galiu padaryti kaip, kad.
Ir, kaip matėme, argv [0] visada jūsų programos pavadinimas,
visada vykdomąjį pavadinimas.
Čia jūs matote jis gavo visą kelią pavadinimą.
Galiu atsispausdinti argv [1], ir pamatyti, kas atsitiks.
>> Čia mes turime tokį tikrą mistinį vertės.
Mes turime 0x0.
Prisimenu termino pradžioje, kai mes kalbėjome apie šešioliktainius skaitmenis?
Tuo pset 0 pabaigos arba kad mažai abejonių apie tai, kaip sudaro 50 hex?
Būdas rašome hex CS skaičius, tiesiog painioja save
dešimtainiai skaičiai, mes visada priešdėlis su 0x.
Taigi tai 0x priešdėlis visada tiesiog reiškia interpretuoti šį numerį kaip šešioliktainis skaičius,
ne kaip eilutės, o ne kaip dešimtainis skaičius, o ne dvejetainis skaičius.
Kadangi skaičius 5-0 yra svarbių šešioliktainis skaičius.
Ir tai dešimtainės trupmenos, 50.
Taigi tai yra tiesiog kaip mes dviprasmiškumą.
Taigi 0x0 reiškia šešioliktainis 0, kuris taip pat yra dešimtainis 0, dvejetainį 0.
Tai tiesiog vertė 0.
Pasirodo, kad tai, ką null, iš tikrųjų, yra atminties.
Null yra tik 0.
Čia saugomas elementas argv [1] yra niekinis.
Taigi mes bandome palyginti mūsų "CS50 uolų" seka neapibrėžta eilutę.
Taigi dereferencing, bando prieiti prie dalykų null, null
paprastai sukelti kažkokią segmentavimo kaltės ar kitų blogų dalykų atsitikti.
Ir paaiškėja, kad strcmp nėra patikrinti,
nepriklausomai nuo to, ar jūs jau praėjo null vertės, kad.
Atvirkščiai, jis tiesiog eina į priekį, bando padaryti tai,
ir jei jis seg gedimus, seg gedimus, ir tai jūsų problema. Jūs turite eiti ją išspręsti.
Tikrai greitai, kaip galėtume išspręsti šią problemą? Charlotte?
[Charlotte] Galite patikrinti, naudoti, jei.
Taigi, jei argv [1] yra niekinis, == 0, tada grįžkite 1, ar kažkas [nesuprantamas].
>> Taip. Taigi, kad vienas puikus būdas tai padaryti, kaip mes galime patikrinti,
vertė, mes apie tai pereina į strcmp, argv [1], tai nulis?
Jei tai null, tada mes galime pasakyti, gerai, nutraukti.
>> Labiau paplitęs būdas tai padaryti yra naudoti argc vertę.
Jūs galite pamatyti čia prie Maino pradžioje,
mes praleisti, nes pirmasis bandymas, kad mes paprastai daryti, kai mes naudojame komandinės eilutės argumentai,
kuris yra patikrinti, ar ne mūsų argc vertė yra tai, ką mes tikimės.
Šiuo atveju, mes tikimės bent du argumentus,
Programos pavadinimas plius vienas kitas.
Nes mes ruošiamės naudoti antrą argumentą čia.
Bandymo rūšiuoti Taigi tam tikra iš anksto, prieš mūsų strcmp skambučio
kad testai, ar argv yra ne mažiau kaip 2, taip pat padaryti tos pačios rūšies dalykas.
Mes galime pamatyti, jei tai veikia paleisti programą iš naujo.
Jūs visada galite iš naujo paleisti programą per GDB, kuris yra tikrai gražus.
Galite paleisti, kai pereisite į argumentus, kad jūsų programa,
pravažiavimo pro jas, kai skambinate paleisti, o ne kiekvieną kartą paleidus GDB.
Tokiu būdu jūs galite toliau remtis savo programą su kitokiais argumentais kiekvieną kartą.
Taip paleisti, arba dar kartą, aš galiu Type R, ir pažiūrėkime, kas atsitiks, jei mes tipo "labas".
Ji visada bus paprašyti jus, jei norite vėl pradėti nuo pradžių.
Paprastai, jūs norite vėl pradėti nuo pradžių.
Ir šiuo metu, jis bus paleistas iš naujo jį dar kartą, jis išspausdina
programa, kad mes, buggy1 su argumentu HELLO,
ir jis spausdina šią standartinę iš; jis sako: "Jūs gaunate D, liūdna veido.
Bet mes ne seg kaltės. Jis sakė, kad procesas paprastai išėjo.
Taip, kad atrodo gana gerai.
Ne daugiau seg kaltės, mes padarėme praeityje
, todėl atrodo, kad iš tikrųjų buvo seg kaltės klaida, kad mes buvo gauti.
Deja, jis mums sako, kad mes vis D.
>> Mes galime grįžti ir pažvelgti kodą ir pamatyti, kas ten vyksta
išsiaiškinti, kas buvo - kodėl ji mums sako, kad mes turime D.
Pažiūrėkime, tai čia buvo printf sakydamas, kad jūs turite D.
Jei mes įveskite sąrašą, kaip jūs nuolat rašomą sąrašą, ji išlaiko iteravimu per jūsų programa,
todėl jums parodysiu savo programos pirmųjų eilučių.
Tada jis jums parodysiu, kitą kelias eilutes, o kitą riekė ir kitą riekė.
Ir jis bus nuolat bando eiti.
Ir dabar mes patekti į "linija, numeris 16 yra už diapazono ribų."
, Nes jis turi tik 15 krypčių.
Jei jums šiuo klausimu ir įdomu, "Ką daryti?" galite naudoti komandą help.
Naudokite padėti ir tada suteikti jai komandos pavadinimą.
Ir jūs matote, GDB suteikia mums visa tai stuff rūšiuoti.
Ji sako: "jokio argumento, išvardyti 10 daugiau eilučių, po arba apie ankstesnį sąrašą.
Sąrašas - išvardyti dešimt eilučių anksčiau - "
Taigi pabandykime sąrašas minusas.
Ir kad išvardyti 10 eilučių, galite pažaisti su sąrašo šiek tiek.
Jūs galite padaryti, sąrašą, sąrašas, galite net sąrašą numerį, kaip ir sąrašo 8,
ir jis bus išvardinti 10 eilučių aplink liniją 8.
Ir jūs galite pamatyti, kas vyksta čia jūs turite paprasta, jei kita.
Jei įvesite CS50 uolų, jis spausdina "Gauni A."
Priešingu atveju jis spausdina "Jūs gaunate D.
Nusivylimas miestas. Gerai. Taip?
>> [Daniel] Taigi, kai aš bandė padaryti CS50 uolų be kabučių,
jis sako: "Jūs gaunate D."
Man reikia kabučių gauti jį dirbti, kodėl taip yra?
>> Taip. Pasirodo, kad kai - tai yra dar vienas įdomus mažai Smakołyk -
, kai paleidžiate programą, jei mes ją paleisti ir mes įvesti CS50 uolų,
kaip ir Danielis buvo sakydamas, jis padarė, ir paspaudžiant "Enter",
jis vis dar sako, kad mes gauname D.
Ir kyla klausimas, kodėl taip yra?
Ir paaiškėja, kad tiek mūsų terminalas ir GDB apdoroti juos kaip du atskirus argumentais.
Nes, kai yra erdvė, kad numanomas kaip
pirmasis argumentas pasibaigęs; Kitas argumentas yra apie pradėti.
Būdas sujungti tuos, į dvi arba atsiprašome, į vieną argumentą,
yra naudoti kabučių.
Taigi dabar, jei mes įdėti ją į kabutes ir paleisti jį dar kartą, mes gauname A.
Taigi tiesiog Priminti, be kabučių, CS50 ir uolienos yra apdorojami kaip du atskiri argumentai.
Su kabutėmis, tai išanalizuoti, nes vieną argumentą apskritai.
>> Mes galime pamatyti tai atskaitos tašką.
Iki šiol mes jau veikia mūsų programą, ir jis jau veikia
iki arba jis seg gedimus arba Hitai klaidą
arba tol, kol jis išėjo ir viskas buvo visiškai gerai.
Tai nebūtinai yra labiausiai naudingas dalykas, nes kartais
turite klaidą savo programą, tačiau tai nėra sukelia segmentavimo kaltės.
Ji manimi ne todėl, kad jūsų programa sustabdyti ar ko nors panašaus.
Būdas gauti GDB pristabdyti jūsų programa tam tikru
yra nustatyti atskaitos tašką.
Jūs galite padaryti tai nustatant atskaitos tašką funkcijos pavadinimo
arba galite nustatyti atskaitos tašką tam tikrą eilutę kodo.
Man patinka nustatyti ribines vertes, dėl funkcijų pavadinimus, nes lengva prisiminti,
ir jei jūs iš tikrųjų eiti ir pakeisti savo kodą į viršų šiek tiek,
tada jūsų atskaitos tašką iš tikrųjų likti toje pačioje vietoje per savo kodą.
Kadangi, jei jūs naudojate eilučių numerius, ir eilučių numeriai pakeisti
nes norite pridėti ar pašalinti tam tikrą kodą, tada jūsų ribinės reikšmės yra visi visiškai įsukus.
Vienas iš labiausiai paplitusių dalykų aš nustatyti atskaitos tašką, pagrindinės funkcijos.
Dažnai aš paleisti gdb, aš b tipo Main, paspauskite Enter, ir kad bus nustatyti atskaitos tašką
pagrindinė funkcija, kuri tiesiog sako, pristabdyti programą kuo greičiau pradėti rodyti "
ir tokiu būdu, kai aš paleisti savo programą su, tarkim, CS50 uolų du argumentai
ir paspauskite "Enter", jis gauna pagrindinės funkcijos ir sustoja tiesiai pačioje pirmoje eilutėje,
į dešinę, kol ji vertina strcmp funkciją.
>> Kadangi aš sustabdytas, dabar galiu pradėti Mucking aplink ir pamatyti, kas vyksta
su visų skirtingų kintamųjų, kurie yra perduodami į savo programą.
Čia aš galiu atsispausdinti argc ir pamatyti, kas vyksta.
Matyti, kad argc yra 3, nes ji turi 3 skirtingas vertybes.
Jis gavo programos pavadinimą, jis gavo pirmąjį argumentą, o antrasis argumentas.
Mes galime atspausdinti tiems žiūri argv [0], argv [1], ir argv [2].
Taigi, dabar jūs galite pamatyti, kodėl šis strcmp skambutis vyksta, kad žlugtų,
, nes matote, kad jis suskaidytas CS50 ir uolos į du atskirus argumentais.
Šiuo metu, kai jūs nukentėjo atskaitos tašką, galite toliau stiprinti per jūsų programa
eilutė po eilutės, o ne vėl pradeda savo programą.
Taigi, jei nenorite, kad paleisti programą iš naujo ir tik toliau nuo čia,
galite naudoti komandą Tęsti ir toliau bus paleisti programą iki galo.
Tik kaip ji tai padarė čia.
Tačiau, jei aš iš naujo paleiskite programą, CS50 uolų, ji hitai savo atskaitos tašką,
ir šį kartą, jei aš nenoriu tiesiog eiti visą kelią per likusį programos,
Aš galiu naudoti kitą komandą, kurio aš irgi Sutrumpinti su n.
Ir tai bus žingsnis programos eilutę po eilutės.
Todėl jūs galite žiūrėti kaip ką atlikti, kaip kintamųjų pokyčius, kaip viskas atnaujinami.
Kuri yra gana gražus.
Kitas kietas dalykas yra, o ne kartoti tą pačią komandą virš ir vėl ir vėl,
jei jūs tiesiog paspauskite "Enter" - taip čia matote, aš ne įvedėte nieko -
jei aš tiesiog paspauskite "Enter", jis bus pakartoti ankstesnę komandą,
ar ankstesnę GDB komanda, kad aš tiesiog įdėti in
Galiu laikyti klavišą Enter, ir jis bus nuolat žengia per savo kodo eilutė po eilutės.
Norėčiau paskatinti jus vaikinai eiti patikrinti kitų Buggy programas, taip pat.
Mes neturime laiko gauti per visus juos šiandien skyriuje.
Išeitinis kodas, yra ten, todėl jūs galite rūšies pamatyti, kas vyksta
užkulisiuose, jei jums tikrai įstrigo,
bet bent jau, tiesiog praktika iki paleidimo GDB
paleisti programą, kol ji sugenda jums,
gauti pėdsako, suprasti, ką veikti avarijos buvo,
ką linija, atspausdinti keletą kintamųjų reikšmės,
tik tokiu būdu jūs gaunate už jį jaustis, nes tai tikrai padės jums ateityje.
Šiuo metu, mes ketiname mesti iš GDB, kurį naudojant mesti ar tiesiog q.
Jeigu jūsų programa yra viduryje vis dar veikia, ir ji išėjo,
ji visada bus jūsų paklausti, "Ar tikrai jūs tikrai norite išeiti?"
Jūs galite tiesiog paspausti "taip".
>> Dabar mes ketiname pažvelgti mes turime kitą problemą, kuri yra katė programa.
Jei žiūrėti ir detalaus vamzdžių trumpas, pamatysite, kad Tommy naudoja šią programą
kad iš esmės spausdina visą failą, išvedimą į ekraną.
Taigi, jei aš paleisti katė, tai iš tiesų yra built-in programa į prietaisą,
ir, jei turite "Mac", galite tai padaryti savo Mac, jei jūs atverti terminalą.
O mes - katė, tarkim, cp.c ir paspauskite Enter.
Ką tai padarė, jei mes slinkite aukštyn šiek tiek ir pamatyti, kur mes bėgo linija,
ar kur vyko kačių komandą, jis tiesiog tik išspausdintas turinį cp.c mūsų ekrane.
Mes galime paleisti jį dar kartą ir galite įdėti kelis failus kartu.
Todėl jūs galite daryti Kačių cp.c, ir tada mes galime taip pat Jungiant cat.c failą,
kuris yra programa, mes apie tai rašyti,
ir jis bus spausdinti abu failus atgal atgal į mūsų ekrane.
Taigi, jei mes slinkite aukštyn šiek tiek, mes matome, kad kai nubėgome Ši katė cp.c, cat.c
pradžių ji atspausdinti CP failą, ir tada po juo atspausdintas cat.c failą, nustatančio teisę čia.
Mes ketiname naudoti, tai tiesiog gauti savo kojų šlapias.
Pažaisti su paprasta spausdinti į terminalą, pamatyti, kaip tai veikia.
Jei jus vaikinai atverti su gedit cat.c, paspauskite "Enter",
jūs galite pamatyti programą, kad mes apie tai rašyti.
Mes įtraukėme šį gražus katilo plokštelę, todėl nereikia gaišti laiko rašyti visą, kad iš.
Mes taip pat patikrinti argumentų priėmė.
Mes spausdinti gražią naudojimo pranešimą.
>> Tai dalykas rūšiuoti, kad vėl, kaip mes jau kalbame apie,
tai beveik kaip raumenų atminties.
Tiesiog neužmirškite, kad nuolat daro tos pačios rūšies daiktų
ir visada spausdinti kažkokią naudingos pranešimą
taip, kad žmonės žino, kaip paleisti savo programą.
Su katė, tai gana paprasta, mes tiesiog ketinate eiti per visus skirtingus argumentus
, kad buvo priimtas į mūsų programą, ir mes ketiname spausdinti
jų turinys dėmesį į ekrane vienu metu.
Norėdami spausdinti failus į ekraną, mes ketiname padaryti kažką labai panašaus
ką mes padarėme Viktorinos pabaigoje.
Tuo Viktorinos pabaigoje, kad samdyti programą, mes turėjome atverti failą,
ir tada mes turėjo spausdinti.
Šiuo atveju, mes ketiname atverti failą, ir mes ketiname jos perskaityti, o ne.
Tada mes ketiname spausdinti, o ne į failą, mes ketiname spausdinti į ekraną.
Taigi spausdinti į ekraną, jūs visa tai buvo daroma anksčiau su printf.
Taigi, tai nėra pernelyg beprotiška.
Bet skaitant failą rūšies keista.
Mes eiti per, kad šiek tiek vienu metu.
Jei jus vaikinai grįžti į tą paskutinę problemą savo viktoriną, problemų 33,
pirmoji eilutė, kad mes ketiname padaryti čia, atidarant failą, yra labai panašus į ką mes padarėme, yra.
Taigi Stella, ką, kad eilutės atrodys, kai mes atidaryti failą?
[Stella] Sostinė FILE *, failo - >> Gerai. >> - Lygus fopen. >> Yup.
, Kuris šiuo atveju yra? Į komentarą.
>> Tai į komentarą? argv [i] ir r?
>> Būtent. Į dešinę. Taigi Stela yra visiškai teisus.
Tai yra tai, ką linija atrodo.
Mes ketiname gauti failą srauto kintamasis, laikyti jį į failą *, todėl visos kepurės,
FILE *, ir šio kintamojo vardas bus failas.
Galėtume vadinti tai, ką mes norėtume. Būtų galima vadinti first_file arba file_i, ką mes norėtume.
Ir tada failo vardas buvo priimtas į komandų eilutę su šia programa.
Taigi jis saugomas argv [i,], tada mes ketiname atidaryti šį failą skaitymui.
Dabar, kad mes atidarytas failas, kas yra dalykas, kad mes visada turime atsiminti, kad
kai mes atidaryti failą? Uždarykite jį.
Taigi, Missy, kaip mes uždaryti bylą?
[Missy] fclose (failas) >> fclose (failas). Tiksliai.
Didysis. Gerai. Jei pažvelgsime į tai komentarą čia,
jis sako: "Atidaryti argv [i] ir spausdinti jo turinį stdout."
>> Standartinis išvada yra keista pavadinimas. Stdout yra tik mūsų būdas pasakyti
mes norime spausdinti jį į terminalą, mes norime spausdinti jį į standartinį išvedimo srautą.
Mes iš tikrųjų galite atsikratyti šio komentaro čia.
Aš einu, nukopijuokite jį ir įklijuokite jį, nes tai, ką mes padarėme.
Šiuo metu, dabar mes turime skaityti failo truputį.
Mes aptarėme keletą būdų, kaip skaitymo failus.
Kurios iš jų yra jūsų mėgstamiausių iki šiol?
Kokiais būdais ar jūs esate matę, ar jūs žinote, skaityti failus?
[Daniel] fread? >> Fread? Taigi fread yra vienas. Jimmy, ar žinote kitus?
[Jimmy] L. >> Gerai. Nope. Charlotte? Aleksandras? Kiti? Gerai.
Taigi kitų fgetc yra vienas, kad mes naudojame daug.
Yra taip pat fscanf, jus vaikinai modelis čia?
Visi jie prasideda su F. Nieko bendro su byla.
Yra fread fgetc, fscanf. Visa tai yra skaitymui funkcijų.
Raštu turime fwrite, mes turime, fputc vietoj fgetc.
Mes taip pat turime fprintf patinka matėme viktorinoje.
Kadangi tai yra problema, kuri apima skaitant iš failo,
mes ketiname naudoti vieną iš šių trijų funkcijų.
Mes neketiname naudoti šias funkcijas žemyn čia.
Šios funkcijos yra visi į standartinį I / O lib.
Taigi, jei jums pažvelgti į šios programos viršuje,
galite matyti, kad mes jau įtraukti antraštės failo standartinį I / O bibliotekos.
, Jei norime išsiaiškinti, kuris iš jų mes norite naudoti,
mes visada galime atverti Man puslapiai.
Taigi, mes galime įveskite vyro stdio
ir skaityti visus apie stdio įvesties ir išvesties funkcijas pagal C.
Ir jau galime pamatyti Oh, atrodo. Jis paminėti fgetc, tai paminėti fputc.
Todėl jūs galite išskleiskite šiek tiek ir pažvelgti, tarkim, fgetc
ir pažvelgti į savo žinyno puslapyje.
Jūs galite pamatyti, kad ji eina kartu su visa krūva kitų funkcijų:
fgetc, fgets, getc, getchar, gauna, ungetc ir jo indėlis simbolių ir styginiams.
Taigi tai yra, kaip mes skaitome simbolių ir styginiams failus iš standartinio įvesties,
kuris iš esmės yra iš vartotojo.
Ir tai, kaip mes tai darome faktiškai C
Taigi, tai nėra naudojant GetString ir GetChar funkcijas
, kad mes panaudojome iš CS50 bibliotekoje.
Mes ketiname padaryti porą būdais šią problemą
taip, kad jūs galite pamatyti du būdai, kaip tai daryti.
Tiek fread funkcija, kad Danielis paminėjo ir fgetc yra geras būdas tai padaryti.
Manau, kad fgetc yra šiek tiek lengviau, nes ji tik turi, kaip matote,
vienas argumentas, FILE *, kad mes bandome skaityti simbolį,
ir grąžinimas vertė yra int.
Ir tai yra šiek tiek klaidina, tiesa?
>> Nes mes vis simbolį, tai kodėl gi ne šis sugrįžimas char?
Jus vaikinai turi kokių nors idėjų apie tai, kodėl tai gali grąžinti char?
[Missy atsakymai, nesuprantamas] >> Yeah. Taigi Onos visiškai teisus.
Jei tai ASCII, tada tai sveikasis skaičius gali būti susietas su faktinė char.
Gali būti ASCII simbolių, ir tai tiesa.
Tai yra būtent tai, kas vyksta.
Mes naudojame int paprasčiausiai todėl, kad turi daugiau bitų.
Tai didesnis nei char; mūsų char turi tik 8 bitai,, 1 baitas mūsų 32-bit.
Ir int visus 4 baitai verta vietos.
Ir paaiškėja, kad tai, kaip fgetc veikia,
jei mes Pereikite mūsų santrauką šio žinyno puslapyje šiek tiek,
pereikite visą kelią žemyn. Pasirodo, kad jie naudoja šią ypatingą vertę, vadinamą EOF.
Tai speciali konstanta, grąžinimo vertės fgetc funkcija
kai paspausite failo pabaigoje, arba, jei jūs gaunate klaidos pranešimą.
Ir paaiškėja, kad tai padaryti šie palyginimai su EOF tinkamai,
norite turėti, kad papildomos informacijos kiekį, kad turite int
, o ne naudojant char kintamuosius.
Net jei fgetc gauti simbolį iš failo,
norite prisiminti, kad jis grįžta kažką, kad tipo int jums.
Tai sakė, tai gana paprasta naudoti.
Jis ketina duoti mums simbolį, todėl visi mes turime padaryti, tai nuolat klausia failą
"Duok man kitą simbolį, duok man kitą simbolį, duok man kitą simbolį"
kol mes gauti į failo pabaigą.
Ir kad bus traukti į vieną simbolį ne iš mūsų bylą,
ir tada mes galime daryti tai, ką mes norėtume su juo.
Mes galime laikyti jį, mes galime pridėti jį į eilutę, mes galime atspausdinti jį.
Ar bet kad.
>> Priartinimo atgal ir grįžta mūsų cat.c programos,
jei mes ketiname naudoti fgetc,
kaip galėtume spręsti šį kitą eilutę kodo?
Mes ketiname naudoti - fread padaryti kažką šiek tiek kitokį.
Ir šį kartą, mes tik ketina naudoti fgetc gauti vieną simbolį vienu metu.
Apdoroti visą failą, ką galėtume daryti?
Kiek simbolių yra faile?
Yra daug. Taigi, jūs tikriausiai norite gauti vieną
ir tada kitą, ir gauti kitą ir gauti kitą.
Kokios algoritmas jūs manote, kad mes galime naudoti?
Kokio tipo? [Aleksandras] kilpa? >> Būtent.
Kai kurie iš kilpos.
Už linijos iš tikrųjų yra didelis, ir šiuo atveju.
Ir kaip jums buvo pasakyti, tai skamba kaip norite kilpą per visą failą,
gauti simbolį vienu metu.
Apie tai, kokiu pasiūlymus, kad gali atrodyti?
[Aleksandras nesuprantamas]
>> Gerai, tik pasakyk man, anglų kalba, ką jūs bandote daryti? [Aleksandras nesuprantamas]
Taigi šiuo atveju, tai skamba kaip mes tiesiog bando kilpa per visą failą.
[Aleksandras] Taigi i > Dydis?
Manau, failo dydį, tiesa? Dydis - we'll tiesiog parašyti tai, kaip šis.
Bylos dydis šiuo metu yra, i + +.
Taigi paaiškėja, kad tai, kaip tai padaryti, naudojant fgetc ir tai yra nauja,
yra tai, kad tai nėra lengva, tiesiog gauti failo dydį
su šiuo "sizeof" tipo statyti, kurį mačiau prieš.
Kai mes naudojame šią fgetc funkciją, mes įvesti kokią nors
naujas, funky sintaksė už kilpos, kur vietoj naudojant tik pagrindinę skaitiklis
eiti charakterį pobūdžio, mes ketiname traukti vieną simbolį vienu metu,
vieną simbolį vienu metu, ir tai, kaip mes žinome, mes pabaigoje
yra ne tada, kai mes skaičiuojami tam tikrą skaičių simbolių,
bet kai personažas, mes ištraukti, kad ypatingas failo pabaigos simbolio.
Taigi, mes galime tai padaryti - Aš vadinu tai sk, ir mes ketiname inicijuoti
mūsų pirmąjį kvietimą gauti pirmąjį simbolį iš failo.
Taigi šios dalies čia, tai vyksta gauti simbolį iš failo
ir laikyti jį į kintamąjį Ch.
Mes ketiname toliau tai daryti, kol mes gauti į failo pabaigą,
mes bandymai yra lygi į šį specialų EOF pobūdžio charakterio.
Ir tada vietoj daro sk + +, kuri tiesiog prieaugio vertę,
todėl, jei mes skaityti iš failo, kapitalo, tarkim,
ch + + duos mums b, ir tada gausime c ir tada d.
Tai akivaizdžiai nėra, ko norime. Ką mes norime čia
pastaruoju tiek norime gauti kitą simbolį iš failo.
>> Taigi, kaip galėtume gauti kitą simbolį iš failo?
Kaip mes gauname pirmąją raidę iš failo?
[Studentų] fgetfile? >> Fgetc, ar, atsiprašau, jums buvo visiškai teisus.
Aš su klaidomis ji teisę ten. Taigi, taip.
Čia, o ne daryti sk + +,
mes tiesiog ketinate skambinti fgetc (failą), vėl
ir saugoti mūsų pačiu CH kintamojo rezultatą.
[Studento klausimas, nesuprantamas]
>> Tai kur šie failą * vaikinai yra ypatingas.
Kaip jie dirba, jie - Kai pirmą kartą atidarote - kai pirmą kartą padaryti, kad fopen skambutį,
FILE * veiksmingai naudojamas kaip rodyklė į bylos pradžios.
Ir tada kiekvieną kartą, kai paskambinti fgetc, jis juda per vieną simbolį per failą.
Taigi, jei jūs tai vadiname, jūs incrementing failo žymiklį vieno ženklo.
Ir, kai jums fgetc vėl, jūs juda kitą simbolį,
kito charakterį ir kitokio pobūdžio ir kitokio pobūdžio.
[Studento klausimas, nesuprantamas] >> that - Taip.
Tai koks šio magija po gaubtu.
Jūs tiesiog laikyti pokyčio per.
Šiuo metu, Jūs galėsite dirbtų raide.
Taigi, kaip galėtume atsispausdinti šį į ekraną, dabar?
Mes galime naudoti tą patį printf dalykas, kad mes naudojamas iki.
Kad mes buvo naudoti visą semestrą.
Mes galime vadinti printf,
ir mes galime perduoti pobūdžio kaip, kad.
Kitas būdas tai padaryti, o ne naudojant printf ir tai padaryti format string,
mes taip pat gali naudoti vieną iš kitų funkcijų.
Mes galime naudoti fputc,, kuri atspausdina simbolį ekrane,
išskyrus atvejus, kai mes žiūrime at fputc - leiskite man šiek tiek nutolinti.
Mes matome, kas malonu, ji imasi pobūdžio, kad mes skaitome, naudojant fgetc,
bet tada mes turime suteikti jai srautą, spausdinti.
Mes taip pat galime naudoti putchar funkcija, kuri bus įdėti tiesiogiai iš standartinės.
Taigi yra visa krūva įvairių galimybių, kad mes galime naudoti spausdinti.
Jie visi į standartinę įvesties / išvesties bibliotekoje.
Kai norite spausdinti - taip printf, pagal nutylėjimą, bus atspausdinti specialiu standartu iš upelio,
yra tai, kad stdout.
Taigi, mes galime tik nuorodą į jį šio stebuklingo vertės natūra, čia STDOUT.
Oi. Įdėkite kabliataškį ribų.
>> Tai naują, funky informacijos čia daug.
Tai daug yra labai idiomatinis, ta prasme, kad tai yra kodas
tokiu būdu, kad yra parašyta tik todėl, kad švarus, skaityti, lengva skaityti.
Yra daug skirtingų būdų, kaip tai padaryti, daug įvairių funkcijų, galite naudoti,
bet mes linkę atlikite tuos pačius modelius daugiau ir daugiau.
Taigi nesistebėkite, jei matote kodą, pavyzdžiui, tai vėl ir vėl ateina.
Gerai. Šiuo metu, mes turime nutraukti tą dieną.
Ačiū, kad atvykote. Ačiū už žiūrėti, jei esate prisijungę prie interneto. Ir mes Pasimatysime kitą savaitę.
[CS50.TV]