>> JASON Hirschhorn: Witamy, wszyscy, do tygodnia. 6.
Jestem szczęśliwy widząc was żyje i dobrze po Quiz 0, bo wiem, że
był nieco szorstki.
Ale na szczęście, wszyscy zrobił bardzo dobrze.
I tak, że jest wspaniały.
Jeśli jesteś w moim dziale, dałem najbardziej z Tobą swoje quizy już.
>> Kilka z was, mam spotkanie po zajęciach.
A jeśli jesteś studentem i rozszerzenie nie otrzymali quiz powrotem
Jeszcze, twój TF jest prawdopodobnie pracuje nad nim i klasyfikowania go i będzie go z powrotem
z Państwem wkrótce.
Tak więc moi studenci, którzy są przedłużające ogląda teraz - mam nadzieję, że żyje -
Dostanę swoje quizy wkrótce także.
>> Nasz program na dziś jest następujący.
Po pierwsze, mamy zamiar przejść przez niektóre zasoby, które CS50 zapewnia do Ciebie.
Zamierzamy przejść Quiz 0 następny, i Odpowiem na wszelkie pytania kogokolwiek
ma o konkretnych problemach.
A następnie, że będzie się działo w ciągu Plik I / O i problemem zestaw 5.
Te dwa ostatnie tematy odbędzie stanowią większość sekcji dzisiaj.
>> Umieścić tę listę w górę, jak w każdym tygodniu przypomnieniem dla was wszystkich, ale z rdzeniem
rozdział, mamy tylko 90 minut - mamy nie są w stanie pokryć wszystko, co
chciałbym na pokrycie dla was.
Ale mamy mnóstwo środków na Ci czerpać jak poznać
Materiał i pracy poprzez Twój problem ustawia.
>> Przypominamy, że mam w Internecie tekstu okno, ustawić się na ciebie, aby wypełnić, jeśli
masz jakieś uwagi do mnie, zarówno pozytywne jak i
konstruktywne, o sekcji.
Że adres URL znajduje się aż tutaj.
Więc proszę, poświęć chwilę, jeśli masz jakiekolwiek opinie, czy w czasie sekcji,
lub po, lub po oglądać wideo w trybie online, aby dać mi swoją opinię.
Naprawdę doceniam każdego i wszystko.
>> Więc już o małych rozmowy z wielu moich
studentów przez cały tydzień - jak przekazać Powrót quizy, mówisz
Oczywiście, widząc, jak robisz.
I jeden temat ma pochodzić nad i na mówienie o - w
szczególności -
Problem ustawia.
I mam zamknięte, że motyw na pokładzie teraz.
>> Zasadniczo, jest to różnica między obracając w coś, co jest
wykonane prawidłowo i coś że jest dobrze.
Większość ludzi robi fantastyczne pod względem poprawności -
4 lub 5 jest na wszelkie psets.
Większość ludzi są coraz wszystkich osób czasu.
>> Jednak tylko dlatego, że zrobiłeś coś w prawo nie oznacza, że ​​mam
zrobić coś tak elegancko, lub efektywnie, lub w sposób jak ty
mógł to zrobić.
I to jest to, co projekt -
oraz, w mniejszym stopniu, styl -
osie są za.
Więc ja pcha was wszystkich, i inne TF pchają chłopaki, nie tylko kolei
w rzeczy, które są prawdziwe, ale z kolei w rzeczy, które są zakodowane dobrze.
>> Nie robi niepotrzebnych pętli FOR, razie nie przeliczania zmiennych
nie musisz.
Na przykład, patrząc z powrotem do problemu ustawić 4, gdy umieszczenie cegieł na
ekran, każdy rząd - każda cegła w dany wiersz ma sama współrzędna y -
współrzędnych tej samej wysokości.
>> Tak, że współrzędna y nie muszą oblicza się w środku wnętrza
zagnieżdżonych pętli FOR, które prawdopodobnie używane umieścić te klocki na ekranie.
Musi tylko być obliczana każdego czas przełączenia wiersz, lub
przesunęła się w dół wiersz.
Tak więc stwierdzić, czy znajduje się w 10 cegły wiersz, każda cegła może mieć taki sam
współrzędna y, a współrzędna y może po prostu być obliczona
raz dla wszystkich tych.
>> Nie muszą być obliczane 10 razy, ani też, że obliczenia potrzeba
wydarzy się w rzeczywisty Wywołanie funkcji -
Nowy gracked wywołanie funkcji.
Więc jeśli to było trochę mylące dla Ci, bardziej ogólnie, rzeczy, które
nie trzeba za każdym razem się stało przejść przez pętlę, że nie powinno być
umieścić wewnątrz pętli FOR, i nie powinny stanie za każdym razem iść
przez pętlę FOR.
>> Innym dobrym przykładem projektu widzieliśmy w tygodniu 3 do 15, można zachować
utwór na zero.
Więc kiedy zainicjować płytę, ty zapisać - w zmiennej globalnej, być może -
X i Y-współrzędna zera.
A potem, kiedy tylko -
w funkcji ruchu, w dowolnym momencie dokonać udane posunięcie, zaktualizować
Położenie zerowej.
>> To by zaoszczędzić od konieczności wykonywania zagnieżdżonych pętli FOR, aby przejrzeć
wsiąść za każdym razem w funkcji ruchu i znaleźć zera, lub znaleźć płytki,
a następnie sprawdzić, co jest obok niego.
Zamiast tego masz lokalizację zero, można po prostu spojrzeć poniżej, powyżej,
i na lewo i na prawo od niego, aby znaleźć dachówka, czego szukasz.
>> Zatem w odniesieniu do programów, że przebywa pisząc, że nigdy nie jesteś wystarczająco duży
że niektóre z tych decyzji projektowych są naprawdę będzie utrudniać
Program, lub zrobić to działać wolniej, lub może nawet zabraknąć pamięci.
Ale my wciąż pcha was pisać jako elegancki i
wydajny kod, jak to możliwe.
>> Tak więc, jeśli nie kończy się pisanie rzeczy które mają znacznie większe
zakres, będą one napisane dobry Projektujemy oprócz ich prawidłowe.
Więc liczba masz przyniósł to.
To jest coś, czego szukasz - coś będziemy nadal
wcisnąć wam na.
>> Jeśli kiedykolwiek jakieś pytania dotyczące Konstrukcja programu, tutaj
aby dotrzeć do mnie, a ja jestem szczęśliwy, spacer po programie z tobą,
i wskazać niektóre z projektu decyzje dokonane, i podać kilka
sugestie na temat, aby jeszcze lepsze decyzje projektowe.
>> Więc mamy zamiar przejść aby mówić o Quiz 0.
Zanim to zrobimy, czy ktoś Wszelkie pytania dotyczące tego, co
Mam objęte do tej pory?
>> [Szelest]
>> JASON Hirschhorn: Siedem sekund.
OK.
Porozmawiajmy o Quiz 0 na trochę.
Większość z was ma swój Quiz 0 wrócił.
Jeśli nie, mam nadzieję, Pamiętasz to trochę.
Ale jeśli już podjęte Quiz 0, to również dostęp do pliku PDF online
roztwory próbek.
>> Czy ktoś ma jakieś pytania przed skaczemy do tygodniowego materiału o
Szczególnym problemem na Quiz 0 -
Dlatego odpowiedź brzmi, co to jest?
Czy ktoś zna coś?
Nawet jeśli masz problem, prawda, ale po prostu chciałby, żebym mu wyjaśnić co nieco
więcej, cieszę się, zrób to teraz.
>> Więc mam pytanie, żebyście przygotowana z niektórymi
myśli o Quiz 0.
Więc, którzy chcieliby dostać się nam Zaczęło się od pytania lub
komentarz na temat Quiz 0?
>> [PAPIER szelest]
>> JASON Hirschhorn: Nie wszyscy nie doskonale.
Więc wiem [śmiech]
muszą istnieć pewne pytania o Quiz 0.
OK.
Tak.
Ompica.
>> OMPICA: Numer 10.
>> JASON Hirschhorn: Numer 10.
Który z nich miał numer 10?
>> OMPICA: -
>> JASON Hirschhorn: I haven't -
>> OMPICA: m.in. -
>> JASON Hirschhorn: Numer 10 było osiem I - pisanie ośmiu do I?
>> OMPICA: Tak.
>> JASON Hirschhorn: OK.
Więc kolejne pytanie, można mieć zapytał był ja przewidujący?
Odpowiedź brzmi: tak.
W sekcji przed quizu, poprosiłem wy do kodu zarówno szterling i
osiem do ja.
Oba z nich stało się pojawiają się na quiz.
Więc mam nadzieję, że się zapłaciło uwagę na to.
>> A jeśli miał, to trzeba chyba się dobrze na tych dwóch.
Ale osiem do i, my nie faktycznie kod to w klasie, ale to było, znowu,
zapytał na quiz.
Tak, kilka rzeczy do podjęcia uwagę podczas kodowania ośmiu do I.
Pierwszą rzeczą, na pytanie, był że trzeba sprawdzić, czy ciąg
była równa null.
>> Kilka osób próbowało sprawdzić później w programie, jeśli ów wspornik byłem -
tak szczególnym charakterze, które string - była równa null.
Należy jednak pamiętać, że wartość null jest zasadniczo - warto pomyśleć o
null jako wskaźnik zera - wskaźnik do zera -
gdzieś w pamięci, gdzie nigdy nie można przejść.
>> Więc jeśli coś jest równe NULL, to wiem, że nie został zainicjowany,
albo nic tam nie ma.
Tak e jest gwiazdą char, y wspornik i jest char.
Więc warto porównać s. null, ale nie s uchwyt i null.
Ale znowu - tak, aby był pierwszą rzeczą, że miałeś zrobić -
upewnij się, że rzeczywiście ma prawdziwy ciąg.
>> Następnie chciał przejść przez każdy znak w ciągu.
I tak, że będzie jak wspornika ów Ja, na przykład, jeśli jest to Twój iterator.
I przyjąć, że charakter i uzyskać jego rzeczywistą wartość.
Masz to zapisane jako char, ale Wartość ASCII zera -
zera jako postać -
w rzeczywistości nie jest liczbą całkowitą od zera.
To jest jakiś inny numer, który można wyszukać w tabeli ASCII.
>> Więc jeden sposób na to, aby poprawić - prawdopodobnie najlepszym sposobem, aby skorygować
że - jest od niej odjąć Wartość znaku -
zera jako postać.
Więc minus apostrof, zero, kolejny apostrof.
Że podejmie wszelkie numer masz jako char, i zrobić to równe
liczbę całkowitą od rzeczywistej.
>> I że jest bardzo podobna do metody Wiele osób wzięło w
Problem zestaw 2, z Cezarem i Viginere -
te szyfry, kiedy obracają je.
Więc po masz go jako liczbę z zera do dziewięciu, a następnie - w zależności od
gdzie to jest w końcowym numerem - trzeba go pomnożyć
o mocy 10.
>> Niektórzy ludzie przeniesiony z powrotem do z przodu, i pomnożona jednostki
numer o mocy 10.
Niektórzy ludzie przeniesiony z od przodu do tyłu -
i tak trwało najwyższa zamówić numery pierwsze -
i by uratować tych, w zmienna globalna licznik.
, A następnie za każdym razem przez FOR pętla, pomnożyć, że globalny gigant
licznik zmiennej o 10, aby miejsca dla następnego char.
>> Więc to było trochę mylące bez mi pisania na tablicy.
Jednakże roztwór próbki jest dostępny dla Ciebie.
Ale to były wielkie rzeczy szukaliśmy.
Również sprawdzenie, aby upewnić się, że każdy indywidualny charakter rzeczywiście
postać od zera do dziewięciu, a nie inny charakter, jak A,
na przykład.
>> To były rzeczy, szukaliśmy w tej kwestii.
Czy to wyjaśniło Twoje pytanie?
>> OMPICA: Tak.
>> JASON Hirschhorn: OK.
Czy są jakieś inne pytania o Quiz 0?
Co z kompilacji?
Wszyscy kompilacji prawda?
Nie.
Było -
[Śmieje się]
Wszelkie pytania na temat Proces kompilacji?
Wow.
>> [PAPIER szelest]
>> JASON Hirschhorn: Tak.
Michael.
>> Michael: Czy numer 7 - losowo?
>> JASON Hirschhorn: Numer 7.
Numer 7 było uzyskać losową liczbę całkowitą.
Doskonała.
Więc biorąc pod uwagę liczbę całkowitą a i całkowitą b, i chcesz losowo
całkowitą między a i b.
Rzeczywiście możemy napisać ten jeden na zarządu, bo to jeden
był jeden wiersz kodu -
jeden sposób, aby to zrobić.
>> Więc dostaniesz drand jako Funkcja mogliśmy korzystać.
I co drand -
przy założeniu, że został zaszczepiono -
co to drand wrócić?
>> MICHAEL: pływak pomiędzy 0,0 i 1,0.
>> JASON Hirschhorn: liczba - tak.
Liczbę pomiędzy 0 a 1.
I tak mamy B i.
A potem mamy liczbę losową między 0 i 1 dana nam przez drand.
Niektórzy próbowali umieścić B lub b minus , lub coś w tym
nawiasach.
Oznaczałoby to, że są one argumenty tej funkcji.
>> drand nie ma żadnych argumentów - jak robi getString
nie podejmuje żadnych argumentów.
Więc jest to po prostu otworzyć nawias, blisko PAREN - i że sam jest
Wywołanie funkcji.
I to daje ci numer pomiędzy 0 i 1.
Oczywiście, mamy całą gamę że liczby mogą być w.
>> Powiedzieć, jeśli b jest 10 i jest 5, naprawdę chcą numer z zakresu 5.
Więc następną rzeczą, którą musisz zrobić, to pomnóż to przez zasięg b minus.
Tak więc przy założeniu, że jest pomnożona.
I że da nam wiele w danym zakresie.
I że jest określony zakres Różnica między B minus.
>> I w końcu, że tylko dam go od - powiedzieć, zakres pomiędzy B minus
jest 5, który da nam liczbę od 0 do 5.
Ale jeśli jest w rzeczywistości 5, musimy zwiększyć Zakres do tego, gdzie jest to
faktycznie ma być dodając.
Tak, że dostaje prawo logiki.
A potem, trzeba jeszcze jedno pytanie?
>> Michael: Nie.
Czuję się teraz bardzo głupi.
[Śmieje się]
>> JASON Hirschhorn: Nie.
Czy nie czujesz się naprawdę głupi.
Liczba osób zmagał z tym pytaniem.
A potem, inne pytanie, drand, powiedziałeś, daje pływaka -
zwraca float.
Ale ta funkcja faktycznie poprosił na całkowitą zostać zwrócone.
>> Nie musisz rzucać to wyraźnie do liczby całkowitej, ponieważ są
Operacje będą traktować go jako wszystko unosić - jako liczbę zmiennoprzecinkową.
Podoba Ci się to woli - nawet jeśli jest liczbą całkowitą, to będzie
mnoży się poprawnie.
Wszystko mnożenie będzie działać.
Nie musisz się go rzucić tutaj.
W rzeczywistości, nie należy oddać go.
>> , Które -
jeśli chcesz rzucić numer to jest między 0 a 1 -
losowa liczba, zmiennoprzecinkowe -
następnie będzie albo tylko 0 lub 1, tak stracisz wszystkie tego precyzją.
Ale w końcu, po powrocie, automatycznie pobiera
odesłane jako liczba całkowita.
Więc nie trzeba robić że oddając siebie.
>> Więc to była odpowiedź na to pytanie, numer 7.
Wszelkie inne pytania dotyczące Quiz 0?
Tak, Annie.
>> Annie: Kiedy używamy Cykliczne -
kiedy używamy iteracyjnych pętle?
>> JASON Hirschhorn: Kiedy używasz rekurencyjne - tak bardziej ogólnie,
plusy i minusy w porównaniu rekursji iteracyjne podejście.
Czy ktoś może zaoferować pro lub con?
Proszę?
Nie wszyscy mogą.
Kto może zaoferować pro lub con?
>> [PAPIER szelest]
>> UCZEŃ 1: Cykliczne jest mniej kodowanie - mniej pisania?
>> JASON Hirschhorn: Tak ogólnie, rekurencja zwłaszcza, funkcja -
lub algorytm jak seryjnej sortowania - która nadaje się
do cyklicznej podejścia -
może być bardziej proste kodować rekurencyjnie.
I po prostu więcej sensu zrobić to rekurencyjnie.
Tak, że będzie pro do rekursji.
Inni?
Tak?
>> UCZEŃ 2: Con do rekursji -
Używa więcej pamięci.
>> JASON Hirschhorn: Tak dokładnie prawo.
Rekurencyjna funkcja dodajemy ramki stosu do stosu.
Więc jeśli działa na wielu numery i trzeba nazwać
działało wiele, to z pewnością zajmują więcej pamięci, a
iteracyjne podejście będzie tylko jedno stosu ramki na stosie, ponieważ
to wszystko dzieje się w jednej funkcji.
>> Wszelkie inne plusy i minusy?
Tak.
>> UCZEŃ 3: Plusy dla rekursji.
Nie masz do ustalenia w naprzód, ile razy
kod ma być powtórzony.
Mogą mieć z góry określoną liczbę razy, że masz do iteracji, a następnie
rekurencja jest lepiej, bo Wystarczy, że wynik.
>> JASON Hirschhorn: Myślę, że to prawda.
Ale myślę, że w obu przypadkach byś nigdy -
będzie prawdopodobnie uzyskać pewne Wejście od użytkownika.
Czy ta funkcja będzie mieć jakiś wkład które określają, ile razy
powinno działać.
Tak ogólnie, to nie byłoby ciężko kod - nawet w iteracyjnego podejścia - jak
wiele razy, że pętla powinna być uruchomiony.
>> Czy masz inny byłeś myśląc o Annie?
OK.
To są chyba dwa -
Największym pro i największym rekurencyjny kon porównaniu do
iteracyjne podejście.
OK.
Coś jeszcze na Quiz 0?
>> Przejdźmy.
Plik I / O. Jest wspaniałym skrócie w tym tygodniu w pliku I / O, które miejmy nadzieję,
obejrzeniu wielokrotność razy, i podziwiał.
Dużo pracy udał się, że i ja mam słyszałem, że jest szalenie pomocne.
Ja również link na tym slajdzie, w przypadku, gdy nie mieli
szansa, aby obejrzeć go 10 razy.
>> Tak, mamy zamiar iść na krótko główne kroki do otwarcia i pracy
z plikami, a następnie będziemy nurkować na problem kodowania przed
zbadaniu zestaw problemów.
Więc znowu, mam zamiar położyć się na to ekran, ale mam zamiar mówić o
zaledwie kilka minut o tym, co mamy tu robisz z pliku I/O--
co to oznacza?
>> Oznacza to, że możemy stworzyć nasze programy, a następnie mają nasze programy
wyjścia, a nie dokonały żadnego wpływu na świat poza naszym programie.
Ale kiedy zaczynamy pracować z plikami - zarówno czytania i tworzenia ich w
nich - możemy mieć pewien wpływ na świat poza naszym programie.
>> Podobnie jak w przypadku programu Microsoft Word nie był w stanie wprowadzać żadnych dokumentów programu Word, a następnie
raz Microsoft Word zamknąć, wszystkie swoje Prace zostaną usunięte, i że będzie
naprawdę bezużyteczne.
Mamy w końcu chcą być w stanie pisać programy, które mogą mieć wpływ
świat wokół nich, zarówno biorąc w złożone wejść - w zakresie plików i
poprzez pliki, a także tworzenie się interesujące i wyjścia - ważne
w odniesieniu do różnych typów plików.
>> Więc dlatego zaczynamy nauczyć się, jak pracować z plikami.
Dokładniej, co robimy to w następujący sposób.
To bardzo proste.
Istnieje tylko kilka kroków, i są one wymienione tutaj na ten kod.
Więc mamy zamiar przejść przez ta linia kodu po linii.
>> Po pierwsze, można zobaczyć podświetlone -
podczas pracy z plikiem, niezależnie od typu pliku, który jest
trzeba go otworzyć.
I to jest z wezwaniem do fopen -
tutaj.
Zawierać nazwę pliku.
Jeśli plik nie znajduje się w katalogu, lub folder, w którym program
życie, to trzeba także m.in. jeżeli ścieżka do pliku jest.
>> Mamy zamiar założyć, że ta Plik o nazwie "text.txt" -
prosty dokument tekstowy - jest w sam folder jak ten program jest.
Więc to jest kolejna rzecz, do utrzymania w umysł - że jeśli chcesz otworzyć plik
gdzieś indziej, to rzeczywiście potrzebne obejmuje jej lokalizację.
>> Po drugie, można przekazać argument do fopen, i to, co chcesz zrobić
z pliku.
Istnieją trzy główne argumenty, które masz zamiar przejść do fopen.
Kto może mi dać te trzy?
Kto może mi jedną z nich?
Tak.
>> UCZEŃ 4: nazwa pliku?
>> JASON Hirschhorn: Przepraszam.
Trzy główne argumenty można przekazać jako drugi argument do fopen.
Masz rację - nazwa pliku jest pierwszy argument.
Ale drugi argument do fopen są zazwyczaj trzy struny, a - tak.
Aleja.
>> ALEJA: do dołączenia.
>> JASON Hirschhorn:, jeśli chcesz dołączania do pliku, który już istnieje.
>> UCZEŃ 5: R do odczytu.
>> JASON Hirschhorn: R, jeśli chcą czytać z pliku.
>> UCZEŃ 6: W dla zapisu.
>> JASON Hirschhorn: I w, jeśli chcę zapisać do pliku.
Tak więc w tym przypadku piszemy do pliku, więc mamy w.
Go otworzyć, trzeba także zapisać plik gdzieś, a to z
Kod dla lewego rogu operator przypisania -
Tworzę wskaźnik do pliku nazywa, w tym przypadku, akt.
>> Nie będziemy się martwić, co to wszystkie czapki PLIK rzeczą jest.
Wystarczy powiedzieć, że jest to długi strumień zer i jedynek.
I w ten sposób mamy zamiar pracować i zrozumieć go.
>> Następną rzeczą, jaką musimy zrobić - i to jest bardzo ważne -
przy każdym otwarciu pliku -
W rzeczywistości, kiedy tylko zadzwonić malloc, dla przykładem, i trochę pamięci i spróbuj
i zapisać go w wskaźnik, zawsze Aby sprawdzić, aby upewnić się, że
funkcja nie zwróci null.
>> Tak więc w tym przypadku sprawdzamy, aby upewnić się, że rzeczywiście mamy otwarte
złożyć poprawnie i nie było brak błędów w naszym programie.
Następnie, gdy już zostały sprawdzone, aby upewnić się, że mamy plik roboczy, możemy
zapisu lub odczytu z, lub dołączyć do pliku.
W tym przypadku, jestem po prostu drukowania jedna linia do tego pliku.
>> Skąd mam wiedzieć, że?
No cóż, używam tej funkcji nazywa fprintf.
Wszystkie funkcje z których będziemy korzystać podczas pisania do lub czytania z, lub
manipulacji plikami będzie podobny do Funkcje widzieliście wcześniej, ale
zaczynają się na literę F, stojąc na pliku.
I fprintf, w przeciwieństwie do naszego normalnego druku aplikacja, wykonuje jeden dodatkowy argument,
i to jest plik, w którym wydrukować tę linię.
>> Nie mam nic do Prawo OHAI.
Nie mam na trzecią argument printf -
lub drugi argument do printf, Trzeci argument fprintf, bo
Nie ma tutaj żadnych zastępczych.
Nie jestem w tym żadnych zmiennych.
Ale znowu, fprintf, a wszystkie te sprawy Funkcje, które działają z plikami
generalnie będzie potrzebował pliku , w którym są one działać.
>> Wreszcie ostatnia ważna rzecz zrobić, to zamknąć plik, tak jak
z - ilekroć malloc coś, chcemy uwolnić coś, żeby nie
masz wyciek pamięci - chcemy zamknąć nasz plik.
Jeśli program ten odszedł bez zamykania plik, kursy są nic nie pójdzie
tak, szczególnie jeśli Był to mały plik.
>> Ale jest to z pewnością dobry styl kodowania i ćwiczyć na zawsze zamknąć plik
gdy skończysz go używać.
Więc to jest podstawy pliku I / O. Prawdopodobnie widziałeś, że przed, lub
Oglądałem go w tym fantastycznym krótki.
Czy ktoś ma jakieś pytania, przed pójdziemy do jakiejś praktyki kodowania
Problemy, o pliku I / O lub kroki Właśnie przeszliśmy?
>> [DŹWIĘKI TYPOWANIE]
>> JASON Hirschhorn: Czy ci mam pytanie, AVI?
>> AVI: Nie.
>> JASON Hirschhorn: OK.
Będę czekać kolejny siedem sekund.
[Śmieje się]
To naprawdę dobra wskazówka.
Wy po prostu nie lubię zadawanie pytań.
To dobrze.
OK.
Więc nasz problem najpierw praktyka, jesteśmy zamierza zastępuje rolę
narzędzie wiersza polecenia, które prawdopodobnie stosowane wcześniej - kopia -
Narzędzie Kopia.
Jeśli wpiszesz cp, a następnie przekazać go dwa Argumenty do swojego terminalu, można
skopiować plik.
I to jest to, co chcemy napisać teraz.
>> Więc jeszcze raz, czytając od tego slajdu, chciałbym można napisać program, który przyjmuje
dwóch i tylko dwóch linii poleceń argumenty -
plik źródłowy i plik docelowy -
i kopiuje zawartość źródła złożyć do pliku docelowego
jeden bajt w tym samym czasie.
Tak, że jest wiele do prosić.
>> Ponownie, dobre podejście do tego celu jest nie iść prosto do kodu C, ale
rozbicie go na kilka etapów.
Po pierwsze, myślę o logice - dokładnie pytam was zrobić -
i zrozumieć wszystkie kroki do tego problemu.
Nie w C, tylko w pewnym Pseudokod, lub nawet psychicznego model
co się dzieje.
>> Następnie, po uzyskaniu Pseudokod dół, dowiedzieć się, jak pseudokod
mapy na narzędzia i rzeczy które nauczyli się wykorzystywać w C.
>> I wreszcie, gdy już wszystko, razem, można zakodować problemu.
Take 5 do 10 minut pracować nad tym problemem.
Powiem z instrukcjami z powrotem w drugim.
A następnie jedziemy do przejść Pseudokod i kod
żyć w grupie.
>> Jeśli masz jakieś pytania, gdy jesteś Pracujemy nad tym, nie krępuj się podnieść
Twoja ręka, a ja się się i odpowiedzieć na nie.
>> UCZEŃ 7: Czy można przesunąć kawałek papieru?
>> JASON Hirschhorn: Co jest?
>> [DŹWIĘKI TYPOWANIE]
>> JASON Hirschhorn: OK.
Chodźmy na Pseudokod pierwszy, i to dam ci kilka więcej
minut, aby zakończyć kodowania.
>> Którzy chcieliby rozpocząć mnie z pierwszą linią
pseudokod dla tej funkcji?
>> UCZEŃ 8: Sprawdź, aby upewnić się, że Ci mieli dwa pliki.
>> JASON Hirschhorn: OK.
A jeśli nie jesteśmy?
>> UCZEŃ 8: Chciałbym wrócić 0.
>> JASON Hirschhorn: Powinniśmy wrócić 0?
>> UCZEŃ 8: Powrót -
wygaszania.
Przepraszam.
>> JASON Hirschhorn: Tak.
Prawdopodobnie nie 0.
Ponieważ 0 oznacza, że ​​wszystko było dobre.
OK.
Więc to jest pierwsza linia z Pseudokod.
Kto ma drugą linię Pseudokod?
>> UCZEŃ 9: Otwórz oba pliki?
>> JASON Hirschhorn: Otwórz oba pliki.
OK?
>> UCZEŃ 10: Sprawdź jeśli plik jest NULL?
>> JASON Hirschhorn: Sprawdź, pewno nie jest NULL.
Tak na marginesie -
slash 0 -
jest NULL?
>> UCZEŃ 11: Nie.
>> JASON Hirschhorn: To nie jest NULL.
To jest nazywane terminator NULL.
To faktycznie wpisany tylko jeden litr.
Więc sprawdzenie coś przeciwko, że - to faktycznie charakter -
więc sprawdzenie coś przeciwko, że jest to nie to samo, sprawdzając, czy to
równa NULL.
>> I niektórzy ludzie -
na ich quizy i ich problem Zestawy - mam
dwa z tych mylić.
Ale dwa z nich są w rzeczywistości inny.
Jeden kończy ciąg -
z nich jest wskaźnik do 0.
>> UCZEŃ 12: Dlaczego nie można sprawdzić na upewnić się, że pliki nie są NULL
przed ich otwarciem?
>> JASON Hirschhorn: Więc otwarte oszczędza coś w tym pliku.
A jeśli wrócisz tu -
więc ta linia - fopen -
daje adres i sklep że adres w pliku, czy to działa.
Jeśli to nie działa, to będzie przechowywać NULL -
>> UCZEŃ 12: Och.
OK.
Mam cię.
>> JASON Hirschhorn: W pliku.
Więc nie można sprawdzić na NULL zanim je otworzył pan.
NULL oznacza coś nie działa poprawnie.
OK.
Więc upewnij się, nie znaczy?
Czy są?
Co mamy na myśli?
Pójdziemy z tym.
>> UCZEŃ 13: Czy.
>> JASON Hirschhorn: Czy?
Nie jest?
>> UCZEŃ 13: Czy.
>> JASON Hirschhorn: OK.
Wydaje się mieć pewne konsensus w tej sprawie.
Ani jest NULL.
OK, następna linia Pseudokod.
Kto nie dał mi wiersz jeszcze konta?
Będziemy czekać na ciebie.
Tak.
>> UCZEŃ 14: Trzeba czytać od pierwszego pliku?
>> JASON Hirschhorn: OK.
>> UCZEŃ 14: Albo używamy fscanf lub coś w tym pierwszym pliku?
>> JASON Hirschhorn: Więc chcemy czytać od pierwszego pliku i -
postawmy że tutaj.
Odczytu z pliku źródłowego.
A następnie, co zrobimy po tym odczytu z pliku źródłowego?
Ktoś jeszcze?
>> UCZEŃ 15: Napisz do plik docelowy?
>> JASON Hirschhorn: napisz do nas plik docelowy, a -
OK.
Co jeszcze nam brakuje?
Ktoś, kto mnie nie podano linia kodu jeszcze - z Pseudokod.
Tak.
>> UCZEŃ 16: Może zawsze można sprawdzić czy jest coś do czytania na,
jak następnego wiersza?
Że są jak w następnej linii, zobaczyć, czy on istnieje.
>> [Elektroniczny sygnał dźwiękowy]
>> JASON Hirschhorn: Ups.
To jest mój program w dzienniku.
Tak?
>> UCZEŃ 16: Tak.
>> JASON Hirschhorn: Więc daj mi to jeszcze raz.
>> UCZEŃ 16: Sprawdź, czy nie ma jeszcze następna linia z
plik źródłowy do odczytu.
>> JASON Hirschhorn: OK.
Więc nie czyta wiersze - czytali bajtów tutaj -
ale masz rację.
Chcemy czytać i pisać, aż nie ma więcej bajtów.
OK.
I tak to powinno być naprawdę wcięte nieco, bo są pod nie.
Prawda?
Dopóki jesteśmy z bajtów, będziemy odczytu z pliku źródłowego i pisać
do pliku docelowego.
>> A następnie, co jest ostatnio linia Pseudokod?
Ktoś, kto nie podano mnie coś jeszcze.
>> UCZEŃ 17: Zamknij pliki?
>> JASON Hirschhorn: Dokładnie.
Zamknij pliki.
Więc jest nasz pseudokod.
Mam zamiar umieścić Pseudokod do gedit, w kilka minut możemy
będzie kodować tym razem.
>> OK.
Pozwól nam zacząć jako grupa.
Nishant, mam nowy plik.
Właśnie otworzył to.
Untitled Document 1.
Co jest pierwszą rzeczą, którą należy zrobić?
>> Nishant: Dołącz bibliotek?
>> JASON Hirschhorn: OK.
Jakie biblioteki?
>> Nishant: stdio.h, stdlib.h, wierzę?
>> JASON Hirschhorn: OK.
Co to jest stdlib dla?
>> Nishant: zapomniałem.
>> JASON Hirschhorn: OK.
Więc m.in. stdio.
Co należy zrobić, zanim jeszcze I zacząć pisać?
>> Nishant: Napisz nagłówek?
>> JASON Hirschhorn: Jak mogę dostać to kolorowe?
>> [GŁOSY wstawienie]
>> Nishant: Jak dostać kolorowe?
>> JASON Hirschhorn: Jak mam kolor kodowania?
>> Nishant: Nie wiem.
Och.
Zapisz.
>> JASON Hirschhorn: Zapisz.
Tak.
Należy go zapisać jako plik. C.
Więc zapisz go na pulpicie jako cp.c.
Słodkie.
A jeśli chcę uzyskać pełną stylu punktów, co mam
zawierają na szczycie?
>> Nishant: Możesz napisać swoje imię i nazwisko, nazwę programu i celów
programu, jak również?
>> JASON Hirschhorn: Wygląda dobrze.
Doskonała.
Więc zaczął nam się doskonale.
# Include -
będziemy też pisać -
OK.
Więc myślę, że wszystko jest gotowe do pracy.
Kto ma pierwszą linię kodu dla mnie - lub pierwsze linie kodu, które
to zajmie aby zaspokoić nasz pierwszy uwag w Pseudokod?
Ty.
>> UCZEŃ 18: Czy nie powinno być int argc, char *, a następnie argv?
>> JASON Hirschhorn: Myślę, że masz rację.
Zmieńmy to na int główne, otwarte paren, int argc, przecinek, char * argv?
Tak?
>> UCZEŃ 18: Wsporniki.
>> JASON Hirschhorn: Wsporniki.
Otwórz uchwyt, zamknięcie nawiasu, blisko rodzica.
Idealny.
Teraz mogę wziąć argumenty wiersza poleceń.
OK.
Upewnij się, mamy podane dwa pliki.
Możesz mi dać, że dobrze.
>> UCZEŃ 18: Jeśli argc -
ta nie jest równa 3.
>> JASON Hirschhorn: Jeśli otwarty nawias argc nie równa 3?
>> UCZEŃ 18: Tak, powrót 1 lub cokolwiek.
>> JASON Hirschhorn: Przepraszam.
>> UCZEŃ 18: Powrót 1 lub cokolwiek.
>> JASON Hirschhorn: Powrót 1.
OK?
Świetnie.
Otwórz oba pliki.
Kto może pomóc mi otworzyć oba pliki?
Kto nie dał mi kodu jeszcze?
Kurt?
>> KURT: Więc wszystkie czapki F-I-L-E źródłowe gwiazda.
>> JASON Hirschhorn: Jadę wykupienia samogłoski.
To są fajne.
To jak Tumblr.
>> UCZEŃ 18: Równa fopen -
>> JASON Hirschhorn: Równa fopen?
>> UCZEŃ 18: Otwarte nawias, argv, otwarty uchwyt.
>> JASON Hirschhorn: Czekaj.
Przepraszam.
Otwórz nawias.
OK.
>> UCZEŃ 18: Tak.
Argv sub 1.
>> JASON Hirschhorn: Sub 1?
>> UCZEŃ 18: Tak.
Argv otwarty uchwyt 1 -
Tak.
A następnie przecinek, a następnie otwarty pokój cytat, r, podwójny cudzysłów,
zamknij nawias, średnik.
>> JASON Hirschhorn: Słodkie.
A co z drugim?
>> UCZEŃ 18: Bardzo podobne, ale zamiast S-R-C, można nazwać to D-S-T.
>> JASON Hirschhorn: Oo!
To mi się podoba.
>> UCZEŃ 18: Tak D-S-T. Tak.
A następnie argv, otwarty uchwyt, 2.
Tak.
A następnie w zamiast r.
Tak.
>> JASON Hirschhorn: Świetnie.
Następne kilka linii.
Także jeśli ktoś ma co do dodania do linie, które zrobiliśmy, nie krępuj się
dodać tych, jak również.
Upewnij się, czy nie jest NULL.
Kto może mi dać kod muszę zaspokoić tę linię Pseudokod?
Archer.
>> ARCHER: Jeśli src równa równych NULL lub równa równych DST
NULL, a następnie powrót -
>> JASON Hirschhorn: Co?
>> ARCHER: Powrót 2?
>> JASON Hirschhorn: Powrót 2.
Więc jeśli otwarty nawias src równa równa się NULL, lub -
cokolwiek to thing's - rury?
Rura?
Nazwijmy to rura.
Rury, rury, dst równa równych NULL, powrót 2.
OK?
Dopóki jesteśmy z bajtów -
my jakby pomijane tym etapie część pseudokod na zamiar tutaj.
>> Ale dopóki jesteśmy z bajtów - Co to brzmi?
Jaki rodzaj struktury C -
ale nie używam struktury tekstu, bo mamy zamiar rozpocząć korzystanie
że w innych przypadkach -
ale C Narzędzie to brzmi jak?
>> UCZEŃ 19: pętla.
>> JASON Hirschhorn: pętla.
Brzmi jak pętli.
Więc kto może mi dać pierwszą linię kodu pętli tutaj?
Można również wybrać, jaki rodzaj pętla chcesz, jeśli dasz mi
ta linia kodu.
Istnieją trzy typy.
Można dostać się do piłki.
Proponuję jeden z nich.
Avi.
Który z nich chcesz?
>> AVI: DO.
>> JASON Hirschhorn: DO.
>> AVI: int i jest równa zeru.
>> JASON Hirschhorn: OK.
>> AVI: Ta część nie jestem pewien.
Ale i jest mniejsza niż rozmiar źródła gwiazdy?
Nie jestem pewien.
>> JASON Hirschhorn: OK.
>> AVI: Bo chcesz rozmiar pliku, prawda?
>> JASON Hirschhorn: Więc to prawdopodobnie nie będzie daje nam rozmiar rzeczywisty
pliku w bajtach.
Co jeszcze możemy zrobić?
Co jest inny rodzaj pętli?
Czy powinniśmy trzymać się z pętli FOR?
>> UCZEŃ 20: Czy mógłbyś zrobić pętli while?
A potem, to co można zrobić, to you'd -
bo mamy char * dla pliku.
Jeśli więc po prostu zachować zwiększając że dopóki my znaleźć w znaku NULL
Koniec z tym?
Lub nie, jest to, że nie, jak działają pliki?
>> JASON Hirschhorn: Więc możemy zachować inkrementacji char *
dopóki nie znajdziemy NULL -
>> UCZEŃ 20: Zasadniczo nie poddawać się znak po znaku, aż trafiliśmy
Koniec pliku.
>> JASON Hirschhorn: Tak.
Więc to jest to, co chcemy zrobić.
Chcemy zachować czytania, charakter po znaku, aż dojdziemy do
Koniec pliku.
>> UCZEŃ 20: Tak.
Znaleźć -
co jest koniec lub znak stopu Na koniec w pliku tekstowym.
>> JASON Hirschhorn: OK.
Więc kiedy dojdziemy do końca pliku - skąd wiemy, że osiągnęliśmy
koniec pliku?
Jeśli dzwonię -
więc niech to krok wstecz.
Co to jest funkcja?
Chodźmy do tej linii tutaj.
Odczytu z pliku źródłowego.
Kto może mi dać ten wiersz kodu?
>> UCZEŃ 21: fscanf?
>> JASON Hirschhorn: fscanf.
OK.
Co zrobić, jeśli chcę czytać, bardzo W szczególności, jeden bajt?
>> UCZEŃ 21: Nie wiem.
>> JASON Hirschhorn: OK.
Nawet prostsze niż fscanf - to, co jest -
Chcę czytać z pliku źródłowego?
Czytaj z pliku źródłowego.
Co to jest funkcja - tak.
>> UCZEŃ 22: To fread?
>> JASON Hirschhorn: fread.
Myślę, trzymajmy się że jeden na teraz.
Co to za argumenty nie fread wziąć?
>> UCZEŃ 22: Prawdopodobnie typ pliku, i lokalizacja w pliku?
>> JASON Hirschhorn: Co mam tu wpisać aby dowiedzieć się, jakiego rodzaju argumenty
fread bierze?
>> Człowiek KILKA STUDENCI: fread.
>> JASON Hirschhorn: Mężczyzna fread i fwrite.
Wygląda na to, że spędzać czas razem.
Więc fread bierze jak wiele argumentów?
>> UCZEŃ 23: Cztery.
>> JASON Hirschhorn: To trwa cztery argumenty.
To trwa wskaźnik, rozmiar, i że coś, co jest dziwne, a niektóre pliki.
OK?
Przeczytajmy o tym tutaj.
"Funkcja fread odczytuje n memb elementów danych, każdy bajtów rozmiar
długo, ze strumienia wskazywanego przez strumień, przechowywanie ich w miejscu
podane przez wskaźnik. "
>> Tak więc cztery argumenty.
Dlaczego nie mogę po prostu skopiować to, i wklej go tutaj.
OK.
Więc kto może rozpocząć wypełnianie te argumenty dla mnie?
Avi.
>> AVI: Wyjąć pustkę.
Umieścić tylko src.
Wyjąć wskaźnik i gwiazdy.
Umieścić src.
Następnie -
>> JASON Hirschhorn: Więc mam zamiar zatrzymać tam, bo to jest niepoprawne.
Masz rację z src, ale gdzie należy src iść?
>> [GŁOSY wstawienie]
>> JASON Hirschhorn: Powinien przejdź tutaj.
To src - nasza src jest typ.
Spójrzmy tutaj.
Ten pyta o typ pliku *, my faktycznie je zobaczyć tak.
Tak to jest z prośbą o argument typ pliku * zwany strumień, który jest src.
OK?
>> Jaki rozmiar rzeczy zrobić chcemy czytać?
Dałem ci to w opis problemu.
>> STUDENT 24: Jeden bajt w tym samym czasie.
>> JASON Hirschhorn: Jeden bajt.
Jak duży jest bajt?
Jego wielkość jest w bajtach, więc to, co mogę umieścić tam?
>> UCZEŃ 25: Jeden.
>> JASON Hirschhorn: Jeden.
Prawo.
Jego wielkość jest w jednostki bajt, więc 1 jest 1 bajt.
Ile chcę czytać na raz.
>> UCZEŃ 26: Jeden?
>> JASON Hirschhorn: Jedno.
Chcę przeczytać jedno z wielkości 1, ugryzienie jednocześnie.
I gdzie mogę je, raz czytam?
>> UCZEŃ 27: Cel podróży?
>> JASON Hirschhorn: Więc nie mogę umieścić to prosto do celu.
>> UCZEŃ 28: Będziesz put że do trzeciego wskaźnik?
>> UCZEŃ 27: do miejsca przeznaczenia.
>> JASON Hirschhorn: OK.
Tak.
>> UCZEŃ 29: Możesz zadeklarować coś działać jako tymczasowe przechowywanie wcześniej.
>> JASON Hirschhorn: OK.
Daj mi to.
>> UCZEŃ 29: Kolejny plik wskaźnik, może być?
>> JASON Hirschhorn: OK.
Więc to jest nieważne star -
to gwiazda typu void, więc nie trzeba być wskaźnik pliku.
A jeśli czytam jeden bajt, gdzie byłoby dobre miejsce
zapisać jeden bajt?
>> UCZEŃ 29: tablica?
>> JASON Hirschhorn: tablica.
OK.
I co jeszcze jest coś, co jest tylko rozmiar jeden bajt?
>> UCZEŃ 30: char *?
>> UCZEŃ 29: Tak.
>> JASON Hirschhorn: char * Nie jest jeden bajt.
>> UCZEŃ 29: char.
>> JASON Hirschhorn: char to jeden bajt.
Prawda?
Więc nazwijmy to bufor jest ogólnym nazwa używana do przechowywania tych rzeczy do
coś tymczasowo.
Więc stworzyć bufor.
Prawda?
Ale to nie ma void *.
Więc może masz rację, że Bufor powinien być o rozmiarze 0.
Tak przechowuje to jeden -
prawo.
>> Bo to właśnie tutaj - char Bufor jest charakter, ale
ma to void * -
wskaźnik.
Więc mogłem to zrobić i teraz Bufor jest wskaźnik.
Co jeszcze mogę zrobić?
>> UCZEŃ 31: Put gwiazdkę obok char.
>> JASON Hirschhorn: mogłem Stworzyliśmy to char *.
OK.
Co jest inny, na co mogę zrobić?
Albo idziemy z tego.
Char * bufor, więc to, co mogę umieścić tutaj?
>> UCZEŃ 31: Bufor.
>> JASON Hirschhorn: Bufor.
Bufor jest wskaźnik do char.
I w tym miejscu, stawiamy jeden bajt coś czytaliśmy.
Tak.
Avi.
>> AVI: Tylko szybkie pytanie.
Chcesz malloc bufor?
>> JASON Hirschhorn: Kto może odpowiedzieć na to pytanie?
>> UCZEŃ 32: No cóż, to naprawdę nie ma punkt do niczego w tej chwili, więc -
>> JASON Hirschhorn: Ale czy chcemy go malloc?
>> UCZEŃ 32: Jeśli było to zrobić, że sposób, myślę, że tak, dlatego, że trzeba
jakieś miejsce na to, aby wskazać.
>> JASON Hirschhorn: czy trzeba go malloc?
>> UCZEŃ 33: Jeśli masz zamiar używać na zewnątrz pętli.
>> JASON Hirschhorn: Czy będziemy używać na zewnątrz pętli?
>> UCZEŃ 34: Tak.
>> UCZEŃ 35: Czekaj.
Czy chcemy, aby to zgłosić w pętli do zaświatów?
>> JASON Hirschhorn: Więc myślę, że mamy niektóre pseudo pętla tutaj, że jesteśmy
próbuje dowiedzieć się, że jeszcze nie dostał się.
Nie trzeba go malloc.
Jesteśmy działającą w głównym, to będzie tylko do stosowania wewnątrz pętli.
Nie musi istnieć poza tym.
>> Więc może to być zmienna lokalna.
Masz wskaźnik do zmienna lokalna.
>> UCZEŃ 36: Ale to nie jest wskazując na coś.
>> JASON Hirschhorn: Nie, to nie jest inicjowany do niczego.
Ale nie będziemy z niego korzystać również.
Zamierzamy umieścić coś w to pierwszy raz, kiedy go używać.
Tak, że wydaje się OK.
Więc nie musimy tutaj malloc.
I myślę, że jest OK, jak jest.
OK.
Mamy fread linię.
Zróbmy następny wiersz.
>> Jeśli chcemy zapisać do pliku, co jest dobry funkcji użyć aby to zrobić?
>> UCZEŃ 37: fwrite?
>> UCZEŃ 38: fprintf?
>> JASON Hirschhorn: fprintf jest jeden.
Co jest jeszcze jeden?
>> UCZEŃ 39: fwrite.
>> JASON Hirschhorn: fwrite.
I dla naszych celów, fwrite, które widzieliśmy tutaj, jest
chyba lepszym wyborem.
To trwa cztery argumenty, jak również.
Nishant, możesz dać mnie argumenty?
>> Nishant: pierwszy z nich będzie być tylko bufor.
>> JASON Hirschhorn: OK.
>> Nishant: drugi jest będzie tylko 1.
Trzeci będzie 1.
A czwarty będzie dst.
>> JASON Hirschhorn: Czy ktoś ma wszelkie pytania na temat tej linii?
, Że wygląda dobrze.
OK.
Teraz wygląda na to, z jednej rzeczy jesteśmy brakuje - faktycznie, napiszmy
ta ostatnia linia.
Zamknij pliki.
Kto może nam dokończyć pisanie te ostatnie dwie linie?
Tak.
Niestety, jak się nazywasz?
>> LUCY: Lucy.
>> JASON Hirschhorn: Lucy.
>> LUCY: fclose src, a następnie fclose przeznaczenia.
>> JASON Hirschhorn: fclose, otwarty nawias, src, zamknij nawias, średnik.
I fclose -
tak?
>> LUCY: Open nawiasy, dst i średnik.
>> JASON Hirschhorn: Świetnie.
I co mam m.in. na końcu?
>> LUCY: return 0.
>> JASON Hirschhorn: return 0.
Czy muszę?
Tylko pytanie.
Czy mamy do włączenia return 0?
>> WIELU STUDENCI: No
>> JASON Hirschhorn: Nie.
Głównym robi to automatycznie jeśli się do końca.
Ale myślę, że to miło obejmuje to wyraźnie.
Zwłaszcza, gdy mamy do powrotu inne rzeczy w całym programie.
OK.
To jest to, czego brakuje -
Natomiast to, co?
Którzy mogą myśleć niektórzy -
ma jakiś sens, jakie rzeczy może tam wejść?
Nawet jeśli jest to tylko w niektórych Pseudokod jak język?
>> Jakie są naprawdę - co chcemy, aby przejść do czasu?
Tak, Lucy.
>> LUCY: koniec pliku.
>> JASON Hirschhorn: koniec pliku.
Więc co masz na myśli koniec pliku?
>> LUCY: Po osiągnięciu koniec pliku, stop.
>> JASON Hirschhorn: OK.
Więc gdy dotrzemy do końca pliku.
Skąd mamy wiedzieć, kiedy dotarliśmy koniec pliku?
>> UCZEŃ 40: Myślę, że bufor zostanie ustawiony na NULL.
>> UCZEŃ 41: Bufor jest zadeklarowana wewnątrz pętli.
>> JASON Hirschhorn: Więc myślisz bufor zostanie ustawiony na NULL.
Dlaczego bufor być ustawiony na NULL?
>> UCZEŃ 40: Bo kiedy fread, starasz się położyć
nic do buforu.
>> JASON Hirschhorn: OK.
Więc myślisz fread -
kiedy dotarliśmy do końca plików, co jest fread zrobić?
Myślę, że to pytanie musimy się dowiedzieć.
Co fread zrobić?
Czy umieścić NULL w buforze, lub to coś innego?
Jak możemy dowiedzieć się, co to jest?
>> UCZEŃ 42: Człowiek.
>> JASON Hirschhorn: Człowiek.
Więc spójrzmy tutaj.
Zwracana wartość.
Na sukces, fread i fwrite powrót liczba elementów odczytywane lub zapisywane.
Ta liczba odpowiada liczbie bajtów przekazywane jedynie wtedy, gdy rozmiar jest 1.
Jeśli wystąpi błąd, lub koniec plik został osiągnięty, zwracana jest wartość
krótki Ilość pozycji lub 0.
>> Więc dla naszych celów, jeśli fread biegu koniec pliku i odczytuje z
koniec pliku, nie ma nic czytać, co idzie do powrotu?
>> UCZEŃ 43: Zero?
>> JASON Hirschhorn: Co?
>> UCZEŃ 43: Zero?
>> JASON Hirschhorn: zero.
To będzie powrót do zera.
Wiemy, że fread, gdy mamy osiągnął koniec pliku, będzie
, aby powrócić do zera.
Jak możemy wykorzystać, że na naszą korzyść?
>> AVI: Możesz zadeklarować zmienną poza pętli zwanej wyboru.
Jeśli kontrola jest równy -
na razie - jeden.
>> JASON Hirschhorn: OK.
>> AVI: A potem można umieścić IF Oświadczenie rację mówiąc, jeśli po fread
fread jest równa zeru -
nie.
>> JASON Hirschhorn: Kto Avi na zewnątrz może pomóc?
>> AVI: Co jest wartość zwrócony przez fread?
>> JASON Hirschhorn: Po prostu Podszedłem, że.
>> AVI: Jak przedstawiają to?
>> JASON Hirschhorn: Więc to wraca - Zróbmy spójrz tutaj - zwraca
int, który jest zasadniczo całkowita.
Dlatego zwraca liczbę całkowitą.
A w naszym przypadku, to będzie zwraca 1 lub 0 -
1, jeżeli czytać jedno - jeden bajt, i 0, jeśli już dobiega końca.
Więc jeśli fread -
tak?
>> UCZEŃ 45: Nie możesz po prostu umieścić w pełnym fread (bufor, 1, 1, src) do
pętla?
>> JASON Hirschhorn: Więc proponuję robi to na nie?
>> [GŁOSY wstawienie]
>> JASON Hirschhorn: Trzymaj się.
Więc jesteśmy pozbawienie tego.
Więc proponuje wprowadzenie do fread nie?
Co powinniśmy również poruszać jeśli chcesz to zrobić?
>> UCZEŃ 45: bufor na zewnątrz.
>> JASON Hirschhorn: Powinniśmy również przenieść to tutaj.
>> UCZEŃ 45: Ale nie, że ciągle przesunąć go do przodu?
>> [GŁOSY wstawienie]
>> JASON Hirschhorn: OK.
Więc to jest to, co zaproponował Okshar.
Tworzymy bufor.
Mamy PODCZAS fread, następnie fwrite.
Myśli o tym?
>> UCZEŃ 46: Moje pytanie tylko, by faktycznie wykonać fread polecenia?
>> JASON Hirschhorn: Wielki znak zapytania.
Kiedy jesteś wprowadzenie wywołania funkcji wewnątrz warunkiem, że nie
Wywołanie funkcji wykonać?
Widzieliśmy już przykłady tego wcześniej.
Prawda?
>> UCZEŃ 46: OK.
Tak.
Więc to nie wykona.
>> JASON Hirschhorn: Widzieliśmy rzeczy tak przed, w których mamy
wywołanie funkcji wewnątrz warunku.
Oznacza, że ​​wywołanie funkcji wykonać?
Tak.
Więc odpowiedź brzmi: tak.
To wywołanie funkcji wykona.
Ale znowu, jest to, co chcemy?
>> Co to jest jeden sposób możemy dowiedzieć się, czy to jest to, co chcemy?
>> WIELU STUDENCI: Uruchom go?
>> JASON Hirschhorn: Możemy go uruchomić.
Ale zanim to zrobimy, mogliśmy również rozumieć przez to.
Jeśli -
że mamy jeden bajt w naszym plik, my się do tego,
my się do tego kodu.
Będzie to działać.
fread zwraca jeden bajt i przechowywać go w buforze.
I będzie to ocenić na 1, Dobrze, że wraca po 1.
>> Tak więc, 1.
Czy to oznacza, że ​​kod wewnątrz pętli while wykona?
>> UCZEŃ 47: Tak.
To prawda.
>> JASON Hirschhorn: Tak.
1, jest prawdą.
To nie jest 0.
Więc kod wewnątrz tutaj wykona.
Tak będziemy pisać, że.
Będziemy wrócić do tego linia po raz kolejny.
Teraz mamy -
jesteśmy na końcu naszego pliku.
Czytamy od końca naszego pliku, ponieważ mieliśmy tylko jeden bajt w nim.
>> Fread zwraca 0, sklepy coś w buforze.
Szczerze mówiąc, nie wiem, co przechowuje w buforze.
Moglibyśmy prawdopodobnie patrzeć aby zobaczyć, co robi.
Że szczerze mówiąc nie wiem.
Nie wiemy, kogo to obchodzi, co przechowuje się w buforze?
Ale to nie zwraca 0.
I podczas gdy 0 wykonać?
>> PODCZAS 0 nie wykona.
Więc my przenieść tutaj.
Więc przejdźmy pokaz ręce, czy to jest kod należy uruchomić, lub jeśli
należy zrobić w pierwszej kolejności zmiany.
Więc jeśli uważasz, że - trzeba głosować.
Jeśli uważasz, że powinniśmy ten kod jak jest, proszę podnieść rękę.
>> OK.
Jest jedna -
masz pytanie, wątpliwości?
Tak.
>> UCZEŃ 48: Po ruszamy bufor zewnątrz pętli, mamy
trzeba go malloc?
>> JASON Hirschhorn: Wielki znak zapytania.
Po ruszamy poza bufor pętli, musimy go malloc?
To jest pytanie, zakres.
Jeśli bufor poza zainicjować tej pętli, to istnieją
wewnątrz pętli?
>> WIELU STUDENCI: Tak.
>> JASON Hirschhorn: Tak.
Jej zakres obejmuje wewnątrz pętli, i, tak naprawdę, to w środku coś poniżej
tego kodu, w tym rzeczy wewnątrz tutaj.
Więc nie trzeba go malloc.
Jest to zmienna lokalna, a jej zakres nadal zawiera pętli.
>> UCZEŃ 49: Czy musimy ją uwolnić?
>> JASON Hirschhorn: czy trzeba wolnego bufora?
>> UCZEŃ 49: Tak, jeśli tego nie zrobimy malloc.
>> JASON Hirschhorn: czy trzeba wolnego bufora?
Nie.
Ponownie, jest to zmienna lokalny więc nie trzeba go uwolnić.
OK.
Zobaczmy, co się dzieje.
Tak to jest niezainicjowanego.
To było coś, co Marcus zaproponował wcześniej.
Tak, że mamy zmienną bufor błędów, jest stosowany tutaj niezainicjowany.
>> Jak możemy rozwiązać ten problem?
>> UCZEŃ 50: malloc to?
>> UCZEŃ 51: Równa NULL?
>> UCZEŃ 52: Powiedz bufora równa NULL.
>> JASON Hirschhorn: OK.
Wygląda dobrze.
Musimy go teraz.
Stwórzmy coś spróbować kopiowanie.
Więc mamy plik tekstowy.
Jak możemy uruchomić ten program?
Tak.
>> UCZEŃ 53: Możesz zrobić kropkę slash CP Test.txt.
A następnie można wymienić inny plik , które przechowuje się.
>> JASON Hirschhorn: OK.
Nazwijmy go out.txt.
Fajne?
Usterka Seg.
Refleksje na temat winy segmencie?
To jest świetne.
Jak możemy dowiedzieć się, gdzie wina SEG jest?
Co?
>> UCZEŃ 54: GDB.
>> JASON Hirschhorn: GDB.
Możemy uruchomić gdb pisząc gdb dot ukośnik, Nazwa naszego programu.
Tam żadne argumenty wiersza poleceń.
Jedziemy do ustaw przerwania na Głównym.
Jeśli chcę zacząć gdb, co mam zrobić?
>> UCZEŃ 55: R.
>> JASON Hirschhorn: R. I co wtedy?
>> UCZEŃ 55: Argumenty?
>> JASON Hirschhorn: Wtedy Argumenty wiersza polecenia.
Prześledźmy.
N jest tylko przy mnie wiersz po wierszu.
Mam zamiar iść do dnia Mam moja wina seg.
Nie moja wina, SEG.
Wygląda na to, fread spowodowane moja wina SEG.
Wiem fread spowodowane moja wina seg, dlatego, że był
Linia właśnie wykonywane.
>> I jedyną rzeczą, która była dzieje się w tej linii -
Dwie rzeczy były dzieje.
Fread się dzieje, a potem byliśmy jakiejś kontroli czasu.
Jestem gotów się założyć, że PODCZAS kontroli nie był przyczyną mojej winy seg.
Najprawdopodobniej był fread powodując moja wina seg.
Widzę też coś tutaj, memcopy.
>> Kopia pamięci.
Brzmi jak przenoszenie z pamięci jednej lokalizacji do drugiej.
Brzmi jak coś, co by się stało w fread, być może niektóre pamięci
porusza się stąd tutaj.
Idziemy przez to jeszcze raz.
Jak uruchomić to na i uruchomić go ponownie?
Tak.
>> UCZEŃ 56: Czy należy umieścić Ampersand przed buforem?
>> JASON Hirschhorn: Więc Ampersand przed bufor da mi adres
bufor, który jest char *.
Przyjrzyjmy się przez to jeszcze raz.
Jak uruchomić przez to jeszcze raz?
>> UCZEŃ 57: można po prostu wpisz Uruchom ponownie?
>> JASON Hirschhorn: Wystarczy wpisać uruchomić ponownie.
Więc my nie będziemy wykonać tę linię.
Więc bufor jest wskaźnikiem NULL.
Poprawić?
To wskazuje na to - zobaczmy.
Jeśli mamy nasz -
narysować szybki obraz tego.
Czy każdy może sprawdzić, czy Piszę tutaj?
>> Więc w stosie, mamy lokalny Zmienna i to się nazywa bufor, i
jest to wskaźnik do char.
Co to jest adres char co?
>> UCZEŃ 58: 0x0.
>> JASON Hirschhorn: Prawo.
To jest to, co to jest.
Tu, wewnątrz bufora, jest przechowywany 0x0.
To jest to, co mamy - Konfiguracja mamy teraz.
Tak więc ta linia, fread, wrzuca coś od źródła, gdzie?
W tym polu lub w tym pudełku?
Które pole?
W lewo lub w prawo pole pole?
Prawo to okno.
>> Wynika z tego wskaźnika, i umieszcza go w tutaj.
Kiedy próbujemy i dotyk na pamięć położenie 0, co mamy?
Błędu segmentacji.
To jest błąd mamy teraz.
Tak.
>> UCZEŃ 59: Nie masz umieścić bufor gwiazda?
Czy nie?
Dla fread?
>> JASON Hirschhorn: Więc fread trwa wskaźnik.
Więc przechodzi ona w buforze.
A następnie będzie to de-odniesienia to gdzieś wewnątrz fread.
Ale znowu, widzieliśmy, że ma wskaźnik.
Nie trzeba przekazać mu gwiazda bufor.
Że byłoby przepuszczenie to, co jest tutaj.
I że prawdopodobnie da nam błąd bo my de-odwołanie go.
>> Prawda?
Ten wskaźnik, gdy odniesienie DE, gdy staramy się uzyskać dostęp do tej lokalizacji,
dostajemy błąd - nasza wina segmentacja.
Tak -
Ups.
Zamierzamy wyjść z gdb.
Nasza linia -
nasz problem - ma rację tutaj na tej linii.
I to jest problem, ponieważ tej linii.
>> Jak możemy utworzyć pole, które dostępny jest w fread.
Prawda?
Musimy utworzyć pole, które jest jednym Bajt duży rozmiar odbarwiającego.
Ale musimy to pole, aby były dostępne Gdy ta funkcja wykonuje.
Więc gdzie -
tak.
Jakieś pomysły?
>> UCZEŃ 60: Wystarczy ustawić go jako dowolny losowy charakter.
Wystarczy zrobić Char Równa buforze charakter.
A potem, kiedy już tam bufor -
>> JASON Hirschhorn: Czekaj.
Char bufor?
Więc nie gwiazda?
>> UCZEŃ 60: Tak.
Wyjąć gwiazdę.
Równa przypadkowy charakter.
>> JASON Hirschhorn: OK.
Więc daj mi jedną.
>> UCZEŃ 60: Jak lub coś.
I wtedy, gdy masz bufor tam, używasz -
>> UCZEŃ 61: Star?
O nie, Ampersand.
>> UCZEŃ 60: Użycie znaku handlowego.
>> JASON Hirschhorn: OK.
A co w fwrite?
>> UCZEŃ 60: ponownie użyć znaku handlowego.
>> JASON Hirschhorn: Dobrze.
Więc twój pomysł jest, tworzymy i char umieścić coś w nim, a następnie
Napisać do tego char.
>> UCZEŃ 60: Tak.
>> JASON Hirschhorn: Co ludzie myślą?
>> UCZEŃ 62: To zawiłe.
>> JASON Hirschhorn: OK.
Miejmy wyciągnąć go.
Więc tym razem, mam zamiar wyciągnąć to w czerwony na stosie tutaj, a potem
będzie miał -
ooh!
Przepraszam.
Więc tym razem mamy coś, co nazywa bufor, i to na stosie.
Poprawić?
I jesteśmy w niej oszczędności, początkowo.
>> Następnie mamy wywołanie fread.
Co fread nie jest potrzebny bajt z nasz plik i umieszcza go gdzieś.
To stawia go w jakikolwiek rzeczą jest wskazując.
Cóż, zanim mieliśmy ten adres -
0x0.
Teraz jaki adres mamy?
>> UCZEŃ 63: Cokolwiek bufor adres.
>> JASON Hirschhorn: Cokolwiek bufor adres.
To prawdopodobnie będzie coś w tym stylu.
Prawdopodobnie będzie zacząć bi f, a następnie mają sześć innych
cyfr szesnastkowych.
Nie ma znaczenia.
Niektóre adres.
I przekazujemy ten adres w.
>> I mamy zamiar umieścić nasz jeden bajt, co pod tym adresem.
Więc mamy zamiar umieścić nasz jeden bajt rzeczą wewnątrz tutaj.
A potem będziemy pisać od co jest zawsze wewnątrz tutaj.
Czy ktoś ma jakieś pytania o tym?
Kto myśli, że to zadziała?
>> Podnieś rękę, jeśli uważasz, że kod ten będzie działać.
Trzeba zająć stanowisko.
A kto myśli, ten kod nie działa?
Podnieś rękę.
Wszyscy powinni być podniesienie ręki.
OK.
Michael, gdzie stoisz?
>> Michael: Nie mogę się zdecydować.
Jakby w środku.
>> JASON Hirschhorn: Jesteś w środku.
Wybierz jedną.
>> MICHAEL: Będę mieć wiarę i powiedzieć, to będzie działać.
>> JASON Hirschhorn: OK.
Będziesz mieć wiarę i powiedzieć, że to działa?
Co się stało?
>> [GŁOSY wstawienie]
>> JASON Hirschhorn: Nie wina SEG.
Jak możemy sprawdzić, czy dwie rzeczy są równe?
Dwa pliki są równe.
>> UCZEŃ 64: Diff.
>> JASON Hirschhorn: Diff.
Różnica sprawdza różnice między dwa pliki, a jeżeli wraca
nic, że są identyczne.
A jeśli otwieramy, mamy nasz plik.
Więc to było właściwe rozwiązanie.
Spójrzmy wstecz na to jeszcze raz.
Właściwie nawet nie trzeba go zainicjować.
>> To będzie prawdopodobnie wyglądać trochę czystsze, jeśli nie szuka
coś losowo tam.
Punkt jest, co potrzebne do stworzenia niektóre miejsca do przechowywania coś z
fread i wziąć coś z fwrite.
I że coś musiało być lokalne zmienna na stosie - można
może już malloc'd trochę miejsca.
>> Więc tak naprawdę może mieć napisane malloc tutaj, i
że będzie pracował.
I wtedy byłby przechowywania nasze rzeczy gdzieś na stercie.
Ale to jest w rzeczywistości, prawdopodobnie, najbardziej eleganckie rozwiązanie.
Wystarczy utworzyć trochę miejsca na stosie na te rzeczy do zrobienia.
>> Chciałbym mieć dwie inne uwagi.
Jeśli było wziąć zakręt w tym i potem się na to zdobył, moje komentarze
byłby następujący.
Są 1 tu, do mnie, spójrz jak magia liczb.
Ten 1 pod względem fread, ma sens.
To jest kilka rzeczy, do odczytu lub zapisu.
>> Ale to właśnie tu należy pewnie coś jeszcze.
Tak więc to, co jest jedno rozwiązanie?
>> UCZEŃ 65: Wielkość bajt.
>> JASON Hirschhorn: Jak to?
>> UCZEŃ 65: Wielkość char.
>> JASON Hirschhorn: Wielkość char.
Tak, nie jest bajt typu.
Tak więc wielkość prac char.
Możemy mieć, na górze nasz kod, # zdefiniowane.
I nazywa coś BYTE to naprawdę char.
Faktycznie, nawet lepsze podejście mogło to -
uint.
Ktoś wie co to jest?
>> Przepraszam.
Mam go do tyłu.
Czekaj, nie.
W którą stronę to idzie?
Ktoś wie co to jest?
Tak.
>> UCZEŃ 67: mają pomóc ujednolicić rzeczy, które w różnych systemach
mają - jak liczby całkowite bez znaku że mają 8 bajtów?
>> JASON Hirschhorn: To Dokładnie tak.
Na różnych komputerach, rozmiar char -
zazwyczaj nie char.
Znaki są zazwyczaj jeden bajt.
Jednak rozmiar danych są inne typy różne rozmiary na maszynie 32-bitowym
w stosunku do maszyny 64-bitowym.
Uint8_t jest zawsze 8 bitów -
zawsze jeden bajt.
>> I muszę m.in., że standardowy plik int nagłówek.
Więc teraz, byłoby to zapewne Najlepszym sposobem, aby napisać kod.
Więc pozbyć się liczb magicznych.
I mam również bardziej logiczne wpisać do bufora.
To nie jest po prostu char, to bajt, co jest, co się spodziewać, że będzie.
>> A tutaj, w rzeczywistości mamy nieco bardziej wytrzymałe.
Nie będziemy nazywać to char, który -
być może, kto wie - może być inaczej Rozmiar na różnych maszynach.
Jesteśmy rzeczywiście mówiąc to jest dokładnie to, jeden bajt, zawsze, bez względu na to, co.
A jeśli spojrzymy tutaj, robimy cp.
Uh-oh.
Co się stało?
>> UCZEŃ 68: To może być przełączane.
>> JASON Hirschhorn: Co?
>> UCZEŃ 69: Czy to jest?
>> UCZEŃ 70: Nie określić jako rodzaj.
>> UCZEŃ 71: Ale to powinno zostanie określony w normie.
>> UCZEŃ 72: Co się dzieje?
>> UCZEŃ 73: W przypadku zdefiniowania być wszystkie czapki?
>> JASON Hirschhorn: Więc to nie jest # define.
Faktycznie, w tym przypadku, jestem zamierzasz używać typedef.
Ponieważ używamy go jako typu w jednym miejscu.
Więc w tym przypadku, tak naprawdę chcą typedef jakbyśmy drukowania nowego typu
bajtu i jest zasadniczo tego.
To jest nieco inny niż # define.
>> A teraz nasz kod działa idealnie.
Tak więc raz jeszcze, # define bierze coś, zastępuje go wszędzie
z innych rzeczy.
To tylko makro -
skrót pozbyć liczb magicznych.
Ale w tym przypadku, ponieważ jesteśmy używając go jako typ -
tu -
w postanowieniu, że do pracy, musimy do typedef co bajt.
>> A my definiowania go tutaj.
To nie jest struktura, to rzeczywiście tylko liczba całkowita bez znaku.
To długo, jeden bajt.
Kod ten będzie dostępny w sieci, a powinieneś mieć to wszystko teraz.
>> Więc mamy -
perfect -
13 minut w lewo, aby przejść nad problemem zestaw 5.
Chcę przejść przez copy.c razem, a następnie będziemy krótko mówić
o innych częściach problemu ustawiona.
Więc pozwól mi wyciągnąć copy.c.
I fajne jest to, rzeczywiście mamy już napisane dużo tego kodu.
>> Kod pisaliśmy dosłownie wyszedł z tego, kiedy byłem
piśmie, to na własną rękę.
Ale to copy.c, stanowi podstawę dla dwóch pierwszych częściach
Problem ustawiony na whodunit.c, która trzeba napisać i resize.c.
Recover.c, który jest trzeci i ostatni częścią zestawu problemów, nie jest
opiera się na tym pliku.
>> Będziesz musiał napisać, że plik, dajemy Ci za to szablon
plik, ale to nie ma nic zrobić z copy.c.
Ale ponieważ copy.c jest podstawą Pierwsze dwie części, będziemy
aby przejść przez to teraz, więc trzeba Poczucie to, co robi.
>> I komentarze dają niektóre z nich z dala.
Mamy już napisane trochę tego.
Po pierwsze, mamy upewniając mamy trzy argumenty.
Następnie mamy pamiętać nazwę pliku.
Więc odpuściliśmy ten krok, gdy mamy zakodowany naszą rzecz -
kiedy nasz cp.
Ale tutaj, to robisz to nieco czystsze.
>> Sprawdzają się upewnić, oba pliki są dobre, w
dodatek do ich otwierania.
Pisaliśmy cały ten kod właśnie teraz, więc jestem Nie zamierzam rozwodzić się nad tym kodem.
Dalej jest kilka rzeczy, które jest charakterystyczne dla typy plików używamy, które
to pliki rastrowe.
Pliki rastrowe jakieś metadane z nimi związane.
>> Tak więc pierwsze kilka bajtów powiedzieć o pliku.
Nie są kolory pikseli w tym obrazie.
Mówią ci o pliku.
A jeśli czytasz przez zestaw problemów, będziesz miał dużo więcej informacji
na jakie rodzaje struktur metadanych są z bitmapami.
>> Ale właśnie dlatego mamy ten pierwszy zestaw - tego kodu tutaj.
Czytamy metadane -
dwa kawałki - plik metadanych Nagłówek i nagłówek informacji.
I sprawdzamy pewne jej części do upewnij się, że jest to prawda, plik z obrazkiem
przed kontynuowaniem.
>> I znowu, że dane te są nie musisz iść do teraz.
Jeśli czytasz przez zestaw problemów, zrozumiesz to.
Krótko mówiąc, są one po prostu mówiąc, to jest plik z obrazkiem, a
potwierdzający.
>> Następnie piszemy te do pliku na zewnątrz.
Widzimy, że tutaj.
Piszemy na zewnątrz wskaźnika.
Następnie mamy do określania dopełnienia.
Ponownie więc, jak to jest w szczególny plik bitmapy, niektóre linie należą
Wyściółka na końcu.
A jeśli czytasz przez zestaw problemów, dowiesz się więcej o dopełnienie.
Jest to formuła, aby znaleźć dopełnienie.
>> Ważne, aby pamiętać -
podczas zmiany rozmiaru mapy bitowej plik, zmiany padding.
Po zmianie rozmiaru plik, zmiany padding.
To nigdy nie będzie większa niż 3 -
będzie to 0 do 3 włącznie.
Ale po zmianie rozmiaru coś zmienia wypełniające.
>> Jeśli mam tylko jeden piksel w tym wierszu, ja Potrzebujemy trzech bajtów wypełnienia, ponieważ
każdy rząd musi być wielokrotnościami czterech bajtów w pliku mapy bitowej.
Ale gdybym go dwukrotnie, aby przejść z jednego piksela do dwóch pikseli, z których każda
powiedzmy, jest bajt, potem muszę dwa bajty dopełnienia zarabiania
że równa cztery.
>> Kiedy więc zmienić rozmiar czegoś, Muszę zmienić ilość
padding mam.
Czy to ma sens dla wszystkich?
Następnie, iteracyjne nad każdym wierszu, lub przez wszystkie rzędy.
A potem iteracji Każda kolumna w każdym rzędzie.
Traktujemy to jak bitmapy sieci, jak mamy traktować
wyżywienie w 15.
>> Podobnie jak my, gdy traktuje cegły zadrukowaliśmy ich na ekranie.
Siatka z wierszy i kolumn.
Następnie - widzieliśmy to.
My właściwie tylko kodowane to.
Stworzyliśmy pewne czasowego składowania.
Czytamy tam, a następnie piszemy go.
To jest dokładnie to, co właśnie zrobiliśmy.
>> Następnie, ponieważ powiedziałem każda linia kończy się w jakimś wypełnieniem, mamy
pominąć tego obicia -
stare wypełnienie.
, A następnie dodać go ponownie.
W tym przypadku tworzymy dokładnie taki sam plik.
Jesteśmy po prostu skopiowanie go.
Więc to jest to trochę głupie.
Moglibyśmy dosłownie umieścić dopełnienie w.
>> Ale jeśli zmienisz rozmiar pliku, Czy nadal chcesz ten wiersz?
Jeśli więc zmienić rozmiar pliku, Czy nadal chcemy pominąć
na stare wykładziny?
>> UCZEŃ 74: Tak.
>> JASON Hirschhorn: Więc robimy.
Ponieważ to, ponownie, promocje z pliku źródłowego.
Nie dbamy o obicia z pliku źródłowego.
Chcemy, aby przejść do następnego wiersza.
Ale nie po prostu umieścić z powrotem stary ilość wypełnienia.
Musimy umieścić z powrotem Nowa kwota wyściółką.
>> Więc kiedy mamy zmianę rozmiaru plik, nadal chcemy pominąć
wyściółka w starym pliku - co czytamy w od.
Ale to, co piszemy, aby, jedziemy celu należy umieścić z powrotem jakiś inny
wyściółką, że liczba mamy ustalone.
Tak.
>> UCZEŃ 75: kolejność tych dwóch linie nie ma znaczenia, prawda?
Bo jesteś obsługi różne pliki.
>> JASON Hirschhorn: Dokładnie.
Kolejność tych dwóch linii nie ma znaczenia.
Piszemy tę linię.
To tutaj, w pliku piszemy do.
To ważne, więc dostajemy odpowiednią ilość wypełnienia.
To ma do czynienia z pliku w.
Chcemy, aby przejść w prawo nad wypełnieniem.
>> Nie chcemy, aby przeczytać -
jeśli czytasz bajt w czasie, nie dbają o tych bajtów wypełniających.
Chcemy, aby przejść do następnego wiersza.
Wreszcie, podobnie jak Lucy dał za nas, zamykamy pliki i zwraca 0.
Więc to jest copy.c.
I faktycznie napisał - spędziliśmy większość Sekcja pisanie to, w istocie.
>> Zrobiłeś to.
Więc mam nadzieję, że masz dobre poczucie tego, co się tu dzieje.
Duża różnica, szczerze mówiąc, to tylko ta pierwsza część, która zajmuje się
osobliwości plików bitmapowych.
Więc mam jako mojego następnego slajdu, co musimy zrobić?
Cóż, pomyślmy o whodunit.
>> A dla kogoś, kto przeczytać ustawić problem, co my
trzeba zrobić w whodunit?
Po prostu.
Aleja.
>> ALEJA: Czy można wyjąć część każdego piksela oznaczająca czerwony.
A następnie -
rodzaj?
>> JASON Hirschhorn: OK.
Więc wyjąć część każdego pikseli, które oznacza czerwony.
To jest blisko, ale nie wszystkie.
>> UCZEŃ 76: No cóż, nie ma różnych sposobów, aby to zrobić.
>> JASON Hirschhorn: OK.
Daj mi jeden sposób.
>> UCZEŃ 76: Wyjmij cały czerwony, i następnie podkreślić, niebieski i zielony.
>> JASON Hirschhorn: OK.
Tak więc biorąc pod uwagę oba te sposoby -
to brzmi jak damy mu piksel, to ma czerwony, niebieski i zielony poziom.
Chcemy zmienić względne poziomy czerwony, niebieski i zielony, w zależności
na tego piksela.
Gdzie w tym kodzie należy zmienić względem czerwony, niebieski i zielony
poziom określonego piksela.
Po czytaliśmy go -
Zanim napiszemy go?
Daj mi numer linii.
>> WIELU STUDENCI: 83.
>> JASON Hirschhorn: 83.
Więc tutaj.
Dla whodunit kod trzeba zapisu powinniśmy iść tam.
I to jest tylko kod trzeba napisać.
Ponieważ, jak słyszeliśmy, wszystko, czego potrzebujesz, aby zrobić, to zmienić te względne niebieski,
czerwone i zielone poziomy z każdego piksela.
>> Czytasz go w, a teraz jesteś napiszę to.
Jak uzyskać - jeśli mam to coś nazywa potrójny, tutaj, i to z
wpisz RGBTRIPLE -
dobrze, jeśli spojrzał w bmp.h, co jest RGBTRIPLE?
>> UCZEŃ 77: To jest struktura.
>> JASON Hirschhorn: RGBTRIPLE jest struktura.
Widzimy, że aż tutaj.
I tak, jeśli chciałem dostępu, powiedzmy, czerwony poziom struktury, jak to zrobić
przejść czerwoną poziom tej struktury?
>> [CLASS pomruki]
>> UCZEŃ 78: RGBTRIPLE.rgbtred?
>> JASON Hirschhorn: Czy to prawda?
>> UCZEŃ 79: Powinno być potrójna kropka, zamiast RGBTRIPLE kropki?
>> JASON Hirschhorn: Triple.
Triple jest zmienną lokalną, więc tutaj, jest tutaj nie ma wskazówek.
Więc po prostu użyć notacji dot.
To daje mi poziom czerwony.
Jeśli chcesz to zmienić, po prostu ustawić to równać do czegoś innego.
Więc jeszcze raz, ta linia kodu dostępu zmienna ta wewnątrz tej struktury, a
możemy ustawić go na coś nowego.
>> Więc dla whodunit, ponownie, jest to, w istocie to, co musimy zrobić.
Bardzo proste.
Wystarczy zmienić niektóre względne poziomy i to gdzie ten kod idzie.
Zmiana rozmiaru, z drugiej strony, jest nieco trudniejsze.
W rzeczywistości, to prawdopodobnie zmiany rozmiaru Najtrudniejsza część tego problemu ustawić.
Mamy trzech minut, aby przejść nad nim.
>> Ale znowu, już napisane większość z tego kodu, więc
powinno być dość znajomo.
Jakie są pewne rzeczy, które chcemy zrobić w zmiana rozmiaru, jeśli już przeczytać
ustawić problem?
Jeśli dasz mi je, my może o nich mówić.
Jakie są pewne rzeczy, które chcemy zrobić?
>> UCZEŃ 80: w pionie -
więc musisz zmienić jego rozmiar w poziomie, ale pionowo zmienić jego rozmiar, jak również?
>> JASON Hirschhorn: Więc jeśli mamy podane pikseli, i chcemy go zmienić rozmiar
współczynnik dwa, teraz muszą być zmieniany poziomo i przeskalowane
pionowo.
Czy to ma sens?
Tak.
Tak, to jest to chyba Największym wyzwaniem.
I porozmawiamy o tym za sekundę.
Tak.
>> UCZEŃ 81: sposób myślałem o tym było potrzebne wydrukować -
>> JASON Hirschhorn: Czekaj.
Nie wolno nam powiedzieć, co zrobiłeś.
Mamy zamiar rozmawiać w logice.
>> UCZEŃ 81: OK.
Jakie było pytanie?
>> JASON Hirschhorn: Po prostu podniósł rękę.
Nie było mowy.
Pozwól mi przedstawić go.
Powiem tylko krótko omówić ten.
Mamy więc jeden piksel, chcemy replikować go, zarówno w poziomie i
pionowo.
Tak doskonale, co robimy tutaj jest, że czytaj w naszym piksel, możemy napisać
Jednakże wiele razy.
>> Ale mamy tu podstęp, bo to chcemy, aby przejść do
następna linia i pisać to co początku następnego wiersza.
Więc jeśli chcemy powtórzyć zarówno w pionie i poziomie, co jest
Dobrym sposobem, aby to zrobić -
jedno dobre, choć to zrobić?
Więc nie trzeba ciągle szukać wokół naszego pliku, aby umieścić rzeczy.
>> Pytanie to może nie mieć sens, ale myślę,
odpowiedzieć na to pozwoli.
>> UCZEŃ 82: Stwórz tablicę?
>> JASON Hirschhorn: Więc pomyślmy każdego pliku jako rzędu.
Zastanówmy się w kategoriach wierszy.
Jeśli mamy pierwszy wiersz z nasza mała obraz, możemy dokonać tego wiersza
w dużym rzędzie z dużym obrazie a następnie powtórzyć ten wiersz jednak
wiele razy to musi być powtórzone, a nie będzie piksel po pikselu,
które dostaje mylące, gdy do czynienia z plikami.
>> Bo gdybyśmy mieli -
Kończy mi się miejsce.
Jeśli to jest nasz plik, a my mamy, że jeden piksel tam, i chcemy go umieścić
tam, mamy jeszcze kilka rzeczy że trzeba iść tam, gdy jesteśmy
pisania i tworzenia naszego nowego pliku -
Nasz plik jest dwa razy większy.
>> Ale jest to naprawdę trudne z funkcjami plików , aby przejść do nowych linii wokół
tak, a potem wróć tutaj i umieścić rzeczy w środku.
Jest prawie niemożliwe, aby coś zrobić tak, czy to ma sens.
Więc jeśli myślimy w kategoriach wierszy, możemy wziąć nasz rząd, a następnie umieścić go -
replikować wierszy w pionie.
>> I w ten sposób mamy do czynienia z rozmiaru pionowo, a nie poziomo.
Że niby szybkie i trochę mylące.
Niestety, nasz czas się skończył.
Stanę na zewnątrz dla tych z was, tutaj, którzy mają pytania dotyczące
Zestaw problemów, w tym odzyskania.
>> Warto więc odroczyć do teraz.
I znowu, jeśli masz jakiekolwiek pytania, możemy porozmawiać na zewnątrz.