[Odtwarzanie muzyki] DAVID J. MALAN: W porządku. [Śmiech] Witamy z powrotem. To CS50. I to koniec tygodnia pięć. I do tej pory, mamy dość dużo brał za pewnik, że istnieje istnieje, to kompilator, dzyń, że już zostało wywołanie drodze tego inne narzędzie o nazwie Marka, że ​​w jakiś sposób magicznie konwertuje kod źródłowy do kodu wynikowego, z zer i jedynek że procesor komputery, centralny procesor, rzeczywiście rozumie. Ale okazuje się, że jest to numer, który znajduje się dzieje się pod maską w pomiędzy wejściem a wyjściem. I chciałbym zaproponować, że ciało że w nieco bardziej szczegółowo w te cztery kroki, mają coś, co nazywa wstępne przetwarzanie, coś nazywa kompilacji, które widzieliśmy, coś takiego montażu i coś takiego powiązania. Tak, aż do teraz, w niektórych naszych programy, mieliśmy ostre obejmuje. Niedawno mieliśmy niektóre ostre określa na stałe. Tak więc okazuje się, że te rzeczy, które są poprzedzone symbolem lub mieszania symbol funta są pre-processor dyrektyw. To tylko fantazyjny sposób na powiedzenie, że to linii kodu, które rzeczywiście przekształcone w coś innego przed komputer nawet próbować konwertować Program do zer i jedynek. Na przykład, ostre zawiera normę I / O. H, prawie oznacza tylko przejść naprzód, złapać zawartość plików stdio.h i wkleić je tam. Więc nie ma zer i jedynek w tym momencie jeszcze. To naprawdę tylko na zmianę. I że jest wykonane w tak zwanych wstępne przetwarzanie scena, kiedy faktycznie uruchomić brzękiem lub specjalnie Marka w większości przypadków. Więc to wszystko dzieje się Najpierw automatycznie do tej pory. Potem przychodzi etap kompilacji. Ale byliśmy zbyt uproszczony kompilacja. Kompilacja programu naprawdę znaczy wziąć z czegoś jak C, Kod źródłowy, który został nam pisanie, na dół na coś takiego zespołu. Asembler jest niższy poziom język, który, na szczęście, nie będziemy mają wiele okazji, aby napisz w tym semestrze. Ale to jest na najniższym poziomie w Poczucie, że dosłownie zacząć pisać dodawać i odejmować i mnożyć i załadować z pamięci i zapisać w pamięci, bardzo podstawowe instrukcje, które komputer, pod maską, rzeczywiście rozumie. Wreszcie, montaż zatrzymuje język z zer i jedynek, że byli opisywaniu tej pory. I rzeczywiście Wreszcie, jest tak zwany łączenie fazy, które my będziemy zobacz za chwilę, która łączy Twoje zer i jedynek z zer i te inne osoby przed stworzyłeś. Tak uważają tego super prosty program. To było od 1 tygodnia. To po prostu powiedział: Hello World, na ekranie. Pobiegliśmy to przez Clang. Albo zabrakło go przez Marka który prowadził brzękiem. I wyprowadzany w czasie, w którym kilka zer i jedynek. Ale okazuje się, że jest etap pośredni. Jeśli pójdę tutaj - oops, nie Chcę go zobaczyć jeszcze. Jeśli pójdę tutaj do mojego urządzenia i otworzyć hello.c, tutaj jest to, że sam program. I to, co mam zamiar zrobić w moim terminalu Okno jest tu będę uruchomić dzyń niż Marka, który automatyzuje wszystkie cztery te kroki za nami. A ja zamierzam zrobić clang-S i następnie hello.c a następnie wprowadzić. I mam miga prompt ponownie, co jest dobre. A teraz w nieco większym oknie Zamierzam otworzyć gedit tutaj. I mam zamiar otworzyć plik, który, okazuje, jest nazywany hello.s tego to zawiera asemblera I, o którym mowa wcześniej. I to jest to, co nazywa się zespół język, dość niski poziom instrukcje, że procesor Intel czy cokolwiek to jest, że jest w środku rozumie. A mov jest dla ruchu. Połączenie jest dla dzwoni, bardzo niski poziom funkcji. sub jest na odejmowanie. Więc jeśli masz konkretny procesor wewnątrz z komputera, co czyni go odrębne, w porównaniu z innych procesorów na rynku, to jest co instrukcje rozumie i często, jak skuteczne jest jest, jak szybko to jest w realizacji niektórych z tych instrukcji. Teraz więcej na ten temat, możesz wziąć następny CS61 Spadek na uczelni. Ale tutaj mamy, na przykład, kilka identyfikatory, które może wyglądać znajomo. hello.c jest nazwa programu. . Tekst - nie ma zbyt wiele zainteresowania nie właśnie teraz przypomnieć, że tekst segmentu, od poniedziałku, gdzie w pamięci program rzeczywiście kończy się. Tak to przynajmniej niejasno znajomy tam. Tutaj, oczywiście, jest wzmianka naszej głównej funkcji. Przewijanie w dół, te odnoszą się do rzeczy zwane rejestry, bardzo małe kawałki wewnątrz pamięci rzeczywistego procesora. A jeśli nawet przewijać dalej, widzę jakiś pośrednie wzmianki o ASCII. I rzeczywiście, jest to, że ciąg, hello, przecinek, świat. Więc krótko mówiąc, to było dzieje się dla ciebie, automatycznie, pod maską wszystkie tego czasu. A co się dzieje, jest naprawdę raz już uruchomić dzyń, lub w drodze Sprawdź, czego możesz się po pierwsze, z kodu źródłowego, tzw. asemblerze. Następnie Szczęk jest przekształcenie tego zespołu język w dół do zer i jedynek. A to, że rozpoczęliśmy slide Nasza dyskusja w tygodniu 0 na - a następnie Tydzień 1 na. I w końcu, te zera i jedynki łączy się z zer i jedynek z tych bibliotek byliśmy biorąc za pewnik, jak Standardowe we / wy lub Biblioteka String lub nawet CS50 biblioteki. Więc namalować ten obraz bardziej wizualnie, mamy hello.c. I to, oczywiście, używa printf funkcjonować powiedzieć, hello world. Krok kompilacja zabiera go w dół, aby że plik po prostu zobaczył hello.s, nawet choć to zazwyczaj usunięta automatycznie. Ale to jest kod montaż W środkowym punkcie. A potem, kiedy montujemy zespół język, że tak powiem, to kiedy się tych zer i jedynek. Więc mamy powiększony skutecznie dzisiaj na co byliśmy biorąc za pewnik, Oznacza to, będzie kod źródłowy do obiektu kodu. Ale w końcu, że teraz sam obraz - niech wpakować go do lewej stronie. I pamiętać, że tam w górze Wspomniałem stdio.h. To jest plik, które zostały dołączone w prawie wszystkich programy pisaliśmy. I to jest plik, którego zawartość uzyskać kopię wklejone, skutecznie szczycie kodzie. Ale okazuje się, że na komputerze System gdzieś, jest przypuszczalnie stdio.c plik, że ktoś napisał rok temu, że realizuje wszystkie Funkcje, które zostały zadeklarowane w stdio.h. Teraz w rzeczywistości to chyba nie on Twój komputer Mac lub PC, a nawet w CS50 Urządzenie jest surowy kod C. Ktoś już skompilowany i zawarte . O pliku do kodu wynikowego lub. pliku, który odnosi się do wspólnej biblioteki , które zostało fabrycznie zainstalowane i wstępnie skompilowane dla Ciebie. Ale załóżmy, że rzeczywiście istnieje na naszej stdio.c komputera w równolegle z Clang. Twój kod jest opracowywana i zmontowane. Kod stdio.c 's jest skompilowany i zmontowane, tak, że ten bardzo ostatnio krok, tu na dole, musimy w jakiś sposób Informacje, że tak powiem, twoje zer i jedynek z jego lub jej zer i jedynek do jednego Prosty program, który ostatecznie jest nazywa właśnie Hello. Więc to wszystko magii, która jest dzieje się tak daleko. I będzie kontynuować te procesy za przyznane, ale uświadomić sobie, jest dużo soczystych szczegółów dzieje pod spodem. I to jest to, co sprawia, że ​​Twój Komputer z procesorem Intel wewnątrz szczególnie wyraźne. Więc o tym pamiętać, jeśli chcesz Dołącz do nas na obiad w piątek, idź do zwykłego cs50.net/rsvp miejsce, 13:15 w piątek. A teraz kilka ogłoszeń. Tak więc mamy dobre wieści. I mamy złe wieści. Początek dobrych wiadomości tutaj. [Jęczy] Dobrze. Cóż, to technicznie wakacje, więc to nie jest tak dużo prezent od nas. Ale złe wieści oczywiście. [Jęczy] Spędziłem dużo czasu na tych animacji. [Śmiech] Nie będzie sesji recenzja to przychodzi w poniedziałek. To będzie o 17:30. Będziemy pamiętać o wszystkich tych szczegółów za pośrednictwem poczty elektronicznej na przebieg tych strona w zaledwie kilka dni czasu. To będzie filmowane i udostępniane wkrótce potem. Więc jeśli nie możesz zrobić, że poniedziałek Gniazdo noc, nie martw się. Sekcje w nadchodzącym tygodniu będzie również skupić się na przegląd do quizu. Jeśli sekcja jest w poniedziałek, który jest rzeczywiście uniwersytet wakacje, będziemy nadal spotykają się w punkcie. Jeśli po prostu nie może zrobić, że Sekcja bo idziesz stąd, że jest w porządku. Weź udział w niedzielę lub odcinek wtorek lub dostrojony do sekcji Jasona, który jest dostępny online. Tak, więcej złych wiadomości. Tak więc, zgodnie z programem szkolenia, mamy wykład w następny piątek. Ale dobra wiadomość - wyraźnie, spędziłem zbyt wiele czasu na to. [Śmiech] Będziemy anulować obok wykładów piątkowych. Tak, że będzie darem dla nas, więc może naprawdę mieć miły odpoczynek w między tym tydzień i dwa tygodnie stąd. Więc nie ma zajęcia w przyszłym tygodniu, tylko małe mały quiz, w którym powinno być coraz bardziej podekscytowany. Więc teraz zwrócić uwagę na coś, co jest w istocie bardziej wizualne i bardziej ekscytujące i ustawić scenę za to, co dzieje się na horyzoncie w ciągu zaledwie kilku tygodni. Po pierwszym quizie, skręcimy skupić nasze zestawy zadań do drugiego domeny na konkretny problem, który z kryminalistyki i bezpieczeństwa ogólnie. W rzeczywistości, tradycja z tym problemem zestaw jest dla mnie jednym z ucząc kolegów lub CAS przejść przez campus biorąc jakieś zdjęcia do zidentyfikowania, ale nie oczywiste ludzie, miejsca lub rzeczy, to co roku I jakoś przypadkowo usunąć lub uszkodzenie karty pamięci cyfrowej , że jest w środku naszego aparatu. Ale nic wielkiego. Mogę śmiało podłączyć że do mojego komputera. Mogę zrobić kryminalistycznych obraz, więc mówić, kopiując zer i te, z dala od tej karty pamięci, czy to jego karty SD lub Compact Flash Card lub co znasz. A potem możemy przekazać, że się. A więc wyzwanie przed siebie, między innymi rzeczy dla ciebie, będzie pisać Kod C, który odzyskuje całą masę JPEG dla mnie i będzie objawione te osoby, miejsca lub rzeczy. I będziemy także mówić w tym problemu ustawić w najbliższych dniach, o grafika ogólnie. Użyliśmy ich, kurs, dla wyrwać. Ale już jakby za pewnik istnieje te wysokie pojęcia poziomu prostokątów i owali. Ale pod maską istnieje pikseli. I trzeba było zacząć myśląc o nich. Albo będziesz dla p-set 4 myśleć o różnicy między swoimi cegieł, jak skoro jesteś piłka porusza się w poprzek Ekran wyrwać. Więc nie jest to pojęcie kropki na ekranie, który jest wchodzą w grę już. Teraz to, co widzisz, jest jednak to, co pojawi się na ekranie komputera. Jeśli kiedykolwiek oglądał jakiś dobry lub bad TV, kursy są one dość dużo traktować widzów jak technophobes którzy tak naprawdę nie wiem dużo o komputerowym. A więc jest to bardzo łatwe do policji Detektyw powiedzieć, prawda czyste, że się na mnie? Lub poprawić, prawda? Poprawa jest jak buzz słowa w Najbardziej żadnego przestępstwa związane show. A rzeczywistość jest, jeśli wziąć bardzo rozmazany obraz podejrzanego robi coś złego, nie można tylko jej ulepszenie. Nie można powiększać w nieskończoność. Nie możesz zobaczyć w czyjeś błysk eye, który popełnił, że szczególności przestępczości, pomimo Częstość występowania w telewizji. I tak z tym niech motywować, że Nadchodzący problemu ustawić z spojrzenie na niektóre pokazy, z którym może być znajomy. [PLAYBACK VIDEO] -OK. Teraz zajmijmy się przyjrzeć Ciebie. -Czekaj. Uruchom to z powrotem. -Czekaj. Idź w prawo. -Nie. Zatrzymaj to. -Pełny ekran. -OK. Zatrzymaj to. Dokręcić się on, że będzie dobrze? -Grafika w sprawie tego faceta przez tylne koła. -Zoom w tu, na tym miejscu. -Z odpowiednim wyposażeniem, obrazami mogą być powiększone i wyostrzone. -Co to jest? -To programu poprawy. -Czy możesz wyjaśnić, że się każdy? -Nie wiem. Niech jej ulepszenie. -Zwiększenie punkt-6. -I zwiększa szczegółów i - -Myślę, że to wystarczy, aby zwiększyć. Zwolnić go do mojego ekranu. -Zwiększenie odbicie w jej oku. -No to uruchomić to przez wzmocnienie video. -Edgar można poprawić to? -Trzymaj się. -I've pracuje nad tym refleksji. -Ktoś refleksji. -Reflection. -Jest odbiciem z twarzy mężczyzny. -Odbicie. -Nie ma refleksji. -Zbliżenie na lustrze. -Można zobaczyć odbicie. -Czy można poprawić wizerunek od tego? -Czy można zwiększyć go tutaj? -Czy możesz poprawić go? -Czy możesz poprawić go? -Czy możemy poprawić to? -Czy możesz poprawić go? -Chwileczkę, ja poprawić. -Zbliżenie na drzwi. -X10. -Zoom. [Śmiech] -Przesuń w. -Czekaj, stop. -Stop. -Zatrzymaj go. -Obrócić 75 stopni wokół pionowe proszę. [Śmiech] -Przestań, a powrotem do strony o drzwi. -Masz wzmacniacz obrazu które mogą bitmap? -Może używamy Pradeep Sen Sposób, aby zobaczyć w oknach. -To oprogramowanie jest w stanie techniki. -Wartość ikona jest off. -Przy odpowiednim połączeniu algorytmów. -Zabrał algorytmów oświetlenia do Następny poziom i można ich używać do zwiększenia zdjecia. -Lock i powiększyć osi z. -Enhance. -Enhance. -Enhance. Zamarzaniu i wzmocnienia. [END PLAYBACK VIDEO] DAVID J. MALAN: Tak Zestaw Problem 5 jest to, co nas czeka tam. Więc niedługo lepiej zrozumieć kiedy i dlaczego można i nasz nie może zwiększyć w ten sposób. Ale najpierw niech zwróci naszą uwagę do niektórych bloków WE'LL muszą być w stanie powiedzieć, że historia. Więc przypominam, że zwrócił ten obraz na Poniedziałek i trochę w zeszłym tygodniu. I to opisuje układ rzeczy w pamięci komputera, gdy uruchomiony jakiś program. Tech segmentu up góry, przypomnijmy, dotyczy do rzeczywistych zer i jedynek , które tworzą program. Tam, poniżej, że niektóre zainicjowany lub niezainicjalizowane danych, które zazwyczaj odnosi się do rzeczy, takich jak stałe lub łańcuchy lub zmienne globalne, które mają zostały zgłoszone wcześniej. Jest kupa, ale wrócimy powrót do tego za chwilę. A wtedy nie stos. Podobnie jak stos tac w kawiarnia, to jest, gdy pamięć ma warstwami i warstwami, gdy robisz to, co w programie? Co to jest stos wykorzystanie do? Tak? Wywołanie funkcji. Za każdym razem, wywołania funkcji, to uwagę na taśmy pamięci dla jego zmienne lokalne lub jego parametry. I obrazowo, widzimy, że z każdym kolejna funkcja nazywa, kiedy Połączenia Połączenia B C zwraca d, że się warstw na stosie. I w każdym z tych plasterków pamięć jest w istocie wyjątkowy zakres dla tej funkcji, która, oczywiście, jest problematyczne, jeśli chcesz oddać z jednej funkcji do drugiej kawałek danych, które chcesz go mutować lub zmienić. Tak więc to, co było nasze rozwiązanie umożliwiające Funkcja reprezentowana przez jednego stosu ramkę z pamięci wewnętrznej innej ramki stosu? Jak te dwa ze sobą rozmawiać? Więc w drodze wskazówek i adresów, która, ponownie, gdy tylko opisują w pamięci, by sposób szczególny liczba gryźć, zwłaszcza Wartość można znaleźć. Więc pamiętam ostatni raz zbyt kontynuowaliśmy historię i spojrzał na dość buggy programu. A ten program ma błędy na kilka powodów, ale najbardziej niepokojące jeden jest ponieważ nie sprawdzić, co? Tak, to nie sprawdzić wejście. Sorry? Jeśli jest więcej niż 12 znaków. Tak bardzo elegancko, gdy dzwoni memcopy, , które, jak sama nazwa wskazuje, tylko kopie pamięci z drugiego argumentu na pierwszy argument. Trzeci argument, bardzo elegancko, jest sprawdzane, aby upewnić się, że nie skopiować więcej niż w tym przypadku, długość z barem, liczba znaków, do miejsca przeznaczenia, które ma ten Tablica C. Ale problemem jest to, że to, co jeśli C sama w sobie nie jest na tyle duże, do obsługi tego? Masz zamiar skopiować numer bajtów, które już zostały wydane. Ale to, co faktycznie mają więcej bajtów, niż masz miejsca na? Cóż, ten program bardzo głupio tylko ślepo przechodzi wziąć cokolwiek to jest biorąc pod uwagę, witam backslash 0 jest super, jeśli łańcuch jest krótki wystarczy, jak pięć znaków. Ale czy to faktycznie 12 znaków lub 1200 znaków, widzieliśmy ostatni raz że jesteś po prostu będzie całkowicie nadpisać pamięć nie należy do Ciebie. A w najgorszym przypadku, jeśli zastąpić, że Czerwona część tam zadzwoniliśmy adres zwrotny - to jest po prostu gdzie komputer automatycznie, dla Ciebie, za sceny, zakładki oddalony 32-bitowa wartość, którą Przypomina to, co adres powinien powrócić, gdy foo, to inna funkcja, Odbywa się to wykonanie. Jest to swego rodzaju okruchy chleba do którego powraca. Jeśli nadpisanie które potencjalnie jeśli jesteś zły, może mógłby potencjalnie przejąć czyjś komputer. I będziesz na pewno awarii to w większości przypadków. Teraz ten problem został tylko pogarsza jak zaczęliśmy rozmawiać o pamięci Zarządzanie bardziej ogólnie. I malloc, dla alokacji pamięci, jest funkcji, które możemy wykorzystać do przydzielania pamięci, gdy nie wiemy z góry że możemy potrzebować niektórych. Tak więc, na przykład, jeśli wrócę do urządzenia tutaj. I otworzyć od ostatniego hello2.c czasu, pamiętam ten program tutaj, co wyglądało trochę coś takiego, zaledwie trzy linie - podać swoje imię i nazwisko, a następnie ciąg, po lewej stronie, jest równa getstring. A potem wydrukować, nazwa użytkownika. Więc to był bardzo prosty program. Żeby było jasne, niech śmiało i sprawiają, hello-2. Mam zamiar zrobić dot slash hello-2. Podać imię i nazwisko - David. Wprowadź. Witaj David. To wydaje się działać OK. Ale to, co się naprawdę dzieje pod maską tutaj? Zacznijmy odwinąć niektórych warstw. String jest po prostu synonimem mamy sobie sprawę, na co? Char gwiazdki. Więc zróbmy to trochę bardziej ezoteryczne ale bardziej technicznie poprawne, że ten jest char gwiazdki, co oznacza, że nazwa, tak, jest zmienna. Ale to, co przechowuje imię jest adres char, który czuje się trochę dziwnie bo wracam ciąg. Wracam wielokrotnego znaki nie char. Ale, oczywiście, trzeba tylko najpierw Char adres zapamiętać, gdzie Cały ciąg jest bo po co? Jak można dowiedzieć się, gdzie koniec Ciąg jest wiedząc początek? Zerowej backslash. Więc z tych dwóch wskazówek dowiedzieć Przed rozpoczęciem i zakończeniem każdy łańcuch jest tak długo, jak są one prawidłowo utworzone z tym nieważną terminator, że zerowa backslash. Ale to dzwoni GetString. I okazuje się, że GetString przez cały ten czas był rodzaj oszukiwanie dla nas. To robi to pracy, aby upewnić się, uzyskiwanie ciąg od użytkownika. Ale gdzie jest ta pamięć przyjeżdżamy z? Jeśli wrócimy do obrazu tu i stosować definicję z tylko chwilę temu, że stos jest gdzie pamięć idzie gdy funkcje są uruchamiane, przez tę logikę, kiedy zadzwonić getstring, a potem wpisać D--V-I-D Enter, gdzie jest D--V-I-D ukośnik zera przechowywane, na podstawie story my powiedział nam daleko? Wydaje się być w stos, prawda? Po wywołaniu uzyskać ciąg masz Mały kawałek pamięci na stosie. Więc to ma się rozumieć, że D--V-I-D backslash zapisywane jest zero że w stosie. Ale chwileczkę, GetString powroty że ciąg, że tak powiem, co oznacza, to tacy z kafeterii zdjęty ze stosu. A my powiedzieliśmy ostatni raz, że tak szybko, jak funkcja zwraca, a Ty, że tacy, że tak powiem, ze stosu, co można założyć o resztkami że pamięć? I jakby redrew je jako znaki zapytania dlatego, że skutecznie się nieznanych wartości. Mogą one być użyte ponownie, gdy niektóre następna funkcja. Innymi słowy, jeśli zdarzy do przechowywania - Będę rysować szybki obraz tego stosu. Jeśli zdarzy ci się być rysunek dno mojego segmentu pamięci, a powiemy że jest to miejsce pamięci zajmowane przez główne i może arg c i arg v i coś jeszcze w programie, kiedy getstring nazywa, przypuszczalnie getstring dostaje fragment pamięci tutaj. A potem D--V-I-D jakoś kończy się w tej funkcji. I mam zamiar upraszczając. Ale załóżmy, że jego D--V-I-D backslash zero. Tak więc w tym wiele bajtów są stosowane ramki dla GetString. Ale jak tylko GetString zwrotów, my powiedział ostatnio, że ta pamięć ponad tutaj wszystko staje - woops! - wszystko staje się skutecznie usunięte. Możemy myśleć o tym teraz, pytanie znaki, bo kto wie, co się stało z tą pamięcią. Rzeczywiście, bardzo często nazywają funkcje inne niż GetString. I jak tylko zadzwonić inny Funkcja niż GetString, może nie w ten konkretny program, po prostu wyglądał at, ale jakiś inny, na pewno jakieś inne Funkcja może skończyć się dany to następny spot w stosie. Więc to nie może być tak, że GetString sklepach -D-V-I-D w stos, ponieważ byłoby natychmiast stracić do niej dostęp. Ale wiemy, że GetString zwraca tylko co? To nie jest powrót do mnie sześć znaków. Jak jest naprawdę nie wraca stwierdzić, ostatni raz? Adres pierwszy. Tak jakoś, kiedy nazywa getstring, to przydzielanie pamięci na kawałek Łańcuch typu użytkowników i następnie powrót adres to. I okazuje się, że kiedy chcesz funkcjonować do przydzielania pamięci w tym sposób i powrót do osoby, która wykonała że funkcja, adres że fragment pamięci, absolutnie nie można go umieścić w stosie na dno, bo to tylko funkcjonalnie będzie nie stać Ciebie bardzo szybko, więc można się domyślić, w którym my prawdopodobnie będzie wrzucić Natomiast tak zwany stos. Więc pomiędzy dnem pamięć tych układ i top of pamięć tych układ jest cała masa segmentów. Jednym z nich jest stos, a prawo ponad to jest kupa. A kupa jest tylko inny kawałek pamięci, która nie jest używana przez funkcje gdy są one nazywane. Służy do pamięci długoterminowej, gdy chcesz jedna funkcja chwycić niektóre pamięci i móc powiesić na nim bez utraty kontroli nad nim. Teraz być może natychmiast zauważyć, że nie jest to koniecznie idealny projekt. Jako program przeznaczono pamięć na stos, lub jak nazywają coraz więcej funkcji, lub jak można przydzielić pamięci na stercie z malloc off jako getstring robi, co wyraźnie wydaje się być nieunikniony problem? Racja. Podobnie jak fakt, że te strzałki są skierowane na siebie nie wróży dobrze. I rzeczywiście, możemy bardzo szybko upaść Program w wiele sposobów. W rzeczywistości, myślę, że mamy zrobił to przypadkowo jeden raz. A jeśli nie, to zróbmy to celowo teraz. Pozwól mi pójść dalej i napisać bardzo szybko Program nazywa dontdothis.c. A teraz pójdę tu i Czy ostre m.in. stdio.h. Chcę zadeklarować funkcja foo ma żadnych argumentów, które jest oznaczony oraz przez próżnię. I jedyną rzeczą, foo będzie zrobić, to wywołanie foo, która chyba nie jest najmądrzejszy pomysł, ale tak będzie. Ent głównym nieważne. Teraz jedyną rzeczą, główny będzie Wystarczy wywołać foo również. I tylko dla zabawy, mam zamiar iść przed tutaj i powiedzieć, printf "Hello from foo ". OK. Więc jeśli nie popełnić żadnych błędów, Marka dontdothis dot slash. I zróbmy to w większym oknie - dot slash, dontdothis. Chodź. Uh oh. Podobno można to zrobić. Cholera. OK. Czekaj. Stand by. Czy my - My używaliśmy go z Marka. [Wzdycha] Wiem, ale myślę, że właśnie usunął to. Uh, tak. Cholera. Rozwiąż ten Roba. Co? To bardzo proste. Tak, okazało optymalizacji off. OK, stand bye. Teraz czuję się lepiej. OK. Dobrze. Warto więc przebudować ten - Ci dontdothis. Być może trzeba zmienić nazwę tego celu dothis.c za chwilę. Proszę bardzo. Dziękuję. OK. Tak więc fakt, że byłem drukowania się coś było właściwie tylko spowolnienie procesu, dzięki któremu doszłaby że punkt. OK. Uff! Więc co tak naprawdę chodzi? Powodem jest, jak na bok, jest robi nic w zakresie wejścia i wyjście wydaje się być wolniejszy, bo napisać znaki Ekran, to musi przejść. Więc krótko mówiąc, gdybym rzeczywiście stało się tak niecierpliwi, musielibyśmy widziałem to efekt końcowy, jak również. Teraz, że mam jeździć z print-upy, widzimy go od razu. Więc dlaczego tak się dzieje. Cóż, proste wyjaśnienie, oczywiście, jest to, że prawdopodobnie nie powinien foo być powołanie się. Teraz w sposób ogólny, to jest rekurencja. I myśleliśmy, kilka tygodni temu cykliczne jest dobry. Rekurencja jest ten magiczny sposób wyrażania siebie bardzo zwięźle. I to właśnie działa. Ale jest kluczowym elementem wszystkich cyklicznej programy Rozmawialiśmy się i spojrzał na tak daleko, co było to, że miał co? Wariant podstawowy, który był jakiś zakodowanego tak, że powiedział w niektórych sytuacjach nie wywołać foo, który jest wyraźnie nie w tym przypadku. Więc to, co naprawdę dzieje się pod względem tego obrazu? Cóż, kiedy główny wywołuje foo, to dostaje kawałek pamięci. Kiedy foo zwraca bla, robi kawałek pamięci. Kiedy foo zwraca foo, to dostaje kawałek. To staje się kawałek. To staje się kawałek. Ponieważ foo nigdy nie wraca. My nigdy nie usuwanie jednego z nich klatki ze stosu. Liczymy więc, dmuchanie przez sterty nie, wspomnieć, kto wie co jeszcze, a jesteśmy wykraczając poza granice naszego tzw. segment pamięci. Błąd iść segmentacja false. Więc rozwiązanie jest wyraźnie tego nie robi. Ale większy implikacją jest, że tak, jest absolutnie pewna granica, Nawet jeśli nie jest dobrze zdefiniowane, w jaki wiele funkcji można zadzwonić w Program, ile razy funkcja mogą dzwonić się. Dlatego, mimo że my głosimy rekursji jak to coś potencjalnie magicznej Kilka tygodni temu na sigma funkcji, a gdy mamy dane struktury i CS50, zobaczysz inne wnioski o tym, że nie jest koniecznie najlepsze. Bo jeśli funkcja nazywa się, zwraca się, nawet jeśli nie ma podstawy przypadku, jeśli nie trafisz, że przypadku bazowego do 1000 połączeń lub 10000 apeluje, by że czas mogłeś zabraknie miejsca na tzw stosie i naciśnij inne segmenty pamięci. Więc to też jest projekt kompromisu między elegancją i między Solidność Twój szczególności realizacja. Więc nie ma innego minusem lub kolejny słaby punkt tego co mamy robił do tej pory. Gdy zadzwoniłem getstring - pozwól mi wrócić do Hello-2. Zauważ, że dzwonię GetString, który zwraca adres. A my twierdzą dziś, że adres jest ze sterty. A teraz jestem drukowanie napis pod tym adresem. Ale my nigdy nie nazywa Przeciwieństwem GetString. Nigdy nie mieliśmy do calll funkcji takich jak ungetstring, gdzie ręka z powrotem że pamięć. Ale szczerze mówiąc, prawdopodobnie powinno być. Bo jeśli padają komputer do pamięci, w drodze kogoś takiego jak getstring ale nigdy go oddać, na pewno to także jest zobowiązany do prowadzić do Problemy której zabraknie pamięci. A w rzeczywistości, możemy spojrzeć na te problemy z nowego narzędzia, którego użycie jest trochę tajemnicze pisać. Ale pozwól mi iść dalej i przelewać go Na ekranie za chwilę. Mam zamiar iść do przodu i uruchamiania Valgrind z parametrem, który najpierw polecenia Argument wiersza jest nazwa tego programu hello-2. I niestety jest to Wyjście jest potwornie złożone bez powodu. Widzimy więc cały ten bałagan. David jest podać swoje nazwisko. Więc to jest program faktycznie działa. I teraz mamy tego wyjścia. Więc Valgrind jest podobny w duchu do GDB. Nie debugger per se jest. Ale to kontroler pamięci. Jest to program, który uruchomi zaprogramować i powiedzieć, jeśli poprosiliśmy komputer dla pamięci i nigdy nie podał z powrotem, co oznacza, że ​​masz wyciek pamięci. A wycieki pamięci wydają się być złe. I to użytkownicy komputerów mają Prawdopodobnie czuł tego, czy masz Mac lub PC. Czy kiedykolwiek z komputera do natomiast nie i ponownym uruchomieniu komputera w kilku dzień, lub właśnie ma dużo uruchomione programy, a to cholerstwo obniża się zastoju, lub co najmniej jest to bardzo irytujące, w użyciu, ponieważ wszystko po prostu ma bardzo powolny. Teraz, że może być wiele przyczyn. To może być nieskończona pętla, błąd w czyjś kod, lub po prostu, że może oznaczać, że używasz więcej pamięci, lub próbuje, niż twój Komputer rzeczywiście ma. A może jest to błąd w jakimś programie które padają na pamięć. Przeglądarki za rok były notorycznie ta, z prośbą o więcej i więcej pamięci ale nigdy nie podając go. Z pewnością, jeśli tylko mają skończone Ilość pamięci, nie można prosić nieskończenie wiele razy, za niektóre z tych pamięci. A więc to, co tu widzisz, chociaż ponownie valgrind jest wyjście niepotrzebnie skomplikowane, by spojrzeć na po pierwsze, to jest interesujący. Heap - w użyciu na wyjeździe. Tak tu jest, ile pamięci było w użyciu w stercie na Czas mój program odszedł - podobno sześć bajtów w jednym bloku. Więc mam zamiar pomachać rękami na jakim bloku jest. Pomyśl, że to tylko fragment, więcej technicznej słowo kawałek. Ale sześć bajtów - czym jest sześć bajtów były nadal w użyciu? Dokładnie. D--V-I-D backslash zero, pięć list Nazwa oraz terminator null. Więc ten program valgrind zauważyłem, że I wyznaczona do sześciu bajtów, najwyraźniej, by sposób GetString, ale nigdy nie dał je z powrotem. I rzeczywiście, to może nie być tak oczywiste, jeśli program nie jest trzy linie, ale to 300 linii. Tak naprawdę możemy dać innego polecenia Argument wiersza do Valgrind do stał się bardziej widoczny. Jest to trochę irytujące, aby pamiętać. Ale jeśli to zrobię - Zobaczmy. Przeciek - Był to wyciek - nawet nie pamiętam co to jest off strony. - Sprawdzanie szczelności wynosi pełna. Tak, dziękuję. - Sprawdzanie szczelności wynosi pełna. Wprowadź. Sam program jest uruchomiony. Wpisz w David ponownie. Teraz widzę trochę więcej szczegółów. Ale poniżej podsumowaniu sterty, które jest identyczne do czterech - ah, to jest miłe. Teraz Valgrind jest rzeczywiście patrząc trochę trudniej w moim kodu. I to mówiąc, że, jak widać, malloc w linii - możemy pomniejszyć. Na linii - nie widzimy tego, co linia jest. Ale malloc jest pierwszym winowajcą. Jest blog w malloc. Wszystko w porządku? OK, nr. Prawda? Zadzwoniłem GetString. getstring najwyraźniej wywołuje malloc. Więc co linia kodu jest najwyraźniej winy za posiadające przydzielone tej pamięci? Załóżmy, że ten, kto napisał malloc jest już na tyle długo, że jest to nie ich wina. Więc to chyba moje. GetString w cs50.c - więc to plik gdzieś na komputerze - w linii 286 wydaje się być zainstalowane. Teraz załóżmy, że CS50 został wokół na przyzwoitą ilość czasu, więc my też jesteśmy nieomylni. I tak to chyba nie w GetString że błąd leży, ale raczej w hello-2.c linia 18. Warto więc przyjrzeć się co to linia 18 była. Oh. Jakoś ta linia nie jest koniecznie buggy, per se, ale jest powód, za tym wyciek pamięci. Tak bardzo po prostu, co by intuicyjnie być rozwiązanie tego? Jeśli pytamy o pamięci, nigdy nie były dając go z powrotem, i to wydaje się być problem, ponieważ w czasie mojego komputera może zabraknąć pamięci, może spowolnić w dół, złych rzeczy może się zdarzyć, dobrze, , co jest proste, intuicyjne rozwiązanie? Wystarczy oddać. Jak zwolnić tę pamięć? Cóż, na szczęście jest to dość proste tylko powiedzieć bezpłatny nazwę. I nigdy nie zrobiłeś tego wcześniej. Ale można w zasadzie myśleć o wolne jako przeciwieństwo malloc. wolny jest przeciwieństwem przydzielania pamięci. Więc teraz pozwól mi skompilować tego. Marka Hello-2. Pozwól mi uruchomić go ponownie. hello-2 David. Wydaje się więc do pracy w dokładnie taki sam sposób. Ale jeśli wrócę do Valgrind i ponownie uruchom że samo polecenie na moim nowo skompilowany program, wpisując w moim imieniu, jak przed - miło. Podsumowanie Heap - w użyciu na wyjeździe - zerowych bajtów zerowych bloków. I to jest bardzo miły, wszyscy bloki kupa zostali uwolnieni. Brak przecieków są możliwe. Więc zbliża się, a nie z zestawu Problem 4, Problem jednak z zestawem 5, Forensics i nowsze, to też będzie miarą poprawności waszego Program, czy masz czy nie ma wycieków pamięci. Ale na szczęście, nie tylko można rozumować przez nich intuicyjnie, które jest, bez wątpienia, jest łatwy dla małych programów ale trudniejsze do większych programów, Valgrind, dla tych większych programów, może pomóc w identyfikacji Szczególnym problemem. Ale jest jeszcze jeden problem, , które mogą się pojawić. Pozwól mi otworzyć ten plik tutaj, co jest, znowu, nieco prosty przykład. Ale skupmy się na tym, co ten program robi. To się nazywa memory.c. Będziemy pisać o tym później dzisiaj w zip dzisiejszego kodu źródłowego. I zauważył, że mam funkcję o nazwie f, że nie przyjmuje żadnych argumentów i nic nie zwraca. W linii 20, jestem podobno oświadczając wskaźnik do int i wywołanie to x. Jestem przypisanie jest powrót wartość malloc. I żeby była jasność, ile bajtów am I prawdopodobnie wracając z malloc w tej sytuacji? Prawdopodobnie 40. Gdzie można dostać, że z? Cóż, jeśli przypomnieć, że int jest często 4 bajty, co najmniej jest w Urządzenie, 10 razy 4 jest oczywiście 40. Więc malloc zwraca adres z kawał pamięci i magazynowania, które rozwiązać ostatecznie w X. Tak więc być jasne, co wtedy się dzieje? Cóż, pozwól mi wrócić do naszego obrazu tutaj. Pozwól, że nie tylko rysować głębi pamięci komputera, pozwól mi iść do przodu i rysować cały prostokąt reprezentuje wszystkie moje pamięci RAM. Powiemy, że stos jest na dole. I jest fragment tekstu w Dane niezainicjowanej. Ale ja po prostu się streszczenie tych inne rzeczy, oddalony jako kropka, kropka kropka. Mam zamiar odnieść się do tego w stosie na górze. A potem na dole tego obrazu, do reprezentowania Głównym, będę dać mu pamięć plastry na stosie. Dla f, mam zamiar dać mu kawałek z pamięci na stosie. Teraz, muszę skonsultować Moje strony Kod źródłowy ponownie. Co to są zmienne lokalne za główny? Niby nic, tak że kawałek jest skutecznie pusty lub nie, nawet tak duże jak już wyciągnąć go. Ale w F, mam zmiennej lokalnej, które nazywa x. Więc mam zamiar iść dalej i dać f fragment pamięci, nazywając go x. A teraz malloc 10 razy 4, Więc malloc 40, gdzie jest to Pamięć pochodzi z? Nie narysowałem obrazek jak to wcześniej. Ale załóżmy, że jest to skuteczne pochodzących z tego, więc jeden, dwa, trzy, cztery, pięć. A teraz potrzebuję 40 z nich. Więc ja po prostu zrobić kropka, kropka, kropka, aby zaproponować że jest jeszcze więcej pamięci wraca z hałdy. Teraz, co jest adres? Wybierzmy nasze arbitralne rozwiązania, jak zawsze - Ox123, choć prawdopodobnie będzie być coś zupełnie innego. To jest adres pierwszego bajtu pamięci, że pytam malloc dla. Tak w skrócie, linii raz 20 wykonuje, co jest dosłownie przechowywany wewnątrz x. tutaj? Ox123. Ox123. A Ox jest nieciekawe. To po prostu oznacza, oto liczba szesnastkowa. Ale to, co jest kluczem jest to, że to, co mam sklep w X, która jest zmienna lokalna. Ale jego typ danych, ponownie, jest adres wew. Cóż, mam zamiar zapisać Ox123. Ale znowu, jeśli to zbyt komplikuje niepotrzebnie, jeśli przewijać z powrotem, możemy to z dala dość abstrakcyjna rozsądnie i po prostu powiedzieć, że x jest wskaźnik do tego ilość pamięci. OK. Teraz pytanie pod ręką jest następujący - line 21, jak się okazuje, jest wadliwy. Dlaczego? Sorry? To nie ma - że ponownie. Cóż, to nie kosztuje. Więc to jest drugi but. Więc jest jeszcze jedna, ale konkretnie na linii 21. Dokładnie. Ta prosta linia kodu jest po prostu przepełnienie bufora, przepełnienia buforu. Bufor oznacza po prostu kawałek pamięci. Ale ten fragment pamięci jest od wielkości 10 10, liczby całkowite, co oznacza, że ​​jeśli Indeks do niego przy użyciu cukru składniowej notacji tablicy, plac wsporniki, masz dostęp do x 0 x wspornik wspornik 1 x, Uchwyt kropka, kropka, kropka. x uchwyt 9 jest największa. Więc jeśli ja x wspornik 10, gdzie Jestem naprawdę dzieje się w pamięci? Cóż, jeśli mam 10 int - niech rzeczywiście wyciągnąć wszystko z tych tutaj. Więc to był pierwszy pięć. Oto pozostałe pięć ints. Więc x wspornik 0 jest tutaj. x wspornik 1 jest tutaj. x uchwyt 9 jest tutaj. x wspornik 10 jest tutaj, co oznacza, mówię, w wierszu 21, komputer umieścić liczba gdzie? Numer 0, gdzie? Cóż, to jest 0, tak. Ale sam fakt, że jej 0 jest swego rodzaju przypadek. Może to być numer 50, dla wszystkich, dbamy. Ale staramy się umieścić go na x wspornika 10, którym jest w którym ta Znak zapytania jest rysowany, które nie jest dobrą rzeczą. Ten program może być bardzo dobrze awarii w wyniku. Teraz idziemy dalej i zobaczyć, czy to jest rzeczywiście, to, co się dzieje. Producent pamięci, ponieważ plik nazywa memory.c. Idziemy naprzód i uruchomić pamięć programu. Więc mieliśmy szczęście, rzeczywiście, wydaje się. Mamy szczęście. Ale zobaczymy, czy możemy teraz uruchomić Valgrind. Na pierwszy rzut oka, mój program może wydaje się być prawidłowa. Ale pozwól mi uruchomić Valgrind z - Sprawdzanie szczelności wynosi pełna pamięci. A teraz, kiedy to uruchomić - ciekawe. Nieprawidłowy zapis wielkości 4 na linia 21 z memory.c. Linia 21 z memory.c jest który? O, ciekawe. Ale poczekaj. Rozmiar 4, co to jest, że myśli? I tylko nie jeden zapis, ale to z wielkości 4. Dlaczego jest to 4? To dlatego, że jest int, które jest, ponownie, cztery bajty. Więc Valgrind znalazłeś błąd, że ja, patrząc na mojego kodu, nie. A może twój TF by lub nie. Co Ale Valgrind na pewno, że zrobiliśmy błąd istnieje, nawet jeśli mamy szczęście, a komputer postanowił, eh, ja nie zamierzam upaść tylko dlatego, że dotknął jeden bajt, jeden int jest warta pamięci, że nie faktycznie własne. No, co jeszcze jest buggy tutaj. Adres - to jest adres patrząc szalony w systemie szesnastkowym. To oznacza, że ​​gdzieś w stercie jest zero bajtów po bloku wielkości 40 jest przydzielona. Pozwól mi pomniejszyć tutaj i zobaczyć, czy to jest trochę bardziej pomocny. Ciekawe. 40 bajty są zdecydowanie stracił w rekordowym strat 1 1. Ponownie, więcej słów niż jest przydatne. Ale w oparciu o zaznaczonych linii, gdzie powinienem chyba skupić moje uwagę na kolejny błąd? Wygląda na linii 20 memory.c. Tak więc, jeśli wrócimy do linii 20, to jeden zidentyfikowany wcześniej. I to niekoniecznie buggy. Ale my tego odwrócić jego skutki. Więc jak mam poprawić co najmniej jeden z tych błędów? Co mogłem zrobić po linii 21? Mogłem zrobić bez x, więc jest oddać, że pamięć. I w jaki sposób rozwiązać ten problem? Należy na pewno tam nie dalej niż 0. Więc pozwól mi spróbować ponownie uruchomić to. Niestety, na pewno go nie dalej niż 9. Producent pamięci. Pozwól mi ponownie uruchomić Valgrind w większym oknie. A teraz wygląda. Miło. Wszystkie bloki kupa zostali uwolnieni. Brak przecieków są możliwe. A w górze tutaj, nie ma wzmianki nic więcej z nieważnego prawa. Wystarczy dostać chciwi, i niech to czy inna demonstracja nie wychodzi zgodnie z planem - I udało się poszczęści chwilą. Oraz fakt, że jest to być może 0 niepotrzebnie mylące. Zróbmy 50, nieco arbitralny liczba, marka pamięci dot pamięci slash - nadal miał szczęście. Nic się nie upaść. Załóżmy, że po prostu zrobić coś naprawdę głupi, a ja 100. Pozwól mi przerobić pamięć, dot slash pamięci - szczęście ponownie. Jak o 1000? ints poza, z grubsza, gdzie mam być? Producent pamięci - cholera. [Śmiech] OK. Niech nie zadzieraj już. Uruchom ponownie pamięć. Proszę bardzo. Dobrze. Więc widocznie jesteś index 100000 ints poza to, gdzie powinno być w pamięć, złe rzeczy się zdarzają. Więc to nie jest oczywiście twardy, szybki przepis. I niby za pomocą próby i błędów, aby się tam dostać. Ale to dlatego, że, krótko mówiąc, pamięci komputera jest podzielony do tych rzeczy zwane segmentami. A czasami, komputer faktycznie dał wam trochę więcej pamięci niż prosić. Ale dla wydajności, to jest po prostu łatwiej uzyskać więcej pamięci, ale tylko powiedzieć, że dostajesz jego część. A jeśli będziesz miał szczęście czasem, w związku z tym, może być w stanie dotknąć Pamięć, która nie należy do Ciebie. Nie masz gwarancji, że to, co wartość umieścić tam pozostanie tam, bo komputer nadal uważa, że ​​nie jest Ciebie, ale to nie koniecznie będzie trafić kolejny segment pamięci w komputer i wywołać błąd jak ten tutaj. Dobrze. Wszelkie pytania następnie w pamięci? Dobrze. Rzućmy okiem tutaj, a następnie, w coś byliśmy biorąc za przyznane przez dość długi czas, który jest w tym pliku o nazwie cs50.h. Więc to jest plik. Są to po prostu cała masa z komentarzy do góry góry. A może masz spojrzał na to, czy Ci grzebali na urządzeniu. Ale okazuje się, że przez cały czas, kiedy używałem ciąg jako synonimem, za pomocą których zadeklarowaliśmy że synonimem był z tego słowo kluczowe typedef dla definicji typu. A my w zasadzie powiedzieć, zrobić ciąg synonim dla char gwiazdy. Że środki, które stosu stworzył te kółka, znane jako ciąg. Teraz tutaj jest tylko prototyp dla getchar. Może Widzieliśmy to już wcześniej, ale to jest w istocie to, co robi. getchar nie przyjmuje żadnych argumentów, zwraca char. GetDouble ma żadnych argumentów, zwraca double. GetFloat ma żadnych argumentów, zwraca pływak, i tak dalej. getInt jest tutaj. getlonglong jest tutaj. I getstring jest tutaj. I to jest to. Ta fioletowa linia jest kolejnym preprocessor dyrektywa z powodu hashtag na początku tego. Dobrze. Więc teraz pozwól mi iść do cs50.c. A my nie będziemy rozmawiać zbyt długo na ten temat. Ale daje wgląd co trwa to wszystko czas, pozwól mi przejść do - zróbmy getchar. Więc getchar jest głównie komentarze. Ale wygląda to tak. Więc to jest rzeczywista funkcja getchar, że byliśmy biorąc za pewnik istnieje. I choć nie mamy korzystać z tego jeden , że często, jeśli w ogóle, to co najmniej stosunkowo proste. Więc warto poświęcić Szybkie spojrzenie na tutaj. Więc getchar ma nieskończoną pętlę, celowo tak widocznie. Następnie wywołuje - i jest to rodzaj ładne ponowne wykorzystanie kodu sami napisali. Wzywa getstring. Bo to, co robi znaczy dostać char? Cóż, równie dobrze można postarać się Cała linia tekstu od użytkownika i a potem po prostu patrzeć na jednego z tych znaków. W linii 60, tutaj jest trochę trochę sprawdzenia poczytalności. Jeśli getstring zwrócony NULL, niech nie kontynuować. Coś poszło nie tak. Teraz jest to nieco irytujące, ale konwencjonalnych w C. char max prawdopodobnie reprezentuje to, co właśnie na podstawie jego nazwy? To jest stała. To tak jak z wartości numerycznych Największy char można reprezentować w jeden kęs, który jest prawdopodobnie numer 255, który jest największym numer reprezentują osiem bitów, zaczynając od zera. Tak mi to wykorzystać, w tej funkcji, gdy pisząc ten kod, tylko dlatego, jeśli coś pójdzie nie tak, ale w getchar jego celem w życiu jest, aby powrócić char, trzeba w jakiś sposób być w stanie aby zasygnalizować użytkownikowi, że coś poszło nie tak. Nie możemy wrócić null. Okazuje się, że jest null pointer. I znowu, getchar ma powrót char. Więc konwencji, jeśli coś pójdzie nie nie tak, to ty, programista, lub w ta sprawa, mnie z biblioteki, miałem tylko zdecydować arbitralnie, jeśli coś pójdzie nie tak, mam zamiar zwraca liczbę 255, co jest naprawdę Oznacza to, że nie możemy, użytkownik może nie wpisywać Znak reprezentowany przez numer 255, ponieważ mieliśmy ukraść jako tzw wartości wskaźnikowych dla stanowią problem. Teraz okazuje się, że postać 255 nie jest czymś, co można wpisać na klawiatura, więc jest to nic wielkiego. Użytkownik nie zauważy, że I ukradli tę postać. Ale jeśli kiedykolwiek zobaczyć na stronach człowieka na System komputerowy pewne odniesienie do wszystkie caps stała jak ten, który mówi, w przypadku błędu może to stała być zwrócone, to wszystko jakiś człowiek zrobił lat temu postanowił arbitralnie zwrócić szczególną wartość i Nazywamy to stała w przypadku coś pójdzie nie tak. Teraz magia dzieje się tutaj. Po pierwsze, jestem deklarując w linii 67 Dwa znaki, C1 i C2. A następnie w linii 68, jest w rzeczywistości linii kodu to przypomina nasz przyjaciel printf, zważywszy, że ma procent Cs w cudzysłów. Zauważmy jednak, co się tutaj dzieje. sscanf oznacza skanowanie ciąg - oznacza skanowanie sformatowany ciąg, sscanf ergo. Co to znaczy? Oznacza to, że przechodzą do sscanf ciąg. A wiersz jest cokolwiek użytkownik wpisze w. Możesz przejść do sscanf ciąg formatu, takich jak ten, który mówi, co jest scanf Masz nadzieję użytkownik wpisał w. Następnie przejść w adresach dwóch fragmenty pamięci, w tym przypadku, bo mam dwie zastępcze. Więc mam zamiar dać mu adres C1 oraz adres C2. I przypominam sobie, że dajesz funkcji adres jakiejś zmiennej, co jest implikacja? Co można, że ​​funkcja zrobić w wyniku o nadanie jej adres zmienne, w przeciwieństwie do sama zmienna? Może to zmienić, prawda? Jeśli miał ktoś mapę do fizycznego adres, mogą tam pójść i zrobić co chcą się pod tym adresem. Sama idea tutaj. Jeśli przejdziemy do sscanf, adres, dwóch fragmenty pamięci, nawet te małe małe kawałki pamięci, C1 i C2, ale możemy powiedzieć, że adres z nich, sscanf można go zmienić. Więc celem sscanf w życiu, jeśli czytamy strona man jest przeczytać, co użytkownik wpisze w, nadzieja dla użytkownika posiadającego wpisane w charakter, a może inny charakter, a co użytkownik wpisany pierwszy znak idzie tu, drugi idzie tutaj. Teraz, jak na bok, to i byś tylko wiem to z dokumentacji, Fakt, że mogę umieścić tam puste miejsce po prostu oznacza, że ​​nie obchodzi mnie, czy użytkownik wciśnie spację kilka razy, zanim on lub ona ma charakter, będę ignorować wszelkie spacje. Tak, wiem ze dokumentacja. Fakt, że istnieje drugi c% następnie spacje jest rzeczywiście celowe. Chcę być w stanie wykryć, czy użytkownik wkręca się, albo nie współpracowały. Więc mam nadzieję, że użytkownik tylko wpisane w jednej postaci, w związku z tym mam nadzieję, że sscanf tylko będzie wrócić wartość 1, ponieważ, ponownie, gdy czytam dokumentacji, celem jest w sscanf życia jest powrót do liczby zmienne, które zostały wypełnione z danych wprowadzanych przez użytkownika. Minąłem dwóch zmiennych adresy, C1 i C2. Mam nadzieję jednak, że tylko jeden z nich ginie, bo jeśli sscanf zwraca 2, co jest przypuszczalnie implikacja logicznie? Że użytkownik nie daj mi jeden postaci jak powiedziałem niego. Prawdopodobnie wpisane na najmniej dwa znaki. Jeśli więc zamiast nie ma sekundy C%, miałem tylko jeden, który szczerze mówiąc byłoby bardziej intuicyjne podejście, myślę, że na pierwszy rzut oka, nie będziemy w stanie wykryć jeśli użytkownik został dając więcej Wejście niż faktycznie chciał. Więc to jest niejawna forma od sprawdzania błędów. Zauważmy jednak, co robię tutaj. Kiedy jestem pewien, że użytkownik dał mi jedną charakter, I zwolnić linię, robi Przeciwieństwem getString, co z kolei używa malloc, a potem wrócę C1, znak, że miałem nadzieję, Użytkownik pod warunkiem i tylko pod warunkiem,. Więc szybko dostrzegła tylko, ale Wszelkie pytania dotyczące getchar? Wrócimy do niektórych innych. Cóż, pozwól mi iść dalej i zrobić to - Załóżmy teraz, tylko motywować nasze Dyskusja w tygodniu plus czas, to jest plik o nazwie structs.h. I znowu, to tylko smak czegoś, co nas czeka. Ale zauważ, że wiele tego jest komentarzy. Więc pozwól mi zaznaczyć tylko Interesującą częścią teraz. typedef - tam, że same hasła ponownie. typedef używamy zadeklarować ciąg jako szczególny rodzaj danych. Możesz użyć typedef stworzyć zupełnie nowe Typy danych, które nie istniały, gdy C została wymyślona. Na przykład, int pochodzi z C. char pochodzi z C. podwójne pochodzi z C. Ale nie ma pojęcie ucznia. A przecież byłoby to całkiem przydatna jest w stanie napisać program, który przechowuje w zmiennej, student numer ID, ich nazwy, a ich dom. Innymi słowy, trzy kawałki danych, jak i int smyczkowy i inny napis. Z typedef, co jest dość mocny o tym i sturct słów kluczowych dla struktura, to, programista w 2013 r., rzeczywiście może zdefiniować własne Typy danych, które nie istniały lat temu, ale że własnych celów. I tak oto, w wierszach od 13 do 19, jesteśmy deklarując nowy typ danych, jak int, ale nazywając go uczeń. A w środku tej zmiennej będzie są trzy rzeczy - int, string, i łańcuch. Więc można pomyśleć, co naprawdę tu się stało, choć jest to trochę uproszczeń na dzisiaj, Student jest w istocie dzieje wyglądać tak. Jej będzie fragment pamięci z identyfikatorem, nazwa pole, a pole dom. I będziemy w stanie wykorzystać te kawałki pamięć i dostęp do nich w następujący sposób. Jeśli pójdę do struct0.c, tu jest stosunkowo długi, ale po wzór, kodu, który wykorzystuje tę nową sztuczkę. Więc po pierwsze, chciałbym zwrócić uwagę do interesujących części góry szczyt. Ostry definiuje studentów 3, deklaruje stałe zwane studentów i osób przypisanych to arbitralnie numer 3, po prostu więc mam trzech uczniów przy użyciu ten program na teraz. Nadchodzi Main. I zauważ, w jaki sposób zadeklarować array studentów? Cóż, po prostu użyć tej samej składni. Student słowo jest oczywiście nowy. Ale studentów, klasy, uczniowie wsporniku. Tak niestety jest wiele ponownego użycia terminów tutaj. To jest tylko numer. Tak to jest jak mówienie, trzy. Klasa jest tylko to, co chcę zadzwonić zmienną. Mogę nazwać to studenci. Ale klasa, to nie jest klasa w obiektowym rodzaju Java drogi. To jest po prostu klasa studentów. I typ danych każdego elementu w tej tablicy jest studentem. Więc to jest trochę inaczej i od mówi coś tak, to jest po prostu - Mówię, że mi trzech studentów i nazywają to klasa Array. Dobrze. Teraz tutaj jest cztery loop. Ten facet zna - iterate od zero do trzech. A oto nowy kawałek składni. Program będzie zapyta mnie, człowieka, aby dać mu studenta ID, który jest int. A oto składnia, z którymi można zapisać coś w ID pola na Położenie klasy I. Więc wspornik składnia ta nie jest nowa. To po prostu oznacza, daj mi ósmy uczeń w klasie. Ale ten symbol jest nowy. Aż do teraz, my nie możemy stosować kropkę, przynajmniej w code tak. Oznacza to, przejdź do struktury zwanej studentów i umieścić coś tam. Podobnie w tym następnej linii, 31, przejdź do przodu i umieścić co użytkownik wpisze o nazwę tu i to, co robią dla dom, to samo, śmiało umieścić go w. domu. Więc co robi ten program w końcu zrobić? Można zobaczyć trochę liścik tam. Pozwólcie mi iść do przodu i rób elemencie 0 dot slash struct 0, ID studenta 1, mówi David Mather, student ID 2. Rob Kirkland, student ID 3. Lauren Leverit - i jedyne co ten program tak, który jest po prostu całkowicie arbitralne, jest Chciałem zrobić coś z tymi danymi, teraz, że już nauczył nas używać przypisać struktury, jest po prostu miałem ta dodatkowa pętla tutaj. I iteracji tablicy studentów. Kiedyś nasze, być może teraz znajomy znajomego, ciąg porównania stircomp do Sprawdzanie jest 8-ga dom studenta równa Mather? A jeśli tak, to po prostu wydrukować coś arbitralnie jak, tak, to jest. Ale znowu, po prostu daje mi możliwości wielokrotne korzystanie i ponownie ten nowy zapis kropka. Więc kogo to obchodzi, prawda? Wymyślanie studenckiego programu nieco arbitralny, ale okazuje się, że możemy zrobić przydatne rzeczy z To, na przykład, w następujący sposób. To jest znacznie bardziej skomplikowane struct w C. Jest tam kilkanaście lub więcej pól, nieco tajemniczo nazwane. Ale jeśli kiedykolwiek słyszał o grafice Format pliku o nazwie bitmap, BMP, to Okazuje się, że format pliku bitmapy prawie wygląda, że ​​ta. To głupi mały face Smiley. Jest to mały obraz, który mam w powiększeniu on dość duży, abym mógł zobaczyć każdy z poszczególnych punktów lub pikseli. Teraz okazuje się, możemy reprezentować Czarna kropka, powiedzmy, numer 0. A białe kropki z numerem 1. Więc innymi słowy, jeśli chcesz zwrócić Uśmiechnięta twarz i zapisać, że obraz w komputer, wystarczy zapisać zera i te, które wyglądają jak ta, gdzie znowu, te są białe i zera są czarne. I razem, jeśli faktycznie mają gird zer i jedynek, trzeba Siatka pikseli, a jeśli świeckich je, masz ładny little face Smiley. Teraz bitmap format pliku BMP, jest skutecznie, że pod maską, ale z pikseli więcej SOT, że może faktycznie reprezentować barwy. Ale gdy masz bardziej wyrafinowane formatów plików, takich jak BMP i JPEG i GIF , z którymi mogą się zapoznać, te pliki na dysku zazwyczaj nie tylko mają zer i jedynek dla pikseli, ale mają pewne metadane, a także - meta w tym sensie, że nie jest to danych, ale jest to przydatne. Więc te pola są tu co oznacza, i Zobaczymy to bardziej szczegółowo w P-set 5, że przed zer i jedynek, które reprezentują pikseli obrazu, istnieje kilka metadanych jak rozmiar obrazu i szerokość obrazu. I zauważyć, jestem wyrywanie off niektóre dowolne rzeczy tutaj - szerokość i wysokość. Ilość bitów i kilka innych rzeczy. Więc jest jakiś metadanych w pliku. Ale by zrozumieć, jak pliki są zawarte w ten sposób można rzeczywiście następnie przetwarzanie obrazów, odzyskać obrazy z dysku, zmienić rozmiar zdjęć. Ale nie możesz zawsze zwiększenia ich. I potrzebne zdjęcie. Wróciłem więc do RJ tutaj, który obejrzałeś na ekranie jakiś czas temu. A jeśli otworzy Keynote tutaj, to jest co się dzieje, jeśli starają się powiększać i zwiększenia RJ. On nie jest coraz lepiej naprawdę. Teraz Keynote jest rodzaj rozmycia to trochę, tylko do zatuszowania Fakt, że RJ nie dostać szczególnie wzmocnione, gdy powiększyć obraz A jeśli zrobić to w ten sposób, zobacz kwadraty? Tak, można z pewnością zobaczyć kwadraty na projektorze. To jest to, co dostajesz, kiedy zwiększyć. Ale w zrozumieniu, jak nasze RJ lub Uśmiechnięta buźka jest realizowany pozwoli nam faktycznie napisać kod, który manipuluje te rzeczy. A ja myślałem, że skończy się na tej nucie, z 55 sekund o wzmocnienia to, Śmiem, powiedzmy raczej mylące. [PLAYBACK VIDEO] -On kłamie. O czym, nie wiem. -Więc co wiemy? -To na 09:15 Ray Santoya był w bankomacie. -Więc pytanie, co robił na 09:16? -Fotografowanie dziewięć milimetrów na coś. Może widział snajpera. -A może z nim pracować. -Czekaj. Wróć jeden. -Co widzisz? -Przynieś swoją twarz w górę, na pełnym ekranie. -Jego okulary. -Nie ma refleksji. -To jest drużyna baseballowa Neuvitas. To jest ich logo. -A on mówi do każdego, kto jest sobie tę kurtkę. [END PLAYBACK VIDEO] DAVID J. MALAN: będzie być ustawiony Problem 5. Do zobaczenia w przyszłym tygodniu. MALE SPEAKER: Na następnym CS50. [Świerszcze ćwierkają] [Odtwarzanie muzyki]