[Powered by Google Translate] [Artikulua 4 - erosoagoa] [Rob Bowden - Harvard Unibertsitatea] [Hau CS50 da. - CS50.TV] Quiz bihar dugu, kasu horretan, ez duzu guys ezagutzen. Funtsean, dena dute klasean ikusi edo klasean ikusi behar da. Biltzen dituen erakusleak, nahiz eta duela gutxi gai bat ari dira. Ulertu behar duzu, gutxienez, horietako maila altua. Ezer baino gehiago desagertu zen klasean galdetegia ulertu behar duzu. Beraz, horiei buruzko galderak izanez gero, eskatu ahal izango duzu orain. Baina hau ez da oso ikasle-zuzendutako saio bat izango da non guys galderak, beraz, espero dugu jendeak galderak. Does Edozeinek galdera? Bai. >> [Ikasleak] erakusle baino gehiago duzu berriro? Erakusle baino gehiago dut. Zure aldagai guztiak nahitaez memorian bizi, baina normalean, ez duzu kezkatu eta esatea besterik ez duzu x + 2 y + 3 eta konpiladore irudikatu gauzak ari zaren non bizi. Behin erakusleak aurre ari zaren, esplizituki ari zaren memoria helbideak erabiliz. Beraz, aldagai bakar bat soilik izango da inoiz, edozein momentutan bakar helbidea batean bizi dira. Erakuslea aldarrikatu nahi dugu bada, zer motako itxura? Erakuslea p bat aldarrikatu nahi dut. Zer mota ez du itxura? [Ikasleen] int * p. >> Bai. Beraz, int * p. Eta nola ez, seinalatzen x egin dut? >> [Ikasleak] Ampersand. [Bowden] Beraz, ampersand literalki operadorea helbidea deitzen zaio. Beraz, eta esan dut x x aldagaia helbidea memoria lortzean. Beraz, gaur egun erakuslea p dut, eta nire kodea edonon * p erabili ahal izango dut edo x erabili izan dut, eta zehatza izango da gauza bera izango da. (* P). Zer da hau egiten? Zer esan nahi du izar hori? [Ikasleak] puntu horretan balio bat esan nahi du. >> Bai. Begiratuz gero, oso erabilgarria izan daiteke diagramak marrazteko non memoria kutxa txiki bat x 4 balioa dute, eta hori gertatzen da, gero, memoria kutxa p apur bat behar dugu, eta, beraz, p x puntu, eta, beraz, p x gezi bat marraztu dugu. Beraz, esan genezake * p joan dela p koadroan esaten ari gara. Star gezi jarraitu eta, ondoren, edozein dela ere kutxa nahi duzu bertan. Beraz, esan * p = 7; eta hori izango da x eta 7 aldaketa koadroan. Edo esan izan dut int z = * p * 2; Hori da nahasgarria da izar, star delako. Izar bat da p dereferencing, beste izar 2 biderkatuz. Ohartu besterik ez baita * p x ordezkatu nuen. Era berean, erabil ditzakezu. Eta gero I p puntu bat izan daiteke gauza guztiz berri bat. Besterik ez dut esan daiteke p = &z; Beraz, gaur egun, P x puntu luzeagoa ez; puntu z da. Eta edozein unetan egin dut * p z egiten bezala da. Beraz, honi buruz gauza erabilgarria da hasten gara funtzioak sartzeko behin. Ezertarako mota da erakuslea puntu bat aldarrikatu duten zerbait eta, ondoren, bakarrik ari zaren dereferencing denean erabili dituzte jatorrizko aldagai hasteko. Baina funtzioak duzun - esan funtzio batzuk, int foo dugu, beraz, erakuslea bat hartzen du eta, besterik gabe, ez * p = 6; Swap aurretik ikusi bezala, ezin duzu swap eraginkorra eta beste funtzio bat Osoko zenbaki besterik ez pasatzen C guztia beti balio pasatuz. Nahiz eta erakusleak balio zaren pasatzen ari zaren pasatzerakoan. Beraz, zerbait gertatzen da, balore horiek dira memoria-helbideak. Beraz, esango dizut foo (p); erakusleak funtzio foo sartu naiz pasatzen eta, ondoren, foo * p = 6 egiten ari da; Beraz, barruan funtzio hori, * p oraindik x baliokideak, baina ezin dut erabili x funtzio hori barruan ez delako funtzio horren barruan scoped. Beraz, * p = 6 modu bakarra funtzio beste aldagai lokal bat sartu ahal izango dut. Edo, ondo, erakusleak modu bakarra funtzio beste aldagai lokal bat sartu ahal izango dut. [Ikasleak] dezagun esan erakuslea itzuli nahi duzun. Zer egin nahi duzu hori? [Bowden] itzuli erakuslea antzeko zerbait int y = 3; bueltan & y? >> [Ikasleak] Bai. [Bowden] Larreina. Inoiz egin beharko zenuke hau. Txarra da. Hitzaldia diapositiba horiek ikusi dudala uste dut memoria diagrama osoa hau ikusten hasi non Hemen duzun got memoria-helbide 0 eta behera, hemen duzu memoria-helbide 4 kontzertuak edo 2 32. Orduan duzun got stuff batzuk eta gauza batzuk, eta, ondoren, zure pila duzu. eta nik zure zeure, hasi besterik ez duzu buruz ikasteko, gero eta handiagoa. [Ikasleak] pila gainetik ez zeure? Bai. Zeure gainean dago, ez da? >> [Ikasleak] Beno, 0 jarri zuen gainean. [Ikasleak] Oh, 0 jarri zuen gainean. >> [Ikasleak] Oh, ados. Ezespena: Anywhere CS50 Modu honetan ikusi duzu. >> [Ikasleak] Larreina. Hori besterik ez da aurreneko zaren pila ikusita, nahi pila bat bata bestearen gainean gauzak pilatzeko uste duzu uste duzun. Beraz, hau irauli pila da, beraz, gero eta handiagoa pila bat normalean egiten bezala inguruan ohi dugu pilaren ordez behera zintzilik. >> [Ikasleak] Ez heaps teknikoki hazi ere, nahiz eta? Eta zer esan nahi duzu hazten by sortu da. Pila eta zeure beti hazten kontrako norabideetan. Pila bat dago beti hazi dela zentzu hazi goi mailako memoria helbideak, eta zeure behera hazten ari memoria txikiagoa helbideak bidean hazten ari da. Beraz, goiko 0 izango da, eta beheko altua da memoria helbideak. Biak ari dira, gero eta handiagoa da, norabide kontrajarriak. [Ikasleak] esan nahi dut esan duzu pila jarri behean delako badirudi intuitiboago delako pila zeure goialdean delako hasteko, zeure beraren gainean ere, eta, beraz, that's - >> Bai. Gainera, hazi eta handiagoa zeure uste duzu, baina pila gehiago. Beraz, pila bat mota nahi dugun hazi erakusteko. Baina nonahi bestela ikusten da helbidea 0 erakusteko goialdean eta, behealdean memoria helbidea handiena, eta, beraz, hau da zure memoria ohiko ikuspegia da. Galdera bat izan al duzu? [Ikasleak] diguzu zeure buruz gehiago? Bai. Bigarren bat lortu dut. Lehenik eta behin, zergatik eta y itzuli atzera joan txarra da, pila pila markoak funtzio guztiak ordezkatzen sorta bat duzu zein dira deitu du. Aurreko gauzak ikusi egingo zaio, eta, beraz, zure pilaren goiko beti funtzio nagusia izango lehen funtzioa deitzen ari da geroztik. Eta gero, deitu funtzioa beste, pila behera hazten joan. Beraz, bada funtzio batzuk, foo, deitzen dut, eta bere pila-markoa lortzen da, zenbait funtzio, taberna deitu daiteke; bere pila-markoa lortzen da. Eta taberna errekurtsiboa izan liteke, eta bere burua dei dezake, eta, beraz, bigarren barra dei hori bere pila-markoa lortzeko. Eta beraz, zer pila fotograma horiek doan tokian tokiko aldagai guztiak dira eta funtzioa argumentuak guztiak - Lokalean dira funtzio hau scoped duen edozein gauza pila fotograma horiek. Beraz, horrek esan nahi du bar antzeko zerbait funtzio bat da, esan nuen, Besterik ez dut zenbaki oso bat aldarrikatu du, eta, ondoren, erakuslea osokoa hori itzuli egingo da. Beraz, non ez y bizi? [Ikasleen] y bar bizi da. >> [Bowden] Bai. Somewhere memoria plaza txiki honetan littler plazan bertan y que tiene da. Eta itzultzeko I y, erakusle bat dut itzuli memoria bloke txiki hau. Baina orduan, funtzioak bat, bere pila-markoa lortzen popped off pila. Eta hori da zergatik deitzen pila. Pila datuak egitura bezalakoa da, badakizu zer esan bada. Edo erretiluak pila bat bezala, nahiz eta beti Adibidez, nagusia beheraino joango da eta, ondoren, lehenengo funtzioa deitzen duzun horren gainean joango gara, eta ezin duzu atzera nagusira deitu duten funtzio guztiak itzuli arte gainean jartzen dira. [Ikasleak] Beraz, egin ez bada itzultzeko & y, balio hori da, aldez aurretik abisatu gabe aldatzeko gaia. Bai, it's - >> [ikasleak] gainidatzi daiteke. >> Bai. Guztiz da saiatu baduzu eta Hau ere int * bar bat izan da erakuslea delako itzuli beraz, bere itzulera mota int *. Saiatu behar baduzu funtzio honen balioa itzultzeko erabili nahi izanez gero, portaera undefined erakuslea duten memoria txarra seinalatzen duelako. >> [Ikasleak] Larreina. Beraz, zer bada, adibidez, deklaratu int * y = malloc (sizeof (int))? Hori da hobea. Bai. [Ikasleak] hitz egiten nola gara gauzak arrastatu dugu gure recycle bin ezabatu ez dira galduko dugu bere erakusleak. Beraz, kasu honetan ez ezabatuko dugu balioa edo da oraindik ez dago memoria? Gehienak, oraindik ere hor egon da. Baina demagun funtzio batzuk, baz deitu gertatuko dugu. Baz hemen bere pila-markoa lortzeko. Gainidatziz to stuff hau guztia egingo da, eta gero saiatu bada, eta erabili baino lehen you got erakuslea balio bera ez da izango. Aldatu egin izeneko funtzio baz delako joan. [Ikasleak] Baina izan, ez genuke dugu oraindik lortu 3? [Bowden] aukera guztiak, nahi duzun. Baina ezin dela oinarritzen. C undefined portaera dio. [Ikasleak] Oh, ez. Ongi da. Beraz, erakuslea itzuli nahi duzu, hau da, non malloc erabilera dator. Benetan idazten ari naiz itzultzeko malloc (3 * sizeof (int)). Malloc baino gehiago dugu bigarren bat gehiago, baina malloc ideia da zure tokiko aldagaiak beti pilaketan joan. Ezer malloced zeure gainean doa, eta betiko, eta beti izango da zeure buruzko esplizituki askatu arte. Beraz, horrek esan nahi du zerbait malloc duzu, funtzioak ondoren bizirik irauteko da. [Ikasleak] programa gelditzen exekutatzen ondoren bizirik irauteko? >> N º. Ados, beraz, ez da programa guztiak egin exekutatzen ari arte egingo da. >> Bai. Joan ahal izango dugu zer gertatzen den programa gelditzen exekutatzen xehetasunak. Behar me gogorarazi behar izatea, baina hori beste gauza bat da, oso-osorik. [Ikasleak] Beraz malloc erakuslea bat sortzen? >> Bai. Malloc - >> [ikasleak] malloc erakuslea erabil dezakeen memoria-bloke bat izendatzen dela uste dut. [Bowden] diagrama nahi dut berriro. >> [Ikasleak] Beraz, funtzio honetan lan egiten du, nahiz eta? [Ikasleen] Yeah, malloc memoria erabili ahal izango duzu bloke izendatzen, eta, ondoren, memoria hori lehen blokea helbidea itzultzen du. [Bowden] Bai. Beraz, duzunean malloc, memoria bloke grabbing ari zaren hori da gaur egun zeure en. Zeure txikiegia bada, orduan zeure besterik ez da hazten, hazten da, eta norabide horretan. Beraz, demagun zeure txikiegia da. Ondoren, pixka bat hazten eta erakuslea itzultzeko Bloke honetan bakarrik hazi da. Duzunean free stuff, zeure, gela gehiago egiten ari zaren, beraz, ondoren, geroago malloc deitu memoria zela aldez aurretik libratuko berrerabiltzeko. Malloc eta free buruzko gauza garrantzitsua da, ematen dion kontrol osoa memoria bloke horietan bizitzan zehar. Global aldagaiak dira beti bizirik. Aldagai lokalak dira beren esparruan bizirik. Kizkur giltza bat iraganean gisa joan bezain laster, aldagai lokalak dira hildakoak. Malloced memoria bizirik dago, izan ere, izango bizirik nahi duzun eta, ondoren, kaleratu kontatzeko kaleratu dira. Horiek dira benetan memoria 3 mota bakarra, benetan. Memorien kudeaketa automatikoa, eta horrek pila da. Things gertatuko automatikoki. Int x esaten duzunean, memoria-x int banatzen da. Noiz x jokoz kanpo esparrua da x, memoria berreskuratzen. Ondoren, memoria kudeaketa dinamikoa, eta hori da malloc da, hau da, kontrol duzu. Dinamikoki erabaki duzu memoria behar du, eta behar ez da esleitu. Eta gero, ez da estatikoa, besterik gabe esan nahi du bizi dela betiko, hau da, zer aldagai global dira. Besterik ez dira beti memorian. Zalantzak dituzu? [Ikasleak] bloke bat definitzen kortxeteak kurtsibak erabiliz baina ez behar izatea, adierazpen edo bitartean adierazpen edo horrelako ezer bada? bat Bloke bat definitzen dezakezu funtzio baten gisa, baina hori giltza kizkur gehiegi ditu. [Ikasleak] Beraz, ezin duzu kortxeteak kurtsibak ausazko pare bat bezalakoa izan zure kodea duten aldagai lokalak? >> Bai, egin dezakezu. Bar int Inside {int y = 3;} izan dugu. Hori ustezko hementxe. Baina hori guztiz int y esparrua definitzen du. Horretarako, kizkur bigarren giltza ondoren, y ezin da erabili jada. Ia inoiz egin duzu hori, baina. Atzera eskuratzen denean zer gertatzen den programa bat da eta ondorioz, misconception / erdia gezurra ematen ditugu, besterik ez gauzak errazago mota da. Esango dugu, memoria esleitu RAM zatia batzuk ari zaren aldagaia esleitzean. Hala ere, ez duzu benetan zuzenean RAM ukitu zure programak inoiz. Uste baduzu, nola marraztu dut - Eta, benetan, joan bidez bada GDB gauza bera ikusiko duzu. Kontuan hartu gabe zure programa edo zer programa ari zaren zenbat aldiz exekutatzen baduzu, pila da beti hasteko Beti ari zaren helbidea oxbffff zerbait inguruko aldagaiak ikusteko. Izan ohi da nonbait eskualde horretan. Baina, nola 2 programak, ziurrenik memoria bera erakusleak? [Ikasleak] non oxbfff ustezko RAM izendapena arbitrarioak batzuk benetan funtzioa deitzen zen arabera leku ezberdinetan egon daiteke. Bai. Epe memoria birtuala da. Ideia bakoitza bakar-prozesua, behin programa bakar hori ordenagailuan exekutatzen bere - Demagun 32 bit - erabat helbide-espazio independentea. Helbide-espazio honek. Bere erabat independentea 4 gigabyte erabili ditu. Beraz, 2 programak exekutatzen duzun bada, aldi berean, programa hau, 4 gigabyte bera ikusten, programa hau, 4 gigabyte bera ikusten, eta ezinezkoa da programa hau dereference erakuslea eta, azkenean, programa honen memoria. Eta zer memoria birtuala da, prozesu helbide-espazio kartografia RAM benetako gauza. Beraz, sortu da, zure sistema eragilearen jakin, hey, hau lasaia dereferences erakuslea oxbfff, benetan esan nahi du nahi zuela RAM byte 1000, Horrela programa dereferences oxbfff nahi izanez gero, benetan, berriz, RAM byte 10000. Arbitrarioki urrun izan daitezke. Hau da, are gehiago, gauza bat prozesu helbide-espazio bakarra benetako barruan. Horrela 4 gigabyte guztiak ikusten du bere burua, baina demagun [Ikasleen] single prozesu guztiak Does - Demagun soilik 4 RAM gigabyte ordenagailu bat behar duzu. Single prozesu guztiak ez du ikus osoa 4 gigabyte? >> Bai. Baina 4 gigabyte ikusten gezur bat da. Besterik ez da pentsatzen, memoria hori guztia du, ez duelako jakin, beste edozein prozesu badago. Bakarrik erabili izango da askoz memoria da benetan behar bezala. Sistema eragilea ez da RAM emateko prozesu honetan ez bada edozein eskualde osoa honetan memoria erabiliz. Ez da ematen eskualde memoria joan. Baina ideia dela uste saiatzen ari naiz, ezin dut analogia bat pentsatzea. Analogiak gogorra da. Memoria birtual gai bat edo gauzak konpontzeko da bat prozesuak beste bat guztiz ezjakin izan behar du. Eta beraz, edozein programa idatzi dezakezu besterik ez da dereferences erakuslea edozein, gustatzen besterik ez dioen * (ox1234) programa bat idatzi, eta hori dereferencing memoria-helbide 1234. Baina sistema eragilea sortu da, ondoren, itzultzeko zer 1234 bitartez. Beraz, 1234 bada gertatzen da baliozko memoria-helbide bat izan behar du prozesu honetan, pila edo zerbait bezala eta, ondoren, memoria-helbide horren balioa itzuliko da den neurrian, prozesu dakiten bezala. Baina 1234 bada, ez da baliozko helbide bat gertatzen da, lur bezala memoria hemen pieza txiki batzuk pila haratago eta zeure haratago eta benetan ez duzu erabili, orduan hori segfaults bezalako gauzak ari zaren memoria delako ukitu behar duzula ez da ukitu. Hori ere egia 32-bit-sistema, memoria-helbide bat zehazteko 32 bit 32 bit esan nahi duzu. Zergatik erakusle dira 8 byte da 32 bit dira, 8 byte delako edo 4 bytes. Erakusleak 4 byte dira. Erakuslea oxbfffff atsegin bat ikusiko duzu, hau da, Edozein programaren barruan arbitrarioa besterik ez dezakezu eraikitzeko erakuslea edozein edozein lekutan, ox0 ox 8 f's - ffffffff. [Ikasleak] Ez al da 4 bytes Oraindik esaten duzu? >> Bai. [Ikasleak] Ondoren byte bakoitzak izango - >> [Bowden] hamaseitarra. Hamaseitar - 5, 6, 7, 8. Erakusleak Beraz hamaseitarrean beti ikusi duzu. Besterik ez da nola erakusleak sailkatzeko dugu. Hamaseitar bakoitzak 2 digituak 1 byte da. Beraz, ez da, 8 4 bytes digituak hamaseitarra izango. Beraz, 32-bit sistema bat erakuslea single bakoitzak 4 bytes izango, Horrek esan nahi du zure prozesuan edozein arbitrarioak 4 bytes eraikitzeko dezakezu eta erakuslea da, Horrek esan nahi du, orain arte bezala jakitun, memoria 32 byte 2 oso bat aurre dezake. Nahiz eta ez du benetan izan duten sarbidea, nahiz eta zure ordenagailuan bakarrik 512 megabyte ditu, askoz ere memoria hori du uste. Eta sistema eragilearen smart nahikoa izango dela soilik esleitu zer behar duzu benetan. Ez da bakarrik, oh, prozesu berri bat: 4 kontzertuak. Bai. >> [Ikasleak] Zer idi esan nahi du? Zergatik idatzi duzu? Hamaseitarrean ikurra besterik ez da. Zenbaki Irteeran bat ikusiko duzu idi, ondoz gauza hamaseitarra dira. [Ikasleak] programa bat amaitzen denean, zer gertatzen ziren azalduz. >> Bai. Zer gertatzen da programa bat eta ondorioz, sistema eragilearen besterik ez ezabatzen mapaketa helbide hauek ditu, eta hori da. Sistema eragilearen eman memoria hori beste programa bat erabili. [Ikasleak] Larreina. Beraz, zerbait esleitu zeure edo pilaketa edo aldagai global edo ezer, besterik gabe desagertu egingo dira ahalik eta azkarren programa amaitu gisa sistema eragilea da gaur egun delako free memoria ematen dioten beste edozein prozesu. [Ikasleak] Nahiz eta ziur aski oraindik idatzi balioak? >> Bai. Balioak baliteke oraindik ez. Besterik ez da eta horiek zaila izango da. Askoz zailagoa da horiek da ezabatu fitxategi batean baino ezabatutako fitxategia mota eseri ez delako denbora luzez, eta disko gogor bat asko handiagoa da. Beraz, memoria zati ezberdinetan gainidatzi egingo gertatzen da fitxategi hori erabili ahal izango da memoria zatia gainidatzi aurretik. Baina memoria, RAM, ziklo asko azkarrago bidez, beraz, oso azkar izan gainidatzi egingo da. Hau edo beste ezer galderak? [Ikasleen] buruzko galderak gai desberdin bat daukat. >> Ados. Does Edozeinek honi buruzko galderak? Ongi da. Desberdinak gaia. >> [Ikasleak] Larreina. Praktika probak batzuen bidez izan dut, eta horietako bat sizeof buruz hitz egiten eta balioa itzultzen du, edo beste mota aldakorra. >> Bai. Eta bai int luze eta bai bueltan 4, eta, beraz, 4 byte bi luze daudela esan du. Ba al dago int bat eta luze bat edozein arteko diferentzia, edo gauza bera da? Bai, ez dago diferentzia bat da. C estandarra - Ziurrenik dut nahastea sortu. C estandarra da, zer da C, C. dokumentazio ofiziala Hau da, esaten du. Beraz, C estandarra besterik ez dio char bat egingo dute betirako eta beti 1 byte. Ondoren Everything - labur bat da beti baino handiagoa edo karakterra bat berdinak bezala definitzen da. Zorrozki baino handiagoa da, baina ez da positiboa izan daiteke. Int bat besterik ez da, labur bat baino handiagoa edo berdina bezala definitzen da. Eta luze bat besterik ez da int bat baino handiagoa edo berdina bezala definitzen da. Eta luze luze bat baino handiagoa edo berdina da. Beraz, gauza bakarra C estandarra definitzen dena ordena erlatiboa da. Memoria zenbatekoa benetako gauza hartzen dute, oro har, up to ezartzea, baina puntu honetan nahiko ongi definitzen du. >> [Ikasleak] Larreina. Beraz, film laburrak dira, ia beti 2 bytes izango. Ints dira ia beti 4 bytes izango. Long Longs 8 byte dira ia beti izango da. Eta Longs araberakoa ari zaren 32-bit edo 64-bit sistema bat erabiltzen den ala ez. Beraz, luze bat sistema mota dagozkio. Zaren 32-bit sistema bat erabiltzen ari bazara Appliance bezala, 4 byte da. Zaren 64-bit erabiliz gero asko ordenagailu azken bezala, 8 byte izan dute. Ints dira ia beti 4 byte puntu honetan. Long Longs dira ia beti 8 byte. Iraganean, ints 2 byte bakarrik erabili. Baina hori erabat baino handiagoa, eta berdin harreman horiek guztiak betetzen. Beraz, luze ezin hobeto onartzen osoko gisa tamaina berdina izango da, eta, halaber, onartzen luze jo tamaina berdina izango da. Eta, beraz, besterik ez da gertatzen% 99,999 sistemak, berdinak izan da bai int bat edo luze bat. 32-bit edo 64-bit araberakoa da. >> [Ikasleak] Larreina. Karroza, bit dagokionez, izendatutako dezimal nola? Binary bezala? >> Bai. Ez duzu behar jakin nahi CS50. Nahiz eta ez duzu ikasten 61. Ez duzu ikasten, benetan, edozein ikastarotan. Ordezkaritza bat besterik ez da. Zehatza bit baratzeak ahaztu dut. Puntu mugikorreko ideia da esleitu bit kopuru jakin bat irudikatzeko. Funtsean, dena idazkera zientifikoan. Beraz, zenbaki bera,, 1,2345 bezala irudikatzeko bit kopuru zehatza esleitu behar duzu. Ezin da inoiz I zenbaki bat ordezkatzen 5 baino gehiago digituak. Orduan ere bit kopuru jakin bat esleitu eta horrela izan ohi da bakarrik joan ahal izango duzu kopuru jakin bat, berretzailea handiena izan dezakezu bezala, eta bakarrik joan zaitezke, zenbait adierazle bat gustatzen adierazgarri txikiena izan dezakezu. Ez dut gogoratzen modu zehatza bit dira balio horiek guztiak esleitutako baina bit kopuru jakin bat dira 1,2345 eskainitako bit beste kopuru jakin bat berretzailea eskainitako dira, eta tamaina jakin baten adierazle bat ordezkatzen bakarrik da posible. [Ikasleak] Eta bikoitz bat? Dela extra karroza luze bat bezala? >> Bai. 8 byte 4 bytes ordez erabiltzen ari zara izan ezik mugikor bat gauza bera da. Orain 9 digituak edo 10 digituak erabili ahal izango duzu, eta hau 300 ordez 100 joateko gai izango da. >> [Ikasleak] Larreina. Eta karroza ere 4 bytes. >> Bai. Beno, berriro, araberakoa izango da ziur aski, oro har ezartzeko, oro har, baina karroza 4 bytes, bikoitzak 8 dira. Bikotekako bikoitza deitzen ari dira, bikoitza delako karroza tamaina. [Ikasleak] Larreina. Eta daude bikoitza bikoizten? >> Ez daude. Nik uste dut - >> [ikasleak] Longs luze bezala? >> Bai. Ez dut uste. Bai. [Ikasleak] iaz proba On buruzko galdera bat izan zen funtzio nagusia programaren zati izan beharrik. Erantzuna ez dela programaren zati izan zen. Zer egoera? Hori da, zer ikusi nuen. [Bowden] Badirudi - >> [ikasleak] Zer egoera? Arazoa izan al duzu? >> [Ikasleen] Bai, zalantzarik gabe ezin dut tira it up. Ez izatea, teknikoki, baina funtsean izango da. [Ikasleak] bat ikusi nuen bat urte hainbat. True edo False izan zen bezalakoa da: A baliozko >> Oh, c file.? [Ikasleak] Any c fitxategia izan behar - [biak aldi berean hitz egiten - ulertezina] Ongi da. Beraz, bereizita. A c file besterik ez funtzio eduki behar da. Makina kodea fitxategia, 'binary, edozein konpilatu ahal izango duzu, exekutagarri gabe izatea oraindik. Exekutagarriaren baliozko funtzio nagusi bat izan behar da. 100 1 fitxategi batean funtzioak, baina nagusia ez idatzi ditzakezu eta, ondoren, konpilatu behera bitarra ondoren, beste fitxategi nagusiak bakarrik du idazten duzun, baina funtzio horiek sorta bat deitzen da hemen fitxategi bitar honetan. Eta beraz, exekutagarriaren egiten ari zaren, zer da estekatzailearen du horiek 2 fitxategi bitarrak exekutagarri bat konbinatzen ditu. Beraz, c fitxategia ez da beharrezkoa funtzio nagusia dute. Eta kodea big oinarriak milaka c fitxategiak eta fitxategi 1 nagusia ikusiko duzu. Galdera gehiago? [Ikasleak] Ez dago beste galdera bat izan zen. Konpiladore bat egin esan du. Egia ala gezurra? Eta erantzun faltsua izan da, eta zergatik ez da Clang bezala ulertu nuen. Baina zer egin ez bada deitu dugu? Egin da, funtsean, just - zehazki zer deiak dezaket. Baina komandoak exekutatzen besterik ez da. Egin. Honen tira ahal izango dut. Bai. Oh, bai. Egin ere jasotzen du. Dio egiteko lanabesaren helburua da automatikoki zehazteko handi bat programa zuzenak behar konpilatzen eta igorriko komandoak konpilatu. Egin diren fitxategiak erabat izugarria egin dezakezu. Fitxategiak denbora-zigiluak eta etorkizunari begira, eta, esan bezala egin aurretik, banakako fitxategiak konpilatu ditzakezu behera, eta ez da behar estekatzailearen iritsi arte dute elkarrekin jartzen ari exekutagarri batean. Beraz, bada, 10 fitxategiak duzu eta aldaketa bat egiten duzun horietako 1, orduan zer egiteko egingo da, besterik birkonpilatu 1 fitxategi eta berriro estekatzeko guztia elkarrekin. Baina hori baino askoz dumber da. Da duzu guztiz definitu hori, eta zer egiten ari izan beharko luke. Default by denbora zigilua stuff hau ezagutzeko gaitasuna, baina marka fitxategi bat idatzi dezakezu ezer egin. Idatzi bat egin file egiteko cd besterik ez da beste direktorio bat idatzi duzu. Dezakezu I zen lortzean frustrated I Tack nire Appliance barruan dena delako eta, ondoren, Mac PDF ikusteko. Beraz, joan Finder dut, eta ez dut joan daiteke, zerbitzarira konektatu, eta zerbitzariarekin konektatu nahi dut nire Appliance da, eta, ondoren, ireki I PDF lortzen LaTeX konpilatua izan da. Baina I zen lortzean frustrated PDF freskatzeko behar nuen denbora bakoitza delako, Kopiatu direktorioa atzitu ezin dela jakin bat izan nuen eta gogaikarriak izan zen lortzean. Beraz, bat egin, gauzak nola egiten du zehaztu behar duzu fitxategia ordez idatzi nuen. Nola egin duzu hau PDF LaTeX da. Just egiteko beste edozein fitxategi bezala edo ez duzu ikusi marka fitxategiak uste dut, baina Tresnaren marka global bat fitxategi besterik ez dio, C fitxategi bat konpilatzean, erabili Clang. Eta beraz, hemen nire marka fitxategi batean egiten dut esaten, Fitxategi hau PDF LaTeX konpilatu nahi duzu. Eta horrela LaTeX PDF den konpilazioaren egiten da. Egin ez da konpilatzeko. Besterik ez da komando hauek exekutatzen sekuentzia zehaztu I. Beraz, PDF LaTeX exekutatzen du, kopiatzen direktoriora kopiatu nahi dut, cd direktorioa da eta beste gauza batzuk ez, baina guztiak ere ez da ezagutzen fitxategi aldaketa bat, eta aldatzen bada, orduan dela suposatzen exekutatu komandoak exekutatu egingo du aldaketak. >> [Ikasleak] Larreina. Ez dakit non marka global fitxategiak Niri ikusteko. Beste galdera? Iraganeko ezer galdetegiak? Erakuslea gauza Any? Erakusleak bezala, gauza sotil daude Ez dut galdetegiaren galdera bat aurkitzeko gai da izango - baina gauza sort hau atsegin dute. Ziurtatu dut esango ulertzen duzula int * x * y - Hau ez da zehazki hemen ezer, I guess. Bezalako Baina * x * y, 2 aldagai pila horiek. When I say x = malloc (sizeof (int)), x pila aldagai bat da oraindik, malloc, zeure en bloke bat da, eta x puntu izatea eta zeure ari gara. Beraz, zerbait on to zeure puntu pila. Bakoitzean ezer malloc duzu ari bazara, ezinbestean erakuslea barruan gordetzeko. Erakuslea duten pila da, beraz, bloke malloced zeure gainean. Jende asko lortzen nahastu eta esan int * x = malloc x zeure gainean. N º Zer x puntu zeure gainean. x bera pila da, edozein arrazoigatik x ez baduzu global aldagai bat izango da, Kasu horietan, memoria eskualdeko beste gertatzen da. Jarraipena Beraz, koadroa, eta gezi diagrama horiek dira pretty galdetegia. Edo ez bada, 1 quiz quiz 0 izango da. Horiek guztiak jakin behar duzu, konpilatzean urrats izan horietan galderak erantzun geroztik. Bai. [Ikasleak] Ezin izan joan urrats horietan zehar, - >> Sure. Urrats eta konpilatzean aurretik preprocessing dugu, konpilatzean, muntaia, eta lotzen ditu. Preprocessing. Zer ari da hori egiten? Errazena urratsean da ondo, ez bezala - horrek ez du esan nahi, begi-bistakoa izan beharko luke,, baina errazena urratsa da. Zaudete ezartzea izan zuek. Bai. [Ikasleak] Hartu, zer zure atsegin dute hau barne hartzen ditu eta, ondoren kopiatzen ere definitzen. # Include bezalako gauzak itxura eta # define eta zerbait kopiak eta pastak zer horiek benetan esan nahi. Beraz, # include cs50.h diozu, preprocessor da kopiatu eta cs50.h itsasteko Ildo horretan. Noiz, # define x 4 izango diozu, preprocessor programa osoa pasatzen eta 4 x instantzia guztiak ordezkatzen du. Beraz preprocessor C baliozko fitxategia hartu eta baliozko fitxategia C irteerak non gauzak dira kopiatu eta itsatsi. Beraz, gaur egun konpilatzean. Zer ari da hori egiten? [Ikasleak] C bitar doan da. [Bowden] ez du modu guztiak joan bitarra. [Ikasleak] makina kodea orduan? >> Ez da makina kodea. [Ikasleen] Batzar? >> Batzar. Batzarrari doan doan bide guztiak aurretik C kodea eta hizkuntza gehienetan zerbait hau atsegin dute. Aukeratu goi-mailako edozein hizkuntzatan, eta ari zaren konpilatu bada, litekeena urratsetan konpilatu da. Lehenengoa Python biltzeko C da eta, ondoren, C Batzarrari biltzeko da, eta, ondoren, Batzar binary itzulirik egingo. Beraz konpilatzean da ekarri C Batzarrari. Hitza konpilatzean normalean esan nahi du goi-mailako jarriz maila txikiagoa programazio-lengoaia. Beraz, hau konpilazio urrats bakarra non goi-mailako hizkuntza batekin hasiko da eta, azkenean, behe-mailako hizkuntza batean, eta horregatik urrats konpilatzean deritzo. [Ikasleak] konpilatzean zehar, demagun # include egin duzula cs50.h. Konpiladore konpilatu cs50.h da, ez dira funtzio bezala, eta sartzen Batzar kodea itzuli baita, edo kopiatu eta itsatsi pre-Batzar den zerbait? cs50.h egingo pretty much inoiz ez amaitzeko Batzar. Stuff funtzioa prototipoak eta gauzak bezala dira besterik ez, kontuz ibili ahal izango duzu. Konpiladorea gauza egiaztatu ahal zaren funtzio bezala deituz bermatzen du itzulerako eskubidea motak eta argumentuak eta stuff eskubidea. Beraz cs50.h fitxategi sartu egingo da preprocessed, eta orduan, konpilatzean da du, batez ere, bota egiten du ziurtatu dena ari da deitu behar bezala ondoren. Baina CS50 liburutegia definitutako funtzioak diren cs50.h urrun horiek ez dira bereizita konpilatua izan da. Hau izango da benetan llegado lotzen dituen urratsa, eta, beraz, bigarren bat egingo dugu. Baina, lehenik eta behin, zer da muntaia? [Ikasleen] Batzar bitarra? >> Bai. Muntaia. Ez dugu deitu konpilatzean Batzar pretty da askoz bitar itzulpen hutsa dela. Batzar bitarraren joan logika oso txikia da. Besterik ez da nahi taula bat sortu bilatzen, oh, Instrukzio hau dugu; bitarra 01110 dagokio. Eta, beraz, fitxategiak, oro har, muntaia irteerak o fitxategiak. Eta o fitxategiak dira aurretik ginen esaten, fitxategi bat nola ez funtzio nagusia izan behar. Edozein fitxategi behera. O fitxategia luze bat baliozko fitxategia C konpila daitezke. Konpila daitezke. O. Orain, lotzen ditu, eta zer benetan sorta bat dakar. O fitxategiak eta exekutagarri bat ekartzen. Eta beraz, zer esteka ez da CS50 liburutegi dezakezu uste o fitxategi gisa. Dagoeneko konpilatuta fitxategi bitarra da. Eta, beraz, zure koadernoan, zure hello.c, deiak GetString konpilatu duzu, hello.c lortzen konpilatu behera hello.o hello.o da gaur egun bitar. -GetString erabiltzen ditu, eta, beraz baino gehiago joan cs50.o behar da, eta estekatzailearen smooshes elkarrekin eta GetString kopiatzen fitxategi horretan txertatu eta funtzio guztiak behar ditu, exekutagarri bat ateratzen. Beraz cs50.o ez da benetan O fitxategi bat, baina hurbil nahikoa ez dagoela funtsezko desberdintasuna ez da. Beraz, fitxategi estekatzeko sorta bat biltzen ditu bereizita eduki duten funtzio guztiak erabili behar dut eta benetan exekutatu exekutagarria sortzen da. Eta, beraz, hori ere aurretik genuen esaten non 1000 izan dezakezu. c fitxategiak, horiek guztiak konpilatu duzun o fitxategiak, Ziurrenik pixka bat hartu eta, ondoren, 1 aldatzeko aukera ematen dizu. c file. Konpilatu 1. C fitxategia eta berriro estekatzeko, beste guztia, bakarrik behar duzu lotzeko guztia atzera elkarrekin. [Ikasleak] lotzen dituen lcs50 idazten ari gara? Bai, eta, beraz, lcs50. Estekatzailearen, liburutegi horretan seinaleak Ez duzula behar lotzen dituen hori. Zalantzak dituzu? Igaro bitarra segundotan lehenengo hitzaldia 5 baino beste gainean dugu? Ez dut uste. Big Os ditudan desagertu baino gehiago jakin behar duzu, eta hau egin ahal izango duzu behar, eman dugu funtzio bat izanez gero, big O da, gutxi gorabehera, esan ahal izango duzu behar. Edo ondo, big O zakarra da. Beraz, ikusten baduzu, loops, gauza bera kopurua begizta habiaratuak, >> [ikasleen] n karratu - int j, j > N karratu ohi da. Duzu habiaratuak hirukoitza bada, n cubed izan ohi da. Beraz, gauza sort hori ahal izango da berehala behar duzu. Txertatzeko-sort eta burbuila sort ezagutu eta sort eta horiek guztiak batu behar duzu. Errazagoa da ulertzen zergatik duten n karratu eta n log n, eta hori guztia dira Nik uste dut galdetegi bat egin zuen, urtebete eman funtsean dizugu delako burbuila sort ezartzeko, eta hau esan: "Zer da funtzio honen iraupena?" Beraz, bada ezagutzen duzu burbuila sort gisa, eta gero, berehala dezakezu esan n karratu. Baina bada besterik ez duzu begiratzen, ez duzu, nahiz eta behar burbuila sort konturatzen; bakarrik esan dezakezu, hau da, hau eta hau egiten. Hau da, karratu n. [Ikasleak] Ba al dago edozein adibide gogorra etorri dezakezu, out kalkulatzen antzeko ideia bat? Ez dut uste edozein gogorra adibide emango genuke. Burbuila sort gauza da gogorra litzateke gara, eta, are gehiago, betiere, ulertzen duzun bezala ari array zehar errepikatzean array elementu bakoitza, hau da, zerbait n karratu izango. Galdera daude, oro har, hemen bezala dugu - Oh. Just beste egunean, Doug erreklamatu, "asmatu dut array bat ordenatzeko algoritmo bat "O (log n) denbora! Zenbakiak n" Beraz, nola ez da hori ezinezkoa ezagutzen dugu? [Inaudible ikaslearen erantzuna] >> Bai. Oso gutxienez, elementu bakoitzaren ukitu array duzu array bat ordenatzen, beraz, ezinezkoa da Ordena Unsorted guztia bada, eta, ondoren, ukitu guztia array ari zaren, n O baino gutxiago, beraz, ezinezkoa da. [Ikasleak] n O egin ahal izatea adibidez hori erakutsi duzu memoria asko erabiltzen bada. >> Bai. Eta that's ahazten dut zer that's kontatuta sort da? Hmm. Osoko Ordenatzeko algoritmoa da. Hau izen berezi nintzen azken astean ez dut gogoratzen bila. Bai. Hauek ordenatzen mota big n O gauzak betetzeko dira. Baina ez dira mugak, bezala erabili dezakezu soil-soilik zenbaki osoen kopuru jakin bat. Plus zerbait that's ordenatzeko saiatzen ari zaren bada - Zure array 012, -12, 151, 4 milioi bada, ondoren, elementu bakar hori guztiz hondatu ordena osoa joan. Zalantzak dituzu? [Ikasleak] recursive funtzioa bada, eta horregatik besterik ez ditu dei errekurtsiboak bueltan adierazpen baten barruan, buztana recursive eta, beraz, hori ez da memoria gehiago erabili exekuzio bitartean edo, gutxienez, izango litzateke erabili konpara memoria bat etorriko irtenbide gisa? [Bowden] Bai. Seguruenik litzateke pixka bat motelagoa, baina ez benetan. Tail recursive nahiko ona da. Berriro Looking pila markoak, demagun nagusia dugu eta int bar (int x) edo zerbait egin behar dugu. Hau ez da perfektua recursive funtzioa, baina bueltan bar (x - 1). Beraz, jakina, hau da flawed. Oinarri kasu eta stuff behar duzu. Baina hemen ideia hau buztana recursive da, nagusia deiak bar bere pila-markoa lortzeko esan nahi du. Pila marko honetan ez da memoria bloke txiki bat izango bere argumentua x dagokio. Eta, beraz, demagun nagusia gertatzen bar (100) deitu; Beraz, x 100 hasteko. Konpilatzailea aitortzen recursive funtzio hori buztana bada, orduan, bar, bere dei errekurtsiboa bar, pila marko berri bat, hau da, non pila hasiko da, neurri handi batean, gero eta handiagoa egin beharrean, azkenean, zeure sartu egingo da eta, ondoren, segfaults lortuko duzu memoria talka hasten delako. Beraz, bere pila-markoa egiteko ordez, konturatu ahal izango da, hey, benetan inoiz ez dut itzuli beharko pila fotograma honetan, ordez besterik ez dut 99 argumentua hau ordezkatu eta, ondoren, osoan zehar barra hasteko. Eta gero egingo da berriro, eta itzulera bar helduko da (x - 1), eta pila marko berri bat egin ordez, aski izango da ordezkatu gaur egungo argumentu 98 eta, ondoren, salto itzuli bar hasieran. Eragiketa horiek, pila 1 balioa ordezkatuz, eta atzera jauzi hasieran, nahiko eraginkorrak dira. Beraz, ez soilik, hau da, aparteko funtzio gisa memoria berean erabilera, hau da, joan-etorriko 1 pilaren markoa ari zaren bakarrik erabiliz, baina ez duzu downsides jasaten funtzioak deitu beharrik. Deitzen funtzioak zertxobait garestia izan daiteke konfigurazio hau guztia egin behar delako eta teardown eta stuff hori guztia. Beraz, buztana errekurtsio honen ona da. [Ikasleen] Zergatik ez sortu du urrats berria? Konturatuko da ez delako behar du. Bar deia besterik ez da dei errekurtsiboa itzuli. Beraz, ez du ezer egin beharko Itzultzen den balioa. Besterik ez da berehala itzultzeko. Beraz, besterik ez da bere argumentua ordezkatu eta berriro hasi. Eta gainera, buztana recursive bertsioan ez baduzu, ondoren taberna horiek non bar hau itzultzen bere balioa itzuliko da, hau da, gero barra berehala itzultzen ditu eta bere balioa itzultzen du, hau da, ondoren, besterik ez da berehala itzultzeko itzuli eta bere balioa hau. Beraz, gauza horiek guztiak leihoa off pila ari zaren aurrezteko Itzultzen den balioa besterik ez da igaro behar guztiak kopiak hala ere joan. Beraz, zergatik ez bakarrik ordezkatu gure argudioa eguneratu argumentua eta berriro hasi? Funtzioa ez da buztana recursive badu, antzeko zerbait bada, - [Ikasleak] bar (x + 1). >> Bai. Beraz, bada baldintza jarri duzu eta, ondoren, zerbait ari zaren Itzultzen den balioa. Edo, nahiz eta ez besterik ez duzu bueltan 2 * bar (x - 1). Beraz, gaur egun bar behar du (x - 1) 2 veces duten balioa kalkulatu ahal izateko itzultzeko, beraz, gaur egun, bere aparteko pila markoa behar du, eta, gaur egun, ez du axola nola gogor saiatu, behar zaren joan Hau ez da buztana errekurtsibitatean. [Ikasleak] buztana errekurtsio helburua errekurtsio ekartzea saiatzen naiz [Bowden] mundu ideal bat, baina CS50 ez duzu. Buztana errekurtsio, oro har, sortu argumentu bat gehiago non bar int x hartuko y sartu eta y itzuli nahi duzun azken gauza dagokio. (1 - x), 2 * y Orduan itzuli bar ari zaren joan. Beraz, hori da besterik gabe, goi-mailako gauzak nola buztana recursive eraldatu duzu. Baina argumentu estra - Eta gero, azkenean, zure base kasuan helduko zara, itzultzeko besterik ez duzu y duzun izan delako, denbora osoa metatu nahi duzun Itzultzen den balioa. Duzu mota horretako egiten iteratively baina dei errekurtsiboak erabiliz. Zalantzak dituzu? Agian erakuslea aritmetika [ikasleak], kateak erabiliz. >> Sure. Erakuslea aritmetika. Kateak erabiltzen erraza da kateak char ko delako, karakteretan dira betiko, eta, beti ere, single byte eta, beraz, erakuslea aritmetika aritmetika erregularra kateak ari zaren aurre baliokidea. Dezagun, besterik gabe esan char * s = "hello". Beraz, memoria bloke bat behar dugu. 6 byte behar da, beti behar duzu, null amaierako. Eta char * s array honen hasieran seinalatu. Beraz, puntu s. Orain, hau da, funtsean, array edozein nola funtzionatzen du, , malloc edo pilan ote itzulera bat izan zen ala ez kontuan hartu gabe. Array Edozein array Irteeran erakuslea da, funtsean, eta, ondoren, array edozein eragiketa, indexatzeko edozein, besterik ez da array horretan jakin bat desplazamendua. Beraz, s [3] antzeko zerbait esan dut; hau da, s eta 3 karakteretan kontatuta sartu Beraz, s [3], 0 dugu, 1, 2, 3, beraz, s [3] l hau aipatzeko. [Ikasleak] Eta balio bera s + 3 egiteko eta, ondoren, parentesi star iritsiko izan dugu? Bai. * (S + 3) baliokidea da; eta hori betirako eta beti baliokide ez du axola zer egin nahi duzu. Bracket sintaxia erabili behar duzu, inoiz ez. Erabili ahal izango duzu beti * (s + 3) sintaxia. Pertsonak izaten bracket sintaxia nahi, baina. [Ikasleak] Beraz, array guztiak benetan besterik ez dira erakusleak. Arina bereizketa dut esan int x [4]; >> [ikasleak] sortzeko memoria? [Bowden] Hau da, 4 ints sortu pila, eta, beraz, 16 byte orokorra. Pilaketan 16 byte sortu da. x ez da gordetzen edonora joateko. Besterik ez da ikurra gauza Irteeran buruzkoa. Deklaratu duzu, array delako funtzio honen barruan, konpilatzailea da zer egingo da, besterik gabe, ordezkatu x aldagaia instantzia guztiak non aukeratu 16 byte horiek jarri gertatu da. Ezin da egin char * s s benetako erakusle bat delako. Free ondoren beste gauza batzuk seinalatu da. x konstante bat da. Beste array bat puntu ezin duzu. >> [Ikasleak] Larreina. Baina, indexatzeko hau, ideia hau bera da kontuan hartu gabe ote den array bat tradizionala edo da zerbait edo erakuslea bada, array bat malloced erakuslea da. Eta hain zuzen ere, eta, beraz, baliokideak hori dela ere gauza bera da. Besterik ez da benetan giltzen barruan zer itzuli eta zer parentesi artean utzi, gehitzen elkarrekin, eta dereferences. Beraz, hori besterik ez da baliozko * (s + 3) edo s [3]. [Ikasleak] erakusleak 2 dimentsioko array erakusten duzu? Zailagoa da. Orain arte, ez. 2 dimentsiotako array bat besterik ez da, batzuk eroso sintaxia array 1-dimentsioko dut esan int x [3] [3], hau da, benetan 9 balioak array 1 besterik ez. Eta beraz, I indizea, konpiladore daki zer esan nahi dut. Diot x [1] [2], bigarren ilaran joan nahi dut badaki, beraz, lehen 3 saltatzeko, bada eta, ondoren, bigarren gauza dela, eta, beraz, hau da joan nahi duen. Baina oraindik ez da bakarra-dimentsioko array bat. Eta, beraz, nahi nuen erakuslea bat esleitzeko array hori bada, Esan int * p = x I izango du; X mota besterik ez da Zakarra esaten x mota da sinbolo bat da geroztik, eta ez da benetako aldagai bat, baina int * bat besterik ez da. x honen hasieran erakuslea bat besterik ez da. >> [Ikasleak] Larreina. Eta, beraz, ez dut ahal izango du [1] [2] sartzeko. Sintaxia berezia da erakuslea geratuko dela uste dut, int bezalako zerbait barregarria (* p [- zerbait erabat barregarria ez dakite. Baina parentesi eta gauzak bezala erakusleak geratuko sintaxia da. Agian ez da, nahiz eta utzi egiten duzu. Atzera begiratu nuen zerbait egia esango luke. Begiratu egingo dut geroago, puntu sintaxia bada. Baina inoiz ez dira ikusten. Eta are sintaxia da, beraz, arkaikoa erabiltzen baduzu, jendeak baffled egingo da. Multidimentsionala array nahiko arraroa da. Duzu pretty askoz Beno, ari zaren matrize gauzak egiten bada ez da arraroa izan da, baina C oso gutxitan ari zaren erabiliz array multidimensional. Bai. >> [Ikasleak] dezagun esan benetan luzea array duzu. Beraz, memoria birtual agertzen guztiak partiduko izango litzateke, elementuak bata bestearen ondoan bezala, baina memoria fisiko, ahalik eta horretarako sortu zatitu behar da? >> Bai. Nola memoria birtuala lanak bereizten besterik ez da - Esleipena unitate orri bat, 4 kilobyteko izan ohi da, eta, beraz, prozesu bat dio, hey, memoria hau erabili ahal izateko egin nahi dut, sistema eragilearen esleitzeko, memoria pixka bloke 4 kilobyteko. Nahiz eta erabili besterik ez duzu memoria bloke osoa gutxi single byte sistema eragilearen 4 kilobyteko emateko. Beraz, zer esan nahi izan nuen demagun hau da nire pila. Pila bereizita litezke. Nire pila megabyte eta megabyte izan daiteke. Nire pila izugarria izan daiteke. Baina pila bera orriak banakako zatitu izan behar du, esan dugu hemen dezagun gure RAM da, 2 RAM gigabyte bada, uneko helbidea hau nire RAM zeroth byte bezalako 0 da, eta 2 gigabyteko guztiak hemen. Beraz, baliteke orri hau bloke honetan dagozkie hemen. Orri hau agian bloke honetan dagozkie hemen. Hori hemen dagozkie. Sistema eragilea doakoa da Beraz, fisiko memoria esleitu edozein arbitrarioki. Eta horrek esan nahi du mugan gertatzen array bat straddle nahi izanez gero, array bat gertatzen da, hau utzi eta eskubidea orrialde baten ordena honetan, ondoren, array hori memoria fisikoa zatitu behar. Eta orduan, programatik irten duzunean, prozesua bukatzen denean, mapaketa hauek ezabatu, eta gero beste gauza blokeak apur hauek erabiltzeko free da. Galdera gehiago? [Ikasleak] erakuslea aritmetika. >> Oh yeah. Strings errazagoa izan ziren, baina ints antzeko zerbait begiratzeko, beraz, itzuli int x [4]; Array bat da ala ez adierazten du edo 4 zenbaki osoen array malloced erakuslea bat da ala ez, modu berean tratatu behar da. [Ikasleak] Beraz, array zeure gainean daude? [Bowden] Arrayak ez dira zeure gainean. >> [Ikasleak] Oh. [Bowden] array-mota ugari pilaketan deklaratu ezean - global aldagai jaramonik ez. Ez erabili aldagai global. Funtzio bat esango dizut Inside int x [4]; Array honetan pilaketan bloke 4-zenbaki oso bat sortu da. Baina malloc (4 * sizeof (int)); zeure gainean joango da. Baina puntu honen ondoren, x eta p erabili ahal izango dut pretty askoz ere modu berean, buruz aurretik p berriro ezar ditzakezu esan dut salbuespenak baino beste. Teknikoki, bere tamaina zertxobait ezberdinak dira, baina hori guztiz garrantzirik. Egia esan, inoiz ez duzu erabili beren tamaina. P esan izan dut p [3] = 2; edo x [3] = 2; Zehazki modu berean erabil ditzakezu. Beraz, erakuslea aritmetika - Bai. [Ikasleak] ez dute egin behar duzu parentesi artean bada p *? Parentesi artean inplizitu dereference dira. >> Ados. Gaur egun, gainera, esaten ari zaren array multidimensional lortuko duzu erakusleak, zer egin dezakezu zerbait, demagun, int ** pp = malloc (sizeof (int *) * 5); Besterik ez dut idazteko guztiak izarrekin lehen. Ez nuen nahi bat. Ongi da. Zer egin nuen - pp [i] izan behar du. Beraz, pp erakuslea erakuslea da. Pp ari zara mallocing, 5 stars int array bat seinalatu. Beraz, memoria pila págs 5 blokeak diren guztiak bere burua erakusleak array bat seinalatu. Eta orduan, behera malloc dut hemen, I malloc horiek banakako erakusle bakoitzak zeure gainean 4 byte bloke bereizi bat seinalatu behar da. Beraz, 4 byte puntu honetan. Eta beste modu batean 4 bytes bat puntu honetan. Eta horiek guztiak bere 4 bytes. Honek ematen dit multidimensional Gauzak egiteko modu bat. Pp [3] [4], baina gaur egun, hau da, ez da gauza bera multidimensional gisa array esan izan dut multidimensional array [3] [4] x array sartu desplazamendu bakar bat sartu. itzulitako delako Dereferences p honek, hirugarren indizea sartzen, gero dereferences eta sarbideak - 4 baliogabea izango litzateke bigarren indizea. Genuen int x [3] [4] gisa aurretik multidimensional array bat, berriz, eta bracket bikoiztu benetan dereference bakarra, single erakuslea ari zaren jarraituz eta, ondoren, desplazamendu hau da, benetan 2D erreferentziak. 2 aparteko erakusleak jarraitzen duzu. Hau ere, teknikoki Beraz, aukera ematen du multidimensional array izan behar duzu non banakako array bakoitzak tamaina da. Beraz, uste dut zorrotzak multidimensional array zer deitzen Lehenik eta behin, benetan 10 elementu ditu zerbait seinalatu geroztik, bigarren gauza izan 100 elementu ditu zerbait seinalatu. [Ikasleak] erakusle izan dezakezu edozein muga beste erakusleak erakusten? >> N º. Int ***** p dezakezu. Atzera erakuslea aritmetika - >> [ikasleak] Oh. >> Bai. [Ikasleak] daukat int *** p bada eta orduan dereferencing bat egin dut, eta esan dut p * balio hau berdina da, maila 1 dereferencing bakarrik egin behar da? >> Bai. Beraz, bada, gauza da azken erakuslea apuntatzen sartu nahi dut - Ondoren, *** p. >> Ados. Beraz, p 1 blokea, bloke beste puntu, beste bloke puntu puntu da. Orduan ez duzu * bada p = beste zerbait, eta gero hau duzun bezala, aldatzen beste bloke bat seinalatu. >> Ados. [Bowden] Eta horiek malloced bada, ondoren, gaur egun dituzun leaked memoria gertatuko horien erreferentziak desberdinak izan ezean dezakezu, ez baita itzuli dira horiek besterik gabe bota urruntzen. Erakuslea aritmetika. int x [4]; 4 zenbaki osoen array bat esleitu non x array-hasieratik seinalatu. Beraz, x [1] antzeko zerbait esan dut; array osokoa bigarren joan esan nahi du nahi dut, ko hau izango litzateke. Baina, benetan, 4 byte array sartu osokoa hartzen du geroztik, 4 bytes. 1-desplazamendua benetan esan nahi du, beraz, 1 desplazamendu aldiz tamaina edozein array-mota da. Zenbaki osoen array bat da, beraz, 1 aldiz int tamaina daki desplazamendu nahi. Beste sintaxia. Gogoratu hau * (x + 1) baliokidea da; Erakuslea esan I + 1, zer itzultzen duten erakusleak gordetzeko helbidea gehi 1 aldiz erakuslea mota tamaina. Beraz, bada, x = ox100, gero x + 1 = ox104. Eta hau gehiegi erabili ahal izango duzu, eta zerbait esan bezala char * c = (char *) x; eta, gaur egun, c x helbide bera izango da. c ox100 berdinak izango, baina c + 1 ox101 berdinak izango erakuslea aritmetika erakuslea mota duzun gehituz araberakoa baita. Beraz, c + 1, itxura c, char erakuslea da, eta, beraz, 1 aldiz char tamaina gehitzeko, joan den beti 1 izan behar du eta, beraz, 101 lortuko duzu, do I x ere, hau da, oraindik ere 100 bada, x + 1, berriz, 104 izango da. [Ikasleak] c + + ordena zure erakuslea aurrera 1 erabili nahi duzun? Bai, ahal duzu. Ezin duzu egin x x sinbolo bat besterik ez da delako, konstante bat da, ezin duzu aldatu x. Baina c gertatzen erakuslea besterik ez izan, beraz, c + + primeran baliozko eta Kontatzailea 1 izango da. C balitz, int * bat, eta, ondoren, c + + 104 izango litzateke. + + Erakuslea aritmetika ez bezala, c + 1 egin beharko lukete erakuslea aritmetika. Hau da, benetan nola merge sort bezala gauza asko - Gauza kopiak sortzeko beharrean, ordez dezakezu gainditu Atsegin dut nahi nuen array Zati hau gainditu nahi baduzu utzi hau batzuk ezabatuko da. Dezagun, array, alde honetan funtzio bat pasatzeko esan nahi nuen. Zer izango litzateke funtzio hori gainditu behar dut? Igaroko I x izanez gero, helbide honetara joan naiz pasatzen. Baina helbide hau gainditu nahi dut. Beraz, zer egin behar igaroko da? [Ikasleen] erakuslea + 2? [Bowden] Beraz, x + 2. Bai. Hau da helbide honetan izango da. Aukera izango duzu maiz ikusten x [2], eta, ondoren, horren helbidea. Beraz, helbidea hartu behar duzu parentesi inplizitu dereference bat delako. x [2] balioa koadro honetan aipatzen da, eta, ondoren, kutxa helbidea nahi duzun, Beraz, esan & x [2]. Beraz, nola merge sailkatu zerbait non zerrendan erdi pasa behar zerbait nahi duzun besterik ez duzula gainditu & x [2], eta, orain, dei errekurtsiboa dagokionez, nire array berria hasten du. Azken orduko galderak. [Ikasleak] ampersand bat jarri ez badugu edo zer da hori deitzen? >> Star? [Ikasleak] Star. >> Teknikoki, dereference operadorea, baina - >> [ikasleak] Dereference. Ampersand bat edo izar bat jarri ez badugu, zer gertatzen da, besterik ez dut esaten bada y = x eta x erakuslea da? Zer da y mota? >> [Ikasleak] besterik ez dut esango da erakuslea 2. Beraz, bada esan duzu y = x, gaur egun, x eta y puntu gauza bera. >> [Ikasleak] Point gauza bera. Eta x int erakusle bat bada? >> Kexatu, ezin delako esleitzeko erakusle litzateke. [Ikasleak] Larreina. Gogoratu erakusle hori, nahiz eta horiek marraztu dugu geziak, benetan duten denda guztiak - int * x - x guztiak benetan gordetzeko ox100 antzeko zerbait da, 100 gordetako blokea seinalatuz irudikatzeko gertatuko. Beraz, esango dizut int * y = x; besterik ez dut ox100 kopiatzeko y, besterik ez ari gara y gisa irudikatzeko ere, ox100 seinalatuz. Eta esaten badut int i = (int) x; gero edozein ox100 balioa gorde egingo da i barruan, baina gaur egun, erakuslea ordez osoko gisa interpretatu behar da joan. Baina cast behar duzu, edo, bestela, kexatu egingo da. [Ikasleak] Beraz, ez bota nahi al duzu Va x edo casting y int int galdaketa? [Bowden] Zer da? [Ikasleak] Larreina. Parentesi hauen ondoren da hor x edo ay han izango? [Bowden] Edo. x eta y baliokideak dira. >> [Ikasleak] Larreina. Oraindik erakusleak bi delako. >> Bai. [Ikasleak] Beraz, hamaseitarra 100 gordetzeko litzateke inprimaki osokoaren? >> [Bowden] Bai. Baina ez da edozein dela ere adierazi du balio. [Bowden] Bai. >> [Ikasleak] Beraz, inprimaki osokoaren helbidea. Ongi da. [Bowden] arrazoi batzuk bitxi bada nahi duzun, esklusiboki izan duzu erakusle aurre egiteko eta ez du inoiz zenbaki osoen aurre egiteko eta, int * x = 0 bezalakoa izango da. Ondoren, benetan nahastu erakuslea aritmetika hasten da gertatzen ari dena behin duzu. Beraz gordetzen dituzten zenbakiak dira zentzugabeak. Besterik ez amaitzeko nola sortu dituzu interpretatzeko da. Beraz, free ox100 kopiatu int * int bat naiz, you're ziurrenik ez galdaketa eskuratzeko yelled joan eta free esleitzeko naiz Free zerbait esleitzeko (int *) int * arbitrarioak sartu ox1234 atsegin dut. Beraz ox123 bezala baliozko memoria-helbide bat da, eta y. & Y gertatzen den zerbait pretty askoz ox123 itzultzeko. [Ikasleen] litzaizuke izatea hamaseitarrean hamartar inprimaki joateko modu benetan cool, nahi duzu erakuslea bada, eta int bat bota duzu? [Bowden] benetan bakarrik inprima ditzakezu printf bezala erabiliz. Demagun int y = 100 daukat. Beraz, printf (% d \ n - dagoeneko jakin behar duzun bezala - inprimatu zenbaki oso bat,% x. Besterik ez dugu inprimatu hamaseitar bezala. Beraz, erakuslea ez da hamaseitar bezala gordetzen dira, eta zenbaki oso bat ez da hamartar gisa gordetzen dira. Dena bitar gisa gordetzen da. Besterik ez da izan ohi dugun hamaseitar bezala erakusleak erakusteko 4-byte bloke horietan gauza dela uste duelako, eta memoria helbideak joera ezagutu behar dira. BF hasten bada, esate baterako, gero pila gertatzen gara. Beraz, besterik ez da gure hamaseitar bezala erakusleak interpretazioa. Ongi da. Azken edozein galdera? Hemen egongo naiz apur bat, eta ondoren beste ezer behar duzu. Eta hori amaieran. [Ikasleak] Yay! [Txalo] [CS50.TV]