[Powered by Google Translate] [Bölmə 5 - Daha Rahat] [Rob Bowden - Harvard Universiteti] [Bu CS50 edir. - CS50.TV] Mən e bildirib kimi istifadə edə bilərsiniz çox şey var əslində problem dəstləri etmək ləvazımatlı başqa. Sonra daha asan sizə kömək edə bilər yalnız siz cihaz bunu tövsiyə və biz hər şey iş gedir necə. Ancaq deyirlər ki, əgər şeylər edə bilərsiniz bir misal kimi, imkanı yoxdur bir avadanlığına və ya Elm Mərkəzinin zirzəmisində işləmək istəyirəm - hansı faktiki olaraq onlar çox cihaz var - istədiyiniz yerdə işləmək istəyirsinizsə. Məsələn, siz görüldü / SSH ilə eşitdim olunur? SSH yalnız bir şey qoşulmaq kimi əsasən. Əslində, indi mən cihaz daxil SSHed alıram. Mən cihaz birbaşa işləmək, heç vaxt. Burada cihaz və burada aşağı baxmaq Əgər bu IP ünvanı bax. Mən cihaz özü işə heç; Mən həmişə bir iTerm2 pəncərə / terminal pəncərə üzərində gəlir. Siz IP ünvanı, ssh jharvard@192.168.129.128 üçün SSH bilərsiniz. Belə bir gözəl model, çünki mən çox asanlıqla ki sayı xatırlayıram. Lakin şifrəmi mənə soruşacaq və indi cihaz oldum. Əsasən, bu nöqtədə əgər siz cihaz özü daxilində terminal açıldı Bu interfeys, lakin siz onu istifadə ki, məhz eyni interfeys kimi mən burada istifadə edirəm amma indi SSHed edirik. Siz cihaz üçün SSH yoxdur. Siz ola bilər SSH başqa bir yerdə bir nümunə Sizə ismarıcları var olduqca əminəm edir - Oh. Böyük. Siz bütün FAS server default FAS hesabları ilə olmalıdır. Mən SSH rbowden@nice.fas.harvard.edu bilər. Bu ilk dəfədir ki, xahiş olacaq, və bəli deyirəm. Mənim parol yalnız mənim FAS parol olacaq. Və indi, mən gözəl server SSHed edirəm və mən burada istədiyiniz bir şey edə bilərsiniz. Siz 124 kimi bilər dərsləri bir çox, siz burada məhsulları yüklemek üçün gedir həqiqətən, sizin problem dəsti təqdim. Amma sizin cihaz çıxışı yoxdur deyirlər. Sonra, hər şeyi edə bilərsiniz burada kimi demək olacaq - Bu suallara bizim bölüm. Bu cihaz bunu xahiş edəcək. Əvəzində mən yalnız server onu edəcəyik. Hesab edirəm ki, açın gedirəm. Bu problem gedit kimi bir şey istifadə etmək üçün istifadə etdiyiniz olacaq Aracın və ya hər hansı daxili. Siz FAS server ki üçün fikrində deyilik. Bu, bütün bu mətn interfeys olacaq. Belə ki, onlar var ki, bir mətn redaktoru öyrənmək və ya bir cəhd edə bilər. Onlar Nano var. Nano adətən istifadə etmək olduqca asandır. Siz okları istifadə və normal edəbilərsiniz. Belə ki, çətin deyil. Həqiqətən fantezi almaq istəyirsinizsə, Emacs istifadə edə bilərsiniz Mən hətta Emacs yaxın necə bilmirəm, çünki hansı yəqin açılmışdır deyil. Nəzarət X, Control C? Bəli. Yoxsa mən istifadə nə olan Vim istifadə edə bilərsiniz. Və bu seçim var. Siz bunu istəmirsinizsə, siz də, sizə baxsaq manual.cs50.net - Oh. Bir PC, siz SSH, mastika istifadə edə bilərsiniz ayrıca download malik olacaq olan. Mac, siz yalnız default istifadə Terminalı və ya, iTerm2 download edə bilərsiniz bir gözəl, xülya Terminal kimi. Siz manual.cs50.net getmək Əgər Notepad bir keçid görəcəksiniz + +, hansı bir PC istifadə edə bilərsiniz edir. Bu Notepad sizə SFTP imkan verir + +, hansı əsasən SSH edir. Bu nə edək, yerli faylları redaktə edir və sonra onları xilas etmək istədiyiniz zaman, o, nice.fas saxlamaq edəcək Əgər onlara çalıştırabilirsiniz yerləşir. Və Mac ekvivalent TextWrangler olacaq. Belə ki, eyni şey imkan verir. Bu, siz yerli faylları redaktə və nice.fas saxlamaq imkan verir Əgər onlara çalıştırabilirsiniz yerləşir. Heç bir cihaz olmadan vurulmuş olduğunuz Belə ki, bu variantları Sizin problem dəstləri etmək hələ də. Bir problem siz CS50 kitabxana üçün fikrində deyilik ki, olacaq nice.fas default ki, yoxdur, çünki. Siz ya CS50 kitabxana download - Mən bu nöqtədə lazımdır düşünmürəm. Ya da CS50 kitabxana download və nice.fas üçün artıq köçürə bilərsiniz və ya bu nöqtədə biz hər halda artıq istifadə etməyin edirəm. Biz əgər Və ya, müddət ilə əvəz olunur bilər bu halda CS50 kitabxana funksiyalarının həyata. Belə ki, bir məhdudlaşdırılması çox olmamalıdır. Və ki, var. İndi cihaz geri lazımdır, biz cihaz hər şeyi edəcəyik. Mən e bildirib kimi, başında suallar bizim bölməsində Axtarıram, biz siz baxmaq idi qısa bir danışmaq lazımdır. Biz yönlendirme ve Borular və bu üç sual var. Olan sel kimi funksiyaları printf ismarıcları yazmaq edirsiniz? Axın edir. Bir axın nədir? Yalnız bir var kimi bir axın əsasən - Hətta 1s və 0s mənbəyi deyil. Burada tələb edir axın standart deyil. Və standart həyata ki, bir axın edir, siz onu yazmaq zaman bu ekranda görünür. Standard həyata, axın, bu yalnız, 1s və bu 0s yazmaq deməkdir və standart həyata digər sonuna yalnız sel olan deyilir. Bu yalnız 1s və 0s bir simli var. Siz axını yaza bilərsiniz və ya siz axınları olan oxuya bilərsiniz axın əslində nə asılı olaraq. Digər iki default axınları və standart səhv standart var. Siz GetString nə zaman Standard, bu sizin üçün giriş məhsulları gözləyir edir. Belə ki, nə gözləyir, bu, faktiki olaraq, standart gözləyir oldu siz klaviatura ilə yazın zaman almaq nə həqiqətən. Siz daxil standart daxil yazaraq edirik Standard səhv, standart həyata üçün əsasən ekvivalent siz standart səhv çap lakin o ki, ixtisaslaşdırılmış var yalnız bu səhv messages çap ehtimal edirik belə ki, ekran çap müntəzəm mesajlar arasında fərq ola bilər onlar standart həyata və ya standart səhv getdi asılı olaraq səhv messages qarşı. Çox faylları. Standard həyata, standart və standart səhv, yalnız xüsusi axınları var lakin həqiqətən hər hansı bir fayl, bir fayl açmaq o, bayt bir sel olur burada yalnız stream dən oxuya bilərsiniz. Siz çox hissəsi üçün, yalnız bytes bir sel kimi bir fayl hesab edə bilər. Belə ki, nə axınları onlar ismarıcları yazmaq edirsiniz? Standard həyata. > Və >> arasındakı fərq nədir? Hər kəs əvvəlcədən video izləmək mi? Okay. > Faylları daxil yönlendirme necə olacaq və >> həmçinin faylları çıxış yönlendirme gedir lakin bu əvəzinə fayl əlavə olacaq. Məsələn, edək, mən burada dict üçün nə demək və dict daxilində yalnız stuff pişik, pişik, it, balıq, it. Siz command line malik bir komanda, pişik deyil olan yalnız bir fayl nə çap edir. Mən pişik dict deyəndə, bu, pişik, pişik, it, balıq, it çap olacaq. Yəni bütün pişik yox edir. Bu pişik, pişik, it, balıq, it out standart çap deməkdir. Mən əvəzinə fayl ki yönlendirme istəyirsinizsə, mən istifadə> və fayl nə üçün yönlendirebilirsiniz. Mən fayl fayl zəng edəcəyik. Mən ls Belə ki, indi mən fayl adlı yeni fayl görəcəksiniz. Mən bunu açmaq əgər, bu cat skript xətti qoymaq dəqiq nə olacaq. Mən ki, əgər İndi, o, fayla çıxış yönlendirme olacaq Mən eyni dəqiq şey üçün gedirəm. Belə ki, texniki, tamamilə biz nə overrode. Mən dict dəyişdirmək əgər biz görəcəksiniz, mən it çıxardı. İndi yenidən fayla biz pişik dict, biz it çıxarılır yeni versiyası olacaq. Belə ki, tamamilə yalnış düçar edər. Biz >> istifadə əgər Əksinə, bu fayl əlavə olacaq. İndi, faylı açılması, biz iki dəfə çap yalnız eyni şey görmək bu dəfə orada idi, sonra orijinal əlavə. Belə ki, nə> və >> edin. Növbəti bir sual yoxdur - Bu barədə soruşmaq deyil. Biz ki, başqa bir standart həyata yönləndirən <əgər> edir 2 do> standart səhv yönlendirme edir. Bir standart səhv getdi Beləliklə, bu txt2 daxil almaq deyil. Amma 2> əgər hiss, o, hələ Rob Salam, çap edir! skript xətti Mən yalnız standart səhv yönlendirme edirəm, çünki mən standart həyata yönlendirme deyiləm. Standard səhv və standart həyata fərqlidir. Həqiqətən standart səhv yazmaq istəyirdim, əgər sonra stderr üçün fprintf üçün bu dəyişə bilər. Belə printf, ismarıcları, standart həyata üçün görüntüler. Mən əl standart səhv çap etmək istəyirsinizsə, onda mən fprintf istifadə etmək və mən çap etmək istəyirəm nə daxil. Əvəzinə mən fprintf stdout etdi, onda ki, printf üçün əsasən ekvivalent deyil. Amma fprintf standart səhv. Beləliklə, mən txt2 bu yönlendirme, əgər Salam, Rob! hələ command line çap edir standart səhv çap əldə edir və mən yalnız standart həyata yönlendirme alıram-ci ildən. İndi standart səhv yönlendirme, indi çap almaq vermədi və txt2 Salam, Rob olacaq! Belə ki, indi siz standart səhv üçün faktiki səhvləri çap edə bilərsiniz və standart həyata üçün müntəzəm messages çap. Və sizin proqram run belə olduqda, siz 2-salam bu növü kimi çalıştırın. / Bilər> proqram, normal çalışmağa davam edir, belə ki, lakin siz almaq hər hansı bir səhv mesajları, sizin səhv daxil sonra kontrol edə bilərsiniz səhvlər, belə ki, və sonra baxmaq və səhvlər fayl baş verən hər hansı bir səhv olacaq. Suallar? Sonuncu bir skript standart həyata alaraq kimi hesab edə bilər ki, boru deyil və gələn komanda standart edir. Məsələn burada echo bir command line şey deyil yalnız mən onun arqument kimi qoymaq nə səda gedir. Mən quotes qoymaq deyil. Echo blah, blah, blah blah yalnız, blah, blah çap edir. Əvvəl, dedim mən bir txt fayl Rob qoymaq idi Mən yalnız txt faylları yönlendirme əvəzinə bilər, çünki I / Rob echo əgər və sonra boru onu. / hello, həmçinin şey eyni tipli edəcəyik. Bu komanda çıxdı, echo Rob edir və giriş kimi istifadə. / salam. Siz ilk bir fayla echo Rob yönlendirme düşünün bilər və sonra. / salam ki, fayla daxil yalnız outputted edilib. Lakin şəkil müvəqqəti fayl edir. Ki Suallar? Növbəti sual bu cəlb edir. Nə boru siz names.txt adlı bir fayl unikal adları sayı tapmaq üçün istifadə edə bilər? Burada istifadə etmək istədiyiniz olacaq əmrləri unikal belə uniq, sonra wc var. Siz, həqiqətən ki, nə baxmaq insan uniq edə bilərsiniz və yalnız daxil olan qonşu uyğun xətləri filter olacaq. Və insan wc olan newline, söz, və hər bir fayl üçün byte sayar çap edir. Və biz istifadə etmək istədiyiniz olacaq son bir, sort edir olan yalnız txt fayl xətləri sort edir. Mən bəzi txt fayl, names.txt etmək və Rob, Tommy, Yusif, Tommy, Yusif, RJ, Rob, varsa nə mən burada etmək istəyirəm bu fayl unikal adları sayı tapmaq edir. Belə ki, cavab nə olmalıdır? >> [Tələbə] 4. >> Bəli. Bu Rob, Tommy Cozef ildən 4 olmalıdır, RJ bu fayl yalnız unikal adları var. Ilk addım, yalnız names.txt barədə söz count əgər, Bu, həqiqətən, mənə hər şeyi izah edir. Bu, həqiqətən, çap edir - newlines, sözlər, və byte sayı - kişi wc, bax edək. Mən yalnız xətləri qayğı, onda mən yalnız wc-l names.txt edə bilərsiniz. Belə ki, 1 adım var. Names.txt yalnız bütün adları var, çünki Amma, wc-l names.txt istəmirəm və hər hansı bir qeyri-unikal olanları filter istəyirəm. Mən uniq names.txt əgər Belə ki, çox istəyirəm nə mənə vermir də təqlid adları hələ, çünki. Niyə ki? Niyə uniq istəyirəm nə deyil? [Tələbə] Bu cüt deyil [işitilemez] >> Bəli. Uniq üçün adam səhifə saxla filter bitişik uyğunluğu xətləri deyir. Onlar qonşu deyilik, buna görə onlara filter deyil. Mən onlara ilk çeşidləmək varsa, sort names.txt birlikdə bütün cüt xətləri qoymaq niyyətindədir. İndi sırala names.txt edir. Uniq | I olan uniq üçün giriş kimi istifadə etmək istədiyiniz gedirəm. Mənə Joseph, RJ, Rob, Tommy verir və mən, wc-l üçün giriş kimi istifadə etmək istədiyiniz mənə 4 verməyə hazırlaşır. Burada deyir kimi, nə kəməri istifadə edə bilər? Siz əmrləri bir sıra istifadə kimi çox şey edə bilər Siz növbəti komanda üçün giriş kimi bir skript çıxış istifadə edir. Siz çox şey, ağıllı çox şey edə bilərsiniz. Suallar? Okay. Borular və yönlendirme üçün var. İndi biz faktiki stuff ki, kodlaşdırma məhsulları getmək. Bu PDF Inside, siz bu komanda görəcəksiniz və sizin cihaz Bu funksiyanı çalıştırın lazımdır. wget, əsasən, yalnız İnternet bir şey almaq üçün əmr edir belə wget və bu URL. Brauzerinizin bu URL getdi, o fayl yükləyə bilər. Mən yalnız tıklayan, belə ki, bu, mənim üçün fayl yükləmək. Amma terminal daxilində olan şey wget yazı yalnız terminal onu download gedir. , Mən section5.zip var və siz section5.zip açın lazımdır ki, siz section5 adlı qovluq vermək niyyətindədir biz bunu daxilində bu gün istifadə olacaq bütün faylları üçün gedən edir. Bu proqramların fayl adları gəlir ki, onlar bir az arabası istəyirik, sizin missiya gdb istifadə niyə anlamaq üçün. Onlara hər kəs yükləyə / onlara nazil almaq üçün necə var onların cihaz daxil? Okay. ./buggy1 Running, o, Segmentasyon günah (əsas tullanır) deyəcəklər hansı bir segfault istənilən vaxt, o, pis bir şey deyil. Nə halda bir segfault alıram? [Tələbə] bir null göstərici Dereferencing. >> Bəli. Belə ki, bir nümunəsidir. Bir segfault almaq olacaq bir null göstərici Dereferencing. Yaddaş toxunan ne vasitəsi segfault sizə aid edilə bilməz. Belə bir null göstərici dereferencing, ünvan 0 aid edilir və əsasən, bütün kompüter gün ünvan 0 sizə aid edilməməlidir yaddaş olduğunu deyirlər. Bir segfault bir null göstərici nəticələri dereferencing niyə Belə ki var. Bir göstərici başlamaq deyil nə zaman, o, bir zibil dəyəri və siz dereference cəhd zaman, bütün ehtimalı siz yaddaş toxunan edirik ki, heç bir yerdə ortasında var. Siz xoşbəxt və zibil dəyər almaq üçün baş Əgər yığını və ya bir şey yerdə qeyd etmək oldu, sonra zaman göstərici başlatılmış deyil ki, siz dereference, heç bir şey yanlış gedəcək. Bu işarə əgər Lakin, haradasa yığın və yığın arasında, demək və ya yalnız bir yerdə, hələ proqram istifadə edilməyib ki işarə edir sonra sizə aid edilməməlidir yaddaş toxunan edirik və segfault. Bir recursive funksiyası yazmaq və çox çox dəfə recurses zaman və yığını şeyi dilinə çox böyük və yığını collides artır siz toxunan edilməməlidir ilə colliding lazım deyil ki, yaddaş toxunan edirik, belə segfault. Bu nə segfault edir. Bu da eyni səbəbdən ki, sizin kimi bir string varsa - nin əvvəlki proqram geri imkan verir. Ildə hello.c-Ben yalnız başqa bir şey etmək niyyətindədir. char * s = "Salam dünya!"; Mən istifadə edin * s = bir şey və ya s [0] = 'X'; belə salam olun. / hello, niyə ki segfault idi? Niyə bu segfault idi? Siz nə gözləmək olar? Mən printf əgər ("% s \ n", s); nə çap gözləmək olardı? [Tələbə] X salam. >> Bəli. Problem, bu kimi bir string zaman bəyan ki, s, yığını getmək olacaq bir göstəricisidir və nə s işarə edir read-only memory olan bu simli edir. Yalnız adı, read-only memory ilə Belə ki, siz bir fikir almaq lazımdır ki, read-yalnız yaddaş nə dəyişdirmək üçün çalışırıq, əgər Əgər yaddaş ilə məşğul olmamalıdır bir şey yapýyorsun və segfault. Bu, həqiqətən, char * s və s char [] arasında böyük fərq var. Belə ki, char s [], bu simli yığını qoymaq olacaq, və yığını bu mükəmməl gözəl işləməlidir o deməkdir ki, oxumaq yalnız deyil. Və bunu edir. Xatırla ki, char nə zaman * s = "Salam dünya!" S özü yığını deyil ancaq başqa bir yerdə xal və başqa bir yerdə oxumaq yalnız olur. Amma char s [] yalnız yığını bir şey deyil. Belə ki, bir segfault baş başqa bir misal var. Biz ./buggy1 bir segfault səbəb olduğunu gördüm. Nəzəriyyəsi, siz dərhal buggy1.c baxmaq lazımdır. Əksinə, biz gdb vasitəsilə baxmaq lazımdır. Siz Segmentasyon günah (əsas tullanır) zaman edək ki, Burada deyilən əsas üzərində bu fayl almaq. Biz ls-l, biz ki, əsas adətən olduqca böyük bir fayl görəcəksiniz. Bu fayl bytes sayı, belə ki, 250-bir şey kilobayttan var kimi görünür. Bunun səbəbi core dump həqiqətən nə olduğunu zaman proqram qəzaları, proqram yaddaş dövlət yalnız sitemizi və bu fayla yapışdırılır olur. Bu faylı taþý olur. Bu proqram, bu, çalışan isə, 250 ətrafında kilobayttan bir yaddaş istifadə üçün baş və belə ki, bu fayla taþý olmuşlar budur. Biz gdb buggy1 əsas əgər İndi ki, fayl baxmaq olar. Biz yalnız gdb buggy1 edə bilər və yalnız müntəzəm gdb qədər başlayacaq , giriş fayl kimi buggy1 istifadə edərək. Siz gdb buggy1 əsas əgər Lakin, o, xüsusi gdb başlamaq olacaq ki, əsas fayl baxaraq. Və buggy1 vasitəsilə gdb söyləyən əsas fayl buggy1 proqram gəlir ki, bilir. Belə ki, gdb buggy1 əsas dərhal bizə edir proqramı ləğv oldu harada. Biz proqramı siqnal 11, Segmentasyon günah ilə xitam burada baxın. Biz yəqin ki, çox faydalı olmayan montaj xətti görmək üçün baş verir. Siz bt ya backtrace yazın Amma əgər ki, funksiya olacaq ki, bizim cari yığını çərçivəsində siyahısını verir. Belə backtrace. Biz yalnız iki yığını çərçivəsində var kimi görünür. Ilk, bizim əsas yığını çərçivəsində deyil və ikinci, biz olmaq nə ki, bu funksiya üçün yığını çərçivəsində deyil biz yalnız akt kodu kimi hansı görünür. Belə ki, bizim əsas funksiyası geri gedək, və biz çərçivəsində 1 edə bilərsiniz bunu edirəm və biz də aşağı edə bilərsiniz düşünmək, və ya - amma demək olar ki, aşağı heç vaxt. Bəli. Yuxarı və aşağı. Up siz bir yığın çərçivəsində aşağı gətirir aşağı bir yığın çərçivəsində gündəmə gətirir. Hesab edirəm ki, istifadə heç edirlər. Mən xüsusilə 1 etiketli çərçivəsində getmək olan çərçivəsində 1, deyirlər. Çərçivə 1, əsas yığını çərçivəsində bizi gətirmək niyyətindədir və burada biz olmaq nə kodu xətti deyir. Biz kodu bir neçə daha çox xətləri istəyirdi, biz siyahı demək olar və bizə ətrafında bütün kodu xətləri vermək olacaq. Biz segfaulted xətti 6 idi: if (strcmp ("CS50 süxurları", argv [1]) == 0). Hələ aydın deyil, siz yalnız segfaulted nə düşünür burada birbaşa əldə edə bilərsiniz. Amma biz bir addım daha onu və deyirlər ki, "Niyə argv [1] segfault bilər?" Bilərsiniz Edək çap argv [1], və bu null göstərici olan bu 0x0, kimi görünür. Biz segfault olacaq ki, CS50 qayalar və null strcmping və edirik. Və buna görə argv [1] null? [Tələbə] Biz heç bir komanda-line dəlilləri vermədi, çünki. Bəli. Biz heç bir komanda-line dəlilləri vermədi. Belə ./buggy1 yalnız argv [0] ./buggy1 olmaq üçün gedir. Bu argv [1] üçün gedən deyil, segfault olacaq ki. Əvəzinə, yalnız CS50 etmək, əgər Lakin, Siz D almaq demək olacaq ki, bunu ehtimal nə çünki. Buggy1.c baxanda çap etməli oldu "Siz D almaq" - Argv [1] "CS50 süxurları", başqa, "Siz D almaq" Əgər "Siz A qurtar!" Biz A istəyirəm əgər, biz doğru müqayisə üçün bu lazımdır bu 0 müqayisə deməkdir. Belə argv [1] "CS50 süxurlar" olmalıdır. Siz command line ki etmək istəyirsinizsə, yer qurtarmaq üçün \ istifadə etmək lazımdır. Belə ki, CS50 \ qayalar və Siz A qurtar! Siz backslash yoxdur, niyə bu işləmir? [Tələbə] Bu iki müxtəlif arqumentlər var. >> Bəli. Argv [1] CS50 olacaq və argv [2] süxurların olacaq. Okay. İndi ./buggy2 yenidən segfault gedir. Əvəzində əsas fayl ilə açılması, yalnız birbaşa buggy2 açmaq lazımdır gdb buggy2 belə. Biz yalnız bizim proqram run əgər İndi, o, Proqram siqnal SIGSEGV qəbul demək olacaq olan siqnal segfault və belə oldu bu deyil. Bizim backtrace baxanda biz funksiyası oh_no olduğunu görmək ki, funksiyası binky tərəfindən adlanan funksiya dinky tərəfindən çağırılıb Əsas ilə adlandırılmışdır. Biz də bu funksiyaları arqumentlər bilərsiniz. Dinky və binky üçün dəlil 1 idi. Biz funksiyası oh_no siyahısı, biz oh_no yalnız char ** s = NULL etdiyini görmək; * S = "BOOM"; Niyə uğursuz olacaq? [Tələbə] Siz dereference də null göstərici deyil? >> Bəli. Bir char ** olmaq olur, bu yalnız asılı olmayaraq, s NULL olduğunu deyib siz şərh necə asılı olaraq, simli bir göstərici bir göstərici ola bilər ki, və ya strings bir sıra. Bu s NULL edir, belə ki, * s, bir null pointer dereferencing olunur və bu qəza gedir. Bu bəlkə segfault bilər qısa yollarından biridir. Bu, sadəcə bir göstərici null elan və dərhal segfaulting edir. Bu oh_no nə var. Biz bir çərçivə qalxmaq, onda biz oh_no adlı funksiyası daxil olacaq. Mən aşağı bunu etmək lazımdır. Bir komanda daxil və yoxsa yalnız yenidən Enter yalnız siz qaçdı ki, əvvəlki komanda təkrar edəcək. Biz çərçivəsində 1 yerləşirsiniz. Bu çərçivədə siyahısı, biz burada bizim funksiyası görürük. Siz yenə siyahısı hit bilər, və ya siyahısı 20 edə bilərsiniz və daha siyahısını verir. Funksiyası dinky i 1 varsa,, sonra oh_no funksiyası getmək deyir başqa sinsi funksiyası gedin. Və biz burada görmək nə, çünki i 1 bilirik ki dinky arqumenti 1 ilə adlandırılmışdır. Yoxsa yalnız i çap edə və i 1 deyəcəklər. Biz dinky hazırda, biz digər çərçivəsində getmək əgər, biz binky qədər çıxacağıq bilirik. Up. İndi binky istəyirik. Yarısı mənə kəsmə əvvəl siyahısı - - bu funksiya siyahısı i 0 əgər kimi başladı, sonra biz onu oh_no zəng olacaq, başqa dinky çağırırıq. Biz i 1 idi, belə ki, dinky çağırıb. İndi biz əsas geri istəyirik, və əsas yalnız int i = Rand ()% 3 olacaq; Bu yalnız sizin və ya 0, 1, 2 və ya bir təsadüfi nömrə verə gedir. Ki sayı binky zəng olacaq, və 0 qayıdacaqlar. Bu baxaraq, yalnız dərhal çalışan olmadan əl proqramı vasitəsilə gəzinti Siz əsas bir fasilə nöqtəsini qurmaq olar, hansı ki, biz proqram çalıştırdığınızda o deməkdir ki, bir fasilə point xit qədər proqram çalışır. Proqram çalışan Belə ki, davam edəcək və o, əsas funksiyası edib və yayınlanması durdurulur. İndi biz əsas daxilində istəyirik, və addım və ya növbəti kodu növbəti line bizə gətirmək niyyətindədir. Siz addım və ya növbəti edə bilərsiniz. Sonrakı vuruş, indi i Rand ()% 3, biz i dəyəri çap edə bilərsiniz, müəyyən edilmişdir və i 1 deyəcəklər. İndi növbəti addım və ya istifadə olub məsələ yoxdur. Mən bunu əvvəlki bir mattered tahmin, ancaq sonrakı istifadə etmək istəyirəm. Biz addım kullanıyorsanız, funksiyası daxil addım olan faktiki şey baxmaq deməkdir ki binky daxilində baş. Biz növbəti istifadə, onda funksiyası üzərində getmək deməkdir və yalnız bizim əsas funksiyası kodu növbəti line gedin. Burada bu xətt üzrə, mən bunu Rand ()% 3 söylədi idi; Mən addım idi, bu Rand yerinə getmək olardı və nə baxmaq və mən Rand funksiyası vasitəsilə addım ola bilər. Amma Rand funksiyası barədə qayğı yoxdur. Mən yalnız əsas kodu növbəti line getmək istəyirəm, mən növbəti istifadə edin. Amma indi binky funksiyası barədə qayğı yoxdur, mən ki, daxil addım istəyirik. İndi binky oldum. Kodu ilk line (i == 0), mən bir addım əgər demək gedir, biz dinky qədər başa görürük. Biz siyahı şeyi, biz yoxlanılır ki görürsünüzsə i = 0 olur. , i 0 bərabər deyil, belə ki, başqa şərt getdi olan dinky (i) zəng etmək üçün gedir. Siz səhv almaq bilər. Yalnız birbaşa xətləri baxmaq Əgər düşünə bilər, (i == 0) əgər tamam, sonra bir addım atdı və indi dinky (i)-də deyiləm ki, i = 0 və ya bir şey demək olmalıdır bilər. Xeyr, yalnız bu xətt dinky (i) birbaşa qalmaq edə bilir deməkdir. I 0 deyil, növbəti addım daha da sona niyyətində deyil. Else ona dayandırmaq olacaq bir xətt deyil. Bu, yalnız faktiki olan (i) dinky ki, həyata keçirə bilər, növbəti line getmək olacaq. Dinky (i) gücləndirməklə, biz bax (i == 1) əgər. Biz biz addım zaman, biz oh_no ildə başa olacaq bilirik, i = 1 bilmirəm i = 1 daxil addım bilər funksiyası oh_no, çağırır, çünki müəyyən edir ki, char ** s = null və dərhal "BOOM" üçün. Və sonra həqiqətən, buggy2 həyata baxaraq 0, 1 və ya 2 - - zəng binky, bu, i yalnız bir təsadüfi sayı artır i 0, onda oh_no tutan, başqa bu dinky çağırır burada gəlir. I, zəng oh_no 1 varsa, başqa, burada gəlir ki, sinsi zəng i 2 olduqda, oh_no çağırırıq. Mən hətta bir yol var düşünmürəm - Hər kəs bu segfault deyil ki, bir proqram edilməsi yolu görür? Mən bir şey itkin alıram əgər i 0 olduqda, siz dərhal segfault lazımdır, çünki başqa, siz i segfault 1 Əgər bir funksiyası getmək başqa siz i əgər 2 segfault bir funksiyası gedin. Heç nə fərqi Belə ki, segfault. Mən əvəzinə char ** s = NULL bunu olardı təyinat bir yol tapmaq ki, simli üçün yer malloc bilər. Sizeof nə - Biz malloc (sizeof) edə bilər? [Tələbə] (char) * 5? >> Bu hüququ görünür mu? Mən həqiqətən qaçdı, bu işləyəcək fərz edirəm, lakin mən arıyorum nə deyil. S növü baxın. Nin int * əlavə edək, belə ki, int * x. I (sizeof (int)) malloc etmək olardı. Və ya 5 bir sıra istəyirdi, mən (sizeof (int) * 5) edəcəyini; Mən bir int ** varsa? Mən malloc ki? İmleci və [tələbə] ölçüsü. >> Bəli. (Sizeof (int *)); Aşağı burada eyni şey. I (sizeof (char *)) istəyirlər; Bu, "BOOM" işarə edən göstərici üçün yerin ayrılması gedir. Mən "BOOM" özü üçün yerin ayrılması lazım deyil Bu əvvəl dediklərini əsasən ekvivalent çünki char * Bu x = "BOOM". "BOOM" zaten var. Bu yaddaş read-yalnız regionda mövcud olur. S char ** olsa artıq, kodu bu xətt o deməkdir ki, mövcud sonra * s bir char * və siz "BOOM" qeyd etmək bu char * müəyyən edirik. Mən s daxil "BOOM" kopya etmək istəyirdi, onda mən s üçün yerin ayrılması lazımdır. Mən edəcəyik * s = malloc (sizeof (char) * 5); Niyə 5? Niyə 4? "BOOM" 4 simvol kimi görünüyor. >> [Tələbə] The null character. Bəli. Sizin strings Bütün null xarakter lazımdır gedir. İndi strcat kimi bir şey edə bilərsiniz - bir string çıxarmaq üçün funksiyası nədir? [Tələbə] cpy? >> Strcpy. man strcpy. Belə strcpy ya strncpy. siz müəyyən edə bilərsiniz ildən strncpy bir az daha təhlükəsiz tam olaraq necə bir çox simvol, biz bilirik, çünki burada məsələ deyil. Belə strcpy və dəlilləri baxmaq. Ilk arqument bizim yerdir. İkinci arqument bizim mənbəyidir. Biz təyinat into * surəti olacaq göstəricisidir "BOOM" s. Niyə əvvəl əvəzinə biz idi yalnız hansı bir strcpy ilə bunu edə bilərsiniz * s = "BOOM"? Burada bunu edə bilərsiniz bir səbəb, lakin səbəbi nədir? [Tələbə] siz "BOOM" bir şey dəyişmək istəyirsinizsə. >> Bəli. İndi s kimi bir şey edə bilərsiniz [0] = 'X'; s xal yığın üzrə yığın və yer s işarə edir ki, "BOOM" saxlanılması olan yığın, daha çox yer bir göstəricisidir. Belə ki, "BOOM" Bu surəti yığın saxlanılır olunur. Bizim proqram "BOOM" iki nüsxədə texniki var. Yalnız bu "BOOM" string daimi verdiyi ki, ilk biri var və "BOOM" ikinci surəti strcpy "BOOM" surəti yaradılmışdır. Amma "BOOM" surəti yığın saxlanılır və yığın dəyişmək bilərsiniz olunur. Bu yığın oxumaq yalnız deyil ki, deməkdir ki, s [0] siz "BOOM" dəyəri dəyişdirmək imkan gedir. Bu o simvol dəyişdirmək imkan olacaq. Suallar? Okay. , Buggy3 üçün edək gdb buggy3 hərəkət. Biz yalnız run və biz segfault almaq baxın. Biz backtrace varsa, yalnız iki funksiyaları var. Biz əsas funksiyası qədər getmək varsa, biz bu xətti segfaulted görürük. Belə ki, yalnız üçün (bu xətt baxaraq int line = 0; fgets bu məhsulları bərabər NULL edir; line + +). Bizim əvvəlki çərçivəsində _IO_fgets adlanırdı. Siz daxili C funksiyaları ilə bir çox görəcəksiniz Siz segfault almaq zaman, həqiqətən sirli funksiyası adları olacaq bu _IO_fgets kimi. Lakin bu fgets zəng aid olacaq. Somewhere burada daxili, biz segfaulting olunur. Biz fgets üçün dəlillər baxsaq, biz tampon çap edə bilərsiniz. Nin çap edək kimi - no, Oh. Çap məhz mən istədiyiniz kimi işləmək niyyətində deyil. Nin faktiki proqram baxaq. Bufer bir xarakter array edir. Bu 128 simvol bir xarakter sıra var. Mən çap bufer deyəndə ki, bu 128 simvol çap olacaq I guess gözlənilir budur. Mən axtarır, bufer və ünvan Yazdır lakin həqiqətən mənə çox demək deyil. Mən burada x bufer qədər demək nə zaman, bu, mənə 0xbffff090 göstərir siz əvvəl və ya bir baxımdan xatırlayıram varsa, Oxbffff bir yığın-ish rayon olmağa çalışır ki,. Yığını yalnız 0xc000 altında haradasa başlamaq üçün çalışır. Məhz bu ünvan görərək, mən bufer yığını baş bilirik. Bufer, qədər, run, mənim proqram başlatmaqdan biz idi simvol bu ardıcıllıqla gördüm ki, olduqca çox mənasız edir. Sonra fayl çap, nə fayl kimi görünür? [Tələbə] Null. >> Bəli. , File type Resim * bir, belə bir göstəricisidir və pointer dəyəri null edir. Belə fgets, dolayı şəkildə pointer oxu cəhd edir lakin pointer daxil olmaq üçün, bu dereference bu var. Yoxsa, bu dereferences ki, işarə etmək lazımdır nə daxil olmaq üçün. Belə ki, bir null göstərici və segfaults dereferencing edir. Mən orada yenidən bilərdi. Biz əsas nöqtədə fasilə və çalıştırıyorsanız, kodu ilk line char * filename = "nonexistent.txt" dir; Yəni bu proqram uğursuz nə üçün olduqca böyük ipucu vermək lazımdır. Mən bu fayl açmaq yerləşir növbəti yazaraq, növbəti line mənə gətirir və sonra mən dərhal bir dəfə mən növbəti edib bizim xətti, daxil, bu segfault olacaq. Hər kəs biz segfaulting bilər nə səbəb həyata atmaq istəyir? [Tələbə] Faylın yoxdur. >> Bəli. Bu işarə olması ehtimal edilir bir fayl açılış etdiyiniz zaman fayl həqiqətən olduğunu yoxlamaq lazımdır. Belə ki, burada "nonexistent.txt"; Biz oxumaq üçün fopen fayl, biz sonra demək lazım əgər (fayl == NULL) və printf ("Fayl mövcud deyil!" demək və ya - hələ yaxşı - fayl); qaytarılması 1; Belə ki, indi biz bu NULL varsa kontrol əvvəl həqiqətən davam və faylı oxumaq üçün çalışırıq. Biz yalnız işləri görmək üçün yeniden yapmak bilər. Yeni xətt daxil etmək nəzərdə tutulub. Belə ki, indi nonexistent.txt yoxdur. Siz həmişə şey bu cür yoxlamaq lazımdır. Siz həmişə fopen NULL qaytarır görmek üçün yoxlamaq lazımdır. Siz həmişə malloc NULL qayıtmaq deyil əmin olun olmalıdır və ya başqa siz segfault. İndi buggy4.c. Running. Mən giriş və ya bəlkə sonsuz loop gözləyir bu təxmin edirəm. Bəli, bu sonsuz loop var. Buggy4 belə. Biz sonsuz loop etdiyiniz kimi görünür. Biz əsas da qıra bilər, proqram axır. Gdb olaraq, kimi uzun siz istifadə kısaltma birmənalı olaraq və ya onlar sizin üçün təmin edən xüsusi ixtisarlar, sonra yerinə gələn bütün yolu yazın olan sonrakı istifadə etmək n istifadə edə bilərsiniz. İndi mən bir dəfə təşkil n etdik ki, mən yalnız növbəti davam etmək üçün Enter hit bilər əvəzinə edib n daxil n daxil n daxil edin malik. I [i] 0 array yaradılması ki, loop üçün bir növ Ben kimi görünür. Mən loop üçün bu həyata qırılma heç deyiləm kimi görünür. Mən çap, belə ki, i 2, onda mən növbəti gedəcəyəm. Mən növbəti gedəcəyəm, sonra i 3, i çap edəcəyik. Mən çap bilərsiniz və i 3. Sonrakı, i çap, i 4. Əslində, çap sizeof (array), belə serialın ölçüsü 20-dir. Bəzi xüsusi gdb komanda bir şey baş qədər davam üçün var kimi Lakin görünür. Bu dəyişən dəyəri şərti yaradılması kimi. Amma nə xatırlamıram. - Biz davam əgər Nə deyirdilər? Nə qədər gətirmək idi? [Tələbə] göstərilmir i əlavə mu - >> Bəli. Belə i kömək edə bilər göstərir. Biz yalnız i Profilə varsa, i dəyəri nə burada qoyacaq Mən hər zaman çap etmək yoxdur. Biz yalnız növbəti davam etsək, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5 görürük. Something olduqca yanlış gedir və i 0 sıfırlamak olunur. Buggy4.c baxanda biz olur ki, bütün int array [5] görmək; (i <= sizeof (array) i + + i = 0) array [i] = 0; Biz burada yanlış nə görürsünüz? Bir işarə kimi, mən gdb buggy4 bunu zaman - əsas, run qırmaq edək - Mən çap sizeof (array) yalnız mən nəhayət çıxmaq lazımdır vəziyyəti nə görmək idi. Harada am? I run mı? Mən hələ elan etməyib. Belə ki, sizeof (array) çap və 20 var ki, mənim array ölçüsü 5 ildən gözlənilir və 5 integers var edir belə bütün şey sizeof (int) 4 olmağa çalışır yerləşir 5 * sizeof (int) bytes olmalıdır. Belə sizeof (array) 20 edir. Bu nə olmalıdır? [Tələbə] sizeof (int) bölünür. >> Bəli / sizeof (int). Bir problem burada hələ var kimi görünür. Mən bu yalnız olmalıdır < olduqca çox həmişə ildən > [Bowden] Bəli. Biz serialın sonunda kənara olduğunuzda, biz əsas olduğunuz elə ki, yer i dəyəri əsas olunur. Biz buggy4 baxmaq əgər belə, əsas, run qırmaq i üçün ünvan çap edək. Bu bffff124 var kimi görünür. İndi serialın ünvan çap bildirin [0]. 110. Nə [1] haqqında? 114. [2], 118. 11C, 120. array [5] bfff124 edir. Array Beləliklə [5] i ki, array [5] i deməkdir ki, eyni ünvan var. Eyni ünvanınız varsa, onlar eyni şey var. Beləliklə, biz array [5] müəyyən zaman 0, biz 0 i müəyyən edilir. Və siz yığını baxımından bu barədə düşünüyorsanız, int i yığını bəzi yer alır deməkdir ki, ilk bəyan edilir. Sonra array [5] belə sonra 20 bytes yığını üzrə ayrılmış yerləşir. Belə ki, i sonra bu 20 bytes ayrılmış almaq, ilk ayrılmış olur. Belə ki, i, sağ array əvvəl baş və çünki yolu kimi mən, texniki yığını aşağı artır yerləşir, ötən həftə bildirib bir sıra daxil zaman indeksi, biz təmin edilir ki, array ildə 0th mövqe həmişə serialın ilk mövqe əvvəl olur. Bu ötən həftə çəkdi necə növüdür. Alt biz ünvan 0 və üst biz ünvan Max ki bildirək. Yığını həmişə aşağı artır. Gəlin biz i ayrılması demək. Biz tam ayrılması i edək yalnız burada tam i ayrılmış olur qədər demək deməkdir. Sonra biz altından o deməkdir ki, 5 integers bizim array, ayrılması yığını aşağı artır ildən bu 5 integers ayrılmış almaq. Amma seriallarda iş necə, çünki biz təmin edirik ki, serialın ilk mövqe həmişə serialın ikinci şey az bir ünvan var. Belə array mövqe 0 həmişə yaddaş ilk baş var array mövqe 1 sonra baş var, halbuki və array mövqeyi 2, ondan sonra baş var ki array mövqe 0, aşağı burada bir yerdə olur deməkdir array mövqe 1 ki, yuxarıda olur qədər hərəkət maksimum ünvan burada çünki ali URL deməkdir. çünki Aşağı burada array [0] Beləliklə, dizi [1] qədər burada, dizi [2] qədər burada array [3] qədər burada. Burada i bütün yolu, tam ayrılmış necə əvvəl bildirək biz array daha çox və daha hərəkət kimi, biz daha sıx və daha bizim tam i əldə edirlər. Bu, sadəcə, belə ki, bizim array kənarda bir mövqe ki, array [5] olur məhz i ayrılacaq baş verdiyi tam deyil. Belə ki, biz yığını üzərində yer vuruş üçün baş nöqtəyə var ki, tam i ayrılıb və biz 0 qəbulu edirik. Yəni çalışır. Suallar? Bəli. [Tələbə] ağla etməyin. Okay. [Tələbə] necə səhvlər bu cür qarşısını almaq edirsiniz? Səhvlər Bu cür? Sizin proqramlaşdırma dili C istifadə etməyin. Yoxlanılması array həddi var ki, bir dil istifadə edin. Kimi uzun siz ehtiyatlı etdiyiniz kimi, yalnız array hüdudlarından keçmiş gedən qarşısını almaq üçün lazımdır. [Tələbə] Belə ki, burada biz serialın həddi keçmiş getdi - [Bowden] şeyi yanlış gedir başlamaq harada. >> [Tələbə] Oh, tamam. Kimi uzun sizin array üçün ayrılmış yaddaş ərzində qalmaq kimi, gözəl istəyirik. Lakin C heç bir səhv yoxlanılması edir. Mən array Əgər [1000], onu sevə-sevə yalnız baş verir nə dəyişdirmək edəcək - Bu array əvvəlinə gedir, sonra sonra 1000 mövqelərini gedir və 0 qoyur. Bu oh, bu, həqiqətən, 1000 şey yoxdur ki, hər hansı yoxlama etmir. 1000, yol mən dəyişdirilməsi lazım nə kənarda Java və ya bir şey siz həddi indeksi array çıxmaq lazımdır halbuki və ya həddi istisna indeksi həyata. Yüksək səviyyəli dil bir çox bu şeylər vardır ki, Siz array kənarda getmək əgər yerləşir, siz uğursuz siz altında olan şeyi dəyişə bilməz ki, və sonra hər şeyi yalnız bir istisna almaq daha pis getmək siz serialın sonunda çıxan etdi. [Tələbə] Və biz yalnız dəyişib lazımdır <= yalnız > [Bowden] Bəli. Bu > [Tələbə] Sağ. Ətraflı suallar? Okay. [Tələbə] Mən bir sual var. >> Bəli. [Tələbə] faktiki array dəyişən nədir? [Bowden] Bəyəndim array nədir? Array özü rəmzidir. Bu yalnız biz sened olan 20 bayt start ünvanı. Siz göstərici kimi hesab edə bilər, lakin sabit göstəricisidir. Kimi tezliklə şeyi tərtib almaq kimi, dəyişən sıra artıq mövcud deyil. [Tələbə] Belə ki, necə bu serialın ölçüsünü tapmaq deyil? Array ölçüsü ki, simvolu aiddir ki, blokun ölçüsü aiddir. Mən printf kimi bir şey ("% s \ n", dizi) nə zaman; nin run bildirin. Mən nə zülm idi? Array "array 'burada elan etdi. Oh, qədər burada. Zınqıltı ağıllı və mən 5 element kimi array elan fark olur amma mövqeyi 1000 daxil indeksasiyası alıram. Bu yalnız sabitləri, çünki ki, edə bilərsiniz. Bu, yalnız mən array kənarda gedirəm ki, hiss günə qədər davam edə bilər. Lakin, biz i yanlış zaman əvvəl qeyd o bəlkə, i almaq necə çox dəyərləri müəyyən edə bilməz belə ki, i serialın sonunda kənara ki, müəyyən edə bilməz. Bu yalnız ağıllı olan cingilti var. Amma indi buggy4 edir. Mən yanlış nə edirəm? Dolayısı kitabxana funksiyası "printf" elan. I # daxil etmək istəyirəm gedirəm. Okay. İndi buggy4 çalışır. Kimi serialın dəyəri çap mən bir göstərici kimi çap, burada etdi bu kimi görünür ki, baskı bir şey - bfb8805c - bəzi ünvan olan ki, yığın-ish rayon var. , Array özü bir göstərici kimi, ancaq faktiki göstərici deyil müntəzəm göstərici ildən biz dəyişə bilərsiniz. Array yalnız bir sabit deyil. Yaddaş 20 blokları ünvan 0xbfb8805c-da başlanır. Bu ünvan vasitəsi Belə bfb8805c +20--ya mən -20 tapmaq - Bu array üçün ayrılmış yaddaş bütün. Array, dəyişən özü yerdə saxlanılır deyil. Əgər tərtib etdiyiniz zaman, compiler - bu əl dalğa - bu sıra bilir yerləşir lakin compiler yalnız istifadə edəcək. Ki array başlayır ki, bilir və buna həmişə yalnız əvvəlindən offsets baxımından şeyi edə bilərsiniz. Bu array təmsil dəyişən özü lazım deyil. Amma int * p = array kimi bir şey olduqda; indi p ki, array işarə edən bir göstəricisidir və indi p əslində yığını mövcud deyil. Mən p dəyişdirmək üçün pulsuz deyiləm. Mən p = malloc edə bilərsiniz. Belə ki, ilk array qeyd; indi yığın bəzi kosmik göstərir. Mən array = malloc edə bilməz. Zınqıltı ağıllı, bu hüququ yarasa off mənə fəğan edəcək. Əslində, mən gcc də bu edəcəyini olduqca əminəm. Belə array növü 'int [5] təyin deyil. Siz bir sıra tipi bir şey atayamayacağı array yalnız sabit deyil. O istinadlar həmin 20 bytes rəmzidir. Mən bunu dəyişə bilməz. [Tələbə] Və serialın ölçüsü yerləşir saxlanılır? [Bowden] Bu yerdə saxlanılır deyil. Bu tərtib zamanı deyil. Belə ki, serialın ölçüsü yerləşir saxlanılır? Siz yalnız array özü bəyan edir ki, funksiyası daxilində sizeof (array) istifadə edə bilərsiniz. Mən bəzi funksiyası, foo, nə və nə əgər (int array []) printf ("% d \ n", sizeof (array)); və sonra aşağı burada foo (array) zəng; bu funksiya daxilində - nin run bildirin. Bu bir daha ağıllı olan cingilti edir. Mənə izah ki array funksiyası parametr üzrə sizeof "int * 'ölçüsü qayıdacaqlar. Mən nə istədiyini deyil, bu bir səhv olardı. Nin həqiqətən Werror söndürmək edək. Warning. Uyarılar cərimə edilir. Bir xəbərdarlıq var ki, hələ də uzun tərtib edəcək. . / A.out 4 çap edir. Istehsal edilmişdir ki, xəbərdarlıq yanlış getdi nə aydın göstəricisidir. Bu int dizi yalnız sizeof (int *) çap edir. Mən burada array [5] qoymaq belə, hələ də yalnız sizeof (int *) çap olacaq. Belə ki, tez bir funksiyası onu keçmək kimi seriallarda və göstəricilər arasında fərq mövcud deyil. Bu yığını elan edilmişdir ki, bir sıra olmaq olur lakin tezliklə biz ki, dəyəri keçmək kimi 0xbf blah, blah, bu funksiya daxil blah, sonra bu göstərici yığını ki array göstərir. Sizeof yalnız array elan edilib ki, funksiyası tətbiq deməkdir ki, deməkdir ki, bu funksiya tərtib zaman zınqıltı bu funksiya keçir zaman, array ölçüsü 5 bir int dizi olduğunu görür. Belə ki, o, sizeof (array) görür. Yaxşı ki, 20 var. Bu sizeof əsasən demək olar ki, bütün hallarda necə həqiqətən var. Sizeof funksiyası deyil, bir operator var. Siz sizeof funksiyası zəng etməyin. Sizeof (int), bu compiler yalnız 4 tərcümə edəcək. O var? Okay. [Tələbə] Beləliklə əsas və foo ildə sizeof (array) arasında fərq nədir? Biz növü int * edən sizeof (array), deyərək edirik, çünki bu serialın aşağı burada deyil növü int üçün * halbuki, bu int dizi var. [Tələbə] Beləliklə, siz array [] əvəzinə int * sıra parametre olsaydı, indi bir göstərici deyil, çünki hələ array dəyişə bilər ki, demək istəyirsiniz? [Bowden] Bu kimi? >> [Tələbə] Bəli. İndi funksiyası ərzində array dəyişə bilərəm? [Bowden] Siz həm hallarda array dəyişə bilər. Bu hallarda, həm də siz array [4] = 0 Cavab pulsuz. [Tələbə] Amma siz başqa bir şey array point etmək olar? [Bowden] Oh. Bəli. Hər iki halda - >> [tələbə] Bəli. [Bowden] array [] və bir int * array arasında fərq yoxdur. Siz həmçinin burada bəzi çoxölçülü sıra əldə edə bilərsiniz bəzi əlverişli sintaksis üçün, lakin yalnız bir göstərici var. Bu array etmək uzağam deməkdir = malloc (sizeof (int)); və indi başqa bir yerdə qeyd. Lakin, bu əbədi və həmişə necə istəyirəm edilməsi bu array dəyişən başqa bir şey qeyd o, dəlil surəti çünki burada bu array aşağı dəyişmir bu arqument bir göstərici deyil. Və həqiqətən, yalnız eyni olduğunu daha göstəricisi kimi - Biz artıq çap sıra baskı nə gördüm - nə biz serialın ünvanı və ya serialın ünvanı ünvanı çap əgər o ya da? Bu bir ignore edək. Okay. Bu gözəl edir. İndi. / A.out çalışan edir. Çap array, sonra serialın ünvan çap, eyni şey var. Array yalnız mövcud deyil. Bu array çap etdiyiniz zaman, bu 20 bayt edir ki, simvolu çap edirik bilir. Serialın ünvanı çap, yaxşı, dizi yoxdur. Bu ünvan mövcut deyil, belə ki, yalnız 20 bayt ünvan görüntüler. Tez aşağı tərtib kimi, sizin tərtib buggy4 kimi. / A.out array mövcud deyil. Pointers mövcuddur. Diziler deyil. Serialın təmsil yaddaş blokları hələ mövcud lakin dəyişən array və növü dəyişənlərin yoxdur. Bu seriallarda və göstəricilər arasında əsas fərqlər kimi tez funksiyası zəng etmək kimi, heç bir fərq yoxdur. Amma daxilində array özü bəyan edir ki, funksiyası, sizeof fərqli işləyir yerine növü ölçüsü bloklarının ölçüsü çap edirik bəri, bir rəmzi, çünki siz dəyişə bilməz. Şey şey və ünvanı Çap eyni şey görüntüler. Və bu olduqca çox var. [Tələbə] ki, bir daha deyə bilərsinizmi? Mən bir şey buraxılmış ola bilər. Array çap sıra və ünvanı, eyni şey yazdıran Siz göstərici üçün ünvan qarşı bir pointer çap əgər halbuki, bir şey işarə etdiyiniz nə ünvan yazdıran, digər yığını üzrə göstərici üçün ünvan görüntüler. Siz göstərici dəyişə bilərsiniz; bir sıra rəmzi dəyişə bilməz. Və sizeof pointer ki pointer növü ölçüsü çap edir. Belə ki, int * p sizeof (p), 4 çap edir lakin int array [5] print sizeof (array) 20 çap edir. [Tələbə] Belə int array [5] 20 çap edəcək? >> Bəli. Niyə daxilində buggy4 ki sizeof (array) olmaq üçün istifadə zaman var bu i <20 edirdi ki, bu biz nə istədiyini deyil. Biz i <5 istəyirik. >> [Tələbə] Okay. [Bowden] Və sonra tez funksiyaları keçən başlamaq kimi, Biz əgər int * p = array; bu funksiya daxilində biz əsasən, eyni yolla p və array istifadə edə bilərsiniz bu sizeof problem və dəyişən problem istisna olmaqla. Amma p [0] = 1; array [0] = 1 söyləyərək eyni; Və tezliklə biz foo (array) demək kimi və ya foo (p); bu foo funksiyası daxilində, bu iki dəfə eyni çağırışdır. Bu iki zənglər arasında heç bir fərq yoxdur. Ki, yaxşı hər kəs? Okay. Biz 10 dəqiqə var. Biz bu Hacker Daktilograf proqramı vasitəsilə almaq üçün cəhd edəcəyik keçən il və ya bir şey çıxdı ki, bu veb. Siz təsadüfi yazın və çap kimi yalnız ehtimal edir - Nə olursa olsun faylı yükləmiş olur siz yazaraq olduğunuz kimi görünür. Bu əməliyyat sistemi kodu bir növ kimi görünür. Yəni biz həyata istəyirəm nə. Siz hacker_typer adlı bir ikili çalıştırılabilir olmalıdır ki, fayl, bir dəlilinin edir "hacker növü." Yürütülebilir Running ekranı silmək lazımdır və sonra istifadəçi presleri əsas hər dəfə qəbul olan faylı bir xarakter çap. Siz basın hər hansı əsas Belə ki, üz atmaq əvəzinə faylı bir xarakter çap etməli ki dəlildir. Mən olduqca çox biz bilmək lazımdır olacaq şeyləri nə deyim. Amma biz termios kitabxana kontrol etmək istəyirəm. Mən bütün həyatı bu kitabxana istifadə heç vaxt, belə ki, çox minimal məqsədləri var. Amma bu sizə hit xarakteri tullamaq üçün istifadə edə bilərsiniz kitabxana olacaq Daxil standart daxil yazaraq zaman Belə hacker_typer.c və biz # daxil etmək istəyirəm olacaq. Termios üçün adam səhifə baxanda - Ben bu terminal OS və ya bir şey guessing - Mən oxumaq üçün necə bilmirəm. Bu baxıldığında, bu 2 faylları daxil etmək üçün deyir ki, biz bunu edəcəyik. Ilk şey ilk, biz açmalıdır fayl olan bir arqument etmək istəyirəm. Mən nə istəyirəm? Nasıl bir arqument var kontrol edə bilərəm? [Tələbə] argc o təşkil edin. >> [Bowden] Bəli. Beləliklə, əgər (argc = 2!) Printf ("user:% s [fayl açmaq üçün]"). Mən ikinci dəlil olmadan bu run Əgər indi - oh, mən yeni xətt lazımdır - siz onu deyir istifadə görürsünüz:. / hacker_typer, və sonra ikinci mübahisə mən açmaq, istədiyiniz faylı olmalıdır. İndi mən nə etməliyəm? Mən bu faylı oxumaq istəyirəm. Nasıl faylı oxuyursunuz? [Tələbə] Siz ilk açın. >> Bəli. Belə fopen. Fopen necə görünür? [Tələbə] Fayl. >> [Bowden] Fayl argv [1] olacaq. [Tələbə] Sonra nə ilə etmək istəyirəm, belə ki, - >> [Bowden] Bəli. Yadınızdadırsa etmədi Belə ki, siz adam fopen nə yalnız ola bilər bu yol fayl olduğu İnşaat char * yol olacaq, burada İnşaat char * rejimi. Siz rejimi nə xatırlamıram başına, onda rejimi üçün baxa bilərsiniz. Man pages İçəridə çizgi xarakter şeyi axtarmaq üçün istifadə edə bilərsiniz edir. Mən rejimi üçün axtarış / mode yazın. n və N axtarış oyunları vasitəsilə dövrü üçün istifadə edə bilərsiniz edir. Burada simli üçün dəlil rejimi bal deyir aşağıdakı ardıcıllığı biri ilə başlayan. Oxu r Belə ki, Açıq mətn faylı. Yəni etmək istəyirəm nə. Oxu, mən ki, saxlamaq istədiyiniz üçün. Şey bir Resim * olacaq. İndi mən nə istəyirəm nə? Mənə bir ikinci verin. Okay. İndi mən nə istəyirəm nə? [Tələbə] bu NULL var yoxlayın. >> [Bowden] Bəli. Bir fayl açmaq hər zaman, siz uğurla açmaq arxayın olun. Mən ilk mənim cari ayarları oxumaq istədiyiniz İndi ki termios stuff etmək istəyirəm və bir o saxlamaq, sonra mənim ayarlarını dəyişdirmək üçün istədiyiniz , mən yazın ki, hər hansı simvol üz atmaq və sonra mən bu ayarlarını güncellemek istəyirəm. Və sonra proqramın sonunda, mən orijinal ayarları geri dəyişdirmək istəyirik. Belə ki, struct növü termios ilə olacaq və mən bu iki istəyirəm gedirəm. Birincisi, mənim current_settings olacaq və onlar mənim hacker_settings olmaq olacaq. Birincisi, mən, mənim cari ayarları saxlamaq istəyirsinizsə gedirəm sonra I, hacker_settings güncellemek istəyirsinizsə gedirəm və sonra mənim proqramının sonunda gəlmişkən, mən cari ayarları geri istəyirəm. Beləliklə, biz insan termios çalışır ki, yolu, cari ayarları qənaət. Biz bu int tcsetattr, int tcgetattr ki, görürük. Mən onun göstərici bir termios struct ilə keçir. Bu görünür yolu - I've artıq funksiyası adlanır nə unudulmuş. Kopyalayın ve yapışdırıb. Tcgetattr Belə ki, sonra, mən də məlumat qənaət edirəm ki, struct keçmək istəyirəm olan current_settings olacaq və ilk dəlil I atributları saxlamaq istədiyiniz şey üçün fayl descriptor edir. Nə fayl descriptor sizə bir fayl açmaq hər zaman kimi, bir fayl descriptor alır. Mən fopen argv [1], bu sened olan bir fayl descriptor alır Onu oxumaq və ya yazmaq üçün zaman. Mən burada istifadə etmək istədiyiniz fayl descriptor deyil. Siz ismarıcları var üç fayl descriptors var olan standart həyata və standart səhv standart var. Mənim cari olaraq, mən bunu 0, standart həyata 1 və standart səhv 2-dir standart hesab edirəm. Belə ki, nə mən ayarlarını dəyişdirmək istəyirsiniz? Mən bir xarakter hit zaman və parametrləri dəyişdirmək istədiyiniz Mən bunu yerinə ekran üçün çap üz ki, karakter atmaq istəyirəm. Nə axın - - standart həyata, və ya standart səhv, standart Mən klaviatura ilə yazın zaman şeyə cavab? >> >> Bəli daxil [tələbə] Standard. Mən ya 0 edə bilərsiniz və ya stdin edə bilərsiniz. Mən daxil standart current_settings alıram İndi, bu ayarları güncellemek istəyirsinizsə belə ilk mənim current_settings nə hacker_settings daxil surəti lazımdır. Və structs iş necə yalnız surəti olacaq. Beklediğiniz kimi Bu, bütün sahələrində nüsxə. İndi sahələrində bəzi yeniləmək istəyirəm. Termios baxanda, bu bir çox vasitəsilə oxumaq olacaq yalnız sizin üçün baxmaq istəyirəm nə, lakin sizin üçün baxmaq istəyirəm olacaq bayraqları, echo var belə Echo daxil simvol ECHO. Birinci mən qurmaq istəyirik - sahəsində nə artıq unudulmuş I've. Bu struct kimi görünür. Giriş rejimi Mən biz dəyişdirmək istədiyiniz edirəm. Biz ki, dəyişdirmək istədiyiniz nə əmin həll baxmaq lazımdır. Biz bütün bu nəzər ehtiyac qarşısını almaq üçün lflag dəyişmək istəyirəm. Biz yerli rejimi dəyişdirmək istəyirik. Siz hər şeyi aid olduğu anlamaq üçün bütün bu şey vasitəsilə oxumaq olacaq biz dəyişdirmək istəyirik. Amma biz dəyişdirmək istədiyiniz olacaq yerləşir yerli rejimi daxilində var. Belə hacker_settings.cc_lmode o deyirlər edir. c_lflag. Biz bitwise operatorları daxil yerdir. Biz həyata cür istəyirik, ancaq real tez keçmək lazımdır. Biz bitwise operatorları daxil bu ki, Hesab edirəm ki, harada bir zaman uzun əvvəl bildirib ki, siz bayraqları ilə məşğul başlamaq zaman, siz bitwise operator bir çox istifadə olacaq. Bayrağı hər bit davranış bir növ uyğundur. Belə ki, burada, bu bayraq onların bütün fərqli bir şey demək yerləşir müxtəlif əşyalar, bir dəstə var. Amma nə etmək istədiklərini yalnız ECHO cavab verən bit söndürmək olunur. Belə çevirmək ki, mən off & = ¬ ECHO. Əslində, mən bunu tECHO və ya bir şey kimi düşünürəm. Mən yenidən yoxlamaq üçün gedirəm. Mən bunu termios bilər. Bu yalnız ECHO oldu. ECHO bir az olacaq. ¬ ECHO bütün bayraqları doğru müəyyən edilir deməkdir ki, bütün bit 1 qurmaq deməkdir gedir bu ECHO bit istisna olmaqla. Bu mənim yerli bayraqları bitən görə, hazırda doğru müəyyən olunur ki, bütün bayraqları deməkdir hələ doğru müəyyən olunacaq. Mənim ECHO bayrağı doğru qurmaq, onda bu mütləq ECHO bayrağı saxta müəyyən edilir. Belə kodu bu xətt yalnız ECHO bayrağı sönür. Kodu digər xətləri, Mən onlara vaxt maraq seçin və sonra onları izah edəcəyik. Həllində, o, 0 deyib. Bu aydın stdin demək, yəqin ki, daha yaxşıdır. Burada ICANON | Mən də ECHO edirəm edək ki,. ICANON canonical rejimi deməkdir ayrı bir şey deməkdir. Siz command line həyata yazaraq etdiyiniz zaman nə canonical rejimi vasitələri, adətən siz newline hit qədər standart bir şey emal deyil. Beləliklə, siz GetString zaman, siz newline edib, sonra şeyi bir dəstə yazın. Bu da standart göndərilən zamanı ki, Bu u mənim deyil. Sizə basın indi hər bir xarakter canonical rejimində söndürmək zaman nə, bu şeylər emal yavaş, çünki adətən pis növ olan emal olur olunur o bütün xətləri daxil bufer yaxşı nə olan. Amma hər bir xarakter emal olunsun Mən newline hit üçün gözləmək istəmirsinizsə ildən bütün simvol emal əvvəl yazaraq etdik. Bu canonical rejimi sönür. Faktiki simvol emal Bu məhsulları yalnız deməkdir. , Tezliklə mən yazmaq edirəm onları emal, bu dərhal emal deməkdir. Və bu, standart üçün ayarları yenilənməsi olan funksiyası və TCSA vasitəsilə indi bunu. Axın hazırda hər şeyi emal qədər başqa variantları gözləyin olunur. Ki, həqiqətən məsələ deyil. Yalnız indi mənim ayarları hacker_typer_settings hazırda nə olacaq dəyişir. Mən hacker_settings adlı tapmaq, belə ki, dəyişdirmək imkan verir. Hacker_settings hər şey dəyişir. İndi proqramın sonunda biz geri istəyirəm olacaq normal_settings daxilində hazırda nə üçün, olan yalnız və normal_settings kimi baxmaq edir. Mən ilk bu əldə bəri mənim normal_settings heç dəyişməyib edək. Sonra geri dəyişdirmək, mən sonunda geri keçir. Bu yeniləmə idi. Okay. Daxili burada İndi mən yalnız vaxt maraq kodu izah edəcəyik. Bu çox kodu deyil. Biz faylı bir xarakter oxumaq baxın. Biz f çağırıb. İndi insan fgetc bilər, lakin necə fgetc iş gedir yalnız yalnız oxumaq və ya EOF ki, karakter geri olacaq ki, olan fayl və ya bir səhv baş sonunda uyğundur. Biz, faylı bir xarakter oxumaq üçün davam loop olunur biz oxumaq simvol tökülmək kadar. Biz bunu etdiyiniz zaman, biz daxil standart bir tək xarakteri gözləyin Hər bir zaman siz command line bir şey yazın daxil standart bir xarakter oxu ki, Sonra putchar yalnız biz fayl standart həyata buraya qədər oxumaq char qoymaq niyyətindədir. Siz insan putchar bilər, lakin bu, yalnız standart həyata qoyulması edir ki, bu xarakterli çap edir. Eyni fikir; Ayrıca yalnız printf ("% c", c) ola bilər. Yəni bizim iş toplu etmək olacaq. Biz istəyirik olacaq son şey yalnız fayl fclose edir. Siz fclose deyilsə, bir yaddaş sızıntısı var. Biz ilk açılan fayl fclose istəyirəm və mən ki, düşünürəm. Ki, etmək, mən artıq problemlər var. Bakalým. Nə şikayət etdi? Gözlənilən "int", lakin dəlil növü 'struct _IO_FILE *' edir. Ki, işləyir, əgər biz görəcəksiniz. Yalnız C99 yol. Augh. OK, hacker_typer edir. İndi biz daha faydalı təsviri almaq. Belə bəyan identifikatoru "normal_settings" istifadə. Mən bunu normal_settings zəng etməyib. Mən bunu current_settings çağırıb. Belə ki, bütün dəyişdirmək imkan verir. İndi mübahisə keçən. Mən indi bu 0 edəcəyik. Okay. . / Hacker_typer cp.c. Mən də başında ekran sil vermədi. Amma siz ekran sil necə son problem set geri baxa bilərsiniz. Bu, sadəcə bir neçə simvol çap edir bu nə istəyirəm nə isə. Okay. Bu əvəzinə stdin 0 olmaq üçün lazım nə haqqında düşünür, olan # 0 müəyyən edilməlidir ki, bu şikayət - I fayl descriptors olduğunu bildirib, lakin sonra siz də Resim * zaman əvvəl, bir fayl descriptor, yalnız bir tam deyil bir Resim * Bugün heyəti bütün dəstə var halbuki. Yerine stdin 0 demək lazımdır səbəbi ki stdin fayl descriptor 0 sened olduğu şey işarə edən bir Resim * edir. Belə ki, hətta qədər burada fopen nə zaman (argv [1], mən geri Resim * alıram. Amma bir yerdə ki, Resim * ki, fayl üçün fayl descriptor uyğun bir şeydir. Siz açıq adam səhifə baxsaq, mən sizə adam 3 açıq etmək lazımdır düşünün - nope - man 2 açıq - Bəli. Açıq üçün səhifə baxsaq, açıq, aşağı səviyyədə fopen kimi və faktiki fayl descriptor qaytarılması oldu. fopen açıq üst məhsullarının bir dəstə edir əvəzinə fayl descriptor bütün Resim * göstərici qaytarır yalnız qaytarılması olan içərisində olan bizim kiçik fayl descriptor edir. Fayl * şey deməkdir Yəni standart, 0 özlüyündə yalnız fayl descriptor standart istinad halbuki. Suallar? [Gülür] ki vasitəsilə partladılıb. Bütün hüquqlar. Biz tamamlayın. [Gülür] [CS50.TV]