[Powered by Google Translate] [Artikulua 5 - erosoagoa] [Rob Bowden - Harvard Unibertsitatea] [Hau CS50 da. - CS50.TV] Nire posta esan nuen bezala, erabil dezakezu gauza asko daude tresna benetan egiten arazo multzo baino beste. Tresnan egiten duzun baizik gomendatzen dugu gero errazago zaitzakegu duzu eta dena da nola lanera joan dakigu. Baina bat non gauza egin ahal izango duzu, baldin eta esan adibide gisa, ez duzu sarbidea -tresnaren bat edo Zientzia Center sotoan lan egin nahi baduzu benetan aparatuaren dute ere nahi izanez gero, edozein lekutan lan egiteko. Horren adibide da / ikusten duzu SSH entzun? SSH da, funtsean, besterik gabe, zerbait konektatzeko bezala. Egia esan, oraintxe dut aparatuaren SSHed. Inoiz ez dut zuzenean tresnan. Hemen-tresna da, eta itxura behera hemen IP helbide hau ikusiko duzu. -Tresnak, berez, inoiz ez dut lan; Beti dut leiho bat iTerm2 / terminal leihoa. IP helbide hori, ssh jharvard@192.168.129.128 SSH ditzakezu. Zenbaki hori gogoratzen dut oso erraz da, nice eredu bat delako. Baina hori galdetu egingo Nire pasahitza, eta gaur egun naiz aparatuaren dut. Funtsean, puntu honetan, ireki baduzu, terminal bat-tresnaren beraren barruan, Interfaze hau, baina erabili nahi duzun da, bera interfaze gisa baino gehiago naiz Hemen, baina orain ari SSHed. Ez duzu tresnara SSH. Beste leku bat SSH ezin izan duzu adibide bat da, nahiko ziur naiz lehenespenez - Oh. Handiagoa da. Guztiak default FAS FAS zerbitzariak kontuak izan behar. Niretzat, SSH nuke rbowden@nice.fas.harvard.edu. Lehen aldiz eskatu du, eta bai esan duzu. Nire pasahitza besterik ez da izango nire FAS pasahitza. Eta beraz, gaur egun, naiz nice zerbitzariak SSHed, eta hemen nahi dut ezer egin ezin dut. Asko, klaseak hartu, baliteke 124 atsegin stuff igo duzun hemen arazo multzo benetan aurkeztu. Baina esan, ez duzu zure-tresnaren sarbidea. Ondoren gauza egin dezakezu, hemen bezala esango Hau besterik ez da gure galdera atalean. Eskatuko dizu Horretarako, aparatuaren. Horren ordez, besterik ez dut egin zerbitzarian. Deskonprimitu duten noa. Arazoa da gedit antzeko zerbait erabiltzen duzula ari izango edo edozein tresnaren barruan. Ez duzu duten FAS zerbitzariak. Besterik ez da interfaze hau testuala izango da. Beraz, bai bat izan nahi baduzu, saiatu testu-editore bat ez dutela ikasteko. Nano dute. Nano izan ohi da, nahiko erraza da erabiltzeko. Zure geziak erabil dezakezu, eta normalean idatzi. Beraz, ez da zaila. Nahi duzun benetan Fancy bada Emacs erabili ahal izango duzu, dudan beharko ez ez dudalako dakite nola itxi Emacs ireki. Kontrol X, Control C? Bai. Edo Vim, hau da, zer erabiliko dut erabili ahal izango duzu. Eta, beraz, horiek dira aukerak. Nahi ez baduzu, horretarako, egin dezakezu, gainera, begiratzen baduzu manual.cs50.net-- Oh. PC bat, SSH dezakezu plastilina erabiliz, bereizita deskargatzeko behar duzu. Mac batean, erabilera Terminal lehenetsia edo zuk iTerm2 deskargatu daiteke, fancy Terminal, nice bat bezalakoa da. Joan behar bada manual.cs50.net Notepad link bat ikusiko duzu + +, hau da, zer PC bat erabili ahal izango dituzu. SFTP Notepad aukera ematen du + +, hau da, funtsean, SSH. Zer da hau zuk utziko da editatu zure fitxategiak lokalki, eta, ondoren, gorde nahi duzun bakoitzean, nice.fas izango da gorde non gero berriro exekuta dezakezu ditu. Eta Mac bat baliokidea da TextWrangler izango da. Beraz, gauza bera egiten duzun aukera dago. Fitxategiak editatzeko lokalean eta gorde nice.fas aukera ematen du, non gero berriro exekuta dezakezu ditu. Beraz, zu inoiz bada-tresnaren bat gabe itsasten duzu, aukera hauek oraindik ere egin zure arazoa multzo. Arazo bat da, ez zarela CS50 liburutegia izan behar izango nice.fas lehenespenez ez delako. Edo deskargatzeko aukera duzu CS50 liburutegia Ez dut uste hori behar dut puntu honetan. Edo deskargatzeko aukera duzu CS50 liburutegia eta kopiatu baino gehiago nice.fas edo puntu honetan ez dugu erabili da gehiago hala ere, uste dut. Edo ez badugu, denbora dezakezu ordeztu ari duten CS50 liburutegi funtzioen inplementazioak hala ere. Beraz, ez luke Murrizketa bat askoz. Eta hori da. Tresnara atzera jo dut gaur egun; aparatuaren guztia egin dugu. Gure galdera atalean, hasieran, nire posta esan nuen bezala, bat ikusteko ziren ustezko labur buruz hitz egin dugu. Berbideratu eta Tutuak eta hiru galdera hauek ditugu. Horretarako, korrontea ez funtzio, printf bezala default idatzi? Korronte, beraz. Zer da korrontea? Korronte bat da, funtsean, bezala batzuk - Ez da 1s eta 0 s-iturri bat ere. Korrontea da hemen galdetuz out estandarra da. Eta beraz, estandar out korronte bat dela idazten duzunean, agertzen da pantailan. Standard out, erreka, idatzi besterik ez duzu 1s eta 0 s da esan nahi du, eta estandar out amaiera beste korronte horretatik aurrera irakurtzen du. 1s eta 0 s kate bat besterik ez da. Los arroyos idatz dezakezu, edo erreka irakur dezakezu korrontea benetan da arabera. Beste bi erreka default estandarra eta errore estandarra. Standard da bakoitzean GetString ez, zuretzat sarrera stuff zain. Beraz, zain duzu, benetan estandarrean zain hau da, benetan zer idatzi teklatua lortuko duzu. Estandar sartu sartu ari zara idazten Standard error standard out baliokidea da, funtsean, baina horretan aditua da inprimatu errore estandarraren zauden ustezko errore-mezuak bakarrik inprimatu ahal izateko beraz, pantailan inprimatu mezuak erregularra artean bereizteko dezakezu errore-mezu estandar edo errore estandarra dute joan den arabera vs. Fitxategiak ere. Standard out, estandarra, eta errore estandarra erreka besterik ez bereziak dira, baina benetan, edozein fitxategi, fitxategi bat irekitzeko, bytes korronte bat bihurtzen da korronte hori irakurri dezakezu. Zati handiena, duzu, besterik byte korronte gisa fitxategi bat pentsatzea. Beraz, zer erreka idatzi dute lehenespenez? Standard out. Zer da> eta >> arteko desberdintasuna? Ba al edonork ikusi bideoa aldez aurretik? Ongi da. > Nola sartu redirect fitxategiak izango da, eta >> ere fitxategiak irteera redirect baizik fitxategi eransteko. Esate baterako, demagun dict eskubide izango dute hemen gertatuko I dict barruan stuff cat, cat, dog, arraina, txakurra da. Komandoa komando-lerroan duzula cat da, den besterik gabe, fitxategi batean inprimatzeko. Beraz, cat dict diot, cat, cat, dog, arraina, txakurra inprimatu dute. Hori da cat guztia egiten du. Horrek esan nahi du, modu estandarrean inprimatu cat, cat, dog, arraina, txakurra out. Ordez, hori birbideratu fitxategi batean nahi baduzu, erabili> I daiteke eta redirect edozein fitxategia da. Fitxategi deitu dut. Beraz, gaur egun I ls izanez gero, ikus izeneko fitxategi fitxategi berri bat daukat dut. Eta ireki dut bada, zehazki zer cat komando-lerroan jarri izan dute. Beraz, orain ez dut berriro, eta ondoren irteera berbideraketa fitxategi egingo eta zehatza gauza bera izan dut. Beraz, teknikoki, erabat overrode izan duguna. Ikusi eta alda dezaket dict dugu, txakurra hartu nuen. Orain dugu cat fitxategi dict berriro bada, txakur kendu bertsio berri izan dugu. Beraz, erabat gainidazten da. Horren ordez, erabiltzen dugu >> bada, fitxategia erantsi egingo. Orain, fitxategia irekitzean, inprimatutako bi aldiz gauza bera ikusiko dugu izan ez delako behin, eta gero erantsita jatorrizko dugu. Beraz, hori da> eta >> ez. Hurrengo bat ez du eskatu ez du galdetzeko. Dugula beste bat <, bada> out estandarra k birzuzentzen da, 2 ez duzu> errore estandarra berbideratu. Beraz, bada zerbait errore estandarraren joan zen, litzateke ez txt2 sartu jarri. Baina konturatu egin behar dut> 2 bada, eta oraindik ere, Kaixo inprimatzea, Rob! komando-lerroa errore estandarraren berbideratu dut bakarrik, ez naiz estandarra berbideratu. Standard error and standard out desberdinak dira. Errore estandarraren benetan idatzi nahi duzun bada, ondoren, hau alda dezake I stderr fprintf izan. Beraz printf, default, standard out "bistaratzen du. Errore estandarraren inprimatu nahi dut eskuz bada, orduan fprintf erabili behar dut eta zehaztu zer inprimatu nahi dut. Fprintf stdout ordez egin badut, orduan funtsean baliokidea printf. Baina fprintf errore estandarra. Beraz, gaur egun, hau redirect I txt2 sartu, Hello, Rob! dago oraindik lortzean komando-lerroan inprimatutako du lortzean geroztik errore estandarraren inprimatu eta soilik dut estandarra berbideratu. I redirect standard error bada, gaur egun ez get inprimatua, eta txt2 Kaixo, Rob! Beraz, gaur egun, inprima dezakezu zure benetako erroreak errore estandarraren inprimatu eta zure erregularra mezuak standard out. Eta beraz, programa exekutatzen baduzu, exekutatu dezakezu. / Kaixo mota honetako 2> beraz, zure programa da normalean exekutatu baina lortu duzun edozein errore-mezuak geroago egiaztatu ahal error log, akatsak, beraz, eta, ondoren, begiratu geroago eta zure akatsak fitxategia akatsak gertatu dira. Zalantzak dituzu? (A) ren kanalizazioa, uste duzu estandarra ateratzen komando bat da eta, hurrengo agindua estandarra. Adibide bat hemen dago oihartzuna lortu du komando-lerroko gauza da hori besterik gabe, edozein dela ere bere argumentua gisa jarri I echo. Komatxorik ez dut jarri. Echo blah, blah, blah blah, blah, blah inprimatu. Aurretik, esan dut Rob txt fitxategi batean jarri behar izan nuen dudalako redirect txt fitxategiak, horren ordez, / Rob echo badut eta, ondoren, kanalizazioa egitea. / hello, izango dela ere egin gauza bera mota. Komando honen irteera, Rob oihartzuna hartzen ari da, eta sarrera gisa erabiliz. / kaixo. Dezakezu uste lehen redirect echo Rob fitxategi batean eta orduan. / kaixo fitxategi sarrera besterik ez zuten outputted. Baina aldi baterako fitxategia irudiaren hartzen du. Horri buruzko galderak? Hurrengo galdera hau inplikatzeko. Zer pipeline izeneko fitxategi bat names.txt izen berezia zenbakia erabili nahi duzun? Berezia da, eta, beraz, uniq, eta, ondoren, wc komandoak erabili nahi dugu. Man uniq egin dezakezu benetan zer egiten duen begiratu, eta besterik ez datozen lerroak aldameneko iragazi sarrera. Eta gizon wc newline, hitza, eta fitxategi bakoitzaren zenbatzen byte inprimatu. Eta azken bat sort erabili nahi dugu, hau da, den txt fitxategia lerro besterik ez ordenatzeko. Egiten dut txt fitxategia, names.txt bada, eta Rob, Tommy, Joseph, Tommy, Joseph, RJ, Rob da, hemen egin nahi dut fitxategi honetako izen berezia da zenbakia. Beraz, zer egin behar erantzuna izango ote da? >> [Ikasleak] 4. >> Bai. Izango 4 behar da noiztik Rob, Tommy, Joseph, RJ fitxategi honetan izenak soilik berezia dira. Lehen urratsa besterik ez dut hitz egiten bada Aldaketa names.txt hori benetan me kontatzen dena. Hau da, benetan inprimatzeko - Ikus dezagun, gizon wc - argumentu bat, hitzak, eta byte kopuruan. Dut lerro bakarrik badu zaintzeko, ondoren, besterik gabe, ez dut wc-l names.txt. Beraz, urrats 1. Baina ez dut wc-l names.txt nahi names.txt besterik ez duelako, izen guztiak, eta berezia ez dira edozein iragazi nahi dut. Beraz egin dut uniq names.txt, hori ez da nahiko eman nahi dudana bikoizturik izenak dira oraindik ere dagoelako. Zergatik da hori? Zergatik da uniq ez nahi dudana egiten? [Ikasleak] bikoiztuak ez dira [inaudible] >> Bai. Gogoratu man orria uniq dio iragazkiaren ondoko datozen lerroak. Oraindik ez dute aldamenean, beraz, ez da horietako iragazi. Ordenatzeko ditut lehen, sort names.txt bikoiztuak lerro guztiak jarri elkarrekin. Beraz, orain sort names.txt dela. Uniq | uniq, hau da, sarrera gisa erabiltzen duten nahi dut. Hau da, me Joseph, RJ, Rob, Tommy, eta hori wc-l sarrera gisa erabili nahi dut, den me emateko 4. Dio hemen bezala, zer pipeline erabili ahal izango duzu? Komando multzo bat erabiliz bezala gauza asko egin dezakezu non irteera erabiltzen duzun komando bat, hurrengo agindua sarrera gisa. Gauza asko,, clever gauza asko egin dezakezu. Zalantzak dituzu? Ongi da. Hori hodiak eta birbidalketa da. Orain dugu, benetako stuff, kodifikazioa stuff. PDF hau Inside, komando hau ikusiko duzu, eta komando hau exekutatu nahi zure tresnan duzu. wget komandoa da, funtsean, Interneten zerbait lortzean wget eta URL hau. URL honen joan, zure nabigatzailean bada, fitxategi hori deskargatu litzateke. Dut, bertan klik eginez,, beraz fitxategia deskargatu niretzat. Baina gauza wget terminalaren barruan idatziz besterik ez da zure terminal deskargatzeko. Section5.zip dut, eta nahi section5.zip deskonprimitu beharko duzu, hori emateko deitu section5 karpeta bat, den fitxategiak erabiltzen ari den gaur egun barruan goaz. Programa horiek 'fitxategi-izen gisa gomendatzen, buggy bit ari dira, beraz, zure zeregina da irudikatu zergatik gdb erabiliz. Ez du denek dute / kokapena daki nola horien kokapena beren-tresna da? Ongi da. ./buggy1 Carrera, segmentaziuo hutsegitea (core iraultzeko) esan du, eta une oro bat segfault lortuko duzu, gauza txarra da. Zer egoera pean ez segfault duzu? [Ikasleak] null erakuslea Dereferencing. >> Bai. Beraz, adibide bat da. Null erakuslea Dereferencing bat segfault lortzeko ari zaren. Zer da segfault bitartez memoria ari zaren ukitzen ez zenuke dela ukituko. Beraz, null erakuslea dereferencing helbidea 0 ukitu, eta, batez ere, ordenagailu guztietan, gaur egun esan helbidea 0 da, memoria ez da behar duzu ukitu. Beraz, zergatik bat segfault erakuslea null emaitzak dereferencing. Erakuslea ez hasieratu gertatuko gero, zabor-balioa du, eta, beraz, saiatu dereference duzu aukera guztiak, zu memoria ukitu ezerezaren erdian. Gertatuko zortea eta zabor-balioa gertatu nonbait seinalatu pila edo zerbait, orduan, erakuslea horrek ez duzu hasieratu dereference duzu, ez da ezer oker joan da. Baina, nahi izanez gero seinalatuz, esan, nonbait,, pila eta zeure artean, edo, besterik gabe, nonbait dela ez da zure programa erabiltzen da oraindik seinalatuz, ondoren, memoria ari zaren ukitzen ez behar duzu ukitu eta segfault duzu. Recursive funtzio bat idazten duzu, eta gehiegi aldiz recurses eta zure pila hazten handiegia da eta pila talka gauzak behar dela ez da talka, memoria ez zaren ukitu behar duzu ukitu, beraz segfault. Hau da bat segfault da. Gainera, arrazoi berberagatik kate bat bezala baduzu dezagun atzera jo aurreko programa. In hello.c-I'm besterik gabe, beste zerbait egin. char * s = "hello world!"; Erabiltzen dut * s = zerbait edo s [0] = 'X'; beraz, kaixo, / hello, zergatik hori segfault? Zergatik segfault? Zer gertatuko espero duzu? Nuen printf bada ("% s \ n", z); zer egingo inprimatu egingo espero duzu? [Ikasleen] X kaixo. >> Bai. Arazoa da hau atsegin kate bat aldarrikatu duzu, s erakuslea bat pilaketan joango da, eta zer da s seinalatuz irakurtzeko soilik memoria jasotako den katea da. Beraz, izena, irakurtzeko soilik memoria, ideia jaso behar duzu saiatu irakurtzeko soilik memoria aldatu nahi izanez gero, zerbait ez duzu memoria egiten ari zarenean eta segfault duzu. Char * s eta char s [] arteko diferentzia handi bat da, benetan. Horrela, char s [], gaur egun kate hau pila jarri, eta pila ez da irakurtzeko-bakarrik, eta horrek esan nahi du, hori ezin hobeto ondo funtzionatu behar luke. Eta egiten du. Gogoratu char egiten dut * s = "hello world!", S bera pilaketan baina beste nonbait puntu, eta beste nonbait gertatzen irakurtzeko bakarrik izan. Baina char s [] pilaren zerbait besterik ez da. Beraz, bat segfault gertatzen ari den beste adibide bat da. ./buggy1 Bat segfault ikusi dugu. Teorian, ez behar duzu buggy1.c at bilatzeko berehala. Horren ordez, bilatuko dugu gdb bidez. Jakinarazten segmentaziuo hutsegitea (core irauliko), Fitxategi hau core hemen izeneko gainean. Ls-l bada, ikus core ohi dela pretty big fitxategi bat dugu. Fitxategia byte kopurua da, beraz, 250-zerbait kilobyteko dirudienez. Horren arrazoia da zer esan core dump benetan zure programa bat kraskatzen denean, programaren memoria egoera besterik ez denean kopiatu eta fitxategi hau itsatsi. Fitxategi hori isurtzen denean. Programa honek, berriz, korrika, 250 kilobyteko memoria erabilera gertatu zen, eta, beraz, zer egin fitxategi hau isurtzen. Orain fitxategi hori begiratu dezakezu gdb buggy1 core bada egiten dugu. Gdb buggy1 besterik ez dugu egin daiteke, eta hori izango da martxan gdb aldian-aldian, buggy1 bere sarrera-fitxategi gisa erabiliz. Baina gdb buggy1 core ez bada, ondoren, zehazki, martxan gdb core fitxategia hartan. Eta esaten buggy1 bide gdb daki core fitxategi hori buggy1 programa dator. Beraz, gdb buggy1 core berehala ekarriko du non programa gertatu amaitzeko. Hemen ikusten dugu programa seinalea 11, segmentaziuo hutsegitea amaitu da. Muntaketa, ziurrenik ez da oso lagungarria lerro bat gertatuko dugu. Baina zuk idatzi bt edo backtrace bada, funtzioa izango da ematen digu gure pila uneko fotograma zerrenda. Beraz, backtrace. Bakarrik bi pila markoak dugu bezala dirudi. Lehenengo eta behin, gure pila marko nagusia da, eta bigarrena, funtzio hau izango gertatuko dugun markoa pila da, bakarrik begiratzen dugu bezala muntaia kodea. Beraz, dezagun atzera jo, gure funtzio nagusia, eta marko 1 dugu egin daiteke, eta ere egin ahal dugu behera uste dut, baina inoiz ez ia, ez dut behera - edo. Bai. Eta Gora behera. Up, pila fotograma bat ekartzen hasi behar duzu, behera eramango zaitu pila fotograma bat. Inoiz ez hori erabili ohi dut. Zehazki, besterik ez dut esaten den frame 1, etiketatu 1 markoa joan. Frame 1 gurekin ekartzea pila nagusiak marko batean, eta hemen dio kode lerro izango gertatuko dugu. Nahi izan dugu kode lerro pare bat gehiago bada, zerrenda esan dezakegu, eta hori ezagutzera emango kode lerro guztiak bere inguruan. Lerroan segfaulted dugu 6 zen: if (strcmp ("CS50 arroka", argv [1]) == 0). Begi-bistakoa da, ez bada oraindik, lortu ahal izango duzu zuzenean hemen zergatik segfaulted pentsatzen. Hala ere, hartu ahal izango dugu urrats bat gehiago eta esatea, "Zergatik argv [1] segfault?" Dezagun inprimatu argv [1], eta bere 0x0, null erakuslea da itxura bezala. CS50 arroka eta null strcmping ari gara, eta, beraz, hori segfault. Eta zergatik da, argv [1] null? [Ikasleen] ez ez dugulako eman komando-lerroko argumentuak edozein. Bai. Ez dugu eman komando-lerroko argumentuak edozein. Beraz ./buggy1 argv [0] izan ./buggy1. Ez da argv bat [1], segfault joan, beraz. Baina, horren ordez, ze CS50 egin behar dut, D bat esan joan hori zer egin behar delako. . Buggy1.c begira, ustezko inprimatu "D bat lortu ahal izango dituzu" Argv [1] bada, ez da "CS50 arroka", "D bat lortu ahal izango dituzu", bestela "A lortu ahal izango dituzu!" Beraz, bada bat nahi dugu, hau egia gisa alderatu behar dugu, Horrek esan nahi du: 0 konparatzen. Beraz, argv [1] "CS50 arroka" izan behar da. Nahi duzun komando-lerroan bada, \ erabili espazioa ihes egin behar duzu. Beraz CS50 \ arroka eta ez duzu bat! Egin ez baduzu backslash, zergatik ez da lan? [Ikasleak] bi argumentuak da. >> Bai. Argv [1] CS50 izango da, eta argv [2] arroka izango da. Ongi da. Orain ./buggy2 berriro segfault. Bere core fitxategia irekitzean ordez, besterik ez dugu ireki buggy2 zuzenean gdb buggy2 beraz. Orain gure programa besterik ez dugu exekutatu bada, gero Programan jasotako seinalea SIGSEGV esan nahi du joan segfault den seinale, eta hau da, non gertatuko gertatu da. Gure backtrace begira, funtzio oh_no ginen ikusiko dugu, funtzioa dinky izan zen, funtzio binky deitu deitu zen, izan zen nagusia deituta. Argumentuak ere ikus ahal izango ditugu, funtzio horiek. Argumentua dinky eta binky 1 izan zen. Zerrendara funtzioa oh_no oh_no besterik ez da char ** s = NULL egiten bada, ikusiko dugu; * S = "BOOM"; Zergatik huts egin? [Ikasleen] ezin duzu dereference null erakuslea? >> Bai. Hau besterik ez da NULL da s esaten, edozein izanik ere gertatzen den char ** bat izan nahi izanez gero, duen, nola interpretatu duzun arabera, kate erakuslea erakuslea izan zitekeen edo kateen array bat. NULL s da, eta, beraz, * s null erakuslea da dereferencing eta, beraz, hau da huts egingo. Ziurrenik dezakezu segfault modurik azkarrena bat da. Null erakuslea besterik ez da geratuko eta berehala segfaulting. Horixe oh_no egiten ari da. Joaten gara, bada, fotograma bat, eta gero izeneko funtzioa oh_no sartu dugu. Horretarako behera behar dut. Ez baduzu, idatzi komando bat eta sakatu besterik ez duzu Sartu berriro, errepikatu egingo da, aurreko komandoa exekutatu duzun besterik ez. Hauek dira: 1. Fotograman dugu. Fotograma honetan zerrenda, hemen gure funtzioa ikusiko dugu. Zerrenda hit dezakezu berriro, edo zerrenda 20 egin ahal izango duzu eta gehiago zerrendatuko dira. Funtzioak-i 1 bada dinky dio, ondoren oh_no funtzioa joan bestela funtzioa slinky joan. Eta 1 i gertatuko dugu hemen ikusteko delako ezagutzen dugun 1 argumentua deitu dinky zela. Edo, besterik gabe dezakezu i inprimatu ez eta esan 1 i izango da. Ari gara dinky, eta gara beste marko bati, amaitzeko sortu dugu binky dakigu. Up. Oraindik orain binky dugu. Erdia moztu me aurretik off zerrenda - funtzio hau zerrenda - off balitz bezala hasi da 0 da i, eta gero deitu du oh_no goaz, bestela deitu dinky. 1 i ezagutzen dugu, beraz, dinky deitu. Eta orain itzuli gara nagusian, eta nagusia int i = RAND ()% 3 besterik ez da izango; Hori besterik ez da ausazko zenbaki bat eman nahi zaio, hau da, bai 0, 1 edo 2. , Deitu zenbaki hori binky da, eta 0 itzuliko da. Begira, programaren bidez eskuz exekutatzen ari berehala gabe oinez, nagusian break puntu bat ezarri nahi duzun, eta horrek esan nahi du programa zure programa exekutatzen hits break puntu bat arte. Programa exekutatzen ari Beraz, exekutatu izango da eta, ondoren, funtzio nagusia kolpatu du, eta gelditzeko exekutatzen ari. Oraindik nagusien barruan dugu, eta urrats edo hurrengo ekartzea hurrengo kode lerro. Urratsa edo hurrengo egin dezakezu. Hurrengo ukitzean, i izan aus ()% 3, beraz, i balioa inprimatu ahal izango dugu, eta esan 1 i izango da. Orain materia erabiltzen den ala ez edo hurrengo urratsa egingo du. Garrantzia aurreko batean, uste dut, baina hurrengo erabili nahi genuke. Urratsa erabiltzen dugu gero, funtzio sartu dugu, benetako gauza begirada esan nahi du binky barruan gertatzen. Erabiliko dugu hurrengo bada, orduan joan funtzioa esan nahi du eta, besterik gabe, gure funtzio nagusia kodea hurrengo lerroan joan. Eskuin hemen lerro hau izan zen, non aus ()% 3 esan nuen; nuen urratsa bada, aus ezartzea litzateke joan eta zer ez dago gertatzen ari begiratu, eta aus funtzio bidez izan dut urratsa. Baina ez dut aus funtzioa buruzko zaintzeko. Nahi dut hurrengo kode lerro nagusian, beraz, hurrengo erabiltzen dut. Baina orain arreta do I binky funtzioa, beraz, horretan urratsa egin nahi dut. Orain nago binky dut. Kodea lehen lerroa (i == 0), urrats bat hartzen bada esan nahi du, amaituko dugu dinky ikusiko dugu. Gauza dugu zerrenda, checked gero ikusiko dugu, i = 0. ez da i 0 berdinak, beraz, joan, bestela, baldintza den dinky (i) deitu behar da. Nahastu egin daitezke. Besterik ez duzu lerro hauen bada begiratu zuzenean, uste duzu (i == 0) bada, ados, eta gero beste urrats bat hartu nuen eta gaur egun naiz dinky (i) I uste 0 = i edo zerbait esan nahi behar duzu. N º besterik ez du esan nahi zuzenean itsasten line dinky (i) badaki hori. I ez delako 0, hurrengo urratsa da, eta ez beste amaitzeko. Bestela, ez da lerro bat gelditzeko. Besterik ez da, hurrengo lerroan benetan exekutatu ahal izango da, hau da, dinky (i) joango gara. Dinky (i) sartu hurrats, ikusten dugun (i == 1). Badakit ez = 1, eta, beraz, noiz zapaldu dugu, amaitzeko oh_no goaz badakigu = 1 i funtzioa oh_no, urratsa dezakezu sartu delako dei egiten du, ezarri char ** s = NULL berehala eta "BOOM". Eta gero, benetan buggy2 ezartzeko begira, 0, 1 edo 2 - deituz binky, hau da, besterik ez da i ausazko zenbaki bat lortzeko hau da, i 0 bada oh_no deiak, bestela dinky deiak, datorren hemen. I 1 bada, dei oh_no, bestela deitu slinky, datozen hemen, i 2 izanez gero, deitu oh_no. Ez dut uste modu bat da - Does Edozeinek ikus programa hori ez segfault egiteko modu bat? Dut zerbait falta ezean, i 0 bada delako, berehala dituzu segfault bestela, joan den funtzio bat da i 1 baduzu segfault bestela, joan funtzio bat bada i 2 segfault duzu. Ez dio axola zer egin nahi duzu Beraz, segfault. Char ** s = NULL ordez egitea izango litzateke, konpontzen modu bat asmatzen dut, espazio malloc katea. Sizeof zer - malloc (sizeof) egin izan dugu? [Ikasleak] (char) * 5? >> Ba al dirudi ezta? Hau benetan I ran bada lan egingo dut suposatuz, baina ez da zer bila nabil. S mota behatu. Dezagun int * gehitu eta, beraz, int * x. Malloc egin nahi dut (sizeof (int)). Edo I 5 array bat nahi izanez gero, egin (sizeof (int) * 5) nuke; Zer badut int ** bat? Zer izango litzateke I malloc? [Ikasleak] erakuslearen tamaina. >> Bai. (Sizeof (int *)); Same behera hemen gauza. (Sizeof (char *)) nahi dut; Hau da lekua esleitu erakuslea "BOOM" dela adierazi du. Ez dut behar lekua esleitu "BOOM" bera hau da, funtsean, zer aurretik esan dut baliokidea delako char * x = "BOOM". "BOOM" badago lehendik ere. Existitzeko gertatzen da memoria eskualdea irakurtzeko soilik. Baina lehendik egongo da, eta kode-lerro horrek esan nahi du, s char ** * s char * bat da, eta char * ari zaren "BOOM" seinalatu. Nahi dut "BOOM" s kopiatzeko bada, orduan s lekua esleitu beharko nuke. Egin dut * s = malloc (sizeof (char) * 5); Zergatik 5? Zergatik ez 4? Badirudi "BOOM" 4 karaktere bezalakoa da. >> [Ikasleak] null karakterea. Bai. Zure kateak guztiak null karaktere behar dira. Orain zerbait egin ahal izango dut strcat bezala - Zer da kate bat kopiatzeko funtzioa? [Ikasleen] cpy? >> Strcpy. man strcpy. Beraz strcpy edo strncpy. strncpy da pixka bat seguruago zehaztu dezakezu geroztik zehazki zenbat karaktere, baina hemen ez du axola ezagutzen dugulako. Beraz strcpy eta argumentuak bilatzeko. Lehen argumentua gure helmuga da. Bigarren argumentua gure iturri da. Gure helmuga * kopiatu ari gara "BOOM" erakuslea s. Zergatik izan liteke hori egin ordez besterik ez genuen strcpy aurretik nahi duzu * s = "BOOM"? Hau egin nahi duzun arrazoi bat da, baina zer da hori arrazoia? [Ikasleen] "BOOM" zerbait aldatu nahi baduzu. >> Bai. Orain s antzeko zerbait egin ahal izango dut [0] = 'X'; s puntu zeure eta zeure buruzko espazioa hori delako s da seinalatuz , zeure, "BOOM" gordetzeko leku gehiago erakuslea da. Beraz, "BOOM" kopia zeure en gordetzen ari da. Teknikoki "BOOM" gure programa bi kopia daude. Lehen bat besterik ez "BOOM" kate etengabea ematen da, "BOOM" bigarren kopia, strcpy "BOOM" kopia sortu. Baina "BOOM" kopia zeure e gordetzen dira, eta zeure aldatu free Oraindik duzu. Zeure ez da irakurtzeko-bakarrik, eta, beraz, horrek esan nahi du s [0] "BOOM" balioa aldatzeko dizu. Karaktere horiek aldatzeko dizu. Zalantzak dituzu? Ongi da. Eramatean. Buggy3, let gdb buggy3. Exekutatu besterik ez dugu, eta bat segfault vemos. Dugu backtrace bada, ez dira soilik bi funtzioak. Gara, bada, gure eginkizun nagusia bihurtu, lerro hau segfaulted dugun ikusiko dugu. Beraz, lerro hau begira, (int line = 0; fgets stuff honetan ez berdinak NULL du; line + +). Gure aurreko fotograma _IO_fgets deitzen zen. Eraikitako-in C funtzio asko ikusi duzu denean segfault lortuko duzu, ez dago benetan críptica funtzioa izenak izango da _IO_fgets hau atsegin dute. Baina hori fgets deialdi hau. Somewhere hemen barruan, segfaulting ari gara. Argumentuak begiratzen badiogu, fgets buffer inprimatu ahal izango dugu. Dezagun inprimatu - Oh, ez. Inprimatu ez da zehazki da nahi dudan bezala lan egiteko. Dezagun benetako programa begiratu. Buffer karaktere array bat da. 128 karaktere array pertsonaia bat da. Beraz, inprimatu buffer diot, 128 karaktere horiek inprimatu egingo da, I guess da, zer espero da. Zer bila nenbilen inprimatu buffer helbidea, baina horrek ez du benetan tell me askoz. Beraz, esan nahi hemen x buffer gertatuko I, me erakusten du 0xbffff090 Izan ere,, lehenago edo uneren gogoratzen bada, Oxbffff pila-ish eskualde bat izan ohi da. Pila joera nonbait hasteko 0xc000 pean. Helbide honetan ikusi, buffer pila gertatzen hori ezagutzen dut. Nire programa berrabiarazten, korrika egin, sortu, bufferreko karaktere-sekuentzia hau ikusi genuen diren pretty askoz zentzugabeak. Ondoren fitxategia inprimatzean, zer ez fitxategi itxura? [Ikasleen] Null. >> Bai. File mota FITXATEGIA * bat da, beraz, erakuslea da, eta erakuslea duten balioa nulua da. Beraz fgets erakuslea hori irakurri zeharkako modu batean saiatu, baina horretarako erakuslea horretara sartzeko, dereference da. Edo, zer da, dereferences da behar seinalatuz sartzeko. Beraz, null erakuslea eta segfaults da dereferencing. Berrabiarazi nuen han. Dugu gure puntu nagusietako bat apurtzen bada eta exekutatu, kodea lehen lerroa char * filename = "nonexistent.txt" da; Pretty big aholkua eman behar zergatik programa hau huts. Hurrengo Idazketa ekartzen dit hurrengo lerroan, non fitxategi hau irekitzeko, eta, ondoren, berehala gure line, non behin, hurrengo hit I sartu dut, segfault dute. Does Edozeinek nahi botatzeko arrazoia zergatik segfaulting egongo gara agian? [Ikasleak] Fitxategia ez da existitzen. >> Bai. Iradokizun bat izan da ustezko betiere, fitxategi batean irekitzeko ari zaren fitxategiaren benetan existitzen dela egiaztatu behar duzu. Beraz, hemen, "nonexistent.txt"; Dugunean fopen irakurtzeko izen, esan behar dugu (file == NULL) eta esan printf ("Fitxategia ez da existitzen!" edo hobeto oraindik filename); bueltan 1; Beraz, orain da NULL izanez gero, egiaztatu dugu benetan aurretik eta etengabeko fitxategi hori irakurri nahian. Remake bat dugu besterik ez da obra hori ikusteko. Lerro berri bat sartzeko asmoa dut. Beraz, gaur egun nonexistent.txt ez da existitzen. Beti behar duzu gauza sort hori egiaztatzeko. Egiaztatu beharko zenuke beti. Fopen NULL itzultzen bada ikusteko. Egiaztatu beharko zenuke beti. Malloc ez itzultzeko NULL, edo, bestela, segfault. Orain buggy4.c. Carrera. Asmatzeko dut sarrerako edo begizta ziurrenik infinitua zain. Bai, begizta infinitua da. Buggy4 Beraz. Oraindik begizta infinitua itxura. Nagusiak hautsi ahal izango dugu, gure programa exekutatu. Gdb, betiere, laburdura erabili da, zalantzarik gabe, edo laburdurak berezia dela ematen dute, ondoren n erabili ahal izango dituzu, hurrengo erabili ordez hurrengo modu guztiak idatzi beharrik. Eta orain ditudan hit n behin, besterik I sakatu Sartu hurrengo jarraitzeko n sakatu Sartu, n Sartu, n Sartu beharrik ordez. Badirudi nolabaiteko naiz bezala begizta array ezartzen den [i] eta 0. Am I like inoiz ez out hautsi begizta honen dirudi. Inprimatu I i bada, beraz, 2 da i, eta, ondoren, hurrengo dut. I inprimatu dut, 3 i, ondoren, hurrengo dut. I inprimatu dut eta 3 i. Ondoren, inprimatu i, 4 i. Egia esan, inprimatu sizeof (array), beraz, array tamaina 20 da. Baina ez gdb komando berezi batzuk bezala zerbait arte gertatzen! Begira. Aldagaiaren balioa baldintza bat ezartzea bezala da. Baina ez dut gogoratzen zer den. Beraz, bada mantendu dugu Zer diozu? Zer egin ekarri duzu? [Ikasleak] Does erakutsi i gehitu - >> Bai. Beraz, laguntza erakutsi ahal i. Besterik ez dugu erakutsi i bada, jarri izango da hemen zein i balioa da beraz, ez dut aldi bakoitzean inprimatzeko. Besterik ez dugu hurrengo mantentzeko bada joan, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5 ikusiko dugu. Zerbait izugarri oker joan da, eta ari da i 0 berrezartzeko. - Buggy4.c begira, guztietan gertatzen den array int [5] ikusiko dugu; (; i <= sizeof (array); i + + i = 0). array [i] = 0; Zer da hori, oker hemen ikusten dugu? Iradokizun bat bezala, gdb buggy4 egiten zen I - dezagun apurtu nagusia, run Inprimatu sizeof (array) nuen zer baldintza da, non, azkenik, hautsi izarrekin behar dut ikusteko. Non nago? Ba al dut exekutatu? Nik ez dut oraindik deklaratzeko. Beraz inprimatu sizeof (array), eta hori 20. espero da, nire array tamaina 5 eta 5 zenbaki osoen beraz, gauza osoa 5 * sizeof (int) byte izan beharko luke, non sizeof (int) joera 4an. Beraz, sizeof (array) 20. Zer egin behar izan? [Ikasleak] sizeof (int) arabera banatzen da. >> Bai, / sizeof (int). Ez da oraindik bezala hemen arazo bat dirudi. Hau besterik ez izan behar dela uste dut < baita pretty askoz beti > [Bowden] Bai. Gure array amaieran haratago goaz, nolabait espazio horretan ari gara gainidazteko i balioa ahaztuta. Eta, beraz, buggy4 begiratuz gero, break nagusiak, exekutatu, dezagun inprimatu i helbidea. Da bffff124 itxura. Orain dezagun array helbidea inprimatu [0]. 110. [1] buruz? 114. [2], 118. 11c, 120. array [5] bfff124 da. Beraz, array [5] i, eta horrek esan nahi du array hori [5] i helbidea bera du. Dute helbidea bera bada, gauza bera dira. Beraz, array [5] ezarri ditugu: 0, i buruz ari gara eta 0. Eta honi buruz uste baduzu pilaren dagokionez, int i izendatu zuten lehen aldiz, eta horrek esan nahi du espazio batzuk lortzen i pilaketan. Ondoren, array [5] esleituko da, eta, beraz, orduan 20 byte pilaketan banatzen dira. Beraz, i esleitu lortzen lehen aldiz, orduan 20 byte horiek esleitu get. Beraz, gertatzen array eskuinera aurretik i eta bidea delako, esan bezala azken astean, non teknikoki pila hazten behera, denean indizea array batean, bermatuta dugu array-en posizioa 0th array en lehen posizioa beti aurretik gertatzen da. Nola marraztu dut azken astean antzeko zerbait da. Ohartu, behealdean helbidea 0 dugu, eta goialdean helbidea Max dugu. Pila da beti behera gero eta handiagoa da. Demagun i esleitu dugu. Osokoaren esleitu i, eta horrek esan nahi du, let besterik ez esan hemen osokoaren i lortzen esleitu. Jarraian, gure 5 zenbaki osoen array esleitu, eta horrek esan nahi du horren azpian dugu, pila behera geroztik, gero eta handiagoa, 5 Osoko zenbaki horiek esleitu. Array en posizioa Baina nola array lan egiten delako, gaude bermatzen lehen beti helbide bat array bigarren gauza baino gutxiago ditu. Beraz, array posizioa 0 beti lehen gertatuko memoria, array posizio 1 du horren ondoren gertatuko, berriz, eta horren ondoren gertatuko array posizioa 2 horrek esan nahi du hori array posizioa 0 nonbait gertatuko litzateke behera hemen, array posizio 1 gainetik gertatuko litzateke sortu mugituz, esan nahi du goi-mailako helbideak delako gehienezko helbidea geroztik hemen. Beraz, array [0] behera hemen, array [1] sortu hemen, array [2] sortu hemen, array [3] sortu hemen. Ohartu nola aurretik guztia esleitu i modu guztiak, hemen, mugitzen gara gero eta gehiago gure array sartu, gure osokoa i eta hurbilago hurbilago ari gara. Beraz, besterik ez da array hori gertatzen da [5], posizioa gure array haratago bat da, zehazki non osokoaren gertatu i esleitu behar da. Beraz, bertan sakatuz espazioa pila gertatuko dugu zen guztia i esleitu, eta hori 0 ezartzen ari gara. Hori da nola lan egiten duen. Zalantzak dituzu? Bai. [Ikasleak] Never mind. Ongi da. [Ikasleak] Nola akatsak moduko horiek saihesteko duzu? Akatsak sort hauek? Ez erabili C programazio hizkuntza gisa. Erabili array mugetatik egiaztatzen duen hizkuntza bat. Betiere Oraindik duzun bezala, kontuz ibili, besterik ez duzu zure array mugetatik igaroz saihesteko. [Ikasleen] Hortaz, hona hemen azken zure array mugetatik joan gara - [Bowden] Hori da non gauzak oker joan. >> [Ikasleak] Oh, ados. Betiere, zure array esleitutako memoria barruan zaitezten, fina Oraindik duzun. Baina C error egiaztapena ez du. Array ez dut bada [1000], atsegin handiz izango da besterik ez aldatzeko, zer gerta ere Array hasieran doan da, eta, ondoren, 1000 posizioak jartzen da eta ondoren ezartzen du 0. Ez du egin egiaztapena edozein oh, hau ez da benetan 1000 gauzak. 1000 zer aldatuko nuke modu haratago da, Java edo zerbait array, berriz duzu mugetatik indizearen edo mugetatik salbuespen indizea. Horregatik, hizkuntza maila altuagoa asko gauza horiek non array mugetatik haratago joaten bada, hutsik egin beraz, ez duzu azpian gauzak alda ditzakezu eta, ondoren, gauzak besterik gabe, salbuespen bat lortzeko baino askoz okerragoa array amaieran haratago joan esanez. [Ikasleak] Eta horrela behar besterik ez dugu aldatu <= bakarrik > [Bowden] Bai. > [Ikasleak] Eskuin. Galdera gehiago? Ongi da. [Ikasleak] galdera bat daukat. >> Bai. [Ikasleen] Zer da benetako array aldagaia ez dago? [Bowden] Like zer da array? Array bera sinbolo bat da. Besterik ez da ari garen erreferentziatutako 20 byte Irteeran helbidea. Da egin ahal izango duzu uste erakuslea gisa,, baina etengabeko erakuslea da. Bezain laster gauzak get konpilatu, array aldagaia ez da existitzen jada. [Ikasleak] Beraz, nola array tamaina ez aurkitu? Array tamaina bloke tamaina ikur horretarako erreferentzia egiten dio erreferentzia. Printf antzeko zerbait egin behar dut ("% p \ n", array); dezagun exekutatu da. Zer egin dut gaizki? Array 'array' deklaratu hemen. Oh, hemen. Clang clever da, eta deklaratu duten I 5 elementu gisa array nabarituko gertatzen , baina posizioa 1000 sartu naiz indexatzeko. Egin daiteke, horiek besterik ez dira konstanteak delako. Bakarrik joan daiteke, beraz, orain arte, array mugetatik haratago joan naiz duten I ohartu. Baina okerra izan i izan dugu aldez aurretik, ezin da, seguru asko, zehaztu zenbat balio behar i izan, beraz, ezin da zehaztu zen i array amaiera haratago joan. Hori besterik ez argia izateaz Clang. Baina gaur egun buggy4. Beraz, zer gehiago am egiten oker I? Inplizituki 'printf' liburutegi funtzioa geratuko. # Include nahi dut. Ongi da. Orain buggy4 exekutatzen ari da. Array balioa inprimatzea bezala hemen egin nuen, erakuslea gisa inprimatzeko grabatuak zerbait itxura hau bfb8805c helbidea batzuk pila-ish eskualdean. Array bera erakuslea bat bezalakoa da, baina ez da benetako erakusle bat, erakuslea geroztik erregular bat aldatzeko aukera izango dugu. Array besterik ez da konstante batzuk. Memoria 20 bloke helbidea 0xbfb8805c etan hasiko da. Beraz, helbide honen bitartez bfb8805c +20- edo -20 uste dut array honetan esleitutako memoria da. Array, aldagai bera ez da gordetzen edonora joateko. Konpilatzen ari zarenean, konpiladore - eskua at uhin - baina konpiladorea erabili array izan daki. Array hori non hasten badaki, eta, beraz, beti izango da, besterik gabe gauzak offsets dagokionez hasieran horretatik aurrera. Ez du aldagai bat bera array irudikatu behar. Baina int * p = array antzeko zerbait egin dut, gaur egun p array hori seinalatzen duen erakuslea da, eta, gaur egun, p benetan pila ez da existitzen. Free p aldatu dut. P = malloc egin ahal izango dut. Beraz, array jatorriz adierazi du, gaur egun puntu espazio batzuk zeure gainean. Array = malloc egin ezin dut. Clang da clever bada, me at egingo du Yell eskuineko bat off. Egia esan, nahiko ziur gcc Horretarako litzateke gehiegi naiz. Beraz, array-mota 'int [5]' ez da esleitzekoak. Ezin duzu zerbait esleitzeko array mota array besterik ez konstante bat delako. Duen sinboloa 20 byte horiek erreferentzia da. Ezin dut aldatu. [Ikasleak] Eta non array-tamaina gordetzen da? [Bowden] gordetzen ez edonora joateko. Denean konpilatzen da. Beraz, non array tamaina gordetzen da? Bakarrik erabili ahal izango duzu sizeof (array) funtzioa array deklaratu hori bera barruan. Beraz, bada funtzio batzuk, foo, egin behar dut, eta ez dut (int array []) printf ("% d \ n", sizeof (array)); eta, ondoren, behera hemen foo (array) deitzen diot nik; funtzio honen barruan dezagun exekutatu da. Clang clever izatea berriro. Me da kontatzeko array funtzioa parametroak sizeof '* int' tamaina itzuliko da. Hau akats bat izango litzateke, ez balitz zer gertatuko nahi nuen. Dezagun benetan itzali Werror. Kontuz. Txartelak fina dira. Hala ere, konpilatu gisa irauten du abisu bat. . / A.out inprimatu 4. Sortu abisua txarto joan adierazle garbia da. Int array hau da, besterik gabe, sizeof (int *) inprimatu. Nahiz eta array [5] jarri dut hemen, oraindik ere, besterik gabe, sizeof (int *) inprimatu joan. Beraz, ahalik eta azkarren pasatzen duzun bezala funtzio batean, array-ak eta erakusleak arteko bereizketa existitzen ez den. Gertatzen da array bat izan zen pila izendatu, baina ahalik eta azkarren pasako balio bezala, 0xbf blah, blah, funtzio honetan sartu blah, ondoren erakuslea hau array hori puntu pilan. Beraz, horrek esan nahi du sizeof array izendatu zuten funtzioa bakarrik aplikatzen, eta horrek esan nahi du funtzio hau konpilatzen ari zaren, denean Clang funtzio honen bidez doa, array tamaina 5 array int bat ikusten da. Orduan sizeof (array) ikusten da. Beno, 20. Hori da benetan nola sizeof, funtsean, ia kasu guztietan funtzionatzen du. Sizeof ez da funtzio bat; eragile bat da. Ez duzu deitu sizeof funtzioa. Sizeof (int), konpiladorea du soilik 4 itzultzeko. Dut? Ongi da. [Ikasleak] Beraz, zer sizeof (array) arteko desberdintasun nagusia eta foo da? Hau da, ari gara sizeof (array), mota int * delako esaten, array behera hemen, berriz, ez da mota int * array bat da, int. [Ikasleak] Beraz, array [] ordez int * array izan parametro bada, zela esan nahi izan duzula oraindik aldatzeko array erakuslea delako? [Bowden] Like? >> [Ikasleak] Bai. Ezin array aldatzeko funtzio barruan orain? [Bowden] array alda dezake bi kasuetan. Kasu horietan, batean zein bestean, array [4] = 0 esan duzu. [Ikasleak] Baina array puntu beste zerbait egin duzu? [Bowden] Oh. Bai. Nolanahi ere - >> [ikasleak] Bai. [Bowden] array [] eta int * array arteko bereizketa, ez dago bat ere ez. Multidimentsionala array batzuk hemen ere lor dezake sintaxia batzuk erosoa, baina oraindik erakuslea besterik ez da. Horrek esan nahi du, free array egin naizela = malloc (sizeof (int)), eta gaur egun seinalatu beste nonbait. Baina, nola funtzionatzen du betirako eta beti, array honen aldaketak eginez beste zerbait seinalatu ez da aldatuko array hau da argumentua kopia bat delako, Ez da argumentu hori erakuslea. Eta, benetan, zantzurik gehiago dela bera Dagoeneko ikusi dugu zer inprimatzeko array grabatuak - zer inprimatu array helbidea edo array helbidea helbidea horiek bai? Dezagun ahaztu hau. Ongi da. Gauza ederra da. Gaur egun. / A.out ari da. Inprimaketa array, ondoren, array helbidea inprimatzeko, gauza bera dira. Array besterik gabe, ez da existitzen. Array ari zaren inprimatzea, sinboloa 20 byte horiek aipatzen ari zaren inprimatzeko daki. Array helbidea inprimatzea, bai, array ez du existitzen. Helbide bat ez da izan, beraz, 20 byte horiek helbidea bistaratzen besterik ez da. Bezain laster konpilatu behera, zure buggy4 konpilatu nahi. / A.out array existitzen ez da. Erakusleak existitzen. Arrayak ez. Array ordezkari memoria Bloke oraindik badaude, baina array aldagaiak eta mota horretako aldagai ez da existitzen. Dutenek, array-ak eta erakusleak arteko ezberdintasunak nagusiak bezalakoak dira funtzio deiak egin bezain laster, ez dago diferentzia da. Baina barruan funtzio array bera izendatu da, sizeof ezberdina ari zaren mota ordez tamaina bloke tamaina inprimatzeko geroztik, eta ezin duzu aldatu da sinbolo bat delako. Gauza eta helbidea gauza inprimatzea gauza bera inprimatzen ditu. Eta hori nahiko askoz da. [Ikasleak] Ezin izan bat denbora gehiago esan duzu? Galdu dut agian zerbait. Inprimaketa array eta helbidea array gauza bera bistaratzen inprimatu erakuslea erakusleak helbidea versus bada, berriz, Gauza bat da zer egiten ari zaren seinalatuz helbidea bistaratzen du, beste pilaren erakuslea helbidea bistaratzen du. Erakuslea aldatu ahal izango duzu, ezin duzu aldatu array sinbolo bat. Eta sizeof erakuslea da, erakuslea mota horren tamaina inprimatzeko. Beraz, int * p sizeof (p) 4 inprimatu baina int array [5] inprimatu sizeof (array) 20 inprimatzeko. [Ikasleak] Beraz, int array [5] 20 inprimatuko ditu? >> Bai. Horregatik buggy4 barruan sizeof (array) izan erabili hau izan zen i <20 egiteko, eta hori ez da nahi duguna. I <5 nahi dugu. >> [Ikasleak] Larreina. [Bowden] Eta gero, ahalik eta azkarren hasiko funtzioak pasatuz, egin badugu int * p = array; funtzio honen barruan, funtsean, ezin dugu erabili p eta array zehazki modu berean, sizeof arazoa aldatzen eta arazoa izan ezik. Baina p [0] = 1; array [0] = 1 esaten berdina da; Eta ahalik eta azkarren esan dugun bezala foo (array); edo foo (p); foo funtzioaren barruan, dei bera da birritan. Bi dei horien arteko aldea ez da. Pertsona orok on? Ongi da. 10 minutu ditugu. Saiatzeko honetan Hacker typer programa bidez lortu dugu, web orri honetan, azken urtean edo zerbait atera zen. Besterik ez ustezko ausaz idazten duzun bezala, eta bistaratzen du Whatever fitxategia kargatu dute gertatzen da, zer ari zaren idazten dirudienez. Sistema eragilearen kodea nolabaiteko itxura bezalakoa da. Hori zer ezartzea nahi dugu. Izeneko hacker_typer bitarrak exekutagarri bat izan behar duzu argumentu soil bat hartzen du, fitxategia "hacker mota." Exekutagarriaren carrera pantaila garbitu beharko eta, ondoren, inprimatu karaktere bat transmititutako-in fitxategia erabiltzaileak tekla bat sakatzen den bakoitzean. Edozein dela ere tekla sakatu Beraz, bota beharko luke, eta horren ordez, fitxategia karaktere bat inprimatzeko argumentua da. Pretty askoz dut esango dizu zer jakin behar dugu, gauzak dira. Baina ikusteko termios liburutegia nahi dugu. Ez dut inoiz liburutegi hau nire bizitza osoan, beraz, oso gutxieneko helburu ditu. Baina hau ez da urruntzen bota pertsonaia hit duzu erabili ahal izango dugu liburutegi izango estandar sartu idazten ari zaren Beraz hacker_typer.c, eta # include nahi dugu. Man orri termios Looking for - I'm da terminal OS edo zerbait asmatzen Ez dakit nola irakurri. Begira, 2 fitxategiak hauek dio, beraz, egin dugu. Lehenik eta behin, lehenik eta behin, argumentu bakar bat, fitxategia irekitzeko behar dugu hartu nahi dugu. Beraz, zer egin nahi dut? Nola argumentu soil bat daukat ikusteko egiaztatu dut? [Ikasleen] argc bada berdin da. >> [Bowden] Bai. Beraz, (argc = 2!) Printf ("erabilera:% s [fitxategia ireki]"). Beraz, gaur egun exekutatu I bada bigarren argumentu bat eskainiz gabe - oh, lerro berri behar dut ikus erabilera dio duzu:. / hacker_typer eta, ondoren, bigarren argumentua ireki nahi dut fitxategia izan behar du. Orain, zer egin dezaket? Fitxategi hau irakurri nahi dut. Nola fitxategi bat irakurri dut? [Ikasleak] lehen aldiz ireki dezakezu. >> Bai. Beraz, fopen. Zer esan nahi du fopen itxura? [Ikasleak] Filename. >> [Bowden] Filename argv [1] izango da. [Ikasleak] Eta gero, zer da egin nahi duzun, eta, beraz, - >> [Bowden] Bai. Beraz, ez baduzu gogoratzen, besterik gabe, ezin duzu gizon fopen non eraikiak char * path non bidea da filename izango da, char * eraikiak modua. Gertatuko ez gogoratzeko modua bada, orduan moduan begiratu dezakezu. Man orriak Inside, barrarik pertsonaia da zer gauzak bilatzeko erabili dezakezu. Beraz, / modua bilatzeko modua idazten dut. n eta N zikloa erabili ahal izango duzu bilaketa-partiduak bidez. Hemen argumentu moduan puntu dio kate honako sekuentzia bat hasten. R Beraz, irakurketa testu Open file. Hau da, zer egin nahi dugun. For irakurtzen, eta gorde nahi dut. Gauza da FILE * izango. Orain zer egin nahi dut? Give me bigarren bat. Ongi da. Orain zer egin nahi dut? [Ikasleak] Egiaztatu da NULL bada. >> [Bowden] Bai. Edonoiz fitxategi bat irekitzeko, ziurtatu ari zaren ongi irekitzeko gai. Orain termios stuff hori egin nahi dut lehen nire uneko ezarpenak irakurri nahi dut eta gorde duten zerbait sartu eta, ondoren, nire ezarpenak aldatu nahi dut kanpoan edozein karaktere idatzi dut, bota eta, ondoren, ezarpen horiek eguneratu nahi dut. Eta gero, programaren amaieran, atzera nire jatorrizko ezarpenak aldatzeko nahi dut. Beraz, eta egitura mota termios, eta horietako bi nahi ditut. Lehena da nire current_settings izan, eta, ondoren, nire hacker_settings izan ari dira. Lehenik eta behin, nire uneko ezarpenak gorde nahi dut, ondoren hacker_settings eguneratu nahi dut, eta, ondoren, nire programaren amaieran modu,, uneko ezarpenak itzuli nahi dut. Beraz, uneko ezarpenak gordetzean, lan egiten duen, dugu gizon termios. Hau int tcsetattr, int tcgetattr dugula ikusten dugu. Bere erakuslea struct termios batean pasatzen dut. Modu honetan itxura - I've dagoeneko ahaztuta funtzioa deitzen zen. Kopiatu eta itsatsi. Tcgetattr Beraz, gero eta egitura, pasa naiz duten I informazioa gorde nahi dut, den current_settings izango, eta lehen argumentua ezaugarriak gorde nahi dut gauza fitxategia deskriptorea da. Fitxategia deskriptorea edonoiz fitxategi bat irekitzeko bezalakoa da, fitxategia deskriptorea bat egingo du. When I fopen argv [1], erreferentziatutako ari zaren fitxategia deskriptorea lortu du bakoitzean irakurri edo idatzi nahi duzun. Hori ez da hemen erabili nahi dut fitxategia deskriptorea. Badira hiru fitxategi-deskriptore dute lehenespenez estandarrak dira, out, estandarra eta errore estandarra. Berez, uste dut da estandarra da 0, standard out 1, eta errore estandarra da 2. Beraz, zer ezarpenak aldatu nahi dut? Bakoitzean pertsonaia bat hit I ezarpenak aldatu nahi dut, Pertsonaia bat bota du kanpoan ordez pantaila inprimatzeko nahi dut. Zer korrontea, out estandarra, edo errore estandarra estandarra - gauzak erantzuten teklatua idazten dut? >> [Ikasleen] >> Bai sartu Standard. Beraz, bi aukera ditu: I do 0 edo stdin egin ahal izango dut. Estandar current_settings dut sartu Orain ezarpen horiek eguneratu nahi dut, beraz, lehenengo hacker_settings zer nire current_settings dira kopiatu dut. Eta nola structs lana besterik ez da kopia izango da. Guztiak eremu hau kopiatzen, espero bezala. Orain, eremu batzuk eguneratu nahi dut. Termios begira, hau asko baten bidez irakurri nahi duzun besterik gabe, zer nahi bilatu nahi duzun ikusteko, baina begiratu nahi ari zaren banderak oihartzuna dira, beraz, Echo Echo sarrera karaktereak. Lehenik eta behin, ezarri nahi dut - I've dagoeneko ahaztuta eremu dira. Hau da, egiturari itxura. Sarrerako moduak Beraz, aldatu nahi dugula uste dut. Irtenbidea bilatuko dugu ziur esan zer aldatu nahi dugu. Guztiak horien bidez begiratu beharrik saihesteko lflag aldatu nahi dugu. Tokiko moduak aldatu nahi dugu. Osoa gauza honen bidez irakurri nahi duzun guztia pertenece ulertzeko aldatu nahi dugu. Baina barruan moduak toki hori aldatu nahi dugu. Beraz, zer da hacker_settings.cc_lmode deitzen. c_lflag. Hau da, non operadore bitekin sartuko gara. Denboraz kanpo-mota dugu, baina joan da azkar real dugu. Hau da non lortu bitekin operadoreak dugu, non uste dut bat denbora luzea duela esan nuen bakoitzean banderak aurre hasten zara, erabiliz bitekin operadorea asko duzu. Bandera bit bakoitzak portaera nolabaiteko dagokio. Beraz, hemen, Ez hori, gauza ezberdinak, non horiek guztiak esan nahi gauza desberdin mordo bat dauka. Baina, zer egin nahi dut besterik ez da itzali dagokion Echo bit. Beraz, buelta off I & = ¬ ECHO. Egia esan, tECHO edo antzeko zerbait dela uste dut. Besterik ez naiz berriro ikusteko. Termios dezaket. Besterik ez da Echo. ECHO apur bat bakarra izango da. ¬ ECHO bit guztiak 1 esan nahi du, eta horrek esan nahi du banderak guztiak ezartzen bada ECHO bit izan ezik. Lokaleko banderak honekin amaitzeko, banderak guztiak dira gaur egun, egia esan nahi du oraindik ere ezartzen bada. Nire ECHO Ez da egia ezartzen bada, orduan hau da, nahitaez ezarri ECHO Ez ezezkoan. Beraz, kode-lerro hori itzaltzen ECHO Ez. Kode lerro beste, besterik ez dut kopiatu denbora interes eta gero azaldu. Konponbidea, 0 esan zuen. Izango da seguru asko hobeto esplizituki esan stdin. Ohartu naiz hori ere I ECHO egiten | ICANON hemen. ICANON zerbait bereizi, eta horrek esan nahi du kanonikoa modua aipatzen du. Zer da kanonikoa modua esan nahi du normalean idazten ari zaren komando-lerroan, estandarra ez da ezer hit prozesatu newline arte. Beraz, denean GetString ez, gauza mordo bat idatzi duzu eta, ondoren, newline hit duzu. Denean estandarra bidaliko sartu Hau lehenetsia da. Desaktibatzeko I kanonikoa moduan, pertsonaia bakoitza sakatu da zer lortzen prozesatu ohi da txarra mota da gauza horiek prozesatzeko motela delako, hau da, zergatik ona da bufferrerako lerro osoa. Baina pertsonaia bakoitzak prozesatu nahi dut nahi dut, ez baita itxaron newline me hit da prozesatzen pertsonaia guztiek aurretik egon naiz idazten. Itzaltzen kanonikoa moduan. Stuff hau esan nahi du karaktere prozesatzen da benetan. Horrek esan nahi du, horiek berehala prozesatu; bezain laster am ditut idazten, prozesatu. Eta honen funtzioa da nire ezarpenak eguneratzean estandarra da, eta TCSA bitartez egin ezazu oraintxe bertan. Beste aukera da gaur egun errekaren guztia prozesatu arte itxaron beharko da. Hori ez da benetan axola. Just oraintxe aldatu nire ezarpenak edozein izanda ere, gaur egun hacker_typer_settings izan. Izeneko I hacker_settings uste dut, eta, beraz dezagun aldatu. Aldatu hacker_settings guztia. Orain gure programa amaieran leheneratu nahi dugu zer da gaur egun, barruan normal_settings den eta normal_settings itxura. Ohartu ez dut aldatu nire normal_settings edozein jatorriz lortzean geroztik. Ondoren, besterik ez aldatzeko berriz, horiek pasatzen dut atzera amaieran. Eguneratzea izan zen. Ongi da. Orain barruan hemen dut azaldu kodea denbora interesa. Ez da hainbeste kodea duten. Fitxategia karaktere bat irakurri dugu, ikusiko dugu. It f deitzen dugu. Orain gizon fgetc ditzakezu, baina zenbat fgetc da lanera joan besterik ez da, besterik ez duzu irakurri edo EOF karakterea itzuli da, diren fitxategi edo error happening batzuk amaiera dagokie. Ari gara, begizta fitxategia karaktere bakar bat irakurri jarraitu dugu exekutatu arte karaktere irakurri. Eta ari gara egiten, itxaron karaktere estandar sartu Aldi bakoitzean bakarra zerbait idazten duzunean, komando-lerroan, den pertsonaia bat estandarra irakurtzean sartu Ondoren putchar karakterra irakurri dugu hemen fitxategia standard out jartzea besterik ez da egingo. Man putchar egin dezakezu, baina besterik ez da estandarra izarrekin jarriz, pertsonaia da inprimatzean. Dezakezu ere, besterik gabe, egin printf ("% c", c); Same ideia. Hori da gure lana soltean egin. Azken gauza egin nahi dugu, besterik ez da fclose gure fitxategia. Ez baduzu, fclose, memoria-leak bat da. Ireki fitxategia jatorriz dugu fclose nahi dugu, eta hori dela uste dut. Egiten dugu gero, baina dagoeneko I arazoak. Ikus dezagun. Zer egin kexatzen? Mota 'struct _IO_FILE *' espero zen 'int', baina argumentua da. Ikusten bada lan egiten dugu. Bakarrik C99 onartzen. Augh. Ongi, egin hacker_typer. Orain erabilgarria deskribapenak gehiago lortuko dugu. Beraz, erabili identifikatzaile undeclared 'normal_settings'. Nik ez nuen deitu normal_settings. It current_settings deitzen dut. Hargatik aldatu hori guztia. Orain argumentua pasatuz. 0 hau egin dut, oraingoz. Ongi da. / Hacker_typer cp.c.. Ez ere ez dut garbitu pantailaren hasieran. Baina atzera begiratu dezakezu arazo azken multzo pantailan nola garbitu. Besterik ez da zenbait karaktere inprimatzeko hau da, zer egin nahi dut egiten. Ongi da. Eta zergatik behar ordez, stdin 0 izango pentsatuz, behar da define 0 hau da, kexatzen Ez dagoela fitxategi deskriptore esan dut, baina, ondoren, izan ere, zure FITXATEGIA * aurretik, fitxategia deskriptorea bakarra zenbaki oso bat da, FITXATEGIA * lotutako stuff sorta osoa dauka, berriz,. 0 esan ordez, stdin behar dugu arrazoia stdin hori FITXATEGIA * gauza fitxategia deskriptorea 0 erreferentzia puntu bat da. Beraz, nahiz eta hemen fopen do I (argv [1], * FITXATEGIA itzuli naiz. Baina, nonbait, FITXATEGIA * horretan, fitxategi horren fitxategia deskriptorea dagokion gauza bat da. Man orria begiratuz gero, irekita, eta, beraz, man 3 irekita egin duzu uste dut - Laguia man 2 open - bai. Irekitako orrian begiratuz gero, open behe-maila fopen bat bezalakoa da, eta benetako fitxategia deskriptorea itzuli. fopen irekita gainean stuff sorta bat egiten du, besterik ez da fitxategi deskriptorea osoa FITXATEGIA bat itzultzen du * erakuslea itzuli ordez barruan, gure fitxategia deskriptorea txiki da. Beraz, FITXATEGIA * gauza aipatzen estandarra, 0 fitxategia deskriptorea berez estandarra aipatzen dute. Zalantzak dituzu? [Barreak] horren bidez nintzen. Guztiak eskubidea. Egin gara. [Barreak] [CS50.TV]