>> JASON Hirschhorn: Добре дошли, всички, до седмица 6.
Щастлив съм да ви видя жив и здрав след Quiz 0, защото знам, че
беше малко груб.
Но за щастие, всичко, което Направих невероятно добре.
И така, това е чудесно.
Ако сте в моята секция, дадох най- от вас архивирате вашите викторини вече.
>> A двойка на вас, аз имам среща след края на тренировката.
И ако сте студент разширение и не сте получили вашия викторина обратно
все пак, си TF е вероятно работи по него и класификация, и ще го върна
до вас скоро.
Така че моята удължители студенти, които са гледам точно сега - надявам се живее -
Ще получите вашите викторини скоро, както добре.
>> Нашият дневен ред за днес е, както следва.
Първо, ние ще разгледаме някои ресурси, които CS50 ви предоставя.
Отиваме да премине Quiz 0 следващия, и Аз ще отговоря на всички въпроси на никого
има за конкретни проблеми.
И след това, ние ще се случва през файл I / O и проблем комплект 5.
Тези последните две теми ще вземат съставляват основната част от раздел днес.
>> Сложих този списък до всяка седмица като напомняне за всички вас, но на ядрото
раздел, ние имаме само 90 минути - ние не са в състояние да покрие всичко, което съм
Ще се радвам да се покрие за вас, момчета.
Но ние имаме тон на ресурси за да разчита и както можете да се знае
материала и работата чрез проблема си задава.
>> A напомняне, че имам онлайн текстов кутия, създадена за вас, за да попълните, ако
имате отзиви за мен, както положителни, така и
конструктивно, за раздел.
Това URL се намира точно тук.
Така че, моля, отделете малко време, ако имате някакви обратна връзка, независимо дали по време на секция,
или след това, или след като гледате видеото онлайн, за да ми дадете вашето мнение.
Аз наистина оценявам всички и всичко.
>> Така че аз бях като малки разговори с много от моите
студенти в цялата седмица - както аз ръка назад викторини, говорим за
Разбира се, като видя как се справяте.
И една тема излезе отново и над в говорим за - в
специално -
проблем поставя.
И съм капсулиран тази тема на борда в момента.
>> По същество, има разлика между превръща в нещо, което е
направено правилно и нещо това е направено добре.
Повечето хора са били прави фантастичен от гледна точка на коректност -
5 или 4 по всички psets.
Повечето хора стават тези през цялото време.
>> Въпреки това, само защото сте направили нещо правилно не значи, че съм
направил нещо както елегантно, или ефективно, или като чисто, колкото
би могъл да го направи.
И това е, което дизайнът -
и в по-малка степен, стил -
оси са за това.
Така че аз съм всичко, което бутане, и други TFS се мъчим вас, момчета, не само от своя страна
в неща, които са верни, но се обръщат в нещата, които са кодирани добре.
>> Не прави ненужни за контури, не преизчисляване променливи ако
не е нужно да.
Например, гледайки назад към определен проблем 4, когато пускат тухли на на
екрана, всеки ред - всяка тухла в даден ред има същата Y-координата -
на същата височина координата.
>> Така, че Y-координата не трябва да се изчислява вътре в интериора
вложени за линия, която вероятно сте използвали да поставят тези тухли на екрана.
Необходимо е само да се изчислява всеки път, когато замени на ред, или
премества надолу един ред.
Така че, ако се каже, че има 10 тухли в ред, всяка тухла може да имат едни и същи
Y-координата, и че г-координира просто може да се изчисли
веднъж за всички тях.
>> Той не трябва да се изчислява 10 пъти, нито пък това изчисление нужда
да се случи по отношение на реалното извикване на функция -
новата gracked извикване на функция.
Така че, ако това беше малко объркващо за вие, по-обширно, неща, които
не е необходимо да се случи всеки път минете през за линия не трябва да бъде
сложат примката ЗА, и не трябва да се случва всеки път, когато отидете
през примката ЗА.
>> Друг добър пример дизайн видяхме в Седмица 3 за 15, може да се запази
следите на нула.
Така че, когато се инициализира на борда, вие запишете - в условията на глобална променлива, може би -
Х и Y-координата на нула.
И тогава, когато -
във вашата функция ход, всеки път, когато правите успешен ход, можете да актуализирате
Местоположение на нула.
>> Това ще ви спаси от налага да правя вложени ЗА линии да погледнете през
качат всеки път във вашата функция ход и да намерят нулата, или да се намерят на плочката,
и след това се провери какво е в непосредствена близост до него.
Вместо това, вие трябва местоположението на нула, вие може просто да погледнете по-горе, долу,
и вляво и вдясно от нея, за да намерите плочката, което търсите.
>> Така че по отношение на програмите, ние сме писане, те никога не са достатъчно големи,
че някои от тези дизайнерски решения наистина ще ви затрудни
програма, или да го изпълним по-бавно, или може би дори изчерпване на паметта.
Но ние все още ви бутане момчета да пиша като елегантен и
ефективно код, колкото е възможно.
>> Така че, ако го направите в крайна сметка писмено неща , които имат значително по-голям
обхват, те ще бъдат написани с добра дизайн в допълнение към е правилен.
Така редица имате донесе това.
Това е нещо, което търсим - нещо, което ще продължи да
натиснете момчета нататък.
>> Ако някога имате някакви въпроси относно дизайн на вашата програма, не се колебайте
да достигне до мен, и аз съм щастлив да ходи чрез вашата програма с вас,
и изтъкват някои от дизайна решения, които сте направили, и ще ви даде някои
предложения за това как да се направи дори и по-добри дизайнерски решения.
>> Така че ние ще продължим да говорим за Quiz 0.
Преди да направите това, има ли някой имате някакви въпроси за това какво
Аз бях обхваната досега?
>> [Шумолене NOISE]
>> JASON Hirschhorn: Седем секунди.
OK.
Нека поговорим за Quiz 0 за малко.
Повечето от вас са си Quiz 0 обратно.
Ако не, да се надяваме си спомните малко.
Но ако сте взели Quiz 0, тогава също така има достъп до PDF онлайн в
разтворите проби.
>> Дали някой има някакви въпроси, преди да ние скочи в материал на седмица за
конкретен проблем на Quiz 0 -
Затова отговорът е какво е то?
Има ли някой объркан за нещо?
Дори ако имаш проблем прав, но Просто бих искал аз да го обясня малко
повече, аз съм щастлив да го направи сега.
>> Така че аз помолих вие да са подготвени с някои
мисли за Quiz 0.
Така че, който би искал да ни започна с въпрос или
коментирам Quiz 0?
>> [PAPER шумолене]
>> JASON Hirschhorn: Не всеки Направих перфектно.
Така че знам [смее се]
трябва да има някои въпроси Quiz около 0.
OK.
Да.
Ompica.
>> OMPICA: Номер 10.
>> JASON Hirschhorn: Номер 10.
Кой е номер 10?
>> OMPICA: The -
>> JASON Hirschhorn: I haven't -
>> OMPICA: Включи -
>> JASON Hirschhorn: Номер 10 е осем до I - писмено осем да го правя?
>> OMPICA: Да.
>> JASON Hirschhorn: OK.
Така че още един въпрос, който би могъл да има попита бе съм прозорлив?
Отговорът е да.
В раздел преди теста, аз попитах вие да кодекс, както и Sterling
осем до аз.
Двете от тях се е случило с се появи на теста.
Така че, надявам се, сте платили внимание на това.
>> И ако сте имали, тогава вие ще трябва вероятно се справили добре на тези двамата.
Но осем до I, ние всъщност не код че в този клас, но е отново
попита на теста.
Така че няколко неща, за да вземат имайте предвид, когато кодирате осем до аз.
Първото нещо, на въпроса, беше че ви е необходимо да се провери дали низа
е равна на нула.
>> Няколко души се опитаха да проверите по-късно в програмата, ако и аз бях скоба -
толкова специфичен характер в тази низ - е равна на нула.
Но не забравяйте, че нищожна е по същество - това е добре да се мисли за
нищожна като показалка нула - указател към нула -
някъде в паметта, където Вие никога не може да има достъп.
>> Така че, ако нещо не е равна на нула, вие Знам, че това не е инициализиран,
или там няма нищо.
Така и е Чар звезда, S скоба и е Чар.
Така че има смисъл да се сравни и с нула, но не и аз скоба за нула.
Но отново - така че това е първото нещо, че е трябвало да се направи -
проверка, за да се уверите, че сте в действителност Има реална низ.
>> След това, което искаше да мине през всеки знак в низа.
И така, това ще бъде като скоба и Аз, например, ако аз си е итератор.
И вземи този характер, и получите действителната му стойност.
Можете да го съхранява като знак, но Стойността на ASCII за нула -
нула като характер -
всъщност не е цяло число нула.
Това е някакъв друг номер, който можете да погледни нагоре в таблицата на ASCII.
>> Така един начин да се коригира, че - вероятно най-добрият начин да се коригира
че - се изважда от него стойността характер -
нула като характер.
Така минус апостроф, нула, друг апостроф.
Това ще отнеме независимо от броя имате като знак, и да се получи равна на
броя и реално число.
>> И това е много подобен на подхода много хора е предприела в съответния
проблем комплект 2, с Caesar и Viginere -
тези цифри, когато са ги върти.
Така че, след като го има като номер от нула до девет, а след това - в зависимост от
където тя отива в крайната броя - трябва да го умножете
с мощност от 10.
>> Някои хора се движеха от обратно към отпред, и умножено индивида
номер с мощност от 10.
Някои хора се преместват от на предната към задната -
и така взе най-високите поредни номера първо -
и ще спести тези в глобален брояч променлива.
И след това всеки път, чрез FOR контур, умножете, че гигантска глобална
противодействие на променлива от 10, за да се направи пространство за следващата Чар.
>> Така че това е малко объркващо, без ми да я пиша на дъската.
Но разтвора на пробата е достъпна за вас.
Но тези, които са най-големите неща ние търсехме.
Също така една проверка, за да се уверите, че всеки индивидуален характер наистина е
характер между нула и девет, и не някакъв друг характер, като A,
например.
>> Това бяха нещата, които търсеха в този въпрос.
Това отговаря ли на въпроса ти?
>> OMPICA: Да.
>> JASON Hirschhorn: OK.
Има ли някакви други въпроси Quiz около 0?
Какво ще кажете за съставяне?
Всички съставянето нали?
Не.
Имаше -
[Смее се]
Всякакви въпроси относно процес на компилация?
Wow.
>> [PAPER шумолене]
>> JASON Hirschhorn: Да.
Майкъл.
>> MICHAEL: е номер 7 - на случаен принцип?
>> JASON Hirschhorn: Number 7.
Номер 7 е получите случаен число.
Отлично.
Значи дадено цяло число е и б число, и искате случаен
число между а и б.
Ние всъщност може да напиша тази една на борда, защото това едно
Беше един ред с код -
един начин да го направя.
>> Така че не ни дават drand като функция бихме могли да използваме.
И какво прави drand -
ако приемем, че е бил посят -
какво drand върне?
>> MICHAEL: A плувка между 0.0 и 1.0.
>> JASON Hirschhorn: A номер - да.
A число между 0 и 1.
И така, ние сме В и А.
И тогава ние имаме случайни числа между 0 и 1, предоставени ни от drand.
Някои хора се опитаха да издигнат б, или б минус а, или нещо вътре в тези
скоби.
Това би означавало, че те са аргументи за тази функция.
>> drand не предприема каквито и да било аргументи - като getString прави
Не приемайте никакви аргументи.
Така че това е просто отворете Paren, близо Paren - и че се е
извикване на функция.
И това дава редица между 0 и 1.
Разбира се, ние разполагаме с голям набор които номера могат да бъдат инча
>> Кажете, ако б е 10 и е на 5, ние наистина Искам число с обхват от 5.
Така че следващото нещо, което трябва да направите, е да умножи тази от диапазон б минус.
Така че, ако се приеме, че е умножено.
И това ще ни даде редица в рамките на определен обхват.
И този специфичен диапазон се на разлика между б минус.
>> И най-накрая, че само ще го дам от - казват диапазона между б минус
е 5, това ще ни даде число от 0 до 5.
Но ако в действителност е 5, ние трябва да се засили този диапазон до където е
всъщност трябва да бъде, чрез добавяне на.
Така че, който получава логика правото на.
И след това, ще имате още един въпрос?
>> MICHAEL: Не.
Аз просто се чувствам наистина тъпо точно сега.
[Смее се]
>> JASON Hirschhorn: Не.
Да не се чувстват наистина тъпо.
А броят на хората се бореше с този въпрос.
И след това, друг въпрос е, drand, ти каза, ти дава плувка -
връща плувка.
Но тази функция всъщност попита за цяло число, се връща.
>> Не е нужно да се хвърли този изрично до цяло число, тъй като те
операции ще го третира като всичко плаваш - като число с плаваща запетая.
Подобно на тази воля - дори ако това е цяло число, това ще
се умножава правилно.
Всички размножаването ще работи.
Вие не трябва да го хвърли тук.
Всъщност, вие не трябва да го хвърли.
>> Това би -
ако искате да хвърли брой Това е между 0 и 1 -
случайно число, плаваща точка -
след това може да бъде или само 0 или 1, така че ще загубиш всичко това прецизност.
Но в края на краищата, когато се върнете, той автоматично получава
изпратен обратно като цяло число.
Така че не е нужно да правите кастингът себе си.
>> Така че това е отговорът на този въпрос, номер 7.
Всякакви други въпроси, свързани с Quiz 0?
Да, Ани.
>> АНИ: Когато ние използваме рекурсивно -
когато ние използваме итеративни цикли?
>> JASON Hirschhorn: Когато използвате рекурсивни - толкова по-общ план,
Плюсове и минуси на рекурсия срещу итеративен подход.
Може ли някой да предложи про или против?
Моля?
Не мога никого.
Кой може да предложи професионалист или мошеник?
>> [PAPER шумолене]
>> СТУДЕНТСКИ 1: Recursive е по-малко кодиране - по-малко писане?
>> JASON Hirschhorn: Така че като цяло, рекурсия особено, функция -
или алгоритъм, като се сливат вид - който се поддава
да рекурсивен подход -
може да бъде по-ясно за кодирането рекурсивно.
И просто да има повече смисъл да го направи рекурсивно.
Така че това ще бъде професионалист да рекурсия.
Други?
Да?
>> STUDENT 2: Con да рекурсия -
Той използва повече памет.
>> JASON Hirschhorn: Значи точно така.
A рекурсивна функция ще поддържа добавянето стак рамки до комина.
Така че, ако сте работещи на много номера, и трябва да се обадя тази
функционира много, тогава вие със сигурност ще заемат повече памет, докато
итеративен подход само ще постави един стека кадър в стека, защото
всичко това се случва в рамките на една функция.
>> Всякакви други плюсове и минуси?
Да.
>> STUDENT 3: Плюсове за рекурсия.
Вие не трябва да се определи в предварително колко пъти
код трябва да се повтори.
Вие може да има предварително определен брой пъти, че вие ​​трябва да превъртите, след това
рекурсия е по-добре, защото е необходимо този резултат.
>> JASON Hirschhorn: Мисля, че това е вярно.
Но мисля, че и в двата случая Вие никога няма да -
вие вероятно ще получите някои принос от страна на потребителя.
Или тази функция ще има някакъв вход че ще определи колко пъти го
би трябвало да работи.
Така че, като цяло, може би не е трудно код - дори в един повтарящ се подход - как
много пъти, че линия не трябва да се изпълнява.
>> Имали ли сте друг бяхте мисля за, Ани?
OK.
Така че тези, които са може би две -
най-големият професионалист и най-големите CON да рекурсивно срещу
итеративен подход.
OK.
Нещо друго Quiz 0?
>> Нека продължим.
File I / O. Има чудесен краткотраен тази седмица на файл I / O, която се надяваме,
сте гледали множествена пъти, и се възхищавал.
A много работа отиде в това, и аз съм Чух, че е безумно полезно.
Аз също се включват връзката на този кадър, в случай, че не са имали
шанс да го гледам 10 пъти.
>> Така че, ние ще накратко да разясни на Основните стъпки за отваряне и работа
с файлове, и след това ние ще се потопите в проблем за кодиране преди
разглеждането на снимачната площадка проблем.
Така че отново, аз отивам да се сложи това нагоре по екрана, но аз няма да ви говоря за
само за една минута за това, което сме правиш тук с файл I/O--
какво означава това?
>> Това означава, че ние можем да създадем нашия програми, а след това са нашите програми
изход, и не са направили никакво въздействие върху външния свят на нашата програма.
Но когато започнем работа с файлове - както ги четете в и създаване на
тях - ние можем да имаме някакъв ефект върху свят извън нашата програма.
>> Точно както, ако Microsoft Word не можа да направи каквито и да било документи на Word, след това
веднъж Microsoft Word се откажат, всички ваши работа ще се отиде, и би
наистина е безполезен.
В крайна сметка ние искаме да бъде в състояние да пишат програми, които могат да повлияят на
свят около тях, както чрез предприемане на сложни входове - от гледна точка на файлове и
чрез файлове, а също и създаване на интересен и непреодолими изходи -
по отношение на различни видове файлове.
>> Така че това е защо ние започваме да научите как да работите с файлове.
По-конкретно, какво което правим, е както следва.
Това е много проста.
Има само няколко стъпки, и те са изброени тук, на този код.
Така че ние ще да мине през този кодекс ред по ред.
>> Първо, вие виждате подчерта -
когато работите с файл, независимо от вида на файла, то е,
трябва да го отворите.
И това е с призив за Fopen -
точно тук.
Можете да включва името на файла.
Ако файлът не е във вашия указател, или папката, където тази програма
животи, тогава вие също трябва да се включат път до мястото, където този файл е.
>> Отиваме да се предположи, че това файл, наречен "text.txt" -
обикновен текстов документ - е в режим същата папка като тази програма е.
Така че, това е друго нещо, за да се запази в предвид - че, ако искате да отворите файл
някъде другаде, действително имате нужда да включва местоположението му.
>> Второ, може да премине аргумент за FОтваряне на, и това е, което искате да направите,
с файла.
Има три основни доводи, че ти започваш да се премине към Fopen.
Кой може да ми даде тези три?
Кой може да ми даде една от тях?
Да.
>> STUDENT 4: Името на файла?
>> JASON Hirschhorn: Съжалявам.
Три основни доводи можете да преминават като втори аргумент на Fopen.
Прав си - името на файла е първият аргумент.
Но на втория аргумент да Fopen са общо три струни, и - да.
Aleja.
>> Aleja: А за добавяне.
>> JASON Hirschhorn: A, ако искате да добавите към файл, който вече съществува.
>> STUDENT 5: R за четене.
>> JASON Hirschhorn: R, ако Искам да се чете от файл.
>> STUDENT 6: W за запис.
>> JASON Hirschhorn: И w, ако искам да пиша във файл.
Така че в този случай, ние пишеш до файла, така че ние имаме вата
Можете да го отворите, вие също трябва да запишете подаде някъде, и това е с
код към лявата страна на оператора за присвояване -
Аз съм създаване указател към файл нарича, в този случай, файл.
>> Ние няма да се притеснявате какво това всички капачки FILE нещо е.
Достатъчно е да се каже, това е дълъг поток от нули и единици.
И това е, как ние ще се го оперират и да го разбере.
>> Следващото нещо, което трябва да направим - и това е изключително важно -
всеки път, когато отворите файл -
В действителност, всеки път, когато ти се обадя изчистване, за Например, и да получите някои памет и опитайте
и да го запишете в указател, винаги искате да проверите за да сте сигурни, че това
функция не се върне нулева.
>> Така че в този случай, ние се проверка, за да се направи сигурни, че ние всъщност отвори
подаде правилно, и имаше няма грешка в нашата програма.
На следващо място, след като ние сме проверени, за да се уверите, че имаме работа файл, ние можем
пишете, или се отчита, или да приложи към преписката.
В този случай, аз съм просто печат една линия до този файл.
>> Как мога да разбера това?
Е, аз съм с помощта на тази функция наречен fprintf.
Всички функции, които ще използват при писане на, или четене от, или
манипулиране на файлове ще бъде подобна на функции, които сте виждали и преди, но
започне с буквата F, престои файл.
И fprintf, за разлика от нашия нормален печат ап, отнема един допълнителен аргумент,
и това е файл, където можете искате да отпечатате тази линия, за да.
>> Аз нямам нищо, за да правото на Ohai.
Аз не разполагат с трети аргумент за ФОРМАТ -
или втория аргумент да ФОРМАТ, на третият аргумент на fprintf, защото аз
нямат никакви контейнери тук.
Аз не съм включително всички променливи.
Но отново, fprintf и всички тези файл функции, които работят с файлове
обикновено ще се нуждаят файла , на която те са оперативни.
>> И накрая, последната важното е да се направите, е да прекрати преписката, точно като
с - всеки път, когато ние изчистване нещо, ние искаме да се освободи нещо, за да не
има изтичане на памет - ние искаме да закрие нашия файл.
Ако тази програма излезе без затваряне файла, шансовете са, нищо няма да отидете
обърка, особено ако тя Беше малък файл.
>> Но това със сигурност е добро кодиране стил и практика винаги да затворите файл
, когато сте готови да я използвате.
Така че това е на основите на файл I / O. Вие вероятно сте виждали преди, или
го гледахме в тази фантастична кратко.
Дали някой има някакви въпроси, преди да отиваме в някаква практика кодиране
проблеми, около файл I / O или стъпки, аз току-що преминаха?
>> [ТИПИЗИРАНЕ SOUNDS]
>> JASON Hirschhorn: ли имам един въпрос, Ави?
>> AVI: Не.
>> JASON Hirschhorn: OK.
Отивам да се изчака още един седем секунди.
[Смее се]
Това е един наистина добър съвет.
Вие, момчета, просто не обичат задаване на въпроси.
Това е добре.
OK.
Така че нашият проблем първата практика е, ние сме няма да дублира функцията на
командния ред инструмент, че най-вероятно използван преди - копие -
функцията за копиране.
Ако изпишете CP и след това да го давате две аргументи във вашия терминал, можете да
копиране на файл.
И това е, което ние ще да пиша точно сега.
>> Така че отново, четене на разстояние от този слайд, бих можете да се напише програма, която се
две и само две от командния ред аргументи -
файл източник и файл местоназначение -
и копия на съдържанието на източника файл към целевия файл
един байт в даден момент.
Така че това е много, за да поиска.
>> Отново добър подход към това е да се не отиде направо в кода на C, но
се раздели на няколко етапа.
Първо, мисля, че за логиката - точно това, което аз ви моля да се направи -
и да разберат всичко на стъпки на този проблем.
Не е в C, само в някои pseudocode, или дори един мисловен модел на
какво става.
>> След това, след като имате pseudocode надолу, разбера как pseudocode
карти върху инструменти и неща, с които сме се се научили да използват в C.
>> И най-накрая, след като имате всичко, което заедно, можете да пишете на проблема.
Вземете 5 до 10 минути, за да работим по този проблем.
Ще сложа инструкциите обратно в секунда.
И тогава ние ще отидем на pseudocode и код
тя живее като група.
>> Ако имате някакви въпроси, докато сте работи по този въпрос, не се колебайте да се повиши
ръката си, и аз ще дойда около и отговори на тях.
>> STUDENT 7: Мога ли да тласнете парче хартия?
>> JASON Hirschhorn: Какво става?
>> [ТИПИЗИРАНЕ SOUNDS]
>> JASON Hirschhorn: OK.
Нека да отидем на pseudocode първо, и тогава аз ще ви дам няколко по-
минути, за да завърши кодиране.
>> Кой би искал да ме започнете с първа линия на
pseudocode за тази функция?
>> STUDENT 8: Проверете, за да се уверите, че които са ти дадени два файла.
>> JASON Hirschhorn: OK.
И ако ние не сме?
>> STUDENT 8: Бих се върне 0.
>> JASON Hirschhorn: Трябва ли да се върне 0?
>> STUDENT 8: Връща -
нулиране.
Извинете.
>> JASON Hirschhorn: Да.
Вероятно не 0.
Тъй като 0 означава, че всичко е добре.
OK.
Така че това е на първа линия на pseudocode.
Кой е на втора линия на pseudocode?
>> STUDENT 9: Open и на двата файла?
>> JASON Hirschhorn: Отворете и двата файла.
OK?
>> STUDENT 10: Проверете, за да видите ако файлът е NULL?
>> JASON Hirschhorn: Проверете, за да уверите, нито са NULL.
Като настрана -
наклонена черта 0 -
е, че NULL?
>> STUDENT 11: Не.
>> JASON Hirschhorn: Това не е NULL.
Това се нарича NULL терминатор.
Това е всъщност написан само с един л.
Така проверката нещо срещу това - че всъщност е характер -
така проверка нещо срещу това е не е същото като проверка, за да се види дали
се равнява на NULL.
>> И някои хора -
върху техните викторини и техен проблем комплекти - Получих
две от тези объркани.
Но две от тях са в действителност различни.
Един свършва низ -
едно е указател към 0.
>> STUDENT 12: Защо не бихте се провери, за да уверете се, че файловете не са NULL
преди да ги отворите?
>> JASON Hirschhorn: Значи отворен спестява нещо в този файл.
И ако се върнеш тук -
така че тази линия - Fopen -
Ще ви дам един адрес и магазин този адрес във файла, ако тя работи.
Ако тя не работи, той ще съхранява NULL -
>> STUDENT 12: Oh.
OK.
Хванах те.
>> JASON Hirschhorn: В файл.
Така че не може да се провери за NULL преди да сте ги отвори.
NULL означава нещо, което не е направил работят правилно.
OK.
Така че се уверете, нито е това?
Или са?
Какво ще кажеш?
Ще отидем с това.
>> STUDENT 13: Дали.
>> JASON Hirschhorn: Дали?
Нито е?
>> STUDENT 13: Дали.
>> JASON Hirschhorn: OK.
Ние изглежда да има някои консенсус по този въпрос.
Нито е NULL.
OK, следващия ред на pseudocode.
Кой не ми е дал линия все още?
Ние ще те чакам.
Да.
>> STUDENT 14: Трябва да се чете от първия файл?
>> JASON Hirschhorn: OK.
>> STUDENT 14: Или ние използваме fscanf или нещо подобно на първия файл?
>> JASON Hirschhorn: Така че ние искаме да чете от първия файл и -
нека да поставим това право тук.
Прочетете от файла източник.
И тогава, какво ще правим след като сме чете от файла източник?
Някой друг?
>> STUDENT 15: Напишете в целевия файл?
>> JASON Hirschhorn: Ние пишем за целевия файл, и -
OK.
Какво друго ни липсва?
Някой друг, който не ми е дал ред код все пак - на pseudocode.
Да.
>> STUDENT 16: Може би винаги можете да проверите дали има нещо, което да се чете за,
като на следващия ред?
Това са като на следващия ред, виж, ако той съществува.
>> [ELECTRONIC BEEP]
>> JASON Hirschhorn: Oops.
Това е моя журнал софтуер.
Да?
>> STUDENT 16: Да.
>> JASON Hirschhorn: Така че давам ми го още веднъж.
>> STUDENT 16: Проверете дали има още следващия ред от
източник файл за четене.
>> JASON Hirschhorn: OK.
Така че ние не четете линии - четеше байта тук -
но ти си правилно.
Искаме да четат и пишат, докато Няма повече байта.
OK.
И така, те трябва наистина да бъде разчленена малко, защото те са там отдолу.
Нали така?
Докато ние сме от байтове, ние ще чете от файла източник и пишат
до файла местоназначение.
>> И тогава, какво е последното линия на pseudocode?
Някой, който не е дал ми нещо все още.
>> STUDENT 17: Затворете файловете?
>> JASON Hirschhorn: Точно така.
Затворете файловете.
Така че там е нашата pseudocode.
Отивам да се постави в pseudocode Gedit, и след няколко минути ние
ще се кодира това заедно.
>> OK.
Нека да започнем като група.
Nishant, имам моя нов файл.
Току-що откри това.
Untitled документ 1.
Кое е първото нещо, което трябва да направя?
>> Nishant: Включи библиотеки?
>> JASON Hirschhorn: OK.
Какво библиотеки?
>> Nishant: stdio.h, stdlib.h, аз вярвам?
>> JASON Hirschhorn: OK.
Какво е stdlib за?
>> Nishant: Забравих.
>> JASON Hirschhorn: OK.
Така че да включва stdio.
Какво трябва да направя, дори преди Започвам кодиране?
>> Nishant: Напиши заглавие?
>> JASON Hirschhorn: Как мога да го оцветен?
>> [вмъкване VOICES]
>> Nishant: Как да го получите цвят?
>> JASON Hirschhorn: Как мога цветово кодиране?
>> Nishant: Не знам.
Oh.
Спестявате.
>> JASON Hirschhorn: Запазване.
Да.
Аз трябва да го запишете като. C.
Така че, да го запишете на десктопа като cp.c.
Sweet.
И ако искате да получите пълен стил точки, какво трябва да
включва в горната?
>> Nishant: Можете да напишете своето име, името на на програмата, и с цел
на програмата, както и?
>> JASON Hirschhorn: Изглежда добре.
Отлично.
Значи вие сте ни започнаха перфектно.
# Включват -
ние също ще пиша -
OK.
Така че аз мисля, че съм всичко е готово да отида.
Кой е на първа линия на код за мен - или първите редове на код, който
тя ще предприеме, за да отговарят на нашите първи коментира в pseudocode?
You.
>> STUDENT 18: Не трябва ли да е Int argc, и след това слага * ARGV?
>> JASON Hirschhorn: Мисля, че прав си.
Нека променим това да Int основни, отворени скоба, Int argc, запетая, Чар * ARGV?
Подобно на това?
>> STUDENT 18: скоби.
>> JASON Hirschhorn: скоби.
Open скоба, близо скоба, близо родител.
Perfect.
Сега мога да взема аргументи от командния ред.
OK.
Уверете се, не ни дават два файла.
Вие може да ми даде това, както добре.
>> STUDENT 18: Ако argc -
това не е равен 3.
>> JASON Hirschhorn: Ако отворени Paren argc не равно 3?
>> STUDENT 18: Да, вие се върнете 1 или нищо.
>> JASON Hirschhorn: Съжалявам.
>> STUDENT 18: Върни една или нищо.
>> JASON Hirschhorn: Завръщане 1.
OK?
Чудесно.
Отворете и двата файла.
Кой може да ми помогне да отворите двата файла?
Кой не ми е дал код Все още?
Кърт?
>> KURT: Значи всички капачки F-I-L-E източници звезда.
>> JASON Hirschhorn: Отивам за сключване на гласните.
Тези, които са готини.
Това е като Tumblr.
>> STUDENT 18: равно FОтваряне на -
>> JASON Hirschhorn: равно FОтваряне на?
>> STUDENT 18: Отворени скоба, ARGV, отворена скоба.
>> JASON Hirschhorn: Изчакайте.
Извинете.
Open скоба.
OK.
>> STUDENT 18: Да.
ARGV под 1.
>> JASON Hirschhorn: Sub 1?
>> STUDENT 18: Да.
ARGV отворена скоба 1 -
Да.
И тогава запетая, и след това отворете двойно цитат, R, двойни кавички,
близки скоба, точка и запетая.
>> JASON Hirschhorn: Sweet.
А какво да кажем за другата?
>> STUDENT 18: Много подобни, но вместо на S-R-C, че ще ти се обади г-S-T.
>> JASON Hirschhorn: Oo!
Това ми харесва.
>> STUDENT 18: Just D-S-T. Да.
И тогава ARGV, отворена скоба, 2.
Да.
И тогава w вместо R.
Да.
>> JASON Hirschhorn: Great.
Следваща няколко линии.
Също така, ако някой има неща, които да се добавят към линии, които сме правили, чувствайте се свободни да
добавете тези, както добре.
Проверете, за да се уверете, че нито е NULL.
Кой може да ми даде кода трябва да увери, че линията на pseudocode?
Арчър.
>> ARCHER: Ако SRC се равнява на равни NULL или DST равнява на равни
NULL, тогава ще се върне -
>> JASON Hirschhorn: Какво?
>> ARCHER: Завръщане 2?
>> JASON Hirschhorn: Завръщане 2.
Така че, ако са отворени Paren SRC се равнява на се равнява на NULL, или -
каквото и да thing's - тръба?
Pipe?
Ще го наречем тръба.
Pipe, тръба, DST равнява на равни NULL, върнете 2.
OK?
Докато ние сме от байтове -
ние пропуснахме през този етап от на pseudocode част да ходим до тук.
>> Но докато сме навън от байтове - какво означава този звук като?
Какъв тип C структура -
но аз не използвам думата структура, защото ние ще започнете да използвате
че в други случаи -
но C инструмент звучи като?
>> STUDENT 19: A контур.
>> JASON Hirschhorn: A контур.
Звучи като примка.
Така че, който може да ми даде първа линия от Кодекса на линия точно тук?
Можете също така да изберете какъв вид контур, което искате, ако ми дадете
тази линия на код.
Има три вида.
Можете да получите, за да изберете.
Бих предложил един от тези.
Ави.
Кой искаш?
>> AVI: ЗА.
>> JASON Hirschhorn: ЗА.
>> AVI: INT аз се равнява на нула.
>> JASON Hirschhorn: OK.
>> AVI: Тази част аз не съм сигурен за.
Но аз е по-малко от размера на на звезда източник?
Аз не съм сигурен в това.
>> JASON Hirschhorn: OK.
>> AVI: Защото искате размер на файл, нали?
>> JASON Hirschhorn: Така че това най-вероятно няма ни даде размера на действителното
подаде в байтове.
Така че какво друго можехме да направим?
Какво е друг вид на цикъл?
Или трябва да се придържате към примката ЗА?
>> STUDENT 20: Може ли да се направи линия, докато?
И тогава, какво ще направиш е you'd -
защото имаме Чар * за файла.
Така че, ако ние просто продължавай увеличаване че докато ние ще намерите характер NULL в
до края на това?
Или не, е, че не колко файлове работят?
>> JASON Hirschhorn: Значи можем да поддържаме увеличаване на Чар *
докато не намерим NULL -
>> STUDENT 20: По същество продължавай знак по знак, докато не удари
на края на файла.
>> JASON Hirschhorn: Да.
Така че това е, което искаме да правим.
Искаме да продължавайте да четете, характер по своя характер, докато не стигнем до
на края на файла.
>> STUDENT 20: Да.
Намерете -
какъв е края или знак стоп в края на текстов файл.
>> JASON Hirschhorn: OK.
Така че, когато ние стигнем до края на файла - как да знаем, че сме достигнали
края на файл?
Ако аз се обаждам -
така че нека да се върнем назад.
Какво е функция?
Да отидем в този ред точно тук.
Прочетете от файла източник.
Кой може да ми даде тази линия на код?
>> STUDENT 21: Fscanf?
>> JASON Hirschhorn: Fscanf.
OK.
Ами ако искам да чета, много по-специално, един байт?
>> STUDENT 21: Не знам.
>> JASON Hirschhorn: OK.
Дори по-просто, отколкото fscanf - какво е -
Искам да се чете от файл източник?
Прочетете от файл източник.
Какво е функция - да.
>> STUDENT 22: Това е fread?
>> JASON Hirschhorn: Fread.
Мисля, че нека да се придържаме с че едно за сега.
Какви аргументи fread се вземат?
>> STUDENT 22: Вероятно типа на файла, и след това място в досието?
>> JASON Hirschhorn: Какво мога да въведете тук да разбера какъв тип аргументи
fread отнема?
>> ПОВЕЧЕ ОТ УЧЕНИЦИ: Man fread.
>> JASON Hirschhorn: Man fread и неуспешно.
Изглежда, че те излизаш заедно.
Така че fread отнема колко много аргументи?
>> STUDENT 23: Four.
>> JASON Hirschhorn: Отнема четири аргумента.
Това отнема показалеца, размер, както и че нещо, което е странно, а някои файл.
OK?
Нека прочетем за това точно тук.
"Fread Функцията чете н кор елементи на данни, всеки размер байта
дълго, от потока, посочи от поток, съхранението им на мястото
дадена от показалеца. "
>> Така четири аргументи.
Защо не мога просто да копирате това, и да го поставите точно тук.
OK.
Така че, който може да започнете да попълвате тези аргументи за мен?
Ави.
>> AVI: Извадете празнотата.
Казано просто SRC.
Извадете показалеца и звездата.
Сложете SRC.
След това -
>> JASON Hirschhorn: Така че аз отивам да се спре Там ли си, защото това е неправилно.
Прав си с SRC, но където трябва SRC отидете?
>> [вмъкване VOICES]
>> JASON Hirschhorn: тя трябва да отидете тук.
Това е КРБ - нашата SRC е вид.
Нека да разгледаме тук.
Това се пита за тип FILE *, ние всъщност обикновено ги виждаме така.
Така че това се пита за аргумент на Тип на файла * нарича поток, който е SRC.
OK?
>> Какъв размер на неща правят ние искаме да се чете?
Дадох ти това в описание на проблема.
>> STUDENT 24: Един байт в даден момент.
>> JASON Hirschhorn: Един байт.
Колко голям е един байт?
Нейният размер е в байта, така че това, което мога да сложа там?
>> STUDENT 25: One.
>> JASON Hirschhorn: One.
Точно така.
Нейният размер е в единична байт, така 1 е един байт.
Колко искам да прочетете в даден момент.
>> STUDENT 26: One?
>> JASON Hirschhorn: Едно нещо.
Искам да прочета нещо от размера на 1, една хапка в даден момент.
И къде мога да го сложи, след като аз го прочете?
>> STUDENT 27: Дестинация?
>> JASON Hirschhorn: Така че аз не мога да слагам това право в дестинация.
>> STUDENT 28: Ще пут то в трета показалка?
>> STUDENT 27: Към дестинация.
>> JASON Hirschhorn: OK.
Да.
>> STUDENT 29: Можете да декларирате нещо, което да действа като временно съхранение по-рано.
>> JASON Hirschhorn: OK.
Дай ми това.
>> STUDENT 29: Друга файл показалка, може би?
>> JASON Hirschhorn: OK.
Така че това е невалидна звезда -
това е един вид празнота звезда, така че това не е така трябва да бъде файлов манипулатор.
И ако аз съм четене на един байт, където ще бъде едно добро място
да се съхранява един байт?
>> STUDENT 29: An масив?
>> JASON Hirschhorn: масив.
OK.
И какво друго е нещо, което е само размера, един байт?
>> STUDENT 30: A Чар *?
>> STUDENT 29: Да.
>> JASON Hirschhorn: A Чар * не е един байт.
>> STUDENT 29: A Чар.
>> JASON Hirschhorn: A Чар е един байт.
Нали така?
Така че нека наречем този буфер е генерично наименование, използвано за тези неща, за да се съхранява
нещо временно.
Така че аз се създаде буфер.
Нали така?
Но тя не взема празнота *.
Така че може би сте прав, че тя трябва да бъде буфер с размер 0.
Така че тя съхранява един -
прав.
>> Защото това тук - Чар буфер е характер, но
това отнема нищожен * -
указател.
Така че мога да направя това и сега буфер е указател.
Какво друго можех да направя?
>> STUDENT 31: Сложете една звезда до Чар.
>> JASON Hirschhorn: можех Създадохме го Чар *.
OK.
Какво е друго нещо, което можех да направя?
Или да отидем с този един.
Char * буфер, така че това, което да поставя тук?
>> STUDENT 31: Buffer.
>> JASON Hirschhorn: Buffer.
Buffer е указател към Чар.
И в това място, ние сме пускането един байт от нещо, което съм чел.
Да.
Ави.
>> AVI: Само един бърз въпрос.
Искате ли да изчистване буфер?
>> JASON Hirschhorn: Кой може да отговори на този въпрос?
>> STUDENT 32: Е, това наистина не точка за нещо точно сега, така че -
>> JASON Hirschhorn: Но правя ние искаме да го изчистване?
>> STUDENT 32: Ако ви се налага да го направя, че начин, предполагам, да, защото ще са ви нужни
някое място, за да сочи към.
>> JASON Hirschhorn: Обичате ние Трябва да го изчистване?
>> STUDENT 33: Ако ти започваш да се го използвате извън контура.
>> JASON Hirschhorn: Дали ще го използвате извън примката?
>> STUDENT 34: Да.
>> STUDENT 35: Изчакайте.
Искаме ли да го декларира в течение отвъд?
>> JASON Hirschhorn: Така че аз предполагам, че имаме някои псевдо линия, докато тук, че сме
Опитвам се да разбера, че ние все още не са стигнали до.
Ние не трябва да го изчистване.
Ние сме работещи в главната, тя само ще да се използва в този цикъл.
Той не трябва да съществува извън това.
>> Така че може да бъде локална променлива.
Имате указател към локална променлива.
>> STUDENT 36: Но това не е сочещи към нищо.
>> JASON Hirschhorn: Не, това не е инициализира с нищо.
Но ние няма да го използвате също.
Отиваме да се сложи нещо в тя за първи път го използвам.
Така че изглежда OK.
Така че ние не се нуждаем изчистване тук.
И аз мисля, че е ОК, както е.
OK.
Имаме fread линия.
Нека да направим следващия ред.
>> Ако искаме да пиша във файл, какво е добра функция, за да използвате, за да направите това?
>> STUDENT 37: неуспешно?
>> STUDENT 38: Fprintf?
>> JASON Hirschhorn: Fprintf е едно.
Какво е още една?
>> STUDENT 39: неуспешно.
>> JASON Hirschhorn: неуспешно.
И за нашите цели, неуспешно, което видяхме тук, е
вероятно по-добър избор.
Това отнема четири аргументи, както добре.
Nishant, може да ви даде ми аргументи?
>> Nishant: Първият милион става да бъде само буфер.
>> JASON Hirschhorn: OK.
>> Nishant: Вторият милиард години просто ще бъде един.
Трето един ще бъде един.
И четвъртият ще бъде DST.
>> JASON Hirschhorn: Дали някой има някакви въпроси относно тази линия?
Това изглежда добре.
OK.
Така че сега тя изглежда като едно нещо, ние сме липсва - всъщност, нека да напише
тази последна линия.
Затворете файловете.
Кой може да ни довърши писане тези последните две линии?
Да.
Съжаляваме, какво е вашето име?
>> LUCY: Lucy.
>> JASON Hirschhorn: Lucy.
>> LUCY: неуспешно SRC и след това неуспешно дестинация.
>> JASON Hirschhorn: неуспешно, отворена скоба, SRC, близки скоба, точка и запетая.
И неуспешно -
Така ли?
>> LUCY: Open скоби, DST и след точка и запетая.
>> JASON Hirschhorn: Great.
И какво трябва да включва най-накрая?
>> LUCY: Завръщане 0.
>> JASON Hirschhorn: Завръщане 0.
Трябва ли да се?
Само един въпрос.
Трябва ли да включва връщането на 0?
>> ПОВЕЧЕ ОТ УЧЕНИЦИ: Не.
>> JASON Hirschhorn: Не.
Главна прави това автоматично Ако стигнете до края.
Но аз мисля, че е хубаво да се тя включва изрично.
Особено, когато ние връщаме друга неща, по време на програмата.
OK.
Това е, което ни липсва -
ДОКАТО какво?
Кой може да се мисли за някои -
има някакъв смисъл от това, което нещата може да отиде там?
Дори ако това е само в някои pseudocode като език?
>> Това, което ние сме наистина - какво искаме да отидем, докато?
Да, Луси.
>> LUCY: Краят на файла.
>> JASON Hirschhorn: Краят на файла.
И така, какво искаш да кажеш с края на файла?
>> LUCY: След като стигнете до край на файла, спрете.
>> JASON Hirschhorn: OK.
Така че след като стигаме до края на файла.
Откъде да знаем, когато сме постигнали на края на файла?
>> STUDENT 40: Мисля, буфер ще бъде зададена на NULL.
>> STUDENT 41: Buffer е обявена вътре в цикъла.
>> JASON Hirschhorn: Значи мислиш, че буфер ще бъде зададена на NULL.
Защо би буфер да бъде настроен на NULL?
>> STUDENT 40: Защото, когато fread, което се опитвате да се сложи
нищо в буфер.
>> JASON Hirschhorn: OK.
Така си мислиш fread -
когато сте достигнали до края на файл, какво е fread смяташ да правиш?
Мисля, че това е въпросът ние трябва да разбера.
Какво означава fread направя?
Дали това се поставя НУЛЕВА в буфер, или няма да го направя нещо друго?
Как можем да разберем какво е това?
>> STUDENT 42: Man.
>> JASON Hirschhorn: Man.
Така че нека да погледнем тук.
Връщане стойност.
При успех, fread и неуспешно върне брой елементи прочетени или записани.
Този брой е равен на броя на байтовете прехвърлена само когато е размер 1.
Ако възникне грешка, или в края на файл е достигната, стойността на връщане е
кратко брой елемент или 0.
>> Така че за нашите цели, ако fread достига на края на файла, и чете от
в края на файла, там е останало нищо да се чете, какво върви да се върне?
>> STUDENT 43: Нула?
>> JASON Hirschhorn: Какво?
>> STUDENT 43: Нула?
>> JASON Hirschhorn: Нула.
Той ще се върне на нула.
Така че ние знаем, че fread, когато ние имаме достигнала края на файла, ще
да се върне на нула.
Как можем да използваме това в наша полза?
>> AVI: Можете да декларирате променлива извън на цикъла, наречен проверка.
Ако проверката се равнява -
за сега - един.
>> JASON Hirschhorn: OK.
>> AVI: И тогава може да се сложи IF изявление веднага след fread казвам, ако
fread равна на нула -
не.
>> JASON Hirschhorn: Кой може да помогне на Ави навън?
>> AVI: Каква е стойността върната от fread?
>> JASON Hirschhorn: Ние просто мина над това.
>> AVI: Как да я представлява?
>> JASON Hirschhorn: Така че той се връща - нека погледнете тук - тя връща
size_t, който е по същество цяло число.
Така че връща цяло число.
И в нашия случай, той ще върнете 1 или 0 -
1, ако го прочете едно нещо - един байт, и 0, ако сме достигнали до края.
Така че, ако fread -
Така ли?
>> STUDENT 45: Не можеш ли просто да постави в пълна fread (буфер, 1, 1, SRC) в
линия, докато?
>> JASON Hirschhorn: Значи вие предлагате Правейки това в там?
>> [вмъкване VOICES]
>> JASON Hirschhorn: Дръж се.
Така че ние сме избавяне от това.
Значи предложи пускането fread в там?
Какво трябва да се движат ако искате да направите това?
>> STUDENT 45: Буферът отвън.
>> JASON Hirschhorn: Ние трябва да също така да преместите този тук.
>> STUDENT 45: Но прави това постоянно тя се движи напред?
>> [вмъкване VOICES]
>> JASON Hirschhorn: OK.
Така че това е, което предлага Okshar.
Ние създаваме нашия буфер.
Ние ДОКАТО fread, тогава ние неуспешно.
Мисли за това?
>> STUDENT 46: Единственият ми въпрос е, ще тя всъщност изпълнява команда fread?
>> JASON Hirschhorn: Great въпрос.
Когато сте пускането извикване на функция във вътрешността на състояние, прави това
извикване на функция изпълнява?
Виждали сме примери за това преди.
Нали така?
>> STUDENT 46: OK.
Да.
Така че тя не изпълни.
>> JASON Hirschhorn: Видяхме неща като, че преди, когато имаме
извикване на функция във вътрешността на състояние.
Изпълни ли това, извикване на функция?
Да.
Така че отговорът е да.
Тази функция обаждане ще се изпълни.
Но отново, е, че това, което искаме?
>> Какво е един начин бихме могли да измислим , ако това е, което искаме?
>> ПОВЕЧЕ ОТ УЧЕНИЦИ: го изпълните?
>> JASON Hirschhorn: Бихме могли да го стартирате.
Но преди да направите това, бихме могли да също разсъждава през това.
Ако -
кажем, че имаме един байт в нашия подаде, ние ще стигнем до тук,
ние ще стигнем до този код.
Това ще се изпълнява.
fread ще се върне един байт и го съхранява в буфера.
И това ще оцени до 1, Добре, след като той се връща 1.
>> И така, докато един.
Това означава ли, кода вътре примката ДОКАТО ще изпълни?
>> STUDENT 47: Да.
Това е вярно.
>> JASON Hirschhorn: Да.
Едно е вярно.
Това не е 0.
Така кода вътре тук ще изпълни.
Така че ние ще напиша това.
Ние ще се върнем към този Онлайн отново.
Сега имаме -
ние сме в края на нашия файл.
Четем от края на нашия файл, защото имахме само един байт в него.
>> Fread връща 0, магазини нещо в буфер.
Аз честно казано не знам какво го съхранява в буфер.
Вероятно можем да потърсим за да видите какво прави той.
Че аз честно казано не знам.
Ние не знаем, кой му пука какво го съхранява в буфер?
Но тя не се върне 0.
И ще Докато 0 изпълни?
>> ДОКАТО 0 няма да се изпълни.
Така че след това ще се премести тук.
Така че нека се с вдигане на ръка, ако това е кодът, ние би трябвало да работи, или ако ние
трябва да направи промени на първо място.
Така че, ако мислиш - трябва да гласуват.
Ако мислите, че ние би трябвало да работи този код както е, моля да вдигнат ръка.
>> OK.
Има едно -
Имате ли въпрос, безпокойство?
Да.
>> STUDENT 48: След като ние се движат буфер извън на цикъла, което правим
Трябва да го изчистване?
>> JASON Hirschhorn: Great въпрос.
След като ние се движат буфер извън линия, ще трябва да го изчистване?
Това е въпрос обхват.
Ако ние се инициализира буфер извън на този цикъл, ще го съществува
във вътрешността на цикъла?
>> ПОВЕЧЕ ОТ УЧЕНИЦИ: Да.
>> JASON Hirschhorn: Да.
Нейният обхват покрива вътрешността на линия, и, наистина, всичко под него вътре
на този кодекс, включително нещата тук вътре.
Така че ние не трябва да го изчистване.
Това е локална променлива, и нейният обхват все още включва цикъла.
>> STUDENT 49: Трябва ли да го освободи?
>> JASON Hirschhorn: Обичате ние Трябва да безплатен буфер?
>> STUDENT 49: Да, ако не го направим изчистване.
>> JASON Hirschhorn: Обичате ние Трябва да безплатен буфер?
Ние не правим.
Отново, това е локална променлива, така че ние не трябва да го освободи.
OK.
Да видим какво ще стане.
Така че това е неинициализирана.
Това беше нещо, че това, което Marcus предложен по-рано.
Така че ние имаме тази грешка, променлива буфер е неинициализирана, когато се използва тук.
>> Как можем да поправя това?
>> STUDENT 50: това изчистване?
>> STUDENT 51: равно NULL?
>> STUDENT 52: Кажете буфер се равнява на NULL.
>> JASON Hirschhorn: OK.
Изглежда добре.
Ние го имаме сега.
Нека създадем нещо, което да се опита копиране.
Така че ние имаме нашия текстов файл.
Как можем да стартирате тази програма?
Да.
>> STUDENT 53: Можете да направите точка наклонена черта кп, test.txt.
И тогава може да назове друг файл която тя ще се съхранява в.
>> JASON Hirschhorn: OK.
Ще го наречем out.txt.
Cool?
Seg вина.
Мисли за вина на сегмента?
Това е страхотно.
Как можем да разберем къде неизправността на SEG е?
Какво?
>> STUDENT 54: GDB.
>> JASON Hirschhorn: GDB.
В момента тече GDB с написването GDB точка наклонена черта, на името на програмата.
Не аргументи там команден ред.
Отиваме да зададете граничните стойности в основния.
Ако искате да започнете GDB, какво да правя?
>> STUDENT 55: R.
>> JASON Hirschhorn: R. И после какво?
>> STUDENT 55: Аргументите?
>> JASON Hirschhorn: Тогава аргументи от командния ред.
Да се ​​разходим из.
N е просто ме водиш ред по ред.
Отивам да отидат до Получа моя сегмент виновен.
Ето го моят сегмент виновен.
Прилича fread причинена ми сегмента вина.
Знам fread причинени ми сегмента вина, защото това е
Онлайн ние просто екзекутиран.
>> И единственото нещо, което беше случва в тази линия -
две неща се случваха.
Fread отива, и тогава бяхме правят някои при проверка.
Аз съм готов да се обзаложа, че в същото време проверка не е причинявало ми SEG вина.
Най-вероятно, fread беше причинявайки ми сегмента вина.
Аз също виждам нещо тук, memcopy.
>> Копие Memory.
Звучи като се движат с памет от едно място до друго.
Звучи като нещо, което ще се случи, в fread, може би малко памет
движи от тук до тук.
Нека да мине през това отново.
Как мога да го започнем отначало и да го стартирате отново?
Да.
>> STUDENT 56: Смятате ли, трябва да поставите амперсанд преди буфер?
>> JASON Hirschhorn: Значи преди амперсанд буфер ще ми даде адреса на
буфер, който е знак *.
Нека да тече през това още един път.
Как да го стартирам през него още един път?
>> STUDENT 57: Може ли само въведете кандидатира отново?
>> JASON Hirschhorn: Просто напишете кандидатира отново.
Така че ние няма да изпълните тази линия.
Така буфер е нулев указател.
Вярно ли е?
Тя е насочена към - нека да видим.
Ако ние имаме -
направи бърза снимка на това.
Всеки ли може да се види дали Аз пиша тук?
>> Така в стека, ние имаме една местна променлива и тя се нарича буфер и
това е указател към Чар.
Какво адрес е този знак на?
>> STUDENT 58: 0x0.
>> JASON Hirschhorn: Точно така.
Това е, какво е това.
В тук, вътре в буфер, се съхранява 0x0.
Това е, което ние имаме - настройка имаме точно сега.
Така че тази линия, fread, слага нещо от източник, където?
В това поле или тази кутия?
Коя кутия?
Ляво или дясно кутия кутия?
Това право кутия.
>> От това следва, показалеца, и да го поставя тук.
Когато ние се опитваме и докосване памет място 0, какво ще се получи?
A сегментиране вина.
Това е грешката, ние имаме точно сега.
Да.
>> STUDENT 59: Нямаш ли да се сложи звезда буфер?
Или не?
За fread?
>> JASON Hirschhorn: Така fread Отнема показалка.
Така че тя преминава през буфер.
И тогава ще де-референтна го някъде вътре fread.
Но отново, видяхме, че отнема показалка.
Ние не трябва да го давате звезда буфер.
Това ще се минава го както е тук.
И това вероятно ще ни даде грешка защото ние сме го де-съотнасяне.
>> Нали така?
Когато ние де-референтна този указател, когато ние се опитваме да осъществите достъп до това място,
Махаме грешка - нашия сегментиране вина.
Така че -
Опа.
Отиваме да се откажат от GDB.
Нашата линия -
наш проблем - е прав тук, на тази линия.
И това е проблем, защото на тази линия.
>> Как можем да създадем една кутия, която е достъпна в fread.
Нали така?
Ние трябва да създадем една кутия, която е една байт голям, размерът на знак.
Но имаме нужда от тази кутия, за да бъде достъпен Когато тази функция се изпълнява.
Е, къде -
Да.
Някакви идеи?
>> STUDENT 60: Просто го зададете като всеки случаен характер.
Просто направи Чар буферни равни характера.
И тогава, когато сте буфер там -
>> JASON Hirschhorn: Изчакайте.
Char буфер?
Така че без звезди?
>> STUDENT 60: Да.
Извадете звездата.
Равно случаен характер.
>> JASON Hirschhorn: OK.
Така че, дайте ми един.
>> STUDENT 60: Като или нещо такова.
И тогава, когато имате буфер там, можете да използвате -
>> STUDENT 61: Star?
О, не, амперсанд.
>> STUDENT 60: Използвайте амперсанд.
>> JASON Hirschhorn: OK.
А какво да кажем в неуспешно?
>> STUDENT 60: Използвайте амперсант отново.
>> JASON Hirschhorn: Добре.
Така че вашата идея е, ние създаваме Чар и сложи нещо в нея, а след това
пишете, че Чар.
>> STUDENT 60: Да.
>> JASON Hirschhorn: Какво мислят хората?
>> STUDENT 62: Това е сложен.
>> JASON Hirschhorn: OK.
Нека да го извади.
Така че този път, аз отивам да се направи това в червено в стека тук, а след това ние
ще има -
ох!
Извинете.
Така че този път ние имаме нещо, наречено буфер, и това е в стека.
Вярно ли е?
И ние сме спестяване в него, първоначално.
>> Тогава ние имаме нашия призив да fread.
Какво fread се е тя да вземе байт от нашият файл и го слага някъде.
Това го поставя в каквато и на нещо, което да сочи на.
Е, преди имахме този адрес -
0x0.
Сега какъв адрес имаме?
>> STUDENT 63: Каквото адрес буфер е.
>> JASON Hirschhorn: Каквото адрес буфер е.
Тя вероятно ще бъде нещо подобно.
Вероятно ще започна с б и едно е, а след това да има шест други
шестнадесетични цифри.
Няма значение.
Някои адрес.
И ние мимоходом, че адрес инча
>> И ние ще поставим едно байт нещо на този адрес.
Така че ние ще поставим едно байт нещо тук вътре.
И тогава ние ще пиша от това, което някога е тук вътре.
Дали някой има някакви въпроси за това?
Кой мисли, че този код ще работи?
>> Вдигнете ръка, ако смятате този код ще работи.
Вие трябва да заеме позиция.
И който си мисли този код няма да работи?
Вдигнете ръка.
Всички останали трябва да бъде повишаване на ръката им.
OK.
Майкъл, къде стоиш?
>> MICHAEL: Не мога да реша.
Нещо по средата.
>> JASON Hirschhorn: Ти си в средата.
Вземете един.
>> MICHAEL: Ще имаме вяра и да кажа, че ще работи.
>> JASON Hirschhorn: OK.
Ще имате вяра и да кажа, че работи?
Какво се е случило?
>> [вмъкване VOICES]
>> JASON Hirschhorn: No сегмента вина.
Как можем да се провери, за да видите, ако две неща са равни?
Две файлове са равни.
>> STUDENT 64: Diff.
>> JASON Hirschhorn: Diff.
Разлика проверки за различията между два файла, и ако той се връща
нищо, те са идентични.
И ако ние се отвори, ще получите нашия файл.
Така че това е правилното решение.
Нека да погледнем назад към това още един път.
Ние всъщност дори не трябва да го инициализира.
>> Това вероятно ще изглежда малко чисти, ако не е пускал
нещо случаен там.
Въпросът е, ви е необходимо да се създаде малко пространство за съхранение на нещо от
fread и да вземат нещо от неуспешно.
И това нещо е трябвало да бъде местен променлива в стека - вие
Можеше да malloc'd малко пространство.
>> Така че ние всъщност може да има писмено изчистване тук, и
че би работил.
И тогава ние ще са съхраняване нашите неща някъде на куп.
Но това е всъщност, най-вероятно, най-елегантно решение.
Просто се създаде малко пространство в стека за тези неща, за да отида.
>> Щях да имам две други коментари.
Ако ви се налага да вземе завой в това, и след това се оценяват по това, моите коментари
ще бъде както следва.
Това едно е тук, до мен, гледам като магически числа.
Този 1, по отношение на fread, има смисъл.
Това е броя на нещата, да се чете и пише.
>> Но този един точно тук трябва да вероятно да е нещо друго.
Така че това, което е едно решение?
>> STUDENT 65: Размер на байт.
>> JASON Hirschhorn: Така ли?
>> STUDENT 65: Размер на Чар.
>> JASON Hirschhorn: Размер на Чар.
Да, байт не е вид.
Така размер на Чар произведения.
Може да има, в горната част на нашия код, # определено това.
Наречен нещо BYTE и това е наистина Чар.
Всъщност, още по-добър подход може да е това -
UINT.
Някой знае ли какво е това?
>> Извинете.
Аз го имам назад.
Чакай, не.
Накъде ли е отишло?
Някой знае ли какво е това?
Да.
>> STUDENT 67: Трябваше да помогне на стандартизиране през Системи неща, които
има - като неподписани числа че има 8 байта?
>> JASON Hirschhorn: Това е точно така.
На различни машини, размера на знак -
обикновено не е Чар.
Герой обикновено са един байт.
Но размерът на други типове данни са различни размери на 32-битова машина
в сравнение с 64-битова машина.
А uint8_t е винаги 8 бита -
винаги един байт.
>> И аз трябва да се включи, че стандартен файлов вътр отби.
Така че сега, това най-вероятно би била най-добрият начин да пиша този код.
Така че мога да се отърва от магически числа.
И аз също имам по-логично въведете за буфер.
Това не е просто знак, е един байт, което е това, което ние очакваме да бъде.
>> И тук, ние всъщност бил малко по-силен.
Ние не го наричаш Чар, който -
може би, кой знае - може да бъде различен размер на различни машини.
Ние всъщност се казва точно това е един байт, винаги, без значение какво.
И ако погледнем тук, ние правим CP.
О-о.
Какво се е случило?
>> STUDENT 68: Би могло да се включи.
>> JASON Hirschhorn: Какво?
>> STUDENT 69: Така ли?
>> STUDENT 70: Не си го определят като тип.
>> STUDENT 71: Но това трябва да бъдат определени в стандарт.
>> STUDENT 72: Какво става?
>> STUDENT 73: Трябва ли да се определи да бъде с главни букви?
>> JASON Hirschhorn: Така че това не е # определят.
Всъщност, в този случай, аз съм ще използваме typedef.
Защото ние го използвате като тип на едно място.
Така че в този случай, ние действително искаме да typedef като сме отпечатване на нов тип
байт, и е, по същество, това.
Това е малко по-различно, отколкото # определят.
>> И сега, нашият код работи перфектно.
Така че, отново, # определят отнема нещо, той замества навсякъде
с друго нещо.
Това е просто една макро -
стенограмите да се отървете от магически числа.
Но в този случай, защото ние сме да го използвате като вид -
точно тук -
За да може това да работят, ние трябва да typedef каквото е байт.
>> И ние сме го определяне точно тук.
Това не е структура, това е всъщност само положително цяло.
Това е дълъг един байт.
Този код ще бъде на разположение онлайн, както и всичко, което трябва да го има в момента.
>> Така че ние имаме -
перфектна -
13 минута, за да отиде над определен проблем 5.
Искам да ходя през резервното заедно, и след това ще говорим накратко
за други части на проблема избран.
Така че позволете ми да спра copy.c.
И готино нещо е, че ние всъщност вече написал много на този кодекс.
>> Кодът писахме буквално излезе от тук, когато бях на
пиша това на моята собствена.
Но това е резервното, образува основата за първите две части на
проблема, определен за whodunit.c, които Вие трябва да напишете, и resize.c.
Recover.c, която е третата и последна част от множеството проблеми, не е
на базата на разстояние от този файл.
>> Ще трябва да напишете този файл, ние ви даваме един шаблон за това
файл, но това няма нищо общо с copy.c.
Но тъй като резервното е основата за първите две части, отиваме
да минеш през нея сега, така че имате добро чувство за това, което прави.
>> И коментарите дават някои от тях далеч.
Ние вече съм писал някои от това.
Първо, ние сме като се уверите, получаваме три аргумента.
На следващо място, ние сме си спомни името на файла.
Така че ние пропуснат тази стъпка, когато ние кодирани ни нещо -
когато нашата CP.
Но тук, те правят го малко по-чист.
>> Те са проверка, за да се уверите, двата файла са добри, в
Освен отварянето им.
Писахме всичко това код точно сега, така че аз съм Няма да се спирам на този код.
След това е някои неща, които е специфична за типовете файлове, които използваме, които
са растерни файлове.
Растерни файлове имат някои метаданни свързани с тях.
>> Така че първите няколко байта ви разкажа за файла.
Те не са цветовете пиксел в изображението.
Те ще ви разкажа за файла.
И ако четете чрез набор проблем, ще имате много повече информация
на какви видове метаданни структури са включени с растерни изображения.
>> Но това е защо ние имаме тази първа комплект - този код точно тук.
Ние четат метаданните -
две парчета на метаданни - файлът горния и заглавието на информация.
И ние сме проверка на някои части от него, за да уверете се, че е вярно, растерна графика файл
преди да продължите.
>> И отново, това са подробности ние не е нужно да отидете в предприятието.
Ако четете чрез набор проблем, вие ще разберете това.
Дълга история кратко, те са просто казвам, Този файл е растерна графика, и
потвърждава, че.
>> На следващо място, ние пишем тези на вън файл.
Виждаме, че тук.
Пишем Ви, за извън показалеца.
На следващо място, ние сме определяне подложка.
Така че отново, както е особеност с файл с растерна графика, някои линии включват
подложка в края.
И ако четете чрез набор проблем, вие ще научите повече за подложка.
Това е формулата, за да намерите подложка.
>> Важно е да се помни -
, когато променяте размера на растерна графика подаде променя подложка.
Когато променяте размера на подаде променя подложка.
Тя никога няма да бъде по-голяма от 3 -
това ще бъде от 0 до 3, включително.
Но когато промените размера на нещо променя подложка.
>> Ако имам само един пиксел в този ред, аз нужда от три байта на подложка, защото
всеки ред трябва да бъдат кратни на четири байта, във файл растерна графика.
Но ако аз го удвои, за да се премине от един пиксел два пиксела, всеки от които,
нека да кажем, е един байт, след това имам нужда два байта на подложка, за да направят
който е равен на четири.
>> Така че, когато промените размера на нещо, Имам нужда да променя размера
на подложка, което имам.
Това прави ли смисъл да се всички?
На следващо място, ние обхождане на всеки ред, или чрез всички редове.
И тогава ние обхождане чрез всяка колона на всеки ред.
Ние лечение на това като растерна графика мрежа, като ние сме третирани
съвета в 15.
>> Както ние лекувахме тухлите, когато ние ги отпечатва на екрана.
A решетка от редове и колони.
След това - видяхме това.
Ние всъщност само кодирани това.
Ние създадохме някои временно складиране.
Четем в там, и след това ние го напиша.
Това е точно това, което току-що направих.
>> На следващо място, защото казах всяка линия завършва в някаква подплата, ние
прескачам, че подложка -
старата подложка.
И тогава можем да го добавите обратно.
В този случай, ние създаваме точно същата файла.
Ние просто го копирате.
Така че тази линия е някак глупаво.
Бихме могли буквално постави подложка инча
>> Но ако промените размера на файла, Все още ли искате тази линия?
Така че, ако искаме промяна на размера на файла, имаме все пак искате да пропуснете
над старата подложка?
>> STUDENT 74: Да.
>> JASON Hirschhorn: Така че ние правим.
Тъй като тази, отново, сделки с файла източник.
Ние не се грижи за пълнежа от файла източник.
Искаме да отидем на следващия ред.
Но ние не просто да сложи обратно стария размер на подложка.
Ние трябва да се постави обратно на нов размер на подложка.
>> Така че, когато ние сме промяна на размера на файл, ние все още искате да прескочат до
подложка в стария файл - какво четем в от.
Но това, което пишеш, за да, отиваме да се наложи да върнат някои различен
брой подложка, че сме преценили.
Да.
>> STUDENT 75: Редът на тези две линии няма значение, нали?
Защото си работа различни файлове.
>> JASON Hirschhorn: Точно така.
Редът на тези две линии Няма значение.
Пишем тази линия.
Това е тук за файла пишем да.
Това е важно, за да можем да получите правото размер на подложка.
Това трябва да се справят с в досието.
Искаме да пропуснете прав върху подложка.
>> Ние не искаме да се чете -
ако четеш един байт в даден момент, ние не се грижи за тези байтове за запълване.
Ние искаме да се премине към следващия ред.
Накрая точно като Люси даде за нас, ние затваряме файловете и да се върне 0.
Така че това е copy.c.
И ние всъщност е написал - ние прекарва голяма част от раздел пиша това, по същество.
>> Ти направи това.
Така че се надяваме, че имате добро чувство от това, което става тук.
Голямата разлика, честно казано, е само тази първа част, която се занимава с
особености на растерни файлове.
Така че аз имам като следващата ми слайд, какво трябва да направим?
Е, нека помислим за криминале.
>> И за някой, който чете през проблема зададен, какво правим
трябва да се направи в криминале?
Просто.
Aleja.
>> Aleja: Можете ли да извадите част на всеки пиксел, че означава червено.
И след това -
вид?
>> JASON Hirschhorn: OK.
Така че извадете част на всяка пиксел че означава червено.
Това е близо, но не всички от него.
>> STUDENT 76: Е, има различни начини, за да го направя.
>> JASON Hirschhorn: OK.
Дай ми един начин.
>> STUDENT 76: Извадете всички червени, и След това се наблегне на синьо и зелено.
>> JASON Hirschhorn: OK.
Така че при тези в двете посоки -
това звучи като ние я дам един пиксел, тя има червен, син и зелен ниво.
Ние искаме да се променят относителните нива на на червено, синьо, и зелено, в зависимост
по този пиксел.
Къде в този код трябва да се промени относителната червено, синьо, и зелено
нива на даден пиксел.
След като сме го прочетете -
преди да го напиша?
Дай ми номера на реда.
>> ПОВЕЧЕ ОТ УЧЕНИЦИ: 83.
>> JASON Hirschhorn: 83.
Така че точно тук.
За криминале, кодът трябва да пиша всичко трябва да отиде точно там.
И това е само код Вие трябва да напишете.
Защото, както чухме, всичко, което трябва да направите, е да промените тези относителни синьо,
червено и зелено нива от всеки пиксел.
>> Вие сте го четат, и сега си ще го напиша.
Как мога да получа - ако имам това нещо наречена тройна, точно тук, и това е от
въведете RGBTRIPLE -
добре, ако ние погледнахме в bmp.h, какво е RGBTRIPLE?
>> STUDENT 77: Това е една структура.
>> JASON Hirschhorn: RGBTRIPLE е структурата.
Ние виждаме, че чак тук.
И така, ако аз исках да има достъп, да речем, червено ниво на структурата, как да направя
достъп до червено ниво на тази структура?
>> [CLASS мърморене]
>> STUDENT 78: RGBTRIPLE.rgbtred?
>> JASON Hirschhorn: Вярно ли е?
>> STUDENT 79: Тя трябва да е тройна точка, вместо RGBTRIPLE точка?
>> JASON Hirschhorn: Triple.
Triple е локалната променлива, така че тук, няма указатели тук.
Така че ние просто използвайте нотация точка.
Това ще ми даде нивото на червено.
Ако искате да я промените, просто настроите то се равнява на нещо по-различно.
Така че отново, този ред код достъпва тази променлива вътре в тази структура, и
можем да го настроите да нещо ново.
>> Така криминале, отново, това е, По същество, това, което ние трябва да направим.
Много просто.
Просто промените някои относителни нива, и това е мястото, където този код отива.
Преоразмеряване, от друга страна, е малко по-особено.
В действителност, преоразмеряване е може би най- -трудната част от този проблем настроен.
Имаме три минути, за да отидат над него.
>> Но отново, ние сме вече написана голямата част от този код, така че ние
трябва да бъде доста познато.
Кои са някои от нещата, които искаме да направим в преоразмеряване, ако сте чели през
определен проблем?
Ако ги даде на мен, ние може да се говори за тях.
Кои са някои от нещата, които искаме да направим?
>> STUDENT 80: Вертикално -
така че трябва да го преоразмерите хоризонтално, но вертикално преоразмеряване, както и?
>> JASON Hirschhorn: Така че, ако ние сме даден пиксел, и ние искаме да я преоразмерите от
фактор на две, то сега трябва да бъде преоразмерява хоризонтално и преоразмерява
вертикално.
Това прави ли смисъл?
Да.
Така че това е може би най- най-голямото предизвикателство.
И ние ще говорим за това след малко.
Да.
>> STUDENT 81: Начинът, по който съм мислил за това беше ли необходимо печат го навън -
>> JASON Hirschhorn: Изчакайте.
Не ни кажеш какво си направил.
Ние ще говорим в логиката.
>> STUDENT 81: OK.
Какъв беше въпросът?
>> JASON Hirschhorn: Ти просто вдигна ръката си.
Нямаше никакво съмнение.
Нека да го представи.
Нека само да обсъдим това за кратко.
Така че ние имаме един пиксел, ние искаме да го репликира, както хоризонтално, така и
вертикално.
Така че в идеалния случай това, което правим тук, е, че ние прочетете в нашия пиксел, ние ще го напиша
обаче много пъти.
>> Но тогава ние имаме трик тук, защото След това ние искаме да прескочите до
следващия ред и ще го напиша в в началото на следващия ред.
Така че, ако искаме да се възпроизвеждат както хоризонтално и вертикално, което е
един добър начин да се направи това -
една добра макар и да направя това?
Така че ние не трябва постоянно да се стреми около нашия файл, за да поставите нещата.
>> Този въпрос не може да има имаше смисъл, но мисля, че едно
отговори на това ще ви помогне.
>> STUDENT 82: Създаване на масив?
>> JASON Hirschhorn: Така че нека да помислим на всеки файл като ред.
Нека да помислим по отношение на реда.
Ако имаме първата ни ред от нашата малка картина, можем да направим този ред
в голям ред от голяма картина, и след това се възпроизвеждат този ред обаче
Много пъти трябва да се повтори, а не става пиксел по пиксел,
която получава объркващо, когато занимаваща се с файлове.
>> Защото, ако имахме -
Бягам от космоса.
Ако това е нашият файл, а ние имаме, че един пиксел там, и ние искаме да го сложи
точно там, ние все още имаме някои неща че е необходимо да отида там, когато сме
писането и създаването на нашия нов файл -
нашият файл, който е два пъти по-голям.
>> Но това е наистина трудно с файлови функции , за да прескочите до около нови линии
ей така, и след това се върнете тук и постави нещата там.
Това е почти невъзможно да се направи нещо така, ако това има смисъл.
Така че, ако ние мислим по отношение на реда, ние можем заемем ред, а след това го поставя -
репликира редове вертикално.
>> И това е начина, по който се справят с преоразмеряване вертикално, а не хоризонтално.
Това е вид на бърз и малко объркващо.
За съжаление времето ни изтече.
Аз ще застана отвън за тези от вас, тук, които имат въпроси относно
проблем набор, включително възстанови.
>> Така че нека да се отложи за сега.
И отново, ако имате някакви въпроси, ние да говорите отвън.