[Powered by Google Translate] [5.nodaļa: mazāk apmierināti] [Nate Hardison, Hārvarda universitātes] [Tas ir CS50.] [CS50.TV] Tātad laipni atpakaļ, puiši. Welcome to 5 iedaļā. Šajā brīdī, ir pabeiguši viktorīnā 0 un redzot to, kā jūs esat darījuši, cerams jums justies tiešām labi, jo man bija ļoti iespaidu ar šajā sadaļā rādītājus. Mūsu tiešsaistes skatītāju, mēs esam bija pāris jautājumus par pēdējiem diviem problēmas uz problēmu komplektu - vai viktorīnas, diezgan. Tāpēc mēs esam gatavojas iet pār tiem tiešām ātri, lai visi redz, kas noticis un kā iet cauri faktisko risinājumu, nevis tikai meklē risinājumu pati. Mēs ejam, lai iet pa pēdējo pāris problēmas patiešām ātri, 32 un 33. Tikai atkal, tāpēc, ka tiešsaistes skatītāji var redzēt. Ja jūs savukārt jūsu problēmai 32, kuras ir 13 lapas, 13 no 16 gadiem, problēma 32 ir visu par mijmaiņas darījumiem. Tas viss bija par pārnešana divus naturālus skaitļus. Tā ir problēma, ka mēs gribētu devusies vairāk nekā pāris reizes lekciju. Un šeit, ko mēs lūdzam jums jādara, ir ātrs atmiņu pēdas. Aizpildīt mainīgo lielumu vērtības, jo tie ir uz skursteņa kā kods iet caur šo mijmaiņas funkciju. Jo īpaši tas, ko mēs esam meklē - I'm gatavojas nodot šo iPad leju - jo īpaši, kāda mēs esam meklē, ir šī pozīcija numurētas 6 Labais šeit. Un tas ir numurēta 6 tikai saskarsmes ar iepriekšējo problēmu. Ko mēs vēlamies darīt, ir parādīt vai etiķete stāvokli atmiņas kā tas ir laikā, kad mēs izpildīt šo līniju skaits 6, kas ir faktiski atgriešanās no mūsu swap funkcija šeit. Ja mēs ritinātu uz leju šeit, mēs redzējām, ka viss atmiņas adreses bija paredzēts mums. Tas ir ļoti svarīgs, mēs būsim atpakaļ uz to tikai brīdi. Un tad noteikti šeit apakšā, mums bija, ka mēs ejam, lai atsauktos uz nedaudz atmiņas diagrammu. Man ir faktiski izdarīts uz manu iPad. Tāpēc es esmu gatavojas pārslēgties uz priekšu un atpakaļ starp iPad un šis kods tikai uzziņai. Sāksim. Pirmkārt, pieņemsim koncentrēties uz pirmo pāris līnijas galvenais šeit. Lai sāktu, mēs ejam, lai sāktu X 1 un y līdz 2. Tātad mums ir divas skaitlim mainīgie, viņi abi būs likts uz skursteņa. Mēs ejam, lai likt 1 un A 2 tiem. Tātad, ja es uzsist pa manu iPad, cerams, pieņemsim redzēt - Apple TV atspoguļojot, un tur mēs ejam. Labi. Tātad, ja es uzsist pa manu iPad, Es gribu, lai sāktu X 1 un y līdz 2. Mēs darīt gluži vienkārši rakstot 1 kastē atzīmēti X un lodziņā 2 atzīmēti y. Diezgan vienkārši. Tāpēc tagad iesim atpakaļ uz klēpjdators, redzēt, kas notiks tālāk. Tātad šis nākamais līnija ir, ja lietas iegūt grūts. Mēs iet no x adresi un y adresi kā parametru un b uz apmaiņas funkciju. No x un y adresi adrese ir lietas, ko mēs nevaram aprēķināt neatsaucoties uz šiem aizzīmju punktiem tiesības uz leju šeit. Un par laimi, pirmās divas aizzīmju punktiem mums pastāstīt, ko tieši atbildes ir. Gada x adrese atmiņā ir 10, un y adrese atmiņā ir 14. Tātad tie ir vērtības, kas get ritēja kā un b līdz top mūsu mijmaiņas funkciju. Tātad vēlreiz, pārejot atpakaļ uz mūsu diagrammu, es varētu uzrakstīt 10 no un 14 b. Tagad, šis punkts ir tas, kur mēs turpināt ar swap. Tāpēc flipping atpakaļ uz klēpjdators atkal, mēs redzam, ka tas, kā mijmaiņas darbojas, ir es pirmo reizi dereference un uzglabāt rezultāts TPP. Tātad dereference operators saka: "Hei. Treat saturu mainīgs kā adresi. Iet uz kāda tiek glabāti šajā adresē, un slodze to. " Ko jūs slodze no mainīgais tiks saglabāti mūsu tmp mainīgs. Flipping atpakaļ uz iPad. Ja mēs ejam, lai risinātu 10, mēs zinām, ka adrese 10 ir varible x jo mums bija teicis mūsu aizzīmes punktā ka x adrese atmiņā ir 10. Lai mēs varētu iet tur, iegūt vērtību no tā, kas ir 1, kā mēs redzam uz mūsu iPad, un slodze, kas stājas TMP. Atkal, tas nav galīgie saturs. Mēs ejam staigāt cauri un mēs sāksim mūsu gala stāvokli programmas beigās. Bet tieši tagad, mēs esam vērtību 1 glabājas TPP. Un tur ir ātrs jautājums nekā šeit. [Aleksandrs] Vai dereference operators - tas ir tikai zvaigzne iepretim mainīgo? >> Jā. Tātad dereference operators, jo mēs uzsist atpakaļ uz mūsu klēpjdators vēlreiz, tas ir zvaigzne tiesības priekšā. Šajā ziņā, tas ir - tu kontrastētu ar reizināšanas operatoru kas prasa divas lietas apakšpunktu.Dalībvalstij, kas dereference operators unary operators. Vienkārši piemērot vienu vērtību pretstatā bināro operatoru, kur jūs pieteikties uz divām dažādām vērtībām. Tātad tas, kas notiek šajā līnijā. Mēs ielādes vērtību 1 un uzglabā to mūsu pagaidu skaitlim mainīgo. Nākamais līnija, mēs glabāt saturu B uz - vai, drīzāk, mēs glabāt saturu, kas b tiek norāda uz uz to vietu, kur ir vērsts uz. Ja mēs analizējam šo no labās uz kreiso, mēs dereference b, mēs risinātu 14, mēs gatavojamies, lai greifers skaitlim, kas ir tur, un tad mēs gatavojamies iet uz adresi 10, un mēs mest rezultāts mūsu dereference no B uz šo vietu. Flipping atpakaļ uz mūsu iPad, kur mēs varam padarīt šo nedaudz vairāk betona, tas varētu palīdzēt, ja es rakstītu ciparus par visiem adresēm šeit. Tātad mēs zinām, ka y, mēs esam pēc 14 adreses, x ir pie 10 adreses. Kad mēs sākam pie b, mēs dereference b, mēs ejam, lai greifers vērtību 2. Mēs gatavojamies, lai greifers šo vērtību, jo tas ir vērtība, kas dzīvo pie 14 adreses. Un mēs ejam, lai nodot to mainīgo, kas dzīvo pie 10 adreses, kas ir labi tur, kuri atbilst mūsu mainīgo x. Lai mēs varam darīt mazliet pārrakstīšanu šeit kur mēs atbrīvoties no 1 mūsu un tā vietā mēs rakstīt 2. Tātad viss ir labi un labs pasaulē, pat ja mēs esam pārrakstīti x tagad. Mums ir saglabāti X veco vērtību mūsu tmp mainīga. Lai mēs varētu pabeigt mijmaiņas ar nākamo līniju. Flipping atpakaļ uz mūsu klēpjdators. Tagad viss, kas paliek, ir jāveic saturu no mūsu pagaidu skaitlim mainīgo un glabāt tos mainīgā kas dzīvo adresē, ka B ir holdinga. Tāpēc mēs esam gatavojas efektīvi dereference B piekļūt mainīgā kas ir pie adreses, kas b tur tajā, un mēs braucam, lai stuff vērtību, TVP ir turot to. Flipping atpakaļ uz iPad vēlreiz. Es varu izdzēst šo vērtību šeit, 2, un tā vietā mēs kopēt 1 tiesības tajā. Tad nākamais līnija, kas izpilda, protams - ja mēs uzsist atpakaļ uz klēpjdators - tas ir punkts 6, kas ir punkts, kurā mēs vēlējāmies, lai ir mūsu diagrammā pilnībā aizpildīts. Tāpēc flipping atpakaļ uz iPad vēlreiz, tikai, lai jūs varētu redzēt pabeigto diagrammu, Jūs varat redzēt, ka mums ir 10 no, 14 B, 1 pret TPP 2 X un Y 1. Vai ir kādi par šo jautājumu? Vai tas ir daudz lietderīgāk, kas gāja caur to? Padarīt mazāk nozīmē? Cerams, ka ne. Labi. Norādes ir ļoti grūts jautājums. Viens no puišiem mēs strādājam ar ir ļoti teiciens: "Lai saprastu norādes, jums vispirms ir jāsaprot norādes." Ko es domāju, ir ļoti patiess. Tas aizņem kādu laiku, lai pierastu pie tā. Zīmēšanas daudz bildes, zīmēšanas daudz atmiņas diagrammas, piemēram, šo vienu, ir ļoti noderīga, un pēc tam jūs staigāt pa piemēram, pēc piemēram, pēc piemēram, tas būs sākums, lai padarītu mazliet lielāka jēga un nedaudz vairāk jēgas un nedaudz lielāka jēga. Visbeidzot, kādu dienu, jums ir to visu pilnīgi apgūta. Visus jautājumus, pirms mēs pāriet uz nākamo problēmu? Labi. Tāpēc uzsist atpakaļ uz klēpjdators. Nākamā problēma mums ir problēma numur 33 uz failu I / O. Tuvinātu šo mazliet. Problēma 33 - Jā? [Daniels] Es tikko bija ātrs jautājums. Šī zvaigzne, vai zvaigznīte, to sauc dereferencing kad izmantot zvaigznīti pirms tam. Kas to sauc, kad jūs izmantojat & zīmi pirms? >> & Zīmi pirms ir adrese-operatora. Tāpēc pieņemsim ritināt atpakaļ uz augšu. Hmm. Es esmu tālummaiņas režīmā, tāpēc es nevaru īsti ritināšanas. Ja mēs skatāmies uz šo kodu tiešām ātri tieši šeit, atkal tas pats notiek. Ja mēs skatāmies uz šo kodu tepat, šajā līnijā, kur mēs zvans swap, & zīmi ir vienkārši pasakot "iegūt adresi, kurā mainīgās x dzīvību." Kad jūsu sastādītājs apkopo savu kodu, tas ir faktiski fiziski atzīmētu vietu atmiņā visiem jūsu mainīgo dzīvot. Un lai ko kompilators tad var darīt, kad tā ir apkopoti visu, tā zina, "Ak, man x pie 10 adresē man y pie 14 adreses.". To pēc tam var aizpildīt šos jums vērtībām. Tātad jūs varat - tas pēc tam var pāriet šo un nodot & Y, kā arī. Šie puiši iegūt adresi, bet viņi arī, kad iet tos mijmaiņas funkciju, šāda veida informāciju, šis int * šeit, stāsta kompilatoru, "Labi, mēs ejam, lai būtu Interpretējot šo adresi kā adresi skaitlim mainīgo." Kā adresi int, kas atšķiras no uzņēmuma adreses rakstzīmju mainīgā jo int aizņem, uz 32-bitu mašīna, aizņem 4 baitus no kosmosa, tā raksturs tikai aizņem 1 baitu telpu. Tātad, tas ir svarīgi zināt arī to, kas ir - kāda dzīvo, kāda veida vērtības dzīvo adresē, ka got pagājis iekšā Vai adresi, kas jums ir darīšana ar. Tādā veidā, jūs zināt, cik daudz baitu informācijas faktiski ielādēt no jūsu RAM. Un tad, jā, tas dereference operators, tāpat Tu jautāji, iet un piekļūst informācijai par konkrētu adresi. Tātad tā saka, ar šo mainīgo šeit, ārstēt saturu kā adresi, dodieties uz šo adresi, un izraut, slodze uz procesoru, slodze uz reģistrā faktiskās vērtības vai saturs, kas dzīvo šajā adresē. Kādi jautājumi? Tie ir labi jautājumi. Tas ir daudz jaunu terminu pārāk. Tas ir arī sava veida bailīgs, redzot & un * dažādās vietās. Labi. Tātad atpakaļ uz 33 problēmu, failu I / O Tas bija viens no šīs problēmas, kas, manuprāt pāris lietas notika. Viens, tas diezgan jaunu tēmu. Tas tika iesniegts diezgan drīz pirms viktorīnu, un tad es domāju, ka tas bija sava veida, piemēram, viens no tiem vārdu problēmas matemātikas ja viņi jums daudz informācijas, bet jūs tiešām nav galu galā, kam, lai izmantotu ton tā. Pirmā daļa no šīs problēmas ir apraksta to CSV fails ir. Tagad, CSV failu, saskaņā ar aprakstu, ir komatu atdalītu vērtību failu. Iemesls tie vispār interesanti, un iemesls jūs kādreiz tos izmantot, ir, jo, cik daudzi no jums ir kādreiz izmanto sīkumi, piemēram Excel? Skaitlis lielākā daļa no jums ir, iespējams, vai arī izmantot kādā brīdī savā dzīvē. Jūs izmantot kaut ko līdzīgu Excel. Lai iegūtu datus no Excel izklājlapas vai arī jebkāda veida apstrādes ar to, ja jūs gribēju rakstīt C programmu vai Python programmu, Java programmu, lai tiktu galā ar datiem, ko esat saglabājis tur, viens no visbiežāk veidus, lai saņemtu to, ir CSV failā. Un jūs varat atvērt Excel un, kad jūs iet uz "Save As" dialoga, Jūs varat iegūt no faktiskā CSV failu. Ērts zināt, kā tikt galā ar šīm lietām. Kā tā darbojas, ka tas ir līdzīgs - es domāju, tas ir būtībā atdarinot izklājlapu, kur, kā mēs redzam šeit, jo ļoti kreisās visvairāk gabals, Mums ir visas uzvārdus. Tāpēc mums ir Malan, tad Hardison, un tad Bowden, MacWilliam, un tad Chan. Visi pēdējie vārdi. Un tad komats atdala uzvārdus no pirmajiem vārdiem. Dāvids, Nate, Rob, Tommy, un Zamyla. Es vienmēr jaukt Robij un Toms. Un tad, beidzot, trešais kolonna ir e-pasta adreses. Kad jūs saprotat, ka, par programmas pārējais ir diezgan vienkārši īstenot. Ko mēs esam darījuši, lai atdarinātu šo pašu struktūru mūsu C programmā tiek mēs esam izmanto struktūru. Mēs sāksim spēlēt ar šiem nedaudz vairāk kā labi. Mēs redzējām tos pirmo mazliet problemātiskas komplekts 3, kad mēs bijām nodarbojas ar vārdnīcām. Bet šie darbinieki struktūrai saglabā pēdējo vārdu, vārds un e-pastu. Tāpat kā mūsu CSV failā tika glabāšanai. Tātad tas ir tikai konvertējot no viena formāta uz citu. Mums ir pārvērst, šajā gadījumā, personāla struct uz līnijas, komatu atdalīta līniju, tieši tāpat. Vai ir jēga? Jums puiši ir visas jāņem viktorīnu, tāpēc es domāju, jums ir vismaz bija kādu laiku, lai padomātu par to. Jo nomu funkciju, problēma lūdz mūs uzņemt - we'll tuvinātu šo mazliet - veikt personāla struktūru, personāla struct, ar vārdu s, un pievieno tās saturu mūsu staff.csv failā. Izrādās, ka tas ir diezgan vienkārši izmantot. Mēs veida spēlēt aptuveni ar šo funkciju nedaudz vairāk šodien. Bet šajā gadījumā, fprintf funkcija ir tiešām galvenais. Tātad ar fprintf, mēs varam drukāt, tāpat kā jums puiši ir bijis, izmantojot printf visu šo terminu. Jūs varat printf līnija uz failu. Tātad, nevis tikai padarot ierasto printf zvanu kur jūs arī tā formāta virknes un tad jūs nomainīt visus mainīgos ar šādiem argumentiem, ar fprintf, jūsu pašu pirmo argumentu ir vietā failu, kuru vēlaties rakstīt. Ja mēs apskatīt šo ierīci, piemēram, cilvēks fprintf, mēs varam redzēt atšķirību starp printf un fprintf. Es tuvinātu šeit mazliet. Tātad ar printf, mēs arī tā formāta virknes, un tad vēlāk nav iebildumu ir visi mainīgie nomaiņu vai aizstāšana mūsu formāta virknes. Tā ar fprintf, pirmais arguments ir patiešām šo failu * sauc plūsmā. Pārvietojas atpakaļ vairāk nekā šeit uz mūsu noma, mēs esam jau ieguvuši mūsu failu * plūsma atver mums. Tas, ko šis pirmais rindā dara, tas atver staff.csv failu, tas atver to pievienošanas režīmā, un viss, kas palicis pāri, lai mēs varētu darīt, ir rakstīt personāla struktūru uz failu. Un, pieņemsim redzēt, vēlos izmantot iPad? Es izmantot iPad. Mums ir tukšumu - Paraudzīsimies uz galda, lai es varētu uzrakstīt mazliet labāk - anulēta nomu un tā veic vienu argumentu, personāla struktūru sauc s. Got mūsu bikšturi, mēs esam ieguvuši mūsu failu * sauc failu, Mums ir mūsu fopen līnija, ko mums, un es ņemšu tikai rakstīt to kā punktiņi, jo tas jau pedia. Un tad uz mūsu nākamo līniju, mēs ejam, lai piezvanītu fprintf un mēs esam gatavojas pāriet failā, ka mēs vēlamies, lai izdrukātu, un tad mūsu formāta virkne, kas - Es jums guys man pateikt, kas tas izskatās. Kā par jums, Stella? Vai jūs zināt, ko pirmā daļa formāta virknes izskatās? [Stella] Es neesmu pārliecināts. >> Jūtieties brīvi uzdot Jimmy. Vai jūs zināt, Jimmy? [Jimmy] Vai tas tikai būt pēdējais? Es nezinu. Es neesmu pilnīgi pārliecināts. >> Labi. Kā par, bija kāds iegūt šo pareizi uz eksāmenu? Nē. Nu labi. Izrādās, ka šeit viss, kas mums jādara, ir mēs vēlamies katru daļu no mūsu personāla struktūras jāizdrukā kā virkne mūsu failu. Mēs tikai izmantot virknes aizvietojošas Raksturs trīs dažādos laikos, jo mums ir pēdējais vārds seko komats, tad vārds seko komats, un tad beidzot e-pasta adresi, kas ir jāievēro, - kas nav uzstādīšanai uz mana ekrāna - bet tas seko newline raksturs. Tāpēc es esmu gatavojas rakstīt tikai tur lejā. Un tad pēc mūsu formāta virknes, Mums vienkārši ir aizstāšanu, ko mēs piekļūt, izmantojot dot notation ka mēs redzējām problēmu kopumu 3. Mēs varam izmantot s.last, s.first un s.email aizstāt šajās trīs vērtības uz mūsu formāta virknes. Tātad, kā tas iet? Padarīt jēga? Jā? Nē? Iespējams? Labi. Pēdējā lieta, ko mēs darām, kad mēs esam izdrukāt un pēc tam mēs esam atvērti mūsu failu: kad mēs esam atvērti failu, mums vienmēr ir jāatceras, lai to aizvērtu. Jo citādi mēs galu galā noplūde atmiņas, izmantojot līdz failu deskriptori. Tātad, lai to aizvērtu, kura funkcija mēs izmantot? Daniel? [Daniels] fclose? >> Fclose, tieši tā. Tā pēdējā daļa no šīs problēmas bija pareizi slēgt datni, izmantojot fclose funkciju, kas tikai izskatās tāpat. Ne pārāk traks. Atdzist. Tā ka uz viktorīnas 33 problēma. Mums būs noteikti vairāk failu I / O nāk uz augšu. Mēs darīsim nedaudz vairāk lekciju šodien, vai sadaļā Šodien, jo tas, kas notiek, lai veidotu lielāko daļu no šīs gaidāmās PSET. Pāriesim no viktorīnas šajā brīdī. Jā? [Šarlote]] Kāpēc fclose (fails), nevis fclose (staff.csv)? >> Ah. Jo izrādās, ka - tāpēc jautājums, kas ir liels vienu, Tāpēc, kad mēs rakstīt fclose, mēs rakstiski fclose (fails) zvaigzne mainīgo atšķirībā no faila nosaukumu, staff.csv? Vai tas ir pareizi? Yeah. Tāpēc pieņemsim to apskatīt. Ja es pāriet atpakaļ uz manu klēpjdatoru, un pieņemsim apskatīt fclose funkciju. Tātad fclose funkcija aizver plūsmā, un tas notiek ar rādītāja ar straumi, ka mēs vēlamies, lai aizvērtu, atšķirībā faktisko faila nosaukumu, ka mēs vēlamies, lai aizvērtu. Un tas ir tāpēc, ka aiz ainas, kad jūs veicat zvanu uz fopen, kad jūs atvērt failu, jūs faktiski piešķirot atmiņu uzglabāt informāciju par failu. Tātad jums ir faila rādītāju, kas ir informācija par failu, piemēram, tas ir atvērts, tā izmērs, kur jūs pašlaik failā, lai jūs varētu veikt lasīšanas un rakstīšanas zvanus uz konkrēto vietu ietvaros failu. Jūs galu galā slēgšanu rādītāju instead noslēguma faila nosaukumu. Jā? [Daniels] Tātad, lai izmantotu īri, jūs teikt - kā tas iegūt lietotāja ievadi? Vai fprintf rīkoties kā GetString tādā nozīmē, ka tas būs tikai jāgaida lietotāja ievadi un lūgt jūs rakstīt šo - vai gaidīt, lai jūs varētu rakstīt šīs trīs lietas? Vai jums ir nepieciešams izmantot kaut ko ieviest nomas? >> Jā. Tāpēc mēs esam ne - jautājums bija, kā mēs iegūt lietotāja ievadi Lai īstenotu nomas? Un ko mēs esam šeit ir zvanītājs par īri, aizritēja personāla struct ar visiem datiem, kas glabājas struct jau. Tātad fprintf spēj tikai rakstīt, ka datus tieši uz failu. Nav lietotāja ievadi gaida. Lietotājs ir jau dota ievadi, pareizi ievietojot to šajā personāla struct. Un lietas, protams, būs pārtraukums, ja kāds no šiem šautru bija nulle, tāpēc mēs ritināt atpakaļ šeit, un mēs skatāmies uz mūsu struct. Mums ir stīgu pēdējā, stīgu pirmkārt, virkne e-pastu. Mēs tagad zinām, ka visi tie, patiešām, ar kapuci, ir char * mainīgie. Kas var vai nevar tikt vērsta uz null. Tie var būt vērsta uz atmiņas par kaudze, varbūt atmiņas par kaudze. Mums nav īsti zināt, bet, ja kāds no šiem norādes, ir spēkā, vai spēkā neesošu, ka būs noteikti crash mūsu nomas funkciju. Tas bija kaut kas bija sava veida plašāki par eksāmenu. Mēs esam ne neuztraucoties par to. Lieliski. Labi. Tā pārvietojas no viktorīnas. Pieņemsim slēgt šo puisis, un mēs ejam apskatīt pie 4 PSET. Tātad, ja jūs puiši paskatās PSET spec, kad jūs varat piekļūt, cs50.net/quizzes, mēs gatavojamies iet cauri daži no paragrāfu problēmām šodien. Es esmu ritinot - sadaļa ar jautājumiem sākas trešajā lapā PSET spec. Un pirmā daļa prasa, lai jūs iet un skatīties īsā novirzīt un caurulēm. Kas bija sava veida atdzist īss, parāda dažas jaunas, atdzist komandrindas triku, ka jūs varat izmantot. Un tad mēs esam ieguvuši dažus jautājumus jums kā labi. Šis pirmais jautājums par plūsmām, uz ko printf raksta pēc noklusējuma, mēs veida pieskārās tikai mazliet pirms brīža. Tas fprintf ka mēs tikai apspriežam uzņem failu * plūsmā kā tās argumentu. fclose veic, failu * plūsmā, kā arī, un atgriešanās vērtību fopen dod jums failu * plūsma, kā arī. Iemesls, kāpēc mēs neesam redzējuši tos agrāk, kad mēs esam nodarbojas ar printf ir tāpēc printf ir noklusējuma straumi. Un noklusējuma plūsma uz kuriem tā raksta Jūs uzzināsiet par in īss. Tāpēc noteikti to apskatīt to. Mūsdienu sadaļā, mēs esam gatavojas runāt mazliet par gdb, jo vairāk pazīstams jums ir ar to, jo vairāk prakse jums ar to, labāk jums būs faktiski vajāt bugs savu kodu. Tas paātrina procesu debugging augšu ārkārtīgi. Tātad, izmantojot printf, katru reizi, kad jūs darīt, ka jums ir recompile savu kodu, Jums ir palaist vēlreiz, dažkārt jums ir pārvietot printf zvanu apkārt, komentēt kodu, tas tikai aizņem laiku. Mūsu mērķis ir, lai mēģinātu pārliecināt, ka ar gdb, jūs varat būtībā printf jebkurā brīdī savu kodu kaut ko un jums nekad nav recompile to. Jūs nekad ir jāsāk un saglabāt guessing kur printf nākamo. Pirmais, kas jādara, ir kopēt šo līniju un saņemt sadaļā kodu nost no interneta. Es esmu kopēšana šī koda rindu, kas saka, "wget ​​http://cdn.cs50.net". Es esmu gatavojas kopēt to. Es iešu uz manu ierīci, zoom, lai jūs varētu redzēt, ko es esmu dara, ielīmējot to tur, un, kad es hit Enter, tas wget komandu burtiski ir tīmekļa iegūt. Tas notiek, lai nojaukt šo failu nost no interneta, un tas notiek, lai saglabātu to uz pašreizējo direktorijā. Tagad, ja man uzskaitīt manu pašreizējo direktoriju jūs varat redzēt, ka es esam ieguvuši šo section5.zip failu tiesības tur. Veids, kā tikt galā ar šo puisis ir unzip to, ko jūs varat darīt, komandrindas, tāpat kā šis. Section5.zip. Ka būs unzip to, izveidot mapi par mani, uzpūst visu saturu, viņus tur. Tāpēc tagad es varu iet manā 5.sadaļu direktoriju, izmantojot cd komandu. Notīrītu ekrānu, izmantojot skaidrs. Tātad skaidrs ekrānu. Tagad man jauku tīru termināli, lai risinātu ar. Tagad, ja es uzskaitīt visus failus, ko redzu šajā direktorijā, Jūs redzat, ka es esmu ieguva četras failus: buggy1, buggy2, buggy3, buggy4 un. Esmu arī saņēmu to atbilstīgos. C failus. Mēs nebrauksim, lai apskatīt. C failus tagad. Tā vietā, mēs ejam, lai tos izmantot, ja mēs atvērt GDB. Mēs esam tur tos apmēram tā, ka mums ir pieejami faktiskajam avota kodu, kad mēs esam izmantojot GDB, bet šīs daļas sadaļas mērķis ir lāpīt apkārt ar gdb un redzēt, kā mēs varam izmantot, lai noskaidrotu, kas notiek nepareizi ar katru no šīm četrām buggy programmām. Tāpēc mēs esam tikai gatavojas pa istabu tiešām ātri, un es esmu gatavojas lūgt kādu, lai palaistu vienu no buggy programmu, un tad mēs iesim kā grupa ar gdb, un mēs redzēsim, ko mēs varam darīt, lai noteikt šo programmu, vai vismaz noteikt to, kas notiek nepareizi katrā no tiem. Sāksim nekā šeit ar Danielu. Vai jūs palaist buggy1? Paskatīsimies, kas notiek. [Daniels] Tajā teikts tur pieteikumu vaina. >> Jā. Tieši tā. Tātad, ja es palaist buggy1, man seg vaina. Šajā brīdī, es varētu iet un atvērt buggy1.c, izmēģināt un saprast, kas notiek nepareizi, bet viens no visvairāk nepatīkams lietas par šo SEG vaina kļūda ir, ka tas nav pateikt jums par to līniju programmas lietām faktiski gāja greizi un lauza. Jūs veida ir jāskatās uz kodu un izrēķināt, izmantojot minējumu un pārbaudīt vai printf lai redzētu, kas notiek nepareizi. Viens no stilīgākais lietas par gdb ir, ka tas ir ļoti, ļoti viegli izrēķināt līniju, kurā jūsu programma avarē. Tas ir pilnīgi tā vērts, lai to izmantotu, pat ja tikai par to. Tātad, lai boot up GDB, es tipa GDB, un tad es arī tā ceļu uz izpildāmā, ka es gribu, lai palaistu. Šeit es esmu mašīnrakstīšanu gdb ./buggy1. Hit Enter. Dod man visu šo autortiesību informāciju, un noteikti šeit jūs redzēsiet šo līniju, kas saka, "Reading simbolus no / home / jharvard/section5/buggy1. " Un, ja viss noritēs labi, jūs redzēsiet to izdrukāt ziņu, kas izskatās šādi. Tas būs lasīt simboliem, tas būs teikt: "Es esmu lasījums simbolus no izpildāmo failu," un tad tas būs šo "gatavs" ziņojumu nekā šeit. Ja redzat kādu citu variantu tas, vai jūs redzat to nevar atrast simboli vai kaut kas tamlīdzīgs, ko tas nozīmē, ka jūs vienkārši nav sastādījuši savu izpildāmo pareizi. Kad mēs apkopotu programmas izmantošanai ar gdb, mums ir jāizmanto šis īpašais-G karogu, un tas darīts pēc noklusējuma, ja jūs sastādīt savu programmu, vienkārši ierakstot padara vai veikt buggy vai padarīt atgūt, kāds no tiem. Bet, ja jūs apkopojot manuāli ar šķindēt, tad jums ir iet un ietver ka-g karogu. Šajā brīdī, tagad, kad mums ir mūsu GDB uzvednes, tas ir diezgan vienkārši, lai palaistu programmu. Mēs varam vai nu rakstīt palaist, vai arī mēs varam tikai Type R. Vairums gdb komandas var būt saīsināts. Parasti tikai vienu vai pāris burti, kas ir diezgan jauki. Tātad Saad, ja jūs Type R un hit Enter, kas notiek? [Saad] Man SIGSEGV, segmentācijas vaina, un tad visu šo gobbledygook. >> Jā. Tāpat kā mēs redzam uz ekrāna tieši tagad, un tāpat Saad teica, kad mēs tipa skrējienu vai r un hit Enter, mēs joprojām saņemt to pašu seg vaina. Tātad, izmantojot gdb neatrisina mūsu problēmas. Bet tas dod mums kādu gobbledygook, un izrādās, ka tas gobbledygook patiesībā stāsta mums, kur tas notiek. Parsēt šo mazliet, šis pirmais bits ir funkcija, kurā viss notiek nepareizi. Tur tas __ strcmp_sse4_2, un tā stāsta mums, ka tas notiek šajā failā sauc sysdeps/i386, tas viss, atkal, sava veida haoss - bet līnija 254. Tas ir sava veida grūti parsēt. Parasti, kad jūs redzat sīkumi kā šis, tas nozīmē, ka tā ir SEG faulting vienā no sistēmas bibliotēkās. Lai kaut ko darīt ar strcmp. Jums puiši ir redzējuši strcmp pirms tam. Ne pārāk traks, bet vai tas nozīmē, ka strcmp ir bojāts vai ka tur ir ar strcmp problēma? Ko jūs domājat, Aleksandrs? [Aleksandrs] Vai tas - ir 254 līnijas? Un - ne binārā, bet tas nav viņu griesti, un tad tur ir cita katrai funkcijai valoda. Ir tas, ka 254 Šajā funkciju, vai -? >> Tas ir līnija 254. Tas izskatās šajā. S failu, tāpēc tas ir montāža kods iespējams. Bet, es domāju, jo lielāka lieta ir, jo mēs esam gotten seg vaina, un izskatās, ka tas nāk no strcmp funkciju, tas nozīmē, tad, ka strcmp ir bojāta? Tā nedrīkst, cerams. Tik vienkārši, jo jums ir segmentēšanas vaina vienā no sistēmas funkcijas, parasti tas nozīmē, ka jūs vienkārši nav sauc to pareizi. Ātrākais, kas jādara, lai noskaidrotu, kas patiesībā notiek ja redzat kaut ko crazy, piemēram, tas, kad jūs redzat seg vaina, it īpaši, ja jums ir programma, kas ir, izmantojot vairāk nekā tikai galvenais, ir izmantot Izcelsme. Es īsināt Izcelsme rakstot BT, nevis pilnu Izcelsme vārdu. Bet Šarlote, kas notiek, ja jūs tipa BT un hit Enter? [Šarlote] Tas rāda man divas līnijas, līnija 0 un līnija 1. >> Jā. Tik līnija 0 un līnija 1. Tie ir faktiski kaudze rāmji, kas bija pašlaik spēlēt, kad jūsu programma avarēja. Sākot no augšējā rāmja, rāmis 0, un dodas uz grunts visvairāk, kas ir rāmis 1. Mūsu augšējais rāmis ir strcmp rāmis. Jūs varat domāt par to kā līdzīgs ar šo problēmu mums bija tikai dara uz viktorīnas ar šautru, kur mums bija swap steka rāmi virsū galveno kaudze rāmi, un mums bija mainīgie ka mijmaiņas bija, izmantojot uz augšu mainīgajiem, galvenais bija, izmantojot. Te mūsu avārija notika mūsu strcmp funkciju, ko sauca par mūsu galveno funkciju, un Izcelsme dod mums ne tikai tās funkcijas, kurā lietas neizdevās, bet tas arī stāsta mums, kur viss tika saukta no. Tātad, ja es ritiniet pa nedaudz vairāk pa labi, mēs varam redzēt, ka jā, mēs esam uz šīs strcmp-sse4.s failu 254 līniju. Bet zvans tika veikts buggy1.c, līnijas 6. Tātad tas nozīmē, ka mēs varam darīt, - ir, mēs varam tikai iet pārbaudīt un redzēt, kas notiek pie buggy1.c, līnijas 6. Atkal, ir daži veidi, kā to izdarīt. Viens ir, lai izietu ārpus gdb vai ir jūsu kods atvērts citā logā un atsauci. Ka, un pats par sevi, ir diezgan ērts, jo tagad, ja jūs esat pie darba laika un jūs esat ieguvuši seg vainu un jūsu TF ir jautājums, kur viss bija sadalīšana, Jūs varat vienkārši pateikt: "Ak, līnija 6. Es nezinu, kas notiek, bet kaut aptuveni 6 līniju rada mana programma, lai izjauktu. " Otrs veids, kā to izdarīt, ir, jūs varat izmantot šo komandu sauc saraksts gdb. Jūs varat arī saīsināt to ar l. Tātad, ja mēs hit l, ko mēs tur nonācām? Mēs iegūtu visu ķekars dīvaini stuff. Tas ir faktiskais montāža kodu kas ir strcmp_sse4_2. Tas izskatās veida bailīgs, un iemesls, kāpēc mēs esam iegūt tas ir tāpēc tieši tagad, Gdb ir mūs 0 rāmī. Tātad, jebkurā laikā mēs skatāmies mainīgajiem, jebkurā laikā mēs skatāmies pirmkodu, Mēs esam meklē pirmkodu, kas attiecas uz skursteņa rāmja mēs šobrīd collas Tātad, lai iegūtu kaut ko jēgpilnu, mums ir pārcelties uz kaudze rāmi, kas ir lielāka jēga. Šajā gadījumā galvenais kaudze rāmis būtu nedaudz lielāka jēga, jo tas bija tiešām kods, kas mums rakstīja. Ne strcmp kodu. Tas, kā jūs varat pārvietoties starp kadriem, šajā gadījumā, jo mums ir divi, mums ir 0 un 1, jums, ka ar uz augšu un uz leju komandām. Ja es pārvietotos vienu rāmi, Tagad es esmu galvenajā kaudze rāmi. Es varētu pārvietot uz leju, lai dotos atpakaļ, kur es biju, iet uz augšu atkal iet uz leju atkal, un iet atkal. Ja jūs kādreiz darīt savu programmu gdb, jūs saņemsiet crash, jūs saņemsiet Izcelsme, un jūs redzēsiet, ka tas ir kaut kādā failā, ka jūs nezināt, kas notiek. Jūs mēģināt sarakstu, kods neizskatās pazīstami ar jums, veikt apskatīt jūsu rāmjiem un izdomāt, kur jūs esat. Jūs, iespējams, nepareizi kaudze rāmi. Vai vismaz tu esi kaudze rāmi, kas nav viens, ka jūs tiešām var atkļūdot. Tagad, ka mēs esam atbilstošā kaudze rāmi, mēs esam galvenie, Tagad mēs varam izmantot saraksta komandu, lai noskaidrotu, kāda līnija bija. Un jūs varat redzēt, tas drukāts to mums šeit. Bet mēs varam hit uzskaitīt visu to pašu, un sarakstā dod mums šo jauku izdruku Faktiskās avota kodu, kas notiek šeit. Jo īpaši, mēs varam apskatīt pie 6 līniju. Mēs varam redzēt, kas notiek šeit. Un izskatās, ka mēs nesam virkni salīdzinājumu starp virkni "CS50 klintīm" un ARGV [1]. Kaut kas par šo bija crashing. Tātad Missy, jums ir kādas domas par to, kas varētu būt šeit notiek? [Missy] Es nezinu, kāpēc tas ir crashing. >> Jūs nezināt, kāpēc tas ir crashing? Jimmy, kādas domas? [Jimmy] Es neesmu pilnīgi pārliecināts, bet pēdējo reizi mēs izmantojām virkni salīdzināt, vai strcmp, mums bija, piemēram, trīs dažādas lietas, par kurām tā. Mums nebija ==, es nedomāju, tiesības šajā pirmajā rindā. Tā vietā tas tika sadalīts trīs, un viens bija == 0, viens bija <0, es domāju, un viens bija> 0. Tāpēc varbūt kaut kas tamlīdzīgs? >> Jā. Tātad tur ir šis jautājums gada mēs darām salīdzinājumu pareizi? Stella? Jebkurš domas? [Stella] Es neesmu pārliecināts. >> Nav pārliecināts. Daniel? Domas? Labi. Izrādās, kas notiek šeit ir, kad mēs skrēja programmu un mēs saņēmām seg vaina, kad skrēja programmu pirmo reizi, Daniel, tu arī tā nekādus komandrindas argumentus? [Daniels] Nē >> Nr Šajā gadījumā, kāda ir vērtība ARGV [1]? >> Nav vērtības. >> Tiesības. Nu, nav lietderīgi virknes vērtību. Bet ir dažas vērtības. Kas ir vērtība, kas izpaužas glabājas tur? >> Atkritumu vērtība? >> Tas ir vai nu atkritumu vērtība vai, šajā gadījumā, Iestādi par argv masīvs gals vienmēr ir izbeigts ar null. Tātad, ko faktiski ieguva glabājas tur ir nulle. Otrs veids, kā atrisināt šo, nevis domāt cauri, ir mēģināt izdrukāt to ārā. Tas ir, ja es teicu, ka, izmantojot GDB ir liels, jo jūs varat izdrukāt visus mainīgos, visas vērtības, ko vēlaties izmantojot šo ērts-lielisks p komandu. Tātad, ja es rakstīt p un tad es ierakstiet mainīgā vērtību vai arī mainīgā nosaukums, saka, argc, es redzu, ka argc ir 1. Ja es gribu, lai izdrukātu ARGV [0], es varētu darīt tieši tāpat. Un kā mēs redzējām, argv [0] vienmēr ir nosaukums jūsu programmas, vienmēr nosaukumu izpildāmā. Šeit jūs redzētu to ieguva pilnu ceļa nosaukumu. Es varu arī izdrukāt argv [1], un redzēt, kas notiek. Šeit mēs saņēmām šāda veida mistisku vērtību. Mēs saņēmām šo 0x0. Atceros sākumā termiņa, kad mēs runājām par heksadecimālo skaitļu? Vai ka maz jautājums beigās 0 PSET par to, kā pārstāvēt 50 hex? Veids, kā mēs rakstīt heksadecimālskaitļus CS, tikai ne sajaukt sevi ar cipariem aiz skaitļiem, ir mums vienmēr priedēklis viņus ar 0x. Tātad šī 0x priedēklis vienmēr nozīmē tikai interpretēt šo numuru kā heksadecimālo numuru, nevis kā virkne, nevis kā decimālskaitlis, nevis kā bināro numuru. Kopš skaits 5-0 ir derīgs numurs heksadecimālā. Un tas ir numurs decimālā, 50. Tātad tas ir tikai kā mēs disambiguate. Tātad 0x0 līdzekļi sešpadsmitnieku 0, kas ir arī decimālais 0, binārā 0. Tas ir tikai vērtība 0. Izrādās, ka tas ir tas Null ir, faktiski, atmiņā. Null ir tikai 0. Lūk, elements glabājas ARGV [1] ir nulle. Tāpēc mēs cenšamies salīdzināt mūsu "CS50 Rocks" virknes Null virkni. Tātad dereferencing null, mēģinot piekļūt lietas pie null, tie parasti gatavojas radīt kaut kādas segmentācijas kļūdas vai citas sliktas lietas notiek. Un izrādās, ka strcmp nav pārbaudīt, lai redzētu vai jūs esat izturējis tādā vērtībā, kas ir nulle. Drīzāk, tas tikai iet uz priekšu, cenšas darīt lieta, un ja tas SEG kļūdas, tas SEG bojājumus, un tā ir jūsu problēma. Jums ir jāiet salabot. Tiešām ātri, kā varētu mēs atrisinātu šo problēmu? Šarlote? [Šarlote] Jūs varat pārbaudīt, izmantojot, ja. Tātad, ja argv [1] ir Null, == 0, tad atgriezties 1, vai kaut [nesaprotams]. >> Jā. Tā ka ir viens lielisks veids, kā to darīt, jo mēs varam pārbaudīt, lai redzētu, vērtību mēs esam par to nokļūst strcmp, argv [1], ir tā null? Ja tas ir nulle, tad mēs varam teikt labi, pārtraukt. Biežāk veids, kā to izdarīt, ir izmantot argc vērtību. Jūs varat redzēt šeit sākumā maģistrāles, mēs izlaist šo pirmo testu, ka mēs parasti darīt, ja mēs izmantot komandrindas argumentus, kas ir pārbaudīt, vai mūsu argc vērtība ir tas, ko mēs sagaidām. Šajā gadījumā, mēs sagaidām vismaz divus argumentus, Programmas nosaukums plus viens otru. Jo mēs esam par to izmantot otro argumentu šeit. Tātad kaut kādas pārbaudes iepriekš, pirms mūsu strcmp zvana ka testi vai argv ir vismaz 2, varētu arī darīt to pašu veida lieta. Mēs varam redzēt, ja tas darbojas, darbojas programmu vēlreiz. Jūs vienmēr varat restartēt programmu ietvaros gdb, kas ir patiešām jauki. Jūs varat palaist, un, kad jūs iet uz argumentiem ar savu programmu, Jums iet tos, kad jūs zvanu palaist, nevis tad, kad jūs boot up GDB. Tādā veidā jūs varat saglabāt piesaucot savu programmu ar dažādiem argumentiem katru reizi. Tik palaist, vai atkal, es varētu Type R, un redzēsim, kas notiks, ja mēs tipa "sveiki". Tas vienmēr jautāt jums, ja jūs vēlaties, lai sāktu to no sākuma. Parasti, jūs vēlaties, lai sāktu to no sākuma. Un šajā brīdī, tas restartējas vēlreiz, tas izdrukā programma, kas mēs esam darbojas, buggy1, ar argumentu sveiki, un tas drukā šo standarta out, tas saka: "Jūs saņemsiet D", skumjš sejas. Bet mēs neesam SEG vaina. Tā teica, ka process izbrauc normāli. Lai izskatās diezgan labi. Ne vairāk SEG vaina, mēs, kas ir pagātne, tāpēc tas izskatās, ka patiešām bija seg vaina kļūda, ka mēs bija iegūt. Diemžēl, tas stāsta mums, ka mēs esam kļūst D. Mēs varam doties atpakaļ un apskatīt kodu un redzēt, kas notiek tur skaitlis, ko bija - kāpēc tas tika stāsta mums, ka mēs saņēmām D. Let 's redzēt, šeit bija tas printf sakot, ka jums ir D. Ja mēs tipa sarakstu, kā jūs turēt rakstīt sarakstu, tas saglabā atkārtojot leju caur savu programmu, tāpēc tas jums parādīs dažus pirmos rindiņas jūsu programmā. Tad tas tev parādīs tuvāko līnijas, un nākamo rieciens un nākamo gabalu. Un tas būs jāmēģina iet uz leju. Un tagad mēs sāksim "Līnijas numurs 16 ir ārpus diapazona." Jo tas ir tikai 15 līnijas. Ja jums uz šo jautājumu, un jūsu jautājums, "Ko man darīt?" Jūs varat izmantot palīdzības komandu. Palīdzi un tad arī tā nosaukumu komandu. Un jūs redzat Gdb mūs visus šāda veida stuff. Tā saka: "Bez arguments, uzskaita desmit vairāk līniju pēc vai ap iepriekšējā sarakstā. Sarakstā - uzskaita desmit līnijas pirms - " Tāpēc pieņemsim mēģināt izmantot sarakstu mīnuss. Un ka ir uzskaitīti 10 rindas iepriekšējo, jūs varat spēlēt aptuveni ar sarakstu mazliet. Jūs varat darīt saraksts, saraksts -, jūs pat varat dot minēti vairāki, piemēram, 8 sarakstā, un tas būs uzskaitīt 10 rindas ap 8 līniju. Un jūs varat redzēt, kas notiek šeit ir jums vienkārši, ja cits. Ja jūs rakstīt CS50 akmeņiem, tā izdrukā "Jūs saņemsiet A." Pretējā gadījumā tas izdrukā "Jūs saņemsiet D." Bummer pilsēta. Labi. Jā? [Daniels] Tātad, kad es mēģināju darīt CS50 ieži bez pēdiņām, tā saka "Jūs saņemsiet D." Man vajadzēja pēdiņas, lai saņemtu to uz darbu, kāpēc tā? >> Jā. Izrādās, ka tad, kad - tas ir vēl viens fun maz tidbit - palaižot programmu, ja mēs to izveidosim un mēs ierakstiet CS50 akmeņiem, tāpat kā Daniels teica, viņš darīja, un jūs hit Enter, tas joprojām saka, mēs iegūtu D. Un jautājums ir, kāpēc tas ir? Un izrādās, ka gan mūsu terminālā un Gdb apstrādāt šos kā divas atsevišķas argumentiem. Jo tad, kad tur ir telpa, kas ir netieši kā pirmais arguments beidzās, nākamajā arguments ir aptuveni, lai sāktu. Veids, kā apvienot tos divās, vai piedodiet, uz vienu argumentu, ir izmantot pēdiņas. Tāpēc tagad, ja mēs to pēdiņās un palaist to no jauna, mēs saņemam A. Tik vienkārši, lai Atgādinājums, bez pēdiņām, CS50 un ieži ir parsēt kā divas atsevišķas argumentiem. Ar pēdiņām, tas parsēt kā vienu argumentu vispār. Mēs varam redzēt šo ar lūzuma punktu. Līdz šim mēs esam darbojas mūsu programma, un tas ir bijis darbojas līdz vai nu tas SEG kļūmes vai hits kļūdu vai līdz tā ir iziet un viss ir pilnīgi naudas sodu. Tas ne vienmēr ir visvairāk noderīga lieta, jo dažreiz Jums ir kļūda Jūsu programmā, taču tas nav izraisa segmentāciju vaina. Tas nav izraisa jūsu programmu, lai apturētu vai kaut kā tā. Veids, kā iegūt GDB apturēt savu programmu kādā konkrētā brīdī ir noteikt pārtraukumpunkts. Jūs varat vai nu izdarīt, nosakot pārtraukumpunkts uz funkcijas nosaukuma vai jūs varat noteikt pārtraukumpunkts par konkrētu koda rindu. Man patīk noteikt robežvērtības attiecībā uz funkcijas vārdus, jo - viegli atcerēties, un ja jūs tiešām iet un mainīt savu pirmkodu pat mazliet, tad jūsu pārtraukumpunkts patiešām palikt vienā vietā, kas savu kodu. Tā kā, ja jūs izmantojat līniju skaitu, un līnija skaitļi mainās jo jums pievienot vai dzēst kādu kodu, tad jūsu kontrolpunkti ir visi pilnīgi ieskrūvē augšu. Viens no visbiežāk lietām man ir noteikt pārtraukumpunkts par galveno funkciju. Bieži es boot up GDB, es ņemšu B tips galvenais, hit Enter, un ka būs noteikt pārtraukumpunkts uz galvenā funkcija, kas vienkārši saka, "Apturēt programmu, tiklīdz jūs sākt darboties," un tādā veidā, kad es palaist savu programmu ar, teiksim, CS50 ieži kā divi argumenti un hit Enter, tā izpaužas uz galveno funkciju, un tas apstājas tieši pie ļoti pirmajā rindā, tieši pirms tā izvērtē strcmp funkciju. Tā kā es esmu apturēta, tagad es varētu sākt mucking apkārt un redzot to, kas notiek ar visiem dažādiem mainīgajiem, kas tiek nodotas manā programmā. Šeit es varētu izdrukāt argc un redzēt, kas notiek. Redzēt, ka argc ir 3, jo tas ieguva 3 dažādas vērtības tajā. Tas ieguva programmas nosaukumu, tas ieguva pirmo argumentu un otrais arguments. Mēs varam izdrukāt tos, ko meklē ARGV [0], argv [1], un argv [2]. Tātad tagad jūs varat arī redzēt, kāpēc šī strcmp zvans tiek gatavojas neveiksmei, jo jūs redzat, ka tā sadalīt CS50 un klintis divos atsevišķos argumentus. Šajā brīdī, kad esat hit pārtraukumpunkts, jūs varat turpināt soli pa savu programmu pozīcijai, nevis sākot savu programmu vēlreiz. Tātad, ja jūs nevēlaties, lai sāktu savu programmu vēlreiz un tikai turpināt no šīs vietas, Jūs varat izmantot turpināt komandu un turpināt darbosies programmu līdz galam. Tāpat kā tas notika šeit. Tomēr, ja es turpinātu programmas, CS50 ieži, tas hits mana koncentrācija atkal, un šoreiz, ja es nevēlos, lai tikai iet visu ceļu cauri pārējo programmas, Es varu izmantot nākamo komandu, ko es arī saīsināt ar n. Un tas būs soli pa programmas pozīcijai. Tātad jūs varat skatīties kā lietas izpildīt, kā mainīgie izmaiņas, kā lietas iegūt atjaunināts. Kas ir diezgan jauki. Otra atdzist lieta ir nevis atkārtojot vienu un to pašu komandu atkal un atkal un atkal, ja jūs vienkārši hit Enter - tāpēc šeit jūs redzat, es neesmu ievadījis jebko - ja es tikai hit Enter, tas būs atkārtot iepriekšējo komandu, vai iepriekšējo Gdb komandu, kas man tikko likts iekšā Es varētu glabāt hitting Enter un tas būs saglabāt pastiprināšanu caur manu kodu pozīcijai. Es aicinu jūs guys iet izbraukšana citas buggy programmu, kā arī. Mums nav laika, lai izietu cauri visiem no viņiem šodien sadaļā. Pirmkods ir tur, lai jūs varētu veida redzēt, kas notiek aizkadrā, ja jums patiešām iestrēdzis, bet mazākais, tikai prakse booting up GDB, programmas īstenošanu, līdz tas saplīst par jums, kļūst Izcelsme, norādītas, ko darboties crash bija, kādi līnija tas bija, izdrukāt dažas mainīgo vērtības, tikai, lai jūs iegūtu justies par to, jo tas būs tiešām palīdzēs jums iet uz priekšu. Šajā brīdī, mēs ejam, lai izietu no gdb, kuru jūs izmantojat atmest vai vienkārši q. Ja jūsu programma ir pa vidu darbojas joprojām, un tas nav izceļojis, tas vienmēr jautāt jums, "Vai esat pārliecināts, ka jūs patiešām vēlaties atmest smēķēšanu?" Jūs varat vienkārši hit jā. Tagad mēs ejam apskatīt nākamo problēmu mums ir, kas ir kaķis programma. Ja jūs skatīties īsā novirzīt un caurulēm, jūs redzēsiet, ka Tomijs izmanto šo programmu kas būtībā drukā visu izejas failu uz ekrāna. Tātad, ja man palaist kaķis, tas ir faktiski iebūvēts programmu ierīces, un ja jums ir Mac, jūs varat darīt uz jūsu Mac pārāk, ja jūs atvērt termināla. Un mēs - kaķis, teiksim, cp.c, un hit Enter. Ko tas darīja, ja mēs ritiniet uz augšu mazliet un redzēt, kur mums bija līnija, vai kur mums bija kaķis komandu, tas burtiski vienkārši izdrukāt saturu cp.c uz mūsu ekrāna. Mēs varam palaist vēlreiz un jūs varat ievietot vairākus failus kopā. Tātad jūs varat darīt kaķis cp.c, un tad mēs varam arī saķēdēt the cat.c failu, kas ir programma, mēs esam par to rakstīt, un tas būs drukāt gan failus atpakaļ atpakaļ uz mūsu ekrāna. Tātad, ja mēs ritinātu uz augšu mazliet, mēs redzam, ka tad, kad mums bija šī kaķa cp.c, cat.c, Sākumā tas izdrukā cp failu, un pēc tam zem tā, tas izdrukā cat.c failu tiesības uz leju šeit. Mēs ejam, lai izmantotu šo, lai tikai saņemtu mūsu pēdu mitrā. Spēlēt aptuveni ar vienkāršu drukāšanu uz terminālu, redzēt, kā tas darbojas. Ja jūs puiši atvērt ar gedit cat.c, hit Enter, Jūs varat redzēt programmu, ka mēs esam par to rakstīt. Mēs esam iekļāvuši šo jauku katlu dzelzs, tāpēc mums nav jātērē laiks rakstīt visu, kas ārā. Mēs arī pārbaudīt vairākus argumentus pagājis collas Mēs izdrukāt skaistu lietošanas ziņu. Tas ir tāda veida lieta, ka atkal, tāpat mēs esam runājuši par to, tas ir gandrīz kā muskuļu atmiņā. Tikai atceraties, lai saglabātu darot to pašu veida sīkumi un vienmēr izdrukāt kaut kādu noderīgu ziņu lai cilvēki zina, kā vadīt savu programmu. Ar kaķi, tas ir diezgan vienkārši, mēs esam tikai gatavojas iet cauri visiem dažādu argumentiem kas tika nodotas mūsu programmu, un mēs ejam, lai drukātu to saturs uzmanību uz ekrāna pa vienam. Lai drukātu failus, lai uz ekrāna, mēs esam gatavojas darīt kaut ko ļoti līdzīgu lai ko mēs darījām beigās viktorīnas. Beigās viktorīnu, kas nomas programmu, mums bija atvērt failu, un tad mums bija tā drukāt. Šajā gadījumā, mēs esam gatavojas atvērt failu, un mēs ejam, lai lasītu no to vietā. Tad mēs ejam, lai drukātu, nevis uz failu, mēs ejam, lai drukātu uz ekrāna. Tāpēc drukāšanu uz ekrāna jūs visi esat darījis pirms ar printf. Tā ka nav pārāk traks. Bet lasot failu ir veida dīvaini. Mēs iet caur šo mazliet laikā. Ja jūs guys iet atpakaļ uz šo pēdējo problēmu par savu viktorīnas, problēmu 33, Pirmā līnija ka mēs gatavojamies darīt šeit, atverot failu, ir ļoti līdzīgs tam, ko mēs darījām tur. Tātad Stella, ko dara, ka līnija izskatās, kad mēs atvērt failu? [Stella] Kapitāla FILE *, fails - >> Labi. >> - Ir vienāds ar fopen. >> Yup. Kas šajā gadījumā ir? Tas ir komentārā. >> Tas ir par komentārā? argv [i] un r? >> Tieši tā. Tiesības. Tātad Stella ir pilnīgi pareizi. Tas ir tas, ko līnija izskatās. Mēs ejam, lai iegūtu failu plūsma mainīgs, to uzglabā failu *, lai visi cepures, FILE, *, un šī mainīgā nosaukums būs fails. Mēs varētu to saucam kāds mums patīk. Mēs varētu saukt first_file, vai file_i, kāds mēs gribētu. Un tad no faila nosaukums tika pieņemts uz komandrindas uz šo programmu. Tātad tas glabājas argv [i,] un tad mēs spēsim atvērt šo failu lasīt režīmā. Tagad, ka mēs esam atvērti failu, kas ir lieta, kas mums vienmēr ir jāatceras, lai darīt kad mēs esam atvērti failu? Aizveriet to. Tātad Missy, kā mēs aizvērtu failu? [Missy] fclose (fails) >> fclose (fails). Tieši tā. Lieliski. Labi. Ja mēs skatāmies uz to darīt komentāru tieši šeit, tā saka, "Atvērtā argv [i] un izdrukāt tās saturu uz stdout." Standarts, kas ir dīvaini vārdu. Stdout ir tikai mūsu veids, kā pateikt Mēs vēlamies, lai izdrukāt to uz terminālu, mēs vēlamies, lai izdrukāt to uz standarta izvades plūsmām. Mēs faktiski var atbrīvoties no šī komentāra šeit. Es esmu gatavojas kopēt un ielīmēt to, jo tas ir tas, ko mēs darījām. Šajā brīdī, tagad mums ir lasīt failu pamazām. Mēs esam apspriests pāris veidus lasīšanas failus. Kādi ir jūsu favorīti līdz šim? Kādā veidā jūs esat redzējuši vai jūs atceraties, lai lasītu failus? [Daniels] fread? >> Fread? Tātad fread ir viens. Jimmy, jūs zināt kādi citi? [Jimmy] Nē >> Labi. Nope. Šarlote? Aleksandrs? Jebkuri citi? Labi. Tātad citi tiem ir fgetc, ir viens, ka mēs izmantot daudz. Pastāv arī fscanf; jūs puiši redzat modelis šeit? Viņi visi sākas ar f. Kaut ko darīt ar failu. Tur fread, fgetc, fscanf. Tie visi ir no lasīšanas funkciju. Rakstīšanai mums ir fwrite, mums ir fputc nevis fgetc. Mēs arī esam fprintf kā mēs redzējām uz viktorīnas. Tā kā šis ir problēma, kas ietver lasīšanas no faila, mēs spēsim izmantot vienu no šīm trim funkcijām. Mēs nebrauksim, lai izmantotu šīs funkcijas uz leju šeit. Šīs funkcijas ir viss atrodams standarta I / O bibliotēka. Tātad, ja paskatās uz augšu šajā programmā, Jūs varat redzēt, ka mēs jau esam iekļauti galvenes failu standarta I / O bibliotēka. Ja mēs gribam, lai noskaidrotu, kura no tām mēs vēlamies izmantot, mēs vienmēr varam atvērtu cilvēks lapas. Tātad, mēs varam rakstīt vīrieti stdio un izlasīt visu par stdio ieejas un izejas funkcijās C. Un mēs jau varam redzēt ak, izskatās. Tas ir pieminēt fgetc, tas pieminēt fputc. Tātad jūs varat urbt uz leju mazliet, un apskatīt, teiksim, fgetc un apskatīt tās man lapu. Jūs varat redzēt, ka tas iet kopā ar visu ķekars citas funkcijas: fgetc, fgets, getc, getchar, kļūst, ungetc, un tā devums rakstzīmju un stīgas. Tātad tas ir, kā mēs lasām burtiem un stīgas no failus no standarta ievades, kas būtībā ir no lietotāja. Un tas ir tas, kā mēs to darām to faktisko C. Tātad tas nav, izmantojot GetString un getchar funkcijas ka mēs izmantojām no CS50 bibliotēkas. Mēs darīsim šo problēmu pāris veidos lai jūs varētu redzēt divus dažādus veidus, kā darīt to. Gan fread funkcija, kas Daniels minēts un fgetc ir labs veids, kā to darīt. Es domāju fgetc ir mazliet vieglāk, jo tas ir tikai, kā jūs redzat, viens arguments, FILE * ka mēs cenšamies, lai izlasītu raksturu no, un tā atgriešanās vērtība ir int. Un tas ir nedaudz mulsinoši, labi? Jo mēs esam iegūt raksturs, tad kāpēc nav šī atgriešanās char? Jums puiši ir kādas idejas par to, kāpēc tas varētu atgriezties char? [Missy atbildes, nesaprotami] >> jā. Tātad Missy ir pilnīgi pareizi. Ja tas ir ASCII, tad šis skaitlis varētu samērot ar faktisko char. Varētu būt ASCII raksturs, un tas ir labi. Tas ir tieši tas, kas notiek. Mēs esam izmantojot int vienkārši tāpēc, ka tas ir vairāk bitu. Tas ir lielāks nekā CHAR, mūsu palija ir tikai 8 biti, ka 1 baits uz mūsu 32-bitu mašīnas. Un int ir visi 4 baiti vērtu telpu. Un izrādās, ka ceļš fgetc darbi, ja mēs ritiniet uz leju mūsu konspekta šajā cilvēks lapā mazliet, ritiniet visu ceļu uz leju. Izrādās, ka viņi izmanto šo īpašo vērtību sauc EOF. Tas ir īpašs nemainīgs kā atgriešanās vērtību fgetc funkcijas kad jūs hit beigām failu vai, ja jūs saņemsiet kļūdas. Un izrādās, ka to darīt šos salīdzinājumus ar EOF pareizi, Jūs vēlaties būt, ka papildu informācijas apjomu, kas jums ir int nevis izmantojot char mainīgo. Pat ja fgetc faktiski kļūst rakstzīmi no faila, Jūs vēlaties, lai atcerēties, ka tas ir atgriezies kaut kas ir int tipa jums. Ka teica, tas ir diezgan viegli izmantot. Tas notiek, lai dotu mums raksturs, tāpēc viss, kas mums ir jādara, ir saglabāt jautā failu, "Dodiet man nākamo rakstzīmi, dod man nākamo rakstzīmi, dod man nākamo rakstzīmi" kamēr mēs nokļūt līdz beigām failu. Un kas būs pull vienā rakstura laikā no mūsu failu, un tad mēs varam darīt, ko vien mums patīk ar to. Mēs varam uzglabāt to, mēs varam pievienot virkni, mēs varam izdrukāt. Vai kāds no tā. Attālināt atpakaļ, un dodas atpakaļ uz mūsu cat.c programmu, ja mēs spēsim izmantot fgetc, kā varētu mēs tuvojamies šo nākamo rindiņu kodu? Mēs ejam, lai izmantotu - fread darīs kaut nedaudz atšķirīga. Un šoreiz, mēs esam tikai gatavojas izmantot fgetc lai iegūtu vienu rakstzīmi laikā. Apstrādāt visu failu, kas varētu mums ir jādara? Cik rakstzīmes ir tur failā? Ir daudz. Tātad jūs, iespējams, vēlaties, lai iegūtu vienu un pēc tam saņemt vēl un saņemt otru un iegūt citu. Kāda veida algoritma jūs domājat mēs varētu būt, lai izmantotu šeit? Kāda veida -? [Aleksandrs] cilpa? >> Tieši tā. Kaut kāda veida cilpas. Cilpa faktiski liels, šajā gadījumā. Un kā jums bija sakot, tas izklausās kā jūs vēlaties cilpu pār visiem lietas materiāliem, iegūt rakstzīmi laikā. Kādi ieteikumi par to, ko tas varētu izskatīties? [Aleksandrs, nesaprotami] >> Labi, tikai man angliski, ko jūs mēģināt darīt? [Aleksandrs, nesaprotami] Tātad šajā gadījumā, tas izklausās kā mēs esam tikai cenšas cilpa pār visiem lietas materiāliem. [Aleksandrs] Tāpēc es > Izmērs -? I guess faila izmēru, vai ne? Izmērs - we'll tikai rakstīt to, kā šis. Lietas lielums pagaidām, i + +. Tātad izrādās, ka veids, kā jūs darīt to, izmantojot fgetc, un tas ir jauns, ir tas, ka tur nav viegls veids, lai tikai iegūtu izmēra failu ar šo "sizeof" tipa būvēt, ka jūs esat redzējis. Kad mēs izmantot šo fgetc funkciju, mēs ieviest kādu Jaunais, bailīgs sintakse šis cilpa, kurā vietā, izmantojot tikai pamata counter iet raksturu pēc rakstura, mēs ejam, lai vilktu vienu rakstzīmi laikā, viena rakstzīme laikā, un kā mēs zinām, mēs esam pie beigām ir nevis tad, kad mēs esam skaitot noteiktu rakstzīmju skaitu, bet, kad raksturs mēs izraut ka īpaša beigas faila raksturs. Tātad, mēs varam izdarīt, - es aicinu šo ch, un mēs ejam, lai sāktu to ar mūsu pirmo zvanu, lai iegūtu pirmo rakstzīmi no faila. Tātad šajā daļā tepat, tas ir gatavojas saņemt raksturs no faila un uzglabāt to uz mainīgo ch. Mēs ejam, lai saglabātu darot šo, kamēr mēs nokļūt līdz beigām failu, ko mēs darām, ko testēt raksturs nav, ir vienāda ar šo īpašo EOF raksturu. Un tad nevis darīt ch + +, kas vienkārši pieauguma vērtību, tāpēc, ja mēs izlasītu A ārā no faila, kapitāla, teiksim, CH + + dotu mums b, un tad mēs gribētu saņemt C un pēc tam d. Tas ir acīmredzami nav tas, ko mēs vēlamies. Ko mēs gribam šeit Šajā pēdējā mazliet ir mēs vēlamies, lai saņemtu nākamo rakstzīmi no lietas materiāliem. Tātad, kā mēs varbūt saņemtu nākamo rakstzīmi no lietas materiāliem? Kā mēs varam iegūt pirmo rakstzīmi no lietas materiāliem? [Studentu] fgetfile? >> Fgetc, vai, piedodiet, jums bija pilnīgi taisnība. Es nepareizi turpat. Tātad yeah. Šeit nevis darīt ch + +, mēs esam tikai gatavojas aicināt fgetc (fails) vēlreiz un uzglabāt rezultātu mūsu pašu ch mainīgo. [Studentu jautājums, nesaprotami] >> Tas ir, ja šie failu * puiši ir īpašs. Veids, kā viņi strādā, ir tie - kad pirmo reizi atvērt - kad jūs pirmo reizi darīt, ka fopen zvanu, fails * faktiski kalpo kā rādītājs uz sākuma failu. Un tad katru reizi, kad jūs zvanu fgetc, tas kustas vienu rakstzīmi pa failu. Tātad, ja jūs aicinu šo, jūs palielināšanai faila rādītāju par vienu rakstzīmi. Un, kad tu fgetc atkal, jūs pārvietojas tai citu raksturu un cits raksturs un cits raksturs un cits raksturs. [Studentu jautājums, nesaprotami] >> Un That - jā. Tas ir sava veida šajā maģijas ar kapuci. Jums tikai glabāt palielināšanai caur. Šajā brīdī, jūs varat faktiski strādā ar raksturu. Tātad, kā varētu mēs drukāt šo, uz ekrāna, tagad? Mēs varam izmantot to pašu printf lieta, ka mēs izmantojām agrāk. Ka mēs esam izmantojot visu semestri. Mēs varam zvanīt printf, un mēs varam iet uz raksturs tieši tāpat. Vēl viens veids, kā to izdarīt, ir nevis izmantojot printf un kam to darīt formāta virknes, mēs varam arī izmantot kādu no citām funkcijām. Mēs varam izmantot fputc, kas drukā rakstzīmi uz ekrāna, izņemot, ja mēs skatāmies uz fputc - ļaujiet man attālināt mazliet. Mēs redzētu, kas ir jauki, ir tas aizņem raksturā ka mēs lasām, izmantojot fgetc, bet tad mums ir arī tā plūsma, lai izdrukātu. Mēs varam izmantot arī putchar funkcija, kas būs likts tieši uz standarta out. Tātad tur ir viss ķekars dažādas iespējas, ka mēs varam izmantot drukāšanai. Viņi visi standarta I / O bibliotēka. Ikreiz, kad vēlaties drukāt - tā printf, pēc noklusējuma, būs drukāt uz īpašu standartu out plūsmā, kas ir, ka stdout. Tātad mēs varam tikai atsaukties uz to kā sava veida šo burvju vērtību, stdout šeit. Hmm. Ielieciet semikolu ārpus. Tas ir daudz jaunu, funky informācijas šeit. Šīs partijas ir ļoti vārdkopas, kas nozīmē, ka tas ir kods kas ir rakstīts tādā veidā tikai tāpēc, ka tas ir tīrs, lai lasītu, viegli lasīt. Ir daudz dažādi veidi, kā to darīt, daudz dažādas funkcijas, jūs varat izmantot, bet mums ir tendence vienkārši izpildiet šos pašus modeļus vairāk un vairāk. Tāpēc nav pārsteigts, ja jūs redzēt kodu, piemēram, tas nāk atkal un atkal. Labi. Šajā brīdī, mums ir nepieciešams, lai izjauktu par dienu. Paldies par nāk. Paldies par skatīties, ja esat tiešsaistē. Un mēs redzēt jūs nākamajā nedēļā. [CS50.TV]