[MUZYKI] [ODTWARZANIE] -On kłamie. -O czym? -Nie Wiem. -Więc Co wiemy? -To Na 9:15, Ray Santoya był na ATM. -Tak. Więc pytanie jest, co on robił na 9:16? -Wykonywanie Na 9 milimetr na coś. Może widział snajpera. -lub Pracował z nim. -wait. Wróć jednym. -Co widzisz? -Bring Jego twarz się pełnym ekranie. Okulary -Jego. -Jest Odbiciem. -To Drużyna baseballowa Nuevitas. To ich logo. -A On mówi do kto ma na sobie tą kurtkę. [Zakończyć odtwarzanie] DAVID MALAN: Wszystko w porządku. Jest CS50, co jest nieco więcej z [niesłyszalne], z którym jesteś dabbling z problemem ustawić cztery. Dziś zaczynają wyglądać trochę bardziej głęboko na te rzeczy zwane wskaźniki, które mimo że dość ezoteryczne temat, okazuje się, że to będzie się środki, za pomocą których może rozpocząć budowę i montaż o wiele bardziej zaawansowane programy. Ale zrobiliśmy to na ostatnią środę w drodze pewnego claymation pierwszy. Więc to, przypomnijmy, jest Binky a my go używane aby spojrzeć na program, który tak naprawdę nie zrobić coś ciekawego, ale to nie ujawnić kilka problemów. Tak, aby rozpocząć dzisiaj, dlaczego nie idziemy szybko przez niektóre z tych etapów, starają się destylować pod względem człowieka dokładnie to, co się tu dzieje i dlaczego to jest złe, a następnie przejść i zacząć coś budowy z tej techniki? Więc to były pierwsze dwie linie w tym programie i laika, co są te dwie linie robi? Ktoś, kto rozsądnie wygodne z tym, co ogłosił na ekranie? Co to są te dwie linie robi? To nie wszystko, różni się od jednego tygodnia ale jest jakiś nowy specjalny symbol. Tak? Powrót istnieje. PUBLICZNOŚCI: Deklarowanie wskaźników? DAVID MALAN: Powiedz jeszcze raz? PUBLICZNOŚCI: Deklarowanie wskaźników? DAVID MALAN: Deklarowanie wskaźniki i niech udoskonalić go trochę więcej. PUBLICZNOŚCI: [niesłyszalne] Adres x i y. DAVID MALAN: A potem zająć. Tak konkretnie to, co robimy jest nam deklarując dwie zmienne. Zmienne te jednak będą być typu int gwiazdy, które Dokładniej oznacza idą do przechowywania adres int, odpowiednio X i Y. Teraz są jakieś wartości? Czy są jakieś rzeczywiste adresy w nich dwie zmienne w tym momencie? Nie. To tylko tak zwane wartości śmieci. Jeśli nie właściwie przypisać zmienna, co było w pamięci RAM wcześniej zamierza wypełnić zerami i te, oba z tych zmiennych. Ale jeszcze nie wiem czym one są i to jest będzie kluczem do dlaczego Binky stracił głowę w zeszłym tygodniu. Więc to był claymation wcielenie tego w którym masz tylko dwie zmienne, małe okrągłe kawałki gliny, która może przechowywać zmienne, ale owinięte się strzałki wskazują, nie są one w rzeczywistości, wskazując do dowolnego miejsca znane. Tak więc mieliśmy ten wiersz, a to był nowy w zeszłym tygodniu, malloc dla pamięci alokacji, która jest tylko fantazyjny sposób informując system operacyjny, Linux lub Mac OS lub Windows, hej, daj mi trochę pamięci, i wszystko, co masz powiedzieć System operacyjny jest to, co prosząc go do pamięci. To nie będzie obchodziło, co masz zamiar z tym zrobić, ale trzeba powiedzieć eksploatacji System, co w drodze malloc. Tak? PUBLICZNOŚCI: Jak dużo? DAVID MALAN: Jak dużo? Jak wiele bajtów, a więc ta znowu zmyślony przykład, jest po prostu mówiąc, daj mi rozmiar wew. Teraz, rozmiar int jest cztery bajty lub 32 bity. Więc to jest tylko sposób mówiąc: hej, system operacyjny, daj mi cztery bajtów pamięci że można używać do mojej dyspozycji, a szczególnie co czyni malloc zwrotu w odniesieniu do tego kawałka czterech bajtów? PUBLICZNOŚCI: Adres? DAVID MALAN: Adres. Adres tego kawałka czterech bajtów. Dokładnie. A więc to, co jest zapisane w końcu w x i dlatego tak naprawdę nie obchodzi, co liczba, że Adres jest, czy to OX1 lub OX2 lub jakiś tajemniczy adres szesnastkowym. Właśnie obchodzi obrazowo że zmienna x jest teraz wskazując na tym fragmencie pamięci. Więc strzałka reprezentuje wskaźnik, lub W szczególności, adres pamięci. Ale znowu, nie typowo obchodzi co te rzeczywiste adresy są. Teraz, ta linia mówi co w laika? Gwiazda x dostaje 42 średnik. Co to znaczy? Chcesz iść? Nie rysuj szyi. PUBLICZNOŚCI: Adres x jest na 42. DAVID MALAN: Adres x jest na 42. Nie bardzo. Tak blisko, ale nie do końca, bo nie ma gwiazda, która jest poprzedzenie tego x. Więc musimy podkręcić trochę. Tak? PUBLICZNOŚCI: Wartość, że wskaźnik x wskazuje na to 42. DAVID MALAN: OK. Wartość, że wskaźnik x jest wskazując na, powiedzmy, jest 42, lub innymi słowy, gwiazdy x mówi, iść do jakiegokolwiek adresu jest w x, czy to 1 Oxford Ulica lub 33 Oxford Street lub OX1 lub OX33, cokolwiek że adres numeryczny jest, gwiazda x jest wyłuskania x. Więc idź na ten adres i następnie umieścić numer 42 nie. Tak że byłoby równoważny sposób powiedzenia, że. Więc to wszystko jest w porządku, a następnie chcemy reprezentować obraz w następujący sposób, gdzie dodaliśmy 42 do tego kawałka czterech bajty po stronie prawej, a ta linia była gdzie wszystko wyszło i szef binky w trzasnął się w tym miejscu, bo dzieją się złe rzeczy, kiedy Ci dereference wartości śmieci lub nieprawidłowego nieważny wskaźniki, i mówię nieważny bo w tym momencie historia, to, co jest wewnątrz y? Jaka jest wartość y oparte na przestrzeni ostatnich kilku krokach? Tak? Co to? PUBLICZNOŚCI: Adres. DAVID MALAN: Adres. Powinna ona być adres ale ja zainicjowany go? Więc nie masz jeszcze. Więc co na pewno jest w środku? To tylko niektóre wartości śmieci. Może to być dowolny adres od zera do 2 mld, jeśli masz dwóch gigabajtów pamięci RAM, lub zero do 4 miliardów, jeśli masz dostał cztery gigabajty pamięci RAM. To jakaś wartość śmieci, ale problem jest że system operacyjny jeżeli nie zostało wam dane że fragment pamięci specjalnie że starasz się udać, to na ogół będzie powodować co widzieliśmy jako błąd segmentacji. Tak więc w rzeczywistości każdy z was, którzy mają zmagał się problemów w godzinach pracy lub problemów, które więcej na ogół z próbuje dowiedzieć się, usterka segmentacji, które zwykle oznacza jesteś dotykając segment pamięci, że nie powinno być. Dotykasz pamięć system operacyjny nie ma pozwalał dotknąć, czy to idąc za daleko w swojej tablicy lub od zaraz, czy to dlatego, że dotyka Pamięć, która po prostu jest jakaś wartość śmieci. Czyniąc gwiazda x jest tu rodzaju zachowanie niezdefiniowane. Nigdy nie powinno się zrobić, bo kursy są, program po prostu idzie do katastrofy, bo mówisz, przejść pod ten adres i nie masz pojęcia, gdzie że adres w rzeczywistości. Więc system operacyjny może będzie crash programu w wyniku I rzeczywiście, to co się stało tam Binky. Więc ostatecznie, Binky stałe problem z tym. Więc ten program sam w sobie nie była prawidłowa. Ale jeśli rodzaj posunąć się naprzód i wykonać tę linię, a nie, y jest równa x oznacza po prostu, bez względu na Adres jest x, a także umieścić go w r. I tak obrazowo, mamy reprezentowane w tym z dwoma strzałkami od x oraz y, wskazując w tym samym miejscu. Więc semantycznie, x jest równa do y, ponieważ oba te są przechowywane takie same adres, ergo, wskazując na 42, a teraz, kiedy mówisz gwiazdę y, przejdź do adresu w y, to ma ciekawy efekt uboczny. Tak więc adres w y jest samo jak adres w x. Więc jeśli mówisz go na adres w y i zmień wartość na 13, kto jeszcze ma wpływ? X, punkt D, że tak powiem, powinny wpływać również. I rzeczywiście, jak Nick wyciągnął ten obraz w claymation było dokładnie to. Mimo, że kierujemy się wskaźnik y, znaleźliśmy się w tym samym miejscu, i tak, jakbyśmy byli do wydrukowania z X lub Y jest wskazywany, to możemy zobaczyć wartość 13. Teraz mówię wskazywany się spójne z obrazem. Programiści, do mojego wiedzy, nigdy nie wskazywanego powiedzieć słowo, to, co jest szpiczasty na, ale dla spójności z video, uświadomić sobie, to wszystko, co było rozumie się w tej sytuacji. Więc wszelkie pytania dotyczące claymation lub wskaźniki lub malloc tylko jeszcze? Nie? W porządku. Więc bez dalszego ado, rzućmy okiem co, gdzie to ma właściwie stosuje się od pewnego czasu. Więc mieliśmy tej biblioteki CS50 że ma wszystkie te funkcje. Użyliśmy GetInt dużo, getString, Prawdopodobnie GetLongLong wcześniej w moim pset jeden lub więcej, ale co się rzeczywiście dzieje? Cóż, rzućmy okiem pod wyciągiem w programie, który inspiruje Dlatego dajemy Ci CS50 biblioteka, a nawet, jak w zeszłym tygodniu, zaczęliśmy biorąc te kółka off. Więc to jest teraz posortowana z postmortem co trwa już wewnątrz biblioteki CS50, chociaż teraz będzie ruszyć z dala od niego dla większości programów. Więc to jest program o nazwie scanf 0. To bardzo krótki. To ma tylko te linie, ale wprowadza funkcję o nazwie scanf że jesteśmy rzeczywiście będzie zobaczyć w moment wewnątrz biblioteki CS50, choć w nieco innej formie. Więc ten program na linii 16 deklaruje zmienną x. Więc daj mi cztery bajty na int. To było mówienie użytkownikowi, Numer prosimy, a następnie jest to interesująca linia rzeczywiście wiąże ze sobą w zeszłym tygodniu i to. Scanf, a następnie zauważyć, że trwa string format, podobnie jak printf, % i oznacza, int, a potem trwa Drugi argument, który wygląda trochę odjazdowe. To znaku & x, i przypomnieć, my widzieliśmy tylko ten jeden raz w zeszłym tygodniu. Co ampersand x reprezentują? Co handlowe i zrobić w C? Tak? PUBLICZNOŚCI: Adres. DAVID MALAN: Adres. Więc to jest przeciwieństwem operatora gwiazdy, podczas gdy operator gwiazda mówi, przejdź do ten adres, operator ampersand mówi, dowiedzieć się adres tej zmiennej, i tak to jest klucz, bo Celem scanf w życiu jest skanowanie Na użytkowniku wejście z klawiatury, w zależności od co on lub ona typy, a następnie odczytać wejście tego użytkownika do zmiennej, ale widział w ciągu ostatnich dwóch tygodni że swap, że Próbowaliśmy wysiłku w celu wdrożenia po prostu uszkodzony. Przypomnijmy, że z funkcją wymiany, jeśli po prostu oświadczył A i B, jak wskazówki, my z powodzeniem zamienić dwie zmienne wewnątrz swapu Podobnie jak w przypadku mleka i OJ, ale jak tylko wymiany powrócił, jaki był wynik z tytułu do x i y, oryginalne wartości? Nic. Tak. Nic się nie stało, że czas, ponieważ swapy zmienić tylko jego lokalne kopie, to znaczy, wszystkie tym razem, gdy mamy zostały przekazując argumenty do funkcji, jesteśmy tylko przejazdem kopie tych argumentów. Można z tym zrobić co chcesz z nimi, ale nie będziemy mieć żadnego Wpływ na oryginalnych wartości. Więc to jest problematyczne, jeśli Ciebie chcą mieć funkcji takich jak scanf w życiu, którego celem jest skanowanie Wejście użytkownika z klawiatury a następnie wypełnić puste pola, tak aby mówić, to znaczy daje się zmienną jak X wartość, bo gdybym był po prostu przejść x do scanf, jeśli wziąć pod uwagę logikę ostatnia Tydzień, może scanf robić, co chce z kopią x, ale nie mógł stałe zmienić x chyba damy scanf mapę skarbów, że tak powiem, gdzie x oznacza miejsce, w którym mijamy na adres X, tak aby scanf może pójść tam i faktycznie zmiana wartość x. I tak rzeczywiście, wszystkie że ten program robi jeśli zrobię scanf 0, w moim źródła Katalog 5m, aby scanf 0, Dot slash scanf, numer prosimy o 50, dzięki za 50. Więc to nie jest wszystko, co ciekawe, ale co się rzeczywiście dzieje jest to, że tak szybko, jak zadzwonić scanf tutaj, wartość x jest trwale zmieniło. Teraz, to wydaje się dobre i dobre, aw rzeczywistości Wygląda na to, że naprawdę nie trzeba biblioteka CS50 w ogóle już. Na przykład, powiedzmy, uruchomić to jeszcze raz tutaj. Pozwól, że ponownie go przez sekundę. Spróbujmy numer i proszę zamiast mówić 50 jak poprzednio, powiedzmy, że nie. OK, to trochę dziwne. OK. I tylko niektóre bzdury tutaj. Tak więc nie wydaje się, aby obsługi sytuacji błędnych. Musimy więc minimalnie początek dodając trochę Sprawdzanie błędów aby upewnić się, że użytkownik ma wpisane w rzeczywistej liczby jak 50, bo podobno wpisując słowa nie jest wykrywany jako problematyczne ale to chyba powinno być. Przyjrzyjmy się tej wersji teraz to moja próba reimplement getString. Jeśli scanf ma to wszystko funkcje wbudowane, dlaczego mamy już dabbling z nich kółka jak getString? Cóż, tutaj jest chyba moja własna prosta wersja getString przy czym tydzień temu, mogę powiedzieć, daj mi łańcuch i nazywają to bufor. Dzisiaj mam zamiar zacząć po prostu mówiąc gwiazdę char, który, przypomnijmy, to jest po prostu synonimem. To wygląda bardziej przerażające, ale to dokładnie to samo. Więc daj mi bufor zmienną że będzie przechowywać ciąg, powiedzieć ciąg użytkownika proszę, a następnie, podobnie jak poprzednio, spróbujmy pożyczyć tę lekcję scanf % s tym razem, a następnie przekazać w buforze. Teraz szybkie kontrola poprawności. Dlaczego nie mówi handlowe i bufor ten czas? Wywnioskować z poprzedniego przykładu. PUBLICZNOŚCI: Char gwiazda jest wskaźnikiem. DAVID MALAN: Dokładnie, bo tym razem, char Gwiazda jest już wskaźnikiem, adres, z definicji tej gwiazdy razie nie. A jeśli scanf oczekuje adres, wystarczy po prostu przekazać w buforze. Nie muszę powiedzieć, bufor ampersand. Dla ciekawskich, można zrobić coś takiego. Musiałby inne znaczenie. To daje wskaźnik do wskaźnika, który jest w rzeczywistości ważna rzecz w C, ale dla Teraz, powiedzmy, keep it simple i zachować historię spójne. Jestem po prostu przejdzie w bufor i to jest prawidłowe. Problemem jest jednak to. Pozwólcie mi iść do przodu i uruchomić to Program po kompilacji go. Bądź scanf 1. Cholera, mój kompilator wzrok mój błąd. Daj mi jedną sekundę. Clang. Powiedzmy scanf-1.C. OK. No to jedziemy. Potrzebuję tego. CS50 ID ma różne ustawienia konfiguracyjne które chroni przed siebie. Musiałem wyłączyć te przez prowadzenie szczęk ręcznie ten czas. Tak więc ciąg proszę. Mam zamiar iść do przodu i wpisz w moim ulubionym Hello World. OK, null. To nie to, co wpisałem. Więc to wskazuje coś jest nie tak. Pozwólcie mi iść do przodu i wpisz w bardzo długi ciąg. Dzięki za nieważne i nie wiem jeśli będę w stanie go zawiesić. Spróbujmy trochę kopię wklej i zobacz, czy to pomaga. Wystarczy wkleić dużo tego. To zdecydowanie większe Ciąg niż zwykle. Miejmy tylko naprawdę pisać. Nie. Cholera. Nie znaleziono polecenia. Więc to jest niezwiązane. To dlatego, że wklejony złe znaki, ale to okazuje się nie będzie działać. Spróbujmy jeszcze raz, bo to jest więcej zabawy, jeśli faktycznie rozbić go. Załóżmy, wpisz to i teraz, jestem zamiar skopiować naprawdę długi ciąg a teraz zobaczmy, czy mamy może zawiesić tę rzecz. Zauważ, że pominięte przestrzenie i nowych linii i średniki i wszystkie znaki ostry. Wchodzić. A teraz po prostu sieć jest wolna. Trzymałem się Command-V zbyt długo, wyraźnie. Cholera! Nie znaleziono polecenia. OK. Cóż, chodzi o to, jednak następujące. Więc, co się rzeczywiście dzieje na niniejszego oświadczenia z char gwiazdkowy bufor na linii 16? Więc co ja mam się kiedy zadeklarować wskaźnik? Wszystko Dostaję jest wartością czterech bajtów zwany bufor, ale to, co jest w jej wnętrzu w tym momencie? To tylko niektóre wartości śmieci. Ponieważ dowolnym czasie zadeklarować zmienną w C, to tylko niektóre wartości śmieci, i zaczynamy podróż nad tą rzeczywistością. Teraz, kiedy powiem, scanf, przejść pod ten adres i umieścić bez względu na rodzaje użytkowników w. Jeśli użytkownik wpisze w komentarzy świat, dobrze, gdzie mogę umieścić go? Bufor jest wartością śmieci. Więc to jest trochę jak strzała wskazując, że jest nie wiadomo gdzie. Może to wskazuje tutaj, w mojej pamięci. I tak, gdy użytkownik typy w Hello World, program stara się umieścić Ciąg hello world backslash 0 w tym fragmencie pamięci. Ale z dużym prawdopodobieństwem, ale oczywiście nie w 100% prawdopodobieństwo, komputer będzie wtedy upaść Program, ponieważ nie jest Pamięć należy pozwolić mi dotknąć. Tak w skrócie, ten program jest wadliwy dokładnie z tego powodu. Ja zasadniczo nie robi, co? Jakie kroki mogę pominięte, podobnie jak pominęliśmy w pierwszym przykładzie binky jest? Tak? PUBLICZNOŚCI: alokacji pamięci? DAVID MALAN: alokacji pamięci. Nie właściwie przydzielone jakakolwiek pamięć do tego łańcucha. Więc możemy to naprawić w kilka sposobów. Jeden z nich, możemy keep it simple i faktycznie, teraz jesteś zacznie widzieć zatarcia linii między tym, co tablica jest, co ciąg jest, co gwiazda char to, co tablica znaków jest. Oto drugi przykład udziałem smyczków i uprzedzenia wszystko robiłem na linii 16, zamiast mówić że bufor będzie char gwiazda, wskaźnik do kawałka pamięci, Będę bardzo aktywnie dać Sam bufor do 16 znaków, i faktycznie, jeśli znasz z buforowania okresie, chyba ze świata wideo, gdzie film jest buforowanie, buforowanie, buforujące. No i co tu jest połączenie? Cóż, Wewnątrz YouTube i wewnątrz odtwarzaczy wideo ogólnie jest tablicą to jest większy niż 16. To może być tablica rozmiarów jednej megabajtowego może 10 megabajtów, i do tej tablicy ma przeglądarkę pobrać całą masę bajtów, cała masa megabajtów wideo i odtwarzacz wideo, YouTube lub kto jest, zaczyna czytanie bajtów z tej tablicy, i za każdym razem można zobaczyć Słowo buforowanie, buforowanie, oznacza to, że gracz ma dostał się do końca tej tablicy. Sieć jest tak wolno, że nie ma uzupełniane tablicę z większą liczbą bajtów i tak jesteś na bitach aby wyświetlić użytkownikowi. Więc bufor jest trafny termin tutaj, że to tylko tablica, kawał pamięci. I to będzie to naprawić ponieważ okazuje że można traktować tablic jakby są adresy, chociaż bufora to tylko symbol, to Sekwencja postaci, buforem to jest dla mnie przydatne, programista, można przekazać jej nazwę na całym jakby to były wskaźnik, jakby to byli adres klocek pamięci do 16 znaków. Więc to znaczy, mogę przejść scanf dokładnie to słowo i tak teraz, jeśli zrobię ten program, aby scanf 2, kropka ukośnik scanf 2, i wpisz hello world, Wprowadź, że time-- Hmm, co się stało? String proszę. Co zrobiłem źle? Witaj, świecie, bufor. Witaj świecie. Ach, wiem, co robi. OK. Więc to czyta się do pierwszej przestrzeni. Warto więc oszukiwać na chwilę i Chciałem tylko powiedzieć, aby coś napisać bardzo długo, jak to jest długa zdanie to jeden, dwa, trzy, cztery, pięć, sześć, siedem, osiem, dziewięć, 10, 11, 12, 13, 14, 15, 16. OK. To jest rzeczywiście długa zdanie. Więc to zdanie jest dłuższy niż 16 znaków i tak, kiedy nacisnąć klawisz Enter, co się stanie? No cóż, w tym przypadku z historia, I oświadczył, bufor faktycznie jest tablicą z 16 znaków gotowy do pracy. Tak jeden, dwa, trzy, cztery, pięć, sześć, siedem, osiem, dziewięć, 10, 11, 12, 13, 14, 15, 16. Tak więc 16 znaków, a teraz, kiedy przeczytać w coś takiego jest długi Zdanie to, co się wydarzy jest które mam zamiar przeczytać w tym jest długa S-E-N-T-E-N-C-E zdanie. Więc to jest celowo złe, że zachować pisanie poza Granice mojej tablicy, poza granice mojego bufora. Mogłem mieć szczęście i program utrzyma się na prowadzeniu i nie obchodzi mnie, ale ogólnie rzecz biorąc, rzeczywiście rozbić mój program, i to jest błąd w moim kod moment I krok poza granicami z tej tablicy, bo nie wiem, czy jest to niekoniecznie będzie katastrofy czy jestem po prostu będzie miał szczęście. Więc to jest problematyczne, ponieważ w w tym przypadku, to nie wydaje się do pracy i niech kusić losu tutaj, chociaż IDE wydaje się tolerować trochę of-- No to jedziemy. Wreszcie. Więc jestem jedyną osobą, która może to zobaczyć. Więc po prostu miałem dużo zabawy pisania się naprawdę długi rzeczywistej frazy że to na pewno przekroczyła 16 bajtów, bo wpisane w tym szalonym długi multi-line wyrażenie, a następnie zauważył, co się stało. Program próbował wydrukowaniem a następnie dostał winy segmentacji i błędy segmentacji jest, gdy dzieje się coś takiego i system operacyjny mówi nie, nie można dotknąć, że pamięć. Mamy zamiar zabić program w ogóle. Tak więc wydaje się problematyczne. Mam poprawiła programu, w którym przynajmniej mieć trochę pamięci, ale to wydaje się ograniczyć funkcja GetString do uzyskania ciągi jakiejś skończonej długości 16. Więc jeśli chcesz wesprzeć dłużej zdania niż 16 znaków, co robisz? Cóż, można zwiększyć rozmiar bufora do 32 lub, że wydaje się trochę krótki. Dlaczego nie możemy po prostu zrobić to 1000, ale odepchnąć. Jaka jest odpowiedź intuicyjnie od tylko uniknąć tego problemu poprzez mój bufor większy, podobnie jak 1000 znaków? Poprzez wdrożenie getString ten sposób. Co tu dobre, czy złe? Tak? PUBLICZNOŚCI: Jeśli zwiążesz się dużo miejsca i nie należy go używać, to nie może przydzielić tego miejsca. DAVID MALAN: Absolutnie. Jest to marnotrawstwo, o ile jeśli nie rzeczywiście potrzeba 900 tych bajtów i jeszcze prosisz 1000 w sumie tak, jesteś po prostu zużywa więcej pamięci na komputer użytkownika niż trzeba, A przecież, niektóre już napotkał w życiu, że kiedy jesteś działa wiele programów a oni zjadają dużo pamięci, to rzeczywiście może wpłynąć na wydajność i doświadczenie użytkownika na komputerze. Więc to jest trochę leniwy rozwiązaniem, na pewno, i odwrotnie, to nie tylko marnotrawstwo, jaki problem nadal, nawet jeśli robię mój bufor 1000? Tak? PUBLICZNOŚCI: Łańcuch ma długość tysięcy jeden. DAVID MALAN: Dokładnie. Jeśli łańcuch jest długość 1001, masz dokładnie ten sam problem, i przez mojego argumentu, że tak właśnie wtedy zrobić to 2000, ale nie wiesz, w wcześniej, jak duże powinno być, a jednak, muszę skompilować mój program przed najmu ludzie używają i pobierz ono. Więc to jest dokładnie ten rodzaj rzeczy, że stara biblioteka CS50 aby pomóc nam, a my tylko rzut oka na niektóre z realizacji bazowego Tutaj jednak to CS50 dot C. jest plikiem, który był na CS50 IDE wszystkie te tygodnie, które już korzystają. Jest to skompilowane i masz używam go automatycznie przez naturę z posiadania kreska L CS50 flagę z brzękiem, ale jeśli mogę przewinąć w dół przez wszystkie te funkcje, oto getString, i po prostu dać ci smak, co się dzieje, rzućmy okiem na względną złożoność. To nie jest bardzo długa funkcja, ale nie wszyscy mają myśleć intensywnie o jak go o coraz sznurki. Tak tu jest mój bufor i najwyraźniej zainicjować go na null. To, oczywiście, jest samo, jak gwiazdy char, ale zdecydowałem się wdrażanie biblioteki CS50 że jeśli mamy zamiar być całkowicie dynamiczny, Nie wiem z wyprzedzeniem jak duży użytkowników smyczkowych będą chcieli dostać. Więc mam zamiar zacząć tylko z pustym ciągiem znaków i mam zamiar budować tyle Pamięć jak trzeba dopasować ciąg użytkownika a jeśli nie mam tyle, mam zamiar zapytać system operacyjny, aby uzyskać więcej pamięci. Mam zamiar przenieść swój ciąg do większego kawałka pamięci i mam zamiar zwolnić lub uwolnić wystarczająco duży fragment pamięci a my po prostu się to zrobić iteracyjnie. Tak szybki rzut oka, tutaj jest po prostu zmienna z którym mam zamiar śledzić zdolności mojego bufora. Ile bajtów mogę zmieścić? Oto zmiennej n, które mam zamiar utrzymać utwór o tym, jak wiele bajtów są rzeczywiście w bufor lub że użytkownik wpisał. Jeśli nie widziałem tego wcześniej, ci Można określić, że zmienna jak int jest niepodpisany, które jak sama nazwa wskazuje, Oznacza to nieujemna i dlaczego będzie I nigdy nie chce niepokoić określające że nie tylko int int, ale niepodpisany int? To nieujemną int. Co oznacza [niesłyszalne] oznacza? PUBLICZNOŚCI: To opisujący ilość pamięci, która może być [niesłyszalne]. DAVID MALAN: Tak. Więc jeśli powiem, bez znaku, to jest rzeczywiście co daje jeden trochę dodatkowej pamięci i wydaje się trochę głupie, ale jeśli jeden trochę dodatkowej pamięci, że oznacza, że ​​masz dwa razy tyle Wartości można reprezentują, ponieważ może on być 0 lub 1. Więc domyślnie, int może być mniej ujemna 2 mld na drodze do pozytywnego 2 mld. To są duże zakresy, ale to wciąż rodzaj marnotrawstwa jeśli tylko o rozmiary, które po prostu intuicyjnie powinna być ujemna lub dodatnie lub 0, a następnie, dlaczego marnujesz 2 miliardy Możliwe wartości dla liczb ujemnych jeśli nigdy nie będziemy z nich korzystać? Więc mówiąc niepodpisany, teraz mój int może być pomiędzy 0 a około 4 mld. Więc tutaj jest po prostu int C z powodów nie dostaniemy się właśnie teraz, dlaczego jest to int zamiast z char, ale tutaj jest istota tego, co się dzieje na, a niektórzy z was może być używany, na przykład, fgetc funkcji nawet w pset czterech lub później, będziemy go zobaczyć ponownie w problemu ustawić pięć, fgetc jest dobre, bo jak nazwa rodzaj, rodzaj arcanely sugeruje, jest to funkcja, która dostaje charakter i tak, co zasadniczo różni o tym, co robimy w getString jest nie używamy scanfa w taki sam sposób. Jesteśmy po prostu pełzanie wraz krok po kroku przez co użytkownik wpisane, ponieważ zawsze możemy przydzielić jeden char, i tak zawsze możemy bezpiecznie wyglądają z jednej odbarwiającego w czasie, magia zaczyna się dziać tutaj. Zamierzam przejść do środek tej funkcji tylko pokrótce przedstawić tę funkcję. Podobnie jak tam jest Funkcja malloc, nie funkcja realloc gdzie realloc pozwala ci przydzielić kawałek pamięci i sprawiają, że większe lub mniejsze. Tak w wielkim skrócie i fala mojej strony na dzisiaj, wiem, że to, co getString robi to jest coś w rodzaju z magicznie rośnie lub kurczy się bufor, jak użytkownik typy w jego ciąg. Więc jeśli użytkownik wpisze krótki ciąg znaków, kod tylko przydziela tyle Pamięć dopasować ciąg. Jeśli użytkownik trzyma pisania jak ja go znowu i znowu i znowu, dobrze, jeśli bufora początkowo ten wielki , program realizuje, na Chwileczkę, jestem z przestrzeni, to się podwoić rozmiar bufora a następnie dwa razy rozmiar bufora i kod, który robi podwojenie, jeśli spojrzymy na to tutaj, to tylko ten sprytny-liner. Może nie widzieliście tej składni wcześniej, ale jeśli powiesz, że gwiazda jest równy, to jest to samo, co mówiąc razy pojemności 2. Więc to tylko trzyma podwajając Wydajność buforze a następnie mówi realloc dać Sam, że o wiele więcej pamięci. Teraz, na marginesie, nie są inne funkcje w tutaj że nie będziemy patrzeć na jakiekolwiek szczegóły inne niż do wyświetlenia w GetInt, używamy w GetInt getString. Sprawdzimy, że nie jest null, która, przypomnijmy, jest specjalna wartość, która oznacza coś poszło nie tak. Jesteśmy pamięci. Lepiej sprawdź to. I wracamy wartości wskaźnikowych. Ale będę odroczyć do uwag co do dlaczego, a potem użyć tego kuzyn scanf nazywa sscanf i okazuje się, że scanf sscanf, lub ciąg znaków, pozwala spojrzeć na linii, które wpisane przez użytkownika i niech cię w analizować zasadniczo i co jestem tu robisz jest Mówię sscanf, analizować, co użytkownik ma wpisane i upewnij% I, nie jest liczbą całkowitą w nim, i nie będzie dostać się do dziś, dlaczego nie ma również a% c tutaj, ale w skrócie pozwala nas, aby wykryć, czy użytkownik wpisał w coś fałszywego po numerze. Więc dlatego, że GetInt i GetString powiedzieć, aby ponowić próbę, ponownie, ponownie Jest tak, ponieważ ze wszystkich że kod pisaliśmy, To trochę patrząc na wejście użytkownika upewniając się, że to całkiem numeryczny czy jest to rzeczywista zmiennoprzecinkowych Wartość punktu lub podobne, W zależności od wartości funkcjonować używasz. Ufff. OK. To był łyk ale chodzi o to, że powodem mieliśmy te kółka na Jest tak, ponieważ na najniższym poziomie Jest tak wiele rzeczy, które może pójść nie tak, że chcieliśmy do zapobiegawczo obsługi te rzeczy na pewno w Pierwsze tygodnie klasy, ale teraz z pset cztery i pset pięć i poza widać, że jest to bardziej do ty, ale również jesteś bardziej zdolny rozwiązywania tego rodzaju problemów samodzielnie. Wszelkie pytania dotyczące getString lub GetInt? Tak? PUBLICZNOŚCI: Dlaczego chcesz podwoić Wydajność buforze a nie tylko zwiększenie to przez dokładnej kwoty? DAVID MALAN: Dobre pytanie. Dlaczego mielibyśmy podwojenie zdolności bufora zamiast po prostu zwiększenie jej przez jakąś stałą wartość? To była decyzja projektowa. My po prostu uznał, że ponieważ ma tendencję do być trochę drogie, czas mądry zapytać System operacyjny za pamięć, my nie chcesz skończyć się w sytuacja dla dużych ciągów które pytaliśmy znowu i znowu OS i znowu i znowu w szybka sukcesja dla pamięci. Więc po prostu zdecydował, nieco arbitralnie ale mamy nadzieję, rozsądnie, że, wiesz co, niech postarać się przed siebie i po prostu podwojenie go tak, że zminimalizować ilość razy mamy zadzwonić malloc lub realloc, ale w sumie wyrok zadzwonić w przypadku braku znajomości co użytkownicy mogą chcieć wpisać. Oba sposoby mogą być dyskusyjne. Prawdopodobnie dobre. Warto więc przyjrzeć się kilku od innych skutków ubocznych pamięci rzeczy, które mogą pójść źle i narzędzi, które można używać do połowu tego rodzaju błędów. Okazuje się, wszyscy z was, nawet jeśli check50 nie powiedział ci tyle, pisali buggy Kod od tygodnia, nawet jeśli wszystkie testy check50 są minął, a nawet jeśli ty i twój TF są bardzo pewni, że Twój kod działa zgodnie z przeznaczeniem. Twój kod jest wadliwy lub wadliwy, że wszyscy z was, w korzystaniu z biblioteki CS50, zostały wyciek pamięci. Byłaś prosi system operacyjny do pamięci w większości programów napisałeś, ale masz nigdy nie podano go z powrotem. Masz nazywa GetString i GetInt i GetFloat, ale z getString, masz nigdy nie nazywa unGetString lub Give String Powrót lub podobne, ale widzieliśmy że GetString nie przydzielić pamięci w drodze malloc lub tego Funkcja realloc, który jest po prostu bardzo podobne w duchu, a jednak, byliśmy zwracając się do systemu operacyjnego dla pamięci i pamięci ponownie i ponownie ale nigdy nie dając go z powrotem. Teraz, na marginesie, to okazuje się, że gdy program kończy działanie, wszystkie pamięci jest automatycznie usuwane. Więc to nie był to ogromny problem. To się nie złamać IDE lub spowolnić, Ale kiedy programy zrobić ogólnie wyciek pamięci i są one uruchomione przez długi czas. Jeśli kiedykolwiek widział głupiego Malutki Piłka plażowa w Mac OS lub klepsydry w systemie Windows, gdzie jest to rodzaj spowolnienie lub myśli i myślenie lub po prostu naprawdę zaczyna spowolnić do indeksowania, to bardzo prawdopodobne może być skutkiem nieszczelności pamięci. Programiści, którzy pisali oprogramowanie używasz zwrócić się do systemu operacyjnego dla pamięci co kilka minut, co godzinę. Ale jeśli uruchamiając oprogramowanie, nawet jeśli jest to zminimalizowane w komputerze przez kilka godzin lub dni, w celu można prosić o więcej i więcej pamięci i nigdy nie korzystali z basenu i tak kod może być, lub programy mogą być wyciek pamięci, i jeśli zaczniesz wycieki pamięci, jest mniej pamięci dla innych programów, a efekt jest spowolnić wszystko w dół. Teraz, jest to zdecydowanie jeden z najbardziej okrutne programy będziesz mieć możliwości do pracy w CS50 zakresie a jego produkcja jest jeszcze bardziej ezoteryczny niż szczęk lub zrobić lub którykolwiek z polecenia Linia jakie programy prowadzone wcześniej, ale na szczęście, osadzone w swojej produkcji Jest kilka bardzo pomocnych wskazówek, które będą przydatne zarówno dla pset czterech czy na pewno pset pięć. Więc valgrind jest narzędziem który może być użyty do sprawdzenia przecieków pamięci w programie. Jest to stosunkowo prosty do uruchomienia. Uruchomić valgrind a następnie, nawet choć jest to trochę rozwlekły, Kontrola szczelności kreska kreska równa się pełna, a następnie kropka slash i nazwa programu. Więc valgrind następnie uruchomić program a na samym końcu programu uruchomiony, zanim zostanie zamknięty i daje się kolejny monit, to będzie analizować Program natomiast, że został uruchomiony i powiedzieć, czy wyciek żadnej pamięci, a jeszcze lepiej, nie dotykać pamięć nie należy do ciebie? To nie może złapać wszystko, ale to całkiem dobry wzrok większość rzeczy. Więc tutaj jest przykład z mojego mającego metę ten program, o run valgrind, na program o nazwie Pamięć i idę aby zaznaczyć linie, które są ostatecznie nas interesują. Więc jest jeszcze więcej rozrywki że już usunięte z zjeżdżalnią. Ale niech po prostu zobaczyć, co to Program jest w stanie powiedzieć nam. Jest w stanie powiedzieć nam rzeczy jak niepoprawnego zapisu wielkości 4. Innymi słowy, jeśli dotykać pamięci, konkretnie 4 bajty pamięci że nie powinien mieć, valgrind mogę ci powiedzieć. Nieprawidłowy zapis wielkości 4. Dotknąłeś cztery bajty że nie powinien mieć. Gdzie pan to zrobił? To jest piękno. Pamięć c kropka linia 21 jest tam, gdzie wkręca się i dlatego jest to pomocne. Podobnie jak GDB, może pomóc punktu, w faktycznym błędem. Teraz, ten jest trochę więcej gadatliwy, jeśli nie mylące. 40 bajtów 1 bloków są zdecydowanie utracone w rekordzie strat 1 z 1. Co to znaczy? Cóż, to po prostu oznacza, że ​​poprosił o 40 bajtów i nigdy nie oddał. Nazwałeś malloc lub dzwoniłeś GetString i system operacyjny dałem 40 bajtów, ale nigdy nie uwolnione lub udostępnione, że pamięć, i żeby być w porządku, my nigdy nie pokazują Ci, jak oddać pamięć. Okazuje się, że jest super Prosta funkcja nazywa darmo. Przyjmuje jeden argument, na rzecz Aby zwolnić lub oddać, ale 40 bajtów, najwyraźniej, w tym programie zostały utracone na linii 20 pamięci dot c. Zobaczmy więc, ten program. To super bezużyteczne. To tylko pokazuje, ten konkretny błąd. Warto więc przyjrzeć. Oto główne i najważniejsze, zawiadomienia, rozmowy funkcja o nazwie F, a następnie wraca. Więc nie wszystko, co ciekawe. Co f zrobić? Zauważ, że nie przeszkadzało z prototypem. Chciałem zachować kod możliwie jak najmniejszy. Włożyłem więc f powyżej głównym i to jest w porządku, na pewno, dla krótkich programów takich jak ten. Więc f niczego nie wrócić i nie Nie ma nic, ale to nie to zrobić. Deklaruje, podobnie jak na przykład binky, wskaźnik o nazwie x, że będzie przechowywać adres int. Więc to jest lewa strona. W języku angielskim, co jest prawa strona robi? Każdy, kto? Co to robi dla nas? Tak? PUBLICZNOŚCI: [niesłyszalne] razy większe int która jest 10 razy, że [niesłyszalne] DAVID MALAN: Dobry i pozwól mi podsumować. Więc przeznaczyć wystarczająco dużo miejsca dla 10 liczb całkowitych lub 10, co jest rozmiar int, to cztery bajty, więc 10 razy 4 jest 40, tak, że po prawej stronie, że mam Podświetlona jest mi dać 40 bajtów i przechowywać adres pierwszego bajtu do x. A teraz na koniec, a tu, gdzie ten program jest wadliwy, co jest tak z linii 21 na podstawie tej logiki? Co jest nie tak z linii 21? Tak? PUBLICZNOŚCI: Nie możesz Strona jest w x [niesłyszalne]. DAVID MALAN: Tak. Nie powinienem indeks do x w tym stylu. Więc składniowo, to jest OK. Co miłe jest, podobnie jak Ciebie można traktować nazwę tablicy jakby to wskaźnik, podobnie można traktować wskaźnik jakby to tablica, i tak mogę składniowo Wspornik coś powiedzieć, x, x uchwyt i, ale 10 jest problematyczne. Czemu? PUBLICZNOŚCI: Bo to nie jest w środku. DAVID MALAN: Nie wewnątrz tego kawałka pamięci. Jaka jest największa wartość Powinienem być wprowadzenie w tych nawiasach kwadratowych? 9, od 0 do 9. Ze względu na zerowej indeksowania. Więc od 0 do 9 będzie dobrze. Wspornik 10 nie jest dobre, a ale, pamiętam jednak, za każdym razem, Wydaje mi się, aby spróbować zrobić CS50 IDE Crash wpisując wartości fałszywych, nie zawsze współpracują, i rzeczywiście, często miał szczęście tylko dlatego, że System operacyjny nie działa zauważysz, że zawsze tak lekko zdać jakiś fragment pamięci, dlatego, że pozostał w technicznie Twój segmentu, ale o tym w klasie systemów operacyjnych, i tak coś takiego może bardzo łatwo przejść niezauważony. Twój program nie będzie katastrofy konsekwentnie, ale być może raz na jakiś czas. A więc spróbujmy valgrind na ten temat, a tu gdzie będziemy się przytłoczony przez wyjście na chwilę. Więc dokonać pamięci próbę szczelności valgrind równa pełnej pamięci kropka slash. A oto dlaczego obiecuję to będzie przytłaczać. Oto co valgrind, oto co programista, kilka lat temu- zdecydował, że będzie to dobry pomysł na wyjście wyglądać. Warto więc sensu w tym. Tak więc przez całą drogę z lewej ręki boczne bez powodu jest identyfikator procesu programu po prostu działać, niepowtarzalny identyfikator programu po prostu uciekł. Mamy usunięty, że od slajd, ale nie jest kilka przydatnych informacji tutaj. Miejmy przewijać się na sam szczyt. Oto, gdzie zaczęliśmy. Więc to nie jest aż tak dużo wyjście. Oto, że nieważne zapisu wielkości 4 na linii 21. Cóż, to, co było linii 21? Linia 21 było dokładnie to i to ma sens że jestem w ważnie pisanie 4 bajty, bo jestem starają się umieścić tę liczbę całkowitą, co mogłoby być w ogóle, to po prostu dzieje się zero, ale staram umieścić go w miejscu które nie należą do mnie. Co więcej, tu, 40 bajty w jednym Bloki są zdecydowanie stracił w rekordzie 1. To dlatego, że gdy zgłoszę malloc tutaj, nigdy tak naprawdę zwolnić pamięć. Więc jak można rozwiązać ten problem? Pozwólcie mi iść do przodu i być trochę bezpieczniej i zrobić 9 nie i niech mnie tu bezpłatne x. Jest to nowa funkcja na dzisiaj. Jeśli teraz ponownie uruchomić dot memory ukośnik, niech na nim uruchomić valgrind ponownie zmaksymalizować okno i naciśnij Enter. Teraz, to jest dobre. Pochować ich dobrą nowinę We wszystkich tego wyjścia. Wszystkie bloki sterty były wolne. Wrócimy do tego, co stercie jest, ale nie ma wycieków są możliwe. Więc jest to tylko kolejny Narzędzie do zestawu narzędzi z którym można zacząć znaleźć teraz błędów takich jak to. Ale zobaczmy, co więcej może się nie udać się tutaj. Miejmy przejście teraz właściwie rozwiązanie problemu. Tak na marginesie, czy to będzie zwolnić Trochę zamieszania i napięcia, teraz jest to śmieszne. Tak. To dość dobre. Ponieważ wskaźniki są adresy i adresy ogólnie przyjętą konwencją napisane szesnastkowym. Ha, ha, to jest śmieszne. Tak czy inaczej, więc niech teraz rzeczywiście rozwiązać problem. To było bardzo, bardzo niski poziom tej pory, i możemy faktycznie użyteczne rzeczy z tych szczegółów niskiego poziomu. Więc wprowadziliśmy kilka tygodni temu pojęcie tablicy. Tablica było miłe, bo trudno jest oczyścić nasz kod bo jeśli chcemy napisać Program z wieloma studentami lub wielu nazw i domy i akademików i uczelni i wszystko to, możemy przechowywać wszystko więcej czysto w środku tablicy. Ale proponuję jedną wadę tablicy tej pory. Nawet jeśli wcześniej nie cierpiała go samodzielnie w programie, tylko instynktownie, to, co jest złe o tablicy, być może? Słyszę jakieś szepty. PUBLICZNOŚCI: Trudno aby zmienić rozmiar. DAVID MALAN: Trudno aby zmienić rozmiar. Nie można zmienić rozmiaru tablicy, w rzeczywistości, per se w C. Możesz przydzielić inną tablicę, przenieść wszystko od starego na nowy, a teraz mają trochę wolnego miejsca, ale to nie jest jak język jak Java czy Python lub dowolne inne języki z których niektórzy z was może znać gdzie może po prostu zachować dodając rzeczy znudzenia do końca tablicy. Gdy masz tablicę Rozmiar 6, które jest jego wielkość, i tak dużo jak pomysł wcześniej bufor o określonej wielkości, musisz zgadywać z bramy jaki rozmiar chcesz go mieć? Jeśli chyba zbyt duże, marnujesz miejsca. Jeśli chyba zbyt małe, Nie można przechowywać te dane, co najmniej nie dużo więcej pracy. Więc dzisiaj, dzięki wskazówek, możemy rozpocząć szycie wraz własny zwyczaj struktury danych, a Fakt, jest tu coś że wygląda trochę więcej tajemnicze na pierwszy rzut oka, ale to jest to, co my nazywamy powiązane lista, a jego nazwa rodzaju podsumowanie ono. Jest to lista numerów, lub w tym przypadku, wykaz numerów, ale może to być lista z niczego, ale to jest połączone ze sobą za pomocą strzałek, i po prostu zgadywać z tego, co technika będziemy w stanie zszyć razem, coś jak popcorn z wątku, Listy wiązana prostokąty tutaj? Jego numery? Jaka jest funkcja język podstawowy? PUBLICZNOŚCI: Wskaźnik. DAVID MALAN: Wskaźnik. Tak więc każdy z tych strzałek tutaj reprezentuje wskaźnik lub po prostu adres. Więc innymi słowy, jeśli chcę do przechowywania listy numerów Nie mogę po prostu zapisać go, jeśli chcę zdolność do wzrostu i kurczyć moja struktura danych w tablicy. Więc muszę mieć trochę więcej wyrafinowania, ale zauważ, że ten obraz rodzaj sugeruje że jeśli właśnie dostał małe wątki łączenia wszystkiego ze sobą, Prawdopodobnie nie jest to, że trudno, aby zrobić miejsce między dwa z tych prostokątów lub dwa z tych węzłów, jak zaczniemy nazywając je umieścić w nowym węźle, a następnie z jakiegoś nowego wątku, po prostu rów trzy węzły razem, pierwszy, ostatni i jeden że po prostu umiejscawia się w środku. I rzeczywiście połączonej listy, w przeciwieństwie do tablicy, jest dynamiczny. Może rosnąć, a to może kurczą się, a ty nie trzeba znać lub opieki z góry how wiele danych idziesz do przechowywania, ale okazuje się, że musimy być trochę Uważaj, jak zaimplementować to. Więc najpierw rozważmy, jak wdrożyć jednego z tych małych prostokątów. Jest to łatwe do wdrożenia int. Wystarczy powiedzieć, int n, a następnie masz 4 bajty na int, ale jak mogę int, nazywamy to n, a następnie wskaźnik, nazwijmy to w przyszłym. Możemy nazwać je rzeczy, cokolwiek chcemy ale muszę strukturę niestandardowych danych. Tak? PUBLICZNOŚCI: Ampersand [niesłyszalne]. DAVID MALAN: Tak handlowe i będziemy używać do uzyskać adres węzła potencjalnie. Ale potrzebujemy innego cechą C w celu dać mi możliwość tworzenia zwyczaj ten prostokąt, ten zwyczaj jeśli będzie zmienna w pamięci. PUBLICZNOŚCI: struct. DAVID MALAN: struct. Przypomnijmy, z ostatniego tygodnia, wprowadziliśmy struktura, to stosunkowo proste słowo kluczowe który pozwala nam dokonać takich rzeczy. C nie pochodzą z danych Struktura nazywa studenta. Pochodzi z pływakiem i int i char i takie, ale nie pochodzi z uczniem, ale możemy stworzyć typ danych student, struktura student, z tej składni tutaj. I zobaczysz to znowu i znowu. Więc nie martw się o zapamiętywania słów kluczowych, ale kluczowe jest to ważne jest, tylko fakt, że powiedział struct i wtedy nazwał go ucznia i wewnątrz studenta była nazwa i dom lub w akademiku lub podobne. A więc teraz już, niech proponują. Dodałem kilka słów, ale jeśli chcę do wdrożenia tego prostokąta, który jest ma zarówno int i kolacja wskaźnik, wiesz co, jestem zamiar oświadczyć struct nazwie węzła. Jestem też, w jej wnętrzu, powie że węzeł ten prostokąt, ma int a my go nazywamy n oraz ma kolejny wskaźnik. I to jest trochę rozwlekły, ale jeśli myślisz o tym, Strzałki, które były w obrazie przed chwilą to, jaki rodzaj danych? Przy czym każdy z tych strzałek wskazuje jaki rodzaj struktury danych? To nie jest skierowany tylko do int per se. Jest skierowany do Cała prostokątna rzeczą i że prostokątne rzeczą, powiedzieliśmy, jest nazywany węzłem. A więc my niby trzeba rekurencyjnie zdefiniować to takie że węzeł, powiedzmy, zawiera int nazwie n i wskaźnik zwany obok i typ struktury danych, do której że wskaźnik wskazuje jest najwyraźniej będzie struct node. Więc to jest irytująco gadatliwy i po prostu być pedantyczny dlatego nie możemy po prostu powiedzieć, że to, co szczerze mówiąc wygląda o wiele bardziej czytelny, Jest tak, ponieważ Przypomnijmy, że C przeczytać rzeczy, od góry do dołu, od lewej do prawej. To nie jest aż dojdziemy średnik że węzeł kluczowe faktycznie istnieje. Więc jeśli chcemy mieć tego rodzaju cykliczne odniesienia wewnątrz danych Struktura, musimy to zrobić, gdzie mówimy węzeł struct na górze, która daje nam dłuższą sposób opisywania tego rzeczą, następnie wewnątrz mówimy węzeł struct, a następnie w ostatniej linii mówimy, wszystko w porządku, C, przy okazji, zadzwoń ten cały cholerny rzeczą węzeł i zatrzymać za pomocą słowa kluczowego struct całkowicie się. Więc to jest po prostu coś w rodzaju składniowym Sztuką, która ostatecznie pozwala nam tworzyć coś, co wygląda dokładnie tak. Tak więc, jeśli założymy, teraz możemy wdrożyć tę rzecz w C, W jaki sposób właściwie rozpocząć przejeżdżające? Cóż, w rzeczywistości, wszystko co musisz zrobić, to iteracyjne od lewej do prawej i po prostu rodzaj wstawić węzły lub usunąć węzły lub wyszukaj rzeczy, wszędzie tam, gdzie chcemy, ale aby to zrobić, idziemy do przodu i zrobić rzeczy trochę bardziej realne, ponieważ jest bardzo niski poziom tej pory. Czy ktoś dosłownie lubią być pierwszy? OK. Chodź na górę. Jak masz na imię? DAVID: David. DAVID MALAN: David. Miło cię poznać. Ja też. W porządku. A my potrzebujemy numer 9. Nie tak dobry jak pierwszy, być może. OK, numer 9. Numer 17, proszę. Pozwól mi wrócić trochę dalej. Numer 22, proszę, i jak się dalej wstecz jeśli widzę żadnych ręce ze wszystkimi świetle lub nie. Ktoś jest na ochotnika tam. Chcesz wymyślić? Twój przedramienia jest siłą idzie w górę. OK, 17. . 22 26 idzie w dół. Czy ktoś jeszcze chciał forcefully-- Chodź. Rzeczywisty wolontariuszy. Tak bardzo szybko, jeśli wam się zorganizować się po prostu podoba węzły na ekranie. Dziękuję. I będziesz 26. Wszystkie właściwe i szybkie wstępy. Więc jestem Dawid i jesteś też? DAVID: David. DAVID MALAN: A ty jesteś? JAKE: Jake. Sue Sue. ALEX: Alex. RAPHAEL: Raphael. TAYLOR: Taylor. DAVID MALAN: Taylor. Doskonałe. To są nasi wolontariusze do dziś i iść do przodu i przesunąć trochę w ten sposób, i po prostu iść dalej i utrzymać trzymając swoje numery jak ty lub twoi Pierwszy znak i za pomocą lewej ręki, śmiało i po prostu wdrożyć te strzały, po prostu tak, że lewa ręka jest dosłownie wskazując na co należy zwrócić w, i dać sobie trochę miejsca, tak aby możemy naocznie zobaczyć swoje ramiona rzeczywistości wskazując, a może po prostu wskazać jakby na ziemi jest w porządku. Więc tutaj mamy połączonej listy jednego, dwa, trzy, cztery, pięć węzłów początkowo, i zauważyć, mamy ten specjalny wskaźnik na początku, kto jest klucz, ponieważ mamy do śledzenia całej listy długość jakoś. Ci faceci, nawet jeśli są one pozostawione do prawej, z powrotem do tyłu w pamięci, mogą one być wszędzie w pamięci komputera. Więc ci faceci mogą być stojąc w dowolnym miejscu na scenie i to jest w porządku, tak długo, jak są one faktycznie, wskazując na siebie, ale do przechowywania rzeczy czyste i proste, będziemy wystarczy wyciągnąć je od lewej do prawej, jak to, ale nie może być ogromne luki Pomiędzy tymi węzłami. Teraz, jeśli chcę, aby faktycznie wprowadzić pewne nowa wartość, idziemy naprzód i to zrobić. Mamy szansę teraz wybrać inny węzeł. Powiedzieć, zacznijmy od z mallocing 55. Czy ktoś przeszkadza malloc? OK, chodź na górę. Jak masz na imię? RAINBOW: Rainbow. DAVID MALAN: Rainbow? W porządku. Malloc Rainbow. Chodź na górę. Więc teraz musimy zadać sobie pytanie, algorytmicznie, gdzie możemy umieścić 55. Tak więc każdy z nas wie, oczywiście, gdzie prawdopodobnie należy, jeśli chcemy zachować to klasyfikowane i jeśli wy może przyjąć jedną krok do tyłu, więc nie spaść etap, że byłoby świetnie. Tak naprawdę, Tęcza, rozpocząć tutaj ze mną, bo jak komputer teraz może zobaczyć tylko jedną zmienną w czasie. Tak więc, jeżeli jest to pierwszy węzeł. Zauważ, że nie jest węzłem, on jest tylko wskaźnikiem, i dlatego on wyciągnąć się tylko wielkość wskaźnika nie jeden z tych pełnych prostokątów. Tak więc mamy zamiar sprawdzić na siebie iteracja jest 55 mniej niż 9? Nie. Czy 55 mniej niż 17 lat? Nie. Mniej niż 22? Mniej niż 26 lat? Mniej niż 34? A więc teraz, oczywiście Rainbow należy na końcu. Więc być jasne, a co było na imię, Taylor? TAYLOR: Taylor. DAVID MALAN: Tak między Taylor lewa ręka i ręce Rainbow jest tutaj, czyja ręka musi wskazywać na to, co w Aby wstawić 55 na tej liście? Co trzeba zrobić? Tak? PUBLICZNOŚCI: ręka Taylora musi wskazać w lewo. DAVID MALAN: Dokładnie. Więc wstawienie węzła na koniec listy Jest to bardzo proste, ponieważ Taylor po prostu ma wskazywać, zamiast w podłożu lub nazwijmy to null null jest rodzaj nieobecności od wskaźnika lub specjalny zerowy wskaźnik, że jesteś będzie wskazywać z lewej Ręka w Rainbow a następnie Rainbow, Gdzie lewej Prawdopodobnie ręcznie wskazać? W dół. To nie jest dobre, jeśli jej ręka jest rodzajem wskazując się tutaj lub rodzaj dowolny która droga. To byłoby uznane za wartość śmieci, ale jeśli ona wskazuje na niektóre znana wartość, będziemy Nazywamy to zero lub wartość null, to jest OK bo mamy termin w tym i wiemy, że lista jest zakończona. Więc co innego stosunkowo prosta sprawa? Czy możemy malloc 5? Chodź na górę. Jak masz na imię? TIFFANY: Tiffany. DAVID MALAN: przepraszam? TIFFANY: Tiffany. DAVID MALAN: Tiffany. W porządku. Tiffany został malloced o wartości 5. Chodź na górę. Ten jest stosunkowo łatwa, ale rozważmy kolejność operacji teraz. To było całkiem proste z Taylor na końcu. Numer 5 jest oczywiście mniejszy niż 9, i tak mamy Dawida, mamy Tiffany, a co masz na imię? JAKE: Jake. DAVID MALAN: Jake. Tiffany, Jake i David. Czyja ręka powinna być pierwszy zaktualizowany? Co chcesz robić tutaj? Istnieje kilka możliwych sposobów, ale tam również jeden lub więcej złe drogi. PUBLICZNOŚCI: Zacznij skrajnej lewej. DAVID MALAN: Zacznij od skrajnej lewej. Kto jest tu najbardziej na lewo, a następnie? PUBLICZNOŚCI: Po pierwsze. DAVID MALAN: OK. Tak rozpoczyna się pierwsza i gdzie chcesz zaktualizować ręce Dawida być? PUBLICZNOŚCI: Pod 5. DAVID MALAN: OK. Dawid, punkt, w pięciu lub Tiffany tu i teraz? PUBLICZNOŚCI: Tiffany wskazuje na 9? DAVID MALAN: Perfect, z wyjątkiem Binky na szef po prostu rodzaj spadł, prawda? Bo to, co się dzieje z ten obraz dosłownie? PUBLICZNOŚCI: Nic nie wskazuje. DAVID MALAN: Nic nie jest wskazując na Jake'a teraz. Mamy dosłownie osierocone 9 i 17, i mamy dosłownie wyciekała z tej pamięci, ponieważ przez aktualizowanie rękę Dawida pierwsze, to w porządku, o ile jest prawidłowo wskazując na Tiffany teraz ale jeśli nikt nie miał foresight wskazać na Jake'a, potem straciliśmy Całość tej listy. Warto więc cofnąć. Więc to była dobra rzecz potknąć, ale niech poprawić teraz. Co powinniśmy zrobić w pierwszej kolejności, a nie? Tak? PUBLICZNOŚCI: Tiffany powinien wskazywać na 9? DAVID MALAN: nie mogę uzyskać tak blisko Ciebie. Kto powinien wskazywać na 9? PUBLICZNOŚCI: Tiffany. DAVID MALAN: Wszystko w porządku. Więc Tiffany powinien pierwszy punkt na 9. Więc Tiffany powinny na identycznej wartości do Dawida, który wydaje zbędne na chwilę, ale to dobrze, bo teraz, druga krok, możemy aktualizować rękę Dawida wskazać na Tiffany, a następnie, jeśli my po prostu rodzaj czyste rzeczy do góry jako że jest to rodzaj wiosennej, teraz, że jest to prawidłowe wstawiania. Tak doskonałe. Więc teraz jesteśmy prawie na miejscu. Miejmy wstawić jeden finał wartość jak wartość 20. Gdybyśmy mogli malloc ostatnią wolontariuszem? Chodź na górę. Więc ten jeden to trochę bardziej skomplikowane. Ale tak naprawdę, kod jesteśmy pisanie, choć werbalnie, jest po prostu jak o kilka od tego, czy zostały spełnione warunki, prawda? Mieliśmy stan sprawdzenie, czy należy Na koniec, może początku. Potrzebujemy pewnego rodzaju pętli do znaleźć miejsce w środku. Więc zróbmy to, że z tego, co masz na imię? ERIC: Eric. DAVID MALAN: Eric? Eric. Miło cię poznać. Mamy więc 20. Mniej niż pięć? Nie. Mniej niż dziewięciu? Nie. Mniej niż 17 lat? Nie. OK. On należy tu wasze imiona znów są? Sue Sue. DAVID MALAN: Sue. ALEX: Alex. DAVID MALAN: Sue, Alex, i? ERIC: Eric. DAVID MALAN: Eric. Których ręce muszą uzyskać zaktualizowane pierwszy? PUBLICZNOŚCI: Eric. OK. Więc Eric powinien wskazywać na to gdzie? W 22. Dobry. A teraz co dalej? Sue może to wskazywać na Erica a teraz, jeśli faceci po prostu zrobić trochę miejsca, które jest w porządku wizualnie, teraz zrobiliśmy wprowadzenie. Więc teraz rozważyć pytanie, ale dziękuję bardzo za naszych wolontariuszy. Bardzo dobra robota. Możesz zachować te, jeśli chcesz. I mamy piękny pożegnalny prezent jeśli chcesz wziąć każdy lubi piłkę stres. Pozwól mi tylko przejść to w dół. Więc co jest na wynos z tego? To wydaje się być niesamowite o ile mamy teraz wprowadził alternatywa Tablica, która nie jest tak ograniczona do tablicy pewnej ustalonej wielkości. Mogą rozwijać się dynamicznie. Ale tak jak widzieliśmy w tygodniach przeszłości, nigdy nie dostaniesz nic za darmo, jak na pewno nie jest to kompromis tutaj. Więc z upside wiązany lista, jest to dynamika? Ta zdolność do wzrostu i szczerze mówiąc, mogliśmy zrobić kasowania i mogliśmy kurczyć w miarę potrzeb. Jaką cenę płacimy? Dwa razy tyle miejsca, przede wszystkim. Jeśli spojrzeć na zdjęcie, nie jestem przechowywania listę liczb całkowitych. Jestem przechowywania listę całkowite plus wskaźniki. Jestem więc podwojenie ilości miejsca. Teraz, być może, że nie jest to takie wielkiego, 4 bajty, 8 bajtów, ale z pewnością mogą dodać się dla dużych zbiorów danych. Co znajduje się w innym minusem? Tak? PUBLICZNOŚCI: Musimy przemierzać je jeden po drugim. DAVID MALAN: Tak. Musimy przechodzić je jeden po drugim. Wiesz co, daliśmy się tym super wygodna funkcja nawiasach kwadratowych zapis, bardziej poprawnie znany jako losowego dostępu gdzie możemy po prostu skoczyć do pojedynczego elementu ale teraz, gdy miałem jeszcze tutaj moje wolontariuszy, gdybym chciał znaleźć Numer 22, nie mogę po prostu Uchwyt coś przeskoczyć do czegoś. Muszę patrzeć na liście, o wiele jak nasze przykłady przeszukiwania liniowo, znaleźć numer 22. Tak więc wydaje się, że zapłacił nie cenę. Ale możemy jednak rozwiązać inne problemy. W rzeczywistości, pozwól mi przedstawić tylko kilka wizualizacji. Więc jeśli już się do Sala jadalna Mather w ostatnim czasie, przypomnijmy sobie, że ich stosy tacek takich jak ta, pożyczyliśmy je od Annenberg przed klasą. Więc ten stos tac, choć, jest przedstawicielem rzeczywiście struktury danych informatycznej. Jest struktura danych w informatyce znany jako stos, który bardzo ładnie nadaje się do dokładnie tego wideo. Tak więc, jeśli każdy z tych zasobników nie jest tacy, ale jak liczba i chciałem do przechowywania numerów, ja może umieścić jeden tu, i mogłem umieścić tu innego, i kontynuować układanie liczb na jeden na drugim, a co potencjalnie pomocne na ten temat jest to, że to, co jest implikacja tej struktury danych? Jaki numer można wyciągnąć Pierwszy najwygodniej? Ostatnio jeden umieścić tam. Więc to jest to, co nazywamy w informatyka struktura danych LIFO. Trwać, pierwsze wyszło. Zobaczymy niebawem, dlaczego które mogą być przydatne, ale teraz, tylko za nieruchomość. I to jest głupie, jeśli myślisz o tym, jak jadalnia robi. Za każdym razem, gdy czyste tace i umieścić najświeższych tych na górze, Można mieć wcześniej czyste ale w końcu bardzo brudne i zakurzone podajnik na samym dole Jeśli nigdy w rzeczywistości dostać się do dołu, że stos, bo ciebie tylko utrzymać wprowadzenie nowych i czyste te na wierzchu. To samo może się zdarzyć w supermarkecie też. Jeśli masz gablotę mleka i za każdym razem CVS czy kto dostaje więcej mleka, po prostu wpakować się mleczka masz już do tyłu i umieścić te nowe góry, będziesz mieć trochę dość nieprzyjemny mleko w końcu struktury danych bo to zawsze na dnie lub równoważnie, że zawsze z tyłu. Ale istnieje inny sposób myślenia o w kolejce danych i na przykład, to. Jeśli jesteś jednym z tych ludzi, którzy lubi w kolejce na zewnątrz sklepach Apple gdy nowy produkt jest się, jesteś prawdopodobnie nie przy użyciu danych stosu Struktura bo Ciebie nie zrażać każdy, kto jest w kolejce, aby kupić jakąś nową zabawkę. Raczej, prawdopodobnie za pomocą jaki rodzaj struktury danych lub jaki rodzaj systemu w świecie rzeczywistym? Mam nadzieję, że jest to linia, lub więcej Brytyjski prawidłowo lub bardziej podobny, kolejka. I okazuje się, kolejka jest również Struktura danych w informatyce, ale kolejka jest bardzo inna nieruchomość. To nie LIFO. Trwać, pierwsze wyszło. Broń Boże. To zamiast FIFO. Pierwsze weszło, pierwsze wyszło. I to jest dobra rzecz dla sprawiedliwości "dobra pewnością, gdy jesteś w kolejce się bardzo wcześnie rano. Jeśli się tam pierwsze, chcesz wyjść pierwsza, jak również. A więc wszystkie te dane struktury, kolejki i stosy i kiście innych, okazuje ci można myśleć o tym, jak tylko tablicy. To jest tablica, może stały rozmiar 4, ale to, że być miłe, czy może po prostu pali tace niemal nieskończenie wysokie gdybyśmy mają, że wiele tace lub cyfry. Więc może chcemy użyć połączonej listy tutaj, ale kompromis będzie potencjalnie, że potrzebujemy więcej pamięci, zajmuje trochę więcej czasu, ale nie ograniczają wysokość stosu podobnie jak gablocie Mather w może ograniczyć rozmiar stosu, i tak są to decyzje projektowe lub Opcje dostępne dla nas ostatecznie. Więc z tych danych struktury, zaczęliśmy widząc nowe górne granice potencjalnie na to, co wcześniej było super szybki i gdzie zostawimy od dzisiaj i gdzie my nadzieję, że dostać się do jest w środę, będziemy zacząć patrzeć na dane struktura, która pozwala nam szukać za pośrednictwem danych w czasie końca dziennika ponownie. I widzieliśmy, że pamiętam, w tym tygodniu zerowym i jeden z wyszukiwaniem binarnym lub podziału i podbić. To wraca, a jeszcze lepiej, Święty Graal w tym środę będzie pochodzić z struktura danych, która działa dobrze i teoretycznie Stała czasowa, w której to nie ma znaczenia, ile miliony lub miliardy rzeczy mamy w strukturze danych, to będzie zabrać nam stały czas, być może jeden krok lub dwa kroki lub 10 kroków, ale stałe numery etapów przeszukiwać tej struktury danych. Że rzeczywiście będzie święty graal ale o tym w środę. Do zobaczenia potem. [MUZYKI]