Zvučnik 1: Pozdrav svima. Mi ćemo za početak. Mislim da su ljudi još uvijek ide da se filtriranje u. No, u interesu vremena, tako da možemo dobili ste dečki odavde na vrijeme, ćemo početi. Dakle, dobrodošli na CS50 Kviz 0 pregledu. Za one od vas koji nisu ostvarili ipak, imate pitanje u srijedu. Woo-hoo. Ako niste počela učiti još i nisu shvatili da postoji ovaj još, Proteklih kvizovi i sve informacije o Vaš kviz su na cs50.net/quizzes. Tu je neki prilično dobre stvari tamo, Proteklih kvizovi iz posljednja 10 godine, kao i informacije o O ovom kvizu i temama koji će biti pokriveni. Pa počnimo. Dakle, vi bi se mogao sjetiti, prvi Dan klase David je imao tih svjetala. Dakle, u suštini, sve što ide na pod napa od računala učinjeno u binarnom. Binarna znači ono što zvuči kao, 0-a i 1-a. Ima dvije vrijednosti koje mogu zastupati. Dakle, baš kao iu prvom dijelu dana kad se David okrenuo na svjetlo žarulja za zastupanje, ili 1, naše računalo razumije binarni kao 0-a i 1-a, ili isključiti. Osnove binarno. Svako mjesto je zastupljena u bazi dva. Tako ćete dodati 2 na 0 do 1 do 2 skroz gore. Za izračun što vaš binarno je decimale, samo slijedite ove jednadžbe tipa stvar. Ako imate 1 u bilo kojem od tih mjesta, vi to pomnožite god temeljiti je u, dodajte ga, i dobivate decimale. Dakle, to je kako računaš do 5 u binarnom. Baš kao što smo radili na Posljednji tobogan, to je način na koji će predstavlja 1 do 5. Slično tome, baš kao što možete dodati i oduzmite u decimale dno ili 10, ili stvarno bilo baza, na može dodati i oduzimanje u binarnom. Točno ono što se i očekuje kada dodajte dvije gore, ako je to jednako veće od 1, nosite 1, čine ga 0, i učiniti toga na taj način, samo kao što se i očekuje s redovitim decimalna ili neke druge baze. Cool. Dakle, kao što sam rekao prije, sve ono što ide na ispod haube našeg računala je učinjeno u 0-a i 1-a, ili binarno. Pa kako ćemo izraziti, primjerice, slova ili brojevi ili znakovi? A odgovor na to je ASCII. ASCII je mapiranje između likova da bi normalno vidjeti u Engleski jezik kao što je, B-a, C-a, naglašavaju, crtice i bilo što slično. I to karte koje se ASCII vrijednosti. ASCII vrijednost je samo broj koji može razumjeti vaše računalo. I baš kao što možete učiniti zbrajanje i oduzimanje s brojevima, to možete učiniti im ASCII vrijednostima. Dakle, u ovom primjeru, što će to isprintati? Da, pa samo prostor B prostor C prostora D. Gdje je moj miš ide? Obavijest možete definirati int na 65. I kad ispisujete da se pomoću posto C, to će protumačiti da je kao karakter te će ispisati A. Isto tako, možete proglasiti to je kao char. A kada ga ispisati pomoću posto C, to će protumačiti da je kao posto D. I baš kao što možete dodati broj, možete dodati likovi ASCII vrijednosti, u ovom slučaju. Dakle, malo pokazivač za svakoga. 5, u obliku niza, ne zapravo jednaka 5. Pa kako bismo mogli pretvoriti Niz 5 na cijeli broj 5? Bilo koji ideja? Da. Dakle, ako imamo 5 kao niz, možemo oduzeti 0. I to će nam dati 5. A na sličan način, ako imamo 5 kao cijeli broj, dodati da se na nizu 0. I to nam daje niz 5. Cool. Sada, sjećam natrag na predavanje onaj u kojemu razgovarali smo o algoritmima. Pa kako ćemo zapravo žele računalo raditi zanimljive stvari? Znate, samo zbrajanje i oduzimanje brojevi i tiskanje stvari nije kako uzbudljivo. Obično, želimo naše računalo na obavljaju neku vrstu algoritma. Nešto malo složeniji nego samo jednostavne aritmetike. Algoritam je samo korak po korak setu uputa za kako to izvesti izvjesno task-- Baš kao i recept. Možda ćete se sjetiti prvog dana klase u kojoj je David nas računati sobu ljudi i koliko ljudi bili su u sobi. Možda se koristi za brojanje jedan po jedan. 1, 2, 3, 4. U tom slučaju, linearno vrijeme algoritam. Ali je David uveo algoritam za vi brojati ljude u sobi gdje svatko ustaje, što reći vaš broj na drugu osobu, dodati da broj gore, a jedna osoba sjedi dolje. A ti to ponoviti. To je jedna vrsta algoritma. Možemo analizirati kako učinkovito An Algoritam se temelji na to pokrenuti vrijeme. Ali razgovarat ćemo malo više o tome kasnije. Dakle, svi algoritmi mogu također biti napisan u pseudocode. Pseudocode je samo engleski kao sintaksa koristi za zastupanje programski jezik. Na primjer, ako smo htjeli pitati korisnika pogoditi moj omiljeni broj, mi možda pseudocode kao takva. Nabavite korisnik pogoditi. Ako pretpostavka točna, recite im oni su točne, drugi im reći oni nisu točne. I pseudocode je način lako zastupa ideju ili algoritam. Dakle, sada smo možda želite zapravo pisati to na jeziku koji računalo Možda razumijevanje. Tako bismo mogli pisati našu pseudocode i tumače da je u izvornom kodu. Do sada, izvorni kod mora pridržavati određenoj sintaksi programski jezik. I do sada, u CS50, mi smo Koristim uglavnom c. Dakle, ovo bi moglo biti izvorni kod za c. Kasnije je u tijeku, te večeri došao u dodir s drugim programima jezici poput PHP. Ili, ako čak i poduzeti druge razrede, te moglo učiniti Java, Python, ili čak OCML. No, u našem C programskog jezika, to je Kako bismo mogli napisati izvorni kod za pseudocode algoritam koji Upravo sam opisao ranije. Pa kako se vaše računalo zapravo shvatiti? Kao što sam rekao prije, to je samo jako razumije nula i jedinica. Pa kako se to dobili od izvora Kod u nešto što može biti razumio? Pa, imamo nešto nazvao prevodilac. Ako se prisjetimo još u većini svoje psets, imali ste neku vrstu programa napisana u dot c datoteku. I onda će upisati napraviti. Dakle, ono što se da radite? Možete upisati make sastaviti svoj Program jer someone-- tko je napisao svoju p set; Vjerojatno David-- stvorio make datoteku. I to govori da je znati da se pokrenuti svoj prevodilac, zove jeka, koji će zatim sastaviti svoj izvorni kod za prigovoriti kod, koji je nula i jedinica da vaše računalo razumije. Ali malo kasnije, mi ćemo ići više u dubinu o prevodiocima. Dakle, sjećam pset 0, where-- da, Imate li pitanje? PUBLIKA: [nečujan]? Zvučnik 1: Da. Mislim da su oni zapravo trebao biti online. Da. PUBLIKA: Je li kao [nečujan]? Zvučnik 1: Nije. Su na cs50.net/quizzes. PUBLIKA: Slash kvizovi, Slash 2013, slash 0, i samo klikati kvizovi 2013 i kviz 0, pregledajte odjeljak slajdove. Zvučnik 1: Da, pa ako vi želite povucite ga prema gore i pogledati ga na vaš vlastito računalo, to je u redu previše. Opet reći. PUBLIKA: [nečujan]. Zvučnik 1: Da, [nečujan] je dummy varijabla. Oh, da? PUBLIKA: [nečujan]? Zvučnik 1: Ne, štrajkovi nisu na ispitu. Nažalost, njezin Pitanje je, je štrajkovi na ispitu. I to nije. Dakle pset 0, vi bi trebali imati sve provodi nešto pomoću ispočetka. A kako smo naučili neke osnovne programe građevni blokovi koriste nule. Tako ćemo pogledati neke od tih blokova za izgradnju koje čine program. Prvo je logički izraz. Boolean izraza su one i 0-a ili bilo čega što se dvije moguće vrijednosti. U tom slučaju, točno ili netočno, ili isključiti, a da ili ne. Primjer jednostavne, vrlo jednostavno, Program koji koristi Boolean Izraz se ovdje. Dakle, kako bi za Boolean izraza za biti korisno, imamo Boolean operatora. Subjekti koji su mogu koristiti usporediti s određenim vrijednostima. Dakle, imamo i ili ne odgovara, manje od ili jednak, veća od ili jednaka, i najmanje ili više od. Ali ti operateri nisu jako korisna osim ako ih možemo kombinirati u uvjeti. Dakle, vi bi se mogao sjetiti od nule i od svog p postavlja da mi imao uvjete. Oni su, u biti, kao što je vilica u Logika vašeg programa koji izvršava, ovisno o tome je li uvjet je zadovoljen. Tako je jedan od uvjeta koje smo imali koristi mnogo puta u ovom tečaju je ako je, drugo, ako je i drugo uvjete. Evo primjer kako možda koristiti. Da li netko zna razliku između samo pomoću ako izjavama sve putu prema dolje stihova, ako, drugo, ako, i drugo u kombinaciji? Da? PUBLIKA: [nečujan]. Zvučnik 1: Točno. Dakle, ako sam imao, ako do kraja ovog način, čak i ako se ovaj uvjet ne vrati Istina, ona će i dalje nastaviti testiranje sljedeća dva. Dok, s jedne drugo-ako se, na drugo izjavu, ako je jedan true ostali nisu testirani. Bilo kakva pitanja o tome? Cool. Dakle, koristite li-drugi od drugoga Izjava ako znate da je to moguće samo biti jedan od tih slučajeva. Dakle, mi znamo, ako je x manje od 0, to je definitivno neće biti veći od 0. Zatim, još jedna zgrada blok da smo naučili su petlje. Imamo tri vrste petlji. Za petlje, dok petlje, i to dok su petlje. I općenito, kad sjednete za napisati nešto, morate odlučiti koji je od njih trojice koji želite koristiti. Pa kako ćemo odlučiti što? Mi uglavnom koriste za petlju, ako znamo koliko puta želimo ponoviti kroz nešto ili koliko puta želimo obaviti zadatak. Mi koristimo dok petlje, ako nam treba neki Uvjet da bi bilo istinito da bi trčanje. I mi koristimo učiniti dok je vrlo sličan a, ali želimo da naša koda na barem jedan put. Dakle, učiniti dok god je u rade bit Uvijek pokrenuti barem jedan put. Budući da se, s vremena ga Ne mogu uopće rade, ako uvjet nije ispunjen. Bilo kakva pitanja s tim? Dakle struktura za petlje. Vi dečki ste svi vidjeli. Možete ga pokrene. Imate neku vrstu stanja. Tako, na primjer, mogli bismo inicijalizirati kao za i jednak je 0. da je manje od 10. A i ++. Vrlo jednostavno onaj koji smo učinili. Za while petlji, na sličan način, imate da imaju neku vrstu inicijalizacije, neka vrsta stanja, i neka vrsta nadogradnje. Tako možemo implementirati naše za petlje i kao while petlji koristeći ovaj. A na sličan način s učiniti dok petlje, bismo mogli imati neki inicijalizacije, izvršiti nešto, to ažurirati, a zatim provjerite stanje. Tako sada funkcionira. Mi smo stavili sve zajedno. Mi možda želite napisati neke vrste funkcije. Zajedničko djelovanje koje možda Vidio već je glavno. Glavna je funkcija. To je povratni tip, Int. Ona ima ime funkcije, glavni. I to ima argumente, argc i argv. Dakle, glavno je samo funkcija. Ostale funkcije možda ste koristili, printf-- printf je function-- GetInt, toupper. No, to se dogoditi da su provodi za nas neka vrsta knjižnica. Ako vi zapamtite uključujući to CS50.h knjižnica ili standardni I / O biblioteka. Da, pitanje? PUBLIKA: Je li glavni samo svojstvena c? To ne samo vrsta [nečujan]? Zvučnik 1: Pitanje je ako glavna je svojstvena c. I da, sve funkcije imaju glavnu ulogu. To je vrsta nužno za računala znati gdje početi trčanje kod. PUBLIKA: tako da ne bi [nečujan]? Zvučnik 1: Ne Bilo koja druga pitanja? Cool. Dakle, baš kao što možete koristiti funkciju koja je pisana za vas, također možete napisati svoju funkciju. Ova je funkcija da bi netko mogao napisao da se izračunati volumen od Q, na primjer. Postoji povratna tipa ovdje, u ovom slučaju Interesi, naše ime funkcija q i naše Popis parametara. I imajte na umu da morate pisati podatke tip parametra koji želite koristiti ili pak funkciju ne Znam kakav parametar trebao sam se prihvaća. Dakle, u ovom slučaju, želimo cijeli broj kao naš ulaz. Pa zašto bismo željeli koristiti funkcije? Prije svega, veliki za organizaciju. Oni pomažu razbiti svoj kod u organiziraniji komade i napravite je lakše čitati. Pojednostavljenje. To je dobro za dizajn. Kad čitaš dio koda a glavna funkcija je stvarno, jako dugo, to bi moglo biti teže Razlog o tome što se događa. Dakle, ako ste ga razbiti u funkcijama, to bi moglo biti lakše za čitanje. I ponovno-sposobnost. Ako imate komad koda koji je bio naziva ili pokrenuti više puta, umjesto prepisivanja taj kod 10 puta u glavnoj funkciji, možda ćete želite ga ponovno koristiti. I onda svaki put morati koristiti da dio koda, pozvati funkciju. Pa sad, ako se sjetimo natrag do nule, Također smo razgovarali o nekoliko koncepata, od kojih je navoja. Tema je koncept višestrukih sekvence koda izvršava u isto vrijeme. Pa se sjetim prvog dana, gdje je David imao ti dečki računati off broja ljudi u sobi. U biti, ono što se događa na je sve od vas bili su trčanje odvojene teme. A ti niti su došli zajedno dobiti nekakav odgovor. Slično tome, u nule, kada imate Višestruki duhovi, možda ćete imati mačku i psa. I oni će biti istodobno radi vlastite skripte. To je primjer navoja. I drugi koncept koji je bio uveden ispočetka bio događanja. A događaji su kada više dijelova Vaš kod međusobnu komunikaciju. U ispočetka, ovo je bio kada se koristi emitiranje kontrola i kada sam Primanje blokova. I također, u problem Set 4, vidjeli smo Malo događaja kao dobro. Vi dečki mogli imati koristi Gevent knjižnica. A tu je funkciju waitForClick u kojem ste čekali za korisnika da klikne. I vaš klik, u ovom slučaju, bilo bi događaja i čekati klik je vaše rukovatelj događaj. I također, tijekom prikazivati ​​svoje psets i radi na svojim psets, što možda su došli u kontakt s Neke od tih naredbi. To je ono što ste upisali u svoje Terminal prozor ili što god prozor koji se prikazuje na vašem g uređivanja, suštini, navigaciju vaše računalo. Tako, na primjer, navodi LS Sadržaj imenik. Napravite katalog stvara novu mapu. CD-a, promjena imenik. RM, ukloniti, izbrisati datoteke ili neki katalog. I onda skinite imenik uklanja imenik. PUBLIKA: [nečujan]? Zvučnik 1: Da, sigurno. Nažalost, pitanje je, ako vas sugeriraju stavljajući to na varati list. To bi moglo pomoći. Ako imate sobu, možete ga staviti na. To je također samo općenito dovoljno dobar zapamtiti, jer kada ga koristite možda želite samo ga napamet. To će učiniti vaš život mnogo lakše. Jesam li odgovoriti na vaše pitanje? Tako sada, razgovarali smo malo Ukratko o knjižnicama. No, dvije su glavne one koje smo već pomoću do sada u tijeku su standardni I / O i cs50. Kakve stvari su uključeni u standardnoj I / O knjižnici? Da, do sada smo koristiti printf. U cs50 smo koristiti GetInt i GetString. A tip podataka string se događa biti proglašen u ovoj cs50 knjižnici. Razgovarat ćemo malo više u dubinu o kako knjižnice rade i kako su komunicirati s ostatkom kodu. No, to su dva glavna one koje smo su došli u kontakt s do sada u Naravno. Vrste. To su dobro zapamtiti koliko svaka vrsta predstavlja ili kako mnogi bajtova svaka tipa requires-- Interesi, 4 bajta; char, 1 bajt. Float je 4 bajta. Što je dvaput? PUBLIKA: [nečujan]. Zvučnik 1: Da, tako plutaju ali udvostručiti veličinu. Što je dug? PUBLIKA: [nečujan]. Zvučnik 1: U redu. Što je dug? PUBLIKA: [nečujan]. Zvučnik 1: Da, dvostruko int. Da. PUBLIKA: [nečujan]. Zvučnik 1: Duga [nečujan]. A onda dugo dugo je dvostruko veći. PUBLIKA: Ne, ne. Dugo je samo int. To ovisi o arhitekturi prije [nečujan] INT imaju istu širinu. [Nečujan]. Zvučnik 1: Tako dugo i Int su isti. A onda dugo dugo je dvostruko int. Cool. A onda, što je posljednji tip? PUBLIKA: Pointer. Zvučnik 1: Da, pa smo naučili malo o pokazivače. I bez obzira što je pokazivač pokazujući to-- to bi mogao biti char zvijezda ili int star-- to je uvijek 4 bajta za pokazivača. Pitanja o tome? Da? PUBLIKA: [nečujan]? Zvučnik 1: Tako dugo i int su Isti u ovom cs50 uređaja. PUBLIKA: aparat potpuno zamjenjivi. Zvučnik 1: Da. Pa onda dugo dugo je dvostruko int. PUBLIKA: Ovo je 32-bitni? Zvučnik 1: 32 bita, da. PUBLIKE: Dakle [nečujan]? Zvučnik 1: Da, ako se to ne dogodi izrijekom reći, trebala preuzeti 32-bitni. PUBLIKA: To će reći nešto kao pretpostavku Arhitektura kao aparata. Za 64 bitni, samo stvari koje Promjena se čezne i pokazivače. Obojica [nečujan]. Zvučnik 1: Da? PUBLIKA: Pitanje. Dakle, na jednom od prakse kvizovima, ona pita o nepotpisane int. Pa kako bi to biti određena od int [nečujan]? Zvučnik 1: nepotpisani je i na 4 bajta. No, ono što je drugačije potpisao int i unsigned int? PUBLIKA: [nečujan]. Zvučnik 1: Točno. One mogu predstavljati negativne vrijednosti. Ali kako to učiniti? PUBLIKA: [nečujan]. Zvučnik 1: Da, to štedi 1 malo se predstavljaju znak. Potpisao je jedan bit da predstavlja znak. I nepotpisani samo je sve pozitivi. PUBLIKA: U redu. Dakle, vi kažete da je dvaput dvostruko veći od float? Zvučnik 1: Dvostruka je dva puta veličina float, da. PUBLIKA: Kako pokazivač da dugo dugo [nečujan]? Zvučnik 1: Dakle, pitanje je kako se pokazivač dugo long-- Kako je to samo četiri bajta kada dugo dok njegovi 8 bajtova. Dakle, ne zaboravite ono što je pokazivač, u biti, na vrlo bazne vrijednosti. PUBLIKA: [nečujan]. Zvučnik 1: Da, tako se kazaljka je samo mjesto memorije. Dakle, nije važno koliko prostora da kazaljka pokazuje da. To treba samo 4 bajta pratiti te memorijske lokacije. Bilo koja druga pitanja? Cool. Dakle, zadnje što imam je standardni izlaz. Trebali biste ih koristiti često dovoljno da se možete sjetiti. No, to je kada koristimo printf, na primjer. I mi imamo ove rezervirana mjesta koja pozvani format koda. Dakle posto c char, posto ja za int, i mi također može koristiti posto d. To je ista stvar. No, općenito, u CS50 smo pokušati iskoristiti posto ja. Posto F za plovak. Posto LD dugo dugo i posto a za niz. Slično tome, mi smo bili pomoću nekoliko od tih bijega sekvenci. Na primjer, kose crtice n za novu liniju. Ovo je samo za kad ste formatiranja Vaš kod za ispis f. Da? PUBLIKA: Što je posto d za? Zvučnik 1: Dakle pitanje je ono što je d posto za? Posto je d za ints. Posto, a D posto I su isti. PUBLIKA: Koja je razlika između Obrnuta kosa crta n i Obrnuta kosa crta r? Zvučnik 1: Dakle, pitanje je što je Razlika između zračnosti n i protuudar r? Mislim obrnute kose crte r je-- PUBLIKE: Dakle Obrnuta kosa crta r samo implicira vraća na početak linija bez zapravo ide na novu liniju. Dakle, ako ste ispisali kose crtice r a vi vratiti na početak retka onda ispisati više stvari, što prebrisati stvari koje je već na [Nečujan]. Budući da, n zapravo ide na novi linija i ide na [nečujan]. Zvučnik 1: Pa, bilo koja druga pitanja? U redu. Ja ću ga uručiti na Dan koji će se nastaviti. [Pljesak] DAN: Sve dešnjak. Dakle, ja ću govoriti o još jedan široki raspon ideja iz razreda koji su grubo predstavnik tjedan dva i Početak tjedna tri počevši od s lijevanje, što je samo način tretiranje vrijednosti određene vrste kao vrijednost od različitih vrsta. Dakle, možemo to učiniti sa broj znakova na ori-, ispliva na ints, a dugo čezne udvostručiti. Sve ove stvari se mogu koristiti kao načina liječenja neku brojčanu vrijednost minus char kao neki drugi numerička vrijednost. Dakle, postoje neki problemi s tim, od Dakako, koji dolazi kada baci stvari kao što isplivaju na ints. Dakle, to je malo čudno. Imamo plovak koji je 1.31. Mi to pomnožite 10.000. I onda smo ga ispisali kao int. Što to izlaz? 10.000 puta 1,31. Dakle, 13.000, je da gostu? PUBLIKA: Mislim da je 10.000. DAN: Pa ja sam to pomnoži sa 10.000 prije nego što sam ga casting. PUBLIKA: Oh. Ne bi tu bilo jedno 9 a neki 0 brojevi? DAN: Možda ima neke čudne znamenke. Pa dobro, to je 1,3 puta 10.000. Dakle, to je 13.000. A ovaj dodatni weird-- PUBLIKA: 13.100. DAN: 13.100. Hvala ti, Rob. A ovaj dodatni weirdness-- to 9,9-- je jednostavno zato što ovaj lijevanje završio zaokruživanje dolje gdje to ne bi trebao imati. Da. PUBLIKA: lijevanje događa nakon što bilo što drugo? DAN: Pa zato što imam to u tisku, da se ovaj množenje prije njega se ovaj casting. PUBLIKA: [nečujan]. DAN: Mislim da bi prvi baci, Da, što bi bilo 10.000. Bilo što drugo? Cool. Dakle, ovo je 13.099. Zašto se ovo dogodilo? Nepreciznost. Pluta nisu savršeni. Oni mogu predstavljati samo brojke na Određeni broj značajnih znamenki. Dakle, ako smo ispisali 8 SIG smokve na to float, dobili smo neku vrstu ružno izgleda broj. A to je zato što ne može točno 1.31 zastupati jednostavna Ovlasti dvoje u stroju. Tako da završi uzimajući najbliži Pretpostavljam, koji završava da malo nizak. Smisla? U redu. Sada, prebacili su drugačiji način radi uvjetne izjave u kojoj sve mi je stalo je jedna varijabla. Dakle, u ovom konkretnom primjeru, mi smo uzimajući broj od strane korisnika. I onda gledamo ono što je cijeli broj. Vjerojatno, to je broj između jedan i četiri. To je ono što smo tražili. Tako ćete napraviti prekidač za ime varijable. Onda ste postavili slučajeve moguće Vrijednosti bi to moglo biti. Dakle jednom slučaju, kažu da je niska. A onda razbiti izaći stanja prekidača tako ne ide. U sljedećem case-- tako slučaj dva i slučaj three-- Ako je to slučaj dvoje to samo spušta na Prva linija koda što smatra s slučaju, tri dok se ne vidi pauzu. Dakle, razlog što se slučaj jednog do samo ispisa niska je, jer sam imaju ovu pauzu ovdje. Ako sam, recimo, ignorirali ovu break-- ako sam bacio ovu breakaway-- to će ispisati niska, a onda bi se ispisati sredinu, a onda bi se slomiti. Dakle, pauze su važan dio od prebaciti uvjete i oni bi trebali biti tamo. O svim slučajevima koji nisu izričito navedeni upravljana od strane defaultu slučaj u prekidač i treba baciti. PUBLIKE: Dakle 1, 2, 3, i 4 biti n? DAN: Vrijednosti koje n može biti. Da. Da? PUBLIKE: Dakle, kada imate koji [nečujan]? DAN: Ti bi ispisati niska, a zatim to će ispisati sredini, a onda bi razbiti. PUBLIKA: Zašto bi se ispisati Srednji ako [nečujan]? DAN: Tako je sve pod slučaju Prije pauze spada pod. Dakle, slučaj je jedan ispisa je ispod slučaj jedan kao što je to slijedi ispis. Da? PUBLIKA: [nečujan]? DAN: Dakle, taj broj je samo određeni vrijednost koju ova varijabla može se, zar ne? Da li to smisla? Da. PUBLIKA: [nečujan]? DAN: Da, slučaj dvije će ispisati Srednji i onda slomiti. PUBLIKA: [nečujan]? DAN: Mislim da je bilo? Koje druge vrste podataka možete prijeći? PUBLIKA: Možete prebaciti preko bilo koje vrste podataka. No, to samo znači ništa više od broj znakova i ori- i takve stvari, jer je ako ste prespajanja pokazivač da zapravo ne smisla, prebacivanje preko opterećenja, ako ga još neka je li to učiniti, jer s pomičnim zarezom u preciznosti, ne bi stvarno želim to učiniti bilo kako. Dakle, prilično mnogo, samo ori- i znakova i takvim stvarima. DAN: Da, to je kad imate eksplicitno Vrijednosti koje znate, mislim, može biti da prekidač je zapravo korisna. Dobro? U redu. Opseg je raspon koji proglašena promjenjiva proširuje. Dakle, u ovom malom komad koda imam, to bi bilo puno pogrešaka. A razlog je sam proglasio ovu int I u okviru ove za petlje. I onda ja pokušavam uputama koje I izvan toga za opseg petlje. Tako je u osnovi, možete razmišljati o opsegu kao i bilo što da proglasi sa unutar skupa vitičastim zagradama samo postoji unutar tih vitičastim zagradama. A ako pokušate i koristiti tu varijablu izvan tih vitičastim zagradama, vi ćete dobiti greška iz prevodilac. Da? PUBLIKA: Pa ovo ne radi? DAN: To ne radi, da. Žice. Gudački char *. Oni su isti. Oni su samo primjeri koji znakova. A sve žice koje imate trebali završiti s obrnute kose crte nula, što je samo c konvencija. To se zove NULL terminatora. I NULL-- N kapital, kapital U, kapital L, kapitala ja-- nije isti kao NULL terminatora. To je kazaljka. To je znak. Oni su vrlo različita. Zapamti to. To će biti na kvizu, vjerojatno. Nisam vidio kviz. Da? PUBLIKE: Dakle NULL je, recimo, pokazivač? DAN: Da. PUBLIKA: Što znači [nečujan]? DAN: Ako je, kažu, malloc se zove kad vas nemaju dovoljno memorije da se bez obzira na veličinu ste tražili, malloc će se vratiti NULL. To je, u osnovi, kad god je funkcija trebao vratiti pokazivača, potrebno provjeriti protiv NULL, jer NULL je prilično good-- to je, na neki način, vrijednost smeće. To je nula koliko pokazivače ići. Kad god nazvati funkciju, koja vraća pokazivač. Ti ćeš želite provjeriti kako bi se sigurni da je kazaljka nije NULL jer NULL je vrlo čest. To je svojevrsni povratak smeća. Dakle, ako se nešto ne ide dobro, Upravo vratiti NULL umjesto. PUBLIKA: [nečujan]? DAN: Da, i to je to. PUBLIKA: [nečujan]? DAN: Spell to što je ovaj. To je NULL terminatora. To je mala N-U-L-L, ako ti ga pravopis. PUBLIKA: I samo sam otišao natrag i testirali ga. A ako pokušate staviti pomičnim zarezom Vrijednost u prekidač, to će vikati na vas govoreći izjava zahtijeva izražavanje od cjelobrojnog tipa. DAN: Izvoli. Ali da, što je opet pitanje? PUBLIKA: [nečujan]? DAN: Dakle kapital N, kapital U, kapital L, kapital L je stvarna C stvar. To je NULL pokazivač i volje samo treba tretirati kao takve. Vi nikada neće probati i čarolija NULL lik i vidjeti bilo drugi način od ovoga. Da? PUBLIKE: Dakle povratka u char max ili nešto u bilješkama, zar ne utjelovljuju istu funkciju kao [nečujan]? PUBLIKA: Tako se to odnosi povratka char max iz getchar, ili god je to? PUBLIKA: Da. PUBLIKA: Da, tako općenito Termin za sve one stvari sentinel su vrijednosti. Dakle, kao što se vraćaju int max iz GetInt i char max iz getchar, to je trebao biti kao, u redu, ako je ove stvari se vraćaju u nama, nešto je pošlo po zlu. Za naputke, samo mi se dogoditi da imaju to Sentinel vrijednost da svatko slaže nakon. A to je stvar koju se vratiti kad stvari krenu po zlu. Dakle char max je ono što mi koristimo da predstavljaju nešto kao NULL ili getchar. PUBLIKE: Dakle, ako ste testiranje getchar, mogla si samo staviti NULL? Bi li to napraviti razliku? DAN: Ne može samo provjeriti NULL. Morali biste provjerili char max, jer povratna vrijednost iz funkcije lik ne pointer. Da? PUBLIKA: Ovo pitanje pita za duljinu niza. Da li to uključuje NULL znaka? DAN: Ne I to je zapravo kako je duljina niza zna da se zaustavi jer ide kroz Vaša niz znakova do vidi NULL karakter. A onda je to, sve Dobro, ja sam učinio. PUBLIKA: [nečujan] pet? DAN: Pozdrav će biti pet. Yep. Tako su nizovi kontinuirani blokovi memorije. Oni imaju brz pristup rekavši naziv polja, a zatim, u vitičastim aparatić, bez obzira na indeks želite ići da, oni indeksirani od nule kroz duljina niza minus 1. I oni proglašena po vrsti Ono što ste spremanje u polje, naziv polja, a zatim sve što je veličina tog polja. Dakle, ovo je char polje duljine šest koji ima te vrijednosti. Da? PUBLIKA: [nečujan]? DAN: Da. PUBLIKA: [nečujan]? DAN: Ako imate ono što se događa u nizu već napravili. Tako da bi mogao odrediti ovaj umjesto što, recimo, char, bez obzira na ime svoje Niz je, prazne zagrade jednako kovrčava braće H zarez zarez E L L zarez zarez O zarez NULL znak i kovrčava Brace. To će također raditi kao deklaracije. PUBLIKA: [nečujan]? DAN: Onda morate imati Veličina je već napravio. PUBLIKA: [nečujan]? DAN: Da. Sve dešnjak. Argumente naredbenog retka su način dobivanje informacije od korisnika, kao Argumenti za glavni. Glavni traje dva argumenta. Broj argumenata koji se prošli zajedno zapovjedne linije i string vektor ili string niz od svih argumenata. Dakle, ako ja, recimo, zove funkcije, kao što su dot iz 1. prostora, 2 prostora, tri, argc će biti 4. I argv 0 će biti točka van. Argv1 bi biti 1. argv2 će biti 2. argv3 bi 3, u tom slučaju. Da? PUBLIKA: [nečujan]? DAN: Posljednji element u nizu jer niz je duljina argc plus jedan od argb, posljednji element je NULL pokazivač. To je argc plus 1. Dakle, u slučaju da sam upravo rekao, bi se argv 0 je dot van. argv 1 je 1. argv2 je 2. argv 3 je 3. argv 4, što je jedan veći nego argc će biti NULL. I to je NULL pokazivač. Da. A to je zato što je niz char zvijezda je pokazivač. Dakle, ona mora biti isti tip. Da? PUBLIKA: Dva pitanja. Tako je jedan, što je razlika između ovo i GetString osim jedne vrste u korisničkom motor? I drugo, je li pohranjena unutar Nedavno memorije? Dakle, kao što je, GetString bi biti [nečujan]? DAN: Gdje je pohranjena? Ne znam gdje je pohranjena. PUBLIKA: Pa, zapravo, znate kako je bilo funkcionira li nazvati to argumenti pohranjuju se u dimnjaku? Dakle argc i argv su argumenti za glavni i oni su na hrpi, ili stvarno iznad onoga što mislite što je Početak snopa. Ono što je drugi dio ne dolazi u obzir? PUBLIKA: Pa što je [nečujan]? DAN: Da, to je samo drugačiji način dobivanja informacije od korisnika. Ovaj je nešto učinkovitiji i to je spretniju za skripte jer vas može samo proći argumente da je vaš glavni funkcija, a ne da čekaju za korisnike, ako nemate sve korisnike. PUBLIKA: I da, dobili žice će biti [nečujan]. To će pohraniti stvari koje trebate. DAN: Da? PUBLIKA: [nečujan]? DAN: Da, argv 0 uvijek uključuje dot slash funkcije poziva. Da? PUBLIKA: [nečujan]? DAN: Da, svaki od argumenata su završio u NULL karaktera, jer oni su nizovi. PUBLIKA: [nečujan]? DAN: Da, argv argc je NULL pokazivač. PUBLIKA: [nečujan]? DAN: O da. Da, žao mi je. PUBLIKE: Dakle [nečujan]? DAN: Dakle, pitanje je, ako ste imali naredbenog retka točka slash točku iz 1., 2., bi broj naredbenog retka argumenti biti dva ili će to biti tri? PUBLIKA: Mislim da se to ne dogodi stvarno stvar. I imaju tendenciju da kažu, oh, što nije prošao sve argumente naredbenog retka kada, Očito, što se zove funkciju. Dakle, ja imaju tendenciju da se vokalno isključuje Funkcija iz naredbenog retka Argumenti iako je uključeni u argv. DAN: Ali ako je to bio na test-- yeah-- i ako nešto reći kao argc iznosi 3, ti si u sigurnom stanju. Da? PUBLIKA: [nečujan]? DAN: Mislim, ako umjesto pozivanja to u argc i gudačkih argv tipkovnici ali je zadržao iste vrste i upravo zvao im nešto drugo kao i b, bi li i dalje raditi? I to će i dalje raditi, ti bi samo-- umjesto korištenja argc-- ti bi koristiti i B. Da? PUBLIKA: [nečujan]? DAN: Dakle, pitanje je GetString je ide za pohranu memorije u hrpi jer GetString je char *. Ona pohranjuje memorije u hrpi, jer to sada poziva malloc roku stvarna Provedba GetString. U redu, idemo dalje. Sigurnost. Dakle, da se uistinu siguran, što se oslanjaju na br jedan, a vi ne dopustiti jedan pristup pojedinim vaših podataka, što je razlog zašto Svatko gradi svoje strojeve, njihovi operativni sustavi, sve svoje programi od nule, a očito ne povezati s bilo kojim drugim strojevima putem interneta. Dakle, računala su nesigurni. Oni doista jesu. Moramo vjerovati drugim ljudima. A ideja o sigurnosti je da si ti pokušava ograničiti količinu povjerenje koje vam je potrebno. A jedan od načina da to učiniti je kroz kriptografiju. Kriptografija je, u biti, imamo tajne. Ponekad moramo proći naše tajne zajedno kroz, recimo, internet ili druge stvari. A mi ne želimo ljude znati ove tajne. Tako smo kodirati naše tajne na način Nadamo se da nitko ne može shvatiti. Tako smo used-- kroz tijek ovog class-- stvari kao Cezarova šifra i [Nečujan], koji su vrlo, vrlo nesigurni načini kriptiranje stvari. Oni su lako shvatiti što im je su i koje su vaše tajne. Stvarni svijet koristi mnogo više komplicirani šifriranje sheme. I nećemo ući u mnogo više od toga. Ispravljanje pogrešaka. GDB je najbolji. Ja ću naglasiti opet. Koristite GDB cijelo vrijeme svaki Vrijeme imate problem. Naredbe koje su korisne u GDB su slomiti, koje prolaze ili liniju broj, ime funkciju, u suštini gdje u kodu želite zaustaviti, i biti u mogućnosti da preuzmu kontrolu. Ispis traje varijablu i ispisuje što god da je varijabla u to točka u vašem izvršenja. Sljedeća premješta izvršenje po jednom koraku. I korak korake unutar funkcije u svom izvršenju. Druge stvari su pokrenuti, što je, kako što zapravo pokrenuti svoj kod. Nastavak poduzima sve korake potrebne kako bi dobili na sljedeću točki prekida. A tu su i mnogi, mnogi drugi. Potražite ih. Oni su super. Da? PUBLIKA: [nečujan]? DAN: Da, to je za ispravljanje pogrešaka. Dakle, debugger je program koji omogućuje ispravljanje svoj program. To nije program koji pronalazi greške za što, iako to bi bilo sjajno. I na kraju, za mene je potraga. Dakle vrstama traženju da smo razgovarali o je u ovoj klasi su linearno pretraživanje, koja je samo da pogledate kroz svaki element za pretraživanje prostora, jedan elementa u isto vrijeme, dok ne pronađete ono što što tražite ili dok ne dođete Kraj za pretraživanje prostora na kojem točku koju kažu da nisu mogli naći element koji ste bili u potrazi za. I to traje u najboljem stalnu vrijeme, što je 0 od 1 i po najgorem linearnih vrijeme, što je 0 n. Binarna pretraživanje, što treba pogan elementi. Možete ići na sredini svojih elemenata, vidjeti ako je element što tražite veći ili manji od elementa da si u sredini. To je veći, vi kažete da je dno Vaše pretraživanje prostor je vaše trenutni položaj, srednji, i ponovnog pokretanja procesa. Ako je manja, izgledaš reći da do- Da, što je? PUBLIKA: [nečujan]? DAN: Da. Svaka vrsta vrste koji je učio u Klasa je fer igra za probu. [Smijeh] DAN: I činjenica da niste imali to učiniti za set problema, to je fer igra za probu. PUBLIKA: Možemo ići preko njega kako to-- DAN: Bit će obići. ZVUČNIK 2: Stvarni broj za [Nečujan] je na study.cs50.net. Dakle, ako pogledate problema praksi na stranici spajanje vrstom study.cs50.net, tu je kod za provedbu spojiti vrsta. Dakle, ne morate provesti što se večeras. No, budite sigurni da ga razumijemo a nego samo ga napamet. PUBLIKA: [nečujan]? ZVUČNIK 2: stranica spajanje sortiranje study.cs50.net, je praksa problem koji, ako klikati Problem je, na samom kraju postoji rješenje, a to je spajanje Provedba vrst. No, budite sigurni da ga razumijemo a ne samo ga napamet kopiranjem ili dolje. PUBLIKA: I savršeno valjana Problem za ispit će biti nešto kao ovdje je popis. Što ovaj popis izgledati nakon jedan korak od izabranih vrsta ili umetanje sortirati ili bilo što drugo. Jedna puna iteracija popisa. Dakle, čak i ako ne završiti trebaju Šifra za to, morate ga razumjeti dovoljno da znam kako to ide kako bi se izmjenom ovaj niz. DAN: To je to za mene. [Pljesak] LUCAS: Hej svima. Moje ime je Lucas. Ja ću govoriti o rekurzije, sve One vrste koje smo naučili, i Malo sve upućuje. OK? Dakle, prije svega, rekurzija. Što to znači reći da funkcija je rekurzivna? PUBLIKA: sebe naziva. LUCAS: U redu, zove se, da. Dakle, kao što su ove slike, na primjer. To je kao na slici unutar od slike i tako dalje. Tako, na primjer, možete have-- kao Dan koji je govorio o binarnom potrazi. Jedan od načina na koji binarno pretraživanje rekurzivna je činjenica da ste pokušava pronaći broj. Dakle, idete u sredini. I onda provjeriti da li su brojevi tamo u lijevo i desno. A onda, ako ste saznali broj će biti na lijevoj strani, to je ista što i opet radi potragu, ali Upravo na lijevoj popisa. Dakle, to je kako to zvuči kao da je rekurzivna. Dakle, to je razlog zašto ti dečki imaju rekurzivna rješenje za udruživanjem vrste. U redu, pa evo primjer. Dakle, recimo da želim izabrati svi brojevi od 1 do n. Ja mogu shvatiti da zbroj n Broj n plus N minus 1 do 1. Ali onda, ako pogledam na n minus 1 plus n minus 2 plus 1, to je ista stvar kao summing brojeva do nje minus 1. Dakle, ja mogu reći zbroj jednakom zbroju jednak n plus zbroj n minus 1. Da li to smisla? I ja bih nešto drugo zove osnovni scenarij, a to je da zbroj brojeva do nuli će biti nula. Dakle, čim sam doći do broja nula, sam prekinuti odbrojavanje. Da li to smisla? Dakle, ovdje je primjer kako Ja mogu provesti to. Dakle, imam tu funkciju u nekim. To traje cijeli broj N. Dakle, ovdje sam prvi put provjeriti da li je n manji ili jednak nuli. Dakle, ako je manje ili jednako nuli, ja povratak na nulu, što je naš osnovni scenarij. Inače, ja samo mogu vratiti n plus zbroj brojeva iz jedan na n minus jedan. Smisla? U redu. Pa evo kako to izgleda. Imate iznos od 2 jednako 2 plus suma od 1. A neki od 1 je 1 plus zbroj 0, što je 0. Smisla? Dakle, ako gledamo na hrpu svoje Program, to je ono što izgleda. Prvo, imamo glavnu funkciju. A onda je glavna funkcija zove zbroj 2. A onda je zbroj 2 će reći, oh, zbroj 2 jednako je 2 plus iznos od jedne. Tako sam dodati iznos od 1 do snopa. I suma od 1 će se zvati zbroj 0, što također će se dodati na stog. I onda svaki od tih one koji su na vrhu drugi morati vratiti Prije nego ostali ljudi mogu zadržati ide. Tako na primjer, ovdje, zbroj 0, Prva, koja će vratiti 0. A onda odlučite sumu od 1. Zatim suma od 1 će povratak 1 do iznosa od 2. I na kraju, iznos od 2 ide Za povratak na 3 glavna. Da li to smisla? To je stvarno važno razumjeti kako stog radi i pokušati vidjeti ako ima smisla. U redu, tako da sortiranje. Pa zašto je sortiranje važno, Prije svega? Zašto bi nas bilo briga? Svatko? Daj mi jedan primjer? Da? PUBLIKA: [nečujan]. LUCAS: Da, u redu. Dakle, možete učinkovitije tražiti. To je dobar način. Tako, na primjer, imamo puno stvari, zapravo, u našim životima koje su razvrstani. Na primjer, rječnici. To je vrlo važno da imaju sve riječi u nekom redu da mi može pristupiti lako. Dakle, to je ono što on govori. Možete učinkovitije tražiti. Razmislite o tome kako je teško bi bilo imati rječnik u kojem su riječi u slučajnim redoslijedom. Morat ćete pogledati, prilično mnogo, svaki riječ dok ne nađete Riječ koju tražite. Ako koristite Facebook također, kada ste u potrazi na svoje prijatelje, ti si će se vidjeti da je Facebook stavio svoj bliži prijatelj je na vrhu one da ne govorimo kako bi to puno. Ako ide sve na putu do dna Vaš popis prijatelja, ti ćeš vidjeti ljudi koji vjerojatno ni ne sjetite se da ste prijatelji sa. A to je zato što Facebook sorti Vaši prijatelji se temelje na tome zatvoriti ste na njih. Dakle organiziranja podataka. Također Pokemon. Pa vidite da je sve Pokemon imaju brojeve. A to je kao jednostavan način pristupa podacima. PUBLIKA: Pristupanje Pokemon. LUCAS: Da. PUBLIKA: [nečujan]. LUCAS: Aha. U redu, tako da izbor vrst. Izbor je sorta koja se događa za odabir Najmanji nesortiran vrijednost popisu svakog Vrijeme u svakoj iteraciji. To je vrsta kao što su one vrste koje ste učinili u glavi kad pokušavate sortirati popis na ruku. Uglavnom, sve što trebate učiniti je pogledate za najmanji broj. Možete ga staviti u sortirani popis. I onda ste u potrazi za Sljedeći najmanji broj. I onda nastaviti raditi da i tako dalje. Dakle, izbor je u osnovi neka vrsta si odaberite svaki put najmanji nesortiran vrijednost. Stavite na kraju razvrstani Dio popisa. I imajte to raditi. Tako ćemo brzo vidjeti što to izgleda. Dakle, ovdje je sortirano i nesortiran popis. Tako je za izdvojiti od popisa, to je u početku prazna. A onda ću odabrati Najmanji broj ovdje, što je 2. Tako sam se broj 2 i ja stavio U prednjem dijelu popisa. A onda sam u potrazi za sljedeći najmanji element, koji je 3. Zato sam ga stavio na kraju popisa razvrstati. A onda sam zadržati taj događaj. Smatram 4 i stavite ga na kraju. Pronađite 5 i staviti ga na kraju. A pogledajte kako sve ono vrijeme koje Ja govorim stavi na kraj, osnovi, zamjene dvije vrijednosti. OK? I onda posljednja, samo ima još jedan element. Dakle, to je već riješeno. U redu, tako da umetanje vrst. Umetanje svojevrsni ćeš imati i da je stvar što sortirati i nesortiran popis. Jedina stvar je da svaki put kada dodajete element na sortiraju popisu, samo odabrati element koji je ispred nerazvrstani popisa. I onda ćeš pronaći što Položaj bi trebao biti u sortirani Dio popisa. Da vidimo što je to tako to ima više smisla. Dakle, u početku, na primjer, ja pokušavam umetnuti broj tri u sortirani dio popisa. Dakle, popis nema ništa. Dakle, ja mogu samo staviti broj 3. Sada, želim dodati broj 5 na sortirani dio popisa. Dakle, sam pogled na broju 5. Primjećujem da je veći od 3. Dakle, ja znam da to mora biti nakon 3. Zato sam stavio 3 i 5. Tada želim umetnuti broj 2. Primjećujem da je broj 2 je zapravo trajati zatim oba 3 i 5. Tako sam zapravo morati staviti sve to Način na početku popisa. Pa moram, vrsta, prebaciti sve elementi u popisu sortirane, tako da mogu napravili mjesta za broj 2. Tada sam vidjeti broj 6. Vidim da bi trebalo biti nakon 5. Tako sam ga tamo stavio. I na kraju, sam pogled na broj 4. I primjećujem kako bi trebao biti između 3 i 5. I onda sam ga stavio tamo i smjene svi ostali elementi. Smisla? Mjehurić Sortiranje. Dakle Bubble sorta je u osnovi ono što si će do-- smo ga nazvati mjehurića Sortiranje jer idete kroz list-- to je zapravo bolje da sam samo pokazati Želite ovo-- a ti ćeš usporediti susjedna broja. I ti ćeš da zamijene pozicije, ako oni nisu u pravom redoslijedu. Tako je u osnovi, što će se dogoditi ovdje, na primjer, imate 8 i 6. Vi znate da su sortirani narudžba će zapravo biti 6 i 5, zar ne? Tako da ćeš mijenjati naloge. Onda vidim od 8 i 4 ovdje. I ja isto. Ponovno sam zamijeniti. I na kraju, 2 i 8. Također sam ih zamijeniti. To se zove Bubble Sortiranje jer nakon svaki od tih iteracija, zapravo, Najveći broj na popisu dobiva sve način kraju liste. Da li to smisla? Budući da čuva ga zamjene i kreće se s desne strane. U redu, tako da je ovo druga iteracija. To bi bilo isto. Učinit ću jednu zamjenu i zatim posljednja. I da nema zamjene i popis sortira. Dakle, u Bubble vrste, mi u osnovi zadržati ide kroz popis i zamjene stvari dok sam obavijest da nisam učinio bilo zamjene događaj koji iteracija, koja znači da je popis već riješeno. Smisla? Pričajmo malo o pokretanju vremena. Pa se vi sjetite Facu O, Omega, i Theta? Da? U redu, što je Big O, u prvom redu? PUBLIKA: [nečujan]. LUCAS: Da, to se zove najgori slučaj Trajanje, što samo znači da je koliko ste očekivali program da se pokrenuti. Kao, u smislu of-- u ovom case-- n. Broj elemenata Popis u najgorem slučaju. Kao i, u najgorem mogućem slučaju. Tako je za Bubble sorta, primjerice, Imamo velike O n trgu. Zašto moramo da? Zašto je mjehurić Sortiranje Big O n trgu? PUBLIKA: [nečujan]. LUCAS: Da, pa u najgorem slučaju će biti da ću morati učiniti n iteracija. Dakle, svaki od iteracija će bi najveći element na kraju popisa. Dakle najgori slučaj je da imam učiniti tu stvar n puta. A za svaki od tih vremena, moram to n swapove jer moram usporediti svaka dva elementa. Dakle, to je razlog zašto je n kvadrat zato što je n puta n. Zatim, izbor sorta je također n kvadrat jer, za svaku iteraciju, moram pogledati svakog pojedinog elementa na popisu. I onda naći najmanji, što znači da moram gledati kroz n elemenata. I moram učiniti da je n puta, jer Moram odabir svih n elemenata. Umetanje svojevrsni je n kvadrat jer je najgori mogući scenarij će biti, jedan, moram umetnuti n brojeva, zar ne? Pa ja već znam da ću imati n iteracija. No, za svaki od tih brojeva, ako sam imao gledati na sve brojeve u Popis razvrstani i stavio ga skroz u prednjem, da će n kvadrat jer će n puta n opet. Smisla? Što je omega? PUBLIKA: [nečujan]. LUCAS: To je najbolji mogući scenarij. Dakle, to je kao, u puno vremena za sortiranje, najbolji scenarij je kad je već razvrstani popis. Tako da stvarno ne imati ništa učiniti. Mjehurić Sortiranje ima najbolji scenarij n. Znaju li vi zašto? PUBLIKA: [nečujan]. LUCAS: Da, ako pratimo je li se podaci obrok imao swaps ili Ne, ako imate nešto kao što je postavljena na istina, ako je bilo iteracija, ako Popis je već sortiran, u osnovi, što će se dogoditi je da ću pokušati mijenjati svaka dva susjedne elemente. Idem vidjeti kako nema zamjene. I upravo sam se vratiti odmah. Dakle, to znači da sam jednostavno morala proći kroz popis jednom trenutku. Dakle, to je nje, jer sam pogled na n elemenata. Zašto izbor vrst n trgu? Da, čak i ako Popis je sortiran, za svaka iteracija odabira vrste, ja morate odabrati najmanji element. Dakle, to znači da sam se pogledati na svim elementima u nesortiran popis i pronaći minimum za svaku iteraciju. Da li to smisla? I umetanje mač je n, jer se u slučaj da pokušavam umetnuti brojevi i svi brojevi, kad sam pokušajte ih umetnuti, vidim da su su u pravilnom položaju. Ne moram ići provjeriti sve druge Brojevi u nerazvrstani popisu. Dakle, to je razlog zašto će n. Smisla? A što je teta? PUBLIKA: [nečujan]. LUCAS: Što mi je? Opet reci. PUBLIKA: [nečujan]. LUCAS: Točno. Dakle, možete vidjeti da je samo izbor pohranjeni u pisma svojevrsni imaju thetas. A to je zato što imaju samo teta ako oba Big O i Omega su isti. U redu. I na kraju, spojiti sorta koja se u log n. A onda, kao što je Dan je govorio, pisma svojevrsni je vrsta kao što su na isti način na koji ti binarni pretragu. Tako ćete dobiti popis. I ti ćeš smanjiti na pola. I onda ih izrezati u manjim polovice. I onda ih spojiti. Vi dečki ne zaboravite da je, zar ne? U redu, što je on rekao. U redu, upućuje. Dakle, ono što je kazaljka? PUBLIKA: [nečujan]. LUCAS: adresa. U redu. Znam da je David pokazuje hrpu videospotovi Binky i stvari koje upućuju drugoga. Ali volim razmišljati o pokazivače kao pukog adresu. Dakle, to je varijabla koja se događa pohraniti adresu. Dakle, to je samo ova posebna varijabla koji je četiri bajtova. Sjeti se, da je kazaljka na što je Uvijek četiri bajtova za našu 32-bitni Stroj tako slučaj s aparata. I to je upravo mjesto varijable unutar nje. U redu, tako da je ova memorija, u osnovi. Dakle, svaki blok memorije zapravo ima oznaka, što je adresa slotty memorije. Dakle, to znači da mogu imati pokazivač pokazuje na bilo koji od tih adresa. Dakle, razlog zašto ćemo koristiti upućuje se ako moram sjetiti mjesto da specifična varijabla memorije. A vi ne zaboravite da je jedan od onih slučajevi bio ako imam funkciju ako imam stvarno želite zamjena za reals, zapravo sam morati poslati pokazivač. Ne promjenjiva. Vi zapamtite to učiniti? Razlika between-- Kako se zove? Pozivi prema vrijednosti i pozivom pozivanjem, zar ne? U redu, da. Tako zovu po vrijednosti. Kada samo poslati varijabla funkcionirati ste samo slanje vrijednost. Pa ti si zapravo šalju kopija varijable. A vaš program nije me briga o ako je ista varijabla zapravo čini kopiju. I zove po referenca znači da Ja sam zapravo slanjem kopije kazaljka na varijablu. Dakle, to znači da šaljem Mjesto te varijable. Dakle, osjećam da imam mjesto promjenjiva, kad sam nazvati funkcija s pokazivača, ja sam u mogućnosti da se zapravo promjenu podataka koji je u glavni. Smisla? Iako, pokazivač je kopija, Pokazivač još uvijek ima stvarnu adresu varijabla koja želim promijeniti. Smisla? Dakle, stvaranje naputke. Zapamtite, pokazivač uvijek imati tip koji to pokazuje na, a zatim zvijezde. I onda si stavi ime. Dakle, ne zaboravite da kad god imate god star, to je kao pokazivač kako god promjenjiva upišite koje ste imali. Pa ovdje u zvijezde, na primjer, to je pokazivač i cijeli broj. A onda char zvijezda je pokazivač char zvijezda i tako dalje. Da? PUBLIKA: Što ako imamo pokazivač n zvijezda x. Znam da se stvara pokazivač na X. Da li to ujedno izjavljujem x cijeli broj? LUCAS: U redu, tako da kada kažeš n zvijezda x, da ne stvara pokazivač varijabla x. Vi ste stvarajući pokazivač nazivom x. PUBLIKA: [nečujan]. LUCAS: Dakle, kad kažem n zvijezda x, ja sam govoreći, hej, u sjećanju, ja ću dobiti jedan od ova tri kutije. A ja ću reći da je to će biti x, što je će biti pokazivač. I nešto zanimljivo o pokazivače jest da kažemo da imaju 4 bajta za 32-bitni stroj. A razlog za to je zato što 4 bajta su 32 bita. I strojeva koji su 64 bita zapravo imati pokazivače adrese da su 64 bita. Dakle, to samo znači da je veličina adrese u stroju je drugačiji. Dakle, korištenje i Dereferencing. Postoje dva operatera da ti dečki trebali zapamtiti. Prvi je znak za struju. Drugi je zvijezda. Ne dajte se zbuniti tom zvijezdom i to zvijezda, jer ne zaboravite da je u Ovaj slučaj, imate n zvijezdu. To je kao cijelu stvar zajedno. Nema nje Space Star. Dakle, to znači da je to tip. Sjeti se, da kad imate promjenjiva zvijezda, ti si Riječ je o vrsti. Kada imate samo zvijezda, a zatim naziv varijable, to znači da ti si dereferencing pokazivač, koji znači da ste u potrazi na pokazivač, pronalaženje adrese to ukazujući da, ide na tu adresu, i gleda na svaki put imate tamo. Tako sam svojim studentima da kad imate zvijezda, te bi trebao misliti da je to kratica sadržaja. Dakle, ako imate pokazivač, a vi napraviti zvijezdu pokazivač, to je Sadržaj pokazivača. Dakle, ići na sve što se pokazuje na i pogled na stalnoj sadržaja. A znak za struju je ista stvar kao adresu. Dakle, ako imam varijablu A- kao, ajmo reći da sam učinio int jednak 3-- ako želim pronaći adresu koja varijabla memorije, ja samo mogu učiniti znak za struju. Dakle, to je adresa. Smisla? Dakle, ovdje je primjer. To nedostaje int B i int c. Dakle int iznosi 3 znači da Ja ću otići u sjećanju. A ja ću naći utor i staviti broj 3 ovdje. A onda int b jednak 4. Ja ću učiniti istu stvar. Idi na memoriju i staviti broj 4 u jedan od okvira. I Int jednaka 5. Nađi još jednu kutiju i stavio broj 5. Pa što je ovo linija radite? n zvijezda godišnje iznosi ampersand A. Dakle, prije svega, n zvijezda godišnje. Što se to radi? PUBLIKA: [nečujan]. LUCAS: Da, tako je n zvijezda godišnje, prvi put, izjavljuje pokazivač zove godišnje. A onda je dodjeljivanje vrijednosti da se kazaljka biti adresu. Dakle, znak za struju. Zatim, ako mi je činiti zvijezda PB, ono što je PB zvijezda? Oh, ispričavam se. To je također nedostaje. n zvijezda PB. Mislim zvijezda računalo. Tako mi je žao. To je ista stvar. Ali sad sam dobro ar stvarajući pokazivač do b, a zatim pokazivač na c. Da? PUBLIKA: [nečujan]? LUCAS: Da. Dakle, ako idete u memoriju i idete okvir koji je označitelja za godišnje, ti si zapravo ide vidjeti adresu. OK? Da? PUBLIKA: [nečujan]? LUCAS: Da, pokazivač je adresa. Nikad ne zaboravite to. To je kao najvažniji dio o pokazivače. Tu je skladištenje i adresu do neke varijable. Bilo što drugo? Bilo koja druga pitanja? U redu. Dakle Kazaljke i polja. Zapamtite da kada radim int polje 3, Uglavnom, ono što ja radim je sam, ljubazni od, izjavljujući u pokazivaču. Dakle, niz je vrsta kao što su pokazivač specifično mjesto u memoriji u kojem sam izdvojila tri utora za cijelih brojeva. Da li to smisla? Dakle, kada radim int polje 3, što sam radi, u osnovi, stvara tri mjesta u memoriji. Pa ja samo naći tri mjesta u memoriji. Dakle, ako ja, onda, niza zvijezda, to Znači sadržaj polja, što znači da sam izbrisati pokazivač, idem na to mjesto da to pokazuje da se, i ja staviti broj jedan. A onda, ako ja zvijezda niz plus 1, to je ista stvar kao i radi niz nosači jedan, što samo znači da idem Mjesto koje to pokazuje na. A onda su plus 1 marke ja pomak za jedno mjesto. Tako sam ići na to mjesto, zapravo, i staviti broj dva. A onda, na kraju, kad radim Niz plus 2, idem tamo gdje Niz je pokazujući na. A onda sam se premjestiti na memorijskim blokovima. A onda sam stavio broj tri ovdje. Da? PUBLIKE: Dakle zvijezda niz je jednostavno kaže se u prvoj točki. A možete dodati 1, samo zato mi smo samo jako pozivom taj prvi adresu. LUCAS: Da. Zašto nam, na primjer, kažu niz 0, polje 1 i niz 2? Ja govorim, zašto to ne učinite 0, 1, 2, 3, umjesto 1, 2, 3? Jedan od razloga je, jedna, računalo programeri radije za početak računajući od 0. Dva je jer kad ti niz 0, to je ista stvar kao i radi niz plus 0, što znači da ću ići na da je stav, a ja to ne preskočiti bilo memorijskih blokova. Dakle, ja ne presele bilo memorijskih blokova. Da? PUBLIKA: [nečujan]? LUCAS: Dakle, ona pita što je Razlika između događaj ovo ili radite malloc. Jedna razlika je u tome int polje 3 se stvara Niz na stog. I kad sam to malloc ga, stvara na gomili. Da li to smisla? Pa kako se malloc zapravo rade? Pa zašto se onda uopće potrebno koristiti malloc? Vaš prevodilac vrsta figure out sve varijable koje objavljene. I on stvara prostor za sve od njih u snopu. Dakle, sve svoje varijable idu biti negdje u snopu. Dakle, ovdje je varijable okoline. Tako je u osnovi, prostor za one varijable u memoriji se dodjeljuje na sastaviti vrijeme. Dakle, to znači da je vaše računalo znati sve te varijable unaprijed. To ne treba znati što vrijednost ti ćeš staviti u njih. No, treba znati kako koliko memorije vam je potrebno. Ali sada recimo da je, primjerice, koju stvara niz ili uzimanje niz koji ste uzimanje od korisnika. Ne znam koliko dugo niz koja će se, na primjer. Dakle, ne znam točno koliko je memorija blokovi li izdvojiti, zar ne? Tako da se zapravo ne smisla za što reći staviti 100 znakova. I što onda ako korisnik piše 150? Ti ćeš biti pijan. Tako je u osnovi, ne možete biti sigurni kako koliko memorije vam je potrebno izdvojiti kada sastaviti program. Vi samo znate da se na vrijeme protoka. Dakle, to je razlog zašto imate hrpu. Dakle, gomila će imati sjećanje da ste tijekom dodjele Trajanje programa trčanja. Tako je u osnovi, kada ne malloc, što radite izdvaja memoriju na Trajanje, što znači da ste odlučivanju pravo u tom trenutku da vas trebao imati tu uspomenu. Dakle, to je kad ste ga dodjele. Da li to smisla? Tako zapamtite, stog ima varijabli koje su stvorene na vrijeme prevođenja. I onda gomila ima varijabli koji su stvorili kao što ide malloc s, na primjer. PUBLIKA: [nečujan]? LUCAS: Tako je GetString nazvati malloc. Razgovarat ću o tome malloc, a Ja ću objasniti GetString. Dakle malloc je ista stvar kao što je dodjela memorije. Dakle, to će se dodijeliti memorije na hrpi. I to će se vratiti kazaljke na gdje je ta memorija je dodijeljeno na. Dakle, kada ste do-- Ovdje example-- n zvijezda pokazivač. A onda se kazaljka jednako malloc veličina inča puta 10. Ja sam stvaranje pokazivač. A onda sam dodjeljivanje da pokazivač vrijednost pokazivača koji malloc se mi daje. Dakle, tražim malloc možete dodijeliti Prostor za 10 brojeva. To je ono što govori. I malloc me vraća kazaljka na tom mjestu. Smisla? U redu. Ja I GetString je, u osnovi, radi pozvati na malloc tako da možete dodijeliti memorije za vrijeme izvođenja. Uvijek imajte na umu da provjerite null jer malloc će se vratiti null ako se ne može dodijeliti memoriju. Recimo da pitate za smiješno količina memorije. Računalo neće biti u mogućnosti izdvojiti toliko. Dakle malloc samo ide da se vrati null. Tako se uvijek sjećati da biste provjerili Pokazivač koju je dobio od malloc je null ili ne, jer, ako je, možda ćete se dereferencing pokazivač i uzrokuje popratne greške. I na kraju, ne zaboravite Vaša slobodna memorija. Malloc stvara sjećanje na hrpi. I morate osloboditi memoriju prije završetka programa. U redu, to je sve za mene. Žao nam je, Rob. Hvala. [Pljesak] LUCAS: Bilo posljednjih pitanja Prije Rob dolazi? Ne? Da? PUBLIKA: Nisam vidio ovo je jedan on-line. Jeste li ga prenijeli još? LUCAS: Mislim da je Dave upload uskoro. DAVE: To će biti objavljena. LUCAS: To će biti online. PUBLIKA: To je gore. LUCAS: To je gore? U redu. Da? PUBLIKA: [nečujan]? LUCAS: Da, trebali osloboditi sve memorije koja se stavlja u hrpi. PUBLIKA: [nečujan]? LUCAS: Da. Svaki put kada imate kulture malloc, trebali imati kulturu besplatno Nakon što prestanete koristiti tu varijablu. Dakle malloc i slobodno se uvijek zajedno. Njihovi najbolji prijatelji. Da. Rob? ROB: Idem brzo. I također video će biti postavljena. Imam mikrofon na. U redu, tako da tjedan pet stvari. Prva stvar koju imamo je stog. Dakle, ne zaboravite da postoji samo jedan snop Okvir po aktivnom funkcije poziva. Vidjet ćemo da se u sekundu. I također sjetiti što zapravo ide u svakom stog okvira će biti lokalne varijable naših funkcija, argumenti koji su doneseni u našu funkcije, zajedno s nekoliko ostale stvari koje zapravo ne morate brinuti o tome. Dakle, ovdje je primjer programa u kojem, obavijest, glavna je printfing povratak Vrijednost foo 4. Foo samo će se vratiti Vrijednost bar 4 zarezom 6. I ovdje će se postaviti i neke lokalne varijabla n jednaka 4 puta 6. A onda se vrati n. Pa pogledajmo dimnjaku u cijeloj Stvarni iteracija ovog programa. Tako da je dno našeg dimnjaka. Ne zaboravite da je snop odraste. Dakle, na dnu naše stog, mi Imate čipove okvir za glavno. Kada pokrenete program, glavna uvijek će biti na Donji dio naše stog. A što je unutar našeg stog okvir za glavni? Dakle, iako ne postoje lokalni varijable za glavni, kao što sam rekao prije, smo argc i RGV zauzima prostor unutar glavne stog okvira. Dakle, glavna je sada ide na pozvati funkciju Foo. A to znači Foo će dobili svoj stack okvir. Dakle, sada smo unutar Funkcija Foo. A ono što treba ići u Foo je stog okvira? Pa, Foo ima argument n. I n je jednako 4, budući da je ono Glavni prolazi kao Foo argumenta. Tako sada Foo će pozvati bar. Ono što se ovdje događa da unutar svoje 'stack frame? Ima x jednak 4 y jednak šest. To nije sve što ćemo imati u okviru stog, jer se ovdje također ima lokalne varijablu n. A nje ćemo postaviti jednak 24. Tako sada bar će vratiti n. Dakle, ovdje se vraća 24 do stog okvir Foo. A budući da se ovdje sada se vraćaju, da znači da smo iskakanje stog okvir za bar off od stog. Dakle, sve memorije koja se ovdje bio korištenjem sad isključen dimnjaku. Sada, Foo također ide Za povratak na glavni 24. Tako da sada Foo vraća, sjećanje da Foo je koristio u svojoj ' stog okvir je također nestao. A sada, glavna će se zvati printf. Pa printf je samo još jedna funkcija. Kad mi zovemo printf, to će biti još jedan snop okvir za printf Funkcija poziva. Što mi prolaze printf? To je ono što će otići na svojoj stog okvira. U najmanju ruku, mi smo prolazu da posto sam obrnute kose crte n i Argument 24. To bi moglo imati više u to stack frame printf ako se dogodi da se pomoću neke lokalnim varijablama. Ne znamo. No, sve to ide u printf-ih stog okvir. To će se izvršiti printf. Zatim printf je učinio. To će se vratiti. Konačno, glavni je učinio. Glavni će se vratiti. I onda naš program je učinio. Da? PUBLIKA: Vidite li [nečujan] Argumenti [nečujan] parametri? ROB: Dakle, postoji suptilna razlika između argumenata i parametara. I doista, u zajedničkom govoriti, ljudi imaju tendenciju Samo ih miješati cijelo vrijeme. No, parametri su formalno Naziv stvari. Dakle argc i argv su Parametri za glavni. Argumenti su ono što zapravo prolaze kao tim parametrima. Tako da kad sam nazvati Foo 4, 4 je argument sam u prolazu. I parametar n, unutar Foo, poprima vrijednosti 4 od 4 bio argument. PUBLIKA: [nečujan]? ROB: n je lokalna varijabla u bar. n je i dalje lokalne do foo, ali to je parametar na Foo. To nije lokalna varijabla. Da? PUBLIKA: [nečujan]? ROB: Foo jednostavno zove bar i povratka u kakvim se ovdje vraća. PUBLIKA: [nečujan]? ROB: Da, samo da vidim višestruki stog okvire. Da? PUBLIKA: Zašto je Foo zove prije printf? ROB: Zašto je Foo nazvao prije printf? Tako sam mogao imati, umjesto toga, učinili nešto kao int x jednaka Foo od 4 a zatim tiskana x. No, umjesto toga, u kombinaciji sam funkciju pozvati u printf argument. Ali primijetite da ne možemo zapravo izvršavanje poziva da printf dok ne shvatiti što Foo 4 je. Tako ćemo ocijeniti ovu. I samo jednom da je učinjeno ide vratiti i ocijeniti to. Da? PUBLIKA: Od obje trake [nečujan] vrijednost, zašto ne bismo imati [nečujan]? ROB: Oni bi stvarno trebao biti int. To nije bio uhvaćen tijekom višestruki prolazi. Dakle, to bi trebalo biti int bar i int Foo jer su i one se vraćaju prirodni brojevi. Void je samo ako se ne ide za povratak stvarne vrijednosti. Da? PUBLIKA: Ako ste imali liniju gore povratka, [nečujan]? ROB: linija iznad povratka? PUBLIKA: Da. Kao, ako si učinio printf i [nečujan], bi se ispisati dva puta? ROB: Tako unutar foo? Ako smo imali printf ovdje? PUBLIKA: Da. ROB: Dakle, ako smo imali pravo printf ovdje, to će ispisati jednom. Budući da smo se zove Foo jednom u pravu ovdje, onda ćemo udariti printf. Onda ćemo pozvati bar. I onda Foo će se vratiti. I to je to. Mi samo ikada naići Jednom printf. Da? PUBLIKA: [nečujan] printf pozivom Foo zato što smo prvi nazivajući printf a onda smo prolazu argumenti. ROB: Tako je u teoriji, nije printf zove Foo? Dakle, nema. Samo bi da c će izvršavanje tih stvari je, prije nego što možemo pozvati funkciju, sve argumente da funkcije mora biti potpuno vrednovati. Tako je to u potpunosti vrednovati? Da, to je samo niz. To je samo vrijednost. Tada moramo potpuno ocijeniti ovu. Nakon što je to učinio, sada sve njegovi argumenti se ocjenjuju. A sada možemo napraviti pozvati na printf. Da? PUBLIKA: Jedno pitanje. Ako imate funkciju void, mora imate povratnu-zarez? ROB: Ne znaš povratak zarez Ako imate funkciju void. U redu. Pa sad neka hrpa stvari. Dakle, gomila je kako ćemo se nositi s dinamičnim upravljanje memorijom. A to je izravno u suprotnosti s stog što bismo nazvali automatski upravljanje memorijom. Dakle, na hrpu, nikada stvarno imati se nositi s time kako lokalnim varijablama guraju i popped off sve ove stog okviri i sve te stvari. Vi ne morate brinuti o tome. To je automatski. Dakle, gomila je za upotrebu. I [nečujan] dolazi iz tih funkcija malloc i besplatno. Dakle, ovdje je drugi program. Sve što radite je mallocing cijeli broj. Mi smo ga pohrane u kategorizaciji x. Naravno, moramo provjeriti da li je x null. Onda ćemo samo postaviti ono x je pokazujući na 50. Ispis ono x upire prstom, print x, a zatim slobodno x. Pa kako je to zapravo će izgledati ako gledamo naše hrpu i hrpu? Tako ćemo početi ispočetka. Donji dio naše stog kao i prije. Sjetite se da ti gomila izravno protivi stog? Tako ćemo imati vrhu naše hrpu tamo. Dakle dnu naše stog, imamo Naš stog okvir za glavno. Ima prostora za argc, argv, a mi Sada imaju lokalne varijable X, koji je Int zvijezda. Tako ćemo ponoviti kroz ovaj program. Prva stvar koju imamo poziv na malloc. Tako činimo poziv malloc. Malloc je funkcija. To će dobiti stack okvir. Što nam prolazi na malloc? To će ići unutra iz dimnjaka okvira. Mi prolazi veličine n, što je 4. Tako da je prošao na malloc. Što malloc učiniti? To nam dočepa neki prostor na hrpi. Tako ćemo ići na hrpi. A mi idemo u zgrabite 4 bajta iz hrpe. Pa neka je samo dati da proizvoljna adresa. 0x123 Samo pretvarati da je adresa koja je na hrpi. Dakle, ono što je zapravo unutar koje područje memorije na adresi Ox123? Garbage. Pa nismo pohranjeni u njemu ništa. Dakle, koliko mi znamo, to mogao biti ništa. Vi ne bi trebali pretpostaviti da je nula. To je vjerojatno nije nula. Tako sada malloc vraća. I što nam je činiti kada se malloc vraća? Postavili smo ono što se vraća. Mi smo postavili x jednaka onome što ona se vraća. Pa što je to povratak? To je povratak 0x123 budući da je adresa bloka u memoriji da to Samo izdvojila u gomili. Dakle, povratak 0x123 x sada će biti postavljen jednak 0x123 koja je, slikovito, Često smo izvući što x ima stvarna strelica na tom bloku. No x samo je spremanje tu adresu. Zato sada moramo provjeriti da li je x null. To nije null. Mi se pretvarati da je malloc uspjeli. Dakle, sada star 50 x jednaka. Dakle zvijezda pamti to znači idi na tu adresu. Dakle 0x123 ćemo idi na tu adresu. Dakle, to nas dovodi tamo gore. Što radimo na toj adresi? Mi pohranu 50. Dakle, nakon ove linije, to je ono što stvari će izgledati. Dakle, sada to više nije smeće tamo. Sada znamo da je 50 je u tome Posebno adresa jer smo ga postavili na to. OK? Dakle, sada idemo ispisati f. Dakle, prvo ćemo ispisati zvijezda x. Dakle, ono što je zvijezda x? Opet, zvijezda x znači ići Ono što se pokazuje na x. Dakle, x je spremanje 0x123 Idite na to. Mi smo dobili 50. Tako ispisati f to. A to znači da će se ispisati 50. I onda da se vraća. I onda imamo drugu printf. Mi smo sada posto str. Ako niste vidjeli, to je koliko ste ispisali pokazivač. Dakle, imamo posto ja, posto f, i sve one koji su već. Dakle posto p, ispisati pokazivač. Tako je x pokazivač. Dakle, ako ćemo ispisati x sebi, mi smo ispis što je zapravo unutra X, koji je 0x123 Pa prvi print f će ispisati 50. Drugi ispis f ide ispisati 0x123 Da? PUBLIKA: Koristite li posto x za ispis pokazivač? ROB: Pa vi koristite posto x za ispis pokazivač? Tako možete, ali posto je x samo, Općenito, za kao i ako imate neke cijeli broj i želite ispisati to je kao heksadecimalni. To je samo kako ćete to učiniti. Budući da, posto d bi ispisati decimale. To su mi dobiti posto d. Ja je samo broj. posto je p specifično Za naputke. Tako je x pokazivač. Želimo iskoristiti posto str. Ali posto x mogao raditi. Da? PUBLIKA: [nečujan]? ROB: Da. Barem za to call-- pa sam nije ga uključiti ovdje u. No, ove dvije tvrdnje su nužno unutar tog okvira stog zajedno sa svim lokalnim varijablama printf dogoditi da se koriste. A onda sljedeći poziv na printf sada unutar printf stog okvir Obrnuta kosa crta posto p n i što god vrijednost X, koji je 0x123. Da? PUBLIKA: [nečujan]? ROB: To će ispisati nešto da izgleda ovako. PUBLIKA: [nečujan]. ROB: Tako se to ispisuje u adresnu obliku. Izgleda poput adrese. Da? PUBLIKA: [nečujan]? ROB: Zašto je što? PUBLIKA: [nečujan]? ROB: Zašto je ovo pokazivač 4 bajta? Dakle, postoje cijela hrpa od 0-ih godina ispred ove. Dakle, to je stvarno 0x0000000123. Na 64-bitnom sustavu, ne bi bilo cijela hrpa više nula. Da? PUBLIKA: [nečujan]. ROB: Tako prvi printf će print-- PUBLIKA: [nečujan]. ROB: Da, to će se ispisati ono x pokazuje da. Star kaže što je to što ukazuje na. Zgrabite ga. Dakle, ono što je on ukazujući na? 50. Zgrabite ga. To je ono što ćemo ispisati. Budući da, sljedeći jedan, mi smo Samo tiskanje x sebi. Što je unutar f? 0x123. U redu. A onda, na kraju, imamo slobodan. Što mi prolazi kako bi oslobodili? Mi prolazi x. Taj put sam stvarno prikazuju je u stog okvira. Tako smo prebacivali vrijednost 0x123 na besplatne. Tako sada slobodan zna, sve u redu, Moram ići na hrpi i bez da je memorija. To se više ne koriste ono što nalazi se na adresi 0x123. Dakle, slobodno će se objaviti da iz hrpe. Sada naša gomila je opet prazna. Mi nemamo curenje memorije. Sada besplatno će se vratiti. Obavijest da je x uvijek 0x123. No, to je sada ne vrijedi memorije. Mi više ne bi trebao dereference x. Da? PUBLIKA: Je li povratak 0 viška? ROB: Je returen 0 suvišno? Da. Upravo smo stavili da postoji, jer imamo povratak jednu za zrak. Dakle, to je kao da, omogućuje uključuje povratak 0. Da? PUBLIKA: [nečujan]? ROB: Tako je nakon slobodnih X, što će se dogoditi ako nastojimo dereference pokazivača? Moguće je da ništa ne pođe po zlu. Moguće je da smo još uvijek ćete dobiti 50. Moguće je, također, da je memorija Trenutno se koristi za nešto drugo. Dakle, to je nedefinirano ponašanje. I nedefinirana znači ništa može dogoditi. Da? PUBLIKA: [nečujan]? ROB: Ne, pa ako ste dodijelili x za nešto drugo. Dakle, ako ovdje smo rekli x jednaka malloc nešto else-- malloc veličina event-- zatim da je izvorni blok memorije nije oslobođen. I mi službeno su ga izgubili. To je otjecanje memorije. Izgubili smo sve reference za taj blok memorije. Dakle, ne postoji način na koji smo ikada može ga osloboditi. U redu, pa onda povratak 0 znači učinio. U redu, tako da Stack Overflow. Što je ideja ovdje? Tako zapamtite, gomila ide prema dolje. Stack ide gore. Dakle, ovo je primjer iz predavanja, Mislim, gdje je glavni samo ide na nazvati ovu funkciju Foo, što se događa kako bi se nazvati rekurzivno više i iznova. Dakle, stog okviri idu raditi isto. Tako ćemo početi s glavnom kao donje stog okvira. Zatim glavna će nazvati Foo, koji će dobiti stack okvir. Zatim Foo će nazvati Foo opet, koji će dobiti još jedan okvir stog. A onda opet, i opet, i opet, i opet sve dok, na kraju, možemo pokrenuti u hrpi. Dakle, to je kako smo dobili Stack Overflow. I u ovom trenutku, što SEG grešku. Ili ste stvarno bih SEG kriv prije Ova točka, ali da. PUBLIKA: Je jezgra deponij isto kao SEG krivnjom? ROB: Tako ćete vidjeti segmentaciju Jezgra krivnja bačena. Dobivate jezgre deponij kada što SEG grešku. I to je kao deponij za sve Sadržaj vaše trenutne memorije tako koje možete probati i identificirati zašto SEG zamjeriti. Da? PUBLIKA: [nečujan]? ROB: Tako znači segmentacije kvara Tu je Stack Overflow. Dakle, ne nužno. Segmentacije greška znači da ste dirljivo memorije na način da ne bi trebali biti. Dakle, jedan od načina da se to dogodi je, kada je što Stack Overflow, počinjemo dira memorije na način da ne bismo trebali biti. Da? PUBLIKA: [nečujan]? ROB: Tako unutar beskonačnu petlju. Kao, to je kao rekurzivni Infinite petlje i tako smo dobili još jedan stog uokviriti svaki put. Ali samo unutar redoviti beskonačna dok one-- dobro, nemojmo ni ispisati f-- nešto učiniti. Što god. Nećemo se da je dobivanje još jedan okvir stog. Samo ćemo zadržati petlje nad ovom jednom pouku. Stog ne raste. To je činjenica da je svaka rekurzivna Poziv daje nam stack okvir. To je razlog zašto smo dobili Stack Overflow. Da? PUBLIKE: Dakle, ako ste rekli da se while petlja, a zatim [nečujan]? ROB: Dakle, ako unutar while petlje došlo je printf, još uvijek bi Ne SEG kriv. Jednostavno nisam htio da se zbuniti stvari. To bi petlje. Ti bi dobili jednu hrpu okvir za printf. Zatim printf će se vratiti. Tada ćete opet bih petlju. Ti bi dobili jednu hrpu okvir za printf. To će se vratiti. Jedan okvir stog. Dakle, niste li ovo beskonačna gomilaju stog okvire. PUBLIKA: [nečujan]? ROB: Da. Dakle, ovo Stack Overflow se događa jer nitko od njih pozivi prema foo vraćaju. Dakle, ako smo se vratili, onda bismo početi gubljenja stog okvire. I onda mi ne bi Stack Overflow. I to je razlog zašto vam je potrebna osnovni scenarij za svoje osobne funkcije. Da? PUBLIKA: Je li moguća veličina i stog za otpatke isti za Svi programi? ROB: Grubo. Je li potencijalni veličina stoga i hrpa isti za sve programe? Grubo. Tu je neki randomizacije do gdje stog počinje i gdje je gomila počinje. Ako vam se dogoditi da imaju puno globalne varijable i stvari, možda ćete odvesti daleko od nekog prostora za svoj hrpi. Na 64-bitnom sustavu, što praktički ima beskonačno memorije. Postoji samo toliko. Između 32 bita i 64 bita, odnosno je značajna razlika. Ti ćeš dobiti puno više stog i hrpa prostora na 64-bitnoj Sustav zato što je samo još adrese koje mogu koristiti. No, na individualnoj sustavu, to će biti otprilike isti iznos stog i gomila prostoru. U redu. Dakle, zadnje što je kompilacija. Dakle, ti bi trebao znati taj proces. Postoje četiri velike korake. Dakle, prvo bi trebalo biti lako zapamtiti. Pred-obrada. Ona ima prefiks pre u njemu. Tako je na prvome mjestu. Stvar koju treba zapamtiti je mljeveno meso. Dakle, mljeveno meso definira i mljeveno meso uključuje u svima. Oni su sve unaprijed procesor direktive. To su stvari koje su prije procesor brine. Dakle, što prije procesor učiniti? To je stvarno glupa stvar. Sve je to u stanju su sve to kopiranja, i izrezati i zalijepiti operacije. Dakle, mljeveno meso uključuje standardne i0 dot h. Što je to radio? To je zgrabio standardnu ​​I0 dot h podnijeti i zalijepiti u vrhu gdje god ona kaže mljeveno meso sadrži standardni i0 točka h. I bilo mljeveno meso definirati koje smo vidi, što se to radi? Njegova kopiranje vrijednost koju mljeveno meso definirano je definiran kao i lijepljenje da gdje god se koristi vrijednost. Dakle Preprocessoru samo da se zapravo jednostavan tekst temelji poslovanje. To ne radi ništa pametno. Dakle, sve ostalo je složeniji. Dakle, sada kada je Preprocessoru učinjeno, mi zapravo sastaviti. Dakle, što to znači sastavljanje? Sada idemo iz c koda do montaže koda. Da? PUBLIKA: [nečujan]? ROB: Da, uhvatili smo to. Dakle sastavljanja. Idemo od c do montaže. Dakle, to je stvarna promjena jezika. Sama Izrada znači ide od više jezika na razini jezik niže razine. I c je jezik visoke razine u odnosu na skupštini. Što je skupština? Njegove upute koje su, prilično mnogo, napravio za svoj CPU. Ali vaše računalo i dalje radi Ne razumijem sklop. On razumije samo nule i jedinice. Dakle, sljedeći korak je okupljanje, koje nam donosi iz tih uputa koje procesora razumije i zapravo prevodi ih, kako bi su nule i jedinice. Dakle C do okupljanja na binarnom. Ali nemam izvršnu još. Dakle, mislim na cs50 knjižnici. Mi smo vam s binarnom za to cs50 knjižnica, koja ima GetString i GetInt i sve to. Ali cs50 library-- i od itself-- nije izvršna. To ne imati glavnu funkciju. To je samo hrpa binarno koje možete koristiti. Dakle, povezivanje je kako smo okupiti sve od ovih različitih binarnih datoteka u stvarni izvršnu. Jedan koji možete upisati dot slash točku van. Dakle, ovo je kao datoteku koju pisao, - bez obzira na vaš program je-- Cezar točka c. Ali sada je bio sastavljen do binarno. Tako Cezar točka o. I ovo je naš cs50 knjižnice binarni. A oni su se u kombinaciji u jednu izvršnu. Da? PUBLIKA: [nečujan]? ROB: Pa prvo su, sjećam se, mljeveno meso su zapravo prije procesor korak. No, to je odvojeno. Ako ne koristite bilo kakve funkcije koje su izvan vaše jednu datoteku onda, Ne, ne morate se povezati ništa jer imate sve. To je rekao, printf je povezan u. Ako ste ikada koristiti printf, to je nešto koji treba povezati u zato što nije napisao da je. A, u stvari, printf je automatski povezani u. Vi znate kako na zapovjednoj liniji ili kad upišete napraviti, vidjet ćete ga imati crtica l cs50, koja ima vezu u cs50 knjižnici? Printf, i takve stvari, ide treba povezati u automatski. Još neka pitanja o bilo čemu? PUBLIKA: [nečujan]? ROB: Povezivanje? Imamo hrpu različite binarne datoteke. To je kanonski primjer da mi koristimo je cs50 knjižnica. Sastavili smo i dati vam na binarno za ovu cs50 knjižnici. Želite koristiti GetString u svom programu. Dakle, idete i koristiti GetString. No, bez mog binarnog koda za GetString, kada sastaviti svoj kod prema dolje, što zapravo ne može pokrenuti svoj Program jer GetString Gudački se još uvijek nije u potpunosti definirana. To je samo kad vam link u mom binarnom koji sadrži GetString da je sada, sve U redu, ja mogu zapravo izvršavanje GetString. Moj dosje je završena. I ja mogu raditi ovo. Da? PUBLIKA: Da li vezna pretvoriti binarni na izvršnu? Dakle, čak i ako nemate drugog knjižnice, ne bi to i dalje biti potrebno prevesti [nečujan]? ROB: Tako izvršna je još uvijek u binarnom. To je samo kombiniranjem cjelinu Gomila izvršne datoteke. PUBLIKA: Hvala ti puno. ROB: Nema problema. Bilo koja druga pitanja? Inače, svi smo mi postavili. U redu. Hvala. [Pljesak] PUBLIKA: Hvala vam. ROB: Da.