JASON Hirschhorna: Dobrodošli A5, svatko. Imamo uzbudljiv tjedan pred nama, uglavnom zato što postoji toliko mnogo novih lica u ovoj sobi. To je divno. Mnogo vas je ovdje slučajno, što je još bolje. Dakle, nadamo se da ćete zadržati pridružio nam se. Ovaj tjedan ćemo provesti Glavnina sekcije priprema za kviz. Dakle, što je po našem dnevnom redu, idemo razgovarati malo o resursima za klasu, ali za kviz, a zatim ponovno provode najveći dio klase pričaju O pitanjima. Nakon što smo učinili da odgovorite na pitanja, ili ako je vaša pitanja naravno, nas dovesti do neke kodiranje, ja ima uzorak problema iz midterms prošlosti da ćemo kodirati uživo u poglavlju zajedno koji također dovesti do neke druge dobre teme na naslovnici. Tako je prvi, kao što smo prošli za Ovih par tjedana da vas podsjetim Dečki, postoje tona resursa dostupni za ovaj tečaj. Mnogi od njih će biti nevjerojatno korisno za vas kao što ste i dalje studija za kviz 0, jer je u utorak poslijepodne. Dakle, svi vi bili studiranje za malo. Tu su bilješke s predavanja i izvor kod koji bi trebali svakako provjerite. Pogledajte kratke hlače. Provjerite study.cs50.net. A onda, navedene u nastavku, broj drugih resursa. Opet, kviz 0 je sutra po jedan. Ako niste već učinili, provjerite out O Kviz 0 dokumenta o Naravno homepage shvatiti gdje ste uzimajući kviz. Kviz počinje u 1:10 i završava 70 minuta kasnije. Dakle, ako se pojavi nakon 1:10, ti si će se da je mnogo manje minuta od 70 da se kviz. Tako bi bili sigurni da ste na vrijeme. Ako ste student ili produženje ima neki drugi razlozi za ispitivanje, što Ne može biti u jednom sutra. Ali opet, provjerite O kviz 0 dokumentirati kako bi bili sigurni da znate kada ti si uzimajući kviz. Napisao sam 75 minuta ovdje. Mislim da je u pravu, a ne 70. Obuhvaća sav materijal od tjedan dana 0 na prošlotjednom predavanju u srijedu. I opet, po ovom kvizu, po koji Dokument, te dobiti jedan dvostrani i 8 1/2 za 11 list papira koji ste dobili koristiti kao bilješke tijekom kviza. Mnogi ljudi, ako ne i većina ljudi, imaju otkrili da sam većina koristan način na studij za kviz je napraviti istraživanje lista, jedan-mo, od svoje vlastite. Pa pogledajte one posljednje, ako da ste vidjeli one prošle. Posegnite za prijatelje kako bi vidjeli što Stavljaju se na njih. No, hands-dolje, najbolji način možete Studija je proći kroz sve te strugati ga na ono što treba ili ne pripadaju tom listu papir, jer to je samo jako koristan način za vas da bi bili sigurni idete kroz sve i imaju neke upoznatost s njim. Većina ljudi, možemo naći, iako su su list papira sjedi uz njih se na test, ne okrenuti na njega, jer je, opet, to je vrlo Proces ide kroz informacije pomogao im da ga nauče. Da li itko ima bilo kakvih pitanja o kvizu 0? Ima sve - Neću raditi predstavu od ruke. Ništa za to. Htjela sam pitati tko počeo studirati. Ali ja ne želim napraviti nije sve podići svoje ruke. Dakle, kao što sam rekao - da, AVI, samo naprijed. AVI: Što će biti korisna stvar staviti na jednu pager? STUDENT: To je do vas. JASON Hirschhorna: Dobivate koristiti svoj sud. Korisne stvari koje treba staviti na jednu pager, Ako ste zbunjeni o velikim O Trajanje različitih vrsta pretraživanja te vrste, pokrij se nalazi u ruci kicoš grafikon. Na taj način, ako ste se pitali kako na kviz, ne morate probati i lik je ili razlog kroz izvođenja. Vi samo možete ga kopirati dolje. Ako pogledate na kvizovima prošlosti, puno puta, tamo je Trajanje pitanja. Tako da će biti primjer dobre stvar staviti na jednu pager. Ostale dobre stvari staviti na, ako ste zbunjeni o tome kako da se proglasi funkcija ili što različiti dijelovi Funkcija deklaracije su, pisanje da tamo, generički verzija i onda možda primjer. Ako ste zbunjeni o tome naputke, dijagram kako pokazivače rad Vjerojatno jako korisno. Ako ste zbunjeni o rekurziju, a kušati rekurzivna funkcija na tu može i dokazati da se stvarno od pomoći. Znači li to da vam dati neke ideje? AVI: Morate shvatiti Cijeli proces izrade, kao i kako se to sve radi? JASON Hirschhorna: Sve koja je bila pokrivena mogli pojaviti na kvizu. Pitanja - ali opet, neke stvari će biti ponderirana jako od drugih. Neke stvari su se opet i opet u razredu, u Predavanje i sekcija. Ostale stvari koje nisu došao do koje često. Razgovarali smo puno o # uključiti i -Ja se nešto i što one znače u Proces kompilacija. Razgovarali smo puno o GDB, drže, one zastavama koje koristimo kada sastavimo nešto, a što make15, na primjer, jako znači i uistinu. Nismo govoriti što više o svaki korak u Proces kompilacija. Još uvijek smo razgovarali o tome. Dakle, to je još uvijek nešto što trebaju biti upoznati s. Ali opet, nećemo biti - stvari koje dolaze češće u razredu su više vjerojatno da će doći do više Često i biti jače vagan na kvizu. Cool. Bilo koja druga pitanja o kvizu 0? U redu, pa sam stavio popis teme na brodu. Prošao sam kroz nastavni plan i program. Prošao sam kroz pregled dionici sinoć i oni slajdovi smisliti s ne-iscrpan popis tema da smo do sada prekriven CS50 i stvari koje bi mogle pojaviti na kvizu. Dakle, ja ne idem kroz svaki od njih. To bi se puno više vremena nego što imamo sada. Ali sam stavio ovo ovdje se nadamo gurkanje sjećanju kao na stvari koje mogu ili možda neće biti upoznat s tobom. I volio bih provesti većinu poglavlje odgovoriti na vaša pitanja o Ove teme, teme koje Ovdje nisu pokriveni. Možemo pisati pseudo kod. Možemo pisati pravi kod kako bi se osiguralo da ste - Ja mogu odgovoriti na vaše pitanje i pomoći svatko iz temelja razumiju Puno tih tema, tako da ćete se osjećati pripremljeni i ugodno ide u Sutra kviz. Tako je čitao preko popisa. Vi nadamo su došli u poglavlju s nekim pitanjima, kao dobro. Kada ste spremni, neka digne ruku pa ćemo početi. Imajte na umu, da imate pitanja, ne postoje glupa pitanja. Čuli smo da je dosta. I pitanja koja imate, ja sam spreman kladiti, mnogi drugi ljudi i sjedim ovdje i gledam online ima kao dobro. Tako da samo može pomoći ljudima postavljajući pitanja. Marcus. Marcus: Između dimnjaka i heap, postoji unaprijed dodijeljeno Postotak memorije koja se definira kao ovo je za stog ili za otpatke? Ili kako to ide, točno? JASON Hirschhorna: Veliko pitanje. Idem natrag u tragovima malo. Da li se svi - budite iskreni. Znam ja te pitam za podizanje svoje ruku pred svojim vršnjacima. No, postoje ljudi koji se osjećaju neugodno s dimnjaka i hrpu , a željeli ići preko toga i što one znače? Podignite ruku ako je - OK. Hvala Vam. Tako ćemo ići preko dimnjaka i heap jako brzo, a zatim preseliti u odgovaranju na vaše pitanje. Dakle, ako ćemo izvući kutiju za zastupanje memorije na vašem računalu, što su neke stvari koje idu u ovoj kutiji? Glavni. Glavna funkcija. Odakle glavna ići? STUDENT: [nečujan]. JASON Hirschhorna: pa ćemo stavi glavni ovdje. Što još ide u ovu kutiju? STUDENT: Funkcije koje vi zovete. JASON Hirschhorna: Funkcije koje mi zovemo. A gdje su nestali? STUDENT: U dimnjaku. JASON Hirschhorna: Oni ići u snopu. Tako ćemo zvati stvar ovdje dolje stog. I do vrha, imamo hrpu. Dakle, memorija nije box baš kao što je ovaj. Ali, to je zapravo prilično slični. To će biti puno više od kutije i više, ovisno o tome koliko je velik vaš Računalo je ili koliko je velik vaš memorije. Na quote-Citat završen "dnu" je dimnjak. A tu su i više stvari da ide na stog. I oni ovise o funkcijama imate u svom kodu. Uvijek imate jednu funkciju u vašem Kod zove glavni, tako da se uvijek poglavlje ovdje u stog posvećen glavna. Ti dijelovi u dimnjaku se zove stack okviri. Kad nazovete drugu funkciju, kažu glavni naziva binarno funkciju pretraživanja, stavimo još jedan okvir na stog. Konkretnije, mi smo idući u donirati komad memorije na našim Računalo za pohranu binarno pretraživanje lokalnom varijable i pokrenuti binarni traži kod. Tako mi zovemo binarno pretraživanje. U ovoj komad memorije, idemo pohraniti svoje lokalne varijable. Idemo se spremiti svoje printf pozive. Što god se dogodi, da je funkcija će biti pohranjena tamo. Binary search će izvršavati. To će završiti izvršenje. Ono što je riječ u C koji označava da funkcija treba dovršiti njegovo izvršenje? STUDENT: Povratak. JASON Hirschhorna: Povratak. Dakle, kad god vidim izjavu povratka, funkcijske završava kada pogodi koja. Dakle binarno pretraživanje će pogoditi njegov povratak. Ovaj dio memorije neće biti se oslobodio. A glavna će se vratiti na izvršenje. Dakle, glavna će pauzirati gdje god bio, poziv binarno pretraživanje, dobiti neki povratnu vrijednost, i nastaviti izvršenje. Ovaj stack frame će otići. Ako mi zovemo rekurzivna funkcija, koji je funkcija koja sebe naziva više i više, možemo dobiti - rekao nam učinio binarni pretragu rekurzivno. Možda se i binarno pretraživanje verziju jednu, pretraživanje po binarnom dva, binarno pretraživanje tri, pretraživanje po binarnom četiri, pretraživanje po binarnom pet. A onda je to konačna pretraživanje po binarnom pet će pogoditi osnovni scenarij, i snop okviri će se vratiti i zadržati zatvaranje dok se ne vratimo na glavni. Možemo ići preko rekurzije u malo. No, sve je to reći, ako ste pozivanje više funkcija u vrijeme, Bit će višestruki stack okviri na stogu. Heap, s druge strane, do ovdje, nije za funkcije, ne za lokalne varijable. To je za dinamički premješta varijabli. Dakle, to su varijable koje mogu biti inicijalizirati bilo glavno ili funkcija koja glavne pozive. Bilo gdje u kodu, oni može se ponište. I inicijalizirati dinamički dodijeljeno promjenjiva. Što je funkcija u C koristimo? STUDENT: malloc. JASON Hirschhorna: malloc. Možete pozvati malloc. Možete dobiti prostor memorije. A taj prostor memorije je na hrpi. A taj prostor memorije ostaje tamo dok vi zovete besplatno. Dakle dinamički dodijeljene varijabli u heap će postojati dok god vama želim im da postoje, a oni neće odem dok je izričito reci im da odu. Možete ih napraviti u jednoj funkciji. Tu funkciju je stog Okvir će otići. Ali to promjenjiva i dalje će postojati u hrpi dok se ne oslobodi, potencijalno funkcijom koja se zove pretraživanje po binarnom ili što god. Pa ti hrpu varijabli ostati tamo koliko god želite im da ostanu tamo. I oni bi stavili ovdje. I onda sljedeći dobiva tamo stavio. Oni držati uzimajući popunjava, a oni ostati tamo sve dok ne zvati besplatno. A u biti, hrpa i stog, uzimajući Marcusu pitanje, rastu prema drugome. A ako su pokrenuti u jednu drugu, ste potrošili svu memoriju u računalo, a vaš program će prestati zato što nemam više memorije lijevo koristiti. Između njih postoji potencijalno druge stvari. No, za opseg ovog tečaja, te ne morate brinuti o tome. Dakle, to je bio odgovor na vaše pitanje. Ne brinite za to. Ali to je bilo davno odgovor. Sve što trebate znati je hrpu i hrpu - jedna počinje na dnu. Stog radi. Hrpa je tamo gore. Oni će rasti bliže jedan drugom. A ako se dotakne, to je problem. Pobjegao si iz memorije. No, isto tako, osim znajući gdje oni su, što je pohranjena u oba stog i hrpa. Curtis. Curtis: Kad se sudare, je da stack overflow? JASON Hirschhorna: Kad se sudare, to nije stack overflow. Stack overflow je drugo područje da možemo ići preko ako želite. U redu, vratit ćemo se na to u malo. STUDENT: Što je riječ zove kad su hit jedni druge, stog i hrpa? JASON Hirschhorna: Za sada, ne brini se. Dovoljno je znati - Ja ću odgovoriti na to pitanje nakon predavanja. Ako im se miješaju, što ponestalo memorije, jer nema više Prostor postoji. STUDENT: Nažalost, ono što je kriv seg? JASON Hirschhorna: segment krivnja može biti pozvan na - to ovisi zašto zove se SEG krivica je. Ponekad, vaš stack overflow, to ću kažu seg fault kao pogreška. STUDENT: Što o dereferencing null varijabla? Je li to krivnja seg? JASON Hirschhorna: Dereferencing null pointer - U redu, tako da ako imate pointer koji vas izjednačenje na nulu, pokazivače, podsjetimo, Trgovina memorijske adrese kao svoje vrijednosti. I null pointer je u suštini skladištenje 0, 0-og rješavanje u toj varijabli. Dakle 0x, 0, 0, 0, 0, et cetera. Taj 0-og adresa u memoriji to nije u našoj slici, to je tamo gore negdje, koji je rezerviran za računala. Mi ne smijemo dirati. Dakle, kada je vaš program se izvršava, ako je nešto pokušava ići u memoriju adresa 0, ona zna da da je prazna vrijednost. Ona ne zna ništa trebao biti tamo. Dakle, ako ste probati i koristiti nešto postoji i liječiti nešto slično postoji ili Pokušavam ići na to mjesto, ti si će dobiti SEG kvar ili pogreška. Je li to odgovor na vaše pitanje? A sad ćemo se vratiti stog preljeva. Stvari u dimnjaku, što vi imate vidio prije, u - idemo izvući izbliza se u stogu okvira. Može li svatko vidjeti da? Dakle, mi imamo stog okvir. Štedimo niz u što lokalna varijabla u ovoj funkciji. Tako kažu naši polje ima pet mjesta. Svih pet onih koji će biti pohranjeni u tom stog okvir. Ako počnete pisati izvan Granica u ovom polju - pa ako ćemo početi pisati u, recimo da je 0. To su pet indeksa našeg niza. Ako počnete pisati u indeks 5, koji je nemamo kada imamo Niz veličine 5, možemo početi pisati u Indeks 6, 7, 8, 9, možemo dobiti Stack Overflow pogreška. Općenito to nije - vjerojatno ćete dobiti u nevolji ako idete preko po jedan. No, općenito, što će se u najveći problem, ako idete preko po mnogo i idete do sada preko toga što pišete preko povratnu adresu koja funkcija, koja se nalazi na dnu snopa okvira. Jer, zar ne? Ti - u - žao. Ne ", jer u pravu." U stog okvira, imate Vaši lokalnim varijablama. Na samom dnu snopa Okvir je povratna adresa. To je mjesto gdje je funkcija ide kad je gotovo. A ako prebrisati taj povratak adresa, onda kada se to stack frame, kad ideš kroz dimnjak kadriranje i izvršavanju svaku crtu, ti si ići na novu povratnu adresu koji je napisao tu umjesto Stvarna jedan. A to je kako smo vidjeli neki narušavanja sigurnosti može dogoditi s računalima. Dakle stack overflow, ukratko, kada je li prebrisati dio u snopu ti si trebao koristiti, lokalna promjenjiva ste trebali koristiti, a pogotovo kada počnete prepisati važne stvari kao što su povratak adresu. I to je mjesto gdje ćete dobiti greška. Ili možda čak mogli početi čak i pisanje u - kažu binarno pretraživanje je iznad glavne. Ako prepisani preko puno, ti mogao pisati u glavni. No, općenito, dobijete pogrešku prije zatim, jer računalo zna radite nešto što Ne bi trebao biti događaj. Da. STUDENT: Koja je razlika između stack overflow i buffer overflow? JASON Hirschhorna: Buffer overflow je više općenito vrsta ono što sam upravo opisao. UČENIK: Pa stack overflow je Primjer pufera preljeva. JASON Hirschhorna: Točno. To je niz možemo zamisliti kao tampon, prostor za stvari koje idu u. To je stack buffer overflow. Mogli bismo imati gomilu buffer overflow. Ako postoji tampon, koji tamo često je niz gomila, a mi prepisani preko te granice, onda bismo imaju hrpu buffer overflow. I izvan opsega ovog tečaja, oni su otkrivena malo drugačije. Sastavljač ima poseban načini otkrivanja svaki. Ali buffer overflow je više općenito vrsta što sam opisao, što je stack buffer overflow. Je li to odgovor na vaše pitanje? Sweet. Je li bilo kakvih drugih pitanja koja se odnose na dimnjak ili u gomili? Da. STUDENT: Znam da su na slobodne žice zato jer su u gomili a vi ne želite da se curenje memorije. Ali moraš osloboditi globalne varijable i takve stvari? Ili su oni automatski oslobođeni? JASON Hirschhorna: Dobro pitanje. Tako je u CS50.H, mi stvaramo ovu stvar za vas zove niz. Niz je stvarno ono? STUDENT: Char zvijezda. JASON Hirschhorna: char zvijezda, pokazivač do znaka pokazivač niz znakova. To je ono što je struna. Dakle, moramo ga osloboditi, jer getstring, koje smo koristili puno - Naziv niz jednako getstring - da mallocs za nas neke memorije na gomila, a zatim se vraća pokazivač na Prvi znak da je string, char zvijezda. Dakle, navodno, ako niste bili pisanje besplatno na bilo koji od vaših žice koje ste do sada zove, imate curi malo memorije. Naravno, nismo razgovarali o tome to, pa nitko nije stečen u Problem za to. No, ide naprijed, da. Kada zovete getstring, ti si mallocing neki prostor na hrpi. A ako ne nazovite besplatni kasnije da string, imate otjecanje memorije. To odgovoriti na vaše pitanje? Da UČENIK: Pa za to, mi koristimo besplatni neposredno prije povratka? Kao, u okviru, pretpostavljam, ako kažemo, kao što su, int main, u roku Opseg koda koji je u roku od onih vitičastim zagradama, neposredno prije - znate gdje biste obično stavljaju povratak. Da li staviti besplatno prije toga? JASON Hirschhorna: Tako možete staviti besplatno gdje god želite staviti besplatno. Budući da ti dinamički alociraju varijabli, jer oni mogu žive izvan okvira posebice funkcija, ako poziv malloc u odvojeni funkcija, na primjer, getstring, možete nazvati besplatno u glavni. Vi ne morate ga zvati u određenu funkciju gdje malloc se zove. No, to ne treba da ga zovu Prije glavne vraća. I to stvarno ovisi. To ovisi o tome zašto ste malloced da prostor na prvom mjestu. Neki ljudi će pozvati osloboditi prilično brzo. Neki ljudi neće slobodno nazvati dok kraj svog programa. I oni će proći kroz i slobodno sve. To ovisi o tome zašto se zove malloc. STUDENT: A što bi ti rekao ako nazvao koristiti getstring? Reći ćete besplatno što? JASON Hirschhorna: Dakle sintaksa besplatno jednostavno je slobodna, otvorena zagrada, u neposrednoj blizini zagrada, i ime pokazivača. Dakle, ako ste napisali string ime dosegne getstring, stavite ime ovdje. To je naziv pokazivača. A zna se osloboditi tog sjećanja. STUDENT: Dakle, kada se oslobađa tog sjećanja, pokazivač dalje ukazuje na to mjesto u sjećanju? Ili je pokazivač se isprazni od adresa koja ukazuje na. JASON Hirschhorna: Trebali bi pokušati. Mi bi trebali kod koji. Ajmo se vratiti kad dođemo na kodiranja, i neka je kod koji. A ako želite shvatiti odgovor da da, možete i kod koji u međuvremenu. No, to je veliko pitanje. STUDENT: Je li moguće besplatni nešto prerano? Znači li to i dalje potrebno za vaš program, i oslobodio taj prostor memorije? JASON Hirschhorna: Da. To je moguće, ako se nešto besplatno i onda ga ponovno koristiti, od vas će upasti u pogrešku. No, to je na vama, jer ste oslobođeni nešto, a zatim ga nazvao kasnije. Tako da je programer je pogreška. No, da. Moglo bi se napisati da. Bilo više pitanja o - Da. STUDENT: Dakle, ako ste trebali samo osloboditi ga uopće prije Program završava, znači li to da, ako Program završava, a vi to ne oslobodi, da je memorija još uvijek je dodijeljeno? JASON Hirschhorna: Ako je vaš program završava a vi zaboravite nešto besplatno, a zatim da je memorija je dodijeljena tijekom trajanja vašeg programa. Kada vaš program zatvara u potpunosti, da memorija ne ide tamo ostati zauvijek. Računalo je dovoljno pametan da zna da kada program zatvori, to trebao riješiti sve memorije koja je povezan s tim programom. No, tu su i alati koje možete izvoditi na programu otkriti ako, kada Program je završio, zaboravio si osloboditi nekih stvari. A za svoj sljedeći problem postaviti gdje ćete koristiti malloc i pomoću naputke, što će se prikazivati ​​ovaj programirati na vašem programu da vidi je li, kada je glavni vrati, imali ste neke stvari koje su ostavili unfreed. Dakle, oni se ne ide ostati malloced zauvijek u vašem računalu. Da bi razoran, jer Vrlo brzo, računala bi ponestane memorije. No, ako su pokrenuti do kraja svog programirati i oni ne oslobodi i vaš Program izlazi, to je još uvijek problem da je ovaj alat će vam pomoći da se obratim. STUDENT: Je li to Valgrind? JASON Hirschhorna: To je zove Valgrind. A vi ćete biti - UČENIK: Ali ne moramo znati da je za kviz, iako? Mislim, to je govorio o malo u predavanju. JASON Hirschhorna: Pa Valgrind je naziv tog alata. Znajući što je to ipak dovoljno za kviz. Ali niste ga još koristio na vašem Problem postaviti jer nismo imali Problem set koji je izričito bavila s malloc ili koristite malloc. Dakle, niste koristili Valgrind još. No, što će ga koristiti prije nego kasnije. STUDENT: Možete li ponoviti ono Valgrind je? JASON Hirschhorna: Žao mi je? STUDENT: Možete li ponoviti što Svrha Valgring je? JASON Hirschhorna: Valgrind je naziv - kao GDB vam pomaže ispravljanje svoj program, Valgrind pomaže vam shvatiti ako stvari nisu oslobođeni kada vaš program zatvara. Tako ćete izvoditi na vašem programu. I vaš program izlazi, a to će reći: vaš program zove malloc to mnogi puta da bi ove bajtove, a vi samo da se zove slobodna je ovdje više puta. I tako ste napustili ove mnogo bajtova bez da su oslobođeni. Ili ćete reći da ste oslobođeni sve. Dobar posao. STUDENT: U redu. I to se zove Valgring? Jason Hirschhorn: V-l-G-R-N-I-D. STUDENT: pitanje o naputke. Dakle, reći da je n su zvijezde x iznosi nešto. To je jednako, bez obzira što stavljajući postoji, je li to ono što je se stavi u ono x upire prstom, ili pointer x? JASON Hirschhorna: Može li ponoviti pitanje? Možemo ga izvući, a vi to rekli? STUDENT: U kvizu, zapravo, ona koju nam je poslao, to je bilo kao, char Zvijezda istina jednaka CS50 stijena, zar ne? Dakle, to znači da ta CS50 stijena je ono što je istina je pokazujući na? JASON Hirschhorna: Pa vi pričate o char zvijezda u nizu, kako koji radi? Da. OK. Idemo izvući ovo ovdje. [STRANA RAZGOVOR] JASON Hirschhorna: Dakle ova varijabla će biti tipa char zvijezde. Kolika je promjenjiva tipa char zvijezde? Koliko bajta? STUDENTI: Četiri. JASON Hirschhorna: To je četiri bajta. Koliko prava je varijabilna tipa int zvijezde? STUDENTI: Četiri. JASON Hirschhorna: Četiri bajtova. Ako je pointer, onda je uvijek četiri bajta, jer pokazivače, njihova vrijednost memorijske adrese. I memorijske adrese na CS50 Uređaj su četiri bajta. Pa kad mi zovemo getstring, ili kad smo recimo, stringname jednako, a zatim u dvostruke navodnike staviti string, stavljamo - dobro, to je malo drugačije. Učinit ćemo getstring kao primjer. Ili char star nešto iznosi niz. Žao nam je, daj mi primjer koje ste pročitali? STUDENT: char zvijezda istina jednaka "CS50 stijena" u navodnicima. JASON Hirschhorna: Dakle ova zvijezda, to ćemo nazvati ovu varijablu x za naše generička svrhe. Stvorili smo varijablu x. To je tip char zvijezda. To je kazaljka na nizu znakova. Dakle ovdje - Pa to je, kako bi to raditi u sjećanju. To će pohraniti memorijsku adresu. To bi pohranjivati ​​memorijsku adresu Prvi znak u polju. I onda kad slijedi pointer, što bi dobili prvi znak. A ako čitate ovu stvar kao string, vaše računalo je pametna dovoljno da znam, pročitao cijelu stvar dok ne dođe do zatezanje 0. Ali, ako ste čitajući ga lik na vrijeme, tako da ste iterating kroz ovaj niz, onda ćete samo čitati lik u isto vrijeme dok ne dođete do backslash 0. To ne bi mogli odgovoriti na vaše pitanje, ipak. STUDENT: Da, ali nisi malloced taj prostor ali za taj pointer. JASON Hirschhorna: Pa nisam baš siguran upravo ono što tražite u, jer nisam bi taj kviz. To je trebao biti od pomoći resursa iz drugog TF. Ako stvarate niz na stog ili kao lokalne varijable, to ću Samo se niz optužbi, a ne općenito char zvijezda ukazujući na još jedan niz. No, ja ne znam. To bi mogao biti pointer na drugi string na stog kao dobro. Da. STUDENT: Znam da vam je potrebno da se alocirati memoriju, ako je pokazivač uzimajući proglasio unutar druge funkcije. Da li je potrebno učiniti istu stvar, ako je to proglašenja unutar glavna, ste ga koristite unutar glavna? JASON Hirschhorna: Pa da. Možete proglasiti pointer na bilo memorijske adrese u memoriji. To može biti memorijske adrese lokalne promjenjiva, iako često, ljudi ne proglasi memorijske adrese lokalnim varijablama, jer oni idu daleko je jednom da je funkcija vraća, što Zato mi općenito malloc stvari. Ali, da, mogli proglasiti pokazivač na drugu lokalne varijable. To je samo općenito nije učinjeno. Ali mogu se pogledati na koji specifična stvar poslije sata. Da. STUDENT: Mislim da je to neka vrsta onoga što se traži. To se čini čudno da se inicijalizacije pokazivač ne kao adresa, ali kao što Čini se kao vrijednost. Čini se kao CS50 je ono što je unutra stvar se ukazao i ne stvarna adresa, zar ne? JASON Hirschhorna: Pa to je nije slučaj, iako. To nije ono što se događa. Kada proglasiti char zvijezdu, to je memorijska adresa. Kazaljke su sve memorijske adrese upućuju na nešto drugo. To nešto drugo moglo biti na stog, ali gotovo uvijek je na gomila na putu ćemo vidjeti što je nekad. Ali stringname jednaka dvostruko citat "Getstring", možemo vidjeti da se i mi može gledati kroz to i kod koji. getstring pojam nije se spremaju u da je promjenjiva, ili što god string ime nije se sprema u koje promjenjiva, a ne zato što ih pokazivače raditi. Ima li to smisla? STUDENT: Da. JASON Hirschhorna: OK. Nadam se, da nije bilo zbunjujuće za svakoga. Ali, ako je to, možemo gledati na to opet u malo, jer mi zapravo ide da kod nešto što će, nadamo se raditi sa žicama i pomoći vam da se osjećate više ugodno s njima. Bilo koja druga pitanja vezana za njih teme ili druge teme koje Stavit ću natrag? I - upravo sada. Da, Alden. ALDEN: Dakle, to je potpuno nevezano, , ali možemo samo ići preko jako brzo ono što trebamo znati o razlici između 32 i 64-bitni stroj? JASON Hirschhorna: Da. Pa 32 bita je koliko bajtova? ALDEN: To je četiri bajta. JASON Hirschhorna: To je četiri bajta. I 64 bita je koliko bajtova? STUDENT: Osam. JASON Hirschhorna: Osam bajtova. Pa opet, osam bitova je jedan bajt. Vaš CS50 aparat 32-bitni stroj. Dakle memorijske adrese četiri bajta. Postoje 2 do 32 memorijske adrese. 0 do 2 do 32 minus 1. A ja nisam pozitivno, ali to je Vjerojatno opseg onoga što vam je potrebno da se Znam za 32-bitni stroj, da je memorija adrese su, opet, četiri bajta, i da je maksimalni iznos memorijskih adresa. Također, vrste podataka - to bi moglo biti nešto kao dobro da je vrijedno spomena. Veličina ovisi o tipu podataka stroj radite sa. Dakle char, jedan znak, kako mnogi bajtova na našoj CS50 aparat? Jedan bajt. I to je zapravo jedan bajt kao i na 64-bitnom stroju. I većina tipova podataka su isti broj bajtova na oba računala. No, neke vrste podataka će biti drugačije na oba računala. Dakle, to bi bilo potencijalno Jedina stvar koju trebate znati. No, čak i da je, mislim, je izvan granica - Gotovo sam pozitivno, ako se osvrnemo na starim testovima, ona kaže, pretpostaviti kodiranja probleme koje koristite 32-bitni stroj. No, tu su, kako bi se s tim u slučaju da ste zainteresirani, postoje vrste podataka koji su isti veličina na svim strojevima. Ako ste vidjeli nešto slično uint32_t, vi svibanj ili svibanj nisam vidio da je. To je tip podataka. To je rekao, biti 32 bita bez obzira ono što stroj to uključen. Dakle, kada su ljudi pisanje prenosivih code, oni vjerojatno neće koristiti Ints. Oni umjesto da ćemo koristiti ove i druge podatke Tipovi koji znaju da će biti isti veličina na svakog pojedinog stroja. Madhu. Madhua: Imao sam pitanje o Proces kompilacija. Dakle, ako ste pisanje programa koji koristi Knjižnica kao CS50 ili nešto kao što je to, znam da je ta knjižnica mora, u nekom trenutku, biti sastavio i povezane u. No, koliko se to dogodi za vrijeme kompilacija vašeg programa? Koji dio tog procesa knjižnice javlja kada ste sastavljanju vlastitog programa? JASON Hirschhorna: Dakle, idemo preko općenito koraci ovog postupka. Možete napisati. C datoteku. U Vašem. C datoteku, # uključivati ​​Vaše zaglavlje knjižnice, na primjer, cs50.h. Što znači da je oštra uključuju linije učiniti da vaš program? Akchar. AKCHAR: Ona dodaje prototipove funkcije iz zaglavlja datoteke u knjižnicama. JASON Hirschhorna: Točno. Ona dodaje ta funkcija prototipova na kodu. Dakle, kada je vaš broj se prikupljaju u ranim fazama, prevodilac zna da ove funkcije doista postoje, a da negdje su definirani. The. H slika ne uključuju definicije za te funkcije ili kako oni zapravo rade. Cs50.h samo uključuje nešto što kaže getstring je prava stvar da može dogoditi. I standardio.h kaže printf je Prava stvar koja se može dogoditi. Dakle, vaš c jezik s tim. Header datoteku dobiva pretvorio u neke strojno čitljiv kod, koji je na kraju dobiva pretvorio u binarnom code, 0-a i 1-a. I to je kod koji u konačnici dobiva pogubljen. -L CS50 linija - primjerice, kada pišete Dong - a onda su-l CS50, Možete da u. A vidiš da je. Kada pišete napraviti, vi ćete vidim tu crtu ovdje. I vidjet ćemo da se u trenu kada je smo kod ili nešto kasnije, kada smo kod. Ali to-l CS50 linija radi nešto malo drugačiji od je # include cs50.h. Što to-l CS50 linija učiniti? Avi? AVI: Želim reći da je to povezuje Knjižnica na funkciji poziv, kao i potrebama. o datotekama. JASON Hirschhorna: Dakle, vrlo blizu, ako ne i na licu mjesta. -L CS50 uzima binarnu datoteku i spaja ga sa svojim binarne datoteke. Dakle cs50.h, nema smisla u pretvaranju cs50.h iz C jezika u binarni svaki jedini puta da je se koristi. To bi bilo glupo, jer to će trošiti mnogo vremena. Tako je već sastavio i pretvorio u izvršnu. A sada će to biti pripojena s datoteci na kraju. Pa ti 1 i 0 je idući spojiti s onima i 0-a na kraju. Tako sada ćete imati zapravo stvarna 1 i 0 koji definiraju kako getstring, primjerice, radi, ili kako printf, na primjer, radi. A za više informacija, postoji kratke prevodiocima da Nate daje da trebali provjeriti da ide kroz ove korake. Ali - Da. STUDENT: Jesu li oni uvijek u o datotekama. kad su u obliku knjižnice, spreman da se spojio, povezani - kao oni su u binarnom kodu? JASON Hirschhorna: OK. Ono - STUDENT: Je li to uvijek slučaj knjižnice kada ih povezati? JASON Hirschhorna: Da. Tako postoji. Je slika, koja će biti Kod stroja, koji će također biti zagonetan za vas. Vi ne morate brinuti o onima. No, općenito, da, oni će biti u. o datoteke spreman ići. UČENIK: Pa kada se brod na knjižnica, ti samo brod . hi. o? Vi ne brod. C ili. S.. JASON Hirschhorna: Dakle - i to je u ovom kratkom, kao i, ako je ova informacija čini se da dolazi malo brže. Ali na kratko prevodiocima govori o tome što je dobro. Kada brod knjižnicu, ako brod . h, zaglavlje datoteke, one funkcija prototipovi, i 1-a i 0-a, to je sve što vam je potrebno dati. Ne morate dati koliko funkcija radi,. c sliku. Jer točka apstrakcije, ili ukazuju API, točka na ovom SPL, Stanford prijenosni knjižnica, to je za koju se ne brinem o tome kako novi GRect radi, ili kako se presele djela, ili kako dodavati radove. Sve što trebate znati je da dodatak je funkcija koja možete koristiti, a ne ovo. Tako da stvarno ne treba znati kako to je zapisano u C. trebate samo Znam, ovdje su funkcije, što učiniti, a ovdje su 1 i 0 je kad stvarno želite ih koristiti. Cool. Bilo više pitanja o prevodiocima ili o drugim temama na brodu? STUDENT: Imam pitanje provedbi rekurzivni funkcije. Pitanje o rekurzije. Imao sam osjećaj da će doći do. Tako ćemo brzo proći rekurzija sa specifičnim primjer, faktorjela funkcija. Budući da je ovo primjer koji Često dolazi ili se koristi za ilustraciju rekurziju. Dakle, "4!" čita se 4. faktorjela. A što 4 faktorjela znači? Što da radim? Kako ste izračunali 4 faktorijel? 4 puta 3 puta 2 puta 1. Tako je još jedan način za pisanje 4 faktorijel je napisati ovo. 4 puta 3 faktorjela. Zbog 3 faktorjela je 3 puta 2 puta 1. Dakle 4 puta 3 faktorjela je 4 puta 3 puta 2 puta 1. To je razlog zašto faktorjela je super Kandidat za rekurzije, jer je jasno da ne postoji nešto što događa iznova i iznova i na Manji broj stvari dok dođete do kraja. Kada dođete do 1, 1 faktorjela je 1. Ne možete ići mnogo dalje. 0 faktorijel također je definirana kao 1. Dakle, kad dođete do 1 ili 0, ti si na kraju, i možete početak ide natrag gore. Dakle, ako bismo htjeli napisati rekurzivna Funkcija za izračun faktora, ćemo napisati neke pseudocode za to sada. Prije nego što smo napisati da pseudocode - Ja ću vam dati dečki par minuta pisati pseudo koda ili samo misle o tome - postoje dvije stvari koje svaka rekurzivna funkcija treba. Što su te dvije stvari? JACK: To se mora zvati. JASON Hirschhorna: Noah? Oh, Jack. Samo naprijed. JACK: To se mora zvati. JASON Hirschhorna: Dakle rekurzivna funkcija treba rekurzivni poziv, pozvati k sebi. To je jedno. I ono što je druga stvar? JACK: osnovni scenarij. JASON Hirschhorna: osnovni scenarij. Osnovni scenarij je, evo, kada smo zaustavili. Dakle, vaš funkcija dobiva zove. Baza slučaj na prvom mjestu. Želite li znati ako ste na kraju. A ako niste na kraju, što bi vaš rekurzivni poziv. A ti proći kroz tu funkciju ponovno, Ponovno provjerite svoj osnovni scenarij. Ako niste na kraju, što bi još jedna rekurzivna poziva, i tako dalje, i tako dalje. Zato rekurzivna funkcija uvijek treba mi baza slučajeva i onih rekurzivni pozivi. Ako nemate rekurzivni poziv, da Ne bi se rekurzivna funkcija. Ako nije imao osnovni scenarij, što će ići zauvijek i ne bi bilo ni kraj. A osnovni scenarij je uvijek na prvom mjestu, jer ćete uvijek želite provjeriti ako ste na kraju prvog. Dakle, prije nego što smo napraviti neke pseudocode, zašto ne uzmete malo vremena za razmišljati o tome Kako rekurzivna funkcija faktorjela će biti napisan? Isto tako, koliko god radite, pisanje to na papiru je što ćete morati učiniti na test sutra. Dakle, vjerojatno je dobra praksa da bi sigurni kod pišete dolje na papiru - ili možete to učiniti. Vi znate gdje su zarezom. Sjećaš sintaksu. Budući da ne mogu imati prevodilac reći da je napravio pogrešku. Također, uz one linije, sutra, kad ste kodiranja probleme, ako su požurili na vrijeme, ili ako si jako zbunjen kako ste trebali napisati određenu stvar u Cu, će vam biti potreban pisati pseudo-koda ili pisati komentare u, kao dobro. Budući da postoji djelomična kredit za puno pitanja na kvizu. Dakle, možda ćete biti jurnu, ili ste Možda samo treba miješati. U članku objavljenom u komentarima ili pseudo-koda često su načina na koje mogu dobiti djelomična kredit. Dakle, ne ostaviti nešto prazno na kvizu. Nema kazne za stavljajući stvari u. Naime, stavljajući u pseudo-koda ili komentari će pomoći grejderom shvatiti ako stvarno znate što pričaš, a možda i nagradu što su neki parcijalni kredit za to. Također, uz one linije, pisati jasno. Ako ne možemo je stvarno ono što pišete, nećemo vas zvati u ponoć sutra na slici ono što ste napisali. Samo ćemo poletjeti bodova. Pisanje je jasno kako možemo čuti, ili bolje rečeno, možemo pročitati ono što je napisao. A ako on kaže dvije rečenice, nemojte napisati odlomak. Slijedite upute. Pisanje je jasno. I napisati u tim komentarima ili pseudocode za pitanja koja su mogla Nagrada djelomično točne. U redu, idemo na faktorjela. Tako imamo funkciju faktorijel. Ako mi je to zapravo pisati ovo u C, Što mi treba staviti ispred imena funkcije? Povratni tip, koji je, u to slučaj, mi ćemo mu dati int. I onda unutar vitičastih zagrada, je što se događa unutar vitičastih zagrada za funkcija? STUDENTI: Vrsta argument. JASON Hirschhorna: Njegovi argumenti. Dakle faktorjela će vjerojatno uzeti argument. To će vjerojatno trajati samo jedan argument. I mi ćemo reći da ću uzeti cijeli zove x.. A opet, kada pišete u prototip funkcija ili pisanje funkciju u kodu prije ga definira, te pisati o vrsti podataka i ime da je varijabla za samo tu funkciju. Na taj način možete proći neki broj u ovo funkcija, to će se naziva x interno. Mi imamo faktorski funkciju. Trebamo dvije stvari, a osnovni scenarij i rekurzivna poziva. Koji je osnovni scenarij za faktorjela? Netko tko ga je napisao out a tko nije govorio još, što je osnovni slučaj za faktorjela? UČENIK: Ako je n manje od 2, vratiti jedan. Jason Hirschhorn: Ako je n manje od 2, vratiti jedan. To mi se sviđa, jer je to vodi brigu o 0 i 1. Dakle, mi ćemo učiniti x <2, vratiti jedan. Ako se prošli smo 0, ako smo dobili prošlo 1, ova funkcija će odmah vratiti jedan. Ako bi mi donijela neki broj veći od ili jednaka 2, idemo u imamo rekurzivni poziv. I tako kako je da ide na posao? Može li netko drugi tko je radio na tome koji još nije govorio mi rekurzivna poziva za tu funkciju u pseudocode? Ako bi smo prošli u broj X i to je veće od 2, što Ne želimo učiniti? Također smo primjer napisano na strana koje bi vam dati savjet. STUDENT: Poziv x puta faktorijel x minus 1? JASON Hirschhorna: Točno u pravu. Mi ćemo se vratiti x puta faktorijel x minus jedan. I da, iako sam napisao gore, Uglavnom, ono što je rekao na engleskom jeziku, ovo faktorjela funkcija će se ponovno pozvao. To će izvršiti na x minus 1. To će se vratiti s nekim cijeli broj, a onda ćemo pomnožiti ova dva zajedno, te da vrijednost će biti vratio se god zove to faktorjela, koja možda biti još jedna instanca ovo faktorjela funkcija. Dakle, to je primjer rekurzivna funkcija, vrlo Jednostavan rekurzivna funkcija. No, većina njih će biti ovako. Ako želite dobar rekurzivna izazov za kviz, pokušajte kodiranja pretraživanje po binarnom rekurzivno. Jer ako je binarni potragu za Problem postaviti tri, vjerojatno je to učinio iterativno u while petlji. Ali također može biti napisana rekurzivno. Ti ćeš morati napisati svoj zasebna funkcija koja uzima neke različite argumente naredbenog retka - ili ne naredbenog retka argumente, neki različiti samo redoviti argumente. No, da bi mogao napisati binarno pretraživanje rekurzivno kao dobro. UČENIK: Pa mogao si i napisao, umjesto x minus 1, što mogao bi napisali x minus minus, ili ste mogli imati napisano minus minus x. Možeš li objasniti zašto se jako brzo oni će biti različite stvari, kao što je razlika između x minus minus i minus minus x? JASON Hirschhorna: Ne, ja nisam će ulaziti u to. No, ja ću razgovarati s vama o tome nakon što klase. x minus minus, minus minus x dekrementirati x za 1. Ali oni to malo drugačije. Ali ja ne želim ulaziti u to. Ostala pitanja o rekurzije ili ova funkcija? To zapravo nije ni pseudocode. To je u osnovi kod u C te će pisati za to. OK, bilo koja druga pitanja o temama ovdje? Da. STUDENT: Imam brz rundown pomičnim zarezom i preciznost. JASON Hirschhorna: Plutajući točku i preciznost. Može li netko stvarno brzo daj mi rundown pomičnim zarezom i preciznost? Vi svi morali to učiniti za svoju Problem set, tako da smo svi upoznati s njom. Ili možda ne svima vama. Svatko? Daj mi započeli mjesto. Pomičnim zarezom i preciznost. U čemu je problem? Da. Victoria? VANESSA: Vanessa. JASON Hirschhorna: Vanessa. Oprostite. VANESSA: Postoji samo konačan broj brojeva koji se mogu prikazati jer si na, u našoj slučaj, 32-bitni sustav. Tako da vrsta moraju čine neke brojeve. JASON Hirschhorna: Pa to je točno u pravu. Postoji samo određena količina brojevi koji se mogu predstaviti. Ako pomnožite dvije vrlo velike brojeve, moglo bi se preliti na iznos od bilo koje imate za zastupanje cijeli broj. Zato ponekad koristimo long long umjesto u int. To ima više prostora. To može držati veći broj. Floating point preciznost ima veze s da, ali također ima veze s Činjenica da decimalni brojevi su nije uvijek zastupljena. Oprostite. Dopustite mi da stavi to back up. Decimalni broj 1.0 nije uvijek predstavljao kao što se i očekuje, 1,000000000. Ponekad je predstavljen kao 1,000000001 ili 0,999999999. Moglo bi se čak 89 bačena tu negdje. Pa ti decimalnih brojevi nisu predstavljao baš kao što bi očekivati ​​da će biti zastupljeni. Tako je u problemu postaviti - Bio je to dvoje? - Problem postaviti dva, gdje smo se bavila pomičnim zarezom brojevi, kad smo htjeli ih predstavljaju upravo ono što smo htjeli ih zastupati, broj od penija, ili broj centi, smo ih pomnožite sa 100.. Ih zaobljeni smo. I onda smo odsječeni sve iza decimalne točke. To je kako bi se osiguralo da će zapravo jednako je točno ono što smo htjeli im jednaka. Jer kada se nešto što je plutaju i pretvoriti ga u int, što odsječen sve na desnoj strani od decimalne točke. Budući da postoji neki pomičnim zarezom nepreciznost, 100.000 bi moglo biti predstavljeni kao 99,999999999. A ako samo odrezati sve do Pravo odmah, ti ćeš dobiti krivi broj. Da. STUDENT: Imao sam pitanje o lijevanje. Ono što bi se to dogoditi u? Ako želite napraviti plovak, nosači, 1 podijeljeni za 10, on radi 1 podijeljeno 10, onda dobiti 0,1, a zatim okrenuti je u float? JASON Hirschhorna: Ako vam je činiti plutaju 1 podijeljeno 10 - STUDENT: Da, a onda jednako - Pa, bilo bi normalno su ga jednako u - Da. Vi želite da plutaju napraviti, zar ne? JASON Hirschhorna: OK, pa ćemo iskoristiti da Segue u figuring out Odgovore na ova pitanja kroz kodiranje. Jer vjerojatno ćete imati puno ove minute pitanja, i dobar način za njihovo rješavanje je kroz kodiranje. Dakle, idemo da kod ovo sada, a onda ćemo se vratiti i kodirati na pitanje koje ste imali. Dakle, prva linija - Nisam trebao to napisao - što je Prva stvar koju želite učiniti kada smo otvaraju nove datoteke u gedit? STUDENT: Uključi. JASON Hirschhorna: Uključi što? STUDENT: CS50 knjižnica. JASON Hirschhorna: OK. Što još treba uključiti? Samo ćemo provjeriti što se događa kad baci nešto na plovak. No, ono što nam je potrebno uključiti ako smo će napisati C program? STUDENT: Standardni I / O. JASON Hirschhorna: stdio.h. Mi zapravo ne trebaju, za to Program, cs50.h, iako je to uvijek je korisno da se uključi. No, mi smo uvijek trebamo stdio.h. STUDENT: Kad kodiranja u C? JASON Hirschhorna: Kada kodiranje u C. Tako sam ga spremiti kao ovaj. C datoteku. I dobili neki lijep sintakse. Napisao sam prazninu u glavni. Što void znači? STUDENT: ne snosi nikakvu naredbenog retka argumente. JASON Hirschhorna: Void znači, da u slučaj, glavna ne poduzeti bilo naredbenog retka argumente. U drugim slučajevima, to znači funkciju ne uzima argumente naredbenog retka. Ili funkciju, da sam pisati prazninu main (void), da bi se reći glavna-a ne vraćaju ništa. Dakle void samo znači ništa. Što bih ja napisati da sam se uzeti argumente naredbenog retka? STUDENT: int arc c string arc v. JASON Hirschhorna: int argc niz argv. Je li to točno? STUDENT: To je char zvijezda argv nosači. JASON Hirschhorna: Tako da bi mogao pisati Niz argv zagrade ili char zvijezda argv nosači, ali morate nosače. Zbog argv je niz od žice, zapamtite. To je ne samo jedan niz. Tako niz argv je, evo jedan niz naziva argv. String argv nosači se, evo Niz od žice. Dakle int argc niz argv nosači će biti nešto što sam Vjerojatno će pisati. Tako da je htio spasiti u cijeli broj? STUDENT: Da, cijeli broj. Ili na plovak. JASON Hirschhorna: U plovak? Kao, float x jednak 1 podijeljeno 10. JASON Hirschhorna: OK. Kako mogu ispisati plutaju u printf? Što? STUDENT:% f. JASON Hirschhorna:% f. Što je cijeli broj? d ili ja. Što je niz? STUDENT: e. JASON Hirschhorna: e. Kako mogu dobiti novu liniju? STUDENT: Kosa crtica n. JASON Hirschhorna: Što ja vratiti ako je glavna staza ispravno? STUDENT: 0. Trebam li napisati tu liniju, iako? STUDENT: Ne. OK, nećemo ga napisati, onda. Može li svatko pročitao da? To izgleda malo mala. Može li svatko vidi, ili bi trebala Ja bi to veći? Mislim da je za kameru, mi ćemo napraviti je malo veći, ipak. JASON Hirschhorna: Ako želim pretvoriti ovo . C datoteku u izvršnu, što pišem? STUDENT: Napravite test. JASON Hirschhorna: Žao mi je? STUDENT: Napravite test. JASON Hirschhorna: Napravite test. Razgovarali smo o ova linija ranije. Dong. Što je zveket? Ime prevodilac. Što je to granica? STUDENT: To postavlja za korištenje GDB. JASON Hirschhorna: Postavlja da se za korištenje GDB. Ova linija, što je to? STUDENT: Izvorni kod. JASON Hirschhorna: To je source file,. c sliku. Što se te dvije linije učiniti? Ili ove dvije ne linije. STUDENT: To imena testirati ga. JASON Hirschhorna: Dakle crtica o kaže: Nazovite je nešto drugačije. I evo ti ga zovete testa. Ako nisam imao da u, što bi to ime to? STUDENT: a.out. JASON Hirschhorna: a.out. Što učiniti? STUDENT: Linkovi math knjižnicu. JASON Hirschhorna: Povezuje u math knjižnici. Nismo uključuju matematiku knjižnicu, ali budući da je tako čest, oni ' napisano make da uvijek uključuje math knjižnica. A isto tako, to uključuje CS50 knjižnica. OK, pa ako smo popis, mi sada imamo izvršnu zove testa. Za njezino izvršenje, pišem test. Vidim da je moj pomičnim zarezom, kako se i očekivalo, jednak je 0. Da li to - tako - STUDENT: Onda, ako ste stavili plutaju sada, kao da ga baci kao float - JASON Hirschhorna: Cast 1 na plovak? STUDENT: Ne, baci punu stvar - Da. Ako ste upravo to učinio, ne bi da je 0,1 učiniti? JASON Hirschhorna: U redu, tako da jako brzo, 1 podijeljeno 10, one su cijeli brojevi podijeljeni. Dakle, kada ste podijeliti cijele brojeve, oni su 0, a uštedjet ćete da je 0 u plutaju, jer slash je baš cijeli odjel. Dakle, sada smo nešto okreće u float. Da vidimo što će se dogoditi. Mi ćemo napraviti test. Tako sada vidimo da je taj udarac nije bio cijeli odjel, plutao je točka podjele. Budući da je jedan od njegovih argumenata bio bačen na plovak. Dakle, sada je to već rekao, liječenje to Podjela se kao da imamo posla s plutajuće točke, a ne s brojeva. I tako smo dobili odgovor očekujemo. Da vidimo što će se dogoditi - Ups. Ako sam htio ispisati još decimale mrlje, kako sam mogao to učiniti? STUDENT: točka točka f, ili čak decimalnih mjesta koliko želite. JASON Hirschhorna: Tako sam ispisati 10 decimalnih mjesta. A sada vidimo da dobivamo neka čudna stvar. I to ide natrag na svoje pitanje o pomičnim zarezom nepreciznost. Tu je čudno stvari pohranjene ovdje. OK, to odgovoriti na vaše pitanje? Što još ste htjeli da kod brže? STUDENT: Samo sam želio vidjeti hoće li ili Ne, ako ste slobodni neki pokazivač, je li to još uvijek pointer je pohranjena u ona adresa što je bilo ukazujući na prethodno. JASON Hirschhorna: OK, pa neka je to učiniti. Char zvijezda ptr, to stvara varijablu zove ptr tipa char zvijezde. Kako mogu pisati malloc? Alden? ALDEN: Samo malloc. No, onda to mora biti veličine, a u ovom slučaju, mislim da bih se upućuju na char. Dakle, to bi bilo char. JASON Hirschhorna: U redu, tako da više generički, Inside - neka je urediti. Unutar malloc, želite broj bajtova na hrpi. Općenito, ono što smo vidjeli da smo radite je da ćemo malloc žice, na primjer, ili nizovi brojeva. Dakle, ako želimo 10 cijelih brojeva, odnosno 10 znakova, 10 će nam dati 10. I onda veličina znakova će dati nam da je veličina znakova, koji u ovaj slučaj je 1 bajt. Mi smo dobili 10 bajtova. Ako bismo napisati veličinu int, koji će nam dati 40 bajtova. Dakle, više generički, unutar malloc je broj bajtova želite. U ovom slučaju, mi smo dobivanje 1 bajt. Što se čini kao čudan uporabu od malloc, ali za naše svrhe ima smisla. Dakle, tamo je. Mi ćemo nazvati besplatan. Mi smo dobili osloboditi od njega, a mi koristimo PTR opet. I ono što si htjela provjeriti? STUDENT: Samo sam htjela provjeriti je li ili ne postoji ništa unutar nje. JASON Hirschhorna: Znači li je istaknuo da se bilo što? STUDENT: Da, točno, je li to je još uvijek imao memorijsku adresu. JASON Hirschhorna: Dakle, želite provjeriti vrijednost ptr? STUDENT: Da, točno. JASON Hirschhorna: Što pišem ovdje ako želim provjeriti vrijednost točka - što je, Jordan rekao, vrijednost? Ili ono što je pohranjena u ptr? STUDENT: memorijske adrese. JASON Hirschhorna: memorijske adrese. Dakle, ako sam napisati upravo to, to ću daj mi vrijednost ptr. I kako sam ispisati memorijske adrese? Što je format string za memorijsku adresu? STUDENT: p%. JASON Hirschhorna: p%. % S je niz. % P za pointer. Je li to točno? To je u pravu. Dakle ptr jednako - još uvijek ima nešto u tome. To je vjerojatno više Zanimljivo pitanje. Što to linija učiniti? STUDENT: SEG grešaka. JASON Hirschhorna: Što? STUDENT: Mislim da SEG grešaka. JASON Hirschhorna: Hm? STUDENT: Mislim da će SEG kvar. JASON Hirschhorna: Dakle, ova linija koda, zvijezda ptr, što nema zvijezda znači? STUDENT: Sadržaj. JASON Hirschhorna: Da. Idi dobiti sadržaj. Dakle, to će ići u memoriju adresu tamo i daj mi da. Koristio sam% C ovdje, jer postoji su likovi tamo pohranjena. Tako ćemo ići na tu adresu mi Upravo sam vidio - ili će vjerojatno biti malo drugačije ovaj Vrijeme smo pokrenuti program. No, mi ćemo ići na tu adresu što znamo i dalje postoji i vidjeti što je tamo. Dakle, to nije SEG kvar. To jednostavno nije nam ništa. Možda bi nam zapravo daje nešto, samo mi to ne mogu vidjeti. I koja seže do ove ideje - i nećemo dobiti previše u to, jer to je izvan Opseg ovog tečaja. No, razgovarali smo o tome ovdje, ako mi otišao izvan granica polja po 1, nismo mogli dobiti u nevolji. Ponekad, kad se samo otići po jedan, radiš nešto krivo, a vi mogao biti u nevolji. Ali ne uvijek dobiti u nevolji. To ovisi koliko je loša stvar koju Ne, ti si idući u dobiti u nevolji. Koji se ne može reći, biti neuredan s kodom. Ali, to je za reći, program neće Uvijek prestati, čak i ako idete negdje što ne bi trebala ići. Dobar primjer za to je, puno ljudi u njihovom problemu postaviti 3, koji bio je 15, nije moglo proći Granica u brodu. Tako ste gledali na lijevoj strani, gledao pravo, pogledao prema vrhu, izgledao na dnu. Ali niste provjeriti je li vrh je zapravo će biti na brodu. A puno ljudi koji su radili to i ispostavilo da je u, njihov program radio savršeno, jer gdje odbor je pohranjene u memoriji, ako je otišao jedan iznad njega i provjerio da je memorija adresa, nije bilo ništa Posebno strašno o tome, tako da program nije bio će vikati na tebe. No, još uvijek bi poletjeti bodove ako što nije moglo proći, jer vam radili nešto što nisu bili trebao učiniti, a što bi moglo imati stečen u nevolji. Tečajevi su, ipak, vjerojatno nije. Dakle, ovo je pokazati da, da, još uvijek možemo otići do njega. A mi ne uzimajući u Problem u ovom slučaju. Ako bismo pokušali učiniti pročitati Sljedećih 100 znakova, mi bismo Vjerojatno se u nevolji. A možete kodirati čitanje sljedećih 100 likovi ako želite obavljajući neke vrsta za petlju. Da. STUDENT: Budući da smo bili dodijeljeni da Prostor stvarna vrijednost, ne bismo zapravo biti u mogućnosti vidjeti ništa. Trebamo li ga probati sa postavljanjem koji jednako kao što su C ili nešto? JASON Hirschhorna: Veliko pitanje. Kako mogu postaviti tu vrijednost - što linija koda ne pišem na liniji sedam učiniti ono što je rekao? STUDENT: Star ptr iznosi jednu citat c završiti jednu ponudu. JASON Hirschhorna: Tako da je stavljajući karakter, c, na tom mjestu, jer opet, ta zvijezda znači ići tamo. A kada se koristi na lijevoj strani Dodjela operator, koja je jednaka potpisati, nećemo dobiti koja Vrijednost toliko postaviti tu vrijednost. Sada ćemo vidjeti što će se dogoditi. Mi smo stavili nešto postoji i to je bio tamo. Nazvali smo slobodni. Neke stvari se vjerojatno dogodilo na hrpi. Pa to ne postoji više. Ali opet, mi ne dobivamo u nevolji za odlazak tamo. Ovo radim u kodu za ilustraciju da je puno njih pitanja koja imate, oni su stvarno zanimljivo odgovore puno vremena. I oni su jako dobra pitanja. I vi ih možete shvatiti na svoj vlastiti, ako, na primjer, nismo u sekciji. Da. UČENIK: Zato što ne šaljete pokazivač nigdje, ne trebate koristiti malloc? JASON Hirschhorna: Tako to ide natrag na svoje početno pitanje. [? ?] Je li to samo lokalna varijabla? Malloc ovdje nije to uvjerljiv. Upotreba malloc ovdje ne da uvjerljiv, jer to je samo lokalna varijabla. UČENIK: Pa mogli ste napraviti char Zvijezda ptr jednako halo? JASON Hirschhorna: Oh. Tako ćemo sada vratiti na svoje početno pitanje. Mislim da nisu bili zadovoljni s mojim odgovorom. OK? Kao da je? STUDENT: Da. Čekaj. JASON Hirschhorna: A gdje su želiš ispisati? Tako ćemo ispisati string kao što je to? STUDENT: Zanimljivo. JASON Hirschhorna: Pa to kaze Argument je tip lika. Dakle, to bi trebao biti znak. STUDENT: Samo treba prvi. JASON Hirschhorna: Dakle, ovo je ono što sam rekao prije. Kao što sam rekao, to nije pohranjivanje string unutar promjenjivog pointer. To je spremanje - STUDENT: prva vrijednost u nizu. JASON Hirschhorna: adresa Prva vrijednost niza. Ako bismo ispisali toga, mi smo dobivanje vrijednosti unutar pokazivača. , Pa ćemo vidjeti što je, doista, adresa memorije. Ima li to smisla? Oprostite. Čekaj, ne da odgovor na Vaše Pitanje je, je li? STUDENT: Da. JASON Hirschhorna: Ova linija koda je stvarajući niz, a zatim još jedan promjenjiva pointer koji je upućuju na taj niz, da polja. Da. UČENIK: Pa, ako smo otišli jedno sjećanje baviti i dalje, da bi dobili na sat? Je li to bila pohranjena kao niz? JASON Hirschhorna: Kao, što smo učinili - pa to je vrijedno raditi. To je točka aritmetika, koji vas dečki Vidio prije i trebalo biti relativno zadovoljni. To je isto kao da se pisanje - ako smo napisati ovaj redak koda, vidjeli smo niza zapis prije. To bi nam trebalo dati drugi Vrijednost u ovom polju, h. Ako smo to učinili, to također treba dati nas druga vrijednost u tom polju. Zato što se događa nije u memoriju adresu prva stvar, ali Memorija adresa stvar jedan preko. A onda su zvijezde operatera dereferences da pointer. A opet, da vidimo. Mi smo dobili h opet. STUDENT: Što točno znači dereference znači? JASON Hirschhorna: dereference je fancy riječ za otići u. Idi na to i dobiti ono što je tamo je dereference pokazivača. To je samo fancy riječ za to. STUDENT: Da smo htjeli da se tiska cijeli niz, mogli bismo učiniti ampersand pokazivač? JASON Hirschhorna: OK, mi smo će pauzirati ovdje. Mi ćemo završiti ovdje. Ampersand vam daje adresu mjesto, pa kada se to od ampersand varijabla, to vam daje adresu gdje je pohranjena ta varijabla. Ampersand pokazivač će vam dati adresa ptr gdje ptr je u memoriji. Nećemo ići na u ovom primjeru. Možete to shvatiti stvari na svoju vlastitu. Ali opet, to bi čak moglo biti verging Malo dalje od onoga što vam je potrebno znati za Opseg ovog srednjoročnom razdoblju - ili ovaj kviz, a ne. Oprostite. Mi ćemo krenuti dalje, jer bih željeli napraviti jednu kodiranja problema prije vremena je gore. I mi se događa da kod onoga što mislim je najuvjerljiviji od njih primjeri, atoi. Dakle, to je pitanje na kviz prije dvije godine. I da ga imam na ploči ovdje. Ljudi su se pitali na kvizu - oni su imali malo više tesxt u pitanje, ali ja eliminirana tekst, jer nije bilo potrebno za naše potrebe sada. To je bio samo neki background na ono atoi učinio. Ali svi znate i vrlo su upoznati s atoi. Predlažem vam da kodirati to na list papira. Također predlažemo da koristite strategiju da smo otišli na mnogo u našem dijelu. Prvo, pobrinite se da razumijete ono atoi djelo. Nacrtati sliku ili se s nekim mentalna slika njega u glavi. Zatim, napisati pseudocode za to. Na kvizu, ako sve što se je pseudocode, barem što staviti nešto dolje. A onda je karta koja pseudocode na C. Ako imate čeka u pseudocode, kao i provjerite je li se nešto je 1, koja preslikava na ako stanje i tako dalje. I na kraju, kodirati program u C Dakle, vratite se atoi i uzeti pet minuta da kod toga na list papir, što je vjerojatno o Iznos od vrijeme te će se na kviz kod atoi. Pet do 15 minuta, pet do 12, pet do 10 minuta, je o iznosu od put kad bih potrošiti na to Pitanje u kvizu. Dakle, uzeti pet minuta, molim te. A ako imate bilo kakvih pitanja, podizanje tvoja ruka, a ja ću doći oko. [SIDE Razgovori] JASON Hirschhorna: OK, pa to je bilo pet minuta. To je vjerojatno o iznosu od put kad bih potrošiti na koji na kvizu, Možda niska kraj tog vremena. Mi ćemo rekapitulacija u malo. Počnimo kodiranja ovo. A ako ne dobijemo sve na putu kroz, Odgovore na ova i ova kviz pitanje dostupni, opet, Fall 2011 je kada se to pitanje pojavio na kvizu. I to je bio vrijedan osam bodova na kvizu onda. Osam bodova je na visokoj kraju Količina bodova nešto vrijedi. Većina pitanja u rasponu od jednog do šest mjesta. Dakle, to je veći izazov Pitanje, sigurno. Može li itko da počnem? Općenito, što ćemo to želite učiniti s ovim funkcionirati atoi, logično? Što želimo učiniti? Tako ćemo pisati Neki pseudocode. STUDENT: Pretvori znakova u cijelih brojeva. JASON Hirschhorna: Pretvori znakova u cijelih brojeva. OK. Dakle, koliko znakova smo Trebat će proći? STUDENT: Svi oni. STUDENT: Svi likovi u nizu. JASON Hirschhorna: Sve Likovi u nizu. Dakle, ako smo htjeli ići kroz svaki lik u nizu, što je stvar u C vidjeli smo da je dozvoljeno nam je proći kroz svaki lik u nizu? STUDENTI: za petlju. JASON Hirschhorna: za petlju. Dakle, idemo na petlji kroz svaki lik u sekundi. Onda što ćemo htjeti raditi kada smo dobili određeni lik? Recimo da smo uzimajući donijela 90. Mi smo dobili devet. To je znak. Ono što želimo učiniti s taj lik 9? STUDENT: Oduzmite ga od karaktera 0? STUDENT: Dodaj 0? JASON Hirschhorna: Oduzmite je iz karaktera 0? STUDENT: Da. JASON Hirschhorna: Zašto Želite li to učiniti? STUDENT: [nečujan] vrijednost. Njegova int vrijednost. JASON Hirschhorna: U redu, tako da uzmemo lik 9, oduzimati od lik 0 dobiti Stvarni broj 9. Sweet. A kako ti znaš da se karakter 9 minus 0 lik je 9? Što chart si pogledati? STUDENT: Postoje logično devet mjestima između 9 i 0. Ili ste mogli gledati na ASCII tablice. JASON Hirschhorna: ASCII tablica. Ali, da, ti si točna kao dobro. Dakle oduzmemo 0. Tako sada imamo cijeli broj 9. I ono što želimo učiniti s tim? Ako imamo 90, to je prvi cijeli broj smo, što želimo učiniti? STUDENT: Ja bih stavio u privremenu cijeli polje, a zatim učinite matematiku na njega kasnije da bi ga u kraju. JASON Hirschhorna: OK. STUDENT: Možete početi krajem polje, a zatim krenuti naprijed tako da svaki put kad se krene naprijed, je pomnožite sa 10.. JASON Hirschhorna: OK. To zvuči kao prilično uvjerljiv ideja. Možemo početi krajem naše polje, i možemo koristiti strleng. Možemo koristiti strleng ovdje. Mi ćemo dobiti duljinu našeg niza. Krećemo na kraju. A + prvi, samo mi to uzeti cijeli broj, a možda smo stvorili kao nova varijabla cijeli broj do vrha gdje mi smo pohranjivanje sve. Tako smo petlja kroz svaki znak u ss natrag na front, oduzmemo 0, a onda smo ga uzeti, a ovisno o gdje je to, mi to pomnožite od strane vlasti od 10.. Budući da je prvo, što nam je činiti pomnožiti posljednji znak na desnoj strane? STUDENT: 10 do 0. JASON Hirschhorna: 10 do 0. Što ćemo pomnožiti drugom najdesniji slovo po? STUDENT: [nečujan]. JASON Hirschhorna: Što? STUDENT: 10 do 1. JASON Hirschhorna: 10 do 1. Treće najdesniji lik? STUDENT: 10 na 2.. JASON Hirschhorna: 10 na 2.. STUDENT: Žao mi je, ja ne razumijem ono što mi ovdje radimo. JASON Hirschhorna: OK, idemo natrag, a zatim. Tako ćemo dobiti donesen u nizu. Jer želimo pisati atoi. Tako smo dobili prošli u nizu. Recimo da smo uzimajući prošli u nizu 90. Prvo što ćemo učiniti je postaviti Novi broj varijabla koja smo samo će stvoriti kao naš novi cijeli broj. To je ono što ćemo da se vrati na kraju. Moramo proći kroz svaki lik u Niz jer smo određena da moramo dotaknuti svakoga i zatim ga dodati na naš novi cijeli broj. No, ne možemo samo dodati kao broj. Ne možemo samo uzeti 9 i dodaj 9 na naše cijeli broj. To ovisi o tome što mjesto je u nizu. Mi ćemo morati pomnožiti je po snazi ​​od 10.. Jer to je kako baza 10 djela. Tako ćemo dobiti stvarna likovima ili stvarni broj broj, oduzimanjem karakter 0 od 9 karaktera kao što je učinio s oduzimanjem znakova kapitalu iz god lik kojeg smo imali u jednom od ti problemi. Tako smo zapravo ćete dobiti broj od 0 do 9 spremaju kao pravi broj, a mi ćemo pomnožite ga snage od 10, ovisno o tome gdje smo u nizu. A onda ćemo ga ponovno dodali u našu novu varijablu cjelobrojnog. Pa što će to izgledati bi se - mi ćemo privući ovamo. Ako bi smo prošli u nizu 90 - STUDENT: [nečujan]. JASON Hirschhorna: No atoi traje niz. Tako ćemo proći kroz holding. Mi ćemo dobiti prošao u 90. Idemo s leđa prema naprijed. Uzimamo 0. STUDENT: Žao mi je. Možda je to glupo. Ako dosad niste prošli u nizu, Zato je 90 ono što smo uzimajući prošao u? Jer 90 je cijeli broj. JASON Hirschhorna: Zbog atoi traje string i pretvara ga u cijeli broj zastupljenost tog niza. No, niz od 90 nije cijeli broj 90 ili broj 90. Niz 90 je niz od dva ili tri znaka, a, 9 karakter, 0 karakter, a backslash 0 znakova. I pišemo atoi jer, za Na primjer, kada se uzme naredbu linija argument, a to je spremljena u argv, to se sprema kao string. No, ako želite da ga tretiraju kao broj, morate ga pretvoriti u Stvarni broj. Koji smo mi jedan od naših problema setovima. Koji smo učinili u nizu naših problema setovima. Svatko koji je cijeli broj kao naredbenog retka argument za. Dakle, to je razlog zašto naš atoi funkcija traje niz. Pa opet, u našem primjeru ovdje, mi smo će uzeti zadnji. Idemo oduzeti karakter 0 od nje, jer su likovi 0 oduzetom karakteru 0 vam daje Stvarni broj 0, prema ASCII math da radimo. Budući da su likovi predstavljeni kao razlikuje od njihove stvarne - znakova, na primjer, mala je 97. To nije - Ups! To nije ono što ste očekivali da se, 0, na primjer. Dakle imate za oduzimanje lik dobiti 0.. Tako ćemo učiniti ovdje da se stvarni broj. A onda ćemo ga pomnožite Snaga od 10, ovisno o tome gdje je u nizu, a zatim uzeti i to dodati na naš nositelja mjesto promjenjiva, tako da možemo doći do Naš konačni novi cijeli broj. Da li to ima smisla za sve? Dakle, mi ne idemo da kod toga upravo sada, jer smo dobivanje na kratko vrijeme. Ispričavam se na vrijeme od toga. Ali to je ono što, nadamo se, što bi moći učiniti na test - na najmanju ruku, dobiti ovu pseudocode ispisao. A onda, ako smo pisati pseudocode, zapravo, možemo to učiniti prilično brzo. Svaki redak komentara smo mi pisali Ovdje prevodi na oko jedna linija C koda. Proglašavanje novu varijablu, pisanje petlje, neki oduzimanje, neki množenja, a neki zadatak. Mi bi vjerojatno također žele napisati povratni vod. Mi također htjeti staviti neke čekove u ovdje. Da. UČENIK: Pa možemo liječiti e kao stvarni string? Jer znam da je to samo adresa. Kao, kako bi ste dobili duljinu Niz koji se prenose putem? JASON Hirschhorna: Pa kako je Duljina niza? Strlen. STUDENT: strlen, da. No, možete staviti s kao Argument za to? JASON Hirschhorna: Pa strlen Potrebno je char zvijezdu. I slijedi da char zvijezdu, i to drži računajući sve dok ne dođe do backslash 0. strlen je zapravo jedan od drugih programa smo su idući u kodu. To je još jedan dobar jedan na kodu. Taj jedan je malo lakše, jer ako ćeš razmišljati o tome konceptualno - Upravo sam to rekao naglas - strlen slijedi pokazivač i čuva ide i računajući i praćenje dok se dođete lijevu kosu crtu 0. STUDENT: OK, dobio ga. JASON Hirschhorna: Pa najbolje sreće na kvizu 0 sutra. Ako imate bilo kakvih pitanja, ja ću biti vani nakon ovoga. Slobodno mi e-mail. Posegnite za svoj TF, ako ste Ne u mom dijelu, ili dobiti moj e-mail, ako vi to želite. Ako želite da se izbezumila i samo poslati mi e-mail, Freakout e-mail, ja ću poslati natrag, kao što je, smješko, ili, kao što je, šala. Dakle, slobodno to učiniti kao dobro. Sretno opet, i ja ću vidimo se cijeli sljedeći tjedan.