[Powered by Google Translate] [BÖLMƏ 5: AZ RAHAT]
[Nate Hardison, Harvard Universiteti]
[Bu CS50 edir.] [CS50.TV]
Belə ki, uşaqlar, geri salamlayıram.
Bölüm 5 xoş gəlmisiniz.
Bu nöqtədə, viktorina 0 başa olan və etdik necə göründüyü edərək,
Mən çox bu bölmədə puanları heyran çünki ümid həqiqətən yaxşı hiss edirəm.
Online tamaşaçı üçün, suallara bir neçə yaşadım
problem sıra son iki problemləri haqqında - və ya viktorina deyil.
Belə ki, hər kəs nə görür ki, həqiqətən tez o artıq getmək olacaq
və deyil, yalnız həll özü görüntü daha çox faktiki həll keçmək necə.
Biz, həqiqətən tez problemlər son bir neçə üzərində getmək üçün 32 və 33 olacaq.
Sadəcə, bir daha, belə ki online tamaşaçıların bu görürük.
>> Siz səhifə 13-də olan problem 32, müraciət edin
16 13, problem 32 bütün svopları edir.
Bu iki integers dəyişdirmə haqqında idi.
Bu mühazirədə bir neçə dəfə artıq getdi istədiyiniz ki, problem var.
Və burada, nə biz nə xahiş edilmişdir tez yaddaş iz edir.
Onlar yığını olan kimi dəyişənlərin dəyərlərinin doldurmaq üçün
kodu bu mübadilə funksiyası ilə gedir kimi.
Xüsusilə, nə biz aradığınız - Ben bu iPad yazmaq gedir -
xüsusilə, nə biz aradığınız bu xətt burada 6 saylı doğru deyil.
Və əvvəlki problem yalnız contiguity üçün 6 saylı oldu.
Biz nə istəyirik yaddaş dövlət göstərmək və ya etiket olunur
biz bu xətt 6 saylı həyata zaman, o
hansı səmərəli burada bizim svop funksiyası bir qayıdacaqsınız.
Burada aşağı diyirləyin, biz yaddaşında hər şey ünvanları bizim üçün ki, gördüm.
Bu, çox əsas, biz yalnız bir anda onu geri gəlmək lazımdır.
Və sonra aşağı burada altında, biz müraciət olacaq ki, bir az yaddaş diaqram idi.
Mən, həqiqətən, mənim iPad bu həyata görmüşük.
Mən yalnız istinad üçün iPad və bu kodu arasında geri və irəli alternativ gedirəm.
>> Nin başlamaq edək. Birincisi, sağ burada əsas xətləri ilk bir neçə diqqət edək.
Başlamaq üçün, 2-1-y x başlamaq olacaq.
Biz iki tam dəyişənlər var, belə ki, onlar yığını yerləşdiriləcək olacaq də.
Biz onlara bir 1 və 2 qoymaq olacaq.
Mən iPad üzərində flip Belə ki, inşallah, gəlin görək -
Apple TV aynalama, orada getmək. Okay.
Mən iPad üzərində flip Beləliklə, əgər,
I 2 1 və y x başlamaq istəyirəm.
Biz x qeyd qutusuna 1 yazmaqla sadəcə bunu
və qutusuna 2 y oldu. Olduqca sadə.
Belə ki, indi də laptop geri bildirin, sonrakı nə görmək.
Şeylər çətin aldığı bu növbəti xəttidir.
Biz parametrlər x ünvanı və y ünvan keçmək mübadilə funksiyası bir və b.
X və y-in ünvanı ünvanı, biz hesablamaq edə bilməz şeylər
Bu güllə istinad etmədən burada sağ aşağı göstərir.
Və xoşbəxtlikdən, ilk iki güllə xal cavab var tam olaraq nə bizə.
Yaddaş x ünvanı 10 və yaddaş y ünvanı 14.
Belə ki, bu kimi qəbul almaq dəyərlər bir və mübadilə funksiyası qədər üst b.
Belə ki, yenə bizim diaqram geri keçid, bir ildə 10 yaza bilərsiniz
b və 14.
Biz mübadilə davam yerləşir İndi bu nöqtəsidir.
Belə ki, daha laptop geri Flipping
biz mübadilə işləri yol tmp bir və mağaza nəticəsində ilk dereference görürük.
Belə ki, dereference operator Hey ", deyir. Ünvan olaraq dəyişən bir məzmunu müalicəsi.
Ki, ünvan saxlanılır nə gedin və yük ".
Nə dəyişən həyata yük bizim tmp dəyişən daxil saxlanılır gedir.
IPad geri Flipping.
10 müraciət getmək, biz ünvan 10 varible x bilirik ki,
biz yaddaş x ünvanı 10 ki güllə nöqtə bildirib, çünki.
Belə ki, biz, biz iPad bax, orada getmək 1 bu dəyəri əldə edə bilərsiniz
və tmp daxil yük.
Yenə bu yekun məzmunu deyil.
Biz vasitəsilə gəzmək olacaq və biz sonunda proqram bizim son dövlət almaq lazımdır.
Amma indi, biz tmp saxlanılan dəyəri 1 var.
>> Və burada tez sual var.
[Alexander] Bu dereference operatoru - yalnız dəyişən qarşısında ulduz hüququ var?
>> Bəli. Biz bir daha laptop geri çevirmek kimi dereference operator Beləliklə
sağ qarşısında bu ulduz edir.
Bu mənada, bu - Siz vurma operator ilə ziddiyyət
iki şeyi tələb edir dereference operator bir unary operatorudur.
Bir ikili operator fərqli bir dəyər müraciət
siz iki müxtəlif dəyərlər tətbiq yerləşir.
Belə ki, bu istiqamətdə olur.
Biz dəyəri 1 dolu və müvəqqəti tam dəyişən onu saxlanılır.
Növbəti xətti, biz daxil b məzmunu saxlamaq -
və ya, əksinə, biz b bir işarə olduğu yerə işarə edir ki, məzmunu saxlamayın.
Biz sol sağ bu təhlil etsək, biz dereference b edir
biz 14 müraciət edir, biz olduğunu tam qamarlamaq edir
və sonra, ünvanı 10 getmək gedir
və biz kosmosa b bizim dereference nəticəsində atmaq niyyətindəyik.
Biz bu bir az daha konkret edə bilər bizim iPad, geri Flipping,
Mən burada ünvanlar bütün nömrələri yazmaq əgər kömək edə bilər.
Belə ki, y, biz ünvan 14 bilirik ki, x ünvan 10 edir.
Biz b başlamaq zaman, biz dereference b, biz dəyəri 2 qapmaq olacaq.
Biz ünvan 14 yaşayır ki, dəyəri çünki bu dəyər işğalçı gedir.
Və biz, ünvanı 10 yaşayır ki, dəyişən onu qoymaq olacaq
olan dəyişən x müvafiq sağ var.
Belə ki, burada yadda bir az edə bilərsiniz
biz 1 qurtarmaq və əvəzinə biz 2 yazmaq yerləşir.
Belə ki, bütün indi üzerine x var baxmayaraq, yaxşı və dünyada yaxşı.
Biz tmp dəyişən x köhnə dəyər saxlanılır var.
Belə ki, biz növbəti xətti ilə mübadilə tamamlaya bilər.
Bizim laptop geri Flipping.
İndi bütün qalıqları bizim müvəqqəti tam dəyişən məzmunu çıxarmaq üçün
və b aparılır ki ünvanda yaşayan dəyişən onları saxlamayın.
Biz dəyişən əldə etmək üçün səmərəli dereference b olacaq
ki, b onu tutan ünvan edir
və biz tmp onu aparır ki, dəyəri mövzusu olacaq.
Bir daha iPad geri Flipping.
Mən burada 2 Bu dəyər silmək bilər
əvəzinə biz onu 1 sağ surəti lazımdır.
Sonra əlbəttə həyata ki, növbəti line -
biz laptop geri flip əgər - Bu nöqtəyə 6
biz diaqram tamamilə doldurulmuş etmək istəyirdi hansı nöqtəsində olan.
Belə ki, iPad üçün geri Flipping bir daha, yalnız belə ki, başa diaqram bilərsiniz
biz x bir ildə 10, b 14, tmp bir 1, 2, və y bir 1 var olduğunu görə bilərsiniz.
Bu barədə hər hansı sualınız var?
Bu yolu gəzmiş olan, daha məntiqli edirmi?
Az mənada etmək? İnşallah deyil. Okay.
>> Pointers çox çətin mövzu var.
Biz işləmək uşaqlar bir çox ümumi kəlam var:
"Göstəricilərinə anlamaq üçün, ilk göstəricilərinə anlamaq lazımdır."
Hansı mən çox doğru hesab edirəm. Bu istifadə almaq üçün bir müddət edir.
Çox faydalı edir, şəkillər püşkatma bu kimi yaddaş sxemlərinin püşkatma
və məsələn sonra misal sonra misal vasitəsilə gəzmək sonra,
bir az daha məntiqli və bir az daha məntiqli və bir az daha məntiqli başlarsınız.
Nəhayət, bir gün siz bütün tamamilə hakim olacaq.
Biz növbəti problem geçmek? Hər hansı sual qarşısında Bütün hüquqlar.
Belə ki, laptop geri çevirmek.
Biz növbəti problem problem sayı 33 fayl haqqında I / O.
Bu bir az üzrə kiçildin.
Problem 33 - Var?
>> [Daniel] Mən tez sual idi. Bu ulduz, və ya ulduz,
siz əvvəl bir ulduz istifadə dereferencing deyirlər.
Əvvəl işareti istifadə ne adlanan var?
>> Bu işareti əvvəl ünvan-nin operatorudur.
Belə in qədər geri hərəkət edək.
Üzr istəyirik. Mən belə Mən həqiqətən diyirləyin deyil zoom rejimində edirəm.
Biz burada həqiqətən tez bu kodu baxsaq,
yenə eyni şey baş.
Biz burada bu kodu baxsaq, bu xətt üzrə biz zəng, dəyişdirmək etmək Ü
bu işareti yalnız "ünvanı olan dəyişən x həyatını almaq." deyib
Sizin compiler sizin kodu tərtib edərkən,
faktiki fiziki yaşamaq üçün dəyişənlərin bütün yaddaş bir yer qeyd etmək üçün var.
Hər şeyi tərtib sonra və belə compiler, sonra nə edə bilər
ki, "Oh, mən ünvan 10 x qoydu. Mən ünvan 14 y qoymaq." bilir
O sizin üçün bu dəyərlər doldurmaq olar.
Belə ki, sonra ola bilər - o cümlədən və pass & y bu keçə bilər.
, Bu uşaqlar ünvanı almaq, həm də, zaman mübadilə funksiyası onları keçmək
Bu növ məlumat, burada bu int *, bu compiler deyir
"OK, biz tam dəyişən bir ünvan kimi bu ünvan tərcümə etmək olacaq."
Bir int bir ünvan kimi, bir xarakter dəyişən və ünvan fərqli
bir int bir 32-bit maşın, çəkir, çünki yer 4 bayt tutur
bir xarakter yalnız yer 1 byte tutur halbuki.
Belə ki, nə də bilmək vacibdir - yaşayır, nə dəyəri nə növü
da qəbul oldu ki ünvanda yaşayan
Siz ilə məşğul olduğunuz və ya ünvanı.
Bu yolla, siz neçə bayt məlumat faktiki olaraq RAM həyata yük bilirik.
Və sonra, bəli, sizin kimi bu dereference operator, xahiş edildi
gedir və müəyyən bir ünvan informasiya çatmaz.
Belə ki, burada bu dəyişən ilə deyir, ünvan olaraq bir məzmunu müalicə
ki, ünvan gedin və çıxarmaq, bir reyestrinə prosessor, yük daxil yükləmək
faktiki dəyərləri və ya ünvanda yaşayan məzmunu.
Hər hansı bir daha suallar? Bu yaxşı suallar var.
Bu da yeni terminologiya bir çox var.
Bu müxtəlif yerlərdə və və * görən, həmçinin funky növü var.
>> Bütün hüquqlar.
Belə ki, geri problem 33, fayl I / O.
Bu şeyi bir neçə baş edirəm ki, bu problemlərin biri idi.
Biri, bu, kifayət qədər yeni mövzu var.
Bu viktorina əvvəl pretty tezliklə təqdim edilib
və sonra mən bu riyaziyyat o söz problemlərdən biri kimi cür idi
Onlar sizə bir çox informasiya vermək, ancaq həqiqətən bir ton istifadə üçün olan qədər başa yoxdur.
Bu problem ilk hissəsi bir CSV faylı nə izah.
İndi, bir CSV fayl, təsviri görə, virgülle ayrılmış dəyərlər fayl.
Bu bütün maraqlı olduğunu səbəb və heç istifadə səbəbi,
Çünki, necə çox heç Excel kimi məhsulları istifadə olunur?
, Yəqin ki, və ya həyat bir nöqtədə istifadə edəcək ki, siz ən Şəkil.
Excel kimi bir şey istifadə edəcəyik.
Excel elektron tablo data çıxmaq və ya emal ilə hər cür etmək üçün,
Bir C proqram və ya Python proqram, Java proqram yazmaq istəyirdi əgər
orada saxlanılan var data ilə məşğul,
onu almaq üçün ən ümumi yollarından biri bir CSV fayl var.
Siz, dialoq "kimi saxla 'getmək zaman Excel açmaq bilər
Əgər faktiki CSV fayl əldə edə bilərsiniz.
>> Bu şeylər ilə məşğul necə Handy.
Bu işləri yolu ona oxşar ki, - mən demək, bu, mahiyyətcə bir elektron tablo imitasiya edir
yerləşir, biz burada görmək kimi, çox sol en tikə,
biz bütün son adları var.
Belə ki, biz sonra Malan, Hardison, sonra Bowden, MacWilliam, sonra Chan var.
Bütün son adları. Və sonra bir vergül ilk adları keçən adları ayırır.
David, Nate, Rob, Tommy və Zamyla.
Mən həmişə Robby və Tom qədər qarışdırılır.
Və sonra, nəhayət, üçüncü sütun e-poçt ünvanlarını deyil.
Ki, siz başa sonra, proqram qalan həyata keçirilməsi olduqca sadə deyil.
Biz C proqram bu eyni struktur taklit üçün etdik nə
biz bir quruluş istifadə etdiyiniz edilir.
Biz də bu bir az daha çox oynayan başlamaq lazımdır.
Biz lüğətlər ilə məşğul olan zaman problem set 3, ilk az onları gördüm.
Amma bu heyət struct son adı, adı və e-poçt saklar.
Yalnız CSV fayl kimi saxlanılması edilib.
Belə ki, bu yalnız bir format digər konvertasiya edilir.
Biz bir xəttə, bu halda, kadr struct çevirmək üçün
yalnız kimi bir vergül ayrılmış xətt.
Bu mənada edirmi? Siz uşaqlar bütün viktorina qəbul etmişdir
Mən ən azı bu barədə düşünmək üçün vaxt var düşünün.
>> Də kirayə funksiyası problem bizə etmək üçün xahiş - bu bir az üzrə we'll zoom -
, adı, s, bir ştat strukturu, bir heyət struct almaq
və staff.csv faylı onun məzmunu əlavə.
Bu istifadə etmək üçün kifayət qədər sadə ki, həyata çevirir.
Biz belə bir az daha bu funksiyaları gün ilə ətrafında oynamaq lazımdır.
Lakin bu halda, fprintf funksiyası həqiqətən vacibdir.
Belə fprintf ilə, sizə uşaqlar printf bu müddəti istifadə edilmişdir yalnız kimi çap edə bilərsiniz.
Siz fayl printf xətti bilərsiniz.
Yerine adi printf zəng edilməsi Belə ki, bu format string vermək yerləşir
və sonra, aşağıdakı dəlilləri ilə bütün dəyişənlər əvəz
fprintf ilə, ilk arqument əvəzinə sizə yazmaq istədiyiniz fayl.
Biz insan fprintf, misal üçün, cihaz bu baxmaq olsaydı
biz printf və fprintf arasında fərq görə bilərsiniz.
Mən burada bir az kiçiltmək lazımdır.
Printf ilə Beləliklə, biz bir format string verəcək, sonra sonrakı arqumentlər
bizim format string daxil dəyişdirilməsi və ya əvəz bütün dəyişənlər var.
Fprintf ilə Halbuki, ilk arqument həqiqətən bir axın adlanan bu file * edir.
>> Bizim kirayə burada artıq geri hərəkət
biz artıq file * axın bizim üçün açılan var.
Yəni bu ilk nə o, staff.csv fayl açır
bu əlavə rejimində o açır, bizə nə üçün sol ki, bütün
fayl üçün ştat strukturu yazın.
Və mən iPad istifadə etmək istəyirsiniz, gəlin görək?
Mən iPad istifadə edəcəyik. Biz etibarsız var - mən bir az daha yaxşı yaza bilər, belə müzakirə bu qoymaq edək -
kirayə ləğv və bu, bir arqument s adlı heyətinin strukturu edir.
Bizim aşırma var, biz, fayl adlı file * var
biz, bizə bizim fopen xətti
bu pedia artıq olduğundan və yalnız nöqtələr kimi yazmaq lazımdır.
Və sonra növbəti line, biz fprintf zəng etmək olacaq
və biz, biz çap istədiyiniz fayl keçmək olacaq
və sonra format string olan -
Mən sizə uşaqlar kimi görünür nə mənə bildirin lazımdır.
Necə haqqında, Stella? Siz format string ilk hissəsi kimi görünür nə bilirik?
[Stella] Mən əmin deyiləm. >> Jimmy xahiş çekinmeyin.
Siz, Cimmi bilirsinizmi?
[Jimmy] yalnız sonuncu istəyirsiniz? Bilmirəm. Mən tamamilə əmin deyiləm.
Okay. >> Necə haqqında, heç imtahan bu doğru əldə etdiniz?
Bütün hüquqlar No.
Burada biz bütün biz ştat strukturunun hər bir hissəsi istəyirəm ki, həyata çevirir
bizim fayla bir string kimi çap edilir.
Biz bir soyadı, çünki Biz yalnız simli əvəz xarakter üç müxtəlif vaxtlarda istifadə
vergül sonra, sonra bir ad, bir vergül sonra
və sonra nəhayət ki e-mail ünvanı izləyir - deyil
mənim ekranda uyğun - ancaq bir newline xarakteri təqib edir.
Mən yalnız aşağı orada yazmaq üçün gedirəm.
Və sonra, bizim format string aşağıdakı
biz yalnız biz dot notation istifadə daxil olan Əvəzedicilərimiz var
biz problem set 3 gördüm.
Biz s.last, s.first və s.email istifadə edə bilərsiniz
bizim format string o üç dəyərlər əvəz edilsin.
Belə ki, necə getdi? Mənada etmək?
Bəli? No? Ola bilsin? Okay.
>> Biz çap etdik və biz fayl açdı sonra sonra biz ki, son şey:
biz bir fayl açmıştınız zaman, biz həmişə yaxın unutmayın lazımdır.
Başqa biz yaddaş sızması çıxacağıq, çünki
fayl descriptors istifadə edərək.
Belə ki, biz funksiyasından istifadə, bunun yaxın? Daniel?
[Daniel] fclose? Dəqiq >> fclose.
Belə ki, bu problem son hissəsi, fclose funksiyası istifadə edərək, fayl düzgün yaxın idi
hansı ki, yalnız kimi görünür.
Çox crazy deyil.
Cool.
Belə ki, viktorina problem 33 var.
Biz I / O gələn mütləq daha çox fayl lazımdır.
Biz bu gün bu gün mühazirə bir az daha çox, və ya bölməsində olacaq
Bu qarşıdakı pset hissəsi yaratmaq üçün neler çünki.
Bu nöqtədə viktorina olan hərəkət edək. Bəli?
>> [Charlotte]] Nə əvəzinə fclose və fclose (fayl) (staff.csv)?
>> Ah. O çıxır ki, Çünki - belə sual, böyük bir olan,
Ona görə biz fclose yazmaq zaman, biz fclose (fayl) star dəyişən yazılı edilir
kimi fayl adı, staff.csv qarşı? Ki, doğru mu? Bəli.
Belə in nəzər salaq. Mən laptop geri keçmək varsa,
və ən fclose funksiyası baxaq.
Belə ki, fclose funksiyası axın bağlayır və biz yaxın istədiyiniz stream üçün pointer götürür
biz yaxın istədiyiniz faktiki fayl adı fərqli.
Bu, çünki pərdə arxasında, siz fopen zəng etmək zaman deyil
bir fayl açmaq, həqiqətən, fayl haqqında məlumat saxlamaq üçün yaddaş ayrılması edirik.
Belə ki, fayl haqqında məlumat var ki, fayl göstərici var
açıq var kimi, siz fayl hazırda burada onun ölçüsü,
oxuduğunuz və fayl ərzində xüsusi yer zənglər yazılı edə bilərsiniz ki.
Yerine fayl adı bağlanması göstərici bağlanması son.
>> Bəli? [Daniel] Belə kirayə istifadə etmək üçün, demək ki, - necə ki, bu istifadəçi daxil almaq deyil?
Fprintf yalnız istifadəçi daxil gözləmək lazımdır ki mənada GetString kimi hərəkət etmir
və bu yazın xahiş - və ya bu üç şeyi yazın üçün gözləmək?
Və ya kirayə həyata bir şey istifadə etmək lazımdır?
>> Bəli. Belə ki, biz deyilik - sualına, necə biz istifadəçi daxil ola bilmirəm edilib
kirayə həyata keçirilməsi üçün? Və biz burada, kiralama zəng edir
artıq struct saxlanılan məlumatların bütün bu heyət struct keçdi.
Belə fprintf yalnız fayl birbaşa məlumatlar yazmaq edə bilər.
Istifadəçi girişi gözləyir var.
Istifadəçi artıq düzgün bu heyət struct onu qoyaraq giriş verilmiş oldu.
Həmin göstəricilər hər hansı null əgər və hər şeyi, əlbəttə, qırmaq olacaq
belə biz burada geri gedin və biz struct oldu.
Biz simli son simli ilk simli email var.
İndi o, həqiqətən bütün başlıq altında, char * dəyişənlərin olduğunu bilirəm.
Bu null işarə bilər və ya.
Onlar yığın yaddaş işarə ola bilər
yığını ola bilər yaddaş.
Biz, həqiqətən, bilirik, lakin bu göstəricilər hər hansı null, və ya etibarsız deyilsə, yoxdur
mütləq bizim kirayə funksiyası qəza lazımdır ki,.
Bu imtahan çərçivəsindən kənarda cür idi ki, bir şey idi.
Biz narahat deyilik.
Böyük. Okay. Belə ki, viktorina olan hərəkət.
>> Bu oğlan yaxın edək və biz pset 4 baxmaq olacaq.
Uşaqlar da pset spec baxmaq əgər, bir dəfə siz onu istifadə edə bilərsiniz, cs50.net/quizzes,
biz bölməsində problemlər bu gün bir neçə ilə getmək niyyətindəyik.
Mən aşağı kaydırarak alıram - suallar bölməsində pset spec üçüncü səhifə başlayır.
Və ilk hissəsi yönlendirme və borular getmək və qısa izləmək üçün siz soruşur.
Sərin qısa cür idi, siz istifadə edə bilərsiniz ki, bəzi yeni, sərin command line tövsiyələr göstərir.
Və sonra biz də sizə bir neçə sual var.
Axınları haqqında Bu ilk sual, printf ismarıcları yazır olan,
biz belə bir an əvvəl yalnız bir az toxundu.
Biz yalnız müzakirə Bu fprintf onun dəlil kimi file * axın edir.
fclose, həmçinin bir file * axın edir
və fopen qaytarılması dəyəri kimi yaxşı bir file * axın verir.
Biz printf ilə məşğul olduğunuz zaman əvvəl görməmişik səbəbi
printf bir default axın var çünki.
Və yazır üçün u mənim axın
Siz qısa haqqında tapa bilərsiniz.
Belə ki, mütləq o nəzər.
>> Bu gün bölümünde, biz gdb haqqında bir az danışmaq olacaq
daha tanış siz bu olduğundan, daha çox təcrübə, siz onu almaq
daha yaxşı edə həqiqətən öz kodu hataları aşağı ov olacaq.
Bu olduqca qədər ayıklama prosesi sürətləndirir.
Belə printf istifadə edərək, hər zaman, sizin kodu derleyeceğiz ki, nə
yeniden çalıştırmak var, bəzən siz ətrafında printf zəng hərəkət etmək
kodunu şərh, yalnız bir müddət alır.
Bizim məqsədimiz cəhd və gdb ilə, mahiyyətcə bilər ki, razı deyil
printf sizin kodu hər hansı bir şey və bunu derleyeceğiz heç vaxt.
Siz başlamaq və harada printf növbəti guessing saxlamaq üçün heç vaxt.
Etmək üçün ilk şey bu xətt seçin və web bölməsində kodu off əldə etməkdir.
Mən "wget ​​http://cdn.cs50.net", deyir ki kodu bu xətt çıxarmaq alıram.
Mən kopyalamak üçün gedirəm.
Mən cihaz üzərində getmək üçün gedirəm, belə ki, mən edirəm nə görə bilərsiniz Uzaklaştırmak
orada köçürməklə yenidən, mən daxil edin hit zaman, bu wget komanda sanki bir web almaq edir.
Bu, internet bu fayl off açılan olacaq
və cari kataloq saxlamaq olacaq.
Mən cari kataloq siyahısını əgər İndi mən orada bu section5.zip fayl var olduğunu görə bilərsiniz.
Ki, oğlan ilə məşğul yolu, bu açın üçün
siz yalnız bu kimi command line edə bilər.
Section5.zip.
Bu açın lazımdır ki, mənim üçün qovluq yaratmaq
məzmunu bütün şişirdilir, burada qoydu.
Belə ki, indi mən cd komanda istifadə edərək Bölüm 5 dizine bilərsiniz.
Aydın istifadə ekran sil. Belə ki, ekran sil.
İndi ilə məşğul gözəl təmiz terminal var.
>> Mən bu qovluğu görmək bütün faylları siyahısını İndi əgər
buggy1, buggy2, buggy3 və buggy4: Mən dörd fayllar var olduğunu görürük.
Mən də onların müvafiq. C fayllar var.
Biz indi üçün. C faylları baxmaq fikrində deyilik.
Əksinə, biz gdb açmaq istifadə etmək olacaq.
Biz gdb istifadə etdiyiniz zaman, biz faktiki mənbə kodu çıxışı var ki, onların ətrafında saxlanılır sonra
lakin bölməsində bu hissəsi məqsədi gdb ətrafında misgər üçün
və biz bu dörd arabası proqramlar hər yanlış nə anlamaq üçün istifadə edə bilərsiniz necə.
Belə ki, yalnız, həqiqətən, tez oda ətrafında olacaq
və Mən arabası proqramlarının bir run kimsə xahiş gedirəm
və sonra, biz gdb bir qrup kimi gedəcəyəm və biz bu proqramların düzeltmek üçün nə edə görürsünüz
və ya ən azı onların hər səhv neler müəyyən etmək.
Daniel burada başlamaq edək. Siz buggy1 davam edəcək? Nə görmək edək.
[Daniel] Bu tətbiq günah var deyir. >> Bəli. Exactly.
Mən buggy1 run Belə ki, bir seg günah almaq.
Bu nöqtədə, mən getmək və buggy1.c qədər aça bilər
, cəhd və səhv nə anlamaq
lakin bu seg günah səhv haqqında ən obnoxious şeyi bir
bu proqram şeyi line həqiqətən yanlış getdi və qırdı nə sizə demək deyil ki.
Siz tipli kodu baxmaq
və tahmin istifadə anlamaq və yoxlamaq və ya printf yanlış gedir nə görmək.
Gdb haqqında keyfiyyətli şeylərdən biri həqiqətən, həqiqətən, asan ki,
xətti anlamaq üçün olan proqram qəzaları da.
Bu tamamilə belə yalnız ki, əgər istifadə etmək lazımdır.
Belə ki, gdb qədər çəkmə, mən gdb yazın, sonra mən qaçmaq istəyirəm ki, yürütülebilir üçün yol verir.
Burada gdb ./buggy1 yazaraq alıram.
Daxil Hit. Mənə bütün bu copyright məlumat verir
və aşağı burada "/ home / etibarən Oxu simvol deyir ki, bu xətti görürsünüz
jharvard/section5/buggy1 ".
Bütün yaxşı gedir varsa, bu kimi bir mesaj çap görəcəksiniz.
Bu simvol oxumaq lazımdır ki, "Mən, sizin faylı simvolları oxu edirəm" demək lazımdır
və o, burada bu "görülən" mesajı olacaq.
Bu digər variasiya görmək, və ya görürsünüzsə bu simvol tapa bilmədi
və ya kimi bir şey, nə o deməkdir ki, yalnız düzgün çalıştırılabilir tərtib deyil ki.
Biz gdb istifadə üçün proqramlar tərtib zaman, biz, xüsusi-g bayrağı istifadə etmək
Siz proqramları tərtib əgər ki, yalnız etmək yazaraq, default tərəfindən həyata
və ya arabası etmək və ya hər hansı bərpa etmək.
Amma siz cingilti ilə əl tərtib edirsinizsə, onda siz getmək və-g bayrağı daxil lazımdır.
>> Bu nöqtədə, indi bizim gdb tez var,
bu proqram çalıştırmak üçün olduqca sadə.
Biz ya run edə bilərsiniz, və ya biz yalnız r edəbilərsiniz.
Ən gdb əmrləri qısaldılmış ola bilər.
Adətən olduqca gözəl olan yalnız bir və ya bir neçə məktublar, üçün.
Siz r yazın və nə daxil edib Belə ki, Saad?
[Saad] Mən SIGSEGV, seqmentləşdirmə günah və sonra bütün bu anlamsız var.
>> Bəli.
Biz indi ekranda gördükdə kimi, və Saad bildirib kimi,
biz run və ya r yazın və Enter düyməsini basın zaman, biz hələ də eyni seg günah almaq.
Belə ki, gdb istifadə edərək problemi həll etmir.
Lakin bizə anlamsız verir və bu çıxır ki, bu anlamsız
bu baş yerləşir həqiqətən bizə deyir.
Bu bir az təhlil etmək üçün bu ilk bit hər şey yanlış gedir hansı funksiyası var.
Bu __ strcmp_sse4_2, ve bu fayl baş bizə deyir ki,
sysdeps/i386 adlanan bu, yenə bir mess cür - ancaq line 254.
Bu analiz üçün cür çətindir. Əgər bu kimi şeylər görmək Adətən zaman
ki, sistem kitabxanaların bir faulting seg ki, deməkdir.
Belə bir şey strcmp ilə. Siz uşaqlar əvvəl strcmp gördük.
Çox crazy, lakin bu strcmp strcmp ilə bir problem var ki, sınıq və ya ki demektir?
Siz, Aleksandr nə düşünürsünüz?
[Alexander] bu mu - 254 xətti var? Və - deyil ikili, lakin onların tavanlar deyil,
və hər bir funksiyası üçün başqa bir dil var. - Ki, funksiyası 254, və ya mi?
>> Bu line 254 var. Bu. S faylı kimi görünür, yəqin ki, bu toplantının kodu belə.
>> Ancaq mən, bir seg günah kazanılmış etdik, çünki daha çətin bir şey olduğunu təxmin
və strcmp funksiya geliyor kimi görünür,
bu demək deyil, o ki, strcmp sınıq olunur?
Bu ümid edirəm ki, lazımdır. Bir seqmentasiya günah var Belə ki, yalnız çünki
sisteminin funksiyaları biri, adətən ki, yalnız düzgün adlandırıb deyil deməkdir.
Nə həqiqətən gedən anlamaq üçün nə üçün ən qısa şey
bir seg günah görmək zaman bu kimi crazy şey görəndə,
siz çox yalnız əsas istifadə olan bir proqram var, xüsusilə də əgər
bir backtrace istifadə etməkdir.
Mən tam backtrace söz fərqli olaraq, bt yazmaqla backtrace qısaltmaq.
Amma Charlotte, siz bt yazın və hit daxil zaman nə olar?
[Charlotte] Bu, mənim iki xətləri, line 0 və 1 satır göstərir.
>> Bəli. Belə line 0 və 1 satır.
Bu proqram qəzaya zaman play-hazırda olan faktiki stack çərçivəsində edir.
Bu topmost çərçivəsində çərçivəsində 0-dan başlayaraq, və çərçivə 1 olan alt ən gedir.
Bizim topmost çərçivəsində strcmp çərçivəsində edir.
Siz bu biz yalnız göstəricilər ilə viktorina edir ki, problem kimi oxşar düşünmək olar
biz, əsas yığını çərçivəsində üst yığını çərçivəsində dəyişdirmək idi
və biz mübadilə əsas istifadə dəyişənlərin üst istifadə dəyişənlərin idi.
Burada qəza bizim əsas funksiyası adlanan bizim strcmp funksiyası, baş
və backtrace Bookmark şeyi uğursuz olan funksiyaları yalnız verir,
hər şey çağırılmış olduğu, həm də bizə izah edir.
Mən doğru bir az daha artıq hərəkət, əgər
biz Bəli, biz bu strcmp-sse4.s fayl line 254 idi ki, görürük.
Amma zəng buggy1.c, line 6 edilmişdir.
Biz yalnız kontrol və gedən nə görmək getmək bilər - biz nə edə bilərsiniz deməkdir ki,
buggy1.c, line 6.
Yenə bunu bir neçə yolu var. Bir gdb həyata çıxmaq üçün
və ya başqa kodu pəncərə və cross reference açılacaq var.
İndi ofis saat edirsinizsə, çünki O, özü-özlüyündə, olduqca lazımlı
və bir seg günah var və hər şey qırılma olduğu üçün TF, merak edir
yalnız "Oh, xətt 6, deyə bilərik. Mən nə bilmirəm
lakin line 6 şey mənim proqram pozmağa səbəb olur. "
Bunu başqa yol gdb siyahısına adlanan bu funksiyanı istifadə edə bilərsiniz.
Siz həmçinin l ilə qısaltmaq bilər.
Biz l hit əgər Beləliklə, biz burada nə əldə edirsiniz?
Biz qəribə məhsulları bütün dəstə almaq.
Bu faktiki toplaşmaq kodu
ki strcmp_sse4_2 edir.
Bu, funky cür görünür
və biz bu alıyorsanız səbəbi, hazırda Çünki
Gdb çərçivəsində 0 bizi var.
>> Belə ki, zaman biz baxmaq dəyişənlər, biz mənbə kodu baxmaq istənilən vaxt,
biz yığını çərçivəsində ilgili biz da hazırda olduğunuz mənbə kodu geçirdiğiniz
Belə mənalı bir şey almaq üçün, biz var
daha anlamlı bir yığın çərçivəsində hərəkət.
Bu halda, əsas yığını çərçivəsində bir az daha məntiqli olardı
əslində biz yazdı kodu idi.
Deyil strcmp kodu.
Biz iki çünki, bu halda, çərçivələr arasında hərəkət yolu,
biz, 0 və 1 var
Siz yuxarı ve aşağı əmrləri ilə bunu.
Mən bir çərçivəsində hərəkət edin
İndi əsas yığını çərçivəsində edirəm.
Mən idi geri aşağı hərəkət edə bilər
yenidən qalxmaq, daha aşağı getmək və yenidən gedin.
Əgər gdb sizin proqram varsa, bir crash almaq, siz backtrace almaq
və sizin neler bilmirəm ki, bəzi fayl olduğunu görürük.
Siz siyahısı cəhd, kodu, sizə tanış baxmaq deyil
Sizin çərçivəsində nəzər və siz harada həyata rəqəm.
Siz yanlış yığın çərçivəsində yəqin edirik.
Və ya ən azı, siz həqiqətən debug bilər ki, bir deyil, bir yığın çərçivəsində edirik.
İndi müvafiq yığını çərçivəsində istəyirik ki, biz, əsas etdiyiniz
indi biz xətti nə anlamaq üçün siyahıdan funksiyanı istifadə edə bilərsiniz.
Və görürük ki, bu burada bizim üçün çap.
Amma biz eyni siyahısını təşkil edə bilər, və siyahısı bizə bu gözəl printout verir
burada gedən olan faktiki mənbə kodu.
>> Xüsusilə, biz xətt 6 baxmaq olar.
Biz burada neler bilərsiniz.
Biz bir string müqayisə edirik kimi görünür
simli "CS50 süxurlar" və argv arasında [1].
Bu barədə bir şey şaqqıltılı edilib.
Missy Belə ki, burada neler bilər hər hansı bir fikir var?
[Missy] bu şaqqıltılı görə bilmirəm. Bu şaqqıltılı oldu niyə >> Siz bilmirəm?
Jimmy, hər hansı bir fikir?
[Jimmy] Mən tamamilə əmin deyiləm, amma biz string istifadə son dəfə müqayisə
və ya strcmp, biz bunu altında üç müxtəlif hallarda kimi idi.
Biz == yox idi, mən sağ ilk olaraq, düşünmürəm.
Bunun əvəzinə, üç ayrılmış və bir == 0 idi
biri idi <0, mən hesab edirəm və bir idi> 0.
Kimi Belə ki, bəlkə bir şey? >> Bəli. Belə ki, bu məsələ var
biz düzgün müqayisə edirlər?
Stella? Hər hansı bir fikir?
[Stella] Mən əmin deyiləm. >> Əmin deyil. Daniel? Düşüncələr? Okay.
Bu proqram qaçdı nə zaman burada baş deyil çıxır
Siz ilk dəfə proqram, Daniel, qaçıb zaman və biz seg günah var
Əgər command line arguments vermək idi?
[Daniel] No >> No Bu halda, argv dəyəri nə [1]?
>> Heç bir dəyəri yoxdur. >> Hüququ.
Yaxşı, heç bir müvafiq simli dəyər var.
Amma bəzi dəyəri var. Orada saxlanılır olur ki, dəyəri nədir?
>> A zibil dəyər? Bu halda, ya zibil dəyəri və ya >>,
bu argv serialın sonunda həmişə null ilə xitam verilir.
Beləliklə, nə həqiqətən saxlanılır oldu null var.
Başqa bir yolu deyil, onun vasitəsilə düşüncə çox, bu həll
onu çap cəhd edir.
Mən gdb istifadə böyük olduğunu deyirdi burada
istədiyiniz bütün dəyişənlər çap edə bilərsiniz, çünki bütün dəyərlər
Bu lazımlı-modabaz p komanda istifadə edərək.
Mən p yazın və əgər mən bir dəyişən və ya bir dəyişən adı dəyəri yazın
, argc demək, mən argc 1 görürük.
Mən argv çap etmək istəyirsinizsə, [0], yalnız belə bunu edə bilərsiniz.
Və gördük kimi, argv [0] həmişə proqram adı,
həmişə yürütülebilir adı.
Burada siz tam yol adı var bax.
Mən də çap edə bilərsiniz argv [1] və nə görmək.
>> Burada mistik dəyər bu cür var.
Biz bu 0x0 var.
Biz hexadecimal nömrələri haqqında söhbət zaman müddətinin əvvəlində saxla?
Və ya hex 50 təmsil haqqında pset 0 sonunda ki, az sual?
Biz CS hex nömrələri yazmaq yol, yalnız özümüzü çaşdırmaq deyil
decimal nömrələri ilə, biz həmişə 0x ilə prefiks deyil.
Beləliklə, bu 0x prefiks həmişə yalnız bir hexadecimal sayı aşağıdakı sayda şərh deməkdir
bir string kimi deyil, bir decimal sayı kimi, bir ikili sayı.
Sayı 5-0 hexadecimal cari sayı ildən.
Və decimal, 50 bir sıra.
Belə ki, bu biz disambiguate yalnız necə.
Beləliklə də 0 decimal olan 0x0 vasitəsi hexadecimal 0, ikili 0.
Bu, yalnız dəyəri 0 olacaq.
Bu null yaddaş, həqiqətən, nə ki çıxır.
Null yalnız 0-dir.
Burada element [1] null edir argv saxlanılır.
Beləliklə, biz bir null string üçün "CS50 süxurlar" string müqayisə çalışdığınız.
Belə null dereferencing, null at şeyi əldə etmək üçün çalışırıq,
o, adətən, seqmentasiya günah və ya baş başqa pis şeylər bir növ səbəb edir.
Və strcmp kontrol deyil çıxır ki,
siz null ki, bir dəyər qəbul etdik və ya deyil.
Əksinə, yalnız irəli gedir, onun şey üçün çalışır
bu çatışmazlıqlar seg əgər, bu çatışmazlıqlar seg və sizin problem var. Siz düzeltmek getmək üçün var.
Həqiqətən tez, bu problem necə düzeltmek bilər? Charlotte?
[Charlotte] Siz əgər istifadə kontrol edə bilərsiniz.
Belə ki, əgər argv [1] null deyil, == 0, sonra 1 qayıtmaq, və ya bir şey [anlaşılmaz].
>> Bəli. Belə ki, biz kontrol edə bilərsiniz kimi, bunu bir böyük yol
biz strcmp keçir üzeresiniz dəyəri argv [1] ki, null edilir?
Bu null, onda biz, abort tamam demək olar.
>> Bunu etmək üçün daha ümumi şəkildə argc dəyər istifadə etməkdir.
Siz əsas əvvəlində burada görə bilərsiniz
biz command line arguments istifadə zaman adətən ki, ilk test çıxarılmışdır
bizim argc dəyər biz gözləyirik nə olub olmadığını yoxlamaq üçün edir.
Bu halda, biz, ən azı iki dəlilləri bekliyorsanız
Bu proqram adı plus digər biri.
Biz burada ikinci dəlil istifadə üzeresiniz Çünki.
Belə ki, bizim strcmp zəng əvvəl əvvəlcədən test bir növ olan
argv ən azı 2 olub ki, testlər, həmçinin şey eyni cür edərdi.
Yenə proqram çalışan işləri biz görürük.
Siz həmişə, həqiqətən, gözəl olan gdb ərzində proqram yenidən başlada bilərsiniz.
Siz çalıştırabilirsiniz və siz proqram dəlilləri qəbul edərkən
Siz gdb qədər önyükleme zaman run Zəng zaman onlara keçmək deyil.
Bu yolla siz müxtəlif dəlilləri ilə hər zaman proqram invoking saxlaya bilərsiniz.
Belə ki, run və ya yenidən, mən r yazın bilər, və biz yazın əgər nə "salam" olur bax edək.
Daha əvvəldən başlamaq istəyirsinizsə, həmişə xahiş edəcək.
Adətən, daha əvvəldən başlamaq istəyirəm.
Və bu nöqtədə o yeniden daha, onu çap
biz mübahisə salam ilə, buggy1 çalışan olduğunuz proqram,
və bu standart çap, bu kədərli üz "Siz, D almaq", deyir.
Amma biz günah seg vermədi. Bu proses çıxış edib.
Belə ki, çox yaxşı görünür.
No daha seg günah, biz, bu, ötən etdi
ki, həqiqətən biz əldə edilmiş seg günah səhv olduğu kimi belə görünür.
Təəssüf ki, biz bir D. əldə edirik ki, bizə deyir
>> Biz geri kodu baxmaq və orada gedən nə görə bilərsiniz
nə həyata rəqəm - biz bir D. var ki, bizə izah nə
Bu printf bir D. var ki Bakalým, burada edilib
Biz siyahısını yazın Əgər yazaraq siyahısını saxlamaq kimi, bu, sizin proqram vasitəsilə aşağı iterating saxlayır
belə ki, sizin proqram ilk bir neçə xətləri göstərmək lazımdır.
Sonra siz növbəti bir neçə xətləri, və növbəti yığın və növbəti yığın göstərmək lazımdır.
Və aşağı getmək üçün çalışırıq saxlamaq lazımdır.
İndi biz "16 saylı sıra həyata girdi." Almaq lazımdır
Yalnız 15 xətləri var.
Bu baxımdan almaq və "mən nə etməliyəm?" Merak varsa, siz köməyi komanda istifadə edə bilərsiniz.
Kömək və sonra bir komanda adını vermək istifadə edin.
Və siz gdb Bookmark məhsullarının bütün bu cür verir baxın.
Bu "heç bir dəlil ilə, əvvəlki siyahı sonra və ya ətrafında on daha xətləri siyahıları, deyir.
Siyahısı - əvvəl on xətləri siyahıları - "
Belə siyahısına minus istifadə edək.
Və bu, 10 xətləri əvvəlki siyahıları, siz siyahısı ilə bir az ətrafında oynaya bilər.
Siz siyahısı, siyahısı edə bilərsiniz - siz hətta, siyahı 8 kimi, siyahıda bir sıra verə bilər
və line 8 ətrafında 10 xətləri listeleriz.
Əgər başqa bir sadə var və burada neler bilərsiniz.
Siz CS50 süxurların yazın, bu, "Siz A. olsun" çap
Əks halda o, "Siz D. olsun" çap
Bummer şəhər. Bütün hüquqlar. Bəli?
>> [Daniel] Mən quotes olmadan CS50 süxurların bunu cəhd zaman,
ki, "Siz D. olsun" deyir
Mən bu iş üçün quotes lazım; niyə ki?
>> Bəli. Bu çıxır ki, - bu başqa fun az yağlı tikə edir -
biz run Əgər, proqram run və biz CS50 süxurların yazın zaman,
kimi, Daniel o deyirdi, və Enter düyməsini basın
hələ biz D. almaq deyir
Və sual, niyə bu deyil?
Və bizim terminal və gdb də bu iki ayrı-ayrı arqumentlər kimi analiz çıxır ki.
Kimi nəzərdə tutulmuş olan bir yer var Çünki
ilk mübahisə sona çatdı; növbəti mübahisə başlamaq üçün edir.
Iki o birləşdirmək yolu və ya Bağışlayın, bir mübahisəyə,
quotes istifadə edir.
Biz quotes qoydu və yenidən run Belə ki, indi, biz A. almaq
Belə ki, yalnız recap üçün heç quotes, CS50, daş iki ayrı arqumentlər kimi ayrıştırılan olunur.
Quotes, bu cəmi bir arqument kimi ayrıştırılan edir.
>> Biz breakpoint bu görürük.
İndiyə qədər biz proqram çalışan etdik və bu, çalışan edilmişdir
ya bu çatışmazlıqlar və ya Xit səhv seg qədər
və ya çıxış edib və bütün tamamilə gözəl kadar.
Bəzən, çünki bu, mütləq ən faydalı şey deyil
Siz proqram bir səhv var, ancaq bir seqmentasiya günah səbəb deyil.
Bu dayandırmaq üçün proqram və ya bu kimi bir şey səbəb deyil.
Proqram xüsusi bir nöqtədə fasilə gdb almaq yolu
bir breakpoint müəyyən edir.
Siz ya bir funksiya adı bir breakpoint qəbulu ilə bunu edə bilərsiniz
və ya kodu müəyyən bir xətt üzrə breakpoint bilərsiniz.
Yadda asan, - çünki mən, funksiyası adları breakpoints qurmaq istəyirəm
və həqiqətən getmək və bir az qədər mənbə kodu dəyişdirmək əgər,
sonra breakpoint həqiqətən, sizin kodu müddətində eyni yerdə olacaq.
Halbuki siz xəttindən istifadə etdiyiniz və xətt nömrələri dəyişdirmək əgər
bəzi kodu əlavə edin və ya silin, çünki sonra breakpoints bütün tamamilə qədər berbat olunur.
Mən ən ümumi biri əsas funksiyası haqqında breakpoint müəyyən edilir.
Tez-tez mən gdb qədər önyükleme lazımdır, mən Enter, b əsas yazın lazımdır ki, bir breakpoint ayarlarsınız
yalnız deyir ki, əsas funksiyası haqqında, "tez çalışan başlamaq kimi proqram durdur"
və bu yolla, mən CS50 qayalar, demək, mənim proqram çalıştırdığınızda iki arqumentlər
və Enter düyməsini basın, bu, əsas funksiyası olur və doğru ilk xətti dayanır
bu strcmp funksiyası qiymətləndirir sağ əvvəl.
>> Mən durdurulmuş alıram-ci ildən, indi ətrafında mucking və nə görmeye başlamaq bilər
mənim proqram keçdi ki, müxtəlif dəyişənlərin bütün.
Burada argc çap və neler bilərsiniz.
Bu 3 müxtəlif dəyərlər var çünki argc, 3 görürük.
Bu proqram adı var, ilk dəlil və ikinci dəlil var.
Biz argv baxaraq həmin çap edə bilərsiniz [0], argv [1], və argv [2].
Bu strcmp zəng uğursuz gedir niyə İndi siz də görə bilərsiniz
Əgər bu iki ayrı-ayrı dəlilləri daxil CS50 və süxurların parçalamaq idi ki, çünki.
Bir breakpoint edib sonra bu nöqtədə, sizin proqram gezinmek üçün davam edə bilər
xətti ilə line kimi, yenə proqram başlayaraq qarşı çıxdı.
Daha və yalnız proqram başlamaq istəmirəm Belə ki, buradan davam
siz davam komanda istifadə edə bilərsiniz və davam sonuna proqramı davam edəcək.
Sadece burada olduğu kimi.
Mən proqram, CS50 süxurların yenidən başladın Lakin, bu, daha breakpoint edib
və bu zaman, əgər mən, proqram qalan bütün yol yalnız getmək istəmirəm
Mən də n qısaltmaq olan növbəti komanda istifadə edə bilərsiniz.
Bu line proqram line vasitəsilə addım olacaq.
Şeyi yerinə Beləliklə şeyi yenilənir almaq kimi, kimi dəyişənlərin dəyişiklik izləyə bilərsiniz.
Hansı olduqca gözəldir.
Digər sərin şey deyil, daha və üzərində eyni funksiyanı təkrar çox
yalnız Enter əgər - belə ki, burada mən bir şey Yığdığınız deyil bax -
Mən yalnız Enter, bu, əvvəlki komanda təkrar
və ya əvvəlki gdb komanda Mən daxil qoymaq
Mən Enter'a saxlamaq və xətti ilə mənim kodu xətt vasitəsilə gücləndirməklə davam edəcəyik.
Mən sizə uşaqlar digər arabası proqramlar, eləcə kontrol getmək üçün tavsiye ederim.
Biz onları bütün gün bölmə vasitəsilə almaq üçün vaxt yoxdur.
Bu mənbə kodu yoxdur, belə ki, neler bax cür bilərsiniz
Həqiqətən Zorlandığınız əgər pərdə arxasında,
lakin ən azı, yalnız gdb qədər önyükleme təcrübə
bu barədə pozur qədər, proqram çalışan
ki, backtrace əldə qəza idi fəaliyyət nə həyata figuring
nə line ki, bəzi dəyişən dəyərləri çap olub
ki, həqiqətən, sizin irəli gedən kömək edəcək, çünki yalnız belə ki, bunun üçün bir fikir almaq.
Bu nöqtədə, sizə q çıxmaq istifadə və ya sadəcə yoxdur ki, gdb həyata çıxmaq olacaq.
Proqram hələ çalışan orta və bu, çıxış deyilsə,
həmişə xahiş edəcək ", siz həqiqətən çıxmaq əminsinizmi?"
Siz yalnız bəli hit bilər.
>> İndi biz pişik proqramı olan biz növbəti problem baxmaq olacaq.
Siz yönlendirme və borular haqqında qısa watch varsa, Tommy bu proqram istifadə görürsünüz
ki, əsasən ekran bir fayl bütün çıxış görüntüler.
Mən pişik run Belə ki, əgər bu cihaz həqiqətən daxili proqram,
siz Mac varsa terminal açmaq əgər siz də Mac bunu edə bilərsiniz.
Və biz - pişik, nin, cp.c deyək və Enter düyməsini basın.
Bu nə, biz bir az yuxarı və biz line qaçdı yerləşir görürsünüzsə
və ya biz pişik komanda qaçdı yerləşir, bu, sözün yalnız ekran cp.c məzmunu çap.
Biz daha çalıştırabilirsiniz və birlikdə çox faylları bilər.
Beləliklə, siz pişiyi cp.c edə bilərsiniz, sonra biz də cat.c fayl concatenate bilər
ki, biz yazmaq etdiyiniz proqram
və bu, bizim ekran geri geri həm faylları çap edəcəyik.
Biz bir az yuxarı Belə ki, görürük ki, biz bu pişik cp.c, cat.c, qaçıb zaman
ilk bu cp fayl çap və sonra aşağıda, sağ aşağı burada cat.c fayl çap.
Biz yalnız bizim ayaqları yaş almaq üçün istifadə olacaq.
Terminal üçün sadə çap ətrafında Play ki, necə işlədiyini görmək.
Uşaqlar gedit cat.c ilə açmaq varsa, Enter
Əgər yazmaq haqqında olduğunu proqram bilərsiniz.
Biz bu gözəl qazan boşqab daxil sonra, biz bütün ki, yazmağa vaxt sərf etmək yoxdur belə.
Biz də daxil keçdi arqumentlər sayı yoxlamaq
Biz gözəl istifadə mesaj çap.
>> Bu, təkrar kimi söhbət etdik ki, şey növ
demək olar ki, əzələ yaddaş kimi.
Just məhsulları eyni cür bunu saxlamaq unutmayın
və həmişə faydalı mesajı bir növ həyata çap
ki, insanların proqram run necə bilirik.
Pişik, bu olduqca sadə, biz yalnız müxtəlif arqumentlər bütün vasitəsilə getmək olacaq
ki, proqram qəbul edilmişdir və biz çap olacaq
bir zamanda ekran biri onların məzmunu həyata.
Ekran faylları çap etmək üçün, biz çox oxşar bir şey olacaq
biz Yarışmanın sonunda nə etdi.
Proqram işə ki, viktorina, sonunda biz bir fayl açmaq idi
və sonra onu çap idi.
Bu halda, bir fayl açmaq olacaq və biz əvəzinə oxu olacaq.
Sonra əvəzinə bir fayl üçün, çap olacaq, biz ekran çap olacaq.
Belə ki, bütün printf ilə əvvəl etdiyiniz ekran çap.
Belə ki, çox crazy deyil.
Amma bir fayl oxu qəribə növ edir.
Biz bir zaman bir az keçmək lazımdır.
Uşaqlar üçün viktorina, problem 33, ki, son problem geri getmək Əgər
biz burada nə olacaq ki, ilk line, fayl açılması, biz nə idi çox oxşardır.
Stella Beləliklə, biz bir fayl açmaq zaman kimi o xətt göz edir?
[Stella] Capital Resim *, fayl - >> OK. >> - Fopen bərabərdir. >> Yup.
Bu halda hansı? Bu şərhi var.
>> Bu comment var? argv [i] və r?
Məhz >>. Hüququ haqqında. Belə ki, Stella tamamilə doğru.
Bu xətt kimi görünür.
Biz bir fayl axın dəyişən almaq Resim * onu saxlamaq üçün gedir, belə ki, etdiyiniz bütün caps,
Resim, * və bu dəyişən adı fayl olacaq.
Biz istəyirəm nə zəng edə bilər. Biz istədiyiniz nə olursa olsun, bu first_file ya file_i zəng edə bilər.
Və sonra fayl adı bu proqram üçün command line üzrə qəbul edilib.
Belə ki, argv saxlanılan var [i], sonra oxumaq rejimində bu faylı açmaq olacaq.
Biz fayl açmıştınız İndi ki, biz həmişə bunu unutmayın ki, bir şey
biz bir fayl açmıştınız zaman? Bağlayın.
Missy Belə ki, necə bir fayl yaxın edirsiniz?
[Missy] fclose (fayl) >> fclose (fayl). Exactly.
Böyük. Okay. Biz burada comment etmək üçün bu da baxsaq,
o "Açıq argv [i] və stdout onun məzmunu çap." deyir
>> Standard həyata qəribə adıdır. Stdout deyərək yalnız bizim yoldur
biz terminal çap etmək istəyirik, biz standart output stream onu ​​çap etmək istəyirəm.
Biz, həqiqətən, burada bu comment xilas edə bilər.
Mən bunu seçin və biz nə olduğundan yapışdırıb gedirəm.
Bu nöqtədə, indi bit ilə fayl bit oxumaq lazımdır.
Biz oxu faylları yolları bir neçə müzakirə etdik.
Hansı isə bu günə qədər Seçilmişlərə var?
Hansı yolla siz görüldü və ya faylları oxumaq üçün xatırlayırsınız?
[Daniel] fread? >> Fread? Belə fread biridir. Jimmy, hər hansı digər bilirik?
[Jimmy] No >> OK. Xeyr. Charlotte? Aleksandr? Hər hansı digər? Okay.
Belə ki, digər isə biz çox istifadə lazımdır ki, bir fgetc edilir.
Də fscanf var; uşaqlar burada bir model görmək?
Onlar bütün f ilə başlayır. Bir fayl ilə bir şey.
Fread, fgetc, fscanf var. Bu oxu funksiyaları bütün var.
Biz fwrite var yazılı, biz yerinə fgetc və fputc var.
Biz də fprintf biz viktorina gördüm kimi var.
Bu faylı oxu əhatə edən bir problem, ildən
biz bu üç funksiyanı biri istifadə olacaq.
Biz burada bu funksiyaların aşağı istifadə etmək fikrində deyilik.
Bu funksiyaları bütün standart I / O kitabxana var.
Bu proqram üst baxmaq, əgər
biz artıq standart I / O kitabxana üçün header fayl daxil olduğunuz görə bilərsiniz.
Biz anlamaq istəyirsinizsə, bir biz istifadə etmək istəyirsinizsə,
biz həmişə man pages açmaq olar.
Beləliklə, biz insan stdio yazın
və C. ildə stdio giriş və çıxış funksiyaları haqqında bütün oxumaq
Və biz artıq oh, baxmaq bilərsiniz. Bu fgetc qeyd edir ki, fputc qeyd edir.
Beləliklə, siz fgetc bir az aşağı qazılması və baxmaq, demək olar
və onun insan səhifə baxırıq.
Siz digər funksiyaları bütün dəstə ilə yanaşı gedir ki, görmək olar:
fgetc, fgets, getc, getchar, olur, ungetc və simvollar və strings onun girdi.
Belə ki, bu, bizim standart daxil faylları olan simvol və strings oxumaq necə
olan istifadəçi əhəmiyyətli deyil.
Bu biz faktiki C. bunu necə
Belə ki, bu GetString və GetChar funksiyaları istifadə edərək deyil
biz CS50 kitabxana istifadə edir.
Biz yolları bir neçə bu problem nə olacaq
ki, siz bunu iki müxtəlif yollarla bilərsiniz.
Bu fread Daniel qeyd funksiyası və fgetc həm bunu yaxşı yol.
Yalnız çünki gördüyünüz kimi mən, fgetc bir az daha asan hesab
bir dəlil, biz xarakter oxu çalışdığınız ki Resim *
və onun qaytarılması dəyəri int edir.
Bu doğru, bir az qarışıqdır?
>> Biz bir xarakter əldə edirik, çünki nə bu qaytarılması bir char deyil?
Siz uşaqlar bu char qayıtmaq bilər nə hər hansı bir fikir var?
[Missy cavab anlaşılmaz] >> Bəli. Belə ki, Missy tamamilə doğru.
Bu ASCII varsa, bu tam faktiki char eşlenen bilər.
Bir ASCII xarakter ola ki, doğru bilmədi.
Bu dəqiq nə var.
Daha bit var sadəcə Biz int istifadə edirik.
Bizim char yalnız 8 bit var, bizim 32-bit maşın 1 byte ki; bir char çox böyükdür.
Və int alan bütün 4 bayt 'dəyər var.
Və bu yol fgetc işləri çıxır ki,
biz bu adam səhifə bir az bizim referat aşağıya fırladın əgər,
bütün yol aşağı diyirləyin. Onlar EOF adlı bu xüsusi dəyər istifadə çıxır.
Bu fgetc funksiyası qaytarılması dəyər kimi xüsusi daimi var
Dosyayı sonunda basın və ya bir səhv almaq. zaman
Və bu, düzgün EOF bu müqayisə etmək çıxır ki,
bir int siz ki, informasiya ki, əlavə məbləğ olsun
kimi char dəyişən istifadə edərək qarşı çıxdı.
Fgetc səmərəli, bir faylı bir xarakter əldə baxmayaraq
siz növü int var ki, bir şey qaytarılması olduğunu xatırlamaq istəyirəm.
Bu istifadə etmək üçün kifayət qədər asandır, bildirib.
Bu, bizim bir xarakter vermək olacaq; biz nə üçün bütün fayl tələb saxlamaq deyil,
"Mənə növbəti xarakter vermək, mənə növbəti xarakter vermək, mənə növbəti xarakter verin"
biz fayl sonuna almaq qədər.
Və bu, bizim faylı bir zaman bir xarakteri çəkəcəyəm
və sonra biz bu kimi nə edə bilərsiniz.
Biz onu saxlaya bilərsiniz, biz bir string əlavə edə bilərsiniz, biz bunu çap edə bilərsiniz.
Ki, hər hansı etməyin.
>> Həyata geri yakınlaştırma və cat.c proqram geri gedir,
biz fgetc istifadə etmək olacaq əgər,
necə kodu bu növbəti line müraciət bilər?
Biz istifadə olacaq - fread az fərqli bir şey olacaq.
Və bu zaman, biz yalnız bir-bir xarakter üçün fgetc istifadə olacaq.
Bütün fayl emal üçün, nə biz ola bilər?
Bir fayl neçə simvol var?
Bir çox var. Beləliklə, siz yəqin ki, bir almaq istəyirəm
və sonra başqa bir almaq və digər almaq və digər almaq.
Biz burada istifadə üçün ola bilər alqoritm hansı fikirdəsiniz?
Ne tür - Loop üçün [Alexander] A? Məhz >>.
Loop bir növü.
Loop üçün bu halda, həqiqətən böyükdür.
Siz bütün fayl ərzində loop istədiyiniz kimi Və deyirdilər kimi, bu səsləri
bir anda bir xarakter əldə.
Kimi baxmaq bilər ki, nə hər hansı təkliflər?
[Aleksandr anlaşılmaz]
>> OK, yalnız Siz çalışdığınız nə İngilis mənə? [Aleksandr anlaşılmaz]
Biz yalnız bütün fayl üzərində loop çalışdığınız kimi bu halda, səslənir.
[Alexander] Belə i > Həcmi -
Mən, faylın ölçüsü tahmin? Ölçüsü - we'll yalnız bu kimi yazın.
Vaxt üçün fayl ölçüsü olan, i + +.
Belə ki, bu fgetc istifadə edərək, və nə şəkildə bu yeni çıxır ki,
yalnız bir fayl ölçüsü üçün asan bir yol var ki,
əvvəl gördüm ki, tikintisi bu "sizeof" tipli ilə.
Biz fgetc funksiyasından istifadə edərkən, biz bir növ təqdim edirik
loop üçün yeni, funky sintaksis, harada yerine bir əsas counter istifadə
xarakteri ilə xarakter getmək üçün, biz, bir-bir xarakter çəkmək olacaq
bir zamanda xarakter, və biz bilirik yolu biz sonunda edirik
biz simvol müəyyən sayda sayılır etdik halda,
lakin biz çıxarmaq karakter fayl xarakterli xüsusi sonu olur.
Mən bu ch zəng və biz başlamaq olacaq - biz bu edə bilərsiniz
fayl həyata ilk xarakter almaq üçün ilk zəngi ilə.
Burada bu hissəsi Belə ki, bu faylın bir xarakter çıxmaq niyyətindədir
və dəyişən ch onu saxlamaq.
Biz fayl sonuna almaq qədər bunu saxlamaq olacaq,
hansı ki, xüsusi EOF xarakter bərabər olmayan xarakter üçün test ilə ediləcək.
Yerinə ch edir və sonra + +, olan yalnız, dəyəri arttırmayı ki,
biz fayl A həyata, A, demək paytaxtı oxumaq, əgər
ch + + Bookmark b verəcək, sonra biz c və sonra d almaq istiyorum.
Yəni biz istədiyiniz nə aydın deyil. Biz burada istədiyiniz
Bu son bit biz faylı növbəti xarakter almaq istəyirik.
>> Belə ki, necə biz faylı növbəti xarakter ala bilər?
Necə fayl ilk xarakter ala bilərəm?
[Tələbə] fgetfile? >> Fgetc, və ya, sorry, siz tamamilə doğru idi.
Mən orada yanlış yazılmış. Bəli belə.
Burada yerinə ch edir + +,
biz yalnız daha fgetc (fayl) zəng olacaq
və eyni ch dəyişən nəticəsində saxlamayın.
[Tələbə sual, anlaşılmaz]
Bu Resim * uşaqlar xüsusi olduğu >> edir.
Onlar iş yolu onlar - ilk açtığınızda - ilk ki fopen zəng zaman,
fayl * səmərəli fayl əvvəlinə bir göstərici kimi xidmət edir.
Və sonra fgetc zəng hər zaman, bu fayl vasitəsilə bir xarakter hərəkət edir.
Bu zəng Belə olduqda, bir xarakteri ilə fayl göstərici incrementing edirik.
Və yenə fgetc zaman, başqa bir xarakter hərəkət edirik
və başqa xarakter və başqa xarakter və başqa xarakter.
[Tələbə sual, anlaşılmaz] >> Və that's - Bəli.
Bu başlıq altında bu sehrli növü var.
Siz yalnız vasitəsilə incrementing saxlamaq.
Bu nöqtədə, həqiqətən bir xarakter ilə işləmək istəyirik.
Belə ki, necə biz indi, ekran bu çap bilər?
Biz əvvəl istifadə etdiyiniz printf şey istifadə edə bilərsiniz.
Biz bütün semestr istifadə etdiyiniz.
Biz printf zəng edə bilərsiniz
və biz yalnız belə xarakter keçə bilər.
Bunu başqa bir yolu deyil, printf istifadə və bu format string nə olan çox
biz də digər funksiyaları biri istifadə edə bilərsiniz.
Biz ekran bir karakter yazdıran hansı fputc istifadə edə bilərsiniz
biz fputc baxsaq axşamı - Mənə bir az kiçiltmək bildirin.
Biz nə gözəl ki, biz fgetc istifadə edərək, oxumaq ki, xarakter alır görmək
lakin sonra onu çap axın vermək lazımdır.
Biz həmçinin standart həyata birbaşa qoymaq olan putchar funksiyası istifadə edə bilərsiniz.
Belə ki, çap üçün istifadə edə bilərsiniz ki, müxtəlif variantları bütün dəstə var.
Onlar standart I / O kitabxana, bütün edirik.
Yazdırmak, istədiyiniz zaman - belə printf, ismarıcları, sel həyata xüsusi standart çap edəcək
ki stdout olan.
Belə ki, biz yalnız bu sehrli dəyəri, burada stdout növü kimi müraciət edə bilərsiniz.
Üzr istəyirik. Kənarda nöqtəli vergül qoyun.
>> Burada yeni, funky bir çox informasiya var.
Bu bir çox bu kodu mənada ki, çox idiomatik edir
ki, oxumaq üçün asan oxumaq təmiz yalnız çünki bu şəkildə yazılmışdır.
Bunu çox fərqli yollarla istifadə edə bilərsiniz bir çox müxtəlif funksiyaları var
lakin biz yalnız üzərində həmin nümunələri riayət edirlər.
Daha və yenidən gələn bu kimi kodu görmək Belə ki təəccüb etməyin.
Bütün hüquqlar. Bu nöqtədə, biz gün qırmaq lazımdır.
Gəldiyiniz üçün təşəkkür edirik. Siz online olduğunuzda, əgər izləmək üçün təşəkkür edirik. Biz gələn həftə siz görəcəksiniz.
[CS50.TV]