[Powered by Google Translate] [5 ATALA: GUTXIAGO eroso]
[Nate Hardison, Harvard Unibertsitatea]
[Hau da CS50.] [CS50.TV]
Beraz, ongi etorria back, guys.
Ongi etorri atalean, 5.
Une honetan, ondoren bukatu quiz 0 eta ikusi nola egin duzun balitz,
espero benetan ona sentitzen nintzen Atal honetan puntuazio oso harrituta.
Gure online ikusleek, galdera pare bat izan dugu
arazoa multzoa azken bi arazoei buruz edo galdetegiaren, baizik.
Beraz, horietan zehar, benetan azkar, beraz, denok ikusten zer gertatu zen goaz
eta nola ez bakarrik begiratzen konponbidea bera baino benetako irtenbidea bidez.
Benetan azkar arazoak azken bi baino gehiago joan gara, 32 eta 33.
Just, berriro ere, eta, beraz,, online ikusleek hori ikus daiteke.
>> Zure arazoa 32, 13 gaitzen baduzu,
, Arazoa 32 13 16 guztiak trukeak buruz.
Guztiak izan da bi zenbaki osoko aldaketa.
Arazoa litzaidake dugun hitzaldia aldiz pare bat baino gehiago joan da.
Eta hemen, zer egin behar genuen galdetuz azkar bat memoria arrastorik.
Aldagaien balioak bete pila dira
kodea swap funtzio hau pasatzen.
Hain zuzen ere, zer ari gara bilatzen - I'm iPad hau jarri du
Zehazki, zer da bilatzen ari gara line zenbakitutako 6 eskubidea hemen.
Eta hori zenbakitutako 6 aurreko arazoa contiguity.
Zer egin nahi dugun edo erakutsi etiketatuko da memoria egoera
garai hartan da lerro hau multzoko 6 abiaraziko dugu,
hau da, modu eraginkorrean gure swap funtzioa itzulera eskubidea hemen.
Joan gara behera bada hemen, memorian guztia helbideak Gurekin zela ikusi genuen.
Hau oso funtsezko itzuli dugu une bat besterik ez da.
Eta gero behera hemen behealdean, memoria apur bat diagrama izan genuen ikus ari gara.
Benetan egiten dut nire iPad.
Beraz, atzera eta aurrera Ordezko iPad eta kode hau erreferentzia artean noa.
>> Dezagun hasteko. Lehenik eta behin, utzi lerro nagusiak lehen bikotea ardatz hementxe.
Hasteko, x 1 eta y abiarazi 2 goaz.
Dugu bi zenbaki oso aldagai Beraz, biak ari dira pila jarri behar da.
1 eta 2 jarri gara.
Beraz irauli dut nire iPad bada, espero dezagun ikus -
Apple TV islatzea, eta hor dugu. Ongi da.
Beraz, bada baino gehiago irauli dut nire iPad
X 1 eta y abiarazi nahi dut 2.
Nahiko, besterik gabe, ez dugu bat 1 markatu x koadroan idazten
eta 2 koadroan markatu y. Nahiko erraza da.
Beraz, gaur egun dezagun itzuli eramangarria, ikusi zer gertatzen den hurrengoa.
Beraz, hurrengo lerro hau da, non gauza delikatua.
X helbidea eta y helbidea parametro gisa pasatzen dugu eta b swap funtzioa.
X eta y helbidea helbidea gauza ezin dugu kalkulatu dira
bullet hauek aipatuz gabe puntu eskuineko behera hemen.
Eta zorionez, lehen bi bullet puntu kontatuko digute, zehazki zer erantzun dira.
X helbidea memoria 10 da, eta memoria y helbidea da 14.
Beraz, balioak get pasa bat eta b gure swap funtzioa top.
Beraz, berriro ere, gure diagrama modura itzuliko da, bat 10 idatzi ahal dut
eta b 14.
Orain, puntu honetan da swap, non jarraitu dugu.
Beraz, atzera biratu berriro ere eramangarria
swap funtzionatzen du I lehen dereference gertatzen da, hain zuzen ere, bat eta denda tmp emaitza ikusiko dugu.
Beraz, dereference operadorea dioenez, "Hey Treat aldagai baten edukiak helbide bat.
Hemendik helbidea hartan gordetzen da, eta kargatu. "
Zer kargatu aldagaia gure tmp aldagaia gorde.
Back to iPad iraultzea.
Joaten gara 10 aurre egiteko bada, helbidea 10 x varible da ezagutzen dugun
genuen gure bullet puntu x memoria helbidea dela 10 delako kontatua.
Beraz, Hara joan ahal izango dugu, balioa, hau da, 1, gure iPad ikusten dugun bezala,
eta sartu tmp kargatu.
Berriz ere, hau ez da azken edukia.
Ibili gara eta gure programaren egoera final dugu amaieran.
Baina oraintxe bertan, balioa 1 tmp gordetzen dugu.
>> Eta hemen galdera azkar bat da.
[Alexander] dereference operadorea aldagaia aurrean eskubidea star?
>> Bai. Dereference operadorea Beraz, irauliko dugu berriro gure laptop berriro ere,
eskuinean izar hau.
Ildo horretan, da kontrastatu biderketak
behar duen beste bi gauza; dereference operadorea unario da.
Just balio bat aplikatzen Eragile bitar bat aurrean,
non bi balio ezberdinak aplikatzeko.
Beraz, lerro hau gertatzen.
1 balioa kargatu eta gordetako gure aldi baterako aldagaia batean osokoaren.
Hurrengo lerroan, b edukia gordetzen dugu sartu
edo, hobeto esanda, b hori, non dago seinalatuz seinalatuz edukia gordetzen dugu.
Aztertzen ditugu, eskuinetik ezkerrera bada, dereference b ditugu,
14 dira dugu, osokoa dagoela hartzen dugu,
eta, ondoren, helbidea 10 joan gara,
eta gure b dereference emaitza espazio horretan bota dugu.
Iraultzea gure iPad, non apur bat gehiago hormigoizko ahal izango dugu,
helbideak zenbakiak idazten dut bada hemen izatea.
Beraz, y, helbidea 14 dakigu, x 10. Helbidea da.
B at hasiko dugu, dugu dereference b, 2 balioa hartzen ari dugu.
Balio hau hartzen duen balioa helbidea 14 bizi delako dugu.
Eta helbidea 10 bizi aldagaia jarri dugu,
hau da, bertan, gure variable x dagokion.
Beraz, hemen gainidatziz pixka bat egin ahal izango dugu
non gure 1 kentzeko lortuko dugu, eta horren ordez 2 idatzi dugu.
Beraz, guztiak ondo eta munduko ona, nahiz eta x gainidatzi dugu orain.
Gordetzen ditugu gure tmp aldagaia x balio zaharra.
Beraz, swap bete ahal izango dugu hurrengo lerroan.
Iraultzea gure laptop.
Orain hondar hori guztia edukiak atera gure aldi baterako aldagaia zenbaki oso
eta gordetzeko aldagaia b antolatzen helbidea bizi.
Beraz, modu eraginkorrean dereference b sarbidea ari gara aldagaia joan
b dela antolatzen duen helbidea da,
eta balioa tmp da sartu eusten Stuff goaz.
Atzera iraultzea iPad behin gehiago.
Balio hau ezabatu ahal izango dut hemen, 2,
eta horren ordez, 1 eskubidea kopiatu dugu sartu.
Ondoren, hurrengo lerroan exekutatzen, noski -
irauli dugu itzuliz gero eramangarria puntu 6 hau da,
puntua da gure diagrama erabat bete nahi dugu.
Beraz, atzera biratu iPad behin gehiago, besterik ez, beraz, bukatu diagrama ikusi ahal izango dituzu,
dugula bat 10, 14 b, tmp 1, 2 x, eta y 1 ikusi ahal izango dituzu.
Ba al dago honi buruzko edozein zalantza argitzeko?
Ez du gehiago zentzu honetan, eta horren bidez ibili?
Egin gutxiago zentzua? Zorionez ez. Ongi da.
>> Erakusleak oso gai delikatua bat dira.
Guys batera egiten dugu lan honetan oso ohikoa ditu:
"Erakusleak ulertzeko, lehenik eta behin behar duzu ulertzen dutenentzako."
Zein da oso egia dela uste dut. Pixka bat hartu da erabiliko du.
Argazkien zozketa, memoria hau atsegin diagrama zozketa oso lagungarria dira,
eta adibide baten bitartez oinez ondoren adibidez ondoren Adibidez ondoren,
apur bat gehiago zentzua eta apur bat gehiago zentzua eta apur bat gehiago zentzu egiteko izango da.
Azkenik, egun batean, dena erabat menperatzen duzu.
Edozein galdera aurretik mugitzen dugu hurrengo arazoa? Guztiak eskubidea.
Beraz, irauli back eramangarria.
Dugun hurrengo arazoa arazo kopurua 33 fitxategi I / O.
Hau apur Txikiagotu.
Arazoa 33 - Bai?
>> [Daniel] azkar galdera bat izan dut. Izar hori, edo izartxoa,
deitzen izartxoa erabili aurretik dereferencing.
Zer da ampersand erabili aurretik deitu?
>> Ampersand aurretik helbide-operadorea da.
Hargatik joan kopiak.
Oops. Zoom moduan, beraz, ezin dut benetan gurpila nago.
Kode hau begiratzen badiogu, benetan azkar hementxe,
berriro ere, gauza bera gertatzen ari da.
Kode hau begiratzen badiogu, hemen, lerro hau non deia trukatu egiten dugu,
ampersand besterik ez da esaten "helbidea zein aldakorreko x bizitza."
Zure kodea zure konpilatzailea biltzen,
benetan fisikoki zure aldagai bizi guztien memoria leku bat markatu du.
Eta beraz, zer Konpilatzailearen ondoren egin du guztia konpilatu behin,
, badaki "Oh, x jarri dut helbidea 10 y jarri dut helbidea 14."
Zuretzat balio horiek bete ahal izango da, orduan.
Orduan dezakezu - izan daiteke, ondoren, gainditu, eta baita pass eta y.
Guys hauek lortu helbidea, baina, gainera, duzunean horiek pasatzen swap funtzioa sartu
informazio mota, int * hemen, konpiladore kontatzen du,
"Ados, interpretatzeko helbide hau osoko aldagai helbide bat dugu."
Int baten helbide bat bezala, hau da, karaktere aldagai baten helbidea
int bat hartzen duelako, 32-bit makina bat hartzen du, 4 byte espazioa,
pertsonaia bat bakarrik hartzen du, berriz, byte 1 espazioa.
Beraz, garrantzitsua da ere jakin zer da zer bizi, zer balio mota
gainditu sartu got helbidea bizi
Edo helbidea aurre ari zaren.
Horrela, zenbat byte informazio benetan kargatu zure RAM badakizu.
Eta gero, bai, hau dereference operadorea, zu bezalako eskatuz,
doa, eta informazio jakin baten helbidea sartzen.
Beraz, dio aldakorreko hemen, tratatzeko edukiak helbide gisa,
helbide horretara joan, eta tira, prozesagailua, karga sartu erregistro bat kargatu
benetako balioak edo helbide hartan bizi diren edukiak.
Edozein galdera bat baino gehiago? Hauek onak galderak dira.
Terminologia berri asko ere.
Ere funky mota da, eta * ikusteko leku desberdinetan.
>> Guztiak eskubidea.
Beraz, arazoa 33, fitxategian I / O.
Hau uste dut gauza pare bat gertatu da duten arazo bat izan zen.
One, nahiko gai berri bat da.
Pretty laster aurkeztu quiz aurretik,
eta, ondoren, mota math arazoak hitz horietako bat bezalakoa izan dela uste dut
non ematen dute informazio asko, baina benetan ez duzu bukatzen ez tona bat erabili beharrik.
Arazo hau lehen zatia da, zer da CSV fitxategi bat deskribatzeko.
Orain, CSV fitxategi bat, deskribapen arabera, komaz bereizitako balioak fitxategia da.
Arrazoi horiek interesgarri guztiak, eta horregatik erabili al duzu inoiz,
da, izan ere, nola asko inoiz erabili Excel bezalako stuff?
Irudikatu duzun gehienak ez du, ziurrenik, edo zure bizitzan uneren batean erabili.
Excel bezalako zerbait erabiliko duzu.
Datuak lortzeko Excel kalkulu-orri baten edo prozesatzeko inolako
nahi duzun C programa edo Python programa, Java programa idatzi nahi izanez gero,
bertan gordetzen dituzun datuak aurre egiteko,
CSV fitxategi batean ateratzeko modu ohikoena bat da.
Eta ireki dezakezu Excel eta noiz joan elkarrizketa 'bezala gorde',
dezakezu benetako CSV fitxategi bat.
>> Handy gauza horiek nola aurre egin jakiteko.
Funtzionatzen du antzekoa dela esan nahi dut, funtsean, kalkulu orri bat mimicking
non ikusten dugun bezala, hemen, pieza oso utzi-gehienak,
dugu azken izen guztiak.
Beraz, Malan, ondoren Hardison, eta, ondoren, Bowden, MacWilliam, eta, ondoren, Chan dugu.
Azken izen guztiak. Eta gero, komaz bereizten lehenengo izenak azken izenak.
David, Nate, Rob, Tommy, eta Zamyla.
Nahastu dut beti sortu Robby eta Tom.
Eta gero, azkenik, hirugarren zutabean helbide elektronikoak.
Ulertzen dituzula eta gero, gainerako programa da nahiko erraza inplementatzeko.
Zer egin dugu egitura bera gure C programa hau imitatzen
erabili dugu egitura bat.
Horiek apur bat gehiago baita jolasean hasten gara.
Arazo multzo 3, hiztegiak ginen aurre lehen apur ikusi dugu.
Hala ere, langile eta egitura honen azken izena, lehen izen bat, eta mezu elektroniko bat gordetzen ditu.
CSV fitxategia Just gordetzeko.
Beraz, hori besterik ez da bat formatu batetik bestera bihurtzeko.
Bihurtzeko, kasu honetan, langileak eta egitura bat lerro bat sartu behar dugu,
komaz bereizitako line, besterik gabe.
Ez duela zentzurik? Zaudete guztiak hartu quiz,
beraz, gutxienez, duzu, denbora pixka bat izan zuten honi buruz uste imajinatzen dut.
>> Alokatzeko funtzioa, arazoa galdetzen digu hau apur zoom we'll
langileen egitura, langileak eta egitura, izena s
eta gure staff.csv fitxategitik eransteko bere edukia.
Bihurtzen da hori nahiko erraza da erabiltzea.
Mota play funtzio horiek gaur egun pixka bat gehiago dugu inguruan.
Baina kasu honetan, fprintf funtzioa da benetan gakoa.
Beraz, fprintf batera, inprimatu, ezin dugu bezala guys dira printf osoa epe hau erabiliz.
Printf fitxategi batean lerro bat egin dezakezu.
Beraz, ohiko printf dei egiten ordez, non eman duzu formatu katea
eta, ondoren, aldagai guztiak ordezkatu ondorengo argumentuak,
fprintf, zure lehen argumentua idatzi nahi duzun fitxategia ordez.
Ginen eta begiratu tresnan, adibidez, gizon fprintf bada,
printf eta fprintf arteko ezberdintasuna ikusi ahal izango dugu.
Hemen mapan handiago dut pixka bat.
Beraz, printf batera, emango dugu formatu katea, eta, ondoren, ondorengo argudioak
gure formatu katea sartu ordezkatzeko ordezkapen aldagai guztiak dira.
Fprintf batera, berriz, lehen argumentua da, hain zuzen, erreka bat izeneko fitxategi * honetan.
>> Moving hemen gure alokairua
Jadanik dugu gure file * korrontea eskuratu Gurekin inauguratu zen.
Hori zer, lehenengo lerroan honek staff.csv fitxategia irekitzen du,
append moduan irekiko da, eta guztiak guri utzi da
fitxategia idazteko langile egitura.
Eta, dezagun, ikus iPad erabili nahi dut?
IPad erabili dut. Void ditugu utzi hau jarri du mahai gainean pixka bat hobeto idatzi ahal izateko
gal alokairua eta argumentu bat hartzen du, s izeneko langile egitura bat.
Got gure giltza, lortu dugu gure file * izeneko fitxategia,
gure fopen-line eman digu ditugu,
eta besterik ez dut idazteko puntu gisa pedia, dagoeneko geroztik.
Eta gero gure hurrengo on line, dei bat egin nahi fprintf dugu
eta fitxategia pasatuko dugu nahi dugun inprimatu
eta, ondoren, gure formatu katea, eta horrek -
You guys tell me zer itxura utzi dut.
Nola duzu, Stella? Zer formatu katea lehenengo zatian, itxura ezagutzen al duzu?
[Stella] ez nago ziur. >> Feel free Jimmy eskatu.
Ez, badakizu, Jimmy?
[Jimmy] litzateke besterik ez da azken? Ez dakit. Ez nago erabat ziur.
>> Ados. Nola buruz, ez zuen inor zuzena hau Proba Orokorra?
N º eskubidea guztiak.
Bihurtzen da hori guztia egin behar dugu gertatzen da, hain zuzen ere, gure langileen egituraren zati bakoitza nahi dugu
inprimatutako, gure fitxategi kate bat gisa.
Erabili besterik ez dugu kate ordezkapena pertsonaia hiru aldiz dugu azken izen bat delako
koma ondoren, eta, ondoren, lehen izen bat koma bat ondoren,
eta, ondoren, azkenik, helbide elektronikoa da, eta ondoren, ez da
nire pantailan prestaturik, baina karaktere newline ondoren.
Beraz, idatzi besterik ez hor behera noa.
Eta gero, gure formatu katea jarraituz,
Aski dugu ordezkapenak, dot idazkera erabiliz dugu
arazo multzo 3 ikusi dugu.
Erabili ahal izango ditugu. S.last, s.first, eta s.email
gure formatu katea, hiru balio horiek ordezkatzeko.
Beraz, nola ez? Zentzurik?
Bai? Ez? Baliteke? Ongi da.
>> Egiten dugun gauza behin betiko dugu eta inprimatutako ondoren dugu ondoren, gure fitxategia ireki:
bakoitzean fitxategi bat ireki dugu, beti dugu ixteko gogoratzeko.
Bestela amaituko delako dugu memoria leaking,
file deskriptoreak erabiliz.
Beraz, ixteko, duen funtzioa egiten dugu? Daniel?
[Daniel] fclose? >> Fclose, zehazki.
Beraz, arazo honen azken zatia izan da behar bezala fitxategia itxi, fclose funtzioa erabiliz,
besterik ez da itxura.
Not too crazy.
Cool.
Beraz, 33 galdetegiaren arazoa da.
I / O datozen behin betiko gehiago fitxategia izango dugu.
Do pixka bat gehiago dugu gaur hitzaldi batean, edo atalean, gaur egun,
hori delako zer Datorren pset soltean osatzeko.
Dezagun mugitu puntu honetan galdetegia. Bai?
>> [Charlotte]] Zergatik fclose (file) ordez fclose (staff.csv)?
>> Ah. Bihurtzen da delako - beraz, galdera, eta hori handia da,
dago zergatik, fclose idazten dira, fclose (fitxategia) star aldagaia idazten dugu
fitxategi-izena, staff.csv aurrean? Dela zuzena? Bai.
Beraz, dezagun begirada bat. Aldatzen I itzuli bada, nire laptop
eta dezagun fclose funtzio begiratu.
Beraz, fclose funtzioa erreka bat itxi eta erakuslea hartzen da korrontea itxi nahi dugu,
itxi nahi dugun uneko fitxategi izena ez bezala.
Eta hau eszenak atzean delako, dei bat egin nahi duzun fopen
ireki fitxategia, benetan ari zaren memoria esleitzean fitxategia buruzko informazioa gordetzeko.
Beraz, fitxategiari buruzko informazioa duen fitxategia erakuslea
esate baterako, zabalik da, bere tamaina, non ari zaren fitxategia
deiak irakurtzen eta idazten fitxategia barruan leku jakin hori horrela egin ahal izango dituzu.
Azkenean erakuslea fitxategi-izenaren ordez ixteko ixteko.
>> Bai? [Daniel] Beraz, alokairua erabili, esango duzu nola erabiltzaile sarrera ez da?
Fprintf ez du GetString bezala jardun zentzuan egingo duela erabiltzailearen sarrera itxaron
galdetu eta idatzi - edo itxaron hiru gauza hauek idatzi nahi?
Edo zerbait erabili alokairua ezartzeko behar duzu?
>> Bai. Beraz, ez gara - Galdera zen, nola ez erabiltzailearen sarrera lortuko dugu
alokairua ezartzeko? Eta hemen dugu alokatzeko deitzailearen
struct langileak hau struct en gordetzen dagoeneko datu guztiak gainditu.
Beraz fprintf gai da bakarrik datuak idatzi fitxategi zuzenean.
Ez dago erabiltzailearen sarrera zain.
Erabiltzaileak dagoeneko eman sarrera, langileek struct hau behar bezala jarri.
Eta gauza jakina, erakusleak duten edozein izan ziren null bada apur
beraz, atzera joan gara eta hemen gure egiturari begiratzen dugu.
Azken katea, katea lehen, kate email ditugu.
Orain badakigu horiek benetan hori guztia, kanpaia azpian, char * aldagaiak dira.
Hori daiteke edo ez da null seinalatuz.
Zeure, memoria daitezke seinalatuz,
agian pilaketan memoria.
Ez ditugu benetan ezagutzen, baina erakusleak horietako edozein null, edo baliogabea bada,
dugu zalantzarik gabe kraska gure alokairua funtzioa.
Zerbait izan zen mota azterketa esparrutik kanpo izan zen.
Ez ari gara buruz kezkagarria da.
Great. Ongi da. Beraz, mugitzen galdetegia.
>> Dezagun guy hau ixteko, eta 4 pset begiratu dugu.
Beraz, baduzu guys pset zehaztapenak begiratu, behin sartu ahal izango duzu, cs50.net/quizzes,
atalean arazoak gaur egun gutxi baten bidez joan gara.
Korritu ditut galdera atala pset zehaztutako hirugarren orrian hasten da.
Eta lehen zatia eskatuko dizu eta joan labur ikusi eta berbideratu hodiak.
Zein izan da, labur bat cool mota erakusten dizu, batzuk berriak, cool komando-lerroan trikimailuak erabil ditzakezun.
Eta gero, galdera batzuk lortu dugu baita.
Erreka lehen buruzko galdera, printf default idazten du,
motatako apur bat besterik ez dugu ukitu duela une bat.
Fprintf ziren gara eztabaidatzen file * korronteak bere argumentu gisa hartzen du.
fclose file * korrontean hartzen baita,
fopen-itzulera balioa ematen dizu file * korrontea baita.
Arrazoia ez duten ikusi dugu aurretik printf landu dugu
printf default korronte bat duelako.
Eta lehenetsia korronte bertan idazten du
aurkituko duzu labur buruz.
Beraz, behin betiko begirada bat hartu.
>> Gaur egungo atalean, GDB buruz apur bat hitz egin dugu,
gehiago ezagutzen dira denez, praktika gehiago lortu,
hobeto ahal izateko benetan ehizatu behera zure kodea bugs duzu.
Arazteko izugarri prozesua bizkortzen.
Printf erabiliz, aldi bakoitzean zure kodea konpilatu duzula egin duzu,
berriro exekutatu behar duzu, batzuetan printf deia inguruan mugitu behar duzu,
komentatu kodea, pixka bat besterik ez da.
Gure helburua da, eta saiatu duzu konbentzitu GDB, funtsean ahal izango duzu
printf, zure kodea edozein puntutan ezer eta inoiz ez dute konpilatu.
Inoiz ez duzu hasteko eta mantentzeko non printf hurrengo jakitea.
Lehenik eta behin, ez da lerro hau kopiatu eta atalaren kodea lortzeko web-off.
Dioenez, "wget ​​http://cdn.cs50.net" kode line naiz kopiatzean.
Kopiatu dut.
Nire-tresna baino gehiago joan nahi dut, mapan handiago ikusi zer egiten ari naiz dezakezu,
itsasten ez dago, eta Sartu sakatu dut, wget komandoa hau literalki web bat lortzeko.
Fitxategi hau behera tira off Interneten egingo da,
eta gorde uneko direktorioa da.
Orain zerrendara nire uneko direktorioan ikusi ditudan file section5.zip eskubide hau bertan lortu ahal izango dituzu.
Guy hori aurre egiteko modua da unzip
komando-lerroa egin dezakezu, besterik ez hau atsegin dute.
Section5.zip.
Deskonprimitu izango dela, niretzat karpeta sortu,
puzten eduki guztiak, jarri hor.
Beraz, orain nire atalean, 5 direktorioa cd komandoa erabiliz joan ahal izango dut.
Garbitu pantaila argia erabiliz. Beraz garbitu pantailan.
Orain nice garbi terminal landu dut.
>> Orain, bada, fitxategiak direktorio honetan ikusten dut guztien zerrenda dut,
buggy1, buggy2, buggy3, eta buggy4: Behin I got lau fitxategiak ikusi duzu.
Nik lortu dagozkien c fitxategiak.
Ez gara oraingoz. C fitxategiak bilatzeko.
Horren ordez, horiek erabili ireki dugu GDB goaz.
Mantenduko dugu horien inguruan beraz, benetako iturburu-kodea sartzeko dugun denean GDB erabiltzen ari gara,
, baina atalaren zati honen helburua tinker da GDB inguruan
ikusi eta nola erabili ahal izango dugu irudikatu zer oker horiek lau buggy programak bakoitzean.
Beraz, ari gara, gela inguruan gertatzen benetan azkar,
eta norbaitek galdetu, buggy programa bat exekutatu behar dut
eta, ondoren, GDB bidez talde bat egingo dugu, eta ikusiko dugu zer egin programa horiek konpondu ahal izango dugu,
edo, gutxienez, identifikatzeko zer oker joan, eta horietako bakoitzean.
Dezagun hasi hemen Daniel. Egingo buggy1 exekutatu duzu? Dezagun zer gertatzen den ikus-en.
[Daniel] aplikazioa matxura bat esaten du. >> Bai. Hain zuzen ere.
Beraz, exekutatu I buggy1 izanez gero, seg matxura bat lortuko dut.
Puntu honetan, joan eta nuen ireki buggy1.c
saiatu eta irudikatu zer oker joan
baina errua seg error buruzko gauzarik obnoxious bat
ez dela esango dizu line programa gauzak benetan oker joan da eta hautsi.
Dute mota kodea begiratu
eta etxebizitza bidez irudikatu eta egiaztatu edo printf zer oker joan ikusteko.
GDB buruzko gauza coolest bat da benetan, oso erraza
programa bat kraskatzen lerro irudikatu.
Guztiz da erabili merezi du, nahiz eta hori bakarrik baldin bada.
Beraz abiarazteko GDB, GDB idazten nuen, eta, ondoren, eman nahi dut exekutatu exekutagarriaren bide-izena.
Hemen gdb ./buggy1 ari naiz idazten.
Sakatu Sartu. Ematen dit copyright informazio hori guztia,
eta behera hemen lerro hori dio, "Irakurri / home / ikurrak ikusiko duzu
jharvard/section5/buggy1 ".
Dena ondo badoa izanez gero, ikus mezu bat inprimatu itxura duzu.
Ikurrak irakurri ahal izango da, esan "sinboloak naiz irakurtzen zure fitxategi exekutagarria," egingo
eta, ondoren, "egin" mezu bat izango da hemen.
Beste aldaketa batzuk sartuz gero ikusiko duzu, edo ikusten duzun ezin aurkitu sinboloak
edo horrelako zerbait, zer esan nahi du, besterik ez da, ez konpilatu zure exekutagarri bezala.
GDB-ekin erabiltzeko programak konpilatu dugu, berezi-g Ez hori erabili behar dugu,
eta hori lehenetsi gisa egiten konpilatu zure programak, egin idatziz
egin edo buggy edo berreskuratzen, horietako edozein.
Baina eskuz bazara konpilatzean Clang, eta ondoren joan eta-g Ez duzu.
>> Une honetan, gaur egun dugun gure GDB gonbitean,
nahiko erraza da programa exekutatu.
Idatzi ahal izango dugu, bai exekuzio, edo, besterik gabe, ahal izango dugu r idatzi.
GDB komandoak gehienek laburtua izan daiteke.
Normalean bakar edo pare hizkiak, pretty nice da.
Beraz, Saad idazten duzunean, r bada, eta sakatu Sartu, zer gertatzen da?
[Saad] SIGSEGV, segmentaziuo hutsegitea,, eta ondoren gobbledygook hau guztia lortu nuen.
>> Bai.
Atsegin dugu pantailan oraintxe ikusita, eta Saad esan zuen bezala,
exekutatu edo r idazten, eta sakatu Sartu, seg errua bera jarraitzen dugu.
Beraz, GDB erabiliz ez da gure arazoa konpontzen.
Baina ematen digu gobbledygook batzuk, eta bihurtzen da gobbledygook hori
benetan esaten digu, non gertatzen ari da.
Hau pixka bat analizatu, bit hau lehen funtzioa, hain zuzen, dena gaizki joan da.
__ Hau strcmp_sse4_2 kontatzen digu, eta duela fitxategi hau gertatzen
izeneko sysdeps/i386, hori guztia, berriz, gaizki mota - baina line 254.
Hori da mota gogorra izan da. Normalean hau atsegin stuff ikusten duzu,
horrek esan nahi du, dela sistemaren liburutegi batean faulting seg.
Strcmp zerikusia duten zerbait, beraz. Zaudete ikusi strcmp aurretik.
Not too crazy, baina esan nahi du horrek strcmp hondatuta dago edo ez dagoela strcmp arazo bat da?
Zer uste duzu Alexander?
[Alexander] - 254 line? Eta ez bitarra, baina ez da bere sabaiak,
eta, ondoren, beste funtzio bakoitzeko hizkuntza. - Funtzio hori 254, edo da hori?
>> Line 254 da. Itxura hau. S fitxategia bezalakoa da, beraz muntaia da kodea ziurrenik.
>> Hala eta guztiz ere, premiazko gauza da, dugu ahaztuak seg matxura bat dela uste dut,
eta strcmp funtzio bezala datozen itxura du,
du esan nahi, beraz, strcmp hori hautsi?
Ez da, zorionez. Beraz, besterik ez delako segmentaziuo hutsegitea duzu
sistemaren funtzio bat, normalean, horrek esan nahi du, besterik ez da, ez dute deitu behar bezala.
Figuraren inguruan zer ari den benetan gertatzen ari gauzarik azkarrena
zerbait crazy atsegin dute hau, ikusten duzun bakoitzean seg matxura bat ikusiko duzu,
batez ere, programa bat gehiago besterik ez nagusia baino erabiltzen baduzu,
backtrace bat erabili da.
Backtrace laburtu I bt idatziz, backtrace osoa hitza aurrean.
Baina Charlotte, zer gertatzen den bt idatzi eta sakatu Sartu?
[Charlotte] me erakusten da, bi lerro, lerro 0 eta 1 errenkadaren.
>> Bai. Beraz, lerro 0 eta 1 line.
Benetako pila hauek izan ziren, gaur egun jokoan markoak programa kraskatu denean.
, 0 markoa marko lehenbiziko hasita, eta beheko-gehienak, hau da, 1. Fotograman joan.
Gure lehengo marko strcmp markoa da.
Hau dela pentsa dezakezu arazo hori besterik ez genuen egiten erakusleak duen galdetegiaren antzekoa da,
non pila marko swap izan dugu pila nagusia markoaren gainean,
eta aldagai swap zen aldagai nagusia izan zen erabiliz gainean izan genuen.
Hona hemen gure kraskadura gure funtzioa strcmp izan zen, gure funtzio nagusia deitu gertatu zen,
eta backtrace emango digu, ez bakarrik funtzio gauzak huts egin du,
baina ere gurekin kontatu non guztia deitzen zen.
Beraz, bada, joan apur bat gehiago I eskubidea,
yeah, line 254 strcmp sse4.s fitxategia honetan dugu.
Baina deia egin zen buggy1.c, line 6.
Horrek esan nahi du, egin ahal izango dugu, beraz, besterik ez da joan gaitezke begiratu eta ikusi zer zen joan
buggy1.c, line 6.
Berriz ere, badaude pare bat hau egiteko modu bat. Irtetzeko GDB
edo zure kodea beste leiho bat eta gurutze-erreferentzia batean irekiko da.
, Eta bera, nahiko praktikoa da orain bada Oraindik delako bulegoan etan
eta lortu duzun seg matxura bat eta zure TF da, non dena zen hautsi galdetzen,
besterik ez dezakezu esan, "Oh, linea 6., ez dakit zer ari den gertatzen,
baina linea 6 zerbait da nire programa hondatu eragiten. "
Beste modu batera egin behar da izeneko zerrenda GDB komando hau erabili ahal izango duzu.
Ere egin dezakezu laburtu du l.
Beraz hit dugu l bada, zer iritsi dugu?
Stuff bitxi sorta oso bat lortuko dugu.
Hau da benetako muntaia kodea
strcmp_sse4_2 da.
Funky mota itxura,
eta horregatik ari gara lortzean oraintxe delako,
GDB ditu gurekin 0 markoan.
>> Beraz, edonoiz dugu aldagai, iturburu-kodea begiratzen dugu, edozein unetan
iturburu kodea pila markoaren batena ari gara, gaur egun sartu bilatzen ari gara
Beraz, ezer esanguratsua lortu behar dugu
pila marko zentzuzkoa mugitu.
Kasu honetan, pila marko nagusia apur bat gehiago zentzurik,
izan zen benetan delako kodea idatzi dugun.
Ez strcmp kodea.
Fotograma artean mugitu ahal izango duzu, kasu honetan, gure bi delako,
0 eta 1 dugu,
Horretarako gora eta behera komandoak.
Mugitzen I fotograma bat badu,
naiz pila nagusiak marko dut.
Eraman behera atzera joan nintzen,
joan berriro, joan berriro, eta joan berriro.
Al duzu inoiz ez bada zure programa GDB, kraskatzea bat lortuko duzu, backtrace
eta fitxategi batzuk ez duzula jakin zer ari den gertatzen dela ikusiko duzu.
Zerrenda saiatu, kodea ez itxura ezagutzen duzu,
zure markoak begirada bat hartu eta irudikatu non zauden.
Ziurrenera duzu pila okerreko fotograma.
Edo, gutxienez, Oraindik pila marko hori ez da benetan arazteko ditzakezun duzu.
Orain pila fotograma egokiak Oraindik dugun, Oraindik nagusia dugu,
orain zerrendako komandoa erabili ahal izango dugu irudikatu zer line izan zen.
Eta ikusi ahal izango duzu; inprimatu Gurekin hemen.
Baina, sakatu zerrendara bera ahal izango dugu, eta zerrenda ematen digu nice inprimaketaren honetan
iturburu kodea duten gertatzen da hemen.
>> Hain zuzen ere, linea 6 dugu.
Zer gertatzen da hemen ikusi ahal izango dugu.
Eta katea konparaketa bat bezala egiten ari gara badirudi
arteko katea "CS50 arroka" eta argv [1].
Honi buruz zerbait izan zen bertan behera gelditzen.
Missy Beraz, zer izango da hemen pentsamenduak edozein duzu?
[Missy] Ez dakit zergatik bertan behera gelditzen da. >> Ez dakizu zergatik bertan behera gelditzen da?
Jimmy, pentsamenduak edozein?
[Jimmy] Ez nago erabat ziur, baina azken denbora katea erabili dugu konparatu,
edo strcmp azpian hiru kasu ezberdin bezala, izan dugu.
Ez dugu ==, ez dut uste, lehen lerroan.
Beharrean izan zen hiru bereizten ditu, eta bat izan zen == 0,
bat izan zen <0, uste dut, eta bat izan zen:> 0.
Beraz, agian horrelako zerbait? >> Bai. Beraz, gai honen
dira egiten konparazioa duzula?
Stella? Pentsamenduak Any?
[Stella] ez nago ziur. >> Ez da ziur. Daniel? Pentsamenduak? Ongi da.
Bihurtzen da, zer hemen gertatzen ari denean, programa zuena dugu
eta seg-matxura lortu dugu, lehen aldiz programa, Daniel ran duzu,
ez du ematen duzun edozein komando-lerroko argumentuak?
[Daniel] n. >> Zb Kasu horretan, zer argv balioa da [1]?
>> Balioa ez da ". >> Right.
Beno, ez dago kate balio egokia da.
Baina balio batzuk. Zer da hor gordetzen duen balioa lortzen da?
>> Zabor balioa? >> Bai da zabor-balio bat edo, kasu honetan,
argv array amaiera da beti null amaitu da.
Beraz, zer benetan got gordetako ez da null.
Beste modu hau konpontzeko, beharrean pentsatzen bidez baino,
inprimatzeko out saiatzeko.
, Non nintzen GDB erabiliz handia dela esaten da,
inprimatu delako aldagai guztiak, nahi duzun baloreak guztiak
hau handy-dandy p komandoa erabiliz.
Beraz, idatzi dut p bada, eta, ondoren, balioa aldagai edo aldagai baten izena idatzi dut,
esan, argc, argc dela 1 ikusten dut.
Nahi dut inprimatu argv [0], egin dut besterik gabe.
Ikusi eta atsegin dugu, argv [0] beti da programaren izena,
beti exekutagarriaren izena.
Hemen bide-izena osoa lortu ikusiko duzu.
Ere inprima ezin dut argv [1], eta ikusi zer gertatzen den.
>> Balio mistiko mota hau lortu dugu.
0x0 hau lortu dugu.
Gogoratu terminoa hasieratik hitz egiten denean zenbakiak hamaseitarretan gara?
Edo nola 50 irudikatzeko hex little 0 pset amaieran galdera?
CS zenbakiak hex idazten dugu, ez geure burua nahastu
Zenbaki hamartar batekin, beti jarri dugu horietako 0x.
Beraz, 0x aurrizkia hau beti, besterik gabe esan nahi du zenbaki hamaseitar bat bezala kopuru hauek interpretatzeko,
ez kate gisa, ez zenbaki hamartar bat bezala, ez da zenbaki bitar bat bezala.
Kopurua 5-0 hamaseitarrean baliozko zenbaki bat denez.
Eta zenbaki hamartar, 50.
Beraz, hau da, besterik ez dugu nola disambiguate.
Beraz, 0x0 bitartez hamaseitarra 0, hau da, hamartar 0, 'binary 0.
0 balioa besterik ez da.
Bihurtzen da, hori dela null da, benetan, memoria.
Null 0 besterik ez da.
Bertan, elementu argv at gordetzen [1] null da.
Beraz, gure "CS50 arroka" kate alderatu null kate bat saiatzen ari gara.
Beraz, null dereferencing, null at gauzak sartzeko saiatzen ari da,
horiek normalean segmentaziuo hutsegitea edo beste, gauza txarrak gertatuko nolabaiteko eragin du.
Eta bihurtzen da strcmp ez ikusteko
ala ez, balio bat da null dituzun pasa da.
Izan ere, doan besterik ez da aurretik, saiatuko da bere gauza,
eta matxurak seg bada, Seg matxurak, eta zure arazoa da. Konpondu behar duzu.
Benetan azkar, nola izan liteke arazo hau konpondu dugu? Charlotte?
[Charlotte] erabiliz gero, egiaztatu ahal izango duzu.
Beraz, bada argv [1] da, null, == 0, eta gero itzuli 1, edo zerbait [ulertezina].
>> Bai. Beraz, modu bikaina da egiten da, ikusi dugun bezala, egiaztatu ahal
strcmp sartu pasatuko gara balioa, argv [1], hau da, null?
Bere null bada, orduan esan ados ahal izango dugu, bertan behera utzi.
>> Horretarako modurik ohikoagoa argc balioa erabili da.
Hemen ikusten dezakezu nagusia hasieran,
Lehenengo proba zehazten ez dugu normalean egiten dugu komando-lerroko argumentuak erabiltzen ditugu,
den ala ez, gure argc balioa zer espero probatzeko.
Kasu honetan, gutxienez, bi argumentuen zain ari gara,
programaren izena gehi bat beste.
Gara bigarren argumentua hemen erabili delako.
Beraz, test moduko bat izatea aldez aurretik, gure dei strcmp aurretik
argv duten ala ez, gutxienez 2 probak ere egin gauza bera sort.
Duten programa berriro exekutatzen ari bada ikus dezakegu.
Beti berrabiarazi dezakezu zure GDB, hau da, benetan nice programaren barruan.
Exekutatu dezakezu, eta noiz pasako argumentuetan duzu zure programa,
exekutatutakoan deia pasatzen duzu, ez GDB abiarazteko.
Horrela, gorde dezakezu zure programa deitu argumentuak desberdinak aldi bakoitzean.
Beraz, korrika egin, edo berriro, r idatzi dut, eta zer gertatzen da idazten badugu "hello" ikus dezagun.
Beti izango da eskatu nahi duzun hasteko hasieratik berriro.
Normalean, nahi ez baduzu hasteko hasieratik berriro.
Eta, puntu honetan, berrabiarazi, berriz it bistaratzen out
Programa ari gara, korrika buggy1, argumentua kaixo,
eta hau estandarra bistaratzen du; dio, "D bat lortu ahal izango dituzu," triste aurpegia.
Baina ez dugu errua seg. Prozesu hori amaitu da normalean, esan du.
Beraz, itxura nahiko ona da.
Errua seg No, iraganean egin genuen,
horrela izan zen, hain zuzen ere, atsegin seg errua bug gara begira.
Zoritxarrez, kontatzen digu ari gara D. bat eskuratzerakoan
>> Itzuliko gara eta begiratu kodea ikusi eta zer izan zen han gertatzen ari
out irudikatu zer zen zergatik zen kontatzea lortu dugu D.
Ikus dezagun, hemen zen printf lortu D. bat esaten
Zerrenda idatzi dugu bada, mantendu idazten zerrenda, errepikatzean zure programaren bidez jarraitzen du,
beraz, erakutsiko dizu izango zure programaren lehen lerro batzuk.
Ondoren erakutsiko dizu dugu hurrengo lerro gutxitan, eta hurrengo zatia eta hurrengo zatia.
Eta jaisten saiatzen dugu.
Eta orain "lerro kopurua 16 barrutitik kanpo dago." Dugu
Bakarrik duelako 15 lerro.
Puntu honetan lortzen bada, eta, galdetzen "Zer egin dezaket?" Laguntza komandoa erabili ahal izango duzu.
Erabili laguntzeko, eta, ondoren, komando baten izena eman.
Eta GDB ematen digu, stuff sort hori guztia ikusiko duzu.
, Dio, "argumentu gabe, hamar gehiago edo ondoren inguruan aurreko listing ildoak zerrendatzen dira.
Zerrenda - zerrendak hamar lerro baino lehen "
Hargatik saiatu zerrenda ken erabiliz.
Eta hori aurreko 10 lerro zerrendatzen; inguruan play dezakezu zerrenda pixka bat.
Zerrendan, zerrenda egin dezakezu, baita eman zerrendara zenbaki bat, zerrenda 8 atsegin,
eta 10 lerro lerro 8 inguruan zerrenda izango da.
Ikusi eta zer gertatzen da hemen dezakezu da lortu duzun sinple bat bestela,.
CS50 arroka idazten baduzu, bistaratzen "A. bat lortu ahal izango dituzu"
Bestela bistaratzen da "D. bat lortu ahal izango dituzu"
Bummer herri. Guztiak eskubidea. Bai?
>> [Daniel] CS50 arroka komatxorik gabe egiten saiatu nintzen,
"D. bat lortu ahal izango dituzu", dio
Komatxorik behar nuen lanean, zergatik da hori?
>> Bai. Bihurtzen da hori - hau da beste apur tidbit fun -
programa exekutatzen duzunean, exekutatu badugu eta idatzi dugu CS50 arroka,
bezala Daniel zuen esaten, eta Sartu sakatu duzu,
dio, hala ere, D. bat lortu dugu
Eta galdera da, zergatik da hau?
Eta bihurtzen da, bai gure terminal eta GDB analizatu horiek bi argumentuak independente gisa.
Ez den espazio bat, engaiatuko gisa delako
Lehen argumentua amaitu; Hurrengo argumentua hasiko da.
Bi horiek konbinatzeko, edo barkatu, argumentu bat sartu,
komatxorik erabili da.
Beraz, gaur egun, jarri badugu komatxo artean, eta berriro exekutatu, A. bat lortuko dugu
Beraz, laburpena, komatxorik gabe, CS50 eta Arroka independente gisa bi argumentuak analizatu.
Komatxorik, argumentu bat guztiz analizatu.
>> Hau etendura bat ikusi ahal izango dugu.
Orain arte izan dugu gure programa exekutatzen ari da, eta izan da exekutatzen ari
, bai matxurak edo hits seg errore bat arte
edo arte gdb irten da, eta guztiak guztiz fina izan da.
Hau ez da zertan gauza lagungarria, batzuetan delako
duzu zure programa errore bat da, baina ez da segmentaziuo hutsegitea eragiten.
Ez da zure programa gelditzeko edo horrelako ezer eragiten.
Gelditzeko GDB lortzeko programa bat amaitzen da jakin
etendura bat ezarri nahi du.
Egin dezakezu bai etendura funtzio-izen bat
edo etendura bat bereziki kode lerro bat ezar dezakezu.
Eten - puntu funtzioa izen ezarri nahi dut, delako erraz gogoratzeko,
eta benetan joan behar izanez gero, eta pixka bat zure iturburu kodea aldatzeko sortu
orduan zure etendura-puntua izango da benetan zure kodea barruan leku berean jarraituko du.
Ari zaren lerro-zenbakiak erabiliz gero, eta lerro-zenbakiak aldatzeko, berriz,
kodea batzuk gehitu edo ezabatu, eta gero zure eten - puntu guztiak erabat izorratu du.
, Ez dut gauza ohikoena bat da funtzio nagusia etendura.
Askotan abiarazi sortu dut GDB, b nagusia idatzi dut, sakatu Sartu, eta hori etendura bat ezarri dugu
funtzioa besterik ez dio, "Pausatu programa bezain laster hasten dira martxan,"
eta, era horretan, nire programa exekutatzen dut, esan, CS50 arroka bi argumentuen
eta sakatu Sartu, lortzen funtzio nagusia gelditzen da, eta eskubidea lehen lerroan
eskubidea funtzio aurretik strcmp ebaluatzen.
>> Dut pausatuta geroztik, gaur egun hasteko inguruan mucking eta zer ari den gertatzen ikusten dut
diren aldagai desberdinak pasa nire programa guztiak.
Hemen inprimatu dezaket argc ikusi eta zer ari den gertatzen.
Ikusi argc 3, 3 balio ezberdinak lortu delako bertan.
Got programaren izena, got argumentu lehen eta bigarren argumentua.
Horiek inprimatu ahal izango dugu argv begira [0], argv [1], eta argv [2].
Beraz, gaur egun ere ikus dezakezu zergatik strcmp dei hori huts egin du,
zatitu dela bi argumentuak bereizi CS50 eta harkaitz ikusten duzulako.
Une honetan, behin etendura duzun hit, zure programaren bidez jarraitzeko urratsa dezakezu
lerroz lerro, zure programa berriro hasten ez bezala.
Beraz, ez baduzu nahi zure programa berriro hasteko eta bakarrik jarraitu hemendik
Jarraitu komandoa erabili ahal izango duzu eta jarraitu programa izango da amaieran.
Just hemen ez bezala.
Hala eta guztiz ere, programa berrabiarazi I, CS50 arroka bada, nire etendura doakizula ikustean, berriro ere,
eta une honetan, ez bada ez dut nahi bakarrik modu guztiak gainerako programaren bidez,
Hurrengo komandoa, n ere I laburtu erabili ahal izango dut.
Eta hau izango da programa line bidez urratsa line.
Beraz, ikusten gauzak exekutatu dezakezu, aldagai-aldaketa, gauzak eguneratuko.
Zein da pretty nice.
Beste cool gauza komandoa bera errepikatuz baizik eta baino gehiago baino gehiago berriz baino gehiago da,
besterik ez duzu hit bada Sartu - Hemen ikusten duzu ez dut ezer idatzi
dut hit balitz Sartu, aurreko komandoa errepikatu egingo da,
edo aurreko GDB komandoa Hori besterik ez dut sartu
Sartu sakatuz gorde ahal izango dut, eta nire kodea line by line bidez hurrats dugu.
Sustatzeko duzu guys ikusteko beste buggy programak baita joan nahi nuke.
Ez dugu denbora horiek guztiak gaur egun atalean.
Iturburu-kodea hor dago, beraz, ikusteko zer ari den gertatzen mota
gero benetan itsatsita eszenak atzean,
baina, gutxienez, lantzeko sortu abiarazteko GDB,
Programa exekutatzen ari da hausten arte,
backtrace lortzean, kalkulatzen Kraskadurari funtzionatzen zer zen,
zer on line izan zen, out inprimatzeko aldakorreko balio batzuk,
besterik ez da, beraz, sentitzen bat lortuko duzu, benetan delako joan aurrera duzu.
Une honetan, irten GDB, irten ez erabiltzen duzun edo, besterik gabe, q goaz.
Zure programa oraindik exekutatzen erdian bada, eta ez da gdb irten,
beti izango da eskatu baduzu, "Ziur zaude irten nahi duzula?"
Sartu sakatzea nahikoa izango bai.
>> Orain hurrengo arazoa dugu, cat programa da begiratu dugu.
Ikusten duzu eta berbideratu hodi labur bada, ikus Tommy programa hau erabiltzen duzu
funtsean irteera fitxategi bat bistaratzen du pantaila.
Beraz, bada cat exekutatu dut, hau da, benetan eraikitako programa bat aparatuaren
eta MACS bada hau egin ahal izango duzu zure Mac on ere, ireki terminal sortu bada.
Eta gure cat, demagun, cp.c, eta sakatu Sartu.
Zer da hau egin zuten, joan gara pixka bat ikusi eta non line ran dugu bada,
edo non, cat komandoa zuena dugu, besterik ez literalki inprimatu cp.c edukiak gure pantailan.
Exekutatu ahal izango dugu berriro eta fitxategiak hainbat bildu dezakezu.
Beraz, cat cp.c egin dezakezu, eta ondoren ere egin ahal izango dugu cat.c fitxategia kateatu
buruz idazten ari gara programa da,
eta bi fitxategiak inprimatzeko izango da berriro gure pantailan atzera.
Beraz korritu dugu pixka bat izanez gero, ikusten dugun, cat cp.c hau, cat.c zuena dugu,
lehen inprimatutakoak cp fitxategia, eta ondoren, azpian, inprimatutakoak cat.c fitxategia behera hemen.
Hau erabili ahal izateko gure oinak bustita lortu dugu.
Play inguruan terminalera simple inprimatzeko, ikusi, nola lan egiten duen.
You guys ireki gedit cat.c, sakatu Sartu,
idazten ari buruzko programa ikusi ahal izango duzu.
Sartu dugu hau nice galdara plaka, beraz, ez dugu denbora out hori guztia idatziz.
Ere egiaztatu dugu argumentu kopurua gainditu sartu
Inprimatzen ditugu erabilera mezu polit bat.
>> Gauza ordena, berriz, Nik atsegin dugu izan buruz hitz egiten da,
ia gihar memoria bezala.
Just gogoratu stuff sort bera egiten jarraitzeko
eta beti inprimatzeko mezua lagungarria nolabaiteko
da, beraz, jendeak jakin nola zure programa exekutatu.
Cat, nahiko erraza da; ari gara hainbat argumentu guztietan barrena joango gara
gure programa pasa ziren, eta inprimatu goaz
beren edukia pantaila bat denbora batean.
Fitxategiak inprimatu pantaila, oso antzeko zerbait egin behar dugu
zer egin dugu galdetegiaren amaieran.
Quiz, kontratatzen programa amaieran, fitxategi bat ireki behar izan genuen,
eta, ondoren, inprimatu izan genuen.
Kasu honetan, fitxategi bat ireki dugu, eta irakurri ordez goaz.
Ondoren, inprimatu ordez, fitxategi batean goaz, pantaila inprimatu goaz.
Beraz egiten duzun printf aurretik pantaila inprimatzean.
Beraz, ez da oso crazy da.
Baina fitxategi bat irakurtzen bitxi mota da.
Bat apur dugu aldi berean.
You guys Joan atzera, zure quiz, 33 arazoa, azken arazo hori bada
lehen lerroan ari gara hemen egin du, fitxategia irekitzeko, zer genuen oso antzekoa da.
Stella Beraz, zer da, esate baterako fitxategi bat ireki dugu lerro horren itxura?
[Stella] Capital FITXATEGIA * file - >> Ados. >> - Da fopen berdinak. >> Yup.
Zein da kasu honetan? Iruzkina da.
>> Iruzkina da? argv [i] eta r?
>> Zehazki. Eskuin. Beraz, Stella erabat eskubidea.
Hau da, zein itxura.
Fitxategia korronte aldagaia lortzeko FITXATEGIA * gorde dugu, beraz, txanoak guztiak,
FITXATEGIA, *, eta aldagai honen izena fitxategia izango da.
Deitu izan dugu, edozein izanda ere gustatuko. Deitu, first_file edo file_i, edozein nahi genuke genezake.
Eta gero, fitxategiaren izena komando-lerroa programa hau pasa zen.
Beraz, hasi gordetzen argv [i] eta, gero, fitxategi hau irekitzeko moduan irakurri dugu.
Orain fitxategia ireki dugu, zer gauza beti egin dugun gogoratu
bakoitzean fitxategi bat ireki dugu? Itxi.
Missy Beraz, nola ez fitxategi bat itxi dugu?
[Missy] fclose (fitxategia) >> fclose (fitxategia). Hain zuzen ere.
Great. Ongi da. Hau begiratzen badiogu iruzkina egin hemen
, dio "Open argv [i], eta bere edukia inprimatu irteera estandarrean."
>> Standard out name bitxi bat da. Irteera estandarrean gure esateko modu bat da
terminalean inprimatu nahi dugu; irteeraren korrontea estandarra inprimatu nahi dugu.
Benetan ahal izango dugu iruzkin hau kentzeko eskubidea hemen.
Kopiatu eta itsatsi hori egin dugu geroztik noa.
Une honetan, gaur egun bit by file bit irakurri dugu.
Fitxategiak irakurtzeko modu pare bat eztabaidatu dugu.
Zein dira zure gogokoetara dira orain arte?
Zein bide edo ikusi ez, gogoratzen duzu fitxategiak irakurtzeko?
[Daniel] fread? >> Fread? Beraz fread bat da. Jimmy, ez beste edozein ezagutzen al duzu?
[Jimmy] n. >> Ados. Laguia. Charlotte? Alexander? Beste edozein? Ongi da.
Beraz, beste batzuk dira fgetc da, asko erabili ahal izango dugu.
Ere fscanf duzu guys eredu bat ikusi hemen?
F hasten. Fitxategi batekin egin ezer.
Ez fread, fgetc, fscanf. Hauek dira irakurtzen funtzio guztiak.
Fwrite idazten ditugu, ordez fgetc fputc dugu.
Era berean, fprintf nahi galdetegiaren ikusi dugu.
Arazo bat egiten duten fitxategi batetik irakurtzen denez,
hiru funtzio hauetako bat erabili dugu.
Ari gara funtzio hauek erabiltzeko behera hemen.
Funtzio horiek guztiak I / O liburutegi estandarrak aurkitu.
Beraz, bada, programa honen goialdean,
ikusi ditudan dugun liburutegi estandarrak I / O fitxategi goiburua dezakezu.
Nahi dugu irudikatu nahi izanez gero bat erabili nahi dugu,
man orriak beti ireki ahal izango dugu.
Beraz, gizon stdio idatzi ahal izango dugu
guztiak irakurri eta sarrera stdio eta irteera funtzioak C. buruz
Eta dagoeneko ikus dezakegu oh, itxura. Fgetc da aipatzea, fputc aipatzea.
Beraz, zulatzeko dezakezu pixka bat eta begiratzen, esan, fgetc
eta bere man orrialdea begiratu.
Ikusi dezakezu doan dela batera beste funtzio sorta bat osoa:
fgetc, fgets, getc, getchar, lortzen, ungetc, eta bere pertsonaiak eta kateak sarrera.
Beraz, hau da nola pertsonaia eta kateak irakurriko dugu sarrera estandarretik fitxategiak
hau da, funtsean, erabiltzaileari.
Eta hori nola egiten dugun C. benetako
Beraz, hau da, ez GetString eta GetChar funtzioak erabiliz
CS50 liburutegia erabiltzen dugula.
Arazo hau konpontzeko modu pare bat egin dugu
beraz, bi modu ezberdinetan egiten duten ikusi ahal izango duzu.
Fread Bi funtzio Daniel aipatu eta fgetc modu ona egin dira.
Fgetc da pixka bat errazagoa dela uste dut, besterik ez duelako, ikusten duzun bezala,
argumentu bat, pertsonaia irakurri nahian ari gara FITXATEGIA *
eta bere bueltan balioa int bat da.
Eta hau da, pixka bat nahasgarria, eskuineko?
>> Karaktere bat delako lortzean ari gara, eta, beraz, zergatik ez du itzulera hau char?
Zaudete zergatik hori ez itzultzeko char edozein ideia?
[Missy erantzun, ulertezinak] >> Bai. Beraz, Missy erabat eskubidea.
ASCII bada, orduan osokoa hau benetako char bat izan badu.
ASCII karaktere bat izan daiteke, eta hori da.
Hori da zehazki zer ari den gertatzen.
Int bat erabiltzen ari gara, besterik gabe, delako gehiago bit du.
Char bat baino handiagoa da; gure karakterra bakarrik 8 bit, gure makina 32-bit byte 1.
Eta int 4 bytes espazioaren merezi du.
Eta bihurtzen da modu bat dela fgetc funtzionatzen du,
joan gara behera man orri hau pixka bat izanez gero, gure laburpena
mugitzeko modu guztiak behera. Bihurtzen da izeneko EOF balio berezi hau erabiltzen dutela.
Funtzioa fgetc itzulera gisa balio konstantea berezi bat da
betiere, fitxategi amaieran hit duzu, edo errore bat lortzen baduzu.
Eta bihurtzen da konparazioak horiek EOF batera egin behar bezala,
int batean informazio kopuru gehigarria duzula izan nahi duzun
char aldagai bat erabiliz aurka.
Nahiz eta fgetc eraginkortasunez fitxategi batetik, karaktere bat lortzeko
da mota int duzu zerbait itzuli dela gogoratu nahi duzun.
Hori esanda, nahiko erraza da.
Karaktere bat ezagutzera emango da, beraz, mantendu egin behar dugu fitxategia eskatuz,
"Give me hurrengo karakterea, eman dit hurrengo karakterea, eman dit hurrengo karakterea,"
lerro amaierara iritsi arte.
Eta hori izango da gure fitxategia aldi berean, karaktere bat tira
eta, ondoren, edozein dela ere nahi dugu.
Gorde ahal izango ditugu, gehitu ahal izango dugu kate bat, inprimatu ahal izango dugu.
Egin duten edozein.
>> Atzera zooma handitzea eta atzera egingo gure cat.c programa,
ari gara fgetc erabili nahi izanez gero,
nola izan liteke hurrengo kode lerro hau hurbilduko gara?
Erabili goaz - fread zerbait apur bat desberdinak egingo.
Eta oraingoan, besterik ez ari gara fgetc erabili karaktere bat aldi berean egingo.
Osoa fitxategi bat prozesatzeko, eta agian egin behar dugu?
Zenbat karaktere dira fitxategi batean?
Asko daude. Beraz, nahi ziurrenik bat lortzeko
eta, ondoren, beste bat, eta beste bat, eta beste bat lortzeko.
Nolako algoritmoa erabili dugu uste al duzu?
Zer mota? [Alexander] loop A? >> Zehazki.
Begizta mota batzuk.
Loop A benetan handia da, kasu honetan.
Eta esaten ari zaren bezala, nahi duzun fitxategi osoa zehar begizta bat bezala soinuak,
aldi berean pertsonaia bat eskuratzerakoan.
Edozein zer on dezaketen iradokizun itxura?
[Alexander, ulertezina]
>> Ados, ingelesez tell me zer egin saiatzen ari zaren? [Alexander, ulertezina]
Beraz, kasu honetan, ari gara Fitxategi osoa zehar loop bezala saiatzen soinuak.
[Alexander] Beraz, i > Tamaina -?
Fitxategiaren tamaina uste dut, ezta? Tamaina - we'll idatzi hau atsegin dute.
Fitxategi tamaina oraingoz, i + +.
Beraz, izarrekin bihurtzen da modu honetan daukazu fgetc erabiliz, eta hori berria da,
ez dagoela erraz besterik ez fitxategi baten tamaina
hau "sizeof" eraikitzeko duzula ikusi.
Funtzio hori erabiltzen ditugu fgetc, nolabaiteko ari gara sartuz
berri, funky sintaxia begizta hau, non ordez counter besterik ez oinarrizko bat erabiliz
karaktere karaktere joan, aldi berean karaktere bat zabaltzen dugu,
aldi berean pertsonaia bat, eta ezagutzen dugun Oraindik amaieran
ez da zenbatuko dugu karaktere kopuru jakin bat,
baina izarrekin tira dugu pertsonaia fitxategi pertsonaia amaiera berezia dela.
Beraz, hau egin ahal izango dugu - ch honetan deitzen dut, eta abiarazi dugu
gure lehen deialdian lehen karaktere fitxategia daudelarik.
Zati honetan hemen, beraz, hau da, pertsonaia bat ateratzeko fitxategia
eta gordetzeko aldagaia ch.
Horretan mantendu ari gara lerro amaierara iritsi arte,
for probatzeko karaktere ez EOF karaktere berezi berdina izan dugu.
Eta gero, ch egiten ordez + +, zein litzateke Kontatzailea balioa,
, hala badagokio fitxategia out A, kapital-A, esan irakurri dugu,
ch + + gurekin luke b, eta, ondoren, c eta, ondoren, d genuke.
Hau ez da, argi eta garbi zer nahi dugun. Zer nahi dugu hemen
a bit honetan hurrengo karakterea fitxategia nahi dugu.
>> Beraz, nola liteke hurrengo fitxategia izaera lortuko dugu?
Nola lortuko dugu lehen karaktere fitxategia?
[Student] fgetfile? >> Fgetc, edo, barkatu, erabat eskuineko zinen.
Gaizki idatzitako dut bertan. Beraz, bai.
Hemen ch egiten ordez + +,
fgetc (file) berriro deitu besterik ez ari gara
gordetzeko eta gure ch aldagai berarekin emaitza.
[Student galdera, ulertezina]
>> Hau da, non FITXATEGIA * guys horiek bereziak dira.
Dute lan - irekitzeko lehen - lehen fopen dei hori egin,
* FITXATEGIA eraginkortasunez fitxategiaren hasieran erakuslea gisa balio.
Eta gero, denbora guztietan fgetc deitu, karaktere bat mugitzen fitxategi bidez.
Beraz, beti ere deitzen duzunean, fitxategi-erakuslea zaren incrementing karaktere bat.
Eta berriro fgetc, ari zaren beste pertsonaia bat mugitzen
eta beste pertsonaia bat eta beste pertsonaia bat eta beste pertsonaia bat.
[Ikasleentzako galdera, ulertezina] >> Eta that's - bai.
Magia hau mota da kanpaia azpian.
Mantentzea besterik ez duzu bidez incrementing.
Puntu honetan, gai benetan pertsonaia batekin lan egiten zara.
Orduan, nola liteke hau inprimatu dugu pantailan, orain?
Printf gauza bera baino lehen erabili ahal izango dugu.
Behin seihilekoa guztiak erabiliz.
Printf deitu ahal izango dugu,
eta pertsonaia gainditu ahal izango dugu, besterik gabe.
Egiteko beste modu bat, baizik eta printf erabiliz eta formatu katea Horretarako beharrik baino,
beste funtzio bat ere erabili ahal izango dugu.
Fputc, pertsonaia bat bistaratzen du pantaila erabili ahal izango ditugu,
bada izan ezik, itxura fputc - utzi urruntzeko me pixka bat.
Ikusten dugu zer nice pertsonaia hartzen irakurri dugu fgetc erabiliz,
emateko, baina gero, korronte bat inprimatu behar dugu.
Putchar funtzioa, zuzenean jarriko standard out ere erabili ahal izango dugu.
Beraz, ez dira inprimatzeko erabili ahal izango dugu, aukera desberdinen artean sorta osoa.
I / O liburutegi estandarrak Oraindik dute.
Bakoitzean inprimatu nahi duzun beraz printf, berez, korronte out estandar berezia inprimatzeko,
stdout dela.
Beraz, ezin dugu erreferentzia balioa magia, hemen stdout mota gisa.
Oops. Jarri puntu eta komaz kanpo.
>> Hau da, hemen informazio berria funky asko.
Hau asko oso hizkuntza, eta zentzu hori da kodea
hori modu hau idatzi besterik ez delako garbia da, irakurri, erraz irakurtzen.
Daude hainbat bide egin ahal izateko, hainbat funtzio erabili ahal izango dituzu,
baina berdina jarraitzen Zaindari hauek eta gehiago gorako joera dugu.
Beraz, ez da harritu datozen behin eta berriro atsegin kodea ikusiko duzu.
Guztiak eskubidea. Une honetan, eguneko apurtu behar dugu.
Eskerrik asko etortzeagatik. Eskerrik asko Oraindik duzun online bada ikusteko. Eta ikusiko dugu datorren astean.
[CS50.TV]