1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [بخش 5: کمتر راحت] 2 00:00:02,730 --> 00:00:05,180 [مقابله Hardison، دانشگاه هاروارد] 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 به عنوان کد می رود از طریق این تابع swap. 21 00:01:20,250 --> 00:01:24,500 به طور خاص، چیزی است که ما به دنبال آن هستید - I'm رفتن به قرار دادن این اپل - 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 است که به طور موثر بازگشت از تابع swap ما به حق در اینجا. 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 برای شروع، ما قصد داریم به مقداردهی اولیه X 1 و Y تا 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 اپل TV معکوس، وجود دارد و ما به. باشه. 38 00:02:48,660 --> 00:02:51,670 بنابراین اگر من تلنگر به iPad، 39 00:02:51,670 --> 00:02:56,220 من می خواهم به مقداردهی اولیه X 1 و Y تا 2. 40 00:02:56,220 --> 00:03:00,580 ما که کاملا به سادگی با نوشتن 1 در جعبه مشخص شده X 41 00:03:00,580 --> 00:03:07,730 و (2) در جعبه Y مشخص شده اند. نسبتا ساده است. 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 ما عبور به آدرس X و آدرس Y را به عنوان پارامتر A و B به تابع swap. 45 00:03:28,110 --> 00:03:32,380 آدرس X و آدرس Y ها چیزهایی هستند که ما نمی توانیم محاسبه 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 آدرس x را در حافظه 10 است و آدرس Y در حافظه 14. 49 00:03:44,740 --> 00:03:51,870 بنابراین کسانی که ارزش هایی که دریافت به عنوان منتقل می شود A و B تا بالا در تابع swap ما. 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 ما می بینیم که راه مبادله کار می کند این است که من dereference و ذخیره نتیجه در TMP است. 55 00:04:21,079 --> 00:04:27,650 بنابراین اپراتور dereference می گوید، "هی. درمان محتویات متغیر را به عنوان یک آدرس است. 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 X varible 60 00:04:51,690 --> 00:04:55,480 از آنجا که ما با نقطه گلوله ما این است که آدرس x را در حافظه 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 [اسکندر] dereference اپراتور - که فقط حق ستاره در مقابل متغیر؟ 68 00:05:23,980 --> 00:05:27,600 >> بله. بنابراین اپراتور dereference، همانطور که ما تلنگر برگشت به لپ تاپ خود را یک بار دیگر، 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 که نیاز به دو چیز؛ اپراتور dereference یک عملگر یگانی است. 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 خط بعدی، ذخیره محتویات B به - 77 00:06:05,800 --> 00:06:12,630 یا، نه، ما این مطالب است که B اشاره به مکانی که در آن با اشاره به. 78 00:06:12,630 --> 00:06:17,690 اگر ما در این تجزیه و تحلیل را از راست به چپ، ما می رویم به B dereference، 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 و ما در حال رفتن به نتیجه dereference ما از B که به فضا پرتاب. 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 بنابراین ما می دانیم که در y، ما در آدرس 14، x در آدرس 10. 85 00:06:53,820 --> 00:07:00,180 هنگامی که ما در B شروع، ما dereference B، ما در حال رفتن به گرفتن ارزش 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 است که سمت راست وجود دارد، مربوط به متغیر x است. 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 بنابراین همه به خوبی و خوب در جهان است، حتی اگر X رونویسی در حال حاضر. 92 00:07:39,560 --> 00:07:44,890 ما ارزش قدیمی X در متغیر 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 و آنها را ذخیره را به متغیر زندگی می کند که در آدرس است که B برگزاری است. 97 00:08:05,630 --> 00:08:10,230 بنابراین ما در حال رفتن به B dereference به طور موثر برای دسترسی به متغیر 98 00:08:10,230 --> 00:08:14,340 است که در آدرس که B در آن نگه می دارد، 99 00:08:14,340 --> 00:08:19,190 و ما در حال رفتن به چیزهای مقدار که TMP است برگزاری به آن است. 100 00:08:19,190 --> 00:08:23,280 کوه در می رم بازگشت به اپل یک بار دیگر. 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 بنابراین کوه در می رم بازگشت به اپل یک بار دیگر، فقط، بنابراین شما می توانید نمودار تکمیل شده را مشاهده کنید، 107 00:08:58,940 --> 00:09:06,610 شما می توانید ببینید که در حال حاضر در 10، 14 در B، 1 در TMP، 2 X و 1 در Y است. 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 این علامت فقط گفت: "بدست آوردن آدرس که در آن زندگی متغیر x است." 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 آن را می داند، "اوه، من X در آدرس 10 قرار داده است. من Y در آدرس 14 قرار داده است." 138 00:11:31,110 --> 00:11:34,640 پس از آن می توانید در این مقادیر برای شما را پر کنید. 139 00:11:34,640 --> 00:11:44,740 بنابراین بعد از آن شما می توانید - آن را می توانید پس از این و با تصویب و Y و همچنین منتقل می کند. 140 00:11:44,740 --> 00:11:50,730 این بچه ها را دریافت کنید، اما آنها همچنین، هنگامی که شما آنها را به تصویب به تابع swap، 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 به این ترتیب، شما می دانید که چگونه بسیاری از بایت از اطلاعات در واقع بار از RAM شما. 150 00:12:29,020 --> 00:12:31,780 و پس از آن، بله، این اپراتور dereference، مثل شما می پرسم، 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، فایل I / O. 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 است، چرا که چند نفر از شما تا به حال استفاده از چیزهای مانند اکسل؟ 169 00:14:00,800 --> 00:14:03,240 شکل بسیاری از شما، احتمالا، خواهد شد و یا در برخی از نقطه در زندگی خود استفاده کنید. 170 00:14:03,240 --> 00:14:06,430 شما چیزی شبیه به اکسل استفاده کنید. 171 00:14:06,430 --> 00:14:10,940 به منظور دریافت داده ها از صفحه گسترده اکسل و یا انجام هر نوع پردازش آن، 172 00:14:10,940 --> 00:14:17,240 اگر شما می خواهید برای نوشتن یک برنامه C یا برنامه های پایتون، برنامه های جاوا، 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 و شما می توانید باز کردن اکسل و هنگامی که شما را به گفت و گو "به عنوان ذخیره"، 176 00:14:26,850 --> 00:14:32,840 شما می توانید از یک فایل CSV واقعی است. 177 00:14:32,840 --> 00:14:35,890 >> دستی می دانم که چگونه به مقابله با این چیزها. 178 00:14:35,890 --> 00:14:42,010 راه کار این است که آن را شبیه به - منظور من، آن را اساسا تقلید از یک صفحه گسترده (spreadsheet)، 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 بنابراین ما باید مالان، سپس Hardison، و پس از آن Bowden، MacWilliam، و پس از آن چان است. 182 00:14:54,670 --> 00:14:59,470 آخرین نام. و بعد یک کاما از هم جدا نام های گذشته از اولین نام است. 183 00:14:59,470 --> 00:15:02,970 دیوید، مقابله، راب، تامی، و 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 >> استخدام در عملکرد، مشکل می پرسد ما را به در - زوم we'll در این بیت کمی - 199 00:16:16,410 --> 00:16:22,480 را در ساختار پرسنل، ساختار کارکنان، با نام، 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 و بیایید ببینید، من می خواهم به استفاده از اپل؟ 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 ما خط fopen ما که به ما داده شده، 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 [استلا] من مطمئن نیستم. >> احساس رایگان به درخواست جیمی است. 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 دانلود. 260 00:21:46,990 --> 00:21:49,520 به طوری که مشکل 33 در مسابقه. 261 00:21:49,520 --> 00:21:52,480 خواهیم فایل قطعا بیشتر I / O بالا آمدن داشته باشد. 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 >> [شارلوت]] چرا 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 و دلیل این است که در پشت صحنه، هنگامی که شما را دعوت به fopen، 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 و مقدار بازگشتی fopen به شما می دهد جریان یک فایل *. 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 من کپی کردن این خط از کد را که می گوید، "http://cdn.cs50.net دستور wget". 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 چسباندن آن را در وجود دارد، و وقتی که من ضربه را وارد کنید، این دستور دستور 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 دایرکتوری با استفاده از دستور cd به بروید. 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 ما قصد داریم در فایل C در حال حاضر نگاه کنید. 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، من خطا SEG. 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 اما یکی از نفرت انگیز ترین چیز در مورد این خطا گسل SEG 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 آمار را وارد کنید. به من می دهد تمام این اطلاعات کپی رایت. 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 کامپایل، ما مجبور به استفاده از آن پرچم ویژه-G، 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 اما اگر شما در حال کامپایل دستی با صدای جرنگ جرنگ، و سپس شما باید به در و شامل که G پرچم. 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 ما هم می تواند اجرا شود، نوع و یا ما فقط می تواند نوع 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 سعد، اگر شما با نوع R و ضربه را وارد کنید، چه اتفاقی می افتد؟ 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 هنگامی که ما به نوع اجرا و یا تحقیق و آمار را وارد کنید، ما هنوز همان گسل SEG. 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 که بدان معنی است که آن را SEG گسلش در یکی از کتابخانه های سیستم. 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 >> اما من حدس می زنم چیز مبرم تر است، چرا که ما رو بدست گسل SEG، 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 هنگامی که شما دیوانه چیزی شبیه به این، هر زمان که شما می بینید یک خطای SEG، 413 00:34:55,500 --> 00:34:59,800 به خصوص اگر شما یک برنامه است که با استفاده از بیش از اصلی، 414 00:34:59,800 --> 00:35:03,570 به استفاده از backtrace. 415 00:35:03,570 --> 00:35:13,080 backtrace خلاصه من با نوشتن BT، به عنوان مخالف به کلمه backtrace کامل. 416 00:35:13,080 --> 00:35:16,510 اما شارلوت، چه اتفاقی می افتد وقتی که شما نوع BT و ضربه را وارد کنید؟ 417 00:35:16,510 --> 00:35:23,200 [شارلوت] این دو خط، 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 و backtrace به ما نه تنها از توابع است که در آن همه چیز شکست خورد، 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 و تو خطا SEG و 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 شما همچنین می توانید آن را با L مختصر. 441 00:37:13,650 --> 00:37:18,910 بنابراین، اگر ما ضربه L، آنچه ما به اینجا برسم؟ 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، شما سقوط، شما backtrace، 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 دختر خانم من نمی دانم چرا آن را توفنده. >> شما نمی دانم چرا آن را توفنده؟ 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 استلا؟ هر گونه افکار؟ 489 00:40:31,660 --> 00:40:38,110 [استلا] من مطمئن نیستم. >> مطمئن نیستم. دانیل؟ افکار؟ باشه. 490 00:40:38,110 --> 00:40:44,770 به نظر می رسد آنچه که اتفاق می افتد در اینجا این است که هنگامی که ما اجرا برنامه 491 00:40:44,770 --> 00:40:48,370 و ما گسل SEG، هنگامی که شما به فرار از این برنامه برای اولین بار، دانیل، 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 با استفاده از این فرمان دستی، شیک پوش P. 505 00:41:43,230 --> 00:41:48,520 بنابراین اگر من از نوع p و پس از آن مقدار یک متغیر و یا نام یک متغیر نوع، 506 00:41:48,520 --> 00:41:55,320 می گویند، argc، من می بینم که argc است 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 پس این است که چقدر ما disambiguate. 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 صفر 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 بنابراین غیر مرجع تهی، در تلاش برای دسترسی به همه چیز در تهی، 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 و اگر آن را SEG گسل، SEG گسل، و آن را به مشکل شما می باشد. شما باید برای تعمیر آن. 535 00:44:14,640 --> 00:44:19,730 واقعا به سرعت، چگونه ممکن است این مشکل را حل کنیم؟ شارلوت؟ 536 00:44:19,730 --> 00:44:23,540 [شارلوت] شما می توانید استفاده از اگر. 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 >> روش معمول برای انجام این کار این است که به استفاده از مقدار argc. 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 است که برای تست اینکه آیا یا نه مقدار argc ما همان چیزی است که ما انتظار داریم. 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 بنابراین، اجرا و یا باز هم، من می توانم 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 اما ما گسل SEG نیست. گفت که فرآیند به طور معمول خارج است. 562 00:46:37,610 --> 00:46:39,900 به طوری که به نظر می رسد خیلی خوب است. 563 00:46:39,900 --> 00:46:43,050 بدون خطا SEG تر، ما ساخته شده از آن گذشته، 564 00:46:43,050 --> 00:46:48,190 پس از آن به نظر می رسد که در واقع اشکال گسل SEG که ما گرفتن. 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 - فهرست فهرست ده خط قبل از - " 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 سنگ تایپ کنید، آن را چاپ A. " 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 درست مثل دانیل گفت که او انجام داد، و به شما ضربه را وارد کنید. 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 تا زمانی که آن را SEG گسل یا آمار بازدید یک خطا 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، من ب اصلی، نوع ضربه را وارد کنید که می خواهید یک نقطه انفصال تنظیم 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 >> از آنجا که من متوقف شد، در حال حاضر من می توانم شروع به mucking در اطراف و دیدن چه خبر 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 که argc 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 من می توانم دستور بعدی، که من نیز با N مختصر استفاده کنید. 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 اگر شما فقط ضربه را وارد کنید - در اینجا شما را به من در هر چیزی تایپ - 647 00:53:30,670 --> 00:53:33,780 اگر من فقط ضربه را وارد کنید، آن را به دستور قبلی تکرار، 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 backtrace، بدانند چه عمل تصادف در، 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 و اگر شما مکینتاش شما می توانید این کار را بر روی مک خود را بیش از حد، اگر شما در باز کردن ترمینال. 668 00:55:16,860 --> 00:55:25,630 و ما - گربه، بیایید می گویند، cp.c، و ضربه را وارد کنید. 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 برای اولین بار آن را چاپ فایل CP، و سپس در زیر آن، آن را به چاپ فایل 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، ضربه را وارد کنید، 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 [استلا] سرمایه * فایل، فایل - >> باشه. >> - برابر با fopen. >> آره. 706 00:58:47,510 --> 00:58:55,980 که در این مورد است؟ در نظر است. 707 00:58:55,980 --> 00:59:06,930 >> آن را در نظر؟ ی argv [i] و R؟ 708 00:59:06,930 --> 00:59:11,300 >> دقیقا. کلیک راست بر روی. بنابراین استلا، کاملا درست است. 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 [دختر خانم] fclose (پرونده) >> fclose (پرونده). دقیقا. 719 01:00:01,020 --> 01:00:05,340 بزرگ است. باشه. اگر ما در این نگاه به نظر حق در اینجا، 720 01:00:05,340 --> 01:00:11,940 آن را می گوید، "باز ی argv [i] و چاپ محتویات آن به STDOUT." 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، ما باید به جای fgetc fputc است. 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 این توابع در کتابخانه استاندارد I / O در بر داشت. 741 01:02:14,880 --> 01:02:17,510 بنابراین اگر شما در ابتدای این برنامه نگاه کنید، 742 01:02:17,510 --> 01:02:24,110 شما می توانید ببینید که ما در حال حاضر شامل فایل سرآیند کتابخانه استاندارد I / O است. 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، fgets، getc، 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 یک استدلال، * فایل است که ما در حال تلاش برای خواندن کاراکتر از، 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 [پاسخ دختر خانم، ناخوانا] >> آره. بنابراین دختر خانم کاملا درست است. 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 ما با استفاده از یک بین المللی تنها به دلیل آن است بیت. 771 01:04:39,190 --> 01:04:44,750 بزرگتر از یک کاراکتر، کاراکتر ما فقط 8 بیت، که 1 بایت ما در ماشین های 32 بیتی است. 772 01:04:44,750 --> 01:04:48,520 و بین المللی دارای ارزش هر 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 شما می خواهید به آن مقدار اضافی از اطلاعات است که شما را در بین المللی 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 من حدس می زنم اندازه فایل، درست است؟ اندازه - we'll فقط آن را مانند این ارسال. 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 بنابراین ما می توانیم این کار را با انجام - من به این CH، و ما در حال رفتن به آن را مقداردهی اولیه 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 و آن را ذخیره به CH متغیر است. 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 + + به ما ب را، و پس از آن ما می C و سپس D. 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 و ذخیره نتیجه را در متغیر CH ما همان است. 840 01:10:39,180 --> 01:10:43,730 [سوال دانشجو، ناخوانا] 841 01:10:43,730 --> 01:10:52,390 >> این جایی است که این بچه ها * فایل های ویژه می باشد. 842 01:10:52,390 --> 01:10:59,070 راه کار می کنند آنها است - هنگامی که شما برای اولین بار باز کردن - هنگامی که شما برای اولین بار که تماس fopen، 843 01:10:59,070 --> 01:11:04,260 * فایل به طور موثر به عنوان یک اشاره گر را به ابتدای فایل می رود. 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 ما همچنین می توانیم از تابع putchar، که به طور مستقیم قرار داده به خارج از استاندارد استفاده کنید. 864 01:13:11,850 --> 01:13:16,070 بنابراین یک دسته از گزینه های مختلف است که ما می توانیم برای چاپ استفاده کنید وجود دارد. 865 01:13:16,070 --> 01:13:19,580 همه آنها در کتابخانه استاندارد I / O. 866 01:13:19,580 --> 01:13:25,150 هر زمان که شما می خواهید برای چاپ - تا printf، به طور پیش فرض، به ویژه استاندارد جریان چاپ، 867 01:13:25,150 --> 01:13:27,910 این است که STDOUT. 868 01:13:27,910 --> 01:13:41,300 بنابراین ما فقط می تواند آن را به عنوان نوع از این ارزش سحر و جادو، STDOUT در اینجا مراجعه کنید. 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]