1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [Раздзел 5: менш камфортна] 2 00:00:02,730 --> 00:00:05,180 [Nate Хардисон, Гарвардскі універсітэт] 3 00:00:05,180 --> 00:00:08,260 [Гэта CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Так што сардэчна запрашаем, хлопцы. 5 00:00:11,690 --> 00:00:16,320 Сардэчна запрашаем у профіль 5. 6 00:00:16,320 --> 00:00:20,220 На дадзены момант, скончыўшы тэст 0 і убачыўшы, як вы зрабілі, 7 00:00:20,220 --> 00:00:25,770 спадзяюся, вы адчуваеце сябе сапраўды добра, таму што я быў вельмі ўражаны балы ў гэтай частцы. 8 00:00:25,770 --> 00:00:28,050 Для нашых гледачоў онлайн, у нас было некалькі пытанняў 9 00:00:28,050 --> 00:00:33,680 Пра двух апошніх праблем на праблемы набору - або на тэст, а. 10 00:00:33,680 --> 00:00:39,690 Так што мы збіраемся перайсці на тых, хто сапраўды хутка, так што кожны бачыць тое, што адбылося 11 00:00:39,690 --> 00:00:45,060 і як ісці праз само рашэнне, а не проста прагляд самога рашэння. 12 00:00:45,060 --> 00:00:50,330 Мы збіраемся пайсці за апошнія некалькі праблем вельмі хутка, 32 і 33. 13 00:00:50,330 --> 00:00:53,240 Толькі, зноў жа, так што анлайн-гледачы могуць убачыць гэта. 14 00:00:53,240 --> 00:00:59,080 >> Калі вы звернецеся да вашай праблеме 32, якая знаходзіцца на старонцы 13, 15 00:00:59,080 --> 00:01:02,730 13 з 16, 32, праблема ўсё пра своп. 16 00:01:02,730 --> 00:01:05,010 Гэта ўсё аб абмене двух цэлых лікаў. 17 00:01:05,010 --> 00:01:08,740 Гэта праблема, што мы перайшлі пару разоў у лекцыі. 18 00:01:08,740 --> 00:01:13,590 І тут, што мы просім вас зрабіць, гэта хутка следу памяці. 19 00:01:13,590 --> 00:01:17,000 Для запаўнення значэнняў зменных, так як яны знаходзяцца на стэку 20 00:01:17,000 --> 00:01:20,250 як код праходзіць праз гэтую функцыю падпампоўкі. 21 00:01:20,250 --> 00:01:24,500 У прыватнасці, тое, што мы шукаем - я збіраюся паставіць гэтую Ipad ўніз - 22 00:01:24,500 --> 00:01:29,650 У прыватнасці, тое, што мы глядзім на гэты радок з нумарам 6 прама тут. 23 00:01:29,650 --> 00:01:36,740 І гэта нумарам 6, толькі судотык з папярэдняй задачы. 24 00:01:36,740 --> 00:01:41,720 Тое, што мы хочам зрабіць, гэта паказаць або абазначэння стану памяці 25 00:01:41,720 --> 00:01:46,090 як гэта ў той час, калі мы выконваем гэтую лінію № 6, 26 00:01:46,090 --> 00:01:52,540 які фактычна з'яўляецца вяртанне з нашых своп функцыі прама тут. 27 00:01:52,540 --> 00:01:59,450 Калі мы пракруціць ўніз тут, мы ўбачылі, што ўсе адрасы ў памяці была прадастаўлена для нас. 28 00:01:59,450 --> 00:02:02,540 Гэта вельмі ключа; мы вернемся да гэтага праз хвіліну. 29 00:02:02,540 --> 00:02:09,240 А потым тут на дне, у нас было трохі схема памяці, якія мы збіраемся спасылацца. 30 00:02:09,240 --> 00:02:12,490 На самай справе я зрабіў гэта на маім iPad. 31 00:02:12,490 --> 00:02:20,720 Так што я буду чаргаваць назад і наперад паміж IPad і гэты код проста для даведкі. 32 00:02:20,720 --> 00:02:26,540 >> Давайце пачнем. Па-першае, давайце засяродзімся на першых двух лініях асноўны прама тут. 33 00:02:26,540 --> 00:02:30,220 Для пачатку, мы збіраемся, каб ініцыялізаваць х 1 і ў 2. 34 00:02:30,220 --> 00:02:33,040 Такім чынам, мы маем два цэлалікавых зменных, яны абодва будуць змешчаныя ў стэк. 35 00:02:33,040 --> 00:02:36,050 Мы збіраемся паставіць 1 і 2 у іх. 36 00:02:36,050 --> 00:02:43,150 Так што калі я перавярнуцца на мой IPad, спадзяюся, давайце паглядзім, - 37 00:02:43,150 --> 00:02:48,660 Apple TV люстраное адлюстраванне, і мы ідзем. Добра. 38 00:02:48,660 --> 00:02:51,670 Так што калі я перавярнуцца на мой IPad, 39 00:02:51,670 --> 00:02:56,220 Я хачу, каб ініцыялізаваць х 1 і ў 2. 40 00:02:56,220 --> 00:03:00,580 Мы робім гэта даволі проста, напісаўшы 1 у скрынку з надпісам х 41 00:03:00,580 --> 00:03:07,730 і 2 у графе у. Даволі проста. 42 00:03:07,730 --> 00:03:11,620 Такім чынам, цяпер давайце вернемся да ноўтбука, паглядзім, што будзе далей. 43 00:03:11,620 --> 00:03:15,810 Так што наступная радок, дзе ўсё становіцца складаней. 44 00:03:15,810 --> 00:03:28,110 Мы перадаем адрас х і адрас у як параметры А і Ва ў своп функцыі. 45 00:03:28,110 --> 00:03:32,380 Адрас х і адрас у рэчы, якія мы не можам вылічыць 46 00:03:32,380 --> 00:03:36,360 без спасылкі на гэтыя кулі паказвае прама тут. 47 00:03:36,360 --> 00:03:39,750 І, на шчасце, першыя два пункты кажуць нам менавіта тое, што адказы на іх. 48 00:03:39,750 --> 00:03:44,740 Адрас х у памяці 10, і адрас у ў памяці 14. 49 00:03:44,740 --> 00:03:51,870 Так што тыя каштоўнасці, якія атрымліваюць перадаецца ў якасці і б наверсе ў нашай своп функцыі. 50 00:03:51,870 --> 00:04:00,760 Такім чынам, зноў перайсці назад на нашу схему, я магу напісаць 10 у 51 00:04:00,760 --> 00:04:07,400 і 14 у б. 52 00:04:07,400 --> 00:04:11,610 Цяпер гэты пункт, дзе мы працягваем падпампоўкі. 53 00:04:11,610 --> 00:04:14,520 Такім чынам, гартаць назад у ноўтбук зноў, 54 00:04:14,520 --> 00:04:21,079 мы бачым, што шлях падпампоўкі працуе, я спачатку разыменовать і захаваць вынік у TMP. 55 00:04:21,079 --> 00:04:27,650 Такім чынам, аператар разнаймення кажа: "Прывітанне. Лячыць змесціва зменнай у якасці адрасу. 56 00:04:27,650 --> 00:04:33,830 Перайсці да таго, што захоўваецца па гэтым адрасе, і загрузіць яго. " 57 00:04:33,830 --> 00:04:41,720 Што вы загружаеце з зменнай будуць захоўвацца ў нашай TMP зменная. 58 00:04:41,720 --> 00:04:45,150 Падаваць назад у iPad. 59 00:04:45,150 --> 00:04:51,690 Калі мы пойдзем па рашэнні 10, мы ведаем, што адрас 10 з'яўляецца varible х 60 00:04:51,690 --> 00:04:55,480 таму што нам сказалі, што нашы кулі, што адрас х у памяць 10. 61 00:04:55,480 --> 00:05:00,180 Так што мы можам пайсці туды, атрымаць значэнне яго, што 1, як мы бачым на нашых Ipad, 62 00:05:00,180 --> 00:05:06,300 і загрузіць у TMP. 63 00:05:06,300 --> 00:05:08,250 Зноў жа, гэта не канчатковы змест. 64 00:05:08,250 --> 00:05:14,350 Мы збіраемся прайсці і мы вернемся да нашых канчатковым станам праграмы ў канцы. 65 00:05:14,350 --> 00:05:17,210 Але цяпер у нас ёсць значэнне 1 захоўваецца ў TMP. 66 00:05:17,210 --> 00:05:19,210 >> І ёсць хуткі пытанне тут. 67 00:05:19,210 --> 00:05:23,980 [Аляксандр] З'яўляецца аператарам разнаймення - гэта толькі зоркі прама перад зменнай? 68 00:05:23,980 --> 00:05:27,600 >> Так. Такім чынам, аператар разнаймення, як мы перавярнуць назад у наш наўтбук яшчэ раз, 69 00:05:27,600 --> 00:05:33,780 гэтая зорка прама перад. 70 00:05:33,780 --> 00:05:37,460 У гэтым сэнсе, гэта - вы параўнаць яе з аператарам множання 71 00:05:37,460 --> 00:05:42,400 якая патрабуе двух рэчаў; разыменовать аператар унарный аператар. 72 00:05:42,400 --> 00:05:46,130 Толькі ў дачыненні да аднаго значэнні, а не бінарны аператар, 73 00:05:46,130 --> 00:05:48,810 дзе вы падаеце заяўку на два розных значэння. 74 00:05:48,810 --> 00:05:52,080 Так што тое, што адбываецца ў гэтай лініі. 75 00:05:52,080 --> 00:05:58,390 Мы пагрузілі значэння 1 і захоўваць яго ў наш часовы цэлай зменнай. 76 00:05:58,390 --> 00:06:05,800 У наступным радку, мы захоўваем змесціва б у - 77 00:06:05,800 --> 00:06:12,630 ці, хутчэй, мы захоўваем змесціва, бы паказвае на ў месца, дзе паказвае. 78 00:06:12,630 --> 00:06:17,690 Калі мы прааналізуем гэтую справа налева, мы будзем разнаймення б, 79 00:06:17,690 --> 00:06:23,580 Мы маем намер звярнуцца 14, мы збіраемся захватить цэлы лік, якое ёсць, 80 00:06:23,580 --> 00:06:26,900 а потым мы збіраемся перайсці па адрасе 10, 81 00:06:26,900 --> 00:06:34,240 і мы збіраемся кінуць вынік нашай разнаймення б у гэта прастора. 82 00:06:34,240 --> 00:06:40,080 Падаваць да нашай Ipad, дзе мы можам зрабіць гэта крыху больш канкрэтным, 83 00:06:40,080 --> 00:06:44,070 гэта можа дапамагчы, калі я напішу нумары на ўсе адрасы тут. 84 00:06:44,070 --> 00:06:53,820 Такім чынам, мы ведаем, што пры ў, мы знаходзімся ў адрас 14, х знаходзіцца па адрасе 10. 85 00:06:53,820 --> 00:07:00,180 Калі мы пачынаем на б, мы разнаймення б, мы збіраемся, каб захапіць значэнне 2. 86 00:07:00,180 --> 00:07:08,320 Мы збіраемся захватить гэта значэнне, таму што гэта каштоўнасць, якая жыве па адрасе 14. 87 00:07:08,320 --> 00:07:15,700 І мы збіраемся змясціць яго ў пераменны, які жыве па адрасе 10, 88 00:07:15,700 --> 00:07:19,160 які тут жа, якая адпавядае нашай зменнай х. 89 00:07:19,160 --> 00:07:21,810 Так што мы можам зрабіць трохі перазапісу тут 90 00:07:21,810 --> 00:07:35,380 дзе мы пазбавімся ад 1 і замест гэтага напісаць 2. 91 00:07:35,380 --> 00:07:39,560 Так што ўсё добра, і добрае ў свеце, хоць мы перазапісаны х цяпер. 92 00:07:39,560 --> 00:07:44,890 Мы захавалі старое значэнне х у нашай TMP зменная. 93 00:07:44,890 --> 00:07:50,210 Такім чынам, мы можам завяршыць своп з новага радка. 94 00:07:50,210 --> 00:07:53,030 Падаваць да нашага ноўтбука. 95 00:07:53,030 --> 00:07:58,150 Цяпер усё, што застаецца ўзяць змесціва з нашага часовага цэлай зменнай 96 00:07:58,150 --> 00:08:05,630 і захоўваць іх у зменную, якая жыве па адрасе, што б трымае. 97 00:08:05,630 --> 00:08:10,230 Так што мы збіраемся эфектыўна разнаймення б атрымаць доступ да зменнай 98 00:08:10,230 --> 00:08:14,340 гэта значыць па адрасе, што б праводзіць у ім, 99 00:08:14,340 --> 00:08:19,190 і мы збіраемся, каб напоўніць значэннем, TMP трымаецца ў ёй. 100 00:08:19,190 --> 00:08:23,280 Падаваць назад у IPad яшчэ раз. 101 00:08:23,280 --> 00:08:31,290 Я магу сцерці гэта значэнне тут, 2, 102 00:08:31,290 --> 00:08:41,010 , А замест гэтага мы будзем капіяваць на 1 прама ў яго. 103 00:08:41,010 --> 00:08:43,059 Тады наступная радок, якая выконвае, вядома, - 104 00:08:43,059 --> 00:08:47,150 калі перавярнуць назад у ноўтбук - гэта пункт 6, 105 00:08:47,150 --> 00:08:52,500 , Якая з'яўляецца кропкай, у якой мы хацелі, каб наш схема цалкам запоўненыя. 106 00:08:52,500 --> 00:08:58,940 Такім чынам, гартаць назад у IPad яшчэ раз, толькі так можна ўбачыць скончаную схему, 107 00:08:58,940 --> 00:09:06,610 Вы можаце бачыць, што ў нас 10 у, 14-У, 1 у TMP, 2-х і 1 у у. 108 00:09:06,610 --> 00:09:11,000 Ёсць пытанні па гэтай нагоды? 109 00:09:11,000 --> 00:09:14,640 Ці мае гэта сэнс, прайшоўшы праз гэта? 110 00:09:14,640 --> 00:09:24,850 Зрабіць менш сэнсу? Спадзяюся, што не. Добра. 111 00:09:24,850 --> 00:09:28,230 >> Паказальнікі з'яўляюцца вельмі складаны прадмет. 112 00:09:28,230 --> 00:09:33,420 Адзін з хлопцаў, з якімі мы працуем мае вельмі распаўсюджаная прымаўка: 113 00:09:33,420 --> 00:09:36,590 "Каб зразумець, паказальнікі, вы павінны спачатку зразумець паказальнікаў". 114 00:09:36,590 --> 00:09:40,530 Які я думаю, што гэта вельмі дакладна. Гэта зойме некаторы час, каб прывыкнуць да яго. 115 00:09:40,530 --> 00:09:45,360 Лёсаванне фатаграфій, малявання вялікім аб'ёмам памяці дыяграм, як гэты вельмі карысны, 116 00:09:45,360 --> 00:09:49,480 і пасля таго, як вы ідзяце праз, напрыклад, пасля прыклад за прыкладам, 117 00:09:49,480 --> 00:09:54,450 ён пачне рабіць трохі больш сэнсу і крыху больш сэнсу і крыху больш сэнсу. 118 00:09:54,450 --> 00:10:01,560 Нарэшце, у адзін цудоўны дзень, вы будзеце мець усё гэта цалкам асвоены. 119 00:10:01,560 --> 00:10:13,800 Любыя пытанні, перш чым мы пяройдзем да наступнай праблеме? Добра. 120 00:10:13,800 --> 00:10:18,840 Так перавярнуць назад у ноўтбук. 121 00:10:18,840 --> 00:10:23,300 Наступная праблема, у нас гэта праблема нумар 33 на файл I / O. 122 00:10:23,300 --> 00:10:26,350 Павялічыць на гэта няшмат. 123 00:10:26,350 --> 00:10:28,710 Задача 33 - Да? 124 00:10:28,710 --> 00:10:32,110 >> [Данііл] Я толькі што быў хуткі пытанне. Гэтая зорка, або зорачкі, 125 00:10:32,110 --> 00:10:35,590 гэта называецца разнаймення пры выкарыстанні зорачкі раней. 126 00:10:35,590 --> 00:10:38,820 Як гэта называецца, калі вы выкарыстоўваеце амперсанда раней? 127 00:10:38,820 --> 00:10:43,140 >> Амперсанда, перш чым гэта адрас-аператара. 128 00:10:43,140 --> 00:10:45,880 Так што давайце пракруціць назад. 129 00:10:45,880 --> 00:10:49,310 Ой. Я ў рэжым маштабавання, таму я не магу сапраўды прагорткі. 130 00:10:49,310 --> 00:10:52,780 Калі мы паглядзім на гэты код вельмі хутка, прама тут, 131 00:10:52,780 --> 00:10:54,980 зноў, тое ж самае адбываецца. 132 00:10:54,980 --> 00:10:59,180 Калі мы паглядзім на гэты код прама тут, на гэтай лініі, дзе мы зрабіць званок, каб памяняць, 133 00:10:59,180 --> 00:11:10,460 амперсанда проста кажу "атрымаць адрас, па якім пераменная х жыцця". 134 00:11:10,460 --> 00:11:14,460 Калі ваш кампілятар кампілюе код, 135 00:11:14,460 --> 00:11:20,590 яна мае на самой справе фізічна вылучыць месца ў памяці для ўсіх вашых зменных, каб жыць. 136 00:11:20,590 --> 00:11:24,910 І тое, што кампілятар можа зрабіць, як толькі вы сабралі ўсе, 137 00:11:24,910 --> 00:11:31,110 ён ведае: "О, я паклаў х у адрас 10. Я паклаў у ў адрас 14". 138 00:11:31,110 --> 00:11:34,640 Ён можа запоўніць гэтыя значэння для вас. 139 00:11:34,640 --> 00:11:44,740 Такім чынам, вы можаце - ён можа затым перадаць гэта ў праходзе і і ў ў а. 140 00:11:44,740 --> 00:11:50,730 Гэтыя хлопцы атрымаць адрас, але яны таксама, калі вы перадаеце іх у своп функцыі, 141 00:11:50,730 --> 00:11:55,690 гэты тып інфармацыі, гэты Int * прама тут, кажа кампілятару, 142 00:11:55,690 --> 00:12:01,350 "Добра, мы збіраемся інтэрпрэтацыі гэты адрас у якасці адрасы цэлай зменнай". 143 00:12:01,350 --> 00:12:05,900 У адрас INT, які адрозніваецца ад адраса знакавай зменнай 144 00:12:05,900 --> 00:12:09,930 таму што Int займае, на 32-бітнай машыне, займае 4 байта прасторы, 145 00:12:09,930 --> 00:12:13,310 у той час як характар ​​толькі займае 1 байт. 146 00:12:13,310 --> 00:12:17,310 Таму вельмі важна ведаць і тое, што ёсць - тое, што жыве, які тып значэння 147 00:12:17,310 --> 00:12:20,340 жыве па адрасе, які атрымаў прайшло цалі 148 00:12:20,340 --> 00:12:22,020 Ці адрас, які вы маеце справу. 149 00:12:22,020 --> 00:12:29,020 Такім чынам, вы ведаеце, колькі байтаў інфармацыі на самай справе загрузіць з аператыўнай памяці. 150 00:12:29,020 --> 00:12:31,780 І потым, так, гэта аператар разнаймення, як вы прасілі, 151 00:12:31,780 --> 00:12:37,200 ідзе і доступ да інфармацыі па вызначаным адрасе. 152 00:12:37,200 --> 00:12:42,820 Так ён кажа, з гэтай зменнай тут, ставяцца змест, адрас, 153 00:12:42,820 --> 00:12:47,880 пайсці на гэты адрас, і выцягнуць, загрузіць у працэсар, нагрузка ў рэгістр 154 00:12:47,880 --> 00:12:56,340 Фактычныя значэння або зместу, якія жывуць па гэтым адрасе. 155 00:12:56,340 --> 00:12:59,620 Ёсць яшчэ пытанні? Гэта добрыя пытанні. 156 00:12:59,620 --> 00:13:01,650 Гэта шмат новай тэрміналогіі таксама. 157 00:13:01,650 --> 00:13:09,800 Гэта таксама выгляд фанк, бачачы & * і ў розных месцах. 158 00:13:09,800 --> 00:13:13,180 >> Добра. 159 00:13:13,180 --> 00:13:18,530 Такім чынам, вернемся да задачы 33, файлавы ўвод / выснова 160 00:13:18,530 --> 00:13:22,540 Гэта была адна з тых праблем, якія я думаю, што пару рэчаў адбылося. 161 00:13:22,540 --> 00:13:25,400 Адзін з іх, гэта даволі новая тэма. 162 00:13:25,400 --> 00:13:30,590 Ён быў прадстаўлены даволі хутка перад віктарыны, 163 00:13:30,590 --> 00:13:33,400 і тады я думаю, гэта было нешта накшталт адной з тых тэкставых задач па матэматыцы 164 00:13:33,400 --> 00:13:39,720 дзе яны даюць вам шмат інфармацыі, але вы на самой справе не да канца таго, каб выкарыстоўваць тоны гэтага. 165 00:13:39,720 --> 00:13:44,060 У першай частцы гэтай праблеме апісання таго, што файл CSV ёсць. 166 00:13:44,060 --> 00:13:50,620 Цяпер, файлаў CSV, у адпаведнасці з апісаннем, з'яўляецца значэнняў, падзеленых коскамі файл. 167 00:13:50,620 --> 00:13:55,300 Прычына гэта наогул цікава, і па гэтай прычыне вы ніколі не выкарыстоўваеце іх, 168 00:13:55,300 --> 00:14:00,800 гэта, таму што, як многія з вас калі-небудзь выкарыстоўвалі такія рэчы, як Excel? 169 00:14:00,800 --> 00:14:03,240 Малюнак большасць з вас, напэўна, або будзе выкарыстоўваць у нейкі момант у вашай жыцця. 170 00:14:03,240 --> 00:14:06,430 Вы будзеце выкарыстоўваць нешта накшталт Excel. 171 00:14:06,430 --> 00:14:10,940 Для таго, каб атрымаць дадзеныя з табліцы Excel або зрабіць які-небудзь апрацоўцы з ім, 172 00:14:10,940 --> 00:14:17,240 калі б вы хацелі, каб напісаць праграму C ці Python праграмы, Java праграмы, 173 00:14:17,240 --> 00:14:20,070 мець справу з дадзенымі, якія захоўваюцца там, 174 00:14:20,070 --> 00:14:23,170 адным з найбольш распаўсюджаных спосабаў атрымаць яго ў файл CSV. 175 00:14:23,170 --> 00:14:26,850 І вы можаце адкрыць Excel і калі вы ідзяце ў "Захаваць як" дыялог, 176 00:14:26,850 --> 00:14:32,840 Вы можаце выйсці з бягучага файла CSV. 177 00:14:32,840 --> 00:14:35,890 >> Handy ведаць, як мець справу з гэтымі рэчамі. 178 00:14:35,890 --> 00:14:42,010 Як гэта працуе ў тым, што гэта падобна на - я маю на ўвазе, яна, па сутнасці, імітуючы табліцу, 179 00:14:42,010 --> 00:14:47,590 дзе, як мы бачым тут, у самым левым кавалак, 180 00:14:47,590 --> 00:14:49,910 у нас ёсць усе прозвішчы. 181 00:14:49,910 --> 00:14:54,670 Такім чынам, мы маем малая, то Хардисон, а затым Боуден, MacWilliam, а затым Чан. 182 00:14:54,670 --> 00:14:59,470 Усе прозвішчы. І тады коска аддзяляе прозвішчаў з першых імёнаў. 183 00:14:59,470 --> 00:15:02,970 Давід, Nate, Роб, Томі і Zamyla. 184 00:15:02,970 --> 00:15:06,850 Я заўсёды змешваць Робі і Тома. 185 00:15:06,850 --> 00:15:10,940 І вось, нарэшце, трэці слупок адрасы электроннай пошты. 186 00:15:10,940 --> 00:15:18,500 Як толькі вы зразумееце, што астатняя частка праграмы даволі просты ў рэалізацыі. 187 00:15:18,500 --> 00:15:23,850 Што мы зрабілі для таго, каб імітаваць гэтую ж структуру ў нашай праграме C 188 00:15:23,850 --> 00:15:27,510 гэта мы выкарыстоўвалі структуру. 189 00:15:27,510 --> 00:15:30,520 Мы пачнем гуляць з гэтым крыху больш, а таксама. 190 00:15:30,520 --> 00:15:35,790 Мы бачылі іх у першы трохі ў праблеме набор 3, калі мы маем справу са слоўнікамі. 191 00:15:35,790 --> 00:15:40,290 Але гэта супрацоўнікі структура захоўвае прозвішча, імя і электронную пошту. 192 00:15:40,290 --> 00:15:44,500 Гэтак жа, як наш файл CSV быў захоўвання. 193 00:15:44,500 --> 00:15:47,950 Так што гэта проста канвертавання з аднаго фармату ў іншы. 194 00:15:47,950 --> 00:15:54,630 Мы павінны пераўтварыць, у гэтым выпадку, супрацоўнікі структур у лінію, 195 00:15:54,630 --> 00:15:59,060 падзеленых коскамі лініі, як і што. 196 00:15:59,060 --> 00:16:01,500 Ці мае гэта сэнс? Вы, хлопцы, усе прынятыя віктарыны, 197 00:16:01,500 --> 00:16:07,680 так што я мяркую, вы па крайняй меры, было некаторы час, каб падумаць аб гэтым. 198 00:16:07,680 --> 00:16:16,410 >> У пракат функцыі, задачы патрабуе ад нас, каб узяць у - МЫ павялічыць на гэтым крыху - 199 00:16:16,410 --> 00:16:22,480 прыняць у штатную структуру, персанал структуры, з імем S, 200 00:16:22,480 --> 00:16:30,900 і дадаць яго змесціва нашага файла staff.csv. 201 00:16:30,900 --> 00:16:34,230 Аказваецца, што гэта даволі просты ў выкарыстанні. 202 00:16:34,230 --> 00:16:37,430 Мы відаў пагуляць з гэтымі функцыямі трохі больш сёння. 203 00:16:37,430 --> 00:16:44,510 Але ў дадзеным выпадку, Fprintf функцыя сапраўды з'яўляецца ключавой. 204 00:16:44,510 --> 00:16:51,960 Так што з Fprintf, мы можам надрукаваць, як і вы, хлопцы, ужо выкарыстоўваюць Printf ўвесь гэты тэрмін. 205 00:16:51,960 --> 00:16:55,050 Вы можаце Printf радок у файл. 206 00:16:55,050 --> 00:16:59,030 Такім чынам, замест таго, каб проста зрабіць звычайную Printf выклік, дзе вы даеце яму радок фармату 207 00:16:59,030 --> 00:17:05,380 , А затым замяніць усе зменныя з наступнымі аргументамі, 208 00:17:05,380 --> 00:17:11,290 з Fprintf, ваш першы аргумент, замест файла, які вы жадаеце запісаць. 209 00:17:11,290 --> 00:17:21,170 Калі мы паглядзім на гэта ў прыбор, напрыклад, чалавек Fprintf, 210 00:17:21,170 --> 00:17:25,980 мы можам убачыць розніцу паміж Printf і Fprintf. 211 00:17:25,980 --> 00:17:28,960 Я павялічыць тут няшмат. 212 00:17:28,960 --> 00:17:33,140 Так што з Printf, мы даем яму радок фармату, а затым наступныя развагі 213 00:17:33,140 --> 00:17:37,580 Тут усё зменныя для замены або падстаноўкі ў нашым фармаце радка. 214 00:17:37,580 --> 00:17:47,310 У той час як з Fprintf, першы аргумент на самай справе гэты файл * завецца струменем. 215 00:17:47,310 --> 00:17:51,800 >> Вяртаючыся сюды, каб наш пракат, 216 00:17:51,800 --> 00:17:54,550 Мы ўжо атрымалі наш файл * струмень адкрыты для нас. 217 00:17:54,550 --> 00:17:57,810 Гэта тое, што гэта першая лінія робіць, ён адкрывае файл staff.csv, 218 00:17:57,810 --> 00:18:01,690 яно адкрываецца ў рэжыме дадання, і ўсё, што засталося для нас зрабіць, гэта 219 00:18:01,690 --> 00:18:08,640 напісаць штатнай структуры ў файл. 220 00:18:08,640 --> 00:18:10,870 І, давайце паглядзім, я хачу выкарыстоўваць IPad? 221 00:18:10,870 --> 00:18:17,900 Я буду выкарыстоўваць iPad. У нас ёсць пустэча - Давайце паставім гэта на стол, каб я мог напісаць трохі лепш - 222 00:18:17,900 --> 00:18:33,680 ануляваць арэнду і бярэ ў адзін аргумент, штатная структура называецца с. 223 00:18:33,680 --> 00:18:44,120 Ёсць нашы дужкі, мы атрымалі наш файл * завецца файл, 224 00:18:44,120 --> 00:18:48,380 у нас ёсць Еореп лініі нам дадзена, 225 00:18:48,380 --> 00:18:51,890 а я проста пішу гэта як кропкі, так як гэта ўжо ў Pedia. 226 00:18:51,890 --> 00:19:00,530 І тады на нашай наступным радку, мы збіраемся зрабіць званок у Fprintf 227 00:19:00,530 --> 00:19:03,700 і мы збіраемся прайсці ў файл, які мы хочам друкаваць, 228 00:19:03,700 --> 00:19:10,290 і тады наша радок фармату, які - 229 00:19:10,290 --> 00:19:14,300 Я паведамлю вам, хлопцы скажыце мне, што ён выглядае. 230 00:19:14,300 --> 00:19:20,500 Як наконт вас, Стэла? Вы ведаеце, што першая частка радка фармату выглядае? 231 00:19:20,500 --> 00:19:24,270 [Stella] Я не ўпэўнены. >> Не саромейцеся задаваць Джымі. 232 00:19:24,270 --> 00:19:27,690 Ці ведаеце вы, Джымі? 233 00:19:27,690 --> 00:19:31,000 [Джымі] Ці будзе гэта проста быць у апошні раз? Я не ведаю. Я не зусім упэўнены. 234 00:19:31,000 --> 00:19:39,020 >> Добра. Як наконт таго, хто-небудзь атрымаць правільнае на экзамене? 235 00:19:39,020 --> 00:19:41,770 Не, усё ў парадку. 236 00:19:41,770 --> 00:19:47,920 Аказваецца, што тут усё, што мы павінны зрабіць, гэта мы хочам, каб кожная частка нашай штатнай структуры 237 00:19:47,920 --> 00:19:53,290 быць раздрукаваныя ў выглядзе радка ў нашым файле. 238 00:19:53,290 --> 00:19:59,900 Мы проста выкарыстоўваць радок знакаў замены трох розных раз, таму што ў нас ёсць прозвішчы 239 00:19:59,900 --> 00:20:07,160 з наступнай коскі, то імя варта коска, 240 00:20:07,160 --> 00:20:12,430 і, нарэшце, адрас электроннай пошты, які варта - што не 241 00:20:12,430 --> 00:20:15,140 ўстаноўкі на экране - але за ім варта сімвал новага радка. 242 00:20:15,140 --> 00:20:20,060 Так што я збіраюся пісаць толькі там. 243 00:20:20,060 --> 00:20:23,560 А потым пасля нашага фармату радкі, 244 00:20:23,560 --> 00:20:27,880 мы проста павінны замены, якія мы атрымліваем доступ дапамогай кропкавай натацыі 245 00:20:27,880 --> 00:20:31,370 што мы бачылі ў праблеме набору 3. 246 00:20:31,370 --> 00:20:48,820 Мы можам выкарыстоўваць s.last, s.first, і s.email 247 00:20:48,820 --> 00:20:58,990 замяніць у гэтых трох каштоўнасцяў у нашым фармаце радка. 248 00:20:58,990 --> 00:21:06,190 Так як усё прайшло? Сэнс? 249 00:21:06,190 --> 00:21:09,700 Да? Няма? Магчыма? Добра. 250 00:21:09,700 --> 00:21:14,180 >> Апошняя рэч, што мы робім, пасля таго як мы друкаваных і пасля таго як мы адкрылі наш файл: 251 00:21:14,180 --> 00:21:17,370 кожны раз, калі мы адкрылі файл, мы заўсёды павінны памятаць, каб закрыць яго. 252 00:21:17,370 --> 00:21:19,430 Таму што інакш мы ў канчатковым выніку ўцечка памяці, 253 00:21:19,430 --> 00:21:22,500 з выкарыстаннем да файлавых дэскрыптараў. 254 00:21:22,500 --> 00:21:25,950 Такім чынам, каб закрыць яго, якія функцыі мы выкарыстоўваем? Дэніэл? 255 00:21:25,950 --> 00:21:30,120 [Данііл] Fclose? >> Fclose, дакладна. 256 00:21:30,120 --> 00:21:37,520 Такім чынам, апошняя частка гэтай праблемы было правільна зачыніць файл, выкарыстоўваючы Fclose функцыі, 257 00:21:37,520 --> 00:21:40,370 які выглядае так. 258 00:21:40,370 --> 00:21:43,880 Ці не занадта вар'ятам. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Так што гэта праблема 33 на віктарыну. 261 00:21:49,520 --> 00:21:52,480 Мы павінны, безумоўна, больш файлавага ўводу / вываду ідуць уверх. 262 00:21:52,480 --> 00:21:55,130 Мы зробім трохі больш у сённяшняй лекцыі, або ў раздзеле сёння, 263 00:21:55,130 --> 00:22:01,710 таму што гэта тое, што збіраецца складаюць асноўную частку гэтай маючай адбыцца PSET. 264 00:22:01,710 --> 00:22:05,020 Давайце пяройдзем ад віктарыну ў гэтай кропцы. Да? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Чаму Fclose (файл), а Fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Аг. Таму што атрымліваецца, што - так што пытанне, які з'яўляецца вялікім, 267 00:22:19,100 --> 00:22:27,800 Вось чаму, калі мы пішам Fclose, мы пісьмова Fclose (файла) зменнай зоркі 268 00:22:27,800 --> 00:22:33,680 у адрозненне ад імёнаў файлаў, staff.csv? Хіба гэта правільна? Так. 269 00:22:33,680 --> 00:22:39,570 Такім чынам, давайце паглядзім. Калі б я вярнуцца да маіх ноўтбукам, 270 00:22:39,570 --> 00:22:45,040 і давайце паглядзім на Fclose функцыі. 271 00:22:45,040 --> 00:22:51,460 Так Fclose функцыя закрывае паток, і ён прымае ў паказальнік на паток, што мы хочам закрыць, 272 00:22:51,460 --> 00:22:57,010 у адрозненне ад фактычнага імя файла, які мы хочам закрыць. 273 00:22:57,010 --> 00:23:01,620 І гэта таму, што за кулісамі, калі вы робіце выклік Еореп, 274 00:23:01,620 --> 00:23:12,020 калі вы адкрываеце файл, вы на самой справе вылучэнне памяці для захоўвання інфармацыі аб файле. 275 00:23:12,020 --> 00:23:16,380 Такім чынам, у вас ёсць файл паказальнік, які змяшчае інфармацыю аб файле, 276 00:23:16,380 --> 00:23:23,080 такіх, як ён адкрыты, яго памер, дзе вы знаходзіцеся ў дадзены момант файла, 277 00:23:23,080 --> 00:23:29,100 так што вы можаце зрабіць чытанне і запіс выклікаў, што асаблівае месца ў файле. 278 00:23:29,100 --> 00:23:38,060 Вы ў канчатковым выніку закрыццё паказальніка замест закрыцця файла. 279 00:23:38,060 --> 00:23:48,990 >> Да? [Данііл] Такім чынам, для таго, каб выкарыстоўваць пракат, вы скажаце, - як гэта атрымаць дадзеныя, уведзеныя карыстачом? 280 00:23:48,990 --> 00:23:53,830 Хіба Fprintf дзейнічаць як GetString у тым сэнсе, што гэта будзе проста чакаць ўводу карыстальніка 281 00:23:53,830 --> 00:23:57,180 і просім вас ўвесці гэты - ці чакаць, пакуль вы ўводзіце гэтыя тры рэчы? 282 00:23:57,180 --> 00:24:00,480 Ці вам трэба выкарыстоўваць нешта для ажыццяўлення арэнды? 283 00:24:00,480 --> 00:24:04,100 >> Так. Так што мы не - пытанне быў, як мы можам атрымаць дадзеныя, уведзеныя карыстачом 284 00:24:04,100 --> 00:24:09,220 У мэтах рэалізацыі арэнду? І тое, што мы маем тут справу з выклікалым пракату, 285 00:24:09,220 --> 00:24:17,690 Прайшло ў гэтым штаце структура з усімі дадзенымі, якія захоўваюцца ў структуры ўжо. 286 00:24:17,690 --> 00:24:22,990 Так Fprintf можа проста напісаць, што дадзеныя непасрэдна ў файле. 287 00:24:22,990 --> 00:24:25,690 Там няма чаканні ўводу карыстальніка. 288 00:24:25,690 --> 00:24:32,110 Карыстальнік ужо даў ўваходны належным чынам паставіўшы яго ў гэтым штаце структуры. 289 00:24:32,110 --> 00:24:36,510 І ўсё, вядома, было б зламацца, калі любы з гэтых паказальнікаў былі нулявыя, 290 00:24:36,510 --> 00:24:40,370 такім чынам, мы пракруціць таму тут, і мы глядзім на нашу структуру. 291 00:24:40,370 --> 00:24:43,640 У нас ёсць апошняя радок, радок па-першае, радкі электроннай пошце. 292 00:24:43,640 --> 00:24:48,530 Мы цяпер ведаем, што ўсе гэтыя на самай справе, пад капотам, гэта сімвал зменных *. 293 00:24:48,530 --> 00:24:53,470 Гэта можа ці не можа быць накіраваны да нуля. 294 00:24:53,470 --> 00:24:55,800 Яны могуць быць накіраваны на памяць у кучы, 295 00:24:55,800 --> 00:24:59,650 Можа быць, памяць на стэку. 296 00:24:59,650 --> 00:25:04,580 Мы сапраўды не ведаем, але калі любы з гэтых паказальнікаў роўныя нулю, або несапраўдным, 297 00:25:04,580 --> 00:25:08,120 , Што абавязкова аварыі нашым пракаце функцыі. 298 00:25:08,120 --> 00:25:11,050 Гэта было нешта, што было збольшага выходзіць за рамкі іспыту. 299 00:25:11,050 --> 00:25:16,440 Мы не турбавацца пра гэта. 300 00:25:16,440 --> 00:25:22,170 Вялікі. Добра. Такім чынам, пераходзячы ад віктарыны. 301 00:25:22,170 --> 00:25:25,760 >> Давайце закрыем гэты хлопец, і мы будзем глядзець на PSET 4. 302 00:25:25,760 --> 00:25:34,700 Так што, калі вы, хлопцы, паглядзіце на спецыфікацыі PSET, як толькі вы можаце атрымаць да яго доступ, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 Мы збіраемся прайсці праз некалькі падзелу сённяшнія праблемы. 304 00:25:42,730 --> 00:25:52,240 Я пракрутка ўніз - раздзел пытанняў пачынаецца на трэцяй старонцы PSET спец. 305 00:25:52,240 --> 00:25:57,800 І першая частка просіць вас пайсці і паглядзець кароткі на перанакіраванне і труб. 306 00:25:57,800 --> 00:26:02,820 Які быў збольшага халаднавата Карацей кажучы, паказвае некаторыя новыя, прахалодна каманднага радка трукаў, якія вы можаце выкарыстоўваць. 307 00:26:02,820 --> 00:26:06,050 І тады ў нас ёсць некалькі пытанняў да вас. 308 00:26:06,050 --> 00:26:10,860 Гэта першы пытанне аб плынях, у якіх Printf піша па змаўчанні, 309 00:26:10,860 --> 00:26:15,920 мы часткова закранулі толькі трохі хвіліну таму. 310 00:26:15,920 --> 00:26:22,380 Гэта Fprintf, што мы толькі што абмяркоўвалі займае ў паток файла * у якасці аргументу. 311 00:26:22,380 --> 00:26:26,580 Fclose займае ў паток файла *, а таксама, 312 00:26:26,580 --> 00:26:32,660 і вяртаецца значэння Еореп дае вам файл патоку *, а таксама. 313 00:26:32,660 --> 00:26:36,060 Таму мы не бачылі тых, хто раней, калі мы мелі справу з Printf 314 00:26:36,060 --> 00:26:39,450 Таму Printf па змаўчанні мае струмені. 315 00:26:39,450 --> 00:26:41,810 І па змаўчанні паток, у які ён запісвае 316 00:26:41,810 --> 00:26:45,190 Вы даведаецеся пра ў кароткатэрміновай. 317 00:26:45,190 --> 00:26:50,080 Такім чынам, безумоўна, зірнем на гэта. 318 00:26:50,080 --> 00:26:53,010 >> У раздзеле Сёння, мы збіраемся пагаварыць трохі аб тым, GDB, 319 00:26:53,010 --> 00:26:57,720 бо чым больш вы знаёмыя з ёй, тым больш практыкі вы атрымліваеце разам з ім, 320 00:26:57,720 --> 00:27:01,390 лепш вы будзеце на самай справе высачыць памылкі ва ўласным кодзе. 321 00:27:01,390 --> 00:27:05,540 Гэта паскарае працэс адладкі да надзвычай. 322 00:27:05,540 --> 00:27:09,230 Такім чынам, з дапамогай Printf, кожны раз, калі вы робіце, што вам давядзецца перакампіляваць ваш код, 323 00:27:09,230 --> 00:27:13,000 Вы павінны запусціць яго зноў, часам вы павінны рухацца Printf выклік усяму, 324 00:27:13,000 --> 00:27:17,100 закаментаваць код, ён проста займае некаторы час. 325 00:27:17,100 --> 00:27:20,850 Наша мэта, каб паспрабаваць пераканаць вас, што з GDB, вы можаце істотна 326 00:27:20,850 --> 00:27:26,810 Printf нічога ў любой кропцы вашага кода і вам ніколі не прыйдзецца перакампіляваць. 327 00:27:26,810 --> 00:27:35,120 Вы ніколі не павінны пачынацца і гадаць, дзе Printf наступным. 328 00:27:35,120 --> 00:27:40,910 Першае, што трэба зрабіць, гэта скапіяваць гэты радок і атрымаць код секцыі ад сценкі. 329 00:27:40,910 --> 00:27:47,530 Я капіяванні гэты радок кода, якая кажа: "Wget http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Я хачу, каб скапіяваць яго. 331 00:27:49,510 --> 00:27:55,950 Я збіраюся перайсці на мой прыбор, маштаб такім чынам, вы можаце бачыць, што я раблю, 332 00:27:55,950 --> 00:28:01,890 уставіўшы туды, і калі я ударыў Enter, гэтая каманда літаральна Wget з'яўляецца вэб атрымаеце. 333 00:28:01,890 --> 00:28:06,210 Гэта збіраецца знесці гэты файл з сеткі Інтэрнэт, 334 00:28:06,210 --> 00:28:11,790 і ён збіраецца захаваць яго ў бягучым каталогу. 335 00:28:11,790 --> 00:28:21,630 Цяпер, калі я пералічваю маім бягучым каталогу вы можаце ўбачыць, што я атрымаў гэтую section5.zip файл прама там. 336 00:28:21,630 --> 00:28:25,260 Каб справіцца з гэтым хлопцам, каб распакаваць яго, 337 00:28:25,260 --> 00:28:27,650 Гэта можна зрабіць у камандным радку, як гэта. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Гэта будзе распакаваць яго, стварыце тэчку для мяне, 340 00:28:36,980 --> 00:28:40,410 раздзімаць ўсё змесціва, пакласці іх туды. 341 00:28:40,410 --> 00:28:47,410 Так што цяпер я магу пайсці ў мой профіль 5 каталогу з дапамогай кампакт-дыска каманды. 342 00:28:47,410 --> 00:28:58,310 Ачысціць экран з дапамогай ясна. Такім чынам ачысціць экран. 343 00:28:58,310 --> 00:29:02,280 Цяпер у мяне ёсць добры чысты тэрмінал справа. 344 00:29:02,280 --> 00:29:06,200 >> Цяпер, калі я спіс усіх файлаў, якія я бачу ў гэтым каталогу, 345 00:29:06,200 --> 00:29:12,270 Вы бачыце, што ў мяне ёсць чатыры файла: buggy1, buggy2, buggy3, і buggy4. 346 00:29:12,270 --> 00:29:16,180 Я таксама атрымаў адпаведныя. З файламі. 347 00:29:16,180 --> 00:29:20,400 Мы не збіраемся глядзець на. Файлы з на дадзены момант. 348 00:29:20,400 --> 00:29:24,140 Замест гэтага, мы збіраемся выкарыстаць іх, калі мы адкрываем GDB. 349 00:29:24,140 --> 00:29:28,220 Мы трымалі іх вакол так, што мы маем доступ да зыходнага кода, калі мы выкарыстоўваем GDB, 350 00:29:28,220 --> 00:29:32,740 але мэта гэтай частцы падзелу важдацца вакол з GDB 351 00:29:32,740 --> 00:29:40,370 і паглядзець, як мы можам выкарыстоўваць яго, каб высветліць, што адбываецца не так з кожнай з гэтых чатырох праграм багі. 352 00:29:40,370 --> 00:29:43,380 Такім чынам, мы толькі збіраемся ў пакоі вельмі хутка, 353 00:29:43,380 --> 00:29:47,000 і я збіраюся папрасіць каго-небудзь запусціць адну з праграм багі, 354 00:29:47,000 --> 00:29:54,730 а потым мы пойдзем у групу праз GDB, і мы ўбачым, што мы можам зрабіць, каб выправіць гэтыя праграмы, 355 00:29:54,730 --> 00:29:58,460 або, па крайняй меры вызначыць, што адбываецца не так у кожным з іх. 356 00:29:58,460 --> 00:30:04,760 Давайце пачнем тут з Даніэлем. Ці будзеце вы балатавацца buggy1? Давайце паглядзім, што адбываецца. 357 00:30:04,760 --> 00:30:09,470 [Данііл] Ён кажа, што ёсць прыкладанне віна. >> Так. Менавіта так. 358 00:30:09,470 --> 00:30:12,460 Так што, калі я бягу buggy1, я атрымліваю сегменце віна. 359 00:30:12,460 --> 00:30:16,210 На дадзены момант, я магу пайсці і адкрыць buggy1.c, 360 00:30:16,210 --> 00:30:19,450 паспрабаваць высветліць, што адбываецца не так, 361 00:30:19,450 --> 00:30:22,000 але адна з самых непрыемных рэчаў аб гэтай памылцы сегменце віна 362 00:30:22,000 --> 00:30:27,610 тым, што ён не скажа вам пра тое, што радок праграмы рэчы на ​​самай справе пайшло не так і зламаўся. 363 00:30:27,610 --> 00:30:29,880 Вы, здаецца, павінны глядзець на код 364 00:30:29,880 --> 00:30:33,990 і высветліць, выкарыстанне здагадка і праверыць ці Printf каб убачыць, што адбываецца не так. 365 00:30:33,990 --> 00:30:37,840 Адна з лепшых рэчаў пра GDB з'яўляецца тое, што гэта вельмі, вельмі лёгка 366 00:30:37,840 --> 00:30:42,170 каб высветліць лінія, на якой збою праграмы. 367 00:30:42,170 --> 00:30:46,160 Гэта цалкам варта таго, каб яго выкарыстоўваць, нават калі толькі для гэтага. 368 00:30:46,160 --> 00:30:56,190 Такім чынам, для загрузкі GDB, я тыпу GDB, а затым я даю яму шлях да выкананага файла, што я хачу працаваць. 369 00:30:56,190 --> 00:31:01,960 Тут я друкую GDB ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Націсніце Enter. Дае мне ўсё гэта інфармацыя аб аўтарскіх правах, 371 00:31:06,600 --> 00:31:13,000 і тут вы ўбачыце гэты радок, якая кажа: "Чытанне знакаў з / Галоўная / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1 ". 373 00:31:17,680 --> 00:31:22,060 І калі ўсё пойдзе добра, вы ўбачыце, што выведзіце паведамленне, якое выглядае наступным чынам. 374 00:31:22,060 --> 00:31:25,500 Ён будзе чытаць знакі, ён скажа: "Я чытаю знакі з выкананага файла" 375 00:31:25,500 --> 00:31:29,900 , А затым яна будзе мець гэта "зроблена" паведамленне тут. 376 00:31:29,900 --> 00:31:35,410 Калі вы бачыце некаторыя іншыя варыяцыі гэтага, ці вы бачыце яго не маглі знайсці сімвалы 377 00:31:35,410 --> 00:31:41,460 ці нешта накшталт таго, што гэта азначае, што вы проста яшчэ не складзены выкананы файл належным чынам. 378 00:31:41,460 --> 00:31:49,980 Пры кампіляцыі праграмы для працы з GDB, мы павінны выкарыстоўваць гэтую адмысловую г-сцяг, 379 00:31:49,980 --> 00:31:54,540 і што робіцца па змаўчанні, калі вы компилируете вашы праграмы, проста набраўшы зрабіць 380 00:31:54,540 --> 00:31:59,320 або робяць памылкі або робяць аднавіць, любы з іх. 381 00:31:59,320 --> 00:32:07,800 Але калі вы збіраеце ўручную з дапамогай Clang, то вам прыйдзецца пайсці і ўключаць, што г-сцяг. 382 00:32:07,800 --> 00:32:10,310 >> На дадзены момант, зараз у нас ёсць GDB радку 383 00:32:10,310 --> 00:32:12,310 гэта даволі проста запусціць праграму. 384 00:32:12,310 --> 00:32:19,740 Мы можам альбо ўвесці перспектыве, ці мы можам проста Type-R. 385 00:32:19,740 --> 00:32:22,820 Большасць каманд GDB можа быць скарочана. 386 00:32:22,820 --> 00:32:25,940 Звычайна толькі адзін ці пару літар, які з'яўляецца даволі добрым. 387 00:32:25,940 --> 00:32:30,980 Так Саад, калі вы Type R і націсніце Enter, што адбываецца? 388 00:32:30,980 --> 00:32:39,390 [Саад] Я атрымаў SIGSEGV, памылкі сегментацыі, а затым усё гэта абракадабра. 389 00:32:39,390 --> 00:32:43,650 >> Так. 390 00:32:43,650 --> 00:32:47,990 Як мы бачым на экране прама зараз, і, як Саад сказаў: 391 00:32:47,990 --> 00:32:53,430 калі мы ўводзім прабегу або R і націсніце Enter, мы да гэтага часу атрымаць той жа сегмент віна. 392 00:32:53,430 --> 00:32:55,830 Такім чынам, выкарыстанне GDB не вырашае нашы праблемы. 393 00:32:55,830 --> 00:32:59,120 Але гэта дае нам некаторы абракадабру, і аказваецца, што гэта абракадабра 394 00:32:59,120 --> 00:33:03,080 на самай справе кажа нам, дзе гэта адбываецца. 395 00:33:03,080 --> 00:33:10,680 Для разбору гэтага трохі, гэта першы біт з'яўляецца функцыяй, у якой усё адбываецца не так. 396 00:33:10,680 --> 00:33:20,270 Там гэтая __ strcmp_sse4_2, і ён кажа нам, што адбываецца ў гэтым файле 397 00:33:20,270 --> 00:33:29,450 называецца sysdeps/i386, усё гэта, зноў жа, выгляд беспарадак - але лінія 254. 398 00:33:29,450 --> 00:33:31,670 Гэта свайго роду цяжка разабраць. Звычайна, калі вы бачыце такія рэчы, як гэта, 399 00:33:31,670 --> 00:33:38,770 , Што азначае, што яна сегментах разломаў ў адной з сістэмных бібліятэк. 400 00:33:38,770 --> 00:33:43,220 Так што нешта рабіць з STRCMP. Вы, хлопцы, бачылі STRCMP раней. 401 00:33:43,220 --> 00:33:52,730 Ці не занадта вар'ятам, але гэта значыць, што STRCMP зламаны або што ёсць праблема з STRCMP? 402 00:33:52,730 --> 00:33:57,110 Як вы думаеце, Аляксандр? 403 00:33:57,110 --> 00:34:04,890 [Аляксандр] Гэта што - складае 254 ліній? І - не двайковы, але гэта не іх столі, 404 00:34:04,890 --> 00:34:10,590 а там іншую мову для кожнай функцыі. Хіба што 254 у гэтай функцыі, або -? 405 00:34:10,590 --> 00:34:21,460 >> Гэта лінія 254. Падобна на тое, што ў гэтым няма. Файл з, так што гэта, верагодна, зборка код. 406 00:34:21,460 --> 00:34:25,949 >> Але, я думаю, больш надзённыя рэчы ёсць, таму што мы атрымалі сегменце віна, 407 00:34:25,949 --> 00:34:29,960 і, падобна, гэта ідзе ад STRCMP функцыі, 408 00:34:29,960 --> 00:34:38,030 гэта мае на ўвазе, то, што STRCMP не працуе? 409 00:34:38,030 --> 00:34:42,290 Гэта не павінна, мы спадзяемся. Такім чынам, толькі таму, што ў вас ёсць памылкі сегментацыі 410 00:34:42,290 --> 00:34:49,480 У адной з функцый сістэмы, як правіла, гэта азначае, што вы проста не называць яго правільна. 411 00:34:49,480 --> 00:34:52,440 Самы хуткі, што трэба зрабіць, каб высветліць, што адбываецца на самай справе 412 00:34:52,440 --> 00:34:55,500 калі вы бачыце нешта вар'ят, як гэта, калі вы бачыце сегмент віна, 413 00:34:55,500 --> 00:34:59,800 Асабліва, калі ў вас ёсць праграма, якая выкарыстоўвае большае, чым проста асноўны, 414 00:34:59,800 --> 00:35:03,570 гэта выкарыстоўваць трасіроўку. 415 00:35:03,570 --> 00:35:13,080 Я скарачаць след у пісьмовай форме BT, у адрозненне ад поўнага словы трасіроўку. 416 00:35:13,080 --> 00:35:16,510 Але Шарлота, што адбываецца, калі вы набіраеце BT і націсніце Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Ён паказвае мне два радкі, 0 лініяй і лініяй 1. 418 00:35:23,200 --> 00:35:26,150 >> Так. Такім чынам, лінія 0 і лініі 1. 419 00:35:26,150 --> 00:35:34,560 Гэтыя фактычныя кадры стэка, што ў цяперашні час у гульні, калі ваша праграма разбіўся. 420 00:35:34,560 --> 00:35:42,230 Пачынаючы з верхняга кадра, кадр 0 і, падышоўшы да самай ніжняй, якая з'яўляецца кадр 1. 421 00:35:42,230 --> 00:35:45,140 Наша верхняя рама STRCMP кадра. 422 00:35:45,140 --> 00:35:50,080 Вы можаце думаць пра гэта як жа, праблема, якую мы рабілі толькі на віктарыну з паказальнікамі, 423 00:35:50,080 --> 00:35:54,890 дзе мы памяняць стэк па-над асноўнага кадра стэка, 424 00:35:54,890 --> 00:35:59,700 і ў нас былі зменныя, якія падпампоўкі выкарыстоўвае ў верхняй частцы зменных, асноўным выкарыстоўваю. 425 00:35:59,700 --> 00:36:08,440 Тут наша аварыі адбыліся ў нашай STRCMP функцыя, якая атрымала назву нашай асноўнай функцыі, 426 00:36:08,440 --> 00:36:14,370 і трасіроўка дае нам не толькі функцыі, у якім рэчы не ўдалося, 427 00:36:14,370 --> 00:36:16,440 але гэта таксама кажа нам, дзе ўсе былі выкліканы. 428 00:36:16,440 --> 00:36:18,830 Так што калі я вылучыце на трохі больш правай, 429 00:36:18,830 --> 00:36:26,110 мы бачым, што так, мы былі на лініі 254 гэтага STRCMP-sse4.s файл. 430 00:36:26,110 --> 00:36:32,540 Але званок быў зроблены на buggy1.c, радок 6. 431 00:36:32,540 --> 00:36:35,960 Такім чынам, гэта азначае, што мы можам зрабіць, - гэта мы можам проста пайсці праверыць і паглядзець, што адбываецца на 432 00:36:35,960 --> 00:36:39,930 у buggy1.c, радок 6. 433 00:36:39,930 --> 00:36:43,780 Зноў жа, ёсць некалькі спосабаў зрабіць гэта. Адзін з іх, каб выйсці з GDB 434 00:36:43,780 --> 00:36:49,460 ці ваш код адкрыты ў іншым акне і крыжаваныя спасылкі. 435 00:36:49,460 --> 00:36:54,740 Гэта, само па сабе, гэта вельмі зручна, таму што цяпер, калі вы знаходзіцеся ў офісе гадзін 436 00:36:54,740 --> 00:36:57,220 і ў вас ёсць сегменты віна і ваша TF гэта цікава, дзе ўсё было ламаць, 437 00:36:57,220 --> 00:36:59,710 Вы можаце проста сказаць: "О, радок 6. Я не ведаю, што адбываецца, 438 00:36:59,710 --> 00:37:03,670 але нешта ў радку 6 з'яўляецца прычынай маёй праграмы зламаць ". 439 00:37:03,670 --> 00:37:10,430 Іншы спосаб зрабіць гэта, вы можаце выкарыстоўваць гэтую каманду называлі спіс у GDB. 440 00:37:10,430 --> 00:37:13,650 Вы таксама можаце скарачаць яго з л. 441 00:37:13,650 --> 00:37:18,910 Такім чынам, калі мы трапілі л, што мы сюды трапілі? 442 00:37:18,910 --> 00:37:21,160 Мы атрымліваем цэлую кучу дзіўных рэчаў. 443 00:37:21,160 --> 00:37:26,030 Гэта фактычны код зборкі 444 00:37:26,030 --> 00:37:29,860 , Які знаходзіцца ў strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Гэта выглядае роду фанкі, 446 00:37:32,440 --> 00:37:36,520 і прычына, мы атрымліваем гэта таму, што цяпер, 447 00:37:36,520 --> 00:37:40,160 GDB мае нас у кадры 0. 448 00:37:40,160 --> 00:37:43,070 >> Так што ў любы час мы глядзім на зменныя, у любы час паглядзець на зыходны код, 449 00:37:43,070 --> 00:37:50,530 мы глядзім на зыходны код, які адносіцца да кадра стэка мы ў цяперашні час цалі 450 00:37:50,530 --> 00:37:53,200 Так што для таго, каб атрымаць нешта істотнае, мы павінны 451 00:37:53,200 --> 00:37:57,070 перайсці ў стэку, што мае больш сэнсу. 452 00:37:57,070 --> 00:38:00,180 У гэтым выпадку, асноўны фрэйм ​​стэка б зрабіць трохі больш сэнсу, 453 00:38:00,180 --> 00:38:02,680 таму што гэта было на самай справе код, які мы напісалі. 454 00:38:02,680 --> 00:38:05,330 Ня STRCMP код. 455 00:38:05,330 --> 00:38:08,650 Тое, як вы можаце перамяшчацца паміж кадрамі, у дадзеным выпадку, таму што ў нас ёсць два, 456 00:38:08,650 --> 00:38:10,430 у нас ёсць 0 і 1, 457 00:38:10,430 --> 00:38:13,650 Вы робіце гэта з уверх і ўніз каманды. 458 00:38:13,650 --> 00:38:18,480 Калі я пераеду адзін кадр, 459 00:38:18,480 --> 00:38:21,770 Зараз я ў асноўным фрэйме стэка. 460 00:38:21,770 --> 00:38:24,330 Я магу рухацца ўніз, каб вярнуцца туды, дзе я быў, 461 00:38:24,330 --> 00:38:32,830 ісці зноў, зноў спусціцца, і падняцца зноў. 462 00:38:32,830 --> 00:38:39,750 Калі вы калі-небудзь зрабіць сваю праграму ў GDB, вы атрымліваеце аварыі, вы атрымаеце след, 463 00:38:39,750 --> 00:38:42,380 і вы ўбачыце, што гэта ў пэўным файле, які вы не ведаеце, што адбываецца. 464 00:38:42,380 --> 00:38:45,460 Вы спрабуеце спісе, код выглядае не знаёмыя вам, 465 00:38:45,460 --> 00:38:48,150 зірніце на вашыя кадры і высветліць, дзе вы знаходзіцеся. 466 00:38:48,150 --> 00:38:51,010 Вы, напэўна, не ў тым фрэйм ​​стэка. 467 00:38:51,010 --> 00:38:58,760 Ці, па крайняй меры, ты ў кадры стэка, што не адзін, што вы сапраўды можаце адладжваць. 468 00:38:58,760 --> 00:39:03,110 Цяпер, калі мы знаходзімся ў адпаведным кадры стэка, мы ў асноўным, 469 00:39:03,110 --> 00:39:08,100 Цяпер мы можам выкарыстоўваць каманду спісу, каб высветліць, якія лініі было. 470 00:39:08,100 --> 00:39:13,590 І вы можаце бачыць яго, ён надрукаваў яго для нас прама тут. 471 00:39:13,590 --> 00:39:19,470 Але мы можам стукнуць пералічыць усё тое ж самае, і спіс дае нам гэтую добрую раздрукоўку 472 00:39:19,470 --> 00:39:23,920 фактычнага зыходнага кода, што адбываецца тут. 473 00:39:23,920 --> 00:39:26,420 >> У прыватнасці, мы можам паглядзець на радку 6. 474 00:39:26,420 --> 00:39:29,330 Мы бачым, што адбываецца тут. 475 00:39:29,330 --> 00:39:31,250 І, падобна, мы робім параўнанне радкоў 476 00:39:31,250 --> 00:39:41,050 паміж радкоў "CS50 пароды" і ARGV [1]. 477 00:39:41,050 --> 00:39:45,700 Нешта ў гэтым было збояў. 478 00:39:45,700 --> 00:39:54,120 Такім чынам, місія, ці ёсць у вас думкі пра тое, што можа быць тут адбываецца? 479 00:39:54,120 --> 00:39:59,400 [Missy] Я не ведаю, чаму гэта збой. >> Ты не ведаеш, чаму гэта збой? 480 00:39:59,400 --> 00:40:02,700 Джымі, якія думкі? 481 00:40:02,700 --> 00:40:06,240 [Джымі] я не зусім упэўнены, але ў апошні раз мы выкарыстоўвалі параўнанне радкоў, 482 00:40:06,240 --> 00:40:10,260 або STRCMP, у нас былі як тры розных выпадках пад ім. 483 00:40:10,260 --> 00:40:12,800 У нас не было ==, я не думаю, што прама ў першай радку. 484 00:40:12,800 --> 00:40:16,700 Замест гэтага ён быў падзелены на тры, а адзін быў == 0, 485 00:40:16,700 --> 00:40:19,910 адзін быў <0, я думаю, і адзін> 0. 486 00:40:19,910 --> 00:40:22,590 Таму, магчыма, нешта ў гэтым родзе? >> Так. Так што гэтае пытанне 487 00:40:22,590 --> 00:40:27,200 аб мы робім параўнанне правільна? 488 00:40:27,200 --> 00:40:31,660 Stella? Любыя думкі? 489 00:40:31,660 --> 00:40:38,110 [Stella] Я не ўпэўнены. >> Не ўпэўнены. Дэніэл? Думкі? Добра. 490 00:40:38,110 --> 00:40:44,770 Аказваецца, тое, што адбываецца прама тут, калі мы запусцілі праграму 491 00:40:44,770 --> 00:40:48,370 і мы атрымалі сегменце віны, калі вы запускаеце праграму ў першы раз, Данііл, 492 00:40:48,370 --> 00:40:50,800 ты даць яму ніякіх аргументаў каманднага радка? 493 00:40:50,800 --> 00:40:58,420 [Данііл] Няма >> Не. У такім выпадку, што з'яўляецца значэннем ARGV [1]? 494 00:40:58,420 --> 00:41:00,920 >> Існуе ніякага значэння. >> Праве. 495 00:41:00,920 --> 00:41:06,120 Ну, няма адпаведнага значэння радка. 496 00:41:06,120 --> 00:41:10,780 Але ёсць некаторы значэнне. Што такое значэнне, якое атрымлівае захоўваецца там? 497 00:41:10,780 --> 00:41:15,130 >> Смецця значэнне? >> Гэта альбо смецце кошту, ці, у дадзеным выпадку, 498 00:41:15,130 --> 00:41:19,930 У канцы масіва ARGV заўсёды сканчаецца нулявым. 499 00:41:19,930 --> 00:41:26,050 Так што ж на самай справе ёсць там захоўваюцца роўны нулю. 500 00:41:26,050 --> 00:41:30,810 Іншага спосабу вырашыць гэтую праблему, а не думаць яго да канца, 501 00:41:30,810 --> 00:41:33,420 заключаецца ў спробе друку яго. 502 00:41:33,420 --> 00:41:35,880 Гэта дзе я казаў, што з дапамогай GDB з'яўляецца вялікім, 503 00:41:35,880 --> 00:41:40,640 таму што вы можаце раздрукаваць ўсе зменныя, усё значэння, якія вы хочаце 504 00:41:40,640 --> 00:41:43,230 з дапамогай гэтага зручнага дэндзі з камандай. 505 00:41:43,230 --> 00:41:48,520 Так што калі я тыпу Р, а затым я ўводжу значэнне зменнай або імя зменнай, 506 00:41:48,520 --> 00:41:55,320 кажуць, агдс, я бачу, што агдс 1. 507 00:41:55,320 --> 00:42:01,830 Калі я хачу, каб раздрукаваць ARGV [0], я магу зрабіць гэта проста так. 508 00:42:01,830 --> 00:42:04,840 І, як мы бачылі, ARGV [0] заўсёды з'яўляецца імем вашай праграмы, 509 00:42:04,840 --> 00:42:06,910 Заўсёды імя выкананага файла. 510 00:42:06,910 --> 00:42:09,740 Тут вы бачыце, ён атрымаў поўнае імя. 511 00:42:09,740 --> 00:42:15,920 Я таксама можаце раздрукаваць ARGV [1] і паглядзець, што адбываецца. 512 00:42:15,920 --> 00:42:20,890 >> Тут мы атрымалі такое містычнае значэнне. 513 00:42:20,890 --> 00:42:23,890 Мы атрымалі гэтую 0x0. 514 00:42:23,890 --> 00:42:27,850 Памятаеце, у пачатку семестра, калі мы казалі аб шаснаццатковых лікаў? 515 00:42:27,850 --> 00:42:34,680 Або што мала хто сумняваецца ў канцы PSET 0 пра тое, як складаць 50 у шаснаццатковай? 516 00:42:34,680 --> 00:42:39,410 Як мы пісаць шаснаццаткавыя лікі ў CS, толькі каб не блытаць сябе 517 00:42:39,410 --> 00:42:46,080 з дзесятковай ліку, мы заўсёды іх з прэфіксам 0x. 518 00:42:46,080 --> 00:42:51,420 Так што гэты прэфікс 0x заўсёды проста азначае, інтэрпрэтаваць наступным лік як шаснаццатковы лік, 519 00:42:51,420 --> 00:42:57,400 а не як радок, а не як дзесятковы лік, а не як двайковыя ліку. 520 00:42:57,400 --> 00:43:02,820 Так як лік 5-0 з'яўляецца сапраўдным лікам у шаснаццатковай. 521 00:43:02,820 --> 00:43:06,240 І гэта лік у дзесятковай, 50. 522 00:43:06,240 --> 00:43:10,050 Так што гэта толькі, як мы неадназначнасць. 523 00:43:10,050 --> 00:43:14,860 Так 0x0 сродкаў шаснаццатковым 0, які таксама з'яўляецца дзесятковай 0, двайковы 0. 524 00:43:14,860 --> 00:43:17,030 Гэта толькі значэння 0. 525 00:43:17,030 --> 00:43:22,630 Аказваецца, што гэта тое, што нулявыя, уласна, у памяці. 526 00:43:22,630 --> 00:43:25,940 Null проста 0. 527 00:43:25,940 --> 00:43:37,010 Тут элемент захоўваецца ў ARGV [1] роўны нулю. 528 00:43:37,010 --> 00:43:45,220 Такім чынам, мы спрабуем параўнаць нашы "CS50 скалы" радок пустая радок. 529 00:43:45,220 --> 00:43:48,130 Так разнаймення NULL, спрабуе атрымаць доступ да рэчы ў нуль, 530 00:43:48,130 --> 00:43:55,050 тыя, як правіла, збіраецца выклікаць нейкую няспраўнасць сегментацыі ці іншых дрэнных рэчаў. 531 00:43:55,050 --> 00:43:59,350 І аказваецца, што STRCMP не праверыць 532 00:43:59,350 --> 00:44:04,340 ці не вы прайшлі ў значэнне, якое нулявы. 533 00:44:04,340 --> 00:44:06,370 Хутчэй за ўсё, ён проста ідзе наперад, спрабуе рабіць сваю справу, 534 00:44:06,370 --> 00:44:14,640 і калі ён сегментах недахопы, ён сегментах недахопы, і гэта ваша праблема. Вы павінны пайсці выправіць. 535 00:44:14,640 --> 00:44:19,730 Сапраўды хутка, як мы маглі б вырашыць гэтую праблему? Шарлота? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Вы можаце праверыць, калі выкарыстанне. 537 00:44:23,540 --> 00:44:32,240 Так што, калі ARGV [1] з'яўляецца несапраўдным, == 0, то вяртаецца 1, ці нешта ў [неразборліва]. 538 00:44:32,240 --> 00:44:34,590 >> Так. Так вось адзін выдатны спосаб зрабіць гэта, як мы можам праверыць, 539 00:44:34,590 --> 00:44:39,230 Значэнне, якое мы збіраемся перайсці ў STRCMP, ARGV [1], яго несапраўдным? 540 00:44:39,230 --> 00:44:45,830 Калі гэта нуль, то можна сказаць, добра, перапыніць. 541 00:44:45,830 --> 00:44:49,450 >> Больш распаўсюджаны спосаб зрабіць гэта складаецца ў выкарыстанні агдс значэнне. 542 00:44:49,450 --> 00:44:52,040 Вы можаце паглядзець прама тут, у самым пачатку галоўны, 543 00:44:52,040 --> 00:44:58,040 мы апусцілі, што першы тэст, які мы звычайна робім, калі мы выкарыстоўваць аргументы каманднага радка, 544 00:44:58,040 --> 00:45:05,240 якая заключаецца ў праверцы нашы агдс значэнне тое, што мы чакалі. 545 00:45:05,240 --> 00:45:10,290 У гэтым выпадку, мы чакаем, па меншай меры, два аргументу, 546 00:45:10,290 --> 00:45:13,660 Назва праграмы плюс адна іншую. 547 00:45:13,660 --> 00:45:17,140 Таму што мы збіраемся выкарыстаць другі аргумент прама тут. 548 00:45:17,140 --> 00:45:21,350 Такім чынам, па нейкай тэст загадзя, да нашага STRCMP выкліку 549 00:45:21,350 --> 00:45:37,390 што тэсты, ці сапраўды ARGV па крайняй меры 2, будзе рабіць тое ж самае роду рэчы. 550 00:45:37,390 --> 00:45:40,620 Мы бачым, што працуе, запусціўшы праграму зноў. 551 00:45:40,620 --> 00:45:45,610 Вы заўсёды можаце перазагрузіць праграму ў GDB, які сапраўды добры. 552 00:45:45,610 --> 00:45:49,310 Вы можаце запусціць, і калі вы праходзіце ў якасці аргументаў вашай праграмы, 553 00:45:49,310 --> 00:45:53,060 Вы перадаеце іх, калі вы патэлефануеце працаваць, а не пры загрузцы GDB. 554 00:45:53,060 --> 00:45:57,120 Такім чынам, вы можаце захаваць выкліку праграмы з рознымі аргументамі кожны раз. 555 00:45:57,120 --> 00:46:08,080 Так бяжыце, ці зноў жа, я магу Type R, і давайце паглядзім, што адбудзецца, калі набраць "прывітанне". 556 00:46:08,080 --> 00:46:11,140 Ён заўсёды будзе пытацца вас, калі вы хочаце, каб пачаць з самага пачатку яшчэ раз. 557 00:46:11,140 --> 00:46:17,490 Як правіла, вы хочаце, каб пачаць з самага пачатку яшчэ раз. 558 00:46:17,490 --> 00:46:25,010 І ў гэты момант, яна запускае яго зноў, ён друкуе 559 00:46:25,010 --> 00:46:28,920 Праграма, якую мы бяжым, buggy1 з аргументам прывітанне, 560 00:46:28,920 --> 00:46:32,720 і гэта выводзіць з гэтага стандарту, ён кажа: "Вы атрымліваеце D," сумны твар. 561 00:46:32,720 --> 00:46:37,610 Але мы не сегментах віна. Ён сказаў, што працэс завяршыўся нармальна. 562 00:46:37,610 --> 00:46:39,900 Так што выглядае даволі добра. 563 00:46:39,900 --> 00:46:43,050 Няма больш сегменце віна, мы зрабілі гэта мінулае, 564 00:46:43,050 --> 00:46:48,190 так што падобна, што гэта сапраўды памылка сегменце віна, што мы атрымлівалі. 565 00:46:48,190 --> 00:46:51,540 На жаль, гэта кажа нам, што мы атрымліваем D. 566 00:46:51,540 --> 00:46:54,090 >> Мы можам вярнуцца назад і паглядзець на зыходны код і паглядзець, што там адбываецца 567 00:46:54,090 --> 00:46:57,980 каб высветліць, што было - чаму яно было казаць нам, што мы атрымалі D. 568 00:46:57,980 --> 00:47:03,690 Давайце паглядзім, вось гэта было Printf кажуць, што вы атрымалі D. 569 00:47:03,690 --> 00:47:08,540 Калі мы ўвядзем спіс, як вы трымаеце ўвод спісу, ён трымае ітэрацыі ўніз праз вашу праграму, 570 00:47:08,540 --> 00:47:10,940 так што пакажу Вам некалькі першых радкоў праграмы. 571 00:47:10,940 --> 00:47:15,450 Тады пакажу вам некалькі радкоў, а на наступны кавалак і наступны кавалак. 572 00:47:15,450 --> 00:47:18,240 І ён будзе старацца ісці ўніз. 573 00:47:18,240 --> 00:47:21,180 А зараз мы вернемся да "лініі нумар 16 знаходзіцца па-за дыяпазону". 574 00:47:21,180 --> 00:47:23,940 Таму што ён мае толькі 15 ліній. 575 00:47:23,940 --> 00:47:30,310 Калі вы дайшлі да гэтага пункту, і вашы задаўся пытаннем: "Што рабіць?" Вы можаце выкарыстоўваць каманду дапамогі. 576 00:47:30,310 --> 00:47:34,340 Выкарыстоўвайце дапамогу, а затым даць яму імя каманды. 577 00:47:34,340 --> 00:47:36,460 І вы бачыце, GDB дае нам усё такога роду рэчы. 578 00:47:36,460 --> 00:47:43,870 Ён кажа: "Без аргументаў, пералічвае 10 радкоў пасля або ва ўсім папярэднім лістынгу. 579 00:47:43,870 --> 00:47:47,920 List - спіс дзесяці радкоў раней - " 580 00:47:47,920 --> 00:47:52,960 Так давайце паспрабуем выкарыстаць спіс мінус. 581 00:47:52,960 --> 00:47:57,000 І ў якім пералічаныя 10 радкоў папярэдняй, вы можаце пагуляць са спісам няшмат. 582 00:47:57,000 --> 00:48:02,330 Вы можаце зрабіць спіс, спіс - вы можаце нават даць пералічыць шэраг, як і спіс 8, 583 00:48:02,330 --> 00:48:07,500 і яна будзе пералічыць 10 ліній вакол лініі 8. 584 00:48:07,500 --> 00:48:10,290 І вы можаце бачыць, што адбываецца тут, у вас ёсць просты, калі іншае. 585 00:48:10,290 --> 00:48:13,980 Калі вы набярэце ў CS50 скалы, ён друкуе "Вы атрымліваеце А." 586 00:48:13,980 --> 00:48:16,530 У адваротным выпадку яна выводзіць "Вы атрымліваеце D." 587 00:48:16,530 --> 00:48:23,770 Гультай горада. Добра. Да? 588 00:48:23,770 --> 00:48:26,730 >> [Данііл] Таму, калі я спрабаваў рабіць CS50 парод без двукоссяў, 589 00:48:26,730 --> 00:48:29,290 ён кажа: "Вы атрымліваеце D." 590 00:48:29,290 --> 00:48:32,560 Я меў патрэбу ў двукоссі, каб прымусіць яго працаваць, чаму гэта? 591 00:48:32,560 --> 00:48:38,490 >> Так. Аказваецца, што калі - гэта яшчэ адна пацешная прынадны кавалачак - 592 00:48:38,490 --> 00:48:47,900 Пры запуску праграмы, калі мы запусцім яго, і мы ўвесці CS50 парод, 593 00:48:47,900 --> 00:48:50,800 гэтак жа, як Данііл казаў ён зрабіў, і вы націснеце Enter, 594 00:48:50,800 --> 00:48:52,870 ён па-ранейшаму кажа, што мы атрымаем D. 595 00:48:52,870 --> 00:48:55,580 І пытанне ў тым, чаму гэта адбываецца? 596 00:48:55,580 --> 00:49:02,120 І аказваецца, што абодва нашых тэрміналаў і GDB разабраць іх як два асобных аргументаў. 597 00:49:02,120 --> 00:49:04,800 Таму што, калі ёсць прастора, якое мае на ўвазе як 598 00:49:04,800 --> 00:49:08,730 Першы аргумент скончыўся, а на наступны аргумент вось-вось пачнецца. 599 00:49:08,730 --> 00:49:13,260 Спосаб сумясціць гэтыя дзве, або прабачце, у адзін аргумент, 600 00:49:13,260 --> 00:49:18,510 з'яўляецца выкарыстанне двукоссяў. 601 00:49:18,510 --> 00:49:29,560 Так што цяпер, калі пакласці яго ў двукоссі і запусціць яго зноў, мы атрымаем A. 602 00:49:29,560 --> 00:49:38,780 Так проста, каб рэзюмаваць, без двукоссяў, CS50 і горных парод апрацоўваюцца як два асобных аргументаў. 603 00:49:38,780 --> 00:49:45,320 З двукоссямі, ён апрацоўваецца як адзін аргумент у цэлым. 604 00:49:45,320 --> 00:49:53,070 >> Мы бачым гэта з кропкі супыну. 605 00:49:53,070 --> 00:49:54,920 Да гэтага часу мы былі працуе наша праграма, і яна працуе ўжо 606 00:49:54,920 --> 00:49:58,230 да таго часу, пакуль альбо ён сегментах няспраўнасці або памылкі хіты 607 00:49:58,230 --> 00:50:05,930 або пакуль ён не завершыцца, і ўсё было ў поўным парадку. 608 00:50:05,930 --> 00:50:08,360 Гэта не абавязкова самая карысная рэч, таму што часам 609 00:50:08,360 --> 00:50:11,840 ў вас ёсць памылкі ў вашай праграме, але гэта не выклікае памылку сегментацыі. 610 00:50:11,840 --> 00:50:16,950 Гэта не выклікае вашу праграму, каб спыніць ці што-небудзь падобнае. 611 00:50:16,950 --> 00:50:20,730 Спосаб атрымаць GDB, каб прыпыніць праграму ў канкрэтнай кропцы 612 00:50:20,730 --> 00:50:23,260 , Каб усталяваць кропкі супыну. 613 00:50:23,260 --> 00:50:26,520 Вы можаце зрабіць гэта, усталяваўшы кропку супыну на імя функцыі 614 00:50:26,520 --> 00:50:30,770 ці вы можаце ўсталяваць кропкі супыну на пэўную радок кода. 615 00:50:30,770 --> 00:50:34,450 Я хацеў бы ўсталяваць кропкі супыну на функцыю імёнаў, таму што - лёгка запомніць, 616 00:50:34,450 --> 00:50:37,700 і калі вы на самой справе пайсці і змяніць свой зыходны код ўверх трохі, 617 00:50:37,700 --> 00:50:42,020 то ваша кропка супыну будзе фактычна заставацца на тым жа месцы ў кодзе. 618 00:50:42,020 --> 00:50:44,760 Прымаючы пад увагу, калі вы выкарыстоўваеце нумара радка і нумары радкі зменіцца 619 00:50:44,760 --> 00:50:51,740 таму што вы дадаць ці выдаліць частка кода, то вашы кропкі супыну усё цалкам аблажаўся. 620 00:50:51,740 --> 00:50:58,590 Адзін з самых распаўсюджаных рэчаў, якія я зрабіць, гэта ўсталяваць кропкі супыну на асноўныя функцыі. 621 00:50:58,590 --> 00:51:05,300 Часта я буду загружаць GDB, я тыпу У галоўнай, ударыў Enter, і што будзе ўсталяваць кропкі супыну 622 00:51:05,300 --> 00:51:10,630 на галоўнай функцыяй якога проста кажа: "Паўза праграмы, як толькі вы пачынаеце бегаць" 623 00:51:10,630 --> 00:51:17,960 і, такім чынам, калі я запускаю маю праграму, скажам, CS50 парод як два аргументу 624 00:51:17,960 --> 00:51:24,830 і націснуць Enter, ён трапляе ў асноўныя функцыі і спыняецца прама на самай першай лініі, 625 00:51:24,830 --> 00:51:30,620 Права, перш чым ён ацэньвае STRCMP функцыі. 626 00:51:30,620 --> 00:51:34,940 >> Так як я спыніўся, цяпер я магу пачаць адводам вакол і бачачы, што адбываецца 627 00:51:34,940 --> 00:51:40,250 з усімі розных зменных, якія перадаюцца ў маёй праграме. 628 00:51:40,250 --> 00:51:43,670 Тут я магу раздрукаваць ARGC і паглядзець, што адбываецца. 629 00:51:43,670 --> 00:51:50,030 Глядзіце, што агдс 3, таму што ён атрымаў 3 розныя значэнні ў ім. 630 00:51:50,030 --> 00:51:54,060 Ён атрымаў назву праграмы, ён атрымаў першы аргумент, а другі аргумент. 631 00:51:54,060 --> 00:52:09,330 Мы можам надрукаваць тыя з гледзячы на ​​ARGV [0], ARGV [1], і ARGV [2]. 632 00:52:09,330 --> 00:52:12,030 Так што цяпер вы можаце зразумець, чаму гэты выклік STRCMP збіраецца пацярпець няўдачу, 633 00:52:12,030 --> 00:52:21,650 таму што вы бачыце, што ён падзелены CS50 і скалы на дзве асобныя аргументы. 634 00:52:21,650 --> 00:52:27,250 На дадзены момант, як толькі вы патрапілі супыну, вы можаце працягнуць пакрокавае выкананне праграмы 635 00:52:27,250 --> 00:52:32,920 радок за радком, у адрозненне ад запуску праграмы зноў. 636 00:52:32,920 --> 00:52:35,520 Так што, калі вы не хочаце, каб запусціць праграму зноў і проста працягваць адсюль, 637 00:52:35,520 --> 00:52:41,970 Вы можаце выкарыстоўваць каманду працягваюцца і па-ранейшаму будзе выконваць праграму да канца. 638 00:52:41,970 --> 00:52:45,010 Гэтак жа, як гэта зрабіў тут. 639 00:52:45,010 --> 00:52:54,880 Аднак, калі я перазапусціць праграму, CS50 скалы, ён трапляе майго пункту супыну зноў, 640 00:52:54,880 --> 00:52:59,670 і на гэты раз, калі я не хачу, каб проста прайсці ўвесь шлях праз астатнюю частку праграмы, 641 00:52:59,670 --> 00:53:08,040 Я магу выкарыстоўваць наступную каманду, якую я таксама скарачэння з п. 642 00:53:08,040 --> 00:53:12,960 І гэта будзе крок у рамках праграмы радок за радком. 643 00:53:12,960 --> 00:53:17,530 Такім чынам, вы можаце назіраць, як рэчы, выконваць, як зменныя змены, як рэчы абнаўляецца. 644 00:53:17,530 --> 00:53:21,550 І гэта вельмі прыемна. 645 00:53:21,550 --> 00:53:26,570 Іншыя Выдатная рэч, а не паўтараць тую ж каманду зноў і зноў, і зноў, 646 00:53:26,570 --> 00:53:30,670 калі вы проста націсніце Enter - так што тут вы бачыце, што я не набраў ні ў чым - 647 00:53:30,670 --> 00:53:33,780 калі я проста націсніце Enter, ён будзе паўтараць папярэднюю каманду, 648 00:53:33,780 --> 00:53:36,900 або папярэдняй каманды GDB, што я проста ўставіў 649 00:53:36,900 --> 00:53:56,000 Я магу трымаць удар, і менавіта буду трымаць пакрокавага свой код радок за радком. 650 00:53:56,000 --> 00:53:59,310 Я хацеў бы заклікаць вас, хлопцы, каб пайсці праверыць іншыя праграмы багі, а таксама. 651 00:53:59,310 --> 00:54:01,330 У нас няма часу, каб прайсці праз усе з іх сёння ў раздзеле. 652 00:54:01,330 --> 00:54:05,890 Зыходны код ёсць, так што вы можаце збольшага бачыць, што адбываецца на 653 00:54:05,890 --> 00:54:07,730 за кулісамі, калі Вы сапраўды затрымаліся, 654 00:54:07,730 --> 00:54:11,940 але, па меншай меры, толькі практыка загрузцы GDB, 655 00:54:11,940 --> 00:54:13,940 выкананне праграмы пакуль не зламаецца на вас, 656 00:54:13,940 --> 00:54:18,260 атрыманне зваротнай трасіроўкі, высветліць, якія функцыі абвал адбыўся ў, 657 00:54:18,260 --> 00:54:24,450 якой лініі ён быў, выводзячы некаторых значэнняў зменных, 658 00:54:24,450 --> 00:54:30,140 толькі так вы адчуеце гэта, таму што сапраўды дапаможа вам у будучыні. 659 00:54:30,140 --> 00:54:36,340 На дадзены момант, мы збіраемся выйсці з GDB, якой вы выкарыстаннем кінуць або проста ц. 660 00:54:36,340 --> 00:54:40,460 Калі ваша праграма знаходзіцца ў сярэдзіне працуе да гэтага часу, і яна не выйшла, 661 00:54:40,460 --> 00:54:43,510 ён заўсёды спытае вас: «Вы ўпэўненыя, што сапраўды жадаеце выйсці?" 662 00:54:43,510 --> 00:54:48,770 Вы можаце проста націснуць так. 663 00:54:48,770 --> 00:54:55,250 >> Цяпер мы будзем глядзець на наступная праблема ў нас ёсць, што кошка праграмы. 664 00:54:55,250 --> 00:54:59,880 Калі вы паглядзіце на кароткі перанакіраваньні і трубы, вы ўбачыце, што Томі выкарыстоўвае гэтую праграму 665 00:54:59,880 --> 00:55:07,540 , Што ў асноўным друкуе усе выходныя файла на экран. 666 00:55:07,540 --> 00:55:12,660 Так што, калі я бягу кошка, гэта на самай справе убудаванай праграмы ў прыбор, 667 00:55:12,660 --> 00:55:16,860 і калі ў вас ёсць Macs вы можаце зрабіць гэта на вашым Mac таксама, калі вы адкрываеце тэрмінал. 668 00:55:16,860 --> 00:55:25,630 А мы - коткі, скажам, cp.c, і націсніце Enter. 669 00:55:25,630 --> 00:55:29,640 Тое, што гэта зрабілі, калі б мы прагортку уверх трохі і паглядзець, дзе мы правялі лінію, 670 00:55:29,640 --> 00:55:40,440 ці там, дзе мы запусцілі котку каманду, ён літаральна раздрукаваць змесціва cp.c на нашым экране. 671 00:55:40,440 --> 00:55:44,140 Мы можам запусціць яго зноў, і вы можаце пакласці ў некалькіх файлах. 672 00:55:44,140 --> 00:55:49,880 Такім чынам, вы можаце зрабіць котцы cp.c, і тады мы можам таксама аб'ядноўваць cat.c файл, 673 00:55:49,880 --> 00:55:53,250 якая з'яўляецца праграма, якую мы збіраемся пісаць, 674 00:55:53,250 --> 00:55:58,140 і ён будзе друкаваць як файлы назад, каб вярнуцца ў наш экран. 675 00:55:58,140 --> 00:56:05,490 Таму, калі мы прагортку уверх трохі, мы бачым, што калі мы запусцілі гэты кот cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 Спачатку ён раздрукаваў ф файл, а затым пад ім, ён раздрукаваў cat.c файл прама тут. 677 00:56:17,110 --> 00:56:19,650 Мы збіраемся выкарыстоўваць гэта, каб проста атрымаць нашы ногі мокрыя. 678 00:56:19,650 --> 00:56:25,930 Пагуляйце з простай друку на тэрмінал, паглядзім, як гэта працуе. 679 00:56:25,930 --> 00:56:39,170 Калі вы, хлопцы адкрываюць з Gedit cat.c, націсніце Enter, 680 00:56:39,170 --> 00:56:43,760 Вы можаце ўбачыць праграмы, якія мы збіраемся пісаць. 681 00:56:43,760 --> 00:56:48,980 Мы ўключылі гэта добрая пліта катла, таму мы не прыйдзецца марнаваць час на ўвод ўсё гэта. 682 00:56:48,980 --> 00:56:52,310 Мы таксама правяраем колькасць аргументаў, перададзеных цалі 683 00:56:52,310 --> 00:56:56,910 Мы раздрукаваць добрае паведамленне выкарыстанні. 684 00:56:56,910 --> 00:57:00,950 >> Гэта такая штука, што, зноў жа, як мы ўжо казалі, 685 00:57:00,950 --> 00:57:04,490 гэта амаль як цягліцавая памяць. 686 00:57:04,490 --> 00:57:07,190 Толькі не забудзьцеся захаваць рабіць тое ж самае роду рэчы 687 00:57:07,190 --> 00:57:11,310 і заўсёды раздрукоўку свайго роду карыснымі паведамленне 688 00:57:11,310 --> 00:57:17,670 так, што людзі ведаюць, як кіраваць вашай праграмы. 689 00:57:17,670 --> 00:57:21,630 З коткай, гэта даволі проста, мы проста збіраемся прайсці праз усе розныя аргументы 690 00:57:21,630 --> 00:57:24,300 , Якія былі перададзеныя нашай праграмы, і мы збіраемся для друку 691 00:57:24,300 --> 00:57:29,950 іх змесціва, каб на экране па адным. 692 00:57:29,950 --> 00:57:35,670 Для таго, каб друкаваць файлы з да экрану, мы збіраемся зрабіць нешта вельмі падобнае 693 00:57:35,670 --> 00:57:38,120 да таго, што мы зрабілі ў канцы віктарыны. 694 00:57:38,120 --> 00:57:45,350 У канцы віктарыны, якія наймаюць праграмы, мы павінны былі адкрыць файл, 695 00:57:45,350 --> 00:57:48,490 і тады мы павінны былі друкаваць на ім. 696 00:57:48,490 --> 00:57:54,660 У гэтым выпадку, мы збіраемся адкрыць файл, і мы будзем чытаць з яго замест гэтага. 697 00:57:54,660 --> 00:58:00,630 Тады мы ідзем да друку, а не ў файл, мы збіраемся друкаваць на экране. 698 00:58:00,630 --> 00:58:05,830 Такім чынам, друк на экране вы ўсё рабілі з Printf. 699 00:58:05,830 --> 00:58:08,290 Так што гэта не занадта вар'ятам. 700 00:58:08,290 --> 00:58:12,190 Але чытанне файлаў дзіўна. 701 00:58:12,190 --> 00:58:17,300 Мы будзем прайсці праз гэта трохі за адзін раз. 702 00:58:17,300 --> 00:58:20,560 Калі вы, хлопцы вярнуцца да гэтай апошняй праблемы на вашай віктарыны, задачы 33, 703 00:58:20,560 --> 00:58:27,280 першая лінія, што мы збіраемся тут рабіць, адкрыццё файла, вельмі падобныя на тое, што мы там рабілі. 704 00:58:27,280 --> 00:58:36,370 Такім чынам, Стэла, што робіць гэтую лінію выглядаць, калі мы адкрываем файл? 705 00:58:36,370 --> 00:58:47,510 [Stella] Сталіца FILE *, файл - >> Добра. >> - Роўна Еореп. >> Так. 706 00:58:47,510 --> 00:58:55,980 Якія ў гэтым выпадку? Гэта ў каментары. 707 00:58:55,980 --> 00:59:06,930 >> Гэта ў каментарах? ARGV [я] і г? 708 00:59:06,930 --> 00:59:11,300 >> Менавіта так. Прама на. Так Stella цалкам правы. 709 00:59:11,300 --> 00:59:13,720 Гэта тое, што лінія выглядае. 710 00:59:13,720 --> 00:59:19,670 Мы збіраемся, каб атрымаць пераменны паток файла, захаваць яго ў файле *, так што ўсе вечка, 711 00:59:19,670 --> 00:59:25,720 FILE *, і імя гэтай зменнай будзе файл. 712 00:59:25,720 --> 00:59:32,250 Мы маглі б назваць гэта ўсё, што мы хацелі. Мы маглі б назваць гэта first_file, або file_i, што б мы хацелі. 713 00:59:32,250 --> 00:59:37,590 І тады імя файла быў прыняты ў камандным радку гэтай праграмы. 714 00:59:37,590 --> 00:59:44,450 Такім чынам, ён захоўваецца ў ARGV [я], і затым мы збіраемся адкрыць гэты файл у рэжыме чытання. 715 00:59:44,450 --> 00:59:48,100 Цяпер, калі мы адкрылі файл, што тое, што мы заўсёды павінны памятаць, каб зрабіць 716 00:59:48,100 --> 00:59:52,230 кожны раз, калі мы адкрылі файл? Зачыніце яе. 717 00:59:52,230 --> 00:59:57,220 Такім чынам, місія, як мы зачыніць файл? 718 00:59:57,220 --> 01:00:01,020 [Missy] Fclose (файл) >> Fclose (файл). Менавіта так. 719 01:00:01,020 --> 01:00:05,340 Вялікі. Добра. Калі мы паглядзім на гэта, каб зрабіць каментар прама тут, 720 01:00:05,340 --> 01:00:11,940 ён кажа, "Адкрытыя ARGV [я] і раздрукаваць яго змесціва на стандартны вывад". 721 01:00:11,940 --> 01:00:15,460 >> Стандартны выхад гэта дзіўнае імя. Stdout гэта проста спосаб сказаць нашым 722 01:00:15,460 --> 01:00:22,880 Мы хочам, каб раздрукаваць яго на тэрмінал, мы хочам, каб раздрукаваць яго ў стандартны выхадны паток. 723 01:00:22,880 --> 01:00:26,450 Мы можам на самай справе пазбавіцца ад гэтага каментара прама тут. 724 01:00:26,450 --> 01:00:36,480 Я збіраюся скапіяваць яго і ўставіць яго, так як гэта тое, што мы і зрабілі. 725 01:00:36,480 --> 01:00:41,290 На дадзены момант, зараз у нас ёсць, каб прачытаць файл па кавалачках. 726 01:00:41,290 --> 01:00:46,300 Мы абмеркавалі некалькі спосабаў чытання файлаў. 727 01:00:46,300 --> 01:00:51,830 Якія вашы любімыя да гэтага часу? 728 01:00:51,830 --> 01:00:57,960 Якія спосабы вы бачылі ці вы памятаеце, для чытання файлаў? 729 01:00:57,960 --> 01:01:04,870 [Данііл] FREAD? >> FREAD? Так FREAD адзін. Джымі, вы ведаеце, любыя іншыя? 730 01:01:04,870 --> 01:01:12,150 [Джымі] Няма >> Добра. Няма. Шарлота? Аляксандр? Любыя іншыя? Добра. 731 01:01:12,150 --> 01:01:20,740 Такім чынам, астатнія з'яўляюцца fgetc, гэта той, які мы будзем выкарыстоўваць шмат. 732 01:01:20,740 --> 01:01:26,410 Там таксама fscanf, вы, хлопцы, бачыць ўзор тут? 733 01:01:26,410 --> 01:01:29,170 Усе яны пачынаюцца з F. Усё, што рабіць з файлам. 734 01:01:29,170 --> 01:01:35,260 Там у FREAD, fgetc, fscanf. Гэтыя ўсе функцыі чытання. 735 01:01:35,260 --> 01:01:49,120 Для размяшчэння ў нас ёсць FWRITE, у нас ёсць fputc замест fgetc. 736 01:01:49,120 --> 01:01:58,250 Мы таксама Fprintf, як мы бачылі на віктарыну. 737 01:01:58,250 --> 01:02:01,680 Так як гэта з'яўляецца праблемай, якая ўключае ў сябе чытанне з файла, 738 01:02:01,680 --> 01:02:04,940 Мы збіраемся выкарыстаць адну з гэтых трох функцый. 739 01:02:04,940 --> 01:02:10,890 Мы не збіраемся выкарыстоўваць гэтыя функцыі тут. 740 01:02:10,890 --> 01:02:14,880 Усе гэтыя функцыі ў стандартнай бібліятэцы ўводу / высновы. 741 01:02:14,880 --> 01:02:17,510 Так што, калі вы паглядзіце на верхнюю частку гэтай праграмы, 742 01:02:17,510 --> 01:02:24,110 Вы можаце бачыць, што мы ужо ўключаны файл загалоўка для стандартнай бібліятэкі ўводу / высновы. 743 01:02:24,110 --> 01:02:27,120 Калі мы хочам, каб высветліць, які мы хочам выкарыстоўваць, 744 01:02:27,120 --> 01:02:29,690 мы заўсёды можам адкрываць чалавеку старонак. 745 01:02:29,690 --> 01:02:34,350 Такім чынам, мы можа ўвесці чалавека STDIO 746 01:02:34,350 --> 01:02:43,180 і прачытаць усё пра STDIO уваходны і выхадны функцыі ў C. 747 01:02:43,180 --> 01:02:49,870 І мы ўжо бачым, ой, глядзі. Гэта згадка fgetc, гэта згадка fputc. 748 01:02:49,870 --> 01:02:57,220 Такім чынам, вы можаце разгарнуць трохі і паглядзім на, скажам, fgetc 749 01:02:57,220 --> 01:03:00,060 і паглядзіце на яго старонцы. 750 01:03:00,060 --> 01:03:03,430 Вы можаце бачыць, што ён ідзе разам з цэлай кучай іншых функцый: 751 01:03:03,430 --> 01:03:12,640 fgetc, ЕдеЬз, ЕОКП, GetChar атрымлівае, UNGETC, і яго ўводу знакаў і радкоў. 752 01:03:12,640 --> 01:03:19,180 Так што гэта, як мы чытаем у знакі і радкі з файлаў са стандартнага ўводу, 753 01:03:19,180 --> 01:03:21,990 якая з'яўляецца па сутнасці ад карыстальніка. 754 01:03:21,990 --> 01:03:24,780 І гэта, як мы гэта робім у рэальнай C. 755 01:03:24,780 --> 01:03:30,850 Так што гэта не выкарыстанне GetString і GetChar функцый 756 01:03:30,850 --> 01:03:36,840 , Якія мы выкарысталі з CS50 бібліятэкі. 757 01:03:36,840 --> 01:03:39,710 Мы збіраемся зрабіць гэтую праблему некалькімі спосабамі 758 01:03:39,710 --> 01:03:43,430 так што вы можаце ўбачыць два розных спосабу зрабіць гэта. 759 01:03:43,430 --> 01:03:48,490 І FREAD функцыі, што Данііл згадваецца і fgetc добрыя спосабы зрабіць гэта. 760 01:03:48,490 --> 01:03:53,790 Я думаю, што fgetc крыху лягчэй, таму што гэта толькі мае, як бачыце, 761 01:03:53,790 --> 01:03:59,660 адзін аргумент, FILE *, што мы спрабуем прачытаць знак з, 762 01:03:59,660 --> 01:04:02,740 і яе вяртаецца значэння Int. 763 01:04:02,740 --> 01:04:05,610 І гэта крыху дзіўна, ці не так? 764 01:04:05,610 --> 01:04:11,450 >> Таму што мы атрымліваем характар, дык чаму б не гэта вяртанне знакаў? 765 01:04:11,450 --> 01:04:18,700 Вы, хлопцы, ёсць якія-небудзь ідэі аб тым, чаму гэта не можа вярнуць знак? 766 01:04:18,700 --> 01:04:25,510 [Missy адказы, неразборліва] >> Так. Так Missy цалкам правы. 767 01:04:25,510 --> 01:04:31,570 Калі гэта ASCII, то гэта лік можа быць супастаўлены з фактычнымі знак. 768 01:04:31,570 --> 01:04:33,520 Можа быць ASCII сімвалаў, і гэта правільна. 769 01:04:33,520 --> 01:04:36,220 Гэта менавіта тое, што адбываецца. 770 01:04:36,220 --> 01:04:39,190 Мы выкарыстоўваем Int проста таму, што ён мае больш бітаў. 771 01:04:39,190 --> 01:04:44,750 Гэта больш, чым знак, наш сімвал мае толькі 8 біт, што 1 байт на наш 32-бітных машын. 772 01:04:44,750 --> 01:04:48,520 І Int мае варта ўсё 4 байта "прастору. 773 01:04:48,520 --> 01:04:50,940 І аказваецца, што шлях fgetc працуе, 774 01:04:50,940 --> 01:04:53,940 калі пракруціць ўніз у нашу рэзюмэ ў гэтым чалавеку старонцы трохі, 775 01:04:53,940 --> 01:05:05,000 пракруціць ўніз да ўпора. Аказваецца, што яны выкарыстоўваюць гэта адмысловае значэнне, званае EOF. 776 01:05:05,000 --> 01:05:09,640 Гэта спецыяльная пастаянная, значэнне, якое вяртаецца функцыяй fgetc 777 01:05:09,640 --> 01:05:14,570 кожны раз, калі вы патрапілі ў канец файла або калі вы атрымліваеце паведамленне пра памылку. 778 01:05:14,570 --> 01:05:18,170 І аказваецца, што для выканання гэтых параўнанняў з EOF належным чынам, 779 01:05:18,170 --> 01:05:24,060 Вы хочаце, што дадатковы аб'ём інфармацыі, якую вы маеце на Int 780 01:05:24,060 --> 01:05:28,420 па параўнанні з выкарыстаннем знакаў зменнай. 781 01:05:28,420 --> 01:05:32,130 Нават калі fgetc эфектыўна атрымліваць персанаж з файла, 782 01:05:32,130 --> 01:05:38,450 Вы хочаце, каб памятаць, што яна вяртаецца нешта такое, што тыпу Int да вас. 783 01:05:38,450 --> 01:05:41,360 Тым не менш, ён даволі просты ў выкарыстанні. 784 01:05:41,360 --> 01:05:44,960 Гэта дасць нам характар, таму ўсе, што мы павінны зрабіць, гэта працягваць задаваць файл, 785 01:05:44,960 --> 01:05:48,440 "Дайце мне наступны знак, дай мне наступны знак, дай мне наступную характар», 786 01:05:48,440 --> 01:05:51,400 пакуль мы не атрымаем да канца файла. 787 01:05:51,400 --> 01:05:54,730 І гэта будзе цягнуць у адзін знак за адзін раз з нашага файла, 788 01:05:54,730 --> 01:05:56,250 і тады мы можам рабіць усё, што мы хацелі з ёй. 789 01:05:56,250 --> 01:06:00,160 Мы можам захаваць яго, мы можам дадаць яго ў радок, мы можам раздрукаваць яго. 790 01:06:00,160 --> 01:06:04,630 Выканайце любое з гэтага. 791 01:06:04,630 --> 01:06:09,600 >> Павелічэнне назад і вярнуцца да нашых cat.c праграмы, 792 01:06:09,600 --> 01:06:16,170 калі мы збіраемся выкарыстаць fgetc, 793 01:06:16,170 --> 01:06:21,710 як мы маглі б падысці да гэтай наступнага радка кода? 794 01:06:21,710 --> 01:06:26,020 Мы збіраемся выкарыстаць - FREAD будзе рабіць нешта трохі адрозніваецца. 795 01:06:26,020 --> 01:06:32,600 І на гэты раз, мы проста збіраемся выкарыстоўваць fgetc, каб атрымаць адзін сімвал за адзін раз. 796 01:06:32,600 --> 01:06:40,910 Каб апрацаваць увесь файл, што мы маглі б рабіць? 797 01:06:40,910 --> 01:06:44,030 Колькі персанажаў ёсць у файле? 798 01:06:44,030 --> 01:06:47,390 Ёсць шмат. Такім чынам, вы, верагодна, хочаце, каб атрымаць адзін 799 01:06:47,390 --> 01:06:49,860 , А затым атрымаць іншую і атрымаць іншую і атрымаць іншую. 800 01:06:49,860 --> 01:06:53,330 Які алгарытм вы думаеце, мы маглі б выкарыстоўваць тут? 801 01:06:53,330 --> 01:06:55,470 Які тып - [Аляксандр] для цыклу? >> Менавіта так. 802 01:06:55,470 --> 01:06:57,500 Некаторыя тыпы цыклу. 803 01:06:57,500 --> 01:07:03,380 Цыкл на самай справе вялікі, і ў гэтым выпадку. 804 01:07:03,380 --> 01:07:08,620 І, як вы кажаце, гэта гучыць, як вы хочаце пятлю на ўвесь файл, 805 01:07:08,620 --> 01:07:11,820 атрымаць сімвал за адзін раз. 806 01:07:11,820 --> 01:07:13,850 Любыя прапановы аб тым, як гэта можа выглядаць? 807 01:07:13,850 --> 01:07:22,090 [Аляксандра, неразборліва] 808 01:07:22,090 --> 01:07:30,050 >> Добра, толькі скажы мне, на англійскай мове, што вы спрабуеце зрабіць? [Аляксандра, неразборліва] 809 01:07:30,050 --> 01:07:36,270 Такім чынам, у дадзеным выпадку, падобна, мы проста спрабуем пятлю на ўвесь файл. 810 01:07:36,270 --> 01:07:45,330 [Аляксандр] Так я <памер Int? >> Памер -? 811 01:07:45,330 --> 01:07:49,290 Я мяркую, што памер файла, дакладна? Памер - МЫ проста напісаць гэта так. 812 01:07:49,290 --> 01:07:57,470 Памер файла ў цяперашні час, я + +. 813 01:07:57,470 --> 01:08:04,610 Вось і атрымліваецца, што тое, як вы гэта з дапамогай fgetc, і гэта новае, 814 01:08:04,610 --> 01:08:10,460 у тым, што не існуе просты спосаб, каб проста атрымаць памер файла 815 01:08:10,460 --> 01:08:16,979 з гэтым "SizeOf" тыпу пабудуем, што вы бачылі раней. 816 01:08:16,979 --> 01:08:20,910 Калі мы выкарыстоўваем гэтую функцыю fgetc, мы ўяўляем нейкі 817 01:08:20,910 --> 01:08:29,069 новы, фанк сінтаксіс для гэтага цыклу, дзе замест выкарыстання толькі асноўны лічыльнік 818 01:08:29,069 --> 01:08:33,920 пайсці па адным знаку, мы збіраемся вывесці адзін знак за адзін раз, 819 01:08:33,920 --> 01:08:37,120 па адным знаку за адзін раз, і тое, як мы ведаем, што мы ў канцы 820 01:08:37,120 --> 01:08:41,290 Не тады, калі мы лічылі пэўную колькасць знакаў, 821 01:08:41,290 --> 01:08:49,939 Але калі мы характары выцягнуць тое, што спецыяльная сімвал канца файла. 822 01:08:49,939 --> 01:08:58,689 Такім чынам, мы можам зрабіць гэта, - я называю гэта гл, і мы збіраемся яго ініцыялізацыі 823 01:08:58,689 --> 01:09:08,050 наш першы выклік, каб атрымаць першы знак з файла. 824 01:09:08,050 --> 01:09:14,979 Такім чынам, гэтая частка прама тут, гэта будзе атрымаць знак з файла 825 01:09:14,979 --> 01:09:20,840 і захоўваць яго ў зменнай гл. 826 01:09:20,840 --> 01:09:25,420 Мы збіраемся працягваць рабіць гэта, пакуль мы дойдзем да канца файла, 827 01:09:25,420 --> 01:09:41,170 што мы і робім, тэстуючы для персанажа не роўныя, што адмысловы сімвал EOF. 828 01:09:41,170 --> 01:09:48,750 І тады замест таго, каб рабіць CH + +, якая б проста павялічыць значэнне, 829 01:09:48,750 --> 01:09:52,710 таму, калі мы чытаем з файла, капітал, скажам, 830 01:09:52,710 --> 01:09:56,810 CH + + дасць нам б, і тады мы атрымаем С, а затым г. 831 01:09:56,810 --> 01:09:59,310 Гэта відавочна не тое, што мы хочам. Што мы хочам тут 832 01:09:59,310 --> 01:10:05,830 У гэтым апошнім біт мы хочам атрымаць наступны знак з файла. 833 01:10:05,830 --> 01:10:09,500 >> Так як мы можам атрымаць наступны знак з файла? 834 01:10:09,500 --> 01:10:13,470 Як мы можам атрымаць першы знак з файла? 835 01:10:13,470 --> 01:10:17,200 [Студэнт] fgetfile? >> Fgetc, або, прабачце, вы мелі рацыю. 836 01:10:17,200 --> 01:10:20,470 Я няправільна яго прама там. Так што так. 837 01:10:20,470 --> 01:10:26,240 Тут замест таго, каб рабіць CH + +, 838 01:10:26,240 --> 01:10:29,560 Мы проста будзем называць fgetc (файл) зноў 839 01:10:29,560 --> 01:10:39,180 і захаваць вынік у нашых жа зменнай гл. 840 01:10:39,180 --> 01:10:43,730 [Студэнт пытанне, неразборліва] 841 01:10:43,730 --> 01:10:52,390 >> Гэта дзе гэтыя хлопцы FILE * з'яўляюцца спецыяльнымі. 842 01:10:52,390 --> 01:10:59,070 Тое, як яны працуюць, яны - пры першым адкрыцці - калі вы спачатку пераканайцеся, што Еореп выкліку, 843 01:10:59,070 --> 01:11:04,260 FILE * эфектыўна служыць у якасці паказальніка на пачатак файла. 844 01:11:04,260 --> 01:11:12,830 І тады кожны раз, калі вы тэлефануеце fgetc, яна рухаецца па адным знаку з дапамогай файла. 845 01:11:12,830 --> 01:11:23,280 Таму, калі вы называеце гэта, вы павялічваючы паказальнік на адзін знак. 846 01:11:23,280 --> 01:11:26,210 І калі вы fgetc зноў, вы рухаецеся гэта іншае персанаж 847 01:11:26,210 --> 01:11:28,910 і іншы характар ​​і іншы характар ​​і іншы персанаж. 848 01:11:28,910 --> 01:11:32,030 [Студэнт пытанне, неразборліва] >> А that's - так. 849 01:11:32,030 --> 01:11:34,810 Гэта свайго роду гэтая чароўная пад капотам. 850 01:11:34,810 --> 01:11:37,930 Вы проста працягвайце павялічваючы да канца. 851 01:11:37,930 --> 01:11:46,510 На дадзены момант, вы зможаце на самай справе працаваць з характарам. 852 01:11:46,510 --> 01:11:52,150 Такім чынам, як мы маглі б раздрукаваць гэта на экране, цяпер? 853 01:11:52,150 --> 01:11:58,340 Мы можам выкарыстоўваць тыя ж Printf рэч, якую мы выкарысталі раней. 854 01:11:58,340 --> 01:12:00,330 Тое, што мы ўжо выкарысталі ўвесь семестр. 855 01:12:00,330 --> 01:12:05,450 Мы можам назваць Printf, 856 01:12:05,450 --> 01:12:21,300 і мы можам перайсці ў характары проста так. 857 01:12:21,300 --> 01:12:27,430 Яшчэ адзін спосаб зрабіць гэта хутчэй, чым пры выкарыстанні Printf і маюць для гэтага фармату радкі, 858 01:12:27,430 --> 01:12:29,490 мы таксама можам выкарыстоўваць адну з іншых функцый. 859 01:12:29,490 --> 01:12:40,090 Мы можам выкарыстоўваць fputc, якая выводзіць знак на экран, 860 01:12:40,090 --> 01:12:52,580 выключэннем выпадкаў, калі мы глядзім на fputc - дазвольце мне маштаб няшмат. 861 01:12:52,580 --> 01:12:56,430 Мы бачым, што прыемна, ён прымае ў характары, што мы чытаем, выкарыстоўваючы fgetc, 862 01:12:56,430 --> 01:13:05,100 але тады мы павінны даць яму струмень у друк. 863 01:13:05,100 --> 01:13:11,850 Мы таксама можам выкарыстоўваць риЬспаг функцыю, якая наносіцца непасрэдна на стандартны вывад. 864 01:13:11,850 --> 01:13:16,070 Такім чынам, існуе цэлая куча розных варыянтаў, якія мы можам выкарыстоўваць для друку. 865 01:13:16,070 --> 01:13:19,580 Яны ўсе ў стандартнай бібліятэцы ўводу / высновы. 866 01:13:19,580 --> 01:13:25,150 Кожны раз, калі вы хочаце надрукаваць - так Printf, па змаўчанні, будуць друкавацца на адмысловай стандартныя з плыні, 867 01:13:25,150 --> 01:13:27,910 якіх з'яўляецца тое, што стандартны вывад. 868 01:13:27,910 --> 01:13:41,300 Такім чынам, мы можам проста спасылацца на яго як віду гэтай магічнае значэнне, стандартны вывад тут. 869 01:13:41,300 --> 01:13:48,410 Ой. Паставіць кропку з коскай звонку. 870 01:13:48,410 --> 01:13:52,790 >> Гэта шмат новага, напалоханы інфармацыяй тут. 871 01:13:52,790 --> 01:13:58,600 Шмат гэта вельмі ідыёматычны, у тым сэнсе, што гэта код 872 01:13:58,600 --> 01:14:05,700 што напісана такім чынам толькі таму, што гэта чыста чытаць, лёгка чытаецца. 873 01:14:05,700 --> 01:14:11,520 Ёсць шмат розных спосабаў зрабіць гэта, шмат розных функцый, якія вы можаце выкарыстоўваць, 874 01:14:11,520 --> 01:14:14,680 але мы, як правіла, проста выканайце гэтыя ж мадэлі зноў і зноў. 875 01:14:14,680 --> 01:14:20,180 Так што не здзіўляйцеся, калі ўбачыце такі код прыдумаць зноў і зноў. 876 01:14:20,180 --> 01:14:25,690 Добра. На дадзены момант, мы павінны разарваць на працягу дня. 877 01:14:25,690 --> 01:14:31,300 Дзякуй, што прыйшлі. Дзякуй за прагляд, калі вы знаходзіцеся ў сеткі. І мы ўбачымся на наступным тыдні. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]