[Mūzikas atskaņošanas] DAVID J. Malan: Nu labi. [Smiekli] Laipni lūdzam atpakaļ. Tas ir CS50. Un šis gals no piecu nedēļu. Un līdz šim, mēs esam diezgan daudz lietojis par pašsaprotamu, ka pastāv šo kompilatoru, šķindēt, ka jūs esat ir atsaucoties veidā šis cits instruments, ko sauc Pārliecinieties, ka kaut maģiski pārvērš jūsu avota kodu uz objekta kodu, ar nullēm un tiem ka jūsu datoru CPU, centrālā procesors, patiesībā saprot. Bet izrādās, tur ir skaitlis, kas ir notiek zem motora pārsega ir starp ieejas un izejas. Un es gribētu ierosināt, ka mēs miesa kas veic nedaudz sīkāk stāšanās šie četri soļi, ir kaut ko sauc par pirmapstrāde, kaut sauc apkopotu, ko mēs esam redzējuši, kaut ko sauc montāža, un kaut ko sauc savieno. Tātad līdz šim, jo ​​daži no mūsu programmām, mēs esam bija asas ietver. Pavisam nesen mēs esam bija daži asi nosaka par konstantes. Tātad izrādās, ka tās lietas, kas ir prefiksu ar hash simbolu vai mārciņa simbols ir pre-procesors direktīvām. Tas ir tikai iedomātā veids, kā sakot, ka tas ir rindā kodu, kas ir faktiski pārveidots kaut ko citu, pirms Dators pat mēģināt pārvērst savu programmas uz nullēm un tiem. Piemēram, asa ietilpst standarta I / O. H, diezgan daudz tikai nozīmē iet priekšu, paķert saturu failiem stdio.h un ielīmēt tos tieši tur. Līdz ar to nav nullēm un tiem tajā brīdī vēl. Tas patiešām ir tikai aizstāšana. Un tas ir darīts laikā, tā saukto pirmapstrāde posmā, kad kursēt šķindēt vai īpaši Padarīt vairumā gadījumu. Tātad tas viss ir noticis Pirmais automātiski līdz šim. Tad nāk apkopojums solis. Bet mēs esam bijuši pārspīlēti apkopošana. Sastādīšanas programmu īsti nozīmē ņemt to no kaut kā C, Pirmkods mēs esam rakstot uz leju lai kaut ko sauc par montāžu. Asambleja valoda ir zemāks līmenis valoda, kas, par laimi, mums nebūs ir daudz iespēju, lai rakstīt šajā semestrī. Bet tas ir zemākajā līmenī Apziņa, ka tu burtiski sākt rakstīt pievienot un atņemt un reizināt un slodzes no atmiņas un saglabāt atmiņā, Ļoti pamata norādījumus, ka dators, zem motora pārsega, tiešām saprot. Visbeidzot, montāža uzskata, ka šī valoda ar nullēm un tiem, kas mēs esam bijuši apraksta līdz šim. Un patiesi visbeidzot, tur ir tā sauktā saistot posms, kuru mēs redzēt tikai brīdi, kas apvieno Jūsu nullēm un tiem, ar nullēm un tiem citiem cilvēkiem, pirms esat izveidojis. Tāpēc uzskatu šo super vienkāršu programmu. Tas bija no 1 nedēļas. Tas tikko teica, Hello World, uz ekrāna. Mums bija tas, izmantojot šķindēt. Vai mums bija to caur Make kas ilga šķindēt. Un izvadīt tajā laikā, kad daži nullēm un tiem. Bet izrādās, tur ir starpposms. Ja es iet pār šeit - Hmm, nav gribu redzēt viņu vēl. Ja es iet pār šeit manā ierīces un es atvērt hello.c, šeit ir tā, ka tas pats programma. Un ko es esmu gatavojas darīt manā terminālī logs šeit es esmu gatavojas palaist šķindēt nevis Marka, kas automatizē visas četras šie soļi mums. Un es esmu gatavojas darīt, šķindēt-S un tad hello.c un pēc tam ievadiet. Un man mirgo ātri atkal, kas ir labs. Un tagad nedaudz lielāku logu, Es esmu gatavojas atvērt gedit šeit. Un es esmu gatavojas atvērt failu, kas, Izrādās, sauc hello.s šis ir, ka montāžas valodā Es minēju iepriekš. Un tas ir tas, ko sauc montāža valoda, diezgan zems līmenis instrukcijas, ka jūsu Intel CPU vai kāds tas ir tas, kas ir iekšā saprot. Un mov ir kustībā. zvans ir zvana, ļoti zema līmeņa funkcijas. sub ir atņemt. Tātad, ja jums ir īpaša CPU iekšpusē no datora, kas padara to atšķirīgas, salīdzinot ar citiem CPU uz tirgū, ir kas norādījumi to saprot un bieži, cik efektīvs tas ir, cik ātri tas ir pie izpildes daži šo norādījumu. Tagad vairāk par šo, jūs varat veikt Nākamais Fall CS61 koledžā. Bet šeit mums ir, piemēram, daži identifikatori, kas varētu izskatās pazīstami. hello.c ir programmas nosaukums. . Teksts - tur nav daudz interese tur tikai tagad, atgādināt, ka teksts segments, kas pirmdien, ir kur atmiņas jūsu programma faktiski beidzas up. Tātad tas ir vismaz neskaidri pazīstams tur. Šeit, protams, ir pieminēts Mūsu galvenā funkcija. Ritinot uz leju, tie attiecas uz lietām saucamie reģistri, ir ļoti mazas gabalos atmiņas iekšpusē jūsu faktisko CPU. Un, ja es ritiniet uz leju, pat turklāt, es redzu kaut kādu netieša norāde ASCII. Un tur, protams, ir tas, ka virkne, Sveiki, komats, pasaule. Tik garš stāsts īss, tas ir bijis notiek, lai jūs, automātiski, zem motora pārsega visu šo laiku. Un to, kas noticis patiesībā ir vienreiz Jūs esat palaist šķindēt, vai ar Marka, jūs saņemat pirmo reizi, no avota kodu, tā saukto montāža valoda. Tad šķindēt ir pārvērst šo komplektu valoda līdz nullēm un tiem. Un tas ir slaids, ka mēs sākām Mūsu diskusija nedēļa 0 par - un pēc tam nedēļa 1 uz. Un tad beidzot, tie nullēm un tiem tiek apvienoti ar nullēm un tiem No šīm bibliotēkām, mēs esam bijuši ņemot par pašsaprotamu, piemēram, Standard I / O vai Stīgu bibliotēka vai pat CS50 bibliotēka. Tātad, lai krāsu šo attēlu vairāk vizuāli, mēs esam hello.c. Un tas, protams, izmanto printf darboties teikt, hello pasaule. Apkopošana solis ņem to uz leju, lai ka fails mēs tikko redzējām hello.s, pat lai gan tas ir parasti svītrots automātiski jums. Bet tas ir montāža kodu vidū soli. Un tad, kad mēs montēt montāžas valoda, tā sakot, tas ir, kad jūs saņemt šos nullēm un tiem,. Tāpēc mēs esam pietuvināto efektīvi šodien kādi mēs esam, ņemot par pašsaprotamu, nozīmē iet pirmkodu iebilst kodu. Bet visbeidzot, tagad tas pats attēls - pieņemsim bāzt to pa kreisajā pusē. Un atzīmēt, ka uz augšu tur Es teicu stdio.h. Tas ir fails, kas mēs esam iekļāvuši jo gandrīz visi no programmas, mēs esam rakstiski. Un tas ir fails, kura saturs saņemt kopiju ielīmēts, efektīvi atop jūsu kodu. Bet izrādās, ka uz datora sistēma kaut kur, tur ir iespējams stdio.c failu, ka kāds rakstīja gadiem Pirms kas īsteno visas funkcijas, kas bija paziņojuši in stdio.h. Tagad patiesībā tas droši vien nav jūsu Mac vai jūsu datoru vai pat CS50 ierīce ir neapstrādātu C kodu. Kāds jau ir apkopoti, un iekļauti . O failu, lai objekta kodu vai. failu, kas attiecas uz kopīgu bibliotēka kas ir bijis iepriekš instalēta un iepriekš apkopota par jums. Bet pieņemsim, ka tur tiešām pastāv uz mūsu datora stdio.c paralēli ar šķindēt. Jūsu kods ir tiek apkopoti un samontēti. stdio.c 's kods tiek apkopoti un samontēti, tā, ka šis ļoti pēdējais solis, šeit lejā, mums ir kaut kā saikne, tā sakot, jūsu nullēm un tiem Ar viņa vai viņas nullēm un tiem vienā vienkārša programma, kas galu galā ir sauc vienkārši Sveiki. Tātad tas ir visu burvju, kas ir noticis līdz šim. Un turpinās ņemt tos procesi piešķirta, bet saprast, tur ir sulīgs detaļas partijas notiek zem tur. Un tas ir tas, kas padara jūsu dators ar Intel iekšpusē Īpaši atšķirīga. Tātad uz šo piezīmi, ja jūs vēlētos, lai pievienoties mums pusdienās šo piektdien, iet uz parasto vietu cs50.net/rsvp, 13:15 šo piektdien. Un tagad daži paziņojumi. Tāpēc mums ir dažas labas ziņas. Un mums ir dažas sliktas ziņas. Sākt ar dažas labas ziņas šeit. [Groaning] Labi. Nu, tas ir tehniski brīvdiena, tāpēc tas nav tik daudz dāvanu no mums. Bet tad sliktas ziņas, protams. [Groaning] Es pavadīju daudz laika par šiem animāciju. [Smiekli] Būs pārskats sesija šo nāk pirmdiena. Tas būs at 5:30. Mēs atgādinās jums visu šo informāciju pa e-pastu par kursu ir mājas lapā tikai pāris dienu laikā. Tā tiks filmētas un pieejami neilgi pēc tam. Tātad, ja jūs nevarat darīt, ka pirmdiena nakts slots, neuztraucieties. Sekcijas šo nāk šonedēļ būs arī koncentrēties uz pārskatīšanu attiecībā uz viktorīnas. Ja jūsu sekcija ir uz Monday, kas ir patiešām universitātes brīvdienu, mēs joprojām atbilst sadaļā. Ja jūs vienkārši nevar darīt, ka sadaļā, jo jūs gatavojas prom, tas ir jauki. Apmeklēt svētdiena vai otrdiena sadaļu vai tune-in uz Jason daļā, kas ir pieejami tiešsaistē. Tātad, vairāk sliktas ziņas. Tātad, saskaņā ar to mācību programmu, mums ir lekciju nākamajā piektdienā. Bet laba ziņa - skaidri, es pavadīju pārāk daudz laika uz to. [Smiekli] Mēs atcelt nākamās piektdienas lekcijas. Tā, ka būs dāvana mums, lai jūs tiešām var būt jauka atelpu starp šo un divām nedēļām līdz ar to. Līdz ar to nav lekcijas nākamnedēļ, tikai niecīga neliela viktorīna, par kuru jums ir jābūt kļūst arvien satraukti. Tātad, pieņemsim tagad savukārt mūsu uzmanību uz kaut kas patiešām ir daudz vizuāli un vairāk aizraujošu, un, lai noteiktu posmu par to, kas notiek, ir uz horizonta tikai pāris nedēļu laikā. Pēc pirmā viktorīnu, mēs savukārt koncentrēt mūsu problēmu kopas uz otru domēna specifiska problēma, ka no kriminālistikas vai drošības plašākā nozīmē. Faktiski, tradīcija ar šo problēmu komplekts ir man viens no mācīšanas kolēģiem vai CAS staigāt pa Campus veikt dažas fotogrāfijas identificējami, bet nav skaidrs cilvēki, vietas, vai lietas, tad katru gadu es kaut kā izdodas nejauši izdzēstu vai korumpēti digitālo mediju kartes kas ir iekšpusē mūsu kameru. Bet nav liels darījumu. Es varu iet uz priekšu un pievienojiet ka manā datorā. Es varu veikt tiesu tēlu tā, lai runāt, kopējot nullēm un tiem nost no šīs atmiņas kartes, neatkarīgi no tā, tā SD kartes vai kompaktu flash karti vai ko jūs esat iepazinušies ar. Un tad mēs varam nodot, ka out. Un tā uzdevums būs, cita starpā lietas, jums būs rakstīt C kodu, kas atjauno visu ķekars JPEG par mani un atklāja būs tie cilvēki, vietas vai lietas. Un mēs arī runājam, jo ​​šo problēmu noteikt un kas dienas nākt, par grafikas kopumā. Mēs esam izmanto tos, kursu, lai izcelties. Bet jūs esat veida pašsaprotama pastāv šie augsta līmeņa jēdzieni taisnstūri un ovāla. Bet zem motora pārsega tur ir pikseļi. Un jums ir bijis jāsāk domāt par tiem. Vai jūs par p-set 4 jādomā par plaisu starp jūsu ķieģeļiem, kā ātri jūs bumba pārvietojas ekrāns izcelties. Tātad ir šis jēdziens punktiņi uz ekrāna, kas ir stāties spēlēt jau. Tagad to, ko jūs redzat, lai gan, ir tas, ko jums uz datora ekrāna. Ja esat kādreiz noskatījos dažas labas vai slikts TV, izredzes ir tie diezgan daudz pret auditoriju, piemēram, technophobes kas nav īsti zina daudz par datoru. Un tāpēc tas ir ļoti viegli, lai policijas detektīvs teikt, jūs varat tīrs, ka par mani? Vai uzlabot, labi? Uzlabot ir kā buzz vārdu lielākā daļa jebkuru noziegumu saistītu šovs. Un realitāte ir tāda, ja Jūs lietojat ļoti izplūdis attēls Aizdomās turētā dara kaut kas slikts, jūs nevarat tikai uzlabot to. Jūs nevarat tuvinātu bezgalīgi. Jūs nevarat redzēt mirdzumu un kāds ir acs, kas ir apņēmusies, ka īpaši noziegumu, neskatoties izplatība šo par TV. Un tā ar to pieņemsim motivēt, ka gaidāmās problēmas, kas ar ieskatu daži rāda, ar kuru jums varētu būt pazīstami. [VIDEO PLAYBACK] -Labi. Tagad, pieņemsim iegūt labu apskatīt jums. -Turiet to. Palaist šo atpakaļ. -Pagaidiet minūti. Iet labi. -Tur. Iesaldēt to. -Full screen. -Labi. Iesaldēt to. -Pastiprināt par to, kas ya? -Vector kas par šo puisis ar aizmugurējo riteni. -Zoom in tepat šajā vietā. -Ar pareizo aprīkojumu, imaged var tikt paplašināta un asumu. -Kas tas ir? -Tā ir veicināšanas programma. -Vai jums ir skaidrs, ka līdz jebkurš? -Es nezinu. Pieņemsim uzlabot to. -Uzlabot apakšpunktu-6. -Es uzlabota detalizēti un - -Es domāju, ka tur ir pietiekami daudz, lai uzlabotu. Atlaidiet to uz mana ekrāna. -Uzlabot pārdomas viņas acīs. -Let 's palaist to caur video uzlabošanu. -Edgar, jūs varat uzlabot šo? -Hang on. -I've strādājuši pie šī pārdomām. -Kāds ir pārdomas. -Reflection. -Tur ir pārdomas no cilvēka sejas. -Pārdomas. -Tur ir pārdomas. -Zoom in uz spoguļa. -Jūs varat redzēt pārdomas. -Vai jūs varat uzlabot attēlu no šejienes? -Vai jūs varat uzlabot viņu tieši šeit? -Vai jūs uzlabot to? -Vai jūs uzlabot to? -Vai mēs varam uzlabot šo? -Vai jūs uzlabot to? -Turies, otrkārt, es ņemšu uzlabot. -Zoom in pie durvīm. -X10. -Zoom. [Smiekli] -Pārvietot collas -Pagaidiet, stop. -Stop. -Pauze to. -Pagriezt par 75 grādiem ap vertikālā lūdzu. [Smiekli] -Stop, un atpakaļ uz to daļu par durvīm atkal. -Got attēlu pastiprinātāju kas var bitmap? -Varbūt mēs varam izmantot Pradeep Sen metode, lai redzētu uz logiem. -Šī programmatūra ir state of the art. -Ikona vērtība ir izslēgts. -Ar pareizo kombināciju algoritmu. -Viņš ir pieņemts apgaismošanas algoritmus nākamais līmenis, un es tos var izmantot, lai uzlabot šo fotogrāfiju. -Lock tālāk un palielinātu z ass. -Uzlabot. -Uzlabot. -Uzlabot. -Freeze un uzlabot. [END VIDEO PLAYBACK] DAVID J. Malan: Tātad problēma Set 5 ir tas, kas ir priekšā tur. Tāpēc mēs drīz saņemt labāku izpratni par to, kad un kāpēc jūs varat un mūsu nevar uzlabot šādā veidā. Bet vispirms, pieņemsim atgriezties mūsu uzmanību dažiem no pamatelementiem Mēs ir nepieciešams, lai varētu pateikt, ka stāsts. Tāpēc atgādinām, ka mēs vērsa šo attēlu uz Pirmdienās un mazliet pagājušajā nedēļā. Un tas raksturo izkārtojumu lietas jūsu datora atmiņā, kad darbojas dažas programmas. Tech segments up top, atsaukšana, attiecas faktiskajām nullēm un tiem , kas veido savu programmu. Tur, tālāk, ka daži formatēti vai neinicializētām dati, kas parasti attiecas uz lietām, piemēram, konstantēm vai virknes vai globālie mainīgie, kas ir pasludināts iepriekš. Tur ir kaudze, bet mēs būsim atpakaļ uz ka ir mazliet. Un tad tur ir kaudze. Daudz, piemēram, kaudze paplātes ar kafejnīca, tas ir, ja atmiņa izpaužas kārtains un kārtojumu, kad Jūs darīt to, kas programmā? Kas ir kaudze izmantošana? Yeah? Call of funkciju. Katru reizi, kad jūs zvanu funkciju, tas ir dota skaida atmiņas par tās vietējās mainīgie un to parametri. Un gleznieciski, mēs redzam, ka ar katru secīgi funkciju sauc, kad prasa B zvani C prasa D, tie get kārtains uz kaudzīti. Un katrā no šīm šķēles atmiņa ir būtībā unikāls joma šo funkciju, kas, protams, ir problemātiska, ja jūs vēlaties, lai roku no vienas funkcijas uz citu gabals gada datiem, kurus vēlaties to mutācijas vai mainīt. Tātad, kāds bija mūsu risinājums ļautu Funkcija pārstāv viens kaudze rāmis, lai mainītu atmiņu iekšpusē cita kaudze rāmja? Kā šie divi runāt viens ar otru? Tātad, kā norādes un adreses, kas, atkal, vienkārši aprakstīt, kur atmiņu, atkāpjoties no īpaša sakodiens skaits, īpaši vērtību var atrast. Tik atceros pēdējo reizi, pārāk mēs turpinājām stāstu un paskatījās diezgan buggy programmu. Un šī programma ir buggy par maz iemeslu dēļ, bet visvairāk satraucoša viens ir jo tas neizdodas, lai pārbaudītu to, ko? Jā, tas neizdodas, lai pārbaudītu ievadi. Žēl? Ja tas ir vairāk nekā 12 rakstzīmes. Tik ļoti gudri, zvanot memcopy, kas, kā norāda nosaukums, vienkārši kopijas atmiņas no tās otro argumentu par savu pirmo argumentu. Trešais arguments, ļoti gudri, ir jāpārbauda, ​​lai pārliecinātos, ka jums nav kopēt vairāk nekā, šajā gadījumā, garumu no bāra, rakstzīmju skaitu, uz mērķa, kas ir šī masīvs C. Bet problēma ir tā, ka tas, ko ja C pats par sevi nav pietiekami liels rīkoties, ka? Jūs esat gatavojas kopēt skaitu baiti, ka jums ir dota. Bet ko jūs tiešām ir vairāk baiti, nekā jums ir telpa? Nu, šī programma ir ļoti muļķīgi vienkārši akli ieņēmumus, lai kāda tā ir ņemot vērā, sveiki slīpsvītru 0 ir lieliski, ja virkne ir īsa pietiekami, piemēram, pieci simboli. Bet, ja tas ir faktiski 12 rakstzīmēm vai 1200 rakstu zīmes, mēs redzējām pēdējo reizi ka jūs tikai gatavojas pilnībā pārrakstīt atmiņu, nepieder jums. Un sliktākajā gadījumā, ja jūs pārrakstīt, ka sarkanā daļa tur, ka mēs saucām atpakaļ adresi - tas ir tikai, ja dators automātiski, lai jūs, aiz ainas, tucks prom 32 bitu vērtība, kas atgādina to, ko adresi vajadzētu atgriezties, kad foo, tas citas funkcijas, tiek darīts izpildes. Tas ir maizes druskas par veidu uz kura tas atgriež. Ja jūs pārrakstīt, ka, iespējams, ja tu esi slikts puisis, iespējams, varētu iespējams pārņemt kāds dators. Un jūs visvairāk noteikti crash to vairumā gadījumu. Tagad šī problēma bija tikai saasināja kā mēs sākām runāt par atmiņu pārvaldību kopumā. Un malloc, atmiņas sadali, ir funkcija, ka mēs varam izmantot, lai sadalītu atmiņas, kad mēs nezinām iepriekš ka mēs varētu nepieciešama zināma. Tātad, piemēram, ja es iet atpakaļ pie ierīces šeit. Un es atvērt no pagājušā laika hello2.c, atceros šo programmu šeit, kas izskatījās mazliet kaut kas līdzīgs šim, tikai trīs līnijas - norādiet savu vārdu, tad virkne vārdu, Kreisajā pusē ir vienāds getstring. Un tad mēs to izdrukāt, lietotāja vārds. Tātad tas bija super vienkārša programma. Lai būtu skaidrs, ļaujiet man iet uz priekšu un padarīt sveiki-2. Es esmu gatavojas darīt, dot slīpsvītru sveiki-2. Norādiet savu vārdu - Deivids. Enter. Sveiki David. Tas, šķiet, darbojas OK. Bet to, kas īsti notiek zem pārsega šeit? Vispirms pieņemsim mizu atpakaļ dažiem slāņiem. String ir tikai sinonīms mēs esam saprata, par ko? Char zvaigzne. Tātad, pieņemsim padarīt to nedaudz vairāk mistiskā bet vairāk tehniski pareizi, ka šis ir char zvaigzne, kas nozīmē, ka nosaukums, jā, ir mainīgs. Bet ko vārds veikali ir adrese char, kas jūtas mazliet dīvaini tāpēc, ka es saņemu atpakaļ virkni. Es saņemu atpakaļ vairākiem simboli nav char. Bet, protams, jums ir nepieciešams tikai pirmais CHAR adrese atcerēties, kur Visa virkne ir tāpēc, kāpēc? Kā jūs saprast, kur beigas string ir zināt sākums? Slīpsvītru nulle. Tātad ar šīm divām versijām jūs izrēķināt Pirms sākumā un beigās jebkurš string ir, tik ilgi, kamēr viņi pareizi noformēts ar šo Null terminatora, kas slīpsvītra nulle. Bet tas zvana getstring. Un izrādās, ka getstring visu šo laiku ir bijusi sava veida krāpšanos mums. Tas ir bijis darot šo darbu, lai pārliecinātos, iegūt virkni no lietotāja. Bet kur ir, ka atmiņa ir nāk no? Ja mēs ejam atpakaļ uz attēlu šeit un piemēro definīciju no tikai pirms brīža, ka kaudze ir, ja atmiņas iet, kad funkcijas sauc, pēc šīs loģikas, kad jūs zvanu getstring, un pēc tam es veids D-A-V-I-D Enter, kur ir D-A-V-I-D slīpsvītru nulles saglabāti, pamatojoties uz Stāsts mēs esam pastāstīja tālu? Tas, šķiet, ir kaudze, vai ne? Kad jūs zvanu saņemt string jūs saņemsiet maz šķēle atmiņas par kaudze. Tātad, tas saprotams, ka D-A-V-I-D slīpsvītru nulle tiek glabāti tur kaudze. Bet pagaidiet minūti, getstring peļņu ka virkne, tā sakot, tas nozīmē, tas ir paplāti no kafejnīcai ir pacēlies kaudzīti. Un mēs teikt pēdējo reizi, ka, tiklīdz funkcija atgriež, un jūs pieņemt, ka paplātes, tā sakot, pie skursteņa, kas Jūs varat pieņemt, par to paliekas ka atmiņa? Es veida redrew tos kā jautājuma zīmes tāpēc, ka viņi faktiski kļūtu nezināms vērtības. Tos var izmantot atkārtoti, kad daži Nākamais funkciju sauc. Citiem vārdiem sakot, ja mums notiktu , lai uzglabātu - Es izdarīt ātru attēlu Šeit no skursteņa. Ja mēs gadās būt zīmējums apakšā no manas atmiņas segmentā, un mēs teikt ka šī ir vieta atmiņas aizņem galvenais un varbūt ARG c un ARG v un kaut kas cits šajā programmā, kad getstring sauc, iespējams getstring izpaužas rieciens atmiņas šeit. Un tad D-A-V-I-D kaut kā nonāk šo funkciju. Un es esmu gatavojas pārspīlēju. Bet pieņemsim, ka tā D-A-V-I-D slīpsvītru nulle. Tik tas daudz baiti tiek izmantotas rāmis getstring. Bet, tiklīdz getstring atdevi, mēs teica pēdējo reizi, ka šī atmiņa vairāk šeit viss kļūst - woops! - viss kļūst efektīvi izdzēsti. Un mēs varam domāt par to tagad, jo jautājums zīmes, jo, kas zina kas notiek, lai kļūtu par šīs atmiņas. Patiešām, es ļoti bieži zvana funkcijas cits nekā getstring. Un, tiklīdz es aicinu kādu citu funkcija nekā getstring, varbūt ne Šī konkrētā programma, mēs vienkārši skatījās at, bet kādā citā, protams, daži citi funkcija, iespējams, galu galā ir dota Šis nākamais vietas kaudze. Tātad tas nevar būt, ka getstring veikalos D-A-V-I-D uz skursteņa jo es būtu uzreiz zaudēs piekļuvi tai. Bet mēs zinām, tie getstring tikai atgriež ko? Tas nav atgriešanās man sešas rakstzīmes. Kas tā patiesi atgriežas nebija mēs secinām, pēdējo reizi? Adrese no pirmā. Tātad kaut kā, kad jūs sauc getstring, tas ir piešķirot rieciens atmiņā virkne, kas lietotājiem tips un tad atgriežoties adresi no tā. Un izrādās, ka, ja jūs vēlaties, lai funkcija piešķirt atmiņu šajā veids un atgriešanās, lai personai, kas aicināja kas darbojas, adrese ka rieciens atmiņas, jūs absolūti nevar likt to kaudze pie apakšas, jo funkcionāli tas ir tikai gatavojas nekļūst jums ļoti ātri, lai jūs varat droši uzminēt, kur mēs, iespējams, gatavojas mētāt to vietā, tā saukto kaudzes. Tā starp apakšā atmiņas s izkārtojumu un par savu atmiņu top izkārtojums ir visai ķekars segmentos. Viens no tiem ir kaudze, un pa labi virs tā ir kaudze. Un kaudze ir tikai atšķirīgs rieciens atmiņa, kas ir neizmanto funkcijas kad viņi sauc. To lieto, lai ilgtermiņa atmiņu, kad Jūs vēlaties, viena funkcija, lai greifers daži atmiņu un varēs jābalstās uz to nezaudējot kontroli pār to. Tagad jūs, iespējams, varētu nekavējoties redzēt, ka tas nav vienmēr perfektu dizainu. Kā jūsu programma piešķirti atmiņas par kaudze, vai kā jūs saucat vairāk un vairāk funkcijas, vai kā jūs piešķirt Atmiņas par kaudze ar malloc pie kā getstring dara, ko skaidri šķiet, ir neizbēgama problēma? Labi. Tāpat kā to, ka šīs bultas ir vērsti viens pret otru nav bode arī. Un tiešām, mēs varētu ļoti ātri crash programmas jebkurā vairākos veidos. Patiesībā, es domāju, ka mēs varētu būt izdarīts nejauši vienreiz. Vai arī, ja ne, pieņemsim to darīt apzināti tagad. Ļaujiet man iet uz priekšu un rakstīt super ātri programmu, ko sauc dontdothis.c. Un tagad es iešu šeit un Vai asas ietver stdio.h. Pieņemsim atzīt funkcija foo notiek nekādus argumentus, kas ir apzīmē kā arī ar spēkā neesošu. Un vienīgā lieta, foo gatavojas darīt, ir zvanu foo, kas, iespējams, nav gudrākais ideja, bet lai nu tā būtu. Ent galvenais spēkā neesošu. Tagad vienīgā lieta, galvenais ir iet to darīt, ir zvanīt foo kā arī. Un tikai sākas, es iešu uz priekšu šeit un teikt printf "Hello from foo. " Labi. Tātad, ja man nav nekādas kļūdas, Padarīt dontdothis dot slīpsvītru. Un darīsim to lielākā logā - dot slīpsvītra, dontdothis. Come on. Uh oh. Acīmredzot, jūs varat darīt to. Damn it. Labi. Pagaidiet. Gaidīšanas. Vai mēs - Mums bija izmantot to ar Marka. [Nopūšas] Es zinu, bet es domāju, ka mēs tikko izdzēsa to. Uh, jā. Damn it. Atrisināt šo Rob. Kas ir? Tas ir ļoti vienkārši. Jā, mēs vērsāmies optimizāciju off. Labi, stāvēt bye. Tagad es jūtos labāk. Labi. Labi. Tātad, pieņemsim kompilējiet šo - Padarīt Jūs dontdothis. Jums varētu būt pārdēvēt to dothis.c tikai brīdi. Tur mēs ejam. Paldies. Labi. Tāpēc, ka man bija drukāšanas kaut kas bija faktiski tikai palēnina procesu, ar kuru mēs būtu sasniedzis šo jautājumu. Labi. Phew! Tātad, kas patiesībā notiek? Iemesls tur, tāpat kā malā, ir darīt kaut ko attiecībā uz ieguldījumu un izeja mēdz būt lēnāka, jo jūs ir rakstīt rakstzīmes ekrāns, tas ir, lai ritinātu. Tik garš stāsts īss, bija es patiesībā notika tik nepacietīgs, mums būtu redzējis šo gala rezultātu, kā arī. Tagad, ka es saņēmu braukt no drukas-ups, mēs redzam to uzreiz. Tātad, kāpēc tas notiek. Nu, vienkāršs izskaidrojums, protams, ir tas, ka foo, iespējams, nebūtu aicinās pati. Tagad kopumā, tas ir rekursija. Un mēs domājam, ka pāris nedēļas Pirms rekursīvs ir labs. Rekursijas tas ir maģisks veids izsakot sevi super kodolīgi. Un tas tikai darbi. Bet tur ir galvenais no visiem rekursīvas programmas, mēs esam runājuši par un paskatījās līdz šim, kas bija tas, ka viņi bija, ko? Bāzes scenārijs, kas bija dažas grūti kodētu gadījums, kas teica, dažās situācijās nesaucu foo, kas ir skaidri nav tāds gadījums. Tātad, kas patiesībā notiek saistībā ar šo attēlu? Nu, kad galvenais aicina foo, tas izpaužas šķēle atmiņas. Kad foo aicina foo, tas izpaužas šķēle atmiņas. Kad foo aicina foo, tā kļūst šķēli. Tas izpaužas šķēli. Tas izpaužas šķēli. Tāpēc, ka foo nekad atgriezties. Mēs nekad dzēstu vienu no tiem kadri no skursteņa. Tāpēc mēs esam pūš caur kaudzes, ne minēt, kurš zina, kāds cits, un mēs nepārkāpjot robežas mūsu tā saukta par segmenta atmiņas. Kļūda iet segmentācija nepatiesa. Tā šķīdums ir acīmredzami nav darīt. Bet lielāks secinājums ir tas, ka, jā, ir absolūti zināma robeža, pat tad, ja tas nav labi definēts, par to, kā daudzas funkcijas, jūs varat zvanīt Programma, cik reizes funkcija var zvanīt sevi. Tātad, pat ja mēs sludinām rekursija kā šīs potenciāli burvju lieta pāris nedēļas atpakaļ par sigma funkciju, un, kad mēs saņemt datus struktūras un CS50, jūs redzēsiet otru pieteikumus par to, tas nav vienmēr labākā lieta. Jo, ja funkcija sauc sevi, sauc sevi, pat ja tur ir bāze gadījumā, ja jums nav hit, ka pamata lietu uz 1000 zvaniem vai 10000 zvaniem, ko ka reizi, kad jūs varētu būt beigušies istabas par savu tā saukto kaudze un nospiediet daži citi segmenti atmiņas. Tātad, tas arī ir dizaina kompromiss starp eleganci un starp robustumu jūsu īpaši īstenošanu. Tātad tur ir vēl viens negatīvie vai vēl viens gotcha to, ko mēs esam darījis līdz šim. Kad es piezvanīju getstring - ļaujiet man iet atpakaļ sveiki-2. Ievērojiet, ka es esmu aicinot getstring, kas atgriežas adresi. Un mēs apgalvo, ka šodien adrese ir no kaudzes. Un tagad es esmu izdrukāt stīgu šajā adresē. Bet mēs nekad sauc pretējs getstring. Mums nekad nav bijis calll funkciju, piemēram, ungetstring, kur roku atpakaļ ka atmiņas. Bet, atklāti sakot, mēs, iespējams, būtu bijis. Jo, ja mēs turpinām lūdzot datoru atmiņu, pēc kā kāds, piemēram, getstring bet nekad dot to atpakaļ, protams, ka pārāk ir varētu izraisīt problēmas, ar ko mēs palaist no atmiņas. Un patiesībā, mēs varam meklēt šos problēmas ar jauno instrumentu, kuru izmantošana ir nedaudz noslēpumains rakstīt. Bet ļaujiet man iet uz priekšu un splash to uz augšu uz ekrāna tikai brīdi. Es iešu uz priekšu un palaist Valgrind ar parametru, kuru pirmā komanda līnija arguments ir vārds Minētās programmas sveiki-2. Un diemžēl tas ir produkcija ir atrociously kompleksa nesaprotamu iemeslu dēļ. Tātad mēs redzam visu šo putru. Deivids ir jānorāda manu vārdu. Tātad, tas ir programma faktiski darbojas. Un tagad mēs šo produkciju. Tātad Valgrind ir līdzīgs garā uz gdb. Tas nav atkļūdotājs par sevi. Bet tas ir atmiņas pārbaudītājs. Tā ir programma, kas darbosies jūsu programma, un pateiks, ja jūs lūdza atmiņu datoru un nekad pasniedza to muguras, tādējādi nozīmē, ka jums ir atmiņas noplūde. Un atmiņas noplūdes mēdz būt slikti. Un jums ir lietotāji datoru ir iespējams, uzskatīja, ka tas, vai jums ir Mac vai PC. Vai esat kādreiz izmanto datoru bet nevis rebooted vairākos dienas, vai arī jūs esat tikko ieguvuši daudz programmas, kas darbojas, un nopelt lieta palēnina uz slīpēšanas apturēt vai vismaz tas ir super kaitinošas, lai izmantotu, jo viss atkal super lēns. Tagad, ka var būt jebkura vairāku iemeslu dēļ. Tas varētu būt bezgalīga cilpa, bug kāds kods, vai, vienkārši, tas varētu nozīmēt, ka jūs izmantojat vairāk atmiņu, vai mēģināt, nekā jūsu Dators patiesībā ir. Un varbūt tur ir kaut kādā programmā bug kas uztur lūdzot atmiņu. Pārlūkprogrammas gadiem ilgi bija pazīstami tas, prasot vairāk un vairāk atmiņas bet nekad nododot to atpakaļ. Protams, ja jums ir tikai ierobežots atmiņas apjoms, jūs nevarat prasīt bezgalīgi daudzas reizes dažus no šīs atmiņas. Un tā, ko jūs redzat šeit, lai gan atkal Valgrind izeja ir nevajadzīgi sarežģīta, lai skatienu pirmkārt, tas ir interesanti daļa. Kaudze - tiek izmantotas pie izejas. Tātad, šeit ir, cik daudz atmiņas bija izmanto no kaudzes pie laiks, mana programma izstājoties - acīmredzot seši baiti vienā blokā. Tāpēc es esmu gatavojas vilnis manas rokas par kādu bloks ir. Domāju, ka no tā ir tikai rieciens, vairāk tehniskā vārds rieciens. Bet seši baiti - kādi ir seši baiti, ka vēl izmanto? Tieši tā. D-A-V-I-D slīpsvītru nulle, pieci burts Vārds plus null terminators. Tātad šī programma Valgrind pamanīju, ka man lūdza sešus baiti, acīmredzot, ar veids getstring, bet nekad deva viņiem atpakaļ. Un patiesībā, tas varētu nebūt tik skaidrs, ja mana programma nav trīs līnijas, bet tas ir 300 līnijas. Tātad, mēs faktiski var sniegt citu komandu līnija arguments Valgrind uz padarītu to runīgs. Tas ir mazliet kaitinošas, lai atcerētos. Bet ja es daru - paskatīsimies. Noplūde - Tas bija noplūde - pat neatceros kas tas ir izslēgts rokām. - Noplūdes pārbaude vienāds pilna. Yep, paldies. - Noplūdes pārbaude vienāds pilna. Enter. Pati programma darbojas. Ierakstiet David vēlreiz. Tagad es redzu nedaudz sīkāk. Bet zem kaudzes kopsavilkumu, kas ir identisks četriem - ah, tas ir sava veida jauki. Tagad Valgrind ir faktiski meklē nedaudz grūtāk manā kodu. Un tas ir saprotams, ka, acīmredzot, malloc pie līnijas - mēs attālinātu. Pēc līnija - mēs neredzam, kas līnija tas ir. Bet malloc ir pirmais vaininieks. Tur ir malloc blog. Visas tiesības? Labi, nē. Labi? I sauc getstring. getstring acīmredzot aicina malloc. Tātad, kādi līnija kods ir acīmredzami vainojams, kam piešķirti šo atmiņu? Pieņemsim, ka tas, kurš rakstīja malloc ir aptuveni pietiekami ilgi, ka tas ir nav viņu vaina. Tātad, tas ir iespējams, mans. getstring in cs50.c - tā, ka failu kaut kur uz datora - rindā 286, šķiet, ir vaininieks. Tagad pieņemsim, ka CS50 ir ap pienācīgu laiku, tāpēc Mums arī ir nekļūdīgs. Un tā tas droši vien nav getstring ka bug slēpjas, bet gan sveiki-2.c līnija 18. Tātad, pieņemsim to apskatīt kas tas līnija 18 bija. Oh. Kaut kā šī līnija ne vienmēr bagijs, per se, bet tas ir iemesls Aiz šīs atmiņas noplūde. Tātad super vienkārši, kādi būtu intuitīvi būt risinājums šeit? Ja mēs prasām atmiņu, nekad dodot atpakaļ, un tas, šķiet, ir problēma, jo laika gaitā mana datora var pietrūkt atmiņas, var palēnināt leju, sliktas lietas var notikt, labi, kāda ir vienkārša intuitīva risinājums? Tikai dot to atpakaļ. Kā jūs atbrīvotu šo atmiņu? Nu, par laimi tas ir diezgan vienkārši tikai pateikt brīvu vārdu. Un mēs nekad neesmu izdarījusi agrāk. Bet jūs varat būtībā iedomāties bezmaksas kā pretstatu malloc. bez ir pretējs piešķirot atmiņu. Tātad, tagad ļaujiet man recompile to. Padarīt HELLO-2. Ļaujiet man palaist to no jauna. sveiki-2 David. Tātad, tas, šķiet, strādāt tieši tādā pašā veidā. Bet, ja es dodos atpakaļ uz Valgrind un atkārtoti palaist ka pati komanda par manu nesen apkopota programma, ierakstot Manā Vārdā, kā iepriekš - jauki. Kaudze kopsavilkums - tiek izmantotas pie izejas - nulles baiti nulles blokiem. Un tas ir super jauki, visi kaudze bloki tika atbrīvotas. Nav noplūde ir iespējama. Tātad nāk uz augšu, nevis ar Problem Set 4, bet ar Problem Set 5, Kriminālistikas un tālāk, tas arī kļūs pasākums pareizību jūsu programmas, vai jums ir vai nav vai nav atmiņas noplūdes. Bet par laimi, ne tikai jūs varat pamatojusi caur tiem intuitīvi, kas ir, varbūt, viegli maziem programmām bet grūtāk lielākām programmām, Valgrind, tām lielākām programmām, var palīdzēt jums noteikt Īpaša problēma. Bet tur ir viena cita problēma , kas varētu rasties. Ļaujiet man atvērt šo failu šeit, kas ir, atkal nedaudz vienkāršs piemērs. Bet pieņemsim koncentrēties uz to, ko šī programma nav. To sauc memory.c. Mēs post to vēlāk šodien zip no šodienas pirmkodu. Un ievēroju, ka man ir tā saucamā funkcija f kas ņem nekādus argumentus un atgriež neko. 20 rindā, es esmu acīmredzot atzīst rādītājs uz int, un aicinot to x. Es esmu piešķiršanu, ir atgriešanās vērtība malloc. Un tikai, lai būtu skaidrs, cik daudz baitu am Es, iespējams saņemt atpakaļ no malloc šajā situāciju? Droši vien 40. Ja jūs saņemsiet, ka no? Nu, ja jūs atceraties, ka int bieži 4 bytes, vismaz tas ir ierīce, 10 reizes 4 ir acīmredzami 40. Tātad malloc atgriežas adresi no no atmiņas gabals un glabāšanai, kas novērstu galu galā ar x. Tātad, lai būtu skaidrs, kādi tad notiek? Nu, ļaujiet man pāriet atpakaļ mūsu attēlu šeit. Ļaujiet man ne tikai izdarīt apakšas mana datora atmiņas, ļaujiet man iet uz priekšu un izdarīt visu taisnstūri, pārstāv visu manu RAM. Mēs sakām, ka kaudze ir uz leju. Un tur ir teksts segmentā par neinicializētām dati. Bet es esmu tikai gatavojas abstrakti tiem citas lietas prom, kā dot, dot dot. Es esmu tikai gatavojas, lai atsauktos uz šo kā kaudzes augšpusē. Un pēc tam apakšā šo attēlu, pārstāvēt galvenais, es esmu gatavojas lai dotu tai šķēles atmiņu uz skursteņa. Attiecībā uz f, es esmu gatavojas sniegt tai šķēle atmiņas uz skursteņa. Tagad, es saņēmu konsultēties ar maniem pirmkods vēlreiz. Kādi ir vietējās mainīgie galvenais? Acīmredzot nekas, lai šķēle ir faktiski tukša vai pat nav tik liels kā es esmu sastādīts to. Bet f, man ir vietējās mainīgo, , kas tiek saukts x. Tāpēc es esmu gatavojas iet uz priekšu un dot f rieciens atmiņas, aicinot to x. Un tagad malloc 10 reizes 4, Tātad 40 malloc, kur ir arī, ka atmiņā nāk no? Mēs esam ne izķidātas attēlu kā šis iepriekš. Bet pieņemsim, ka tas ir efektīvi nāk no šejienes, tāpēc viens, divi, trīs, četru, piecu. Un tagad man ir nepieciešams 40 no tām. Tāpēc es ņemšu tikai do dot, dot, dot ieteikt ka tur ir vēl vairāk atmiņas atgriežoties no kaudzes. Tagad to, kas ir adrese? Pieņemsim izvēlēties mūsu patvaļīgi jārisina kā vienmēr - Ox123, pat ja tas ir iespējams, gatavojas ir kaut kas pilnīgi atšķirīgs. Tas ir adrese pirmais baits atmiņa, kas es esmu jautā malloc par. Tātad, īsi sakot, vienu reizi līniju 20 izpilda, kas ir burtiski uzglabā iekšpusē no x šeit? Ox123. Ox123. Un Vērsis ir neinteresanti. Tas tikai nozīmē, šeit heksadecimālo numuru. Bet kas ir galvenais ir tas, ka tas, ko es esmu veikalā in x, kas ir vietējā mainīgs. Bet tā datu tips, atkal, ir adrese int. Nu, es esmu gatavojas glabāt Ox123. Bet atkal, ja tas ir pārāk sarežģīti nevajadzīgi, ja es ritiniet atpakaļ, mēs varam abstrakti šo prom pavisam saprātīgi un tikai teikt, ka x ir rādītāju uz šo rieciens atmiņas. Labi. Tagad jautājums pie rokas ir šādas - līnija 21, izrādās, ir buggy. Kāpēc? Žēl? Tā nav - teikt, ka vēlreiz. Nu, tas nav bezmaksas. Tātad, tas ir otrais, bet. Tātad tur ir viens cits, bet īpaši pie 21 līnijas. Tieši tā. Šī vienkāršā līnija kods ir tikai bufera pārpildes, bufera pārsniegšanu. Buferis nozīmē tikai rieciens atmiņas. Bet atmiņas rieciens ir lielums 10, 10 veseli skaitļi, kas nozīmē, ja mēs indekss tajā izmantojot sintaktisko cukura masīva apzīmējums, kvadrātveida kronšteini, jums ir piekļuve x kronšteins 0 x kronšteins 1 x, kronšteins dot, dot, dot. x 9 grupa ir lielākais. Tātad, ja man x kronšteinu 10, kur Es esmu faktiski gatavojas atmiņā? Nu, ja man ir 10 int - pieņemsim faktiski izdarīt visu Šo šeit. Tā, ka bija pirmie pieci. Lūk, piecas citas Ints. Tātad x skava 0 ir šeit. x 1 kronšteins ir šeit. x 9 kronšteins ir šeit. x kronšteins 10 ir šeit, kas nozīmē, es runāju, 21 līnija, dators likt numurs, ja? Skaitlis 0, ja? Nu, tas ir 0, jā. Bet tikai to, ka tā 0 ir sava veida sakritība. Tas varētu būt skaitlis 50, jo visi mēs rūpējamies. Bet mēs cenšamies likt to x grupā 10, kas ir, ja tas jautājuma zīme ir sastādīts, kas nav laba lieta. Šī programma varētu ļoti labi crash, kā rezultātā. Tagad, iesim uz priekšu un redzēt, ja tas ir, protams, to, kas notiek. Padarīt atmiņu, jo fails sauc memory.c. Iesim uz priekšu un palaist programmas atmiņas. Tāpēc mēs palaimējies, patiesībā, šķiet. Mums ir palaimējies. Bet pieņemsim redzēt, ja mēs tagad palaist Valgrind. No pirmā acu uzmetiena, mana programma varētu , šķiet, ir pilnīgi pareizs. Bet ļaujiet man palaist Valgrind ar - Noplūdes pārbaude vienāds pilnā atmiņā. Un tagad, kad es palaist šo - interesanti. Nederīga rakstīt 4 lielumam gada memory.c 21 līnijas. Gada memory.c 21 līnija ir kas viens? Ak, interesanti. Bet pagaidiet. Izmērs 4, kas ir tas, ka atsaucoties uz? Es tikai nebija viens rakstīt, bet tas ir 4 izmēru. Kāpēc tas ir 4? Tas ir tāpēc, ka tas ir int, kas ir, atkal, četri baiti. Tātad Valgrind atradis kļūdu, ka es, glancing manu kodu, nebija. Un varbūt jūsu TF būtu vai nebūtu. Ko Bet Valgrind pārliecināts konstatēts, ka mēs esam kļūdījies tur pat lai gan mēs palaimējies, un dators nolēma, eh, es neesmu gatavojas crash tikai tāpēc, ka jūs pieskārās vienu baitu, viena INT vērtīgās atmiņas, kas jums nav faktiski pašu. Nu, ko vēl ir buggy šeit. Adrese - tas ir traks meklē adrese heksadecimālā. Tas tikai nozīmē, kaut kur kaudze ir nulles baiti pēc bloka 40 izmēra tiek piešķirti. Ļaujiet man tālināt šeit un redzēt, ja tas ir nedaudz vairāk noderīgi. Interesanti. 40 baiti ir galīgi zaudējis ar zaudējumu ierakstu 1 1. Atkal, vairāk vārdu nekā ir noderīgs šeit. Bet, pamatojoties uz no galvenajām līnijām, ja man būtu iespējams koncentrēt manu uzmanība citu bug? Izskatās līnija 20 no memory.c. Tātad, ja mēs ejam atpakaļ uz 20 līnija, kas ir viens, ka jūs noteikti agrāk. Un tas ne vienmēr buggy. Bet mēs esam tas mainīja savu ietekmi. Tātad, kā es varu labot vismaz viena no šīm kļūdām? Ko es varēju darīt pēc tam, kad 21 rindā? Es varētu darīt bez x, tāpēc ir atdot šo atmiņu. Un kā es varu noteikt šo kļūdu? Es noteikti vajadzētu doties ne tālāk par 0. Tātad, ļaujiet man mēģināt un vēlreiz palaist šo. Atvainojiet, noteikti dodieties ne tālāk par 9. Padarīt atmiņu. Ļaujiet man atkārto Valgrind ar lielāku logā. Un tagad izskatās. Nice. Visi kaudze bloki tika atbrīvotas. Nav noplūde ir iespējama. Un augšā šeit, tur nav pieminēts vairāk par nederīgu labi. Tikai, lai iegūtu mantkārīgs, un pieņemsim redzēt, ja vēl viens apliecinājums nav iet, kā paredzēts - I did get lucky pirms brīža. Un to, ka tas ir 0, ir iespējams nevajadzīgi maldinoša. Darīsim 50, nedaudz patvaļīgu skaits, marka atmiņas dot slash atmiņa - vēl saņemt laimīgs. Nekas ir crashing. Pieņemsim, ka es vienkārši darīt kaut ko patiešām muļķīgi, un man 100. Ļaujiet man pārtaisīt atmiņu, punkts slash atmiņa - palaimējies vēlreiz. Kā par 1000? Ints ārpus, aptuveni, kur es būtu? Padarīt atmiņas - damn it. [Smiekli] Labi. Let 's nav putru ap vairs. Atkārto atmiņu. Tur mēs ejam. Labi. Tātad acīmredzot jums indekss 100000 Ints tālāk, kur jums ir bijis atmiņas, sliktas lietas notiek. Tātad tas, protams, nav grūti, ātri noteikums. Es biju veida, izmantojot izmēģinājuma un kļūdu tur nokļūt. Bet tas ir tāpēc, garš stāsts īss, datora atmiņa ir sadalīta uz šīm lietām sauc par segmentiem. Un dažreiz, dators faktiski jums ir devis nedaudz vairāk atmiņas nekā jūs lūdzat. Bet efektivitāti, tas ir tikai vieglāk iegūt vairāk atmiņas, bet tikai pateikt, ka jūs saņemat daļu no tā. Un, ja jums paveiksies reizēm, Tāpēc, jūs varētu pieskarties atmiņa, kas nepieder jums. Jums nav nekādas garantijas, ka kāda vērtība jūs varēsiet ievietot tur paliks tur, jo dators joprojām domā, ka tas nav Jūsu, bet tas ne vienmēr notiek hit citu segmentu atmiņā Datoru un izraisīt kļūda, piemēram, šo vienu šeit. Labi. Kādi jautājumi tad par atmiņu? Labi. Let 's to apskatīt šeit, tad, pēc kaut kas mēs esam, ņemot par piešķirta jau ilgu laiku, kas Tieši šajā failā ar nosaukumu cs50.h. Tātad tas ir fails. Šie ir tikai vesels bars no piezīmes up top. Un jūs, iespējams, ir aplūkot to, ja jūs poked apkārt uz ierīces. Bet izrādās, ka visu laiku, kad mēs, ko izmanto, lai izmantotu string kā sinonīms, līdzekļu palīdzību ir paziņots ka sinonīms bija ar šo atslēgvārds typedef, tipa definīciju. Un mēs esam būtībā sakot, izdarīt virknes sinonīmu char zvaigzne. Ka līdzekļi, ar kuriem kaudze izveidots šīs mācību riteņi pazīstams kā string. Tagad šeit ir tikai prototips par getchar. Mēs varētu būt redzējis to pirms, bet tas ir tiešām, ko tā dara. getchar neuzņemas nekādu argumentu, atgriež char. getdouble neuzņemas nekādu argumentu, atgriežas dubultā. getfloat notiek bez argumentiem, atgriežas peldēt, un tā tālāk. getint ir šeit. getlonglong ir šeit. Un getstring ir šeit. Un tas arī viss. Šis purpura līnija ir vēl viens apstrādātāju direktīva, jo hashtag sākumā tā. Labi. Tātad, tagad ļaujiet man iet cs50.c. Un mēs nerunāsim pārāk ilgi uz to. Bet, lai dotu jums ieskatu par to, kas ir nu jau tas viss laiku, ļaujiet man iet - pieņemsim do getchar. Tātad getchar lielākoties komentārus. Bet tas izskatās šādi. Tātad šis ir faktiskais funkcija getchar, ka mēs esam bijuši ņemot par pašsaprotamu pastāv. Un, pat ja mēs neesam izmantot šo vienu ka bieži vien, ja kādreiz, tas ir vismaz samērā vienkāršs. Tātad, tas ir vērts Ātri apskatīt šeit. Tātad getchar ir bezgalīgu cilpu, apzināti tā, acīmredzot. Tā, tad zvani - un tas ir sava veida jauka atkārtota koda mēs paši rakstīja. Tā aicina getstring. Jo tas, ko dara nozīmē, lai iegūtu char? Nu, jūs varētu arī mēģināt iegūt visa teksta rindiņa no lietotāja un tad tikai apskatīt vienu no šiem burtiem. 60 līnijas, šeit ir maz mazliet veselība pārbaudītu. Ja getstring atgriezās null, pieņemsim neturpinās. Kaut kas nogāja greizi. Tagad tas ir nedaudz kaitinošas, bet konvencionālos in C char max iespējams, atspoguļo to, kas tikko balstoties uz tās nosaukumu? Tas ir nemainīgs. Tas ir tāpat kā skaitlisku vērtību lielākais char jūs varat pārstāvēt ar viens sakodiens, kas, iespējams, ir numurs 255, kas ir lielākais skaits jums pārstāv astoņi biti, sākot no nulles. Tāpēc es esmu izmantot šo, jo šo funkciju, kad Rakstot šo kodu, tikai tāpēc, ka ja kaut kas noiet greizi getchar, bet tās mērķis dzīvē ir, lai atgrieztos char, jums ir nepieciešams, lai kaut kā jāspēj lai signalizētu lietotājam šo kaut kas nogāja greizi. Mēs nevaram atgriezties null. Izrādās, ka null ir rādītājs. Un atkal, getchar ir , lai atgrieztos char. Tātad konvencija, ja kaut kas noiet nepareizi, ir jums, programmētājs, vai Šajā gadījumā mani ar bibliotēku, man bija vienkārši izlemt, patvaļīgi, ja kaut kas noiet greizi, es esmu gatavojas atgriezties numuru 255, kas ir patiešām nozīmē, ka mēs nevaram, lietotājs nevar ierakstīt raksturu pārstāv numurs 255, jo mums bija nozagt kā tā saukto pastiprinātas vērtību rada problēmas. Tagad izrādās, ka raksturs 255 nav kaut kas jūs varat rakstīt uz tastatūras, tāpēc tas nav liels darījumu. Lietotājam nav paziņojums, ka Esmu nozagts šo raksturu. Bet, ja jūs kādreiz redzēt cilvēka lapās datorsistēma dažas atsauces uz visi vāciņi konstante, piemēram, tas, ka saka, gadījumos, kad kļūdas Šī konstante varētu jāatdod, tas ir viss, daži cilvēku darīja gadus atpakaļ bija patvaļīgi nolēma atgriezt šo īpašo vērtību un to sauc nemainīgs gadījumā kaut kas noiet greizi. Tagad burvju notiek šeit lejā. Pirmkārt, es esmu paziņojot 67 rindā divas rakstzīmes, C1 un C2. Un tad 68 rindā, tur tiešām līnija kodu, kas ir atgādina mūsu draugs printf, ņemot vērā, ka tā tas ir procenti Cs pēdiņās. , Bet paziņojums par to, kas notiek šeit. sscanf nozīmē string skenēšanu - nozīmē skenēšanas formāta string, ergo sscanf. Ko tas nozīmē? Tas nozīmē, ka jūs pāriet uz sscanf virkni. Un līnija ir neatkarīgi lietotājs veidiem iekšā Jūs pāriet uz sscanf kādu formāta virknes, piemēram, tas, ka stāsta scanf kādi ir Jūs cerot lietotājs ir drukāti collas Jūs tad iet-in no divām adresēm gabalos atmiņas, šajā gadījumā, jo man ir divas vietturus. Tāpēc es esmu gatavojas sniegt tai adresi no C1 un C2 adresi. Un atcerēties, ka jūs piešķirat funkciju adrese kādu mainīgo, kas ir Ietekme? Ko var, kas darbojas darīt, kā rezultātā gada piešķirot tam adresi mainīgs, jo atšķirībā no mainīgais pats? To var mainīt, vai ne? Ja jums bija kāds karti uz fizisku adresi, viņi var iet tur un darīt neatkarīgi viņi vēlas šajā adresē. Pati ideja šeit. Ja mēs pāriet sscanf, adrese divu gabalos atmiņas, pat tie mazi maz gabalos atmiņas, C1 un C2, taču mēs pateikt to adresi no tiem, sscanf var mainīt. Tātad sscanf ir mērķis dzīvē, ja mēs lasām cilvēks lapas, ir lasīt to, ko lietotājs drukāti, ceru, ka lietotājam, kam ierakstījāt raksturs, un varbūt cits raksturs, un neatkarīgi no lietotāju drukāti, pirmā rakstzīme iet Šeit, otrais raksturs iet šeit. Tagad, kā malā, tas, kā jūs to darītu tikai zinu to no dokumentācijas, tas, ka man tukšu vietu tur tikai nozīmē, ka man nav vienalga, ja lietotājs hits starpdevējs maz reizes, pirms viņš vai viņa uzskata raksturu, es esmu gatavojas ignorēt jebkurš atstarpēm. Tāpēc, ka es zinu no dokumentāciju. Tas, ka tur ir otrs% c seko atstarpēm faktiski apzināta. Es gribu, lai varētu noteikt, ja lietotājs ieskrūvē augšu vai nesadarbojās. Tāpēc es ceru, ka lietotājs tikai drukāti vienā raksturs, tāpēc es esmu cerot ka sscanf ir tikai gatavojas, lai atgrieztos vērtību 1, jo, atkal, ja es izlasīju dokumentācija, sscanf nolūks ir laiks ir, lai atgrieztos skaitu mainīgie, kas tika aizpildītas ar lietotāja ievadi. Es pieņemts diviem mainīgajiem adreses, C1 un C2. Es esmu cerot, lai gan, ka tikai viens no viņiem kļūst nogalināti, jo, ja sscanf atgriež 2, kādi ir iespējams Ietekme loģiski? Ka lietotājs nav tikai man vienam raksturs, piemēram, es teicu viņam vai viņai. Viņi, iespējams, drukāti pie vismaz divas rakstzīmes. Tātad, ja es tā vietā nebija otrais % C, man tikko bija viens, kas atklāti būtu intuitīvāks pieeju, es domāju, ka pirmo skatienu, jūs neesat gatavojas, lai varētu atklāt ja lietotājs ir devis jums vairāk ieeja, nekā jūs faktiski vēlējās. Tātad, tas ir netiešs veids ar kļūdu labošanas. , Bet paziņojums, ko es daru šeit. Pēc tam, kad es esmu pārliecināts, ka lietotājs iedeva man vienu raksturu, es atbrīvotu līniju, darot pretējs getstring, kas, savukārt, izmanto malloc, un tad es atpakaļ C1, raksturs, ka es cerēju lietotājs nesniedza un vienīgi tad, ja. Tik ātri glimpsed tikai, bet kādi jautājumi par getchar? Mēs būsim atpakaļ uz kādu no citiem. Nu, ļaujiet man iet uz priekšu un darīt to - pieņemsim, ka tagad, tikai, lai motivētu mūsu diskusija nedēļā plus laiks, šis ir failu ar nosaukumu structs.h. Un atkal, tas ir tikai garšu par kaut ko, kas atrodas priekšā. Bet paziņojums, ka daudz Šī ir komentāri. Tātad, ļaujiet man uzsvērt tikai Interesantākais tagad. typedef - tur ir tas pats atslēgvārds vēlreiz. typedef mēs izmantojam, lai paziņot virkni kā īpašu datu tipu. Jūs varat izmantot typedef, lai radītu pavisam jaunu datu tipi, kas nepastāvēja tad, kad C tika izgudrots. Piemēram, int nāk ar C. char nāk ar C. dubultā nāk ar C, bet tur nav students jēdziens. Un tomēr tas būtu diezgan lietderīgi būtu spēj uzrakstīt programmu, kas saglabā ar mainīgo, studenta ID numurs, savu vārdu, un viņu māja. Citiem vārdiem sakot, trīs gabalus datu, piemēram, int un stīgu un vēl virkne. Ar typedef, kas ir diezgan spēcīgs par šo un atslēgvārdu sturct par struktūru, jūs, programmētājs 2013, faktiski var noteikt savu datu tipi, ka nepastāvēja gadiem atpakaļ, bet kas atbilstu jūsu vajadzībām. Un tā šeit, 13 līnijas, kā 19, mēs esam atzīta par jaunu datu tipu, piemēram, int, bet aicinot to students. Un iekšpusē šī mainīgā lieluma gatavojas ir trīs lietas - int, stīgu, un stīgu. Tātad, jūs varat domāt par to, kas ir patiešām šeit notika, lai gan tas ir mazliet vienkāršošanu šodien, students būtībā notiek lai izskatās šādi. Tās būs rieciens atmiņa ar ID, nosaukums jomā, un mājas lauka. Un mēs varētu izmantot šīs gabalos atmiņu un piekļūt tiem šādi. Ja es iedziļināties struct0.c, šeit ir samērā ilgi, bet pēc modelis, kods, kas izmanto šo jauns triks. Tātad, pirmkārt, ļaujiet man pievērst jūsu uzmanību ar interesantām detaļām up top. Sharp definē studentus 3, deklarē pastāvīgu sauc studentiem un pilnvarotās tā patvaļīgi skaits 3, tikko tāpēc man ir trīs skolēnus, izmantojot Šī programma tagad. Šeit nāk Main. Un paziņojums, kā es varu paziņot masīvs studentiem? Nu, es tikai izmantot to pašu sintaksi. Vārds students ir acīmredzami jauna. Bet studentu, klases, grupas studentiem. Tātad diemžēl tur ir daudz atkārtotas izmantošanas noteikumu šeit. Tas ir tikai skaitlis. Tātad tas ir kā saka trīs. Klase ir tieši tas, ko es gribu lai izsauktu mainīgo. Es varētu saukt studentiem. Bet klase, tas ir ne klase objektorientētā Java veida veidā. Tas ir tikai klases skolēniem. Un datu tipu katram elementam šajā masīvā ir students. Tātad tas ir nedaudz atšķirīgs un no sakot, kaut ko kā šis, tas ir vienkārši - Es saku dod man trīs skolēniem un zvanu, ka masīva klasē. Labi. Tagad šeit ir četras cilpas. Šis puisis ir pazīstami - atkārtot no nulles līdz trim. Un šeit ir jauns gabals sintaksi. Programma ir gatavojas ātri man, cilvēku, lai dotu tai students ID, kas ir int. Un šeit ir sintakse, ar kuru jūs varat glabāt kaut ko ID lauku at vieta klasē kronšteins I. Tātad Šī sintakse nav nekas jauns. Tas tikai nozīmē, iedodiet man astotais students klasē. Bet tas simbols ir jauns. Līdz šim mēs esam nevaram izmantot, dot, vismaz kods, kā šis. Tas nozīmē iet uz struktūrai, ko sauc par students un nodot kaut ko tur. Līdzīgi, šajā nākamajā rindā, 31, iet priekšu un nodot neatkarīgi lietotājs par nosaukumu šeit, un to, ko viņi dara, lai māju, tas pats, iet uz priekšu un ielieciet to. mājā. Tātad, ko tas programma galu galā darīt? Jūs varat redzēt nelielu teaser tur. Ļaujiet man iet uz priekšu un darīt structs 0 dot slīpsvītra struktūrai 0, studenta ID 1, saka David Mather, students ID 2. Rob Kirkland, students ID 3. Lauren Leverit - un vienīgais, ko šī programma darīja, kas ir tikai pilnīgi patvaļīga, tiek Es gribēju kaut ko darīt ar šiem datiem, tagad, ka es esmu mācījis mums, kā izmantot structs, ir man tikko bija šis papildu cilpa šeit. Es atkārtot pār masīvs studentiem. Es izmantoti, mūsu, varbūt tagad pazīstams draugs, string salīdzināt, stircomp uz pārbaude ir 8 studenta māja vienāds ar Mather? Un ja tā, vienkārši izdrukāt kaut ko patvaļīgi, piemēram, jā, tā ir. Bet atkal, tikai dod man iespēju izmantot un atkārtoti, un atkārtoti šo jauno dot apzīmējumu. Tātad, kas rūpējas, vai ne? Nāk klajā ar studentu programmu, ir nedaudz patvaļīga, bet izrādās, ka mēs varam darīt noderīgas lietas ar šī, piemēram, kā šādi. Tas ir daudz sarežģītāks struktūrai C. To ieguva ducis vai vairākās jomās, nedaudz cryptically nosaukts. Bet, ja jūs esat kādreiz dzirdējuši par grafikas failu formātu sauc bitmap, BMP, tā Izrādās, ka bitmap failu formāts diezgan daudz, izskatās, ka tas. Tas ir muļķīgi mazliet Smiley sejas. Tas ir neliels attēls, es esmu pietuvināto uz diezgan liels, lai es varētu redzēt katru Individuālo punktiem vai pikseļiem. Tagad, izrādās, mēs varam pārstāvēt melns punkts ar, teiksim, uz numuru 0. Un balts punkts ar numuru 1. Tātad, citiem vārdiem sakot, ja jūs vēlaties, lai pievērstu Smiley sejas un saglabājiet šo attēlu dators, pietiek, lai uzglabātu nullēm un tie, kas izskatās kā šis, kad, atkal tie ir balti un nulles ir melna. Un kopā, ja jūs faktiski ir zoboties par vieninieku un nuļļu, jums ir režģis pikseļi, un, ja jūs noteikt tos ārā, jums ir gudrs maz Smiley sejas. Tagad, bitmap failu formātu, BMP, ir efektīvi, ka zem motora pārsega, bet ar vairāk pikseļu Sot, ka jūs faktiski var pārstāvēt krāsas. Bet, ja jums ir daudz sarežģītākas failu formātus, piemēram, BMP un JPEG un GIF , ar kuru jūs varētu būt pazīstami, tie failus uz diska, parasti ne tikai ir nullēm un tiem, attiecībā uz pikseļiem, bet tie ir daži metadati, kā arī - meta tādā ziņā, ka nav īsti datus, bet tas ir noderīgi, lai būtu. Tātad šie lauki te nozīmē, un mēs redzēsim šo sīkāk P-komplektā 5, ka pirms nullēm un tiem, kas pārstāv pikseļu attēlu, tur ir metadatu ķekars, piemēram no attēla izmēru un platums no attēla. Un paziņojums es esmu noplūkšanas off daži patvaļīgu lietas šeit - platums un augstums. Bitu skaits, un dažas citas lietas. Tātad tur ir dažas failā metadatiem. Bet saprast, kā faili tiek noteikti Šajā veidā, jūs faktiski var tad manipulēt attēlus, atgūt attēlus no diska, mainīt attēlus. Bet jūs varat ne vienmēr uzlabot tos. Man vajadzēja fotogrāfiju. Tāpēc es devos atpakaļ uz RJ šeit, kas redzējāt uz ekrāna diezgan kādu laiku atpakaļ. Un, ja es atvērtu Keynote šeit, tas ir kas notiek, ja jūs mēģināt, lai tuvinātu un uzlabot RJ. Viņš ir nesaņemu labāk tiešām. Tagad Keynote ir sava veida nojauc tā Mazliet, tikai spīdums pār Fakts, ka RJ nesaņem īpaši pastiprināta, ja jūs zoom in Un, ja darīt to šādā veidā, skatīt kvadrātu? Jā, jūs varat noteikti redzēt kvadrātu uz projektoru. Tas ir tas, ko jūs saņemsiet, kad jūs palielināt. Bet saprast, kā mūsu RJ vai Smiley sejas tiek īstenota ļaus mums faktiski rakstīt kodu, kas manipulē šīs lietas. Un es domāju, ka man beidzas šajā piezīmē, ar 55 sekundes uzlabotu tas, Es uzdrošinos, teiksim diezgan maldinošs. [VIDEO PLAYBACK] -Viņš guļ. Par ko, es nezinu. -Tātad, ko mēs zinām? -Tas at 09:15 Ray Santoya bija pie ATM. -Tātad jautājums ir tas, ko viņš dara pie 09:16? -Šaušana deviņu milimetru kaut ko. Varbūt viņš redzēja snaiperis. -Vai bija strādāt ar viņu. -Pagaidiet. Ej atpakaļ vienu. -Ko tu redzi? -Bring savu seju uz augšu, pilna ekrāna. -Viņa brilles. -Tur ir pārdomas. -Tas ir Neuvitas beisbola komanda. Tas ir viņu logo. -Un viņš runā ar kurš ir valkājot, ka jaka. [END VIDEO PLAYBACK] DAVID J. Malan: Tas būs būt problēma Set 5. Mēs redzēsim jūs nākamnedēļ. MALE SPEAKER: Nākamajā CS50. [Crickets chirping] [Mūzikas atskaņošanas]