JASON Hirschhorn: Witamy do A5, każdy. Mamy ekscytujący tydzień przed nami, głównie dlatego, że istnieje tak wiele nowych stoi w tym pokoju. To jest cudowne. Wielu z was jest tutaj przez przypadek, co jest jeszcze lepsze. Więc mam nadzieję, że będziesz trzymać do nas dołączy. W tym tygodniu mamy zamiar spędzić Większość sekcji przygotowania do quizu. Więc na naszym programie, będziemy rozmawiać nieco o zasoby na klasy, a także quizu, a następnie ponownie spędzają większość klasy rozmowy o pytania. Kiedy skończysz odbierasz pytania, lub jeśli twoje pytania naturalnie prowadzi nas do jakiegoś kodowania, ja przykładowe problemy z midterms przeszłości, że będziemy żyć w sekcji kodu razem, że również przywołać inny dobre tematy na okładce. Więc po pierwsze, jak już przeszedł na ostatnie kilka tygodni, aby przypomnieć, Chłopaki, jest mnóstwo zasobów dostępny dla tego kursu. Wiele z nich będzie bardzo pomocny do was, jak nadal studia quizu 0, ponieważ to jest we wtorek po południu. Tak was wszystkich było studiuje na trochę. Nie są notatki do wykładów i źródło Kod, który należy na pewno sprawdzić. Oglądać szorty. Sprawdź study.cs50.net. A następnie, wymienione poniżej, numer innych zasobów. Ponownie, jest jutro 0 quizu na 1 rano. Jeśli nie zostało to jeszcze zrobione, należy sprawdzić Quiz z tej O dokumencie na 0 stronę przedmiotu, aby dowiedzieć się, dokąd się wybierasz, biorąc udział w quizie. Quiz rozpoczyna się w 1:10 i kończy się 70 minut później. Więc jeśli pojawi się po 1:10, jesteś dostanie, że wiele mniej minut od 70 do quizu. Więc upewnij się, że jesteś tam na czas. Jeśli jesteś studentem lub mają rozszerzenie niektóre inne względy badania, to może nie być w godzina pierwsza jutro. Ale znowu, sprawdź O Quiz 0 udokumentować, aby upewnić się nie wiadomo kiedy bierzesz udział w quizie. Napisałem 75 minut tutaj. Myślę, że ma rację, a nie 70. Obejmuje ona wszystkie materiały z tygodnia 0 do zeszłotygodniowego wykładu w środę. I znów, do tego quizu, za które Dokument, masz jeden dwustronny i 8 1/2 do 11 arkuszy papieru, aby uzyskać używać jako notatek podczas quizu. Wiele osób, jeśli nie większość ludzi, mają okazało się, że jednym z najbardziej pomocny sposób na studia jest quiz wykonaj arkusz nauce, jedna sider, własnych. Więc spójrz na tych ostatnich, jeśli widziałeś przeszłych. Dotrzeć do znajomych, aby zobaczyć, co oni umieszczenie na nich. Ale ręce w dół, to najlepszy sposób można Badanie to jest przejść przez wszystko i zredukować go do tego, co powinien lub powinien Nie należy w tym arkuszu papier, bo to po prostu bardzo była sposobem, aby upewnić się, idziesz przez wszystko i mieć jakieś znajomości z nim. Większość ludzi, znaleźć, mimo że się arkusz papieru siedział obok nich w quizie, nie włącza do niego, gdyż jeszcze, że bardzo Proces przechodzi informacji pomógł im się go nauczyć. Czy ktoś ma jakieś pytania o quizie 0? Ma wszystkich - Nie zamierzam robić pokaz rękach. Nic nie szkodzi. Chciałem zapytać, kto rozpoczął studia. Ale ja nie chcę, aby ci wszystko nie podnieść ręce. Tak jak powiedziałem - tak, Avi, śmiało. AVI: Co byłoby przydatne rzeczy umieścić na jednej pager? Student: To zależy od ciebie. JASON Hirschhorn: Otrzymasz korzystać z wyroku. Przydatne rzeczy umieścić na jednej pager, jeśli jesteś mylić o Big O czas różnych rodzajów wyszukiwania i rodzaju, umieścić, że w sprawie nie poręczne dandys wykres. W ten sposób, jeśli jesteś proszony, że na quizu, nie trzeba spróbować i rysunek czy to z powodu, przez starcie. Możesz po prostu skopiować go. Jeśli spojrzeć na quizy przeszłości, wiele razy, nie działa na pytania w czasie. Tak że byłoby przykład dobre co umieścić na jednej pager. Inne dobre rzeczy włożyć, jeśli jesteś zagubiony jak deklarować Funkcja lub co poszczególne części deklaracja funkcji są, napisz że tam, generycznych wersji i to może przykład. Jeśli jesteś mylić o wskazówki, schemat jak wskaźniki praca jest Prawdopodobnie bardzo pomocna. Jeśli jesteś mylić o rekursji, a skosztować tam funkcję rekurencyjną może również okazać się bardzo pomocna. Czy to daje jakieś pomysły? AVI: Musisz zrozumieć, Cały proces kompilacji, jak jak to wszystko działa? JASON Hirschhorn: Wszystko , który został pokryty mógł pokazać się w quizie. Pytania - ale znowu, niektóre rzeczy będą ważone stopniu niż inne. Niektóre rzeczy mają pochodzić ponownie , a następnie w klasie w Wykład i sekcja. Inne rzeczy nie mają wymyślić, że często. Rozmawialiśmy dużo o # include i -L, a coś, co to znaczy w Proces kompilacji. Rozmawialiśmy dużo o GDB, trzymać, te różne flagi, które stosujemy, gdy musimy skompilować coś, a co make15 np. rzeczywiście oznacza, i rzeczywiście. Nie mów tyle, o każdy krok w Proces kompilacji. Mamy jeszcze rozmawialiśmy o tym. Więc to jest coś, czego jeszcze powinien znać. Ale znowu, nie zamierzamy być - rzeczy, które pojawią się w klasie częściej są bardziej prawdopodobne do wystąpienia więcej częściej i bardziej intensywnie ważonych w quizie. Fajne. Wszelkie inne pytania dotyczące quizu 0? OK, więc mogę umieścić listę Tematy na forum. Przeszedłem przez program nauczania. Przeszedłem sekcji test z wczoraj i te slajdy wymyślić z niepełnego wykazu tematów że mamy objęte dotychczas w CS50 i rzeczy, które mogą pojawiają się na quiz. Więc ja nie zamierzam przejść przez każdy z nich. Że zajmie dużo więcej czasu niż mamy teraz. Ale Ja to się tutaj z nadzieją pobiegać pamięć co do rzeczy, które mogą lub może nie być tak zna ciebie. I chciałbym spędzić większość Sekcja odpowiadając na pytania o te tematy, tematy, które nie zostały uwzględnione. Możemy napisać kod pseudo. Możemy napisać prawdziwy kod aby upewnić się, że - Mogę odpowiedzieć na to pytanie i pomoże wszyscy zasadniczo rozumieć Wiele z tych tematów, więc będziesz czuć przygotowane i wygodne wchodząc Quiz jutro. Więc przeczytać listę. Mam nadzieję doszli do sekcji kilka pytań, jak również. Kiedy będziesz gotowy, podnieść rękę i zaczniemy. Należy pamiętać, pytania masz, nie ma głupich pytań. Słyszeliśmy, że dużo. I pytania trzeba, jestem gotów postawić, jak wiele innych osób siedzi tu i oglądania online mają również. Więc można tylko pomóc ludziom zadając pytania. Marcus. MARCUS: pomiędzy stosie kupa, tam jest wstępnie przyznane procent pamięci, który jest zdefiniowany jako jest na stosie lub hałdy? Lub jak to działa dokładnie? JASON Hirschhorn: Wielki znak zapytania. Idę do tyłu prześledzić trochę. Czy wszyscy - proszę tu być uczciwy. Wiem, że proszę cię podnieść strony przed swoimi rówieśnikami. Ale są tam ludzie, którzy czują się niewygodne ze stosu i sterty i chciałbym, aby przejść nad tym i co ci chodzi? Podnieś rękę, jeśli - OK. Dziękuję. Więc mamy zamiar iść na stos i kupa naprawdę szybko, a następnie przejść do odpowiedzi na Twoje pytanie. Więc jeśli zwracamy się do reprezentowania polu pamięci na komputerze, jakie są rzeczy, które w tym polu? Główny. Główną funkcją. Gdzie głównym iść? STUDENT: [niesłyszalne]. JASON Hirschhorn: Więc będziemy umieścić głównym tutaj. Co jeszcze idzie w tym polu? STUDENT: Funkcje, które można nazwać. JASON Hirschhorn: Funkcje które nazywamy. I gdzie są? Student: W stosie. JASON Hirschhorn: Oni go na stosie. Więc mamy zamiar nazwać co tu stos. I do góry, mamy kupę. Więc pamięć nie jest tak jak to pudełko. Ale to jest rzeczywiście bardzo podobny. To będzie dużo pudełek na i ponad, w zależności od tego, jak duży jest twój komputer lub jak duża pamięć jest. Na cytat-koniec cytatu "dół" jest stos. I jest wiele rzeczy, że go na stosie. I tych, zależy od funkcji masz w kodzie. Zawsze masz jedną funkcję w telefonie Kod nazywany głównym, więc zawsze Sekcja tu w stos poświęcone głównym. Te odcinki w stosie nazywane są ramki stosu. Kiedy zadzwonić do innej funkcji, powiedzmy głównym zwraca binarną funkcję wyszukiwania, stawiamy kolejne ramki na stosie. Dokładniej, będziemy darować kawałek pamięci na nasze komputer do przechowywania binarne wyszukiwania jest lokalny zmienne i uruchomić plik binarny Kod wyszukiwania. Tak nazywamy wyszukiwanie binarne. W tym fragmencie pamięci, będziemy przechowywać swoje zmienne lokalne. Mamy zamiar zapisać swoje printf połączeń. Cokolwiek się zdarzy, że funkcja jest będą przechowywane tam. Binary search zamierza wykonać. To będzie wykonać egzekucję. Co to jest słowo, które oznacza w C że funkcja powinna zakończenia jego realizacji? STUDENT: Powrót. JASON Hirschhorn: Powrót. Więc gdy widzisz instrukcji return, Funkcja kończy gdy trafi to. Szukaj więc binarny trafi jego powrót. Ta część pamięci będzie zasadniczo być uwolnione. I główny wróci do wykonania. Tak więc głównym będzie wstrzymać gdziekolwiek był, zadzwoń wyszukiwanie binarne, trochę wartości zwracanej, i kontynuować wykonanie. Ramka stosu odejdzie. Jeśli nazywamy rekurencyjną funkcję, która Jest to funkcja, która zwraca się w ciągu kółko, możemy uzyskać - mówi nam nie binarnego wyszukiwania rekurencyjnie. Możemy uzyskać poszukiwaną wersję jednego binarnego, wyszukiwanie binarne dwa, wyszukiwanie binarne trzy, cztery binarne wyszukiwania, wyszukiwanie binarne pięć. I wtedy ten końcowy wyszukiwanie binarne pięć trafi na sprawę podstawową, i stos klatek będzie wrócić i zatrzymać zamykanie , aż wrócimy do głównego. Możemy iść na rekursji w kawałku. Ale to wszystko jest do powiedzenia, jeśli jesteś wywołując wiele funkcji na raz, że nie będzie wielu stos ramki na stosie. Stos, z drugiej strony, do Tutaj nie jest dla funkcji nie dla zmiennych lokalnych. To dla dynamicznie przydzielane zmienne. Więc są to zmienne, które mogą być inicjowane w jednej głównej lub funkcja, która główne połączenia. W dowolnym miejscu w kodzie, że może zostać zainicjowany. I zainicjować dynamicznie Zmienna przydzielone. Jaką funkcję w C używamy? STUDENT: Malloc. JASON Hirschhorn: Malloc. Nazywasz malloc. Masz miejsca pamięci. I że przestrzeń pamięci jest hałdy. I że pozostaje przestrzeń pamięci tam do czasu wywołania darmo. Tak dynamicznie przydzielane zmienne kupa będzie istnieć tak długo, jak ty chcę, żeby istnieć, a oni nie będą odejść, dopóki nie wyraźnie powiedz im odejść. Możesz utworzyć je w jednej funkcji. Stos, które działają w ramka zniknie. Ale, że zmienna będzie nadal istnieć w stos, dopóki nie zostanie uwolniony potencjalnie przez funkcję, zwaną wyszukiwanie binarne lub cokolwiek. Więc te zmienne kupa tam tak długo, jak chcesz im tam. A oni się umieścić tutaj. A potem następny zostanie tam umieszczone. Mają coraz wypełnione, a oni tam pozostać do czasu wywołania darmo. I w istocie, sterty i stosu, się do kwestii Marcusa, rośnie w kierunku do siebie nawzajem. A jeśli działają one na siebie, masz stosować całą pamięć w telefonie komputer, a program będzie zamknąć dlatego, że nie mam żadnych więcej pamięci od lewej do użycia. Pomiędzy nimi istnieje potencjalnie innych rzeczy. Ale zakres tego kursu, Ciebie nie musisz się o to martwić. Tak aby była odpowiedź do Twojego pytania. Niech się Pan o to nie martwi. Ale to było dawno odpowiedź. Wszystko, co musisz wiedzieć, sterty i stosu będzie - rozpoczyna się na dole. Stos ma. Kupa tam jest. Będą zbliżyć do siebie. A jeśli dotknąć, to jest problem. Ci zabrakło pamięci. Ale także, oprócz wiedzy, gdzie są one, co jest przechowywane w obydwu stosu i sterty. Curtis. CURTIS: Kiedy zderzają się, jest to, że przepełnienie stosu? JASON Hirschhorn: Kiedy zderzają się, to nie jest przepełnienie stosu. Przepełnienie stosu jest inny obszar że możemy przejść, jeśli chcesz. OK, wrócimy do tego za chwilę. Student: Co jest słowo nazywa gdy uderzają wzajemnie stosu i sterty? JASON Hirschhorn: Na razie, nie przejmuj się. Po prostu wiem - Odpowiem na to pytanie po zajęciach. Jeśli działają one na siebie, to zabrakło z pamięci, bo nie ma więcej miejsca tam. Student: Przepraszam, co jest wina SEG? JASON Hirschhorn: Segment Usterka może być konieczne - to zależy, dlaczego nazywa winy SEG. Zdarza się, że przepełnienie stosu, to będzie powiedzieć seg fault jako błąd. Student: Co dereferencing null zmienna? Czy to wina SEG? JASON Hirschhorn: dereferencing pustego wskaźnika - OK, więc jeśli masz wskaźnik, że ty równy null, wskaźniki, przypomnijmy, Adresy sklep pamięci ich wartości. I zasadniczo jest wskaźnik NULL przechowywanie 0, 0-th zająć w tej zmiennej. Tak więc 0x, 0, 0, 0, 0, i tak dalej. Że 0-ty adres w pamięci, że nie jest w naszym zdjęciu, to tam gdzieś, że jest zastrzeżone dla komputera. My nie wolno go dotykać. Więc, gdy Twój program jest wykonywany, jeśli coś próbuje przejść do pamięci adres 0, to wie, że że jest pusta wartość. Wie, nic nie powinno tam być. Więc jeśli próbujesz coś tam i używać i traktować jak tam lub coś stara się iść do tego miejsca, jesteś dostanie usterki seg lub błąd. Czy to wyjaśniło Twoje pytanie? A teraz wracamy na przepełnienie stosu. Rzeczy na stosie, jak macie widział, w - powiedzmy narysować blisko się z ramki stosu. Czy każdy może zobaczyć, że? Więc mamy stosu ramki. Ratujemy tablicę jako lokalny zmienna w tej funkcji. Więc powiedzieć, że nasze tablica ma pięć punktów. Wszystkie pięć osób będą przechowywane W tej ramce stosu. Jeśli zaczniemy piśmie poza Granice tej tablicy - Jeśli więc zacząć pisać do, powiedzmy, że jest 0. Są to pięć indeksy naszej tablicy. Jeśli zaczniesz pisać w indeksie 5, który nie mamy, gdy mamy Tablica o wymiarach 5, zaczynamy pisanie do Indeks 6, 7, 8, 9, możemy dostać stos Przepełnienie błąd. Generalnie to nie jest - prawdopodobnie będziesz miał kłopoty jeśli się nad jednym. Ale ogólnie, można dostać się do większość problemów, jeśli pójdziesz przez wiele i iść tak daleko, że piszesz na na adres zwrotny, który Funkcja, która znajduje się w Dno ramki stosu. Ponieważ, tak? Ci - w - przepraszam. Nie ", ponieważ dobrze." W ramce stosu, trzeba Twoje lokalne zmienne. U dołu stosu Rama jest adres zwrotny. To, gdzie funkcja idzie, kiedy to się skończy. A jeśli zastąpić ten zwrot adres, a następnie, gdy ta ramka stosu, kiedy idziesz przez stos kadrowanie i wykonywanie każdego wiersza, jesteś pójdzie do nowego adresu zwrotnego tam jest napisane, że zamiast rzeczywisty jeden. I to jest, jak widzieliśmy, niektóre naruszenia bezpieczeństwa może zdarzyć się z komputerami. Więc przepełnienie stosu, w skrócie, jest przy można zastąpić część w stosie masz się stosować, lokalne Zmienna masz się stosować, a w szczególności podczas uruchamiania nadpisywania ważne rzeczy, jak adres zwrotny. I tam dostaniesz błąd. A może nawet można zacząć nawet pisząc do - Wyszukiwanie binarne było powiedzieć tuż nad głównym. Jeśli dużo zastąpiłeś, ci może napisać do głównego. Ale ogólnie, pojawi się błąd, zanim Następnie, ponieważ komputerowy wie robisz coś, czego nie powinno się robić. Tak. STUDENT: Jaka jest różnica między przepełnienie stosu i przepełnienie bufora? JASON Hirschhorn: Przepełnienie bufora jest bardziej ogólny typ Znalazłem coś opisane. Student: Tak jest przepełnienie stosu przykład na przepełnienie bufora. JASON Hirschhorn: Dokładnie. To jest tablica możemy myśleć jako bufor, miejsce na rzeczy, aby przejść w. Bufor ten jest przepełnienie stosu. Mogliśmy przepełnienie buforu sterty. Jeśli było bufor których często Tablica jest kupa, a my nadpisałeś te granice, to byłoby mają przepełnienie buforu sterty. I wykracza poza zakres tego kursu, są one wykrywane nieco inaczej. Kompilator ma specjalny sposoby wykrywania każdego. Ale jest przepełnienie buforu bardziej ogólny typu, co opisałem, co było przepełnienie bufora na stosie. Czy to wyjaśniło Twoje pytanie? Słodkie. Czy były jakieś inne pytania związane na stosie lub na stercie? Tak. Student: Wiem, że masz do bezpłatnych ciągów bo są w kupie i nie chcesz, aby wyciek pamięci. Ale masz uwolnić zmiennych globalnych i takie tam? Lub są one automatycznie usuwane? JASON Hirschhorn: Dobre pytanie. Więc w CS50.H tworzymy tę rzecz Ci zwany ciąg. Ciąg jest naprawdę to, co? STUDENT: Char gwiazdki. JASON Hirschhorn: gwiazda char, wskaźnik do charakteru, wskaźnik do Tablica znaków. To ciąg jest. Więc musimy ją uwolnić, ponieważ getString, którego użyliśmy dużo - Nazwa ciągu jest równy GetString - że mallocs dla nas trochę pamięci na kupa, a następnie zwraca wskaźnik do Pierwszy znak, że łańcuch, gwiazda char. Tak ostentacyjnie, jeśli nie zostały pisanie darmo na dowolnych ciągów że nazywa się pan tak daleko, trzeba został przecieka trochę pamięci. Oczywiście, że nie mówił o to, więc nikt nie dostał w kłopotu robią. Ale w przyszłości, tak. Kiedy zadzwonić GetString, jesteś mallocing trochę miejsca na stercie. A jeśli nie zadzwonić później, że wolny ciąg, masz przeciek pamięci. Że odpowiedź na pytanie? Tak Student: Tak, aby to zrobić, używamy wolny tuż przed powrotem? Jak, w zakresie, myślę, że jeśli powiedzieć, jak, int main, w ramach zakres kodu, który znajduje się w tych nawiasy klamrowe, tuż przed - wiesz, gdzie jesteś, że zazwyczaj umieścić zwrot. Czy można umieścić za darmo przed tym? JASON Hirschhorn: Więc można umieścić za darmo wszędzie tam, gdzie chcesz umieścić darmo. Ponieważ są one dynamicznie przydzielane zmienne, ponieważ mogą one Mieszkam poza zakres szczególności funkcji, jeśli zadzwonisz malloc w oddzielna funkcja, na przykład, getString, można zadzwonić za darmo w głównym. Nie musisz nazywać W szczególnej funkcji gdzie malloc nazywa. Ale trzeba to nazwać przed sądem zwrotu. I tak naprawdę zależy. To zależy od tego, dlaczego malloced że Przestrzeń w pierwszym miejscu. Niektórzy ludzie nazywają uwolnić się dość szybko. Niektórzy ludzie nie będą dzwonić za darmo do momentu Koniec ich programu. A oni przejść przez i wolne wszystko. To zależy od tego, dlaczego nazywa malloc. Student: A co byś powiedział, jeśli nazywa użytkowania GetString? Można by powiedzieć, wolne, co? JASON Hirschhorn: Więc składnia za darmo jest po prostu wolny, otwarty nawias, w pobliżu nawias i nazwa wskaźnika. Więc jeśli piszesz String name równych getString, można umieścić nazwę tutaj. To nazwa wskaźnika. I wie, aby uwolnić tę pamięć. Uczeń: Tak więc kiedy zwalnia, że ​​pamięć, Wskaźnik wskazuje na to miejsce w pamięci? Lub też jest opróżniany z wskaźnik adres, który wskazuje na. JASON Hirschhorn: Powinniśmy spróbować. Powinniśmy zakodować, że. Wróćmy gdy mamy do kodowania, i niech to kod, który. A jeśli chcesz dowiedzieć się, odpowiedź się, że można również kod w międzyczasie. Ale to jest dobre pytanie. Student: Czy jest możliwe, aby wolne coś zbyt szybko? Więc nadal trzeba go do programu, i uwolnił, że miejsca w pamięci? JASON Hirschhorn: Tak. Jest to możliwe, jeśli coś za darmo a następnie użyć go ponownie, będziesz uruchomić w błąd. Ale to na ciebie, bo uwolnił coś, a następnie nazwał go później. Więc to był błąd programisty. Ale tak. Można napisać, że. Jeszcze jakieś pytania na temat - Tak. Uczeń: Tak więc, jeśli mają tylko uwolnić go, zanim w ogóle Program kończy się, to znaczy, jeśli Program kończy się i nie uwolni go, że pamięć jest nadal przydzielone? JASON Hirschhorn: Jeśli program kończy i zapomnieć, aby uwolnić coś, a następnie że pamięć została przydzielona przez żywotność programu. Gdy program zamyka się całkowicie, że pamięć nie będzie pozostać tam na zawsze. Komputer jest na tyle inteligentny, aby wiedzieć, że gdy zamyka program, to należy się pozbyć wszystkie pamięci związany był z programem. Istnieją jednak narzędzia można uruchomić na program do wykrywania, jeśli przy Program zakończył, zapomniałeś , aby zwolnić pamięć. I na następne problemu ustawić gdzie będziesz używać malloc i korzystania wskaźniki, będzie uruchomiona ta zaprogramować od programu, aby zobaczyć, czy, gdy główne powróci, trzeba było niektóre rzeczy, które zostały pozostawione unfreed. Więc nie zamierzamy zatrzymać malloced zawsze w komputerze. To byłoby marnotrawstwo, bo bardzo szybko, komputery zabraknie pamięci. Ale jeśli trwał do końca Twojego zaprogramować i nie są one uwolnione i twój Program wychodzi, że nadal problemem że to narzędzie pomoże Ci rozwiązać. Student: Czy to Valgrind? JASON Hirschhorn: To nazywa Valgrind. I będziesz - Uczeń: Ale nie mamy wiedzieć że w quizie, choć? To znaczy, że mówiono o trochę w wykładzie. JASON Hirschhorn: Więc Valgrind jest nazwa tego narzędzia. Wiedząc to, co robi jest wystarczy quizu. Ale nie zostały wykorzystane jeszcze na twój Problem ustawić bo nie mieliśmy Zestaw problem wyraźnie rozpatrywane z malloc lub za pomocą malloc. Więc nie był jeszcze używany Valgrind. Ale można go użyć wcześniej niż później. Student: Czy można powtórzyć co Valgrind jest? JASON Hirschhorn: Przepraszam? Student: Czy możesz powtórzyć to, co Celem Valgring jest? JASON Hirschhorn: Valgrind to nazwa - jak GDB pomaga debugować program, Valgrind pomaga dowiedzieć się, czy rzeczy nie zostały uwolnione gdy program się zamyka. Więc można go uruchomić w programie. I program wychodzi, i będzie to powiedzieć program nazywa malloc to wiele razy tego wielu bajtów, a ty tylko w nazwie darmo to wiele razy. I tak zostawiłeś te wiele bajtów bez uwolniony. Albo będzie to powiedzieć już uwolniony wszystko. Dobra robota. STUDENT: OK. I to się nazywa Valgring? JASON Hirschhorn: V--L-G-R-I-N-D. STUDENT: pytanie o wskazówki. Więc mówisz, że n gwiazda x równa się coś. Równa, co jesteś wprowadzenie tam, jest to, że to, co jest umieścić wewnątrz x, co wskazuje, lub wskaźnik od x? JASON Hirschhorn: można powtórzyć pytanie? Możemy wyciągnąć go natomiast to powiedzieć? Student: W quizie, rzeczywiście, jeden nas wysłany, to było jak, char gwiazda prawda równa CS50 skały, prawda? Czy to oznacza, że ​​CS50 skały jest co prawda wskazuje? JASON Hirschhorn: Więc mówisz o gwiazdy znaku w ciągu znaków, jak , który działa? Tak. OK. Miejmy narysować to tutaj. [Boku ROZMOWA] JASON Hirschhorn: Więc ta zmienna ma być typu char gwiazdy. Jak duży jest zmienna gwiazdy typu char? Ile bajtów? STUDENCI: Cztery. JASON Hirschhorn: To cztery bajty. Ile prawa jest zmienna typu int gwiazdy? STUDENCI: Cztery. JASON Hirschhorn: cztery bajty. Jeżeli jest to wskaźnik, to jest zawsze cztery bajty, ponieważ zapisane wskaźniki, ich wartość jest adres pamięci. I adresy pamięci na CS50 Urządzenie to cztery bajty. Więc kiedy nazywamy GetString lub kiedy powiedzmy, stringName równa, a następnie w cudzysłowy umieścić napis, stawiamy - dobrze, że jest trochę inaczej. Zrobimy GetString jako przykład. Char coś lub gwiazda równa się łańcuch. Przykro mi, daj mi przykład że czytasz? STUDENT: Prawda jest równa char gwiazda "ska CS50" w cudzysłów. JASON Hirschhorn: Więc ta gwiazda, ta nazwijmy to dla naszej zmiennej x. cele ogólne. Stworzyliśmy zmienną x. Jest to typ char gwiazda. Jest to wskaźnik do serii znaków. Więc tutaj - Tak to jest, jak to by pracować w pamięci. To przechowywać adres pamięci. To przechowywać adres pamięci Pierwszy znak w tablicy. I wtedy, gdy następuje wskaźnik, byś uzyskania pierwszego znaku. A jeśli czytasz to coś jak łańcuch, komputer jest inteligentny wystarczy wiedzieć, przeczytać całość , aż dojdzie do gwałtownej reakcji 0. Ale jeśli czytasz to na charakter Czas, więc jesteś iteracja ten ciąg, wtedy po prostu czytać znaków na raz, aż dojdziesz do odwrotny ukośnik 0. To może nie odpowiedzieć na Twój pytanie, choć. Student: Tak, ale nie mają malloced że przestrzeń Jeszcze do tego wskaźnika. JASON Hirschhorn: Więc nie jestem pewien, dokładnie to, czego szukasz w, bo nie sprawiają, że quiz. Który miał być pomocny zasobów z innego TF. Jeśli tworzysz na ciąg stos lub zmiennej lokalnej, to będzie po prostu tablica zamiast opłat ogólnie gwiazda char wskazując inny ciąg. Ale nie wiem. To może być wskaźnikiem innego ciąg na stosie, jak również. Tak. Student: Wiem, że trzeba przydzielić pamięci, gdy wskaźnik jest coraz deklarowane wewnątrz z innej funkcji. Czy trzeba zrobić to samo, jeśli to deklarowanych wewnątrz głównego, używasz go wewnątrz głównej? JASON Hirschhorn: Więc tak. Możesz zadeklarować wskaźnik do dowolnego adres pamięci w pamięci. Może to być adres pamięci lokalnej zmienna, choć często, ludzie nie deklarują adresów pamięci do zmiennych lokalnych, ponieważ wykraczają Odległość kiedyś, że funkcja zwraca, które Dlatego generalnie malloc rzeczy. Ale tak, można zadeklarować wskaźnik do innej zmiennej lokalnej. To jest po prostu ogólnie nie zrobił. Ale mogę przyjrzeć się, że konkretne rzeczy po klasie. Tak. Student: Myślę, że to jest rodzaj o co się prosi. Wydaje się dziwne, aby być inicjowanie a nie jako wskaźnik adres, ale to, co wydaje się wartością. Wydaje się, CS50 to co jest w środku rzeczą jest wskazał i nie rzeczywisty adres, prawda? JASON Hirschhorn: Więc to jest nie przypadek, choć. To nie jest to, co się dzieje. Kiedy deklarujesz gwiazdę char, jest to adres w pamięci. Wskaźniki są wszystkie adresy pamięci wskazując na coś innego. Że coś jeszcze może być na stos, ale prawie zawsze jest na kupa w drodze zobaczymy kiedyś. Ale stringName równa cudzysłów "GetString", widzimy, że i my przez które można zajrzeć i kod, który. GetString ciąg nie jest zapisany w że zmienna, lub cokolwiek ciąg Nazwa nie jest zapisane, że zmienna, a nie dlatego, że tak wskaźniki pracy. Czy to ma sens? Uczeń: Tak. JASON Hirschhorn: OK. Miejmy nadzieję, że nie było mylące dla każdego. Ale jeśli tak, możemy spojrzeć na to jeszcze raz w kawałku, ponieważ jesteśmy naprawdę dzieje do kodu coś, co mam nadzieję, że pracy z tekstem i pomóc poczuć bardziej komfortowo z nich. Wszelkie inne kwestie związane z tymi tematów lub inne tematy, które Włożę z powrotem? I - teraz. Tak, Alden. ALDEN: Więc to jest zupełnie bez związku, ale może po prostu przejść nad bardzo szybko, co musimy wiedzieć o różnicy między 32 a Maszyna 64-bit? JASON Hirschhorn: Tak. Więc 32 bity jest jak wiele bajtów? ALDEN: To cztery bajty. JASON Hirschhorn: To cztery bajty. I 64 bity jest to, jak wiele bajtów? STUDENT: Osiem. JASON Hirschhorn: Osiem bajtów. Więc jeszcze raz, osiem bitów to jeden bajt. Twoje urządzenie CS50 jest Maszyna 32-bit. Więc adresy pamięci są czterech bajtów. Istnieją 2 do 32. adresy pamięci. 0 do 2 do 32 minus 1. A ja nie jestem pozytywny, ale to Prawdopodobnie zakres, co trzeba wiedzieć na maszynie 32-bitowego, to pamięć adresy są znowu cztery bajty, i to jest maksymalna kwota adresów pamięci. Ponadto, typy danych - Może to być coś tak dobrze, że warto zauważyć. Wielkość zależy od typu danych Maszyna pracy z. Tak char, jeden znak, jest to, jak wielu bajtów na naszej CS50 urządzenia? Jeden bajt. I to jest rzeczywiście jeden bajt jako oraz w komputerze 64-bitowym. I większość typów danych są takie same liczby bajtów na obu komputerach. Ale niektóre typy danych będą różne na obu komputerach. Tak że potencjalnie Jedyne, co musisz wiedzieć. Ale nawet to, jak sądzę, jest poza granice - Jestem prawie pewien, jeśli spojrzeć wstecz w starych quizy, to mówi, zakładamy na kodowanie problemów, których używasz Maszyna 32-bit. Ale są, aby przejść wraz z tym w Jeśli jesteś zainteresowany, nie istnieje rodzaje danych, które są takie same Rozmiar na wszystkich maszynach. Jeśli widzieliście coś takiego uint32_t, może być lub Nie widziałem tego. To jest typ danych. Które mówi, jest 32 bity bez względu czym urządzenie to jest włączone. Więc kiedy ludzie piszą przenośne Kod, prawdopodobnie nie będzie korzystać ints. Oni zamiast używać tych innych danych rodzaje że będą wiedzieć sam Rozmiar na każdej maszynie. Madhu. Madhu: Miałem pytanie o Proces kompilacji. Więc jeśli piszesz program, który używa Biblioteka jak CS50 lub coś tak, wiem, że biblioteka musi w pewnym punkcie, bądź skompilowane i połączone w. Ale ile z tego się dzieje podczas kompilacja programu? Jaka część tego procesu biblioteki pojawia się, gdy jesteś kompilacji własnego programu? JASON Hirschhorn: Więc chodźmy na Ogólnie, kroki tego sposobu. Ci napisać c plik.. W c plik., To # include swoje Biblioteki nagłówka, na przykład, cs50.h. Co oznacza, że ​​ostre m.in. Linia zrobić do programu? Akchar. AKCHAR: Dodaje prototypy funkcjonuje z nagłówka plików w bibliotekach. JASON Hirschhorn: Dokładnie. Dodaje, że te prototypy funkcji do kodu. Tak więc, gdy kod jest kompilowane w wczesnym stadium, kompilator wie że funkcje te naprawdę istnieją, i że gdzieś zostały zdefiniowane. Pliki. H nie obejmują definicje dla tych funkcji lub sposobu faktycznie pracują. Cs50.h tylko zawiera coś, co mówi getString jest prawdziwa rzecz, że może się zdarzyć. I standardio.h mówi printf jest prawdziwe, że może się zdarzyć. Więc c język z tym. Nagłówek plik zostanie przekształcone w niektórych Kod do odczytu maszynowego, które ostatecznie zostaje przekształcony binarny Kod, 0 i 1 jest. I to jest kod, który ostatecznie zostanie wykonany. -L CS50 linii - na przykład, gdy piszesz dzyń - a następnie są-l CS50, wpisać, że w. I widać, że. Podczas pisania zrobić, będziesz zobaczyć, że linia się tutaj. I zobaczymy, że w drugim przypadku kodujemy lub później, kiedy kod. Ale to-l linia CS50 robi coś nieco inaczej niż # include cs50.h. Co robi linia-l CS50 zrobić? Avi? AVI: Chcę powiedzieć, że łączy biblioteki do funkcji zadzwonić, jak. pliki o. JASON Hirschhorn: Tak bardzo blisko, jeśli nie spot-on. -L CS50 wykonuje plik binarny i łączy je z pliku binarnego. Więc cs50.h, nie ma sensu w przekształcaniu cs50.h z języka C do dwuskładnikowych każdego wolny czas, jest on używany. To byłoby głupie, bo to nie tracić czasu. Tak to już jest skompilowany i zwrócił się do pliku wykonywalnego. A teraz to ma być połączone z pliku na końcu. Więc te 1 i 0 są dzieje do łączenia się z tymi i 0 na koniec. Więc teraz będziesz rzeczywiście rzeczywista 1 i 0, które definiują sposób GetString, na przykład, działa, lub jak printf, Na przykład, prace. I uzyskać więcej informacji, nie krótkie kompilatory, które daje, że Nate należy sprawdzić, że idzie przez te etapy. Ale - Tak. Student: Czy zawsze w pliki o.. gdy są w formie biblioteki, gotowe do połączenia, związany - jak są one w kodzie binarnym? JASON Hirschhorn: OK. Co - Student: Czy to zawsze w przypadku biblioteki, gdy połączyć je? JASON Hirschhorn: Tak. Więc nie. S pliki, które będą kodem maszynowym, co również będzie tajemnicze do Ciebie. Nie musisz martwić się o nich. Ale ogólnie, tak, że będziesz być. o pliki gotowe. STUDENT: Więc kiedy statek biblioteki, czy tylko wysyła . hi. o? Nie wysyłamy. C lub. S.. JASON Hirschhorn: Tak - i to jest w tym krótkim, jak również, jeśli informacja ta wydaje się pochodzić trochę szybko. Ale brakuje kompilatorów mówi o tym, jak również. Kiedy wysyłamy bibliotekę, jeśli statek . h, nagłówek pliku, te prototypy funkcji i 1-tych i 0, w to wszystko, czego potrzebujesz, aby dać. Nie musisz dać jak Funkcja działa. c plik. Ponieważ punkt poboru, lub wskazują API, punkt w tym SPL, przenośna biblioteka Stanford, to , aby nie martwić się, jak nowy GRect działa, albo jak przenieść utwory, lub jak dodać utwory. Wszystko, co musisz wiedzieć, jest to, że dodatek Jest to funkcja, że ​​można używać, i to robi. Tak naprawdę nie trzeba wiedzieć, jak jest napisany w C. Trzeba tylko Wiesz, tutaj są funkcje, co zrobić, a tu są 1 i 0 jeśli naprawdę chcesz ich używać. Fajne. Więcej pytań na temat kompilatorów lub inne tematy na forum? Student: Mam pytanie, realizacji funkcji rekurencyjnych. Pytanie o rekursji. Miałem wrażenie, że przyjdzie się. Więc szybko przejść rekurencja w specyficzny Na przykład, funkcje silni. Ze względu na to, że Przykład często pojawia się lub jest stosowany do zilustrowania rekursji. Tak więc "4!" odczytywany jest jako 4 silnia. I co 4 silnia oznacza? Co to robić? Jak obliczyć 4 silni? 4 razy 3 razy 2 razy 1. Więc inny sposób napisać 4 silnia jest to napisać. 4 razy 3 silnia. Ponieważ 3 silnia jest 3 razy 2 razy 1. Więc 4 razy 3 silnia jest 4 razy 3 razy 2 razy 1. To dlatego jest świetnym silnia Kandydat na rekursji, ponieważ jest to jasne, że istnieje coś, co dzieje się w kółko i na na mniejsza ilość rzeczy do czasu dojdziesz do końca. Po dotarciu 1, 1 silnia jest 1. Nie można pójść znacznie dalej. 0 silnia jest również określone jako 1. Więc kiedy się na 1 lub 0, jesteś na końcu, i można zaczynają iść w górę. Więc jeśli chcemy napisać rekurencyjną Funkcja do obliczenia silni, mamy zamiar napisać jakiś pseudokod na to teraz. Zanim dodać tę Pseudokod - Dam wam kilka minut napisać kod pseudo lub po prostu, że o tym - są dwie rzeczy, co Funkcja rekurencyjna potrzebuje. Co to są te dwie rzeczy? JACK: To musi nazywać się. JASON Hirschhorn: Noah? Och, Jack. Śmiało. JACK: To musi nazywać się. JASON Hirschhorn: Tak rekurencyjne Funkcja wymaga wywołania rekurencyjnego, dzwonić do siebie. To jeden. A co innego jest? JACK: wariant podstawowy. JASON Hirschhorn: wariant podstawowy. Wariant podstawowy jest, tutaj jest, kiedy przestać. Więc funkcja jest wywoływana. Baza jest pierwszy przypadek. Chcesz wiedzieć, czy jesteś na koniec. A jeśli nie jesteś na końcu, ty dokonać wywołanie rekurencyjne. I przejść przez tę funkcję ponownie, jeszcze raz sprawdzić sprawę podstawową. Jeśli nie jesteś do końca, można dokonać kolejny wywołanie rekurencyjne, et cetera, et cetera. Dlatego funkcje rekurencyjne zawsze trzeba te podstawowe i te sprawy wywołania rekurencyjne. Jeśli nie masz wywołanie rekurencyjne, to nie byłoby rekurencyjna funkcja. Jeśli nie masz sprawę podstawową, chcesz iść na wieki nie byłoby zakończenie. I wariant podstawowy jest zawsze najważniejsze, bo zawsze będziesz chciał sprawdzić jeśli jesteś na końcu pierwszy. Zanim więc zrobić Pseudokod, dlaczego Czy nie warto pomyśleć o minutę jak rekurencyjna funkcja silnia będzie napisane? Ponadto, aż robisz, pisanie to na kartce papieru jest co masz zamiar mieć do zrobić na quizie jutro. Więc chyba dobra praktyka, aby pewien kod piszesz w dół na kartce papieru - czy można to zrobić. Wiesz gdzie średniki są. Pamiętacie składni. Ponieważ nie jesteś w stanie mieć kompilator powiedzieć, popełnił błąd. Również w tym kierunku, jutro, kiedy masz kodowanie problemy, jeśli są rzucili się na czas, lub jeśli jesteś bardzo mylić, jak masz się napisać konkretnej rzeczy w C, nie wypada Ci napisać pseudokod lub napisz komentarz jako dobrze. Bo jest kredyt na częściowe Wiele pytań na quiz. Więc może być pośpiechu, lub może po prostu mylić. Pisać w komentarzach lub pseudo-kodzie często są sposoby, które mogą uzyskać częściową kredyt. Więc nie zostawiaj coś puste w quizie. Nie ma kary za oddanie rzeczy w. W rzeczywistości wprowadzenie kodu lub pseudo- komentarze pomoże równiarka dowiedzieć się, czy rzeczywiście wie, co mówisz, a może nagrodę Ci niektóre częściowo kredyt na to. Także w tym kierunku, czytelnie. Jeśli nie możemy naprawdę to, co piszesz, nie będziemy do ciebie dzwonić o północy jutro do figury z tego, co napisał. Jesteśmy po prostu się do startu punktów. Napisz jasno więc możemy usłyszeć, a raczej możemy przeczytać to, co napisał. A jeśli mówi dwa zdania, nie dodać pkt. Postępuj zgodnie z instrukcjami. Napisz jasno. I pisać w tych komentarzach lub pseudokod na pytania, które mogłyby Nagroda częściowe kredytowej. OK, chodźmy do silni. Mamy więc funkcję silni. Gdybym rzeczywiście napisać to w C, to, co jest potrzebne, aby umieścić przed nazwą funkcji? Zwracany typ, który w tym przypadku, damy mu int. A następnie wewnątrz nawiasów klamrowych, jest to, co dzieje się wewnątrz nawiasów klamrowych dla funkcji? STUDENCI: typ argumentu. JASON Hirschhorn: Jego argumenty. Prawdopodobnie będzie tak silnia jeden z argumentów. To będzie prawdopodobnie tylko jeden argument. I powiemy to zajmie całkowitą nazwie X. I znów, pisząc prototyp Funkcja lub pisania funkcji w kodzie przed zdefiniowaniem, ci Napisać typ danych i nazwę że zmienna tylko dla tej funkcji. Więc można przejść do tego jakiś numer funkcji, to będzie dalej x. wewnętrznie. Mamy funkcję silni. Potrzebujemy dwóch rzeczy, sprawy bazowej i wywołanie rekurencyjne. Co to jest przypadek bazowy dla silnia? Ktoś, kto napisał to i który nie ma jeszcze mówił, co jest podstawą przypadku silni? STUDENT: Jeśli n jest mniejsza niż 2, powrót 1. JASON Hirschhorn: Jeśli n jest mniej niż 2, z powrotem 1. Podoba mi się to, bo to dba o 0 i 1. Więc zrobimy x <2, powrót 1. Jeśli przejdzie 0, jeśli mamy przeszedł 1, funkcja ta natychmiast zwraca 1. Jeśli przejdzie pewną liczbę większą niż lub równy 2, będziemy Posiadamy wywołanie rekurencyjne. I tak, jak jest, że będzie działać? Czy ktoś, kto pracował nad tym który jeszcze nie mówi mi wywołanie rekurencyjne dla tej funkcji w Pseudokod? Jeśli przejdzie w numerze x. i jest większe niż 2, co chcemy zrobić? Mamy też przykład napisany boczne, które mogą dać wskazówkę. STUDENT: Call x razy silnia x minus 1? JASON Hirschhorn: Dokładnie tak. Mamy zamiar wrócić x razy silnia x minus 1. I, że choć napisałem do góry, w zasadzie to, co pan powiedział w języku angielskim, Funkcja ta silnia będzie się nazywa ponownie. To będzie wykonać na x minus 1. To będzie powrót z jakimś liczby całkowitej, i to te dwa będzie pomnożyć razem, i że wartość będzie wrócił do tego, co nazywa się Funkcja silnia, które mogą być inny przykład Funkcja ta silnia. Tak, że jest przykładem rekursywnego funkcja, bardzo prosta funkcja rekurencyjna. Ale większość z nich nie będzie w ten sposób. Jeśli chcesz dobrą Cykliczne wyzwanie dla quizu, spróbuj kodowania wyszukiwanie binarne rekurencyjnie. Bo jeśli nie binarnego wyszukiwania dla Problem ustawić trzy, to prawdopodobnie nie jest iteracyjnie w pętli while. Ale to może być również zapisane rekurencyjnie. Będziesz musiał napisać własny oddzielna funkcja, która wykonuje pewne różne argumenty wiersza polecenia - lub nie argumenty wiersza polecenia, niektóre tylko regularne różne argumenty. Ale można napisać wyszukiwanie binarne rekurencyjnie, jak również. STUDENT: Więc może również napisane, zamiast X minus 1, to mogło również napisane X minus minus, lub można mieć napisane minus minus x. Może po prostu wyjaśnić, dlaczego bardzo szybko te będą różne rzeczy, jak to, co jest różnica między x minus minus i minus minus x? JASON Hirschhorn: Nie, nie jestem pójdzie na to. Ale będę z tobą rozmawiać o tym po klasa. x minus minus minus minus x zmniejszyć X o 1. Ale robią to nieco inaczej. Ale ja nie chcę iść do tego. Inne pytania o rekursji czy ta funkcja? To naprawdę nie jest nawet pseudokod. To jest w zasadzie kod C można zapisać do tego. OK, żadnych innych pytań ten temat tutaj? Tak. Student: Mam szybki przegląd zmiennoprzecinkowych i precyzja. JASON Hirschhorn: Floating punkt i precyzja. Czy ktoś naprawdę szybko daj mi wybiegu zmiennoprzecinkowych i precyzja? Wszyscy mieli to zrobić dla swojego ustawić problemu, więc nic ci nie z nim zapoznać. A może nie wszyscy. Ktoś? Daj mi zaczął miejsce. Zmiennoprzecinkowych i precyzja. W czym problem? Tak. Wiktoria? VANESSA: Vanessa. JASON Hirschhorn: Vanessa. Przepraszam. VANESSA: Jest tylko skończona liczba wartości, które mogą być reprezentowane bo jesteś na, w naszym przypadku systemu 32-bit. Więc niby trzeba uzupełnić niektóre numery. JASON Hirschhorn: Więc to jest Dokładnie tak. Istnieje tylko pewna ilość numery, które mogą być reprezentowane. Jeśli pomnożymy dwa bardzo duże liczby, może przelać kwotę miejsc masz do reprezentowania całkowita. Dlatego czasami używamy długo, długo, zamiast int. Że ma więcej miejsca. Który może pomieścić większą liczbę. Zmiennoprzecinkowa precyzja ma do czynienia z , ale również ma do czynienia z Fakt, że są liczby dziesiętne nie zawsze reprezentowane. Przepraszam. Ujmę to w górę. Liczbę dziesiętną 1.0 nie zawsze jest reprezentowane jak ty się spodziewać, 1,000000000. Czasami jest reprezentowane 1,000000001 lub 0,999999999. Może to być nawet 89 rzucony gdzieś tam. Więc te liczby po przecinku nie są reprezentowane dokładnie, jak chcesz spodziewamy się, że być reprezentowane. Więc w błąd set - było to dwa? - Problem ustawić dwa, gdzie mieliśmy do czynienia z liczb zmiennoprzecinkowych, kiedy chcieliśmy je reprezentować dokładnie to, co chcieliśmy im oznaczają liczbę groszy lub liczbę centów, mnożymy je przez 100. Minęliśmy ich. A potem odciął wszystko za przecinku. To było w celu zapewnienia, że ​​byłoby faktycznie równa dokładnie to, co chcieliśmy im dorównać. Bo jeśli wziąć coś, co jest unosić i przekształcić go w int, można odciąć wszystko w prawo przecinkiem. Ponieważ istnieje jakiś zmiennoprzecinkowe brak precyzji, 100.000 może być reprezentowane 99,999999999. A jeśli po prostu odciąć wszystko prawo od razu, będziesz dostać zły numer. Tak. STUDENT: Miałem pytanie o odlewy. Jakiej kolejności ma to nastąpić w? Jeśli chcesz zrobić pływak, wsporniki, 1 podzielona przez 10, to robi 1 podzielone przez 10, następnie uzyskać 0,1, a następnie skręcić to do pływaka? JASON Hirschhorn: Jeśli nie unosić 1 podzielone przez 10 - Uczeń: Tak, i to jest równe - dobrze, że będzie normalnie mają to równa się - Tak. Chcesz, aby to pływak, prawda? JASON Hirschhorn: OK, więc mamy zamiar używać, aby przechodzić w zastanawianie się, odpowiedzi na te pytania poprzez kodowanie. Bo prawdopodobnie będziesz mieć dużo te pytania minute i dobry sposób je rozwiązać to poprzez kodowanie. Więc idziemy do kodu to teraz, a następnie będziemy wracać i kod na pytanie trzeba było. Tak więc pierwsza linia - I nie powinno to napisać - to, co jest Pierwszą rzeczą, którą chcesz zrobić, gdy otworzyć nowy plik w gedit? STUDENT: Dołącz. JASON Hirschhorn: Uwzględnij co? STUDENT: Biblioteka CS50. JASON Hirschhorn: OK. Co jeszcze powinniśmy uwzględnić? Jesteśmy po prostu się, by sprawdzić, co się dzieje kiedy rzucił coś do pływaka. Ale to, co jest nam potrzebny do włączenia, jeśli jesteśmy zamiar napisać program w C? STUDENT: Standard I / O. JASON Hirschhorn: stdio.h. Właściwie nie trzeba, za to Program, cs50.h, mimo że jest zawsze pomocny, aby umieścić go. Ale nie zawsze trzeba stdio.h. STUDENT: Podczas kodowania w C? JASON Hirschhorn: Podczas kodowania w C. Więc zapisać go jako tego. C pliku. Mam jakieś fajne podświetlanie składni. Napisałem pustkę wewnątrz Głównym. Co void oznacza? STUDENT: nie bierze Argumenty wiersza polecenia. JASON Hirschhorn: brak środków, w tym przypadku, głównym nie ponosi Argumenty wiersza polecenia. W innych przypadkach oznacza to, że funkcja nie bierze argumenty wiersza poleceń. Lub funkcji, gdybym miał napisać pustkę main (void), które mówią Main nie zwraca nic. Więc nieważne po prostu nic nie znaczy. Co chciałbym napisać, gdybym przyjmują argumenty wiersza polecenia? STUDENT: int c łańcuch łuk łuk v. JASON Hirschhorn: int argc argv ciąg. Czy to prawda? Student: To char wsporniki gwiazda ARGV. JASON Hirschhorn: Więc można napisać Ciąg ARGV lub wsporniki gwiazda char argv wsporniki, ale trzeba wsporniki. Ponieważ argv jest tablicą ciągów, pamiętam. To nie jest tylko jeden ciąg. Więc ciąg argv jest, tu jest jeden ciąg nazywany argv. Uchwyty ARGV ciąg jest, tu jest Tablica ciągów znaków. Tak int ciąg ARGV wsporniki argc byłoby coś, co prawdopodobnie napisać. Więc chciał zapisać w postaci liczby całkowitej? Student: Tak, liczba całkowita. Lub w obrocie. JASON Hirschhorn: W pacy? Jak pływak x wynosi 1 podzielone przez 10. JASON Hirschhorn: OK. Jak mogę wydrukować pływaka w printf? Co? STUDENT:% f. JASON Hirschhorn:% f. Co jest liczbą całkowitą? d lub i. Co to jest ciąg? STUDENT: s. JASON Hirschhorn: s. Jak uzyskać nową linię? STUDENT: Backslash n. JASON Hirschhorn: Co mogę wrócić jeśli główne działa prawidłowo? STUDENT: 0. Muszę napisać, że wiersz, chociaż? Student: Nie. OK, nie będziemy pisać, a potem. Czy każdy może przeczytać, że? Wygląda to trochę małe. Czy każdy może zobaczyć, czy powinien I sprawiają, że większy? Myślę, że do kamery, zrobimy jest nieco większy, choć. JASON Hirschhorn: Jeżeli chcę, aby włączyć tę . C plik do pliku wykonywalnego, co mam napisać? STUDENT: zrobić test. JASON Hirschhorn: Przepraszam? STUDENT: zrobić test. JASON Hirschhorn: Zrób test. Rozmawialiśmy o linia ta wcześniej. Dzyń. Co jest brzęk? Nazwa kompilatora. Co to za linia? STUDENT: Ustawia go do użytku GDB. JASON Hirschhorn: Zestawy to się do stosowania GDB. Linia ta, co to jest? STUDENT: Kod źródłowy. JASON Hirschhorn: To plik źródłowy. c plik. Co te dwie linie zrobić? Czy te dwa nie linie. STUDENT: nazwy? Go przetestować. JASON Hirschhorn: Tak kreska o mówi nazwać to coś inaczej. I tu dzwonisz to badanie. Jeśli nie mam, że w, co by było nazwać to? STUDENT: a.out. JASON Hirschhorn: a.out. Co to zrobić? STUDENT: Linki biblioteki matematycznej. JASON Hirschhorn: Łączy w bibliotece matematycznej. Nie zawiera bibliotekę matematyczną, ale ponieważ to jest tak powszechne, że już napisana marka zawsze obejmują biblioteka matematyczna. I podobnie, obejmuje Biblioteka CS50. OK, więc jeśli mamy listę, mamy teraz wykonywalny o nazwie Test. Aby go wykonać, piszę test. Widzę, że moja zmiennoprzecinkowych, zgodnie z oczekiwaniami, jest równa 0. Czy to - SO - Uczeń: Zatem jeśli umieścić unosić się, jak oddasz go jako pływaka - JASON Hirschhorn: Obsada 1 do pływaka? Student: Nie, rzucać pełne rzeczy - tak. Jeśli tylko to zrobił, byłoby które sprawiają, że 0.1? JASON Hirschhorn: OK, więc bardzo szybko, 1 podzielone przez 10, są to liczby całkowite są podzielone. Więc po podzieleniu liczby całkowite, są 0, i ratujesz że 0 w unosić, ponieważ znak jest tylko całkowitą podział. Więc teraz mamy coś toczenia w obrocie. Zobaczmy, co się dzieje. Zrobimy test. Teraz widzimy, że to nie był ukośnik Podział całkowitą, unosiła Podział punkt. Ponieważ jeden z jej argumentów został oddany do pływaka. Więc teraz to mówił, traktują to Podział na to, że mamy do czynienia z punktów pływające, nie z liczb całkowitych. I tak otrzymujemy odpowiedź oczekujemy. Zobaczmy, co się dzieje - Ups. Gdybym chciał wydrukować więcej dziesiętny miejsc, jak mogę to zrobić? STUDENT: Punkt punkt f, lub jak wielu miejsc po przecinku, jak chcesz. JASON Hirschhorn: Więc drukować 10 miejsc po przecinku. I widzimy teraz jesteśmy coraz jakieś dziwne rzeczy. I że wraca do pytania o zmiennoprzecinkowych niedokładności. Nie dziwne rzeczy przechowywane w tutaj. OK, nie, że odpowiedź na pytanie? Co jeszcze chcesz szybko kodować? STUDENT: Chciałem tylko zobaczyć, czy nie, jeśli uwolnione jakiś wskaźnik, czy ten wskaźnik jeszcze przechowywane w to adres, co to było wskazując wcześniej. JASON Hirschhorn: OK, tak, zróbmy to. Char gwiazda PTR, ten tworzy zmienną nazywa PTR typu char gwiazdy. Jak napisać malloc? Alden? ALDEN: Tylko malloc. Ale to musi być rozmiar i w tym przypadku, myślę, że można by być skierowane do char. Więc byłoby char. JASON Hirschhorn: OK, więc więcej ogólnie, Wewnątrz - niech edytować. Wewnątrz malloc, chcesz numer bajtów na stercie. Ogólnie rzecz biorąc, to, co widzieliśmy, że jesteśmy robi to jedziemy do malloc łańcuchy, na przykład, lub tablice liczb całkowitych. Więc jeśli chcemy 10 lub 10 liczb całkowitych znaków, 10 da nam 10. A następnie wielkość znaków dałoby nam, że wielkość znaków, które w W tym przypadku jest 1 bajt. Dostajemy 10 bajtów. Gdybyśmy mieli napisać rozmiar int, że da nam 40 bajtów. Tak bardziej ogólnie, wewnątrz malloc jest liczba bajtów chcesz. W tym przypadku dostajemy 1 bajt. Który wydaje się dziwne użytku malloc, ale dla naszych celów ma sens. Więc nie jest to. Mamy zamiar zadzwonić za darmo. My się go pozbyć, a my ponownie użyć ptr. I co chcesz sprawdzić? STUDENT: Chciałem tylko sprawdzić, czy czy nie było coś w jej wnętrzu. JASON Hirschhorn: Więc, czy Wskazał on na nic? Student: Tak, dokładnie, czy nadal miał adres pamięci. JASON Hirschhorn: Więc chcesz sprawdzić wartość ptr? Student: Tak, dokładnie. JASON Hirschhorn: Co mam pisać tutaj jeśli chcę, aby sprawdzić wartość punkt - to, co jest, Jordania powiedział, wartość? Albo, co jest przechowywane wewnątrz ptr? STUDENT: adres pamięci. JASON Hirschhorn: adres pamięci. Więc jeśli piszę po prostu to, że będziesz daj mi wartość ptr. I jak mogę wydrukować adres pamięci? Co znajduje się ciąg formatu na adres w pamięci? STUDENT:% s.. JASON Hirschhorn:% s.. % S jest ciągiem. % P do wskaźnika. Czy to prawda? To jest prawda. Więc ptr jest równe - nadal ma coś w nim. Jest to prawdopodobnie więcej ciekawe pytanie. Co oznacza, że ​​linia zrobić? STUDENT: błędy Seg. JASON Hirschhorn: Co? Student: Myślę, że seg usterek. JASON Hirschhorn: Hm? Student: Myślę, że będzie to seg winy. JASON Hirschhorn: Więc ta linia kodu, gwiazdy ptr, co ma gwiazdki oznaczają? STUDENT: Zawartość. JASON Hirschhorn: Tak. Idź do uzyskania zawartości. Tak to się dzieje, aby przejść do pamięci zająć tam i daj mi to. Kiedyś% c tutaj, ponieważ nie są znaki tam przechowywane. Więc mamy zamiar udać się do tego adresu my Właśnie widziałem - czy będzie nim to trochę inaczej razem możemy uruchomić program. Ale pójdziemy na ten adres których wiemy jeszcze istnieje i zobaczyć, co tam jest. Więc nie seg winy. To po prostu nie dają nam nic. To może rzeczywiście daje nam coś, po prostu nie może go zobaczyć. I że wraca do tego pomysłu - i nie będziemy się zbyt dużo do tego, bo to jest poza zakres tego kursu. Ale rozmawialiśmy o tutaj, jeśli wykraczał poza granice tablicy przez 1, nie mogą mieć kłopoty. Czasami, kiedy po prostu przejść się przez 1, robisz coś złego, a ty może mieć kłopoty. Ale nie zawsze się w kłopoty. To zależy od tego, ile coś złego ci nie, będziesz miał kłopoty. Co nie znaczy, być spokojnym z kodem. Ale to znaczy nie nastąpi zawsze zamknąć, nawet jeśli gdzieś nie powinieneś się udać. Dobrym przykładem, że jest wiele osób w ich problemu ustaw 3, która był 15, nie sprawdzałem Granice pokładzie. Więc spojrzał w lewo, spojrzał na prawo, spojrzał do góry, spojrzał do dołu. Ale nie sprawdzić, czy górna faktycznie będzie na pokładzie. I wielu ludzi, którzy zrobili to i okazało, że w ich programie pracował doskonale, bo gdzie rada była przechowywane w pamięci, jeśli poszedł jeden nad nim i sprawdziła, że ​​pamięć adres, nie było nic szczególnie strasznego, więc program nie był będzie krzyczeć na ciebie. Ale my wciąż zdjąć punkty, jeśli można sprawdzić, że nie, bo robią coś, czego nie byli robić, i można mieć dostał się w kłopoty. Szanse są, choć pewnie nie. Tak to jest, aby pokazać, że tak, nadal możemy pójść do niej. I nie dostaniesz w Kłopot w tym przypadku. Jeśli będziemy próbowali zrobić czytaj Kolejne 100 znaków, my Prawdopodobnie miał kłopoty. I można kodować czytanie kolejnych 100 znaków, jeśli chcesz, wykonując niektóre rodzaj pętli. Tak. Student: Ponieważ dostaliśmy, że wartości rzeczywistej przestrzeni, nie byłoby rzeczywiście być w stanie zobaczyć niczego. Powinniśmy spróbować z ustawieniem, które równa jak C czy coś? JASON Hirschhorn: Wielki znak zapytania. Jak ustawić tę wartość - co linia kodu napisać na linii siedem do tego, co pan powiedział? STUDENT: Star ptr jest równe wolny cytat c końca pojedynczego cudzysłowu. JASON Hirschhorn: Tak, że wkłada charakter, c, w tym miejscu, bo raz, że gwiazda Oznacza iść tam. I stosowane po stronie lewej operator przypisania, który wynosi podpisać, nie dostaniesz, że Wartość tyle ustawić tę wartość. Teraz zobaczmy, co się stanie. Kładziemy tam coś i tam. Zadzwoniliśmy darmo. Niektóre rzeczy pewnie się na stercie. Więc to nie jest już tam. Ale znowu, nie dostaniesz w kłopoty tam. Ja tego robić w kodzie, aby zilustrować że wiele z tych pytania, które masz, są bardzo ciekawe odpowiedzi dużo czasu. I są naprawdę dobre pytania. I można dowiedzieć się na ich własne, jeśli, na przykład, nie jesteśmy w sekcji. Tak. STUDENT: Bo nie wysyłasz pointer w dowolnym miejscu, nie trzeba używać malloc? JASON Hirschhorn: Więc to wraca do początkowego pytania. [? ?] Jest to po prostu zmienna lokalna? Malloc tutaj nie jest przekonujące. Korzystanie z malloc nie jest tu że przekonujące, bo to tylko zmienna lokalna. STUDENT: Więc można zrobić char gwiazda ptr jest równe komentarzy JASON Hirschhorn: Och. Więc mamy zamiar teraz wrócić do początkowego pytania. Myślę, że nie zostały spełnione z mojej odpowiedzi. OK? Tak? Uczeń: Tak. Czekać. JASON Hirschhorn: A gdzie chcesz wydrukować? Będziemy więc wydrukować ciąg takiego? STUDENT: Ciekawe. JASON Hirschhorn: Więc to mówi, że to argument typ charakteru. Tak to powinno być znaków. STUDENT: Tylko bierze pierwszy. JASON Hirschhorn: Więc to jest to, co powiedziałem wcześniej. Tak jak powiedziałem, to nie jest przechowywanie ciąg wewnątrz zmiennej wskaźnika. To przechowywania - STUDENT: pierwsza wartość łańcucha. JASON Hirschhorn: adres Pierwsza wartość ciągu. Gdybyśmy mieli wydrukować to, że jesteśmy uzyskanie wartości wewnątrz wskaźnika. I zobaczymy, to jest, rzeczywiście, adres pamięci. Czy to ma sens? Przepraszam. Zaraz, czy to odpowiedź na swoje pytanie, choć? Uczeń: Tak. JASON Hirschhorn: Ten wiersz kodu tworząc ciąg i potem kolejny Zmienna wskazuje wskaźnik, który jest do tego ciągu, że tablica. Tak. Student: Zatem jeśli byliśmy jedną pamięć adres dalej, chcielibyśmy dostać h? Został on zapisany jako ciąg? JASON Hirschhorn: Jak, my - tak, to jest cenne, aby zrobić. To jest punkt arytmetyczne, które wy nie widział i powinien być stosunkowo komfortowo. To jest podobne do pisania - gdybyśmy mieli do napisania tego wiersza kodu, widzieliśmy notacji tablicy przed. To powinno dać nam drugą Wartość w tej tablicy, godz. Jeśli zrobiliśmy to, to powinna również nam druga wartość w tej tablicy. Ponieważ nie jest on będzie do pamięci adres z pierwszych rzeczy, ale adres pamięci z jednej rzeczy na. A potem dereferences operator gwiazdki że wskaźnik. I znowu, zobaczmy. Ponownie uzyskać godz. Student: Co dokładnie robi nieprawidłowego oznacza? JASON Hirschhorn: Dereferencjuj jest wyszukane słowo udać. Idź do tego i dostać to, co tam jest jest do nieprawidłowego wskaźnika. To tylko wyobraźnia słowo na to. STUDENT: Gdybyśmy chcieli druku cały ciąg, możemy zrobić ampersand wskaźnik? JASON Hirschhorn: OK, jesteśmy zamiar wstrzymać się tutaj. Jesteśmy tu skończy. Ampersand daje adres lokalizacja, więc kiedy nie ampersanda z zmienna, to daje adres w przypadku, gdy zmienna jest przechowywana. Ampersand wskaźnik daje adres ptr gdzie ptr jest w pamięci. Nie zamierzamy iść na z tego przykładu. Możesz dowiedzieć się, te rzeczy na własną rękę. Ale znowu, to może być nawet na pograniczu nieco poza to, co trzeba wiedzieć o Zakres tej połowie okresu - lub tego quizu, raczej. Przepraszam. Mamy zamiar przejść, bo chciałbym jak zrobić jeden kodowania problemu zanim czas się skończy. I będziemy kodować co myślę Jest najbardziej atrakcyjne z tych przykłady, atoi. Więc to było pytanie na Quiz dwa lata temu. I mam go na pokładzie tutaj. Ludzie zadano w quizie - zostały one podane w trochę więcej tesxt pytanie, ale wyeliminowany tekst, ponieważ nie jest konieczne dla naszych celów teraz. To był tylko niektóre tła na co atoi zrobił. Ale wszyscy wiemy i są bardzo zaznajomieni z atoi. Proponuję ten kod na arkuszu papieru. Proponuję także użyć strategii że mamy już ponad Wiele w naszej sekcji. Po pierwsze, upewnij się, że rozumiesz co atoi robi. Narysować obrazek lub wymyślić jakiś wyobrażenie o tym w twojej głowie. Następnie napisać Pseudokod do tego. W quizie, jeśli wszystko masz jest pseudokod, przynajmniej umieścić coś w dół. A następnie na mapie tego Pseudokod C. Jeśli masz zaewidencjonować pseudokod, jak sprawdzić, czy coś jest 1, że jeśli mapy na stan i tak dalej. I wreszcie, kod programu w C Więc wrócić do atoi i trwać pięć minut kodować to na kartce Papier, który jest prawdopodobnie o Czas, byś się na quiz atoi kodu. Pięć do 15 minut, od pięciu do 12, pięć do Ciągu 10 minut o wysokości czasu chcesz poświęcić na to pytanie w quizie. Tak trwać pięć minut teraz, proszę. A jeśli masz jakiekolwiek pytania, podnieść Twoja ręka i będę się wokół. [ROZMOWY SIDE] JASON Hirschhorn: OK, więc To było pięć minut. To był prawdopodobnie o kwoty czasu chcesz poświęcić na które na quizie, może niski koniec tego czasu. Będziemy podsumować w kawałku. Zacznijmy kodowanie to. A jeśli nie mamy całą drogę, Odpowiedzi na to i to Quiz pytanie są dostępne, znowu, Jesień 2011, kiedy to pytanie jest pojawił się w quizie. I warto było osiem punktów w quizie wtedy. Osiem punktów jest na wysokim koniec ilość punktów coś jest warte. Większość pytań znajdują się w zakresie od jednego do sześciu punktach. Więc to jest trudniejsze pytanie, na pewno. Czy ktoś może zaczynaj? Generalnie, co będziemy chce z tym zrobić funkcjonować atoi, logicznie? Co chcemy zrobić? Więc mamy zamiar napisać niektóre pseudokod. STUDENT: Konwersja znaków do liczb całkowitych. JASON Hirschhorn: Konwersja znaków do liczb całkowitych. OK. Więc ile znaków jesteśmy będzie trzeba przejść przez? STUDENT: Wszystkie. STUDENT: Wszystkie postacie w ciąg. JASON Hirschhorn: Wszystkie znaków w ciągu. Więc jeśli chcemy przejść przez każdy znaków w ciągu, co jest rzeczą w C, widzieliśmy, że pozwoliła nam przejść przez każdy znaków w ciągu znaków? STUDENCI: na pętli. JASON Hirschhorn: na pętli. Więc idziemy do pętli Każda postać w s.. To co będziemy chcieli zrobić gdy mamy szczególny charakter? Powiedzieć, że jesteśmy coraz uchwalił 90. Dostajemy 9. To jest znak. Co chcemy zrobić z że znak 9? STUDENT: Odejmij to od charakteru 0? STUDENT: Dodaj 0? JASON Hirschhorn: Odejmij to od charakteru 0? Uczeń: Tak. JASON Hirschhorn: Dlaczego chcesz to zrobić? STUDENT: [niesłyszalne] wartość. Jego wartość int. JASON Hirschhorn: OK, więc bierzemy znak 9, odjąć go od znak 0, aby uzyskać rzeczywista całkowita 9. Słodkie. A skąd wiesz, że charakter 9 minus 0 znaków jest 9? Co wykres nie obejrzysz? Student: Nie logicznie dziewięć miejsca od 9 do 0. Lub można spojrzeć na tabelę ASCII. JASON Hirschhorn: tabela ASCII. Ale tak, masz również prawidłowe. Więc odjąć 0. Więc teraz mamy całkowitą 9. I co chcemy zrobić z tym? Jeśli mamy 90, to pierwsza liczba całkowita mamy, co chcemy zrobić? STUDENT: Chciałbym umieścić w tymczasowym całkowitą tablicy, a następnie zrobić do niej matematyki później zrobić to do końca. JASON Hirschhorn: OK. STUDENT: Możesz zacząć pod koniec tablicy, a następnie iść do przodu tak że za każdym razem iść do przodu, można pomnożyć przez 10.. JASON Hirschhorn: OK. To brzmi jak dość przekonujące pomysł. Możemy rozpocząć pod koniec naszej tablicy, i możemy używać strleng. Możemy użyć strleng tutaj. Dostaniemy długość naszego łańcucha. Zaczynamy w końcu. I + pierwszy z nich, po prostu przyjąć, że całkowitą, a może stworzymy jak Nowa zmienna całkowita się góry, gdzie mamy do przechowywania wszystkiego. Więc pętli każdego char w s od z powrotem do przodu, odjąć 0, a Następnie bierzemy go, w zależności od gdzie to jest, że to mnożenie o mocy 10. Ponieważ pierwszy, co my znak po prawej stronie, należy pomnożyć przez? STUDENT: 10 do 0. JASON Hirschhorn: 10 do 0. Co drugi mnożymy Skrajny prawy znak po? STUDENT: [niesłyszalne]. JASON Hirschhorn: Co? STUDENT: 10 do 1. JASON Hirschhorn: 10 do 1. Skrajny prawy trzecich charakter? STUDENT: 10 do 2. JASON Hirschhorn: 10 do 2. STUDENT: Przykro mi, ale nie rozumiem co my tu robimy. JASON Hirschhorn: OK, wróćmy więc. Więc dostaniesz podjęta w ciągu. Bo piszemy atoi. Więc przejdzie w ciągu. Powiedzieć, że jesteśmy coraz przeszedł w ciągu 90. Pierwszą rzeczą, którą mamy zamiar zrobić, to ustawić Nowa zmienna całkowita, że ​​jesteśmy po prostu się do tworzenia w naszej nowej liczby całkowitej. To, co mamy zamiar powrót na końcu. Musimy przejść przez każdy znak w ciąg, ponieważ stwierdziliśmy że musimy dotknąć każdego i następnie dodać go do naszej nowej liczby całkowitej. Ale nie możemy po prostu dodać je jako liczby. Nie możemy po prostu wziąć 9 i dodać 9 do naszej liczby całkowitej. To zależy od tego, jakie miejsce to jest w ciągu. Zamierzamy trzeba pomnożyć to przez moc 10. Bo to, jak działa baza 10. Więc mamy zamiar uzyskać rzeczywisty znaków, liczba całkowita lub rzeczywista liczba, przez odjęcie charakter 0 od charakteru 9 jak zrobiliśmy z odjęcie znaków kapitałowych, z niezależnie od charakteru mieliśmy w jednym z tych problemów. Więc my faktycznie uzyskać numer od 0 do 9 zapisany jako liczba rzeczywista, a my pomnożyć przez potęgi 10, w zależności gdzie jesteśmy w ciąg. A potem będziemy dodawać je z powrotem w naszej nowej zmiennej całkowitej. Więc co to wygląda jak by być - będziemy rysować tutaj. Jeśli przejdzie w ciągu 90 - STUDENT: [niesłyszalne]. JASON Hirschhorn: Ale atoi przyjmuje ciąg. Więc mamy zamiar przejść przez gospodarstwo. Będziemy przejdzie w 90. Zaczynamy od tyłu do przodu. Bierzemy 0. Student: Przepraszam. Może to jest głupie. Jeśli jesteśmy coraz podjęta w ciągu, dlaczego jest 90, co mamy uzyskiwanie przekazany? Ponieważ 90 jest liczbą całkowitą. JASON Hirschhorn: Ponieważ atoi trwa łańcuch i włącza go do liczby całkowitej reprezentacja tego łańcucha. Ale ciąg 90 nie jest liczbą całkowitą 90 lub 90 Numer. Ciąg 90 jest tablicą dwóch, lub trzy znaki, a raczej 9 charakter, 0 postaci, a odwrotny ukośnik 0 znaków. I piszemy atoi, ponieważ dla Na przykład, jeśli wziąć polecenia argument wiersza, i to zapisane w argv, to zapisywane jako ciąg znaków. Ale jeśli chcesz, aby traktować go jako liczby, trzeba przekonwertować go na Rzeczywista liczba całkowita. Co zrobiliśmy jednego z naszych zespołów problemowych. Co zrobiliśmy w wielu z naszych zbiorów problemowych. Każdy, kto wziął liczbę całkowitą jako argument wiersza polecenia. To dlatego nasza funkcja atoi pobiera ciąg. Więc jeszcze raz, w naszym przykładzie tutaj jesteśmy zajmie ostatni. Jedziemy do odejmowania charakter 0 z niego, ponieważ znaki 0 odejmowana znakiem 0 daje Rzeczywista ilość 0, według matematyka ASCII, co robimy. Ponieważ znaki są reprezentowane inaczej niż ich rzeczywista - znaków, na przykład małe jest 97. To nie jest - oops! To nie jest, co można się spodziewać to jest, 0, na przykład. Więc trzeba odjąć znaków, aby uzyskać 0. Więc mamy zamiar to zrobić tutaj aby uzyskać rzeczywistą liczbę. A potem będziemy pomnożyć przez moc 10 w zależności od miejsca jest w ciągu znaków, a następnie, że i dodać go do naszego właściciela lokalu zmienna więc możemy wymyślić Nasza ostateczna nowa całkowitą. Czy to ma sens dla wszystkich? Więc nie idziemy do kodu to teraz, ponieważ jesteśmy się na krótki czas. Przepraszam za timing to. Ale to jest to, co, miejmy nadzieję, byś być w stanie zrobić w quizie - w najmniej, dostać ten Pseudokod rozpisane. I wtedy, gdybyśmy mieli pisać pseudokod, w rzeczywistości, możemy to zrobić dość szybko. Każda linia komentarzach pisaliśmy tutaj przekłada się na temat jedna linia kodu C. Deklarując nową zmienną, pisanie pętla, niektóre odejmowanie, niektóre mnożenia, a niektóre zadania. My pewnie też chcą napisz przewód powrotny. Możemy również chcesz umieścić Niektóre kontrole tutaj. Tak. Uczeń: Tak więc możemy traktować y jak rzeczywisty ciąg? Bo wiem, że to tylko adres. Jak, w jaki sposób dostać się na długość Ciąg jest przepuszczany przez? JASON Hirschhorn: Więc jak długość łańcucha? Strlen. STUDENT: strlen, tak. Ale możesz umieścić s jako argument za tym? JASON Hirschhorn: Więc strlen wykonuje gwiazdę char. I to stąd, że gwiazda char, i to utrzymuje liczy aż dojdzie do odwrotny ukośnik 0. strlen faktycznie jeden z pozostałych programów my jechaliśmy kodu. To kolejny dobry do kodu. Że jeden jest trochę łatwiej, ponieważ jeśli będziesz o tym myśleć koncepcyjnie - Powiedziałem to głośno - strlen następująco wskaźnik i utrzymuje dzieje i liczenia i śledzenia, dopóki osiągniesz odwrotny ukośnik 0. STUDENT: OK, rozumiem. JASON Hirschhorn: Więc najlepiej Powodzenia w quizie 0 jutro. Jeśli masz jakieś pytania, będę na zewnątrz po tym. Zapraszam do mnie e-mail. Dotrzeć do własnego TF jeśli jesteś nie w moim dziale, lub uzyskać w moim e-mail, jeśli chcesz. Jeśli chcesz freak out i po prostu wysłać mi e-mail, e-mail freakout, będę wysłać z powrotem, jak, uśmiechniętą twarz, czy, jak, żart czy coś. Dlatego zachęcamy do zrobienia, że ​​dobrze. Powodzenia jeszcze raz, i będę zobaczyć was wszystkich w przyszłym tygodniu.