[? DAN ARMADARAS:?] Tere, Ma olen [? Dan Armadaras?]. Täna me ei kavatse vaadates silumine. Me mitte ainult ei kavatse rääkida mõned tehnikad, vaid ka läheme vaatama mõned omadused sisalduvate jooksul CS50 IDE, mis võimaldavad hõlpsasti siluda programmi. Lihtsalt üks näide midagi, mida saab valesti minna ja see on tegelikult midagi et me oleme juba näinud. Sel juhul on tegemist C programmi mis aktsepteerib täisarv kasutaja, jagab selle kahte ning annab väljund tagasi kasutaja. Nüüd sellest, mida me oleme näinud varem loenguid, me teame, et see tegelikult põhjustada konkreetset tüüpi jaotus probleeme kui meil on paaritu arv. Täpsemalt, me lihtsalt visata midagi peale koma. Nüüd me teame, et see juhtub olema. Ja kui võtame, siis me võime kinnitada meie kahtlusi, esimene, koostades. Ja siis, joostes ja sisenemist paaritu arv. See ei ole midagi uut. Aga see on tegelikult Näiteks on viga, mis võib esineda ühes suurema programmi mis muutub raskemaks tabada. Kuigi me teame, mida küsimus on, tõsi asja tuum võib tuvastada püüdes spetsiaalselt kus viga esineb, tuvastada, mis seda probleemi on, ja siis millega seda. Nii annab see näiteks mis võiks olla midagi et me juba teame, kuid võib olla maetud jooksul muud elemendid koodi. Nii avada see teine ​​allikas koodifailist näiteks, see rajoon probleem on nüüd osa suuremast programmi. Ikka võib olla natuke natuke kunstlik, ja me võiks olla võimalik lihtsalt tuvastada seda, eriti sest me lihtsalt arutame seda. Aga me saame aru, et see probleem võib esineda ka laiemalt. Kui ma koostada selle ja nüüd käivitada, sisestage paaritu arv, näeme, et me ei saa täpselt väljund, et me oleme oodatud. Sel juhul, võib öelda, et me tahan loota kõik numbrid ühest kuni mõne konkreetse numbri. Ja me näeme, et me on erinevaid küsimusi siin, kui me väljastamist, lihtsalt, 0 ja 1, kui me anda panuse 5. Nii me juba teame, et seal on probleem siin. Aga me ei tea täpselt kus see küsimus on ka tegelikult olemas. Nüüd üks viise, mis saame proovida seda parandada on midagi, mida me oleme juba kasutusele võetud. Me võime lihtsalt kasutada seda ka laiemalt. On line 14, meil on Selle printf funktsiooni, mis võimaldab meil välja printida riik kohta erinevat teavet. Ja see on midagi, mida sa looks jooksul oma programmi proovida välja nuputada, millised täpselt on toimub erinevate rida koodi. Nii et isegi kui see ei ole lõpptoodangu et me tegelikult tahavad toota välja Selles programmis, me ikka võib-olla mõned siluda avaldused, kus me võib proovida aru saada täpselt, mida toimub sees meie koodi. Nii et kui ma lähen printf koos siluda tag. Sel juhul on see lihtsalt siluda string et ma olen üles-panna nii, et see muutub väga selge väljund minu kood mis see on, et ma tahan näidata. Ja Väljundiks arv et meil on arvutatud. Sellisel juhul võin tahan täpselt teada mis toimub enne ja Pärast mõningaid konkreetseid arvutusi. Nii et ma võiks kasutada printf enne ja pärast seda rida koodi. Sel juhul ma võiks isegi oleks natuke selgem öeldes siluda enne ja siluda pärast seda et ma ei ajage ennast mitmes reas, mis näevad välja samasugused. Nüüd, kui me kompileerida see ja käivitage see, sisesta number nagu viis uuesti, näeme, et meil on Nüüd väljund enne ja pärast ja leiavad, et me ei ole teinud selget jagunemise või selge millel on number et me tegelikult tahame teha. Nüüd sel juhul, see on ei ole tõesti selge väljundi. See ei ole tegelikult selge tulemus, et tahame välja just selle programmiga. Ja see on jällegi natuke kunstlik. Aga võib-olla üks neist asjadest, mis me võiks teha, kui kirjelduses öeldud et me tahame jagada seda 2 ja lisage 1-- nii teisisõnu tahame ümardada up-- siis me võiksime teada, et võiksime seda konkreetset asja, antud juhul. Nüüd siin me teame, et meil on võimalik lisada 1 meie poole võrra number. Olgem kompileerida seda ja kinnitavad, et see käitub nii, et me tahame. Me näeme, et nüüd enne võttes oleme number 5. Pärast oleme number 3, mis meie spetsifikatsioon, on see, mida me tahtsime teha. Aga kui me vaatame Väljundiks, saame näha, et meil oleks teine bug kokku, mis on et hakkame meie arv on 0. Nüüd jälle, see on midagi, et me oleme näinud varem ja me saame määrata üsna kergesti. Aga sel juhul me Samuti oli kasu kasutada printf avaldusega otse sees jaoks silmus täpselt teada, kus Selle vea tekkimist. Nii printf avaldused on väga kasulik, aidates teil otsustada, kus, just oma lähtekoodi, konkreetse vea tekkimist. Ja see on ka oluline mõista et nagu me kirjutada koodi, meil oleks eeldused seisundi kohta programmi. Või me võiksime olla eeldused mida osa programmist on tegelikult õige või vale, kui hiljem kui me ehitame selle programmi kohta ja teha seda osa keeruline ja suurema programmi et me mõistame, et teatud osa kohta, mis on tegelikult lollakas. Kasutades printf võib tõesti aidata kitsendada ja tuvastada piirkondade programm, mis ei tohi saab käitub täpselt nii, et me oota, mis põhineb meie eeldused. Aga seal on muud vahendid olemas, samuti, mis võimaldavad meil proovida aru saada, kus viga on toimunud ja ka konkreetselt, milliseid asju juhtub sees programm. Nii kasutades printf on väga kasulik, kui me tahame määrata kindlaks konkreetsed valdkonnad programm, mis on mõned bug. Aga see muutub ka tüütu mõne aja pärast. Sel juhul on see suhteliselt lihtne programm vaid ühe või kahe muutuja. Ja see muutub väga lihtne meile välja printida väärtus need muutujad kontekstis suurema programmi. Aga me võiksime olla erinev programm, mis on palju muutujaid. Ja see ei pruugi olla üsna nii lihtne kasutada printf proovida hinnata, mis toimub igaühele nendest muutujatest kui programmi täidetakse. Seal on programm, mis on olemas nimetatakse siluri programmi. Sel juhul, üks, et me kasutamine on GNU siluri või GDB, mis võimaldab meil kontrollida sisemise töös programmi palju üksikasjalikult. Me võime tegelikult ellu GDB käsurealt siin lihtsalt kirjutada GDB ja käsk, et me tahame siluda. Sel juhul loota. Nüüd sel juhul me näeme, et see toob meid kiiret mis ütleb GDB. Ja me saame tegelikult täita käske GDB tegelikult algab täitmist Programm, lõpetage see teatud punktides, hinnata muutujate ja kontrollida muutujaid olemas programm riigi sel konkreetsel hetkel, ja nii edasi ja nii edasi. See annab palju jõudu meile. Aga see lihtsalt nii juhtub et CS50 IDE ka annab GUI või kasutajanime liides GDB, et võimaldab meil seda teha ilma käsurida üldse või üldse isegi. Nii, et ma pääseb, et on kasutada siluda nuppu tipus on CS50 IDE. Nüüd minevikus, mis meil on näinud, et me kasutame käsku line kompileerida ja seejärel käivitage programm. Debug nupp teeb need mõlemad etapid. Aga see ka avab siluri tab paremas servas mis võimaldab meil kontrollida erinevaid Kinnistute programmi nagu see on täidesaatva. Kui ma vajutan siluda, selles juhul avab uue kaardi konsool akna alumises servas. Ja te näete, et see sakk on mõningaid andmeid tipus. Ja me saame suuresti eirata seda. Aga üks asi, et me tahame märgata on, et see väljastab sama asi, et me saaksin, kui üritasime käivitada omale C programmi terminali aknas. Siin näeme, see töötab rõkkama, ja see on erinevaid lipud, ja see on koostamas meie count.c faili mis oli valitud tab ajal et ma tabanud siluda. Nii et see on väga kasulik, sest nüüd kasutavad seda siluda nuppu, saame korraga koostada ja seejärel täita programmi, et me tegelikult taha joosta. Üks lipud mis on üle oluline, sel juhul oleme tegelikult kasutanud kõige kauem aga ka lihtsalt tegin mõned käsi lehvitades [kuuldamatu], mis on see üks siin. In rõkkama, ta ütleb -ggdb3. Sel juhul me oleme räägib rõkkama, meie koostaja, on see, et me tahame koostada meie programmi. Aga ka see, mis on nimetatakse sümbolit info nii, et kompilaator tegelikult on juurdepääs to palju alusteabel sisalduva programmi raames. Täpsemalt arvu funktsioone, mis mul on, isikute nimed funktsioone, muutujate tüübid et need muutujad, ja erinevaid muid asju, et aidata siluri täita oma tööd. Nüüd on midagi muud see on oluline märkida, Kui me arutame jooksvaid programmi sel viisil. Pange tähele, et see on tegelikult üles kasvanud uus tab meie konsool allosas. Me ei pea enam suhelda otse terminali aknas. Aga see uus kaart tegelikult terminali aknas. See lihtsalt on spetsiifiline jooksmine programmi, et oleme loonud. Pange tähele, et allosas, in koos mõnede väljund poolt kolisevad koostaja ja GDB, mida saame suuresti tähelepanuta, see tegelikult näitab väljundi Meie programm on väga alt. Nüüd on oluline mõista et see üks aken tegelikult näitan sulle väljund oma programmi vaid ka nõus sisend kõnealuse programmi, samuti. Nii teate, mis ütleb, sisestage number, mis on sama tulemuse, et meil oli oli terminali aknas varem. Aga see on nüüd toodud selle uue kaardi. Ma ei saa sisestada number. Ja see tegelikult funktsiooni ootame näitab meile meie siluda, väljund, väljund, mis võiks olla bagi, nagu me oleme näinud. Ja väga põhjas, seda tegelikult on mõningaid täiendavaid väljund SKPst lihtsalt öelda, et see programm on lõpetatud. Nüüd, kui nägid selles eriti joosta, see ei olnud eriti kasulik, sest isegi kuigi meil oli siluri menu tulla up, see oli ikka töötava programmi. Kell tal ei ole tegelikult peatada täitmise meile saaks kontrollida kõiki muutujate sisalduvad. Seal on midagi muud et me peame tegema, et saada GDB tunnistama, et me tahame peatada programmi täitmiseks ja mitte ainult et ta saaks jätkata Tavaliselt, kui me oleks muul juhul. Selleks, et peatada täitmise, mingil konkreetsel liinil, meil on vaja luua, mis on nimetatakse murdepunkt. Ja murdepunkt on väga lihtne luua Selles CS50 IDE võttes hiirt ja klikkides vasakule Mõne konkreetse liini number. Kui ma seda teen, punane täpp näib, mis näitab et see rida on nüüd murdepunkt. Ja järgmine kord, kui ma saan GDB, siis peatub täitmise ajal, et murdepunkt kui see jõuab, et rida koodi. Nüüd on see oluline asi realiseerida et see ei pruugi juhul, et iga koodirida on tegelikult kättesaadav. Kui ma oleksin luua funktsiooni siin, et example-- tühine f-- ja lihtsalt ei print line siin-- hello world-- kui ma ei helista seda funktsiooni, see saab olema nii, et kui ma panen murdepunkt siin funktsiooni ei saa kunagi kutsutud. Ja seetõttu käesoleva Eelkõige murdepunkti kunagi tegelikult peatada programmi täitmiseks. Ütleme, et ma õigesti luua murdepunkt mõned koodirida mis tegelikult toimub. Nüüd sel juhul, see on Esimene rida põhiülesanne. Nii et see on kindlasti tegemist et niipea kui ma hakkan täitmist, kõige esimene rida jõutakse. GDB peatub täitmist. Ja siis ma saaks suhelda siluri. Võimalik on määrata mitu read murdepunktid, kui soovite. Me võime ka luua rida up siin selles segmendis koodi et ei saa kunagi jõudnud. Ja meil on võimalik määrata üks allpool. Põhjusel, et meil oleks tahad seda teha jagame läheb natuke rohkem üksikasjalikult hetk. Nii nüüd, las ma lihtsalt keelata Nende täiendavate murda punkte nii et saame vaadata, mis juhtub kui mul on üks vaheaeg Punkti minu programm. Olen teinud mõned muudatusi selles programmis. Nii et ma pean seda salvestada. Ma klõpsake siluda, nii et ma ei saa algab koostamise ja seejärel täitmise siluri. Me näeme, et pärast hetkedel line, et me valitud murda punkt kollase värviga. Samuti on märgatav, et Ülemises paremas silumist paneel et pausiikooni on muutunud väikesesse mängu ikooni. See tähendab, et meil paus täitmise, see on konkreetsel juhul. Ja lööb Play nuppu oleks võimaldab meil jätkata täitmist tollel kindlal hetkel. Pange tähele, et seal on paar muud nupud selles siluda paneel, samuti. Samm üle, mis võimaldab mul täita, et üks rida koodi ja astuda üle, et liini kõrval üks, mis käesoleval juhul tähendaks, et printf avaldus täidetakse. Ja on siis pausi täitmise kohta line 13 nagu nii. Ja seal on ka samm funktsionaalsusest, mis on kasulik, kui olen loonud muu funktsioonid mujal lähtekoodi. Ja ma tahan astuda neid funktsioone mitte täidab seda ülesannet tervikuna. Aga me vaatame rohkem etapis funktsionaalsusest vaid hetk. Nüüd märgata teisi asju, mis tegelikult olemas selle siluda paneeli. Meil on selle paneeli kutsutud pinu, mis näitab meile kus täpselt oleme. Sel juhul oleme sees peaülesandest. Meie script nimetatakse count.c. Ja meil juhtub olema line 13, veerg üks, mis Just seda rõhutas piirkonnas lähtekoodi näitab, kui hästi. Nüüd märkate, et see näitab ka all kohaliku muutuja osa kõik muutujad, mis eksisteerivad selle funktsiooni. Oluline on tähele et kõik muutujad Siia ilmuvad kohaliku muutuja rubriigist funktsioon, juba enne nende määratletud. Me näeme siin, et meil on muutuv nimetatakse num, on vaikimisi väärtus 0, ja see on tüüpi int. Nüüd, enne kui me tegelikult initsialiseerida kõiki neid muutujaid, me ei ole tingimata tagatud, et näha väärtus 0. Ja sõltuvalt teiste hukkamiste et olete läbi ja riigi oma mälu, kui sa tegelikult programmi käivitada, te võite leida, et teil ei näe väärtused 0 ja selle asemel mõni muu hull numbrid. Aga ei muretse. Ta ei kavatse olla olulised kuni sa tegelikult initsialiseerida väärtus. Nüüd sel juhul näeme, et Olen läbi mõned väljundid. Ja ma just nüüd, peatatud täitmise. Aga sel juhul, mida Ma tõesti tahan teha on nüüd samm üle selle joone koodi, nii et ma ei saa tegelikult päringu kasutaja, et int, et tahame kasutada oma programmi. Nüüd sel juhul, kui I hit samm üle, teate et Paus või pigem Jätka nupp on muutunud selle pausinupp sest see kood on tegelikult täidetakse. Mis toimub just praegu on see ootab meid sisestada mõned andmed nagu näeme meie väljundi teksti väga põhjas. Nii kohe, et see on tegelikult ei peatatud kuigi see, omamoodi, ilmub olla, sest ei juhtu midagi. Aga see lihtsalt nii juhtub, et minu konkreetsel juhul on line 13 Ma ootan kasutaja sisend. Ja nii GDB ei ole võimalik kontrollida programmi, sest see töötab. Nüüd järgmine kord, et ma sisestan mõned input-- nii et ma sisestage et number 5, nagu me oleme näinud past-- tabas Return, ja me märkate, et kohe, GDB pausid ja jälle esile järgmisele reale. Aga teate, et nüüd, kui Tänu meie sisestanud väärtus, oleme uuendanud, et väärtus sees Meie kohalikud muutujad, mis Väga kasulik on täpselt teada mida see number oli mälu. Nüüd ma ei luba seda programmi jätkata mängivad lõpuni selle täitmine pihta Jätka. Me näeme, et väga kiiresti teeb programmi lõpuni täidesaatva sama väljundi et me oli enne, siluri sulgub, ja nüüd on see programm täielikult seiskunud. I näitavad, et ainult eesmärgil nähes, mida juhtub, kui me tegelikult tabas Jätka. Aga me tegelikult tahame tahan minna tagasi selle programmi nii et saame proovida siluda täpselt, mis toimub. Nüüd, kui ma kasutan siluri, tohib ei pea neid siluda printf avaldused. Nii et ma võiks need eemaldada Ma teen nüüd lihtsalt minna tagasi meie lihtsam koodi et meil oli hetk tagasi. Nüüd, kui ma päästa programmeerida ja käivitada, see jälle minna, et esialgse murdepunkti, et mul oli real 11. Ja ma saaks kontrollida minu muutujad nagu ma tahan teha. See lihtsalt nii juhtub, et see osa ei ole väga huvitav, Ja ma tean, et ma lähen välja trükkida seda avaldust. Palun sisestage number. Ja siis ma tean, et ma lähen küsida kasutajalt, et täisarv. Nii et ehk ma tegelikult tahan liikuda minu murdepunkti natuke allpool. Saate eemaldada murda punkte klõpsates jälle otse vasakule, et liin number. See punane täpp kaob, näidates et see murdepunkt on nüüd läinud. Nüüd sel juhul, täitmine on peatatud. Ja nii see ei ole tegelikult läheb jätkata nii et konkreetsel juhul. Aga ma ei saa määrata pausi punkt a little bit hiljem. Ja kui ma nüüd taas minu kood, see jätkub ja öelda punkt, et murdepunkt. Jällegi, ma tabanud Jätka. Ei tundu nagu midagi juhtub. Aga see on sellepärast, et minu kood ootab sisend. Ma sisestage number 5, Enter, ja nüüd järgmise murdepunkti tabavad. Nüüd sel juhul käesoleva on rida koodi et enne teadsime juhtus olema lollakas. Nii saab hinnata, mis juhtub sel konkreetsel ajahetkel. Kui liin on esile tõstetud, seda line ei ole veel täidetud. Nii et kui näeme et mul on number, mis Mul on täisarv nimega num, et väärtus on 5. Ja ma lähen esituses matemaatikat kohta, et number. Kui ma sammu üle, et saame märgata, et väärtus num on muutunud vastavalt aritmeetika, et me oleme tegelikult teinud. Ja nüüd, et me oleme sees see silmus või nüüd, et silmus ise on rõhutanud, näeme, et meil on uus muutuja nimega i, et läheb tohi kasutada, et loop. Nüüd mäletan enne, et ma mainis, et mõnikord sa oled näeme mingi hull numbrid vaikimisi enne, et number või et muutuja tegelikult vormindatud. Näeme, et täpselt siin see muutuja nimetatakse i, mis ei ole veel lähtestatud ajal esile. Aga näeme, et see on mingi number et me tegelikult ei oodanud. See on OK. Ära muretse selle pärast sest meil ei ole tegelikult vormindatud, et number, kuni ma samm üle selle joone ja väärtust i on vormindatud väärtusega 1. Nii, et näha, et see on tegelikult Juhul, olgem samm üle. Nüüd on võimalik näha, et line on täidetud. Ja meil on nüüd esile Selle printf line. Ja me võime nüüd näha, kuidas meie väärtused I ja 3 on aja jooksul muutunud. See on väga kasulik teha, tegelikult, on samm üle joonte korduvalt. Ja leiad, mida tegelikult juhtub sees oma silmus ja mis juhtub muutujad sees, et loop nagu, et programmi rakendamise esineb üks samm korraga. Nüüd on see aeg, mil ma astus üle lihtsalt piisavalt et ma nüüd olen lõpuks oma programmi. Kui ma sammu üle, et see tegelikult lõpetada täitmist Nagu me oleme näinud varem. Lubage mul see taaskäivitada, veel kord, et et võin juhtida midagi muud välja, samuti. Sel juhul on nüüd minult taas võtta vastu number, mille Ma jällegi siseneda. Aga seekord, ma lähen sisestada suurema arvu nii, et silmus itereerima rohkem korda. Sel juhul ma lähen sisestada väärtus 11. Nüüd jälle, sest ma seada murdepunkt real 15, see saab rõhutada, et liin. Me näeme, et meie number 11 on õigesti esindatud meie kohalikud muutujad. Astudes üle, et saame nüüd vaata, mis juhtub meie väärtus i kui astume sees selle jaoks silmus. Läheb suurendatakse iga kord, kui me jõuda tippu, et loop. Nüüd üks asi, mis võiks kasulik teha täitmise ajal Käesoleva programmi eesmärk on minu jaoks tegelikult muuta muutujate midstream näha Mis juhtub minu programm. Sel juhul ma ei saa tegelikult topeltklõps väärtus. Pange tähele, et see muutub tekstiväljale. Nüüd ma saan sisestada erinevat Väärtustame kokku näha, kuidas minu programm käitub kui ma olen muutunud, et muutuja. Nüüd sel juhul muutuja Nüüd sisaldab väärtust 10. Aga programm on veel peatatud sundtäitmist. Kui ma sammu üle, ma näen, et väärtus i, mis ma Sisestatud 10, ei ole suurem kui väärtus num, mis kohe paneb silmus peatada täidesaatva. Nüüd see ei ole ainult Põhjus, miks te oleks soovid muuta muutuja paigas. Sa võid tegelikult tahavad proovida muuta seda nii, et saate jätkata täitmise loop või nii, et saate muuta mingi väärtus enne seda jõuab mõne konkreetse komplekti aritmeetiline et te asute täitma. Nüüd, et me tegelikult muuta väärtus i kui programm täidesaatva, see põhjustas silmus loobuda enneaegselt, sest äkki ma juhtus olema suurem kui väärtus NUM, mis tähendab, et see silmus enam ei vajata, mis tuleb täita. Peale selle juhtus olema Juhul, kui oleme muutnud väärtus i kui liin 17 on rõhutatud, mis oli hetk, et silmus täitmine tegelikult hinnatakse. Kui ma oleksin muutunud väärtus i teisel real, ütleme 19, oleksime näinud erinevat käitumist, sest line 19 oleks on teostatud enne loop tingimus oli ümber hinnata. Nüüd on see aeg, mil ma olen jälle lõpus see programm. Ja ma ei saa lubada seda, et jätkata võimaldab oma programmi sulgumise loomulikult. Aga seal on paar asja mis on oluline ära võtta just selle arutelu. Sa pead hindama oma eeldusi kuidas kood tuleks käitub. Iga kord, kui arvad, et mõni tükk koodi tead juhtub tööd, mis võib olla punane lipp minna tagasi ja hinnata, ja olla kindel, et teie eeldus kuidas see kood töötab on tegelikult tõsi, et kuidas see on väljendas oma lähtekoodi. Kuid veelgi punkti oli, Kui me kasutame siluri, võite panna katkestuspunktid erinevat rida koodi, mis paneb siluri peatada täitmise igas need read nii, et saate hinnata mälu või isegi muuta see koht. Ja jälle, pea meeles, et saate luua mitu murdepunktid, et sa saab ka jätkata täitmist, jätke suurtel koodiosade, ja siis see automaatselt peatada järgmisel murdepunkti. Seal on tegelikult rohkem arenenud funktsioone siluri, samuti. Aga me peame teid suunata et mõnes järgnevas videos et tõesti tease peale, kuidas kasutada neid konkreetseid ülesandeid. Sest nüüd, aitäh väga palju vaadates. Ja õnne silumine.