[Powered by Google Translate] [Bölmə 6] [Daha Rahat]
[Rob Bowden] [Harvard Universiteti]
[Bu CS50 edir.] [CS50.TV]
>> Biz suallara bizim bölməsinə rəhbərlik edə bilər.
Mən əvvəl yerin URL göndərdi.
Suallar bölməsində başlanması demək-
yəqin çox asan sual unsick-dir tamamilə deyiləm
valgrind olunur yalnız nə?
Valgrind nə edir?
Hər kəs valgrind nə demək istəyirəm?
[Tələbə] Checks yaddaş sızıntıları.
Bəli, valgrind ümumi yaddaş checker edir.
Əgər hər hansı bir yaddaş sızıntıları varsa, sonunda, sizə deyir
siz istəyirsinizsə çünki üçün istifadə etdiyiniz nə çox deyil
problem müəyyən və ya istəyirsinizsə, yaxşı
böyük board almaq, siz heç bir yaddaş sızıntıları lazımdır
və halda, siz tapa bilərsiniz bir yaddaş sızıntısı var
bir fayl açmaq zaman da unutmayın
və bunu yaxın olmayan, bir yaddaş sızıntısı var.
>> Bir çox onlar azad deyilik ki, bəzi node axtarır
zaman, həqiqətən, onlar ilk addım lüğət bağlamamışlar.
Bu da, hər hansı bir yalnış varsa oxuyur sizə deyir və ya yazır
siz cəhd və bir dəyər əgər deməkdir
ki yığın sonunda kənarda və bu seg günah nə deyil
lakin valgrind, həqiqətən orada yazılı edilməməlidir kimi olarsınız
və siz mütləq o ya hər hansı olmamalıdır.
Necə valgrind istifadə edirsiniz?
>> Bu ümumi bir sual
cür çalıştırın və çıxış oldu.
Çıxış dəfə çox böyük olunur.
Bəzi olduqca yanlış şey varsa yerləşir əyləncə səhvlər də var
bir loop baş, o, nəhayət, "Yol çox səhvlər deyəcəklər.
İndi sayılması dayandırmaq üçün gedirəm. "
Bu əsasən analiz ki, mətn çıxış edir.
Sonda, bu, siz ki, hər hansı bir yaddaş sızıntıları izah edəcək
faydalı neçə bloklar, ola bilər, çünki
bir blok unfreed varsa, o, tapmaq üçün adətən asandır
1000 blokları unfreed çox.
Unfreed 1000 blokları yəqin ki, siz azad deyilik deməkdir
müvafiq və ya bir şey sizin bağlı siyahıları.
Bu valgrind edir.
>> İndi biz suallar bizim bölməsi
hansı yükləmək lazım deyil.
Siz mənim adını basın və kosmik onları qoparmaq bilər.
İndi mənə basın.
Revision 1 biz ilk edirik hansı yığını olacaq.
Revision 2 növbə olacaq və Revision 3 story bağlı siyahı olacaq.
Bizim yığını ilə off başlayır.
Burada dediyi kimi, bir yığın, ən əsas biri
informatika fundamental data strukturlar.
Çox prototip nümunəsidir
yemək salonunda qablar və yığını.
Bir yığın təqdim olunur zaman ki, əsasən var
kimsə, demək gedir "qablar bir yığın kimi, Oh".
Siz qablar stack up.
Sonra zaman bir tray çəkin gedin
çıxardı əldə olan ilk tray yığını qoymaq ki, son biridir.
Bu da-kimi yığını burada deyir
biz yığını adlı yaddaş seqmentinin var.
Və niyə yığını adlanır?
>> Çünki bir yığın data strukturu kimi,
bu yığını haqqında yığını çərçivəsində itiyor və pops
yığını çərçivəsində bir funksiyası xüsusi bir zəng kimi burada var.
Və bir yığın kimi, her zaman geri olacaq
funksiyası zəng daha aşağı yığın çərçivəsində daxil aşağı almaq bilər.
Siz əsas zəng foo zəng bar və əsas birbaşa bar geri ola bilməz.
O, həmişə təzyiq və yaratma düzgün yığını riayət var.
Iki əməliyyatları, dediyim kimi, push və pop edir.
Bu universal şərtlər var.
Siz destesi heç nə baxımından təkan və pop bilməlidir.
Biz sıralarında müxtəlif növ var görəcəksiniz.
Bu, həqiqətən bir universal müddəti deyil, təkan və pop baca üçün universaldır.
Push yalnız yığını qoyulur.
Pop yığını çıxarmaq deyil.
Və biz, biz typedef struct yığını var burada
biz char ** strings var.
Hər ** tərəfindən qorxuram almaq etməyin.
Bu strings bir sıra olan qədər başa gedir
simvol göstəricilərinə və ya bir sıra hallarda
simvol göstəricilərinə strings olur.
Bu strings olmaq deyil, burada onlar strings olmaq olacaq.
>> Biz strings bir sıra var.
Biz yığını hazırda nə qədər çox elementləri təmsil edən bir ölçüsü var,
və biz yığını nə çox elementləri ola bilər olan qabiliyyəti var.
Gücü, 1-dən böyük bir şey kimi başlamaq lazımdır
lakin ölçüsü 0 kimi başlamaq niyyətindədir.
İndi, bir yığın hesab edə bilər üç müxtəlif yollarla əsasən var.
Bəli, orada yəqin ki, daha çox, lakin iki əsas yolları
bir sıra istifadə edərək həyata keçirə bilər, və ya bir bağlı siyahısını istifadə edərək həyata bilər.
Əlaqəli siyahıları növ olan bacalar etmək mənasız edir.
O, bağlı siyahıları istifadə edərək, bir yığın etmək çox asandır
belə ki, burada biz, diziler istifadə yığını etmək olacaq
və sonra seriallarda istifadə edərək, bu barədə düşünmək iki yol da var.
Əvvəl, mən deyəndə ki, biz yığını üçün gücü
biz yığını bir element uyğun bilər.
>> Bu ola bilər bir yolu kimi tezliklə 10 elementlər hit, sonra Bitirdiğinizde edir.
Siz dünyada 10 şeylər bağlı bir üst olduğunu bilirik bilər
sizin yığını haqqında 10-dan çox şeyi heç vaxt lazımdır ki,
Bu halda sizin yığını olan ölçüsü bağlı bir üst ola bilər.
Yoxsa, sizin yığını ucu-bucağı olmamaq ola bilər
bir sıra edirik amma əgər ki, hər bir zaman 10 elementlər edib o deməkdir ki,
20 elementlər hit zaman sonra, 20 elementləri inkişaf üçün gedən və edirik
30 elementlər və ya 40 elementlər üçün array inkişaf etmək olacaq.
Siz burada nə olacaq nə olan gücü, artırmaq lazımdır olacaq.
Biz yığını maksimum ölçüsü çatmaq hər bir zaman
başqa bir şey basmaq zaman, biz artırılması lazım olacaq.
Burada təkan bool push (char * küç) kimi bəyan etmisiniz.
Char * küçəsi, biz yığını üzərinə basmaqla ki dizesidir
və bool yalnız biz nail ya uğursuz olub deyir.
>> Necə biz uğursuz ola bilər?
Siz hesab edə bilər ki, yalnız hal nədir
biz saxta qayıtmaq lazımdır harada?
Bəli.
[Tələbə] tam və biz həmsərhəddir icrası istifadə edirsinizsə.
Bəli, belə ki, biz müəyyən-o nə cavab
tam və biz bir Məhdud həyata kullanıyorsanız.
Sonra biz mütləq yalan qayıdacaqlar.
Kimi tezliklə biz serialın 10 şeylər edib, biz 11 uyğun bilməz, biz saxta qayıtmaq belə.
Bu hədsiz ne olur? Bəli.
Əgər nədənsə array genişləndirmək bilməz.
Bəli, belə yaddaş, məhdud resurs deyil
və nəhayət, biz yenidən üzərində yığını üzərinə basmaqla şeyi saxlamaq əgər,
biz uyğun böyük bir sıra cəhd və ayrılması olacaq
biz istifadə etdiyiniz böyük gücü və malloc və ya hər hansı saxta geri gedir.
Yaxşı, malloc null qayıdacaqlar.
>> Unutmayın, heç malloc zəng hər zaman, görmək yoxlanılması edilməlidir, əgər
null qayıtdıqda və ya başqa bir düzgün çıxılmaqla edir.
Biz qeyri-məhdud yığını olsun ildən,
biz cəhd əgər biz yalan qaytarılması olacaq etdiyiniz yalnız halda
gücü və malloc artırmaq və ya saxta qaytarır nə.
Sonra pop, dəlilləri yox edir
və yığını üst olduğunu string qaytarır.
Nə olursa olsun ən son yığını haqqında sövq edilib, geri nə pop edir
və bu da yığını rədd et.
Və yığını haqqında heç bir şey yoxdur, əgər null qaytarır fark.
Bu yığın boş olduğunu həmişə mümkündür.
Java, siz ki, və ya digər dillərdə üçün istifadə edirsinizsə,
boş yığını olan pop çalışır istisna və ya bir şey səbəb ola bilər.
>> Lakin C, null biz bu problemlərin öhdəsindən necə hallarda bir çox növüdür.
Null Geri biz yığını boş olduğunu demek olacaq necə.
Biz, sizin yığını funksionallığı test kodu verdik
itələmək və pop həyata keçirir.
Bu kod çox olmayacaq.
Mən-faktiki olaraq, biz bunu əvvəl, işarə, işarə-
siz onu görməmişik, əgər malloc yalnız funksiyası deyil
ki, sizin üçün yığın yaddaş ayırır.
Alloc funksiyaları bir ailə var.
Ilk alıştığınız olan malloc edir.
Sonra malloc eyni şey etdiyi calloc, var
amma bu sizin üçün hər şeyi sıfır olacaq.
Heç bir şey mallocing sonra null hər şeyi təyin etmək istəyirdi varsa
yalnız əvəzinə yazılı ilk növbədə calloc istifadə etməli
yaddaş bütün məhəllə həyata sıfıra loop üçün.
>> Realloc, malloc kimi xüsusi hallarda bir çox
lakin əsasən realloc nə edir
artıq ayrılıb bir pointer edir.
Realloc burada diqqət istəyirəm funksiyasıdır.
Artıq malloc döndü ki, bir pointer edir.
Gəlin siz malloc dən 10 bayt göstərici tələb deyirlər.
Sonra, siz 20 bytes istədiklərini reallaşdırmaq
belə ki, 20 bayt ilə pointer haqqında realloc zəng
və realloc sizin üçün avtomatik olaraq hər şey üzərində surəti olacaq.
Yalnız 10 bytes blokunun var kimi, yenə malloc çağırıb. Əgər
İndi 20 bayt bloku lazımdır
Mən malloc 20 bayt, onda mən əl ilk şey olan 10 bytes üzərində surəti var
ilk şey ikinci şey daxil və sonra pulsuz.
Realloc sizin üçün ki, idarə edəcək.
>> Imzası etibarsız * olacaq bildirək
olan yalnız yaddaş blokunun bir pointer qayıdır
sonra boşluq * Ptr.
Siz ümumi göstərici kimi etibarsız * hesab edə bilər.
Ümumiyyətlə, siz etibarsız * ilə məşğul heç
lakin malloc bir boşluq * qaytarılması və sonra kimi istifadə
Bu, həqiqətən, char * olacaq.
Malloc geri ki Əvvəlki etibarsız *
indi ölçüsü sonra realloc qəbul olunacaq, və
siz ayrılması istəyirəm bayt yeni sayı üçün yeni potensialı.
Mən sizə bir neçə dəqiqə vermək və kosmik bunu edəcəyik.
Revision 1 ilə başlayın.
Mən təkan həyata kifayət qədər vaxt sonra inşallah siz dayandırmaq lazımdır
və sonra siz pop etmək üçün başqa bir fasilə vermək lazımdır.
Amma həqiqətən bütün çox kodu deyil.
Ən kodu potensialının genişləndirilməsi, yəqin ki, genişləndirilməsi məhsulları edir.
OK, tamamilə edilməsi üçün heç bir təzyiq,
lakin kimi uzun siz doğru yolda olduğunuz kimi hiss kimi, yaxşı.
>> Hər kəs onlar məni çəkərək rahat hiss heç kodu varmı?
Bəli, Mən, lakin hər kəs mən qoparmaq bilər hər hansı bir kodu var?
Okay, bunu nə ki, saxlamaq başlamaq olar?
Mən həmişə bir addım unutmayın.
OK, push baxaraq,
Siz kodu izah etmək istəyirsiniz?
[Tələbə] Əvvəla, mən ölçüsü artmışdır.
Mən bəlkə mən ki, hər halda olmalıdır tapmaq, I, ölçüsü artıb
bu potensialın daha az varsa və görürəm.
Və bu gücü daha az varsa, biz artıq olan array əlavə edin.
Bu deyil, əgər, mən 2 qabiliyyəti çoxaltmaq
və mən indi daha böyük gücü ölçüsü ilə bir şey üçün strings sıra təkrar bölüşdürə bilər.
Ki, uğursuz və sonra, mən istifadəçi demək və saxta qayıtmaq
gözəl varsa və sonra yeni spot simli qoydu.
>> [Rob B.] biz burada gözəl bitwise operator istifadə Həmçinin qeyd
2-çoxaltmaq üçün.
Unutmayın, sol növbədə həmişə 2 vurulur olacaq.
Siz onu deməkdir ki, yadda kimi sağ shift uzun kimi 2 bölünür
2 bölünür bir tam kimi 2 bölmək.
Burada ya orada 1 kəsmək bilər.
Amma 1 buraxdığı növbədə həmişə, 2 vurulur olacaq
siz daşqın isə tam hüdudlarından halda, sonra olmayacaq.
A yan comment.
Mən, do-bu heç bir şəkildə kodlaşdırma dəyişmək niyyətində deyil istəyirəm
lakin mən bu kimi bir şey etmək istəyirəm.
Bu, faktiki olaraq o qədər uzun etmək niyyətindədir.
Bəlkə bu, bu göstərmək üçün mükəmməl halda deyil
lakin mən-bu blokları daxil seqmentinə kimi
bu halda əgər, tamam, sonra, bir şey etmək gedirəm
və sonra funksiyanı edilir.
Mən funksiyası aşağı gözümün bütün yol hərəkət etmək lazım deyil
də başqa sonra nə görmək.
Bu halda əgər bu, sonra yalnız geri.
O, həmçinin bu kənarda hər şeyin gözəl əlavə fayda var
indi bir dəfə tərk keçdikdə.
Mən artıq üçün, əgər heç ridiculously uzun xətləri yaxınlığında lazımdır
, həmin 4 bayt kömək edə bilər, həm də daha sol şey
az kimi-tamam, mən xatırlayıram varsa hiss overwhelmed
Mən loop üçün bir başqa daxilində daxilində isə loop hazırda edirəm.
Yerdə Mən növ kimi, dərhal bu geri edə bilərsiniz.
Bu tamamilə isteğe və hər hansı bir şəkildə gözlənilir.
>> [Tələbə] bir ölçüsü olmalıdır - bu uğursuzluqla vəziyyətdə?
Burada uğursuzluqla vəziyyətdə biz, bəli, realloc bilmədi olunur.
, Güman ki, uğursuzluqla vəziyyəti necə edək
biz pulsuz stuff sonra halda, biz həmişə uğursuz olacaq
biz bir təkan cəhd neçə dəfə asılı olmayaraq.
Biz basmaqla saxlamaq, biz, incrementing ölçüsü saxlamaq
biz yığını üzərinə bir şey qoyaraq deyil, baxmayaraq.
Adətən biz qədər ölçüsü arttırmayı yoxdur
biz uğurla yığını qoyun sonra.
Biz ya burada və burada, demək, bunu edərdi.
Əvəzinə ≤ gücü s.size deyən və sonra, o, gücü az deyil
hər şey olduğu biz köçürülüb yalnız çünki.
>> Ve unutmayın, biz bəlkə yalan yalnız yer qayıtmaq bilər
realloc null geri yerləşir, burada
və standart səhv xatırlayıram nə varsa,
bir standart səhv çap istədiyiniz bəlkə, bu halda düşünebilirsiniz
yerine standart həyata birbaşa çap belə fprintf stderr.
Yenə, bir gözləmə deyil, bir səhv varsa
printf yazın, sonra yerine standart həyata standart səhv çap etmək istəyirik bilər.
>> Hər kəs qeyd etmək başqa bir şey var? Bəli.
[Tələbə] siz [işitilemez] üzərində getmək olarmı?
[Rob B.] Bəli, faktiki bu binariness ya nə deyil?
[Tələbə] Belə ki, 2 ilə çoxaltmaq?
[Rob B.] Bəli, əsasən.
Binar torpaq, biz həmişə rəqəm bizim dəsti var.
Sağ burada əsasən edər 1 Bu sol keçid.
Geri bu, yalnız ikili hər şeyi xatırlayaraq
, 2 elektrik, belə ki, bu 0 2 təmsil
1-Bu 2, bu 2 2.
İndi sağ üçün 0 daxil, biz yalnız hər şeyə tutulub.
Nə 0 2 olmaq üçün istifadə 2, artıq 2 1 2 edilir.
Biz daxil olan sağ
mütləq 0 olacaq,
olan hissi verir.
Əgər 2-bir sıra çoxaltmaq varsa, bu, tək başa gedən deyil
belə 0 yerə 2, 0 olmalıdır
Siz shift başına əgər bu mən yarım əvvəl xəbərdarlıq nə
bir tamsayı ildə bit sayı kənarda,
sonra bu 1 gediş sonuna qədər davam edir.
Həqiqətən böyük imkanları ilə məşğul olmaq üçün baş, əgər ki, yalnız narahat deyil.
Amma bu nöqtədə, sonra, hər şeyi milyardlarla bir sıra ilə məşğul olduğunuz
hər halda yaddaş uyğun deyil bilər.
>> İndi daha asan olan pop, əldə edə bilərsiniz.
Bir bütün dəstə pop baş əgər Siz bunu nə bilər
və indi yenidən yarım gücü ilə edirik.
Siz, sizin yaddaş məbləği shrink realloc bilər
amma siz narahat yoxdur, belə ki, yalnız realloc halda olacaq
, yaddaşlı daralır, heç vaxt, yaddaş artan
olan pop super asan etmək üçün gedir.
Destesi kimi olacaq indi sıralarında,
lakin şeyi almaq qaydada ləğv edilir.
Bir sıra olan prototip Məsələn, bir xətt
Mən İngilis dili, əgər tahmin, mən demişəm ki,
bir sıra bir prototip Məsələn bir sıra edir.
Belə bir xətt kimi, uyğun olaraq ilk şəxs danışırsınızsa,
Siz line həyata ilk şəxs ola gözləyirik.
Siz line son şəxs danışırsınızsa, siz xidmət keçən şəxs olacaq.
Yığını LIFO model idi Biz ki, FIFO model adlandırırlar.
Bu sözləri olduqca universaldır.
>> Destesi kimi seriallarda fərqli olaraq, sıralarında adətən ortasında elementləri imkanı yoxdur.
Burada, bir yığın, biz təkan və pop var.
Burada biz onlara enqueue və dequeue çağırıb başına.
Mən də onlara shift və unshift adlı eşitmişəm.
Mən insanların təkan və pop sıralarında də tətbiq deyə eşitdim.
I, aradan qaldırılması, daxil eşitmişəm
belə təkan və bacalar gedir, əgər təzyiq və yaratma olunur, açılır.
Siz sıralarında bəhs edirsinizsə, siz istifadə etmək istədiyiniz sözləri seçin bilər
durub və aradan qaldırılması üçün, bu adlanır nə heç bir fikir birliyi yoxdur.
Amma burada, biz enqueue və dequeue var.
İndi, struct yığını struct demək olar ki, eyni görünür.
Amma baş takip var.
Mən onu burada deyir tahmin, ancaq nə baş lazımdır?
Bu prototipləri təkan və pop əsasən eynidir.
Siz push və pop kimi hesab edə bilər.
Yeganə fərq pop edir qayıtdıqdan-əvəzinə son, ilk qaytarılması edir.
2, 1, 3, 4, və ya bir şey.
Burada başlanğıc var.
Bizim queue tam deyil, belə ki, dörd elementləri var.
Bizim sıra sonu, hazırda 2
və indi biz başqa bir şey daxil gedin.
>> Biz yığını versiyası üçün biz nə başqa bir şey, daxil istədiyiniz zaman
biz yaddaş bizim blok uzadılır.
Bu problemi nədir?
[Tələbə] Siz 2 hərəkət.
Mən queue sonuna haqqında əvvəl bildirib ki, nə
Bu, 1 biz başlamaq mənada etmir
sonra sonra dequeue 3, dequeue 4, dequeue 1 istəyirəm
sonra dequeue 2, sonra bu dequeue.
Biz indi realloc istifadə edə
və ya ən azı, siz fərqli bir şəkildə realloc istifadə etmək lazımdır.
Amma yəqin ki, yalnız realloc istifadə etməməlidir.
Siz özünüz yaddaş surəti üçün gedir.
>> Yaddaş surəti iki funksiyaları var.
Memcopy və memmove var.
Hal-hazırda istifadə etmək istədiyiniz olacaq bir görmək man pages oxu alıram.
OK, memcopy, fərq
memcopy və memmove, bir düzgün halda emal
siz regionda üst-üstə olur ki, regiona çıxarmaq olduğunuz
Sizi çıxarmaq edirik.
Memcopy onu idarə etmir. Memmove edir.
Siz kimi problem hesab edə bilər
Gəlin, bu oğlan surəti istəyirsiniz
artıq bu adam bu dörd.
Sonunda serialın kimi nə olmalıdır
surəti sonra 2, 1, 2, 1, 3, 4, və sonunda bəzi stuff sonra.
Lakin bu, biz həqiqətən surəti sıraya asılıdır
biz regionda biz daxil çıxarmaq edirik ki, hesab etmirəm əgər bəri
üst-üstə düşür biz çıxarmaq olduğunuz biri,
sonra biz burada başlanğıc kimi bunu getmək istədiyiniz yerə 2 surəti bilər
sonra irəli göstəricilərinə hərəkət.
>> İndi biz burada və burada olacaq, indi biz kopyalamak etmək istəyirsinizsə
bu oğlan artıq oğlan və irəli göstəricilərinə hərəkət.
Biz əldə qədər olacaq, 1, 2, 1, 2, 1 2
əvəzinə uyğun 2, 1, 2, 1, 3, 4, çünki
2, 1 orijinal, 3, 4 overrode.
Memmove doğru yapar.
Bu halda, əsasən yalnız həmişə memmove istifadə
bu düzgün emal çünki.
Bu, ümumiyyətlə heç bir pis ifa deyil.
Ideyası əvəzinə əvvəlindən başlayan və bu yolla çıxarmaq deyil
biz yalnız burada olduğu kimi, bu, son başlayır və nüsxə
və bu halda, bir problem heç bilər.
Heç bir performans var itirilir.
Həmişə memmove istifadə edin. Memcopy narahat etməyin.
Ayrıca memmove üçün gidiyorsun harada və ki
Sizin növbə ilə sarılı-ətrafında hissəsi.
Heç bir narahatlıq tamamilə həyata əgər.
Bu yığını push, və pop daha çətindir.
>> Hər kəs biz işləmək bilər hər hansı bir kodu var?
Hətta tamamilə natamam əgər?
[Tələbə] Bəli, baxmayaraq ki, tamamilə natamam var.
Biz bilər yenidən qazanc kimi tamamilə natamam uzun kimi gözəl var?
Hesab edirəm ki, hər bir zaman unutmayın.
Biz şeyi ölçüsünü lazım Okay, nə məhəl olur.
Tamamilə ölçüsünü bilməz.
Bu kodu izah edir.
Ölçüsü, ilk növbədə surəti az, mən ilk növbədə yoxlanılması alıram
və sonra sonra, mən daxil Mən baş + ölçüsü, almaq
və mən bu serialın gücü ətrafında wraps əmin olun
və mən o mövqedə olan yeni simli daxil edin.
Sonra ölçüsü artırmaq və doğru geri.
>> [Rob B.] Bu mütləq sizə mod istifadə etmək istəyirəm olacaq hallarda biridir.
Əgər ətrafında wrapping düşünürəm əgər, ətrafında wrapping olduğu halda hər cür
dərhal fikir mod olmalıdır.
Tez optimallaşdırma kimi /, kodu bir line qısa etmək
Siz line dərhal bu aşağıdakı qeyd
yalnız ölçüsü + +, belə ki, daxil olan bu xəttə, ölçüsü + +.
Aşağı burada İndi vəziyyət var
biz kifayət qədər yaddaş yoxdur
biz 2-bizim gücü artır.
, Mən burada eyni problem ola bilər tahmin, ancaq indi iqnor edə bilər
Siz artırılması üçün uğursuz olduğu təqdirdə,
sonra yenə 2 ilə gücü azaltmaq istəyirəm olacaq.
Digər qısa qeyd edə bilərsiniz yalnız kimi + =
siz də << = edə bilərsiniz.
Bərabərdir əvvəl demək olar ki, bir şey edə bilərsiniz, + = | = & = << =.
Char * Yeni yaddaş yeni blokdur.
Oh, burada.
>> Insanların yaddaş yeni blokunun növü haqqında nə düşünürsünüz?
[Tələbə] Bu char ** olmalıdır.
Qədər burada struct geri düşüncələri,
strings biz reallocating nə.
Biz növbəyə elementləri üçün bütün yeni dinamik storage edirik.
Biz sizin strings təyin etmək olacaq, biz indi mallocing ne edir
və belə yeni bir char ** olacaq.
Bu strings bir sıra olacaq.
Sonra yalan qayıtmaq olacaq altında işi nədir?
[Tələbə] biz char * etdiyini lazımdır?
[Rob B.] Bəli, yaxşı deyirik.
[Tələbə] nə idi?
[Rob B.] Biz heç bir çünki char * ölçüsü etmək istəyirdi uzun
sizeof (char) 1 olardı, çünki bu, həqiqətən çox böyük bir problem olardı.
Sizeof char *, 4 olacaq
belə ints ilə məşğul olduğunuz zaman bir çox
siz ilə üz əldə edirlər, çünki int * və int və ölçüsü ölçüsü
bir 32-bit sistem eyni şey olacaq.
Amma burada, sizeof (char) və sizeof (char *) artıq eyni şey olacaq.
>> Biz saxta qayıtmaq olduğu halda nədir?
[Tələbə] Yeni null edir.
Yeni null əgər Bəli, biz, saxta qayıtmaq
və mən aşağı atmaq gedirəm burada
[Tələbə] [işitilemez]
[Rob B.] Bəli, bu yaxşıdır.
Siz ya 2 dəfə qabiliyyəti və ya gücü shift 1 və sonra yalnız burada və ya hər hansı aşağı müəyyən edə bilər.
Biz bu idi Biz bunu edəcəyik.
Tutum >> = 1.
Və 1 yeri itirmək barədə narahat gedən heç etdiyiniz
siz 1 keçdikdə tərk çünki, belə ki, 1-in yeri, mütləq 0 deyil
belə sağ 1 keçid, hələ də gözəl olacaq.
[Tələbə] Siz qaytarılması əvvəl buna ehtiyac varmı?
[Rob B.] Bəli, bu, tamamilə heç bir əhəmiyyət kəsb edir.
>> Biz sonuna doğru qaytarılması başa olacaq İndi daşımır.
Bu memmoves nə olacaq yolu,
biz onlara necə diqqətli olmaq lazımdır.
Hər kəs biz onlara necə üçün heç bir təklif varmı?
Burada başlanğıc.
Qaçılmaz, biz yenə əvvəlində başlamaq istəyirəm
oradan və surəti əşyalar, 1, 3, 4, 2.
Necə ki, etməliyəm?
Birincisi, mən yenə memmove üçün adam səhifə baxmaq var.
Memmove, arqumentləri üçün həmişə vacibdir.
Biz mənbə ikinci, ölçüsü üçüncü, ilk bizim təyinat istəyirəm.
Mənbə və təyinat ləğv hansı funksiyaları var.
Hedef, mənbə qədər ardıcıl olmağa çalışır.
Move, nə qayıdır?
Bu istəyirik ki, ola bilər hər hansı səbəbdən, hedef bir pointer qaytarır.
Mən bunu oxuya bilərsiniz şəkil, lakin biz təyinat hərəkət etmək istəyirəm.
>> Bizim təyinat nə olacaq?
[Tələbə] Yeni.
[Rob B.] Bəli, və burada biz çıxarmaq olunur?
Biz çıxarmaq edilir ilk şey bu 1, 3, 4.
, 4 3-bu 1 nədir.
Bu 1-ünvan nədir?
Ki, 1-ünvan nədir?
[Tələbə] [işitilemez]
[Rob B.] rəhbəri + ilk element və ünvanı.
Necə biz serialın ilk element alıram?
[Tələbə] Queue.
[Rob B.] Bəli, q.strings.
Unutmayın, burada, bizim baş 1-dir.
Bu darn. Mən yalnız hesab magically-
Burada bizim baş 1-dir. Mən də mənim rəngini gedirəm.
Burada strings edir.
Biz burada etdiyi kimi, bu, biz onu yaza bilərsiniz
ilə başçılarının + q.strings.
Bir çox adam da yazmaq və q.strings [baş].
Bu, həqiqətən, heç bir az səmərəli deyil.
Siz dereferencing və sonra ünvanı əldə kimi, bu hesab bilər
lakin compiler q.strings + rəhbəri, hər halda biz əvvəl nə üçün tərcümə edir.
Siz düşünün istəyirəm Ya bir yol.
>> Və neçə bayt biz surəti istəyirsiniz?
[Tələbə] Tutum - baş.
Tutum - baş.
Və sonra həmişə nümunə yazmaq bilər
ki, doğru əgər anlamaq üçün.
[Tələbə] O 2 bölünür lazımdır.
Bəli, belə ki, biz ölçüsü istifadə edə bilər danışarlar.
Biz hələ ölçüsü olan-
ölçüsü istifadə edərək, biz 4 bərabər ölçüsü var.
Bizim ölçüsü 4. Bizim baş 1-dir.
Biz bu 3 elementləri köçürmək üçün istəyirəm.
Bu ağlı başında olma ki, ölçüsü yoxlamaq var - baş düzgün 3.
Biz əvvəlki kimi, burada geri gələn
biz gücü istifadə, onda biz 2 bölmək istiyorum
biz artıq tutumu artıb etdik, çünki əvəzinə, biz ölçüsü istifadə olacaq.
Bu surətləri həmin hissəsi.
İndi biz digər hissəsi başlanması qalan hissəsinin surəti lazımdır.
>> Bu nə mövqeyi memmove olacaq?
[Tələbə] Plus ölçüsü - baş.
Bəli, biz artıq ölçüsü kopyaladığınız - baş bayt,
və biz qalan bytes surəti istədiyiniz yeni
və sonra ölçüsü minus-də bytes sayı artıq daxil sitemizi sonra
Və sonra yerləşir biz çıxarmaq olunur?
[Tələbə] Q.strings [0].
[Rob B.] Bəli, q.strings.
Biz ya nə & q.strings [0]. Bilər
Bu çox daha az yayılmışdır.
Yalnız 0 olacaq, onda q.strings görmək edirlər lazımdır.
Biz çıxarmaq etdiyiniz harada.
Biz surəti neçə bayt yazmayıblar bilərəm? >> [Tələbə] 10.
Sağ.
[Tələbə] biz 5 çoxaltmaq üçün var - 10 dəfə bayt və ya bir şey ölçüsü?
Bəli, bu Ü-nə məhz biz çıxarmaq olunur?
[Tələbə] [işitilemez]
Biz çıxarmaq etdiyiniz şey növü nədir?
[Tələbə] [işitilemez]
O gələn yerləşir Bəli, char * s biz çıxarmaq edirik ki, biz bilmirik.
Bəli, onlar işarə etdiyiniz olduğu strings kimi, biz növbə üzərinə basmaqla başa
və ya queue daxil enqueuing.
O gələn hallarda, biz heç bir fikrim yoxdur.
Biz yalnız char * s özləri takip lazımdır.
Baş bytes - Biz ölçüsü surəti istəmirəm.
Baş char * s, - Biz ölçüsü kopyalamak etmək istəyirsinizsə
biz sizeof (char *) bu çoxaltmaq olacaq.
Eyni aşağı burada, head * sizeof (char *).
>> [Tələbə] nə [işitilemez]?
Burada Bu hüquq?
[Tələbə] Xeyr, aşağıda, ölçüsü - baş.
[Rob B.] burada Bu hüquq?
Pointer hesab.
Göstərici hesab iş gedir necə
avtomatik olaraq biz məşğul olduğunuz növü ölçüsü multiplies.
Sadəcə, burada kimi yeni + (ölçüsü - rəhbəri)
və yeni [- baş size] tam bərabər
ki, düzgün iş gözləyirik qədər
biz int dizi ilə məşğul edirsinizsə-ci ildən sonra biz int-index deyil
daxil və ya 5 ölçüsü var və 4-cü element istəyirsinizsə, onda biz index
int array [4].
Siz don't-[4] int of * ölçüsü.
Yəni bu halda avtomatik olaraq emal və
sözün bərabərdir, belə ki, bracket sintaksis
yalnız tez tərtib kimi bu valyutaya çevrilmişdir olacaq.
Yəni ki, ehtiyatlı olmaq lazımdır şey
Siz ölçüsü əlavə zaman - baş
bir byte deyil əlavə olunur.
Siz bir bayt və ya hər hansı ola bilər, bir char * əlavə edirik.
>> Digər suallar?
OK, dequeue daha asan olacaq.
Mən sizə yerinə yetirmək üçün bir dəqiqə verəcəyik.
Oh, və bu eyni vəziyyət tapmaq yerləşir
nə enqueue halda, biz null enqueuing edirsinizsə,
bəlkə biz onu idarə etmək istəyirəm, bəlkə biz deyil.
Biz burada daha, lakin bizim yığını hal kimi eyni deyil.
Biz null enqueue varsa, biz bunu göz ardı edə bilərsiniz.
Hər kəs mən qoparmaq bilər bir kodu var?
[Tələbə] Mən yalnız dequeue var.
Version 2 ki, tamam.
Siz izah etmək istəyirsiniz?
[Tələbə] Birincisi, siz növbə bir şey var əmin olun
və ölçüsü 1 aşağı gedir.
Siz nə etmək lazımdır, sonra baş qayıtmaq
və sonra 1-dək baş keçin.
OK, belə ki, biz hesab üçün bir künc halda var. Bəli.
[Tələbə] başını son element da deyil
sonra baş serialın kənarda qeyd etmək istəmirəm.
>> Bəli, belə tez baş kimi, bizim serialın son xit
biz dequeue zaman baş 0 geri modded edilməlidir.
Təəssüf ki, bir addım da bunu edə bilməz.
Mən yəqin ki, düzeltmek istədiyiniz yol tapmaq
Bu, biz qaytarılması ne bir char * olacaq
sizin dəyişən adı olmaq istəyir nə.
Sonra gücündə baş Mod istəyirəm
və sonra islağa qoymaq qaytarın.
Burada insanlar bir çox onlar-bilər
bu-you'll halda insanlar nə görürsünüzsə baş
potensialın daha böyük, baş etmək - gücü.
Və yalnız mod nə ətrafında çalışır.
Baş mod = tutumu çox təmiz
həcmi -. ətrafında tutumu rəhbəri çox baş daha əgər daha wrapping və
>> Suallar?
OK, biz yazmayıblar son şey bizim bağlı siyahısı.
Siz əgər Siz bağlı siyahı davranış bəzi istifadə edilə bilər
bir hash table Əgər sizin hash cədvəllərdə siyahıları bağlıdır.
Mən qəti bir hash table etdiyini gəlir.
Siz artıq bir trie görmüşük bilər
lakin çalışır daha çətindir.
Nəzəriyyə, onlar asimptotik daha yaxşı deyilik.
Lakin, böyük board baxmaq
və daha heç vaxt çalışır, və daha çox yaddaş tutur.
Hər şey haqqında daha çox iş üçün pis olan bitir çalışır.
Bu David Malan həlli həmişə nə edir
o həmişə ismarışları onun trie həlli və o, hal-hazırda harada görmək bildirin.
O David J, altında nə idi?
O, 18 saylı var ki, olduqca pis deyil, belə
və ən yaxşı biri olacaq ki, siz hesab edə bilər çalışır
və ya yaxşı bir trie ilə çalışır.
Onun orijinal həll belə deyilmi?
Trie həllər RAM istifadə bu intervalında daha çox meyl kimi hiss edirəm.
>> Çox top Go down və RAM istifadə bir rəqəm deyil.
Alt tərəf aşağı gedin və sonra çalışır görmeye başlamaq
Siz tamamilə kütləvi RAM istifadə aldığı,
və çalışır daha çətindir.
Not tamamilə ancaq təhsil təcrübəsi dəyər bir əgər.
Son şey, bizim bağlı siyahısı
və bu üç şeyə, bacalar, sıralarında və bağlı siyahıları,
Əgər kompüter nə hər hansı gələcək şey
Bu şeyi ilə tanışlıq var daşımayacaq.
Onlar hər şey yalnız belə əsas var.
>> Siyahıları bağlıdır və burada bir story bağlı siyahı bizim həyata olacaq etmişdir.
Story nə bağlı deyil kimi ikiqat bağlı fərqli deməkdir? Bəli.
[Tələbə] Bu yalnız, növbəti pointer üçün çox göstəricilərinə işarə
onu sonra bir əvvəlki kimi.
Bəli, belə şəkil formatında, yalnız nə idi?
Mən iki şey var. Mən şəkil və şəkil var.
Şəkil formatında, bizim story bağlı siyahıları,
qaçılmaz, biz siyahı rəhbəri göstərici bir növ
və sonra siyahı ərzində biz yalnız göstəricilərinə malik
və bəlkə bu bal null üçün.
Bu story bağlı siyahı sizin tipik rəsm olacaq.
A ikiqat bağlı siyahısı, siz geri bilərsiniz.
Mən sizə siyahıda hər hansı bir node vermək, onda siz mütləq əldə edə bilərsiniz
hər hansı digər node siyahısına bir ikiqat bağlı siyahısı əgər.
Amma siz siyahısına üçüncü node almaq və bir story bağlı siyahı varsa,
Əgər birinci və ikinci qovşaqlarının almaq olacaq. heç bir yol
Və müavinət və detriments və bir aşkar bir var
daha çox ölçüsü qədər, və bunlar indi işarə olduğu takip var.
Amma biz yalnız story bağlı qayğı.
>> Biz həyata malik olacaq bir neçə şeylər.
Sizin typedef struct node, int i: struct node * Növbəti; node.
Bu typedef ürəyinizdə daxil yandırılmış edilməlidir.
Quiz 1, bağlı siyahı node bir typedef vermək istəyirəm olmalıdır
və dərhal aşağı cızmaq lazımdır
hətta bu barədə düşünmədən.
Mən bir neçə sual tapmaq, niyə biz burada struct lazımdır?
Niyə biz node * deyə bilər?
[Tələbə] [işitilemez]
Bəli.
Bir şey kimi bir node müəyyən edən yeganə şey
özü typedef edir.
Amma bu baxımdan, biz bu struct node definition vasitəsilə təhlil cür olduğunuzda
biz typedef bitmiş deyil belə bəri, hələ bizim typedef başa deyil
node yoxdur.
Amma struct node edir və bu node burada,
Bu da başqa bir şey adlandırmaq olar.
Bu n adlandırmaq olar.
Bu bağlı siyahı node adlandırmaq olar.
Bu bir şey adlandırmaq olar.
Amma bu struct node bu struct node eyni şey deyilir lazımdır.
Bu da burada olmalıdır zəng nə,
və belə də məsələnin ikinci nöqtə cavab
niyə bir siz structs və structs və typedefs gördükdə dəfə çox olan
yalnız typedef struct görmək lazımdır, siz anonim structs görürsünüz
struct, lüğət, və ya hər həyata keçirilməsi.
>> Niyə biz burada node demək lazımdır?
Nə anonim struct ola bilər?
Demək olar ki, eyni cavabı var.
[Tələbə] Siz struct ərzində müraciət etmək lazımdır.
Bəli, struct ərzində, siz struct özü müraciət etmək lazımdır.
Siz struct adı vermir Əgər anonim struct varsa, siz ona istinad edə bilməz.
Və son lakin ən-bu bütün olmalıdır qədər sadə deyil,
Bu aşağı yazılı edirsinizsə və onlar həyata kömək etməlidir
şeyləri bu cür mənası yoxdur Əgər səhv bir şey edirik ki,.
Ən son deyil, niyə bu struct node * olmaq var?
Niyə yalnız sonrakı node struct bilməz?
Növbəti struct üçün [Tələbə] Pointer.
Yəni biz istədiyiniz nə qaçılmaz edir.
Nə üçün növbəti struct node heç vaxt ola bilər?
Niyə * Növbəti struct node olmaq var? Bəli.
[Tələbə] Bu sonsuz loop kimi.
Bəli.
[Tələbə] Bu, bütün biri olacaq.
Bəli, yalnız biz ölçüsü və ya bir şey necə düşünün.
Bir struct ölçüsü əsasən + və ya - burada və ya orada bəzi model.
Bu əsasən struct olan şeyi ölçüləri məbləği olacaq.
Burada Bu doğru bir şey dəyişmədən, ölçüsü asan olacaq.
Struct node ölçüsü növbəti i + ölçüsü ölçüsü olacaq.
I ölçüsü 4 olacaq. Növbəti ölçüsü 4 olacaq.
Struct node ölçüsü 8 olacaq.
Biz * yoxsa, sizeof düşünür
sonra sizeof (i) 4 olacaq.
Struct node ölçüsü sonrakı struct node + ölçüsü i ölçüsü olacaq
Növbəti struct node i + ölçüsü + ölçüsü.
Bu qovşaqlarının sonsuz recursion olardı.
Bu şeylər olmalıdır necə görə.
>> Yenə, mütləq ki, yadda
və ya ən azı siz ola bilər ki, kifayət qədər başa
bu kimi baxmaq nə vasitəsilə səbəb.
Biz həyata istəyirəm olacaq şeylər.
Əgər uzunluğu siyahısı
siz fırıldaqçı və ətrafında saxlamaq bilər
qlobal uzunluğu və ya bir şey, ancaq bunu etmək fikrində deyilik.
Biz siyahısı uzunluğu saymaq olacaq.
Biz şey var ki, əsasən axtarış kimi belə
biz bu tam da bağlı siyahısında olub olmadığını görmek üçün integers bir bağlı siyahı var.
Başına siyahı əvvəlində daxil olur.
Əlavə sonunda daxil edir.
Insert_sorted listedeki sıralaması mövqe daxil edir.
Və Insert_sorted cür siz başına istifadə və ya pis yollarla əlavə heç tutur.
>> Siz həyata etdiyiniz zaman insert_sorted-Insert_sorted
Gəlin biz bağlıdır siyahısı var deyirlər.
Bu hazırda 5, 4, 2, kimi görünür.
Mən belə uzun siyahısını özü artıq çeşidlənir kimi, 3 daxil etmək istəyirəm
3 məxsusdur yerləşir tapmaq asan.
I 2-da başlanır.
OK, 3 2 daha böyük, mən davam etmək istəyirəm.
Oh, 4 çox böyük, mən 3 2 və 4 arasında getmək gedir bilirəm
və mən göstəricilərinə və bütün məhsulları düzeltmek üçün var.
Amma ciddi, insert_sorted istifadə etmədikdə
kimi edək, yalnız mən 6 başına demək
sonra mənim bağlı siyahısı olmağa davam edir.
İndi insert_sorted üçün, yalnız kəsb edə bilər ki, heç bir əhəmiyyət kəsb edir
əməliyyatları mövcud olsa siyahısı sorted ki,
bu sıralanır deyil səbəb ola bilər ki, bu.
O siz həyata keçirilməsi üçün var olacaq əsas şey bir faydalı əlavə-belə tapın.
>> İndi, uzunluğu nə bir dəqiqə almaq və başqa
və bu nisbətən sürətli olmalıdır.
Yekun zaman yaxınlaşır, belə ki, hər kəs uzunluğu üçün bir şey və ya başqa?
Onlar demək olar ki, eyni olacaq.
[Tələbə] Length.
, Gəlin görmək təftiş edək.
Okay.
Siz izah etmək istəyirsiniz?
[Tələbə] Mən yalnız bir göstərici node yaratmaq və qlobal dəyişən olan ilk onu başlamaq,
və sonra mən San günah almaq və bu halda əgər 0 qayıtmaq yoxdur belə ki, null varsa kontrol edin.
Əks halda, mən vasitəsilə loop, tam ərzində track saxlanılması
Mən siyahıda növbəti element əldə etdik neçə dəfə
və eyni artım əməliyyat da ki, faktiki element daxil
və sonra davamlı, bu null varsa çek görmək etmək
bu null varsa və o, aborts və yalnız mən əldə etdiyiniz elementlərin sayı qaytarır.
>> [Rob B.] hər şey haqqında hər hansı bir şərh varmı?
Bu gözəl düzgün müdrik görünür.
[Tələbə] Mən sizə node == null lazımdır düşünmürəm.
Bəli, belə node əgər == null qaytarılması 0.
Amma node == null bu-oh, bir düzgün məsələ vardır.
Bu yalnız i qaytarılması edirik idi, lakin indi daxilində deyil.
Siz int i yalnız lazımdır, belə ki, i = 0.
Node null olsa, sonra i hələ, 0 olacaq
və biz 0 qayıtmaq olacaq, bu halda eyni belə.
Digər ümumi şey bəyannamə davam edir
loop üçün və node daxili.
Siz demək-oh bilər heç.
Bu kimi saxlamaq edək.
Mən yəqin ki, int i = 0 bura qoymaq olardı
sonra node * node = burada ilk.
Və indi bu canini-almaq necə yəqin ki.
Bu yazdığınız necə yəqin ki.
Bu kimi də dönük bilər.
Burada loop strukturu üçün
int i = 0 kimi demək olar ki, kimi təbii olmalıdır
i array uzunluğu az i + +.
Ki, bir sıra üzərində təkrarlamaq necə varsa, bu bir bağlı siyahı üzərində təkrarlamaq necə.
>> Bu bir nöqtədə ikinci təbiət olmalıdır.
Mind ki, bu demək olar ki, eyni şey olacaq.
Siz bağlı siyahı üzərində təkrarlamaq istəyirəm olacaq.
Əgər node-I dəyəri adlanır nə heç bir fikrim yoxdur.
Node i.
Ki node olan value = i doğru qayıtmaq və bu edin.
Qeyd edək ki, biz heç yalan qayıtmaq yeganə yolu
biz bütün bağlı siyahı üzərində təkrarlamaq və doğru qayıtmaq heç əgər,
belə ki, bu nə.
Kimi yan not biz yəqin ki, əlavə və ya başına almaq deyil.
>> Sadə son qeyd.
Siz statik söz görürsünüzsə, elə isə statik int sayı = 0 deyək
sonra biz count etmək + +, siz əsasən qlobal dəyişən kimi hesab edə bilər,
Mən yalnız bu biz uzunluğu həyata olacaq necə deyil, baxmayaraq.
Burada bunu, sonra + + saymaq alıram.
Biz sayı incrementing bizim bağlı siyahı bir node daxil hər hansı bir yol.
Bu baxımdan statik söz nə deməkdir edir.
Mən yalnız int sayı olsaydı = müntəzəm köhnə qlobal dəyişən olacağını 0.
Nə statik int sayı vasitələri bu fayl üçün qlobal dəyişən olmasıdır.
Bu, bəzi başqa fayl mümkün deyil
siz açılmış varsa, pset 5 düşünmək istəyirəm.
Siz həm speller.c var və siz dictionary.c var
və yalnız speller.c, sonra bir şey qlobal bir şey bəyan əgər
dictionary.c və əksinə əldə edilə bilər.
Qlobal dəyişənlər, hər hansı bir. C fayl tarafından erişilebilir
lakin statik dəyişənlərin, fayl daxilində yalnız erişilebilir
belə daxili dictionary.c və spell checker və ya daxili,
bu mənim serialın ölçüsü üçün dəyişən bəyan necə növ
və ya lüğət sözlər mənim sıra ölçüsü.
Mən hər kəs üçün daxil bir qlobal dəyişən bəyan etmək istəmirəm ildən,
Mən, həqiqətən, yalnız öz məqsədləri üçün qayğı.
>> Bu barədə yaxşı şey, bütün adı toqquşma stuff deyil.
Bəzi digər fayl sayı adlanan qlobal dəyişən istifadə etməyə çalışır varsa, hər şeyi çox çox səhv,
, bu gözəl şeylər təhlükəsiz edir və yalnız siz istifadə edə bilərsiniz
və başqa heç bir ola bilər, və başqa kimsə sayı adlanan qlobal dəyişən bəyan əgər,
sonra sayı adlanan sizin statik dəyişən mane deyil.
Bu statik nə var. Bu fayl qlobal dəyişir.
>> Bir şey haqqında suallar?
Bütün dəsti. Bye.
[CS50.TV]