1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [بخش 5 - راحت تر] 2 00:00:02,500 --> 00:00:04,690 [راب Bowden - دانشگاه هاروارد 3 00:00:04,690 --> 00:00:07,250 [این CS50 است. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> مثل من در ایمیل من گفت، هستند بسیاری از چیزهایی که شما می توانید استفاده کنید وجود دارد 5 00:00:14,250 --> 00:00:17,060 دیگر از این دستگاه در واقع به مجموعه مشکل است. 6 00:00:17,060 --> 00:00:19,910 ما توصیه می کنیم شما آن را انجام دهید فقط به خاطر اینکه در این دستگاه پس از آن ما به راحتی می تواند به شما کمک کند 7 00:00:19,910 --> 00:00:22,070 و ما می دانیم که چگونه همه چیز را در حال رفتن به محل کار است. 8 00:00:22,070 --> 00:00:26,950 اما به عنوان یکی از نمونه های که در آن شما می توانید همه چیز را اگر، می گویند، شما دسترسی ندارد 9 00:00:26,950 --> 00:00:31,570 به دستگاه و یا شما می خواهید به کار در زیرزمین مرکز علوم - 10 00:00:31,570 --> 00:00:33,090 که در واقع آنها را به دستگاه بیش از حد - 11 00:00:33,090 --> 00:00:35,150 اگر شما می خواهید به کار در هر نقطه. 12 00:00:35,150 --> 00:00:42,370 یکی از نمونه های است که شما دیده / شنیده از SSH؟ 13 00:00:44,380 --> 00:00:47,780 SSH است که اساسا درست مثل اتصال به چیزی. 14 00:00:47,780 --> 00:00:51,340 در واقع، در حال حاضر من به دستگاه SSHed. 15 00:00:51,340 --> 00:00:54,290 من هرگز به طور مستقیم در دستگاه است. 16 00:00:55,930 --> 00:01:01,060 در اینجا است که لوازم خانگی، و اگر شما نگاه کردن در اینجا این آدرس IP شما را ببینید. 17 00:01:01,060 --> 00:01:03,650 من در خود دستگاه کار می کنند؛ 18 00:01:03,650 --> 00:01:08,840 من همیشه به پنجره / پنجره ترمینال iTerm2 آمده است. 19 00:01:08,840 --> 00:01:15,910 شما می توانید به آن آدرس IP، jharvard@192.168.129.128 SSH SSH. 20 00:01:15,910 --> 00:01:20,390 من به یاد داشته باشید که شماره به راحتی به دلیل آن را مانند یک الگوی خوب است. 21 00:01:20,390 --> 00:01:24,920 اما این به من برای رمز عبور من را بپرسید، و در حال حاضر من در دستگاه هستم. 22 00:01:24,920 --> 00:01:33,060 در واقع، در این نقطه، اگر شما باز کردن یک ترمینال در داخل خود دستگاه، 23 00:01:33,060 --> 00:01:36,350 ، با این حال شما می توانید از آن استفاده کنید، این رابط دقیقا همان 24 00:01:36,350 --> 00:01:40,010 به عنوان رابط من با استفاده از اینجا، اما در حال حاضر شما در حال SSHed. 25 00:01:42,240 --> 00:01:44,920 شما را به SSH به دستگاه ندارد. 26 00:01:44,920 --> 00:01:52,360 یکی از نمونه های دیگر جایی است که شما می تواند SSH برای من کاملا مطمئنم که شما به طور پیش فرض - 27 00:01:52,360 --> 00:01:55,020 آه. بزرگتر است. 28 00:01:55,020 --> 00:02:01,130 همه شما باید با حساب FAS به طور پیش فرض بر روی سرورهای FAS داشته باشد. 29 00:02:01,130 --> 00:02:06,840 برای من، من می خواهم SSH به rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 این رفتن به از شما بخواهد که برای اولین بار، و به شما می گویند بله. 31 00:02:11,610 --> 00:02:15,840 رمز عبور من فقط رفتن به رمز عبور FAS من. 32 00:02:15,840 --> 00:02:22,650 و بنابراین در حال حاضر، من به سرور خوب SSHed، و من می توانم هر چیزی که من در اینجا می خواهم انجام دهد. 33 00:02:22,650 --> 00:02:28,560 بسیاری از کلاس های که ممکن است، مانند 124، رفتن به چیزهای به اینجا آپلود کنید 34 00:02:28,560 --> 00:02:30,950 در واقع به مجموعه مشکل خود را ارسال کنید. 35 00:02:30,950 --> 00:02:34,100 اما می گویند که شما به دستگاه شما دسترسی داشته باشند. 36 00:02:34,100 --> 00:02:37,910 سپس شما می توانید از همه چیز، می خواهم در اینجا از آن خواهند گفت - 37 00:02:37,910 --> 00:02:42,160 این تنها بخش از سوالات. 38 00:02:42,160 --> 00:02:45,070 آن را به شما برای انجام این کار در دستگاه بپرسید. 39 00:02:45,070 --> 00:02:47,790 در عوض من فقط آن را بر روی سرور انجام دهد. 40 00:02:47,790 --> 00:02:50,560 من قصد دارم به زیپ لباس را باز کردن که. 41 00:02:50,560 --> 00:02:55,670 مشکل این است که رفتن به این باشد که شما با استفاده از چیزی شبیه به gedit استفاده می شود 42 00:02:55,670 --> 00:02:58,160 و یا هر آنچه در داخل دستگاه. 43 00:02:58,160 --> 00:03:01,830 شما نمی خواهید که این کار را بر روی سرور FAS. 44 00:03:01,830 --> 00:03:04,110 این همه فقط برای رفتن به این رابط متنی. 45 00:03:04,110 --> 00:03:09,180 بنابراین شما می توانید هر یک، سعی کنید یک ویرایشگر متن که آنها مجبور به یادگیری. 46 00:03:09,180 --> 00:03:12,130 آنها نانو. 47 00:03:12,130 --> 00:03:14,990 نانو است که معمولا بسیار آسان برای استفاده. 48 00:03:14,990 --> 00:03:19,470 شما می توانید فلش خود استفاده کنید و به طور معمول. 49 00:03:19,470 --> 00:03:21,250 به طوری که سخت نیست. 50 00:03:21,250 --> 00:03:24,720 اگر می خواهید واقعا فانتزی، شما می توانید ایمکس استفاده کنید، 51 00:03:24,720 --> 00:03:29,850 که من احتمالا باید باز نمی چرا که من حتی نمی دانند که چگونه به نزدیک ایمکس. 52 00:03:29,850 --> 00:03:32,760 کنترل X، کنترل C؟ آره. 53 00:03:32,760 --> 00:03:35,310 یا شما می توانید نیرو، که همان چیزی است که من با استفاده از استفاده کنید. 54 00:03:35,310 --> 00:03:37,800 و بنابراین کسانی که گزینه های خود را. 55 00:03:37,800 --> 00:03:43,830 اگر شما نمی خواهید برای انجام این کار، شما می توانید همچنین، اگر شما در نگاه manual.cs50.net - 56 00:03:43,830 --> 00:03:45,410 آه. 57 00:03:45,410 --> 00:03:49,920 بر روی یک کامپیوتر، شما می توانید از SSH با استفاده از بتونه، 58 00:03:49,920 --> 00:03:51,940 که شما در حال رفتن به برای دانلود به صورت جداگانه. 59 00:03:51,940 --> 00:03:55,460 در مک، شما می توانید تنها با استفاده از ترمینال به طور پیش فرض و یا شما می توانید iTerm2 دانلود، 60 00:03:55,460 --> 00:03:58,490 است که مانند ترمینال فانتزی و زیبا،. 61 00:03:58,490 --> 00:04:03,780 اگر شما به manual.cs50.net شما یک لینک به دفترچه یادداشت + +، 62 00:04:03,780 --> 00:04:07,120 که این همان چیزی است که شما می توانید بر روی یک کامپیوتر استفاده کنید. 63 00:04:07,120 --> 00:04:13,340 این به شما اجازه می دهد تا از SFTP دفترچه یادداشت + +، است که اساسا SSH. 64 00:04:13,340 --> 00:04:17,750 این به شما اجازه انجام ویرایش فایل های خود را به صورت محلی، 65 00:04:17,750 --> 00:04:20,670 و پس از آن هر زمان که شما می خواهید به آنها را ذخیره کنید، آن را به nice.fas ذخیره کنید، 66 00:04:20,670 --> 00:04:23,670 جایی که بعد از آن شما می توانید آنها را اجرا کنید. 67 00:04:23,670 --> 00:04:26,880 و معادل در مک به TextWrangler. 68 00:04:26,880 --> 00:04:28,760 پس از آن به شما اجازه می دهد تا انجام کار مشابه می باشد. 69 00:04:28,760 --> 00:04:32,800 این اجازه می دهد تا فایل های شما به صورت محلی و ذخیره آنها را به nice.fas، 70 00:04:32,800 --> 00:04:35,730 جایی که بعد از آن شما می توانید آنها را اجرا کنید. 71 00:04:35,730 --> 00:04:40,400 بنابراین اگر شما همیشه بدون دستگاه گیر کرده است، شما باید این گزینه 72 00:04:40,400 --> 00:04:44,230 به مجموعه مشکل خود را انجام دهد هنوز. 73 00:04:44,230 --> 00:04:48,250 یک مشکل خواهد بود که شما در حال رفتن به کتابخانه CS50 74 00:04:48,250 --> 00:04:51,580 چون nice.fas می کند به طور پیش فرض نداشته باشند. 75 00:04:51,580 --> 00:04:55,970 شما هم می توانید کتابخانه CS50 دانلود - 76 00:04:55,970 --> 00:04:58,470 من فکر نمی کنم نیاز دارم که در این نقطه است. 77 00:04:58,470 --> 00:05:03,270 شما هم می توانید کتابخانه CS50 دانلود و کپی آن را به nice.fas 78 00:05:03,270 --> 00:05:07,450 یا من فکر می کنم در این مرحله ما از آن استفاده نمی کنه به هر حال. 79 00:05:07,450 --> 00:05:12,720 و یا در صورتی که ما انجام می دهیم، شما می توانید در حال حاضر آن را جایگزین با 80 00:05:12,720 --> 00:05:18,480 پیاده سازی توابع در کتابخانه CS50 به هر حال. 81 00:05:18,480 --> 00:05:21,370 به طوری که نه باید این باشد که بسیاری از محدودیت است. 82 00:05:21,370 --> 00:05:23,710 و این است. 83 00:05:26,460 --> 00:05:29,820 >> من به دستگاه در حال حاضر، ما همه چیز را در دستگاه انجام دهد. 84 00:05:29,820 --> 00:05:37,510 در حال جستجو در بخش ما را از سوالات، در آغاز، مثل من در ایمیل من گفت، 85 00:05:37,510 --> 00:05:43,620 ما باید به صحبت در مورد یکی کوتاه شما را به تماشای قرار بود. 86 00:05:43,620 --> 00:05:51,980 ما هدایت و لوله ها و این سه پرسش. 87 00:05:51,980 --> 00:05:56,070 >> تا که جریان توابع مانند printf به طور پیش فرض ارسال کنید؟ 88 00:05:56,070 --> 00:05:59,130 بنابراین جریان است. جریان چیست؟ 89 00:06:06,520 --> 00:06:15,100 جریان است که اساسا آن را دوست دارم فقط برخی از - 90 00:06:15,100 --> 00:06:21,450 حتی یک منبع 1s و 0s. 91 00:06:21,450 --> 00:06:24,920 جریان آن را برای درخواست اینجا خارج از استاندارد است. 92 00:06:24,920 --> 00:06:27,250 و استاندارد کردن یک جریان است که هنگامی که شما را به نوشتن آن، 93 00:06:27,250 --> 00:06:30,940 آن را بر روی صفحه نمایش ظاهر می شود. 94 00:06:30,940 --> 00:06:36,860 خارج از استاندارد، توسط جریان، به این معنی شما فقط نوشتن 1s و 0s به آن، 95 00:06:36,860 --> 00:06:40,220 و انتهای دیگر خارج از استاندارد فقط از آن جریان می خواند. 96 00:06:40,220 --> 00:06:43,540 این فقط یک رشته از 1s و 0s. 97 00:06:43,540 --> 00:06:45,570 شما می توانید به جریان ارسال و یا شما می توانید از رودخانه ها به عنوان خوانده شده 98 00:06:45,570 --> 00:06:47,950 بسته در چه جریان واقع شده است. 99 00:06:47,950 --> 00:06:52,800 دو تن دیگر از جریان پیش فرض استاندارد در و خطای استاندارد است. 100 00:06:52,800 --> 00:06:57,540 استاندارد در هر زمان که شما GetString، این انتظار را برای شما به مسائل ورودی است. 101 00:06:57,540 --> 00:07:01,570 بنابراین آن را برای شما در انتظار، در واقع این استاندارد در انتظار، 102 00:07:01,570 --> 00:07:04,880 است که واقعا آنچه کسب می کنید زمانی که شما در صفحه کلید تایپ. 103 00:07:04,880 --> 00:07:07,530 شما در حال تایپ کردن را به استاندارد وارد 104 00:07:07,530 --> 00:07:10,050 خطای استاندارد به خارج از استاندارد است که اساسا معادل، 105 00:07:10,050 --> 00:07:13,280 اما تخصصی که در زمانی که شما را به خطا استاندارد نسخه قابل چاپ، 106 00:07:13,280 --> 00:07:16,770 شما قرار است به چاپ پیغام خطا به آن 107 00:07:16,770 --> 00:07:20,200 بنابراین شما می توانید بین پیام به طور منظم چاپ شده به روی صفحه نمایش متفاوت 108 00:07:20,200 --> 00:07:24,560 در مقابل پیام های خطا با توجه به اینکه آیا آنها به خارج از استاندارد و یا خطای استاندارد رفت. 109 00:07:24,560 --> 00:07:28,660 فایل های بیش از حد. 110 00:07:28,660 --> 00:07:32,440 خارج از استاندارد، استاندارد، و خطای استاندارد فقط ویژه جریان، 111 00:07:32,440 --> 00:07:36,810 اما واقعا هر فایل، زمانی که شما برای باز کردن یک فایل، آن را به یک جریان کلمه در ادامه متن می شود 112 00:07:36,810 --> 00:07:40,740 که در آن شما فقط می توانید از آن جریان را بخوانید. 113 00:07:40,740 --> 00:07:47,770 شما، در بیشتر قسمت ها، فقط می توانید از یک فایل به عنوان یک جریان بایت ها فکر می کنم. 114 00:07:47,770 --> 00:07:51,190 بنابراین جریان چه چیزی آنها را به طور پیش فرض بنویسید؟ خارج از استاندارد است. 115 00:07:51,190 --> 00:07:56,980 >> تفاوت بین> >> چه خبر؟ 116 00:07:58,140 --> 00:08:03,710 آیا کسی تماشای این ویدئو را از قبل؟ باشه. 117 00:08:03,710 --> 00:08:10,960 > رفتن به چگونه شما را به فایل های تغییر مسیر، 118 00:08:10,960 --> 00:08:15,240 و >> همچنین رفتن به تغییر مسیر خروجی را به فایل، 119 00:08:15,240 --> 00:08:17,820 اما آن به جای رفتن به الحاق به فایل. 120 00:08:17,820 --> 00:08:23,430 به عنوان مثال، اجازه دهید بگویم من به اتفاق DICT حق در اینجا، 121 00:08:23,430 --> 00:08:27,020 و این مسائل تنها در داخل بینی گربه، گربه، سگ، ماهی، سگ است. 122 00:08:27,020 --> 00:08:31,530 گربه یک دستور است که شما را در خط فرمان است. 123 00:08:31,530 --> 00:08:34,539 است که فقط رفتن به چاپ چه چیزی در یک فایل. 124 00:08:34,539 --> 00:08:40,679 بنابراین، هنگامی که من می گویم DICT گربه، آن را به چاپ گربه، گربه، سگ، ماهی، سگ است. که تمام گربه می کند. 125 00:08:40,679 --> 00:08:46,280 این بدان معنی است که آن را به استاندارد کردن گربه، گربه، سگ، ماهی، سگ چاپ. 126 00:08:46,280 --> 00:08:53,240 اگر من به جای می خواهید به تغییر مسیر است که به یک فایل، می توانید استفاده کنید> و هدایت آن را به هر فایل است. 127 00:08:53,240 --> 00:08:56,460 من فایل تماس بگیرید. 128 00:08:56,460 --> 00:09:00,320 بنابراین در حال حاضر اگر من LS، من نگاه کنید من یک فایل جدید به نام فایل. 129 00:09:00,320 --> 00:09:05,700 و اگر من آن را باز کردن، آن را دقیقا همان چیزی است که گربه را در خط فرمان است. 130 00:09:05,700 --> 00:09:11,040 بنابراین در حال حاضر اگر من این کار را دوباره، و سپس آن را به رفتن به تغییر مسیر خروجی را به فایل، 131 00:09:11,040 --> 00:09:13,930 و من قصد دارم به چیزی یکسان است. 132 00:09:13,930 --> 00:09:17,910 بنابراین از لحاظ فنی، آن را به طور کامل overrode آنچه که ما تا به حال. 133 00:09:17,910 --> 00:09:22,970 و خواهیم دید که اگر DICT را عوض کنم، من در زمان به سگ. 134 00:09:22,970 --> 00:09:29,980 در حال حاضر اگر ما گربه DICT به فایل دیگر، ما در حال رفتن به نسخه جدید با سگ برداشته است. 135 00:09:29,980 --> 00:09:32,400 پس آن را به طور کامل آن را لغو. 136 00:09:32,400 --> 00:09:36,640 در عوض، اگر ما به استفاده از >>، آن را به رفتن به پیوست فایل. 137 00:09:36,640 --> 00:09:40,860 در حال حاضر، باز کردن فایل، ما می بینیم ما تنها چیزی که چاپ دو برابر 138 00:09:40,860 --> 00:09:44,920 چرا که آنجا بود یک بار، پس از آن ما به متن اصلی اضافه شده است. 139 00:09:44,920 --> 00:09:48,130 بنابراین این چیزی است که> و >> انجام دهد. 140 00:09:48,130 --> 00:09:50,580 آیا یکی از بعدی بپرسید - این کار در مورد آن بپرسید. 141 00:09:50,580 --> 00:09:59,050 >> یکی دیگر که در حال حاضر <، که اگر> تغییرمسیر خارج از استاندارد است، 142 00:09:59,050 --> 00:10:01,970 <برای رفتن به تغییر مسیر استاندارد وارد 143 00:10:01,970 --> 00:10:12,050 بیایید ببینیم که اگر ما به عنوان مثال. 144 00:10:14,750 --> 00:10:16,930 من می توانم یک میانبر واقعی بنویسید. 145 00:10:17,870 --> 00:10:25,700 بیایید هر فایل، hello.c. 146 00:10:56,060 --> 00:10:59,070 نسبتا ساده فایل. 147 00:10:59,070 --> 00:11:03,570 من فقط یک رشته و سپس چاپ "سلام" هر چه رشته بود من فقط وارد است. 148 00:11:03,570 --> 00:11:07,990 با سلام و پس از آن را. / سلام. 149 00:11:07,990 --> 00:11:10,720 حال حاضر آن را به من باعث به چیزی وارد کنید 150 00:11:10,720 --> 00:11:15,070 که بدان معنی است که در انتظار همه چیز را به استاندارد وارد می شود وارد 151 00:11:15,070 --> 00:11:20,450 بنابراین هر آنچه که من را به استاندارد می خواهید شوید. ما فقط برای گفتن سلام، راب را وارد کنید! 152 00:11:20,450 --> 00:11:23,310 سپس آن را چاپ استاندارد از خوش آمدید، راب! 153 00:11:23,310 --> 00:11:28,860 اگر من / با سلام و پس از آن تغییر مسیر، 154 00:11:30,740 --> 00:11:34,310 در حال حاضر شما تنها می توانید از یک فایل هدایت. 155 00:11:34,310 --> 00:11:41,720 بنابراین اگر من در بعضی از فایل، TXT قرار داده است، و من قرار راب، 156 00:11:41,720 --> 00:11:52,300 اگر من را اجرا سلام و سپس تغییر مسیر فایل TXT به / سلام، آن را برای گفتن سلام، راب! بلافاصله. 157 00:11:52,300 --> 00:11:57,160 هنگامی که آن را برای اولین بار به GetString می شود و آن را در انتظار استاندارد در، 158 00:11:57,160 --> 00:12:01,730 استاندارد در دیگر انتظار بر روی صفحه کلید برای داده ها را به وارد. 159 00:12:01,730 --> 00:12:05,980 در عوض، ما را در خواندن از فایل TXT استاندارد هدایت می شوید. 160 00:12:05,980 --> 00:12:10,290 و پس از آن رفتن به خواندن از کلیپ برد چند منظوره فایل است که فقط راب خط، 161 00:12:10,290 --> 00:12:13,380 و سپس آن را به چاپ میهمان گرامی، راب! 162 00:12:13,380 --> 00:12:18,180 و اگر من می خواستم، من نیز می توانند انجام دهند / خوش آمدید 00:12:21,500 و پس از آن استاندارد خارج است که چاپ آن، است که میهمان گرامی، راب! 164 00:12:21,500 --> 00:12:24,700 من می توانم آن را به فایل های خاص خود را هدایت کنید. 165 00:12:24,700 --> 00:12:29,790 من فقط فایل خوش آمدید تماس بگیرید - نه، من نمی خواهد، چرا که اجرایی - txt2. 166 00:12:29,790 --> 00:12:40,150 در حال حاضر، txt2 رفتن به خروجی / سلام <کلیپ برد چند منظوره، که به خوش آمدید راب! 167 00:12:41,370 --> 00:12:43,520 >> پرسش و پاسخ؟ 168 00:12:45,900 --> 00:12:49,090 >> باشه. بنابراین در اینجا ما به خط لوله. 169 00:12:49,090 --> 00:12:53,510 لوله، واحد آخرین تغییر مسیر است. 170 00:12:53,510 --> 00:12:58,750 >> آه. من حدس می زنم یک واحد بیشتر از تغییر مسیر است اگر به جای آن از> 2> 171 00:12:58,750 --> 00:13:01,070 که هدایت خطای استاندارد. 172 00:13:01,070 --> 00:13:06,280 بنابراین اگر چیزی رفت و به خطای استاندارد، آن را به txt2 می کنید قرار داده است. 173 00:13:06,280 --> 00:13:12,480 اما توجه کنید که اگر من 2>، سپس آن را هنوز چاپ میهمان گرامی، راب! از خط فرمان 174 00:13:12,480 --> 00:13:18,600 چون من فقط هدایت خطای استاندارد، من استاندارد هدایت نمی کردن. 175 00:13:18,600 --> 00:13:22,210 خطای استاندارد و استاندارد کردن متفاوت است. 176 00:13:24,210 --> 00:13:27,080 اگر شما می خواهید به واقع به خطای استاندارد نوشتن، 177 00:13:27,080 --> 00:13:35,080 پس از آن من می توانم این را به fprintf به stderr را تغییر دهید. 178 00:13:35,080 --> 00:13:37,850 تا printf، به طور پیش فرض، چاپ به خارج از استاندارد است. 179 00:13:37,850 --> 00:13:41,720 اگر من می خواهم برای چاپ به خطای استاندارد به صورت دستی، پس از آن من مجبور به استفاده از fprintf 180 00:13:41,720 --> 00:13:45,010 و مشخص آنچه که من می خواهم تا در آن چاپ شود. 181 00:13:45,010 --> 00:13:49,720 اگر به جای من به STDOUT fprintf، پس از آن که اساسا معادل printf است. 182 00:13:49,720 --> 00:13:55,530 اما fprintf به خطای استاندارد. 183 00:13:57,790 --> 00:14:03,650 بنابراین در حال حاضر، در صورتی که این تغییر مسیر به txt2، خوش آمدید، راب! هنوز هم در خط فرمان چاپ 184 00:14:03,650 --> 00:14:08,270 از آن رسیدن به خطای استاندارد چاپ شده و من فقط هدایت استاندارد خارج شده است. 185 00:14:08,270 --> 00:14:16,420 اگر من در حال حاضر تغییر مسیر خطای استاندارد، در حال حاضر آن را انجام نمی چاپ شده، و txt2 است برای رفتن به میهمان گرامی، راب! 186 00:14:16,420 --> 00:14:21,910 بنابراین در حال حاضر، شما می توانید خطاهای واقعی خود را به خطای استاندارد چاپ 187 00:14:21,910 --> 00:14:24,720 و چاپ پیام به طور منظم خود را به خارج از استاندارد است. 188 00:14:24,720 --> 00:14:31,420 و تا زمانی که اجرای برنامه خود را، شما می توانید آن را به عنوان اجرا / خوش آمدید این نوع با 2> 189 00:14:31,420 --> 00:14:33,800 به طوری که برنامه خود را به اجرا به طور معمول، 190 00:14:33,800 --> 00:14:38,400 اما هر پیغام خطا که شما بعدا می توانید چک کنید در ورود خطا، 191 00:14:38,400 --> 00:14:44,500 بنابراین اشتباهات، و سپس بعد از آن نگاه و خطاهای فایل خود را به هر خطایی که اتفاق افتاده است را به همراه خواهد داشت. 192 00:14:45,200 --> 00:14:47,540 >> پرسش و پاسخ؟ 193 00:14:47,540 --> 00:14:58,070 >> یکی از آخرین لوله، که شما می توانید از فکر می کنم به عنوان استاندارد از یک دستور است 194 00:14:58,070 --> 00:15:01,210 و ساخت آن استاندارد در دستور بعدی. 195 00:15:01,210 --> 00:15:05,570 به عنوان مثال در اینجا اکو خط فرمان چیزی است 196 00:15:05,570 --> 00:15:11,840 است که فقط رفتن به اکو هر آنچه که من به عنوان آرگومان آن قرار داده است. من به نقل قول قرار داده است. 197 00:15:11,840 --> 00:15:16,150 اکو، اه، اه، اه، فقط رفتن است به چاپ، اه، اه، اه. 198 00:15:16,150 --> 00:15:20,600 پیش از این، زمانی که من گفتم: من تا به حال برای قرار دادن راب را به یک فایل TXT 199 00:15:20,600 --> 00:15:28,830 چون من فقط می تواند تغییر مسیر فایل های TXT، به جای آن، / اگر من اکو راب 200 00:15:28,830 --> 00:15:35,520 و پس از آن لوله آن را به. / سلام، که همچنین انجام خواهد داد از همان نوع از چیزی. 201 00:15:35,520 --> 00:15:39,160 این است که با در نظر گرفتن خروجی این دستور، اکو راب، 202 00:15:39,160 --> 00:15:43,610 و با استفاده از آن به عنوان ورودی برای. / سلام. 203 00:15:44,790 --> 00:15:49,560 شما می توانید از آن فکر می کنم به عنوان اولین تغییر مسیر اکو راب را به یک فایل 204 00:15:49,560 --> 00:15:54,160 و سپس ورودی را به / خوش آمدید که فایل که فقط خروجی بود. 205 00:15:54,160 --> 00:15:57,850 اما طول می کشد فایل موقت خارج از تصویر است. 206 00:16:01,890 --> 00:16:04,460 >> سوالات مطرح شده در آن؟ 207 00:16:04,460 --> 00:16:07,150 >> سوال بعدی این است در صدد این است. 208 00:16:07,150 --> 00:16:15,310 چه خط لوله می تواند شما را برای پیدا کردن شماره از نام های منحصر به فرد در یک فایل به نام names.txt؟ 209 00:16:15,310 --> 00:16:24,160 ما قصد داریم که مایل به استفاده از دستورات منحصر به فرد، به طوری uniq، و سپس WC. 210 00:16:24,160 --> 00:16:28,840 شما می توانید uniq مرد به در واقع در آنچه که نمی تواند انجام دهد، 211 00:16:28,840 --> 00:16:34,840 و آن را فقط برای فیلتر کردن مجاور مطابق خطوط از ورودی است. 212 00:16:34,840 --> 00:16:40,690 و انسان WC به چاپ خط جدید، ورد، و تعداد بایت برای هر فایل. 213 00:16:40,690 --> 00:16:43,760 و آخرین ما قصد داریم که مایل به استفاده از مرتب کردن بر اساس: 214 00:16:43,760 --> 00:16:47,410 که در حال رفتن به مرتب کردن خطوط از فایل TXT. 215 00:16:47,410 --> 00:16:58,080 اگر من بعضی از فایل TXT، names.txt، و آن را راب، تامی، جوزف، تامی، یوسف، RJ، راب، 216 00:16:58,080 --> 00:17:03,910 آنچه من می خواهم به انجام این کار در اینجا پیدا کردن شماره از نام های منحصر به فرد در این فایل است. 217 00:17:03,910 --> 00:17:08,750 پس چه باید پاسخ می شود؟ >> [دانشجو] 4. >> آره. 218 00:17:08,750 --> 00:17:13,780 باید 4 از راب، تامی، جوزف، RJ به نام تنها منحصر به فرد در این فایل است. 219 00:17:13,780 --> 00:17:20,180 مرحله اول، اگر من فقط تعداد کلمه در names.txt، 220 00:17:20,180 --> 00:17:24,290 این است که در واقع به من گفتن همه چیز است. 221 00:17:24,290 --> 00:17:32,560 این است که در واقع چاپ - بیایید ببینید، انسان WC - خطوط، کلمات، و تعداد بایت. 222 00:17:32,560 --> 00:17:38,270 اگر من فقط در مورد خطوط، پس من فقط می تواند WC-L names.txt انجام دهد. 223 00:17:41,730 --> 00:17:44,300 به طوری که مرحله 1. 224 00:17:44,300 --> 00:17:50,510 اما من به WC-L names.txt می خواهم نه به خاطر names.txt فقط شامل تمام اسامی، 225 00:17:50,510 --> 00:17:54,170 و من می خواهم به فیلتر کردن هر گونه منحصر به فرد است. 226 00:17:54,170 --> 00:18:01,200 بنابراین اگر من uniq names.txt، که نمی تواند کاملا به من به آنچه من می خواهم 227 00:18:01,200 --> 00:18:03,760 به این دلیل که نام تکرار هنوز هم وجود دارد. 228 00:18:03,760 --> 00:18:07,690 این است که چرا؟ چرا uniq انجام نمی دهد چه من می خواهم؟ 229 00:18:07,690 --> 00:18:10,500 [دانشجو] تکراری نیستند [نامفهوم] >> آره. 230 00:18:10,500 --> 00:18:16,370 به یاد داشته باشید به صفحه uniq می گوید خطوط فیلتر تطبیق مجاور. 231 00:18:16,370 --> 00:18:19,680 آنها مجاور نیست، پس از آن آنها را فیلتر نیست. 232 00:18:19,680 --> 00:18:31,100 اگر من مرتب آنها را، names.txt مرتب سازی بر رفتن به قرار دادن تمام خطوط تکراری را با هم. 233 00:18:31,100 --> 00:18:34,450 بنابراین در حال حاضر names.txt مرتب کردن بر اساس آن است که. 234 00:18:34,450 --> 00:18:40,550 من می خواهم به استفاده از آن به عنوان ورودی به uniq، که | uniq. 235 00:18:40,550 --> 00:18:43,390 است که به من یوسف، RJ، راب، تامی، 236 00:18:43,390 --> 00:18:49,260 و من می خواهم به استفاده از آن به عنوان ورودی به WC-L، 237 00:18:49,260 --> 00:18:52,740 است که به من 4 را. 238 00:18:52,740 --> 00:18:56,930 مانند آن را می گوید در اینجا، چه خط لوله می تواند شما را استفاده می کنید؟ 239 00:18:56,930 --> 00:19:01,390 شما می توانید بسیاری از چیزهایی مثل استفاده از یک سری از دستورات را انجام دهد 240 00:19:01,390 --> 00:19:05,130 که در آن شما با استفاده از خروجی یک دستور به عنوان ورودی به فرمان بعدی. 241 00:19:05,130 --> 00:19:08,780 شما می توانید بسیاری از چیزها، بسیاری از چیزهایی هوشمندانه انجام دهد. 242 00:19:08,780 --> 00:19:11,440 >> پرسش و پاسخ؟ 243 00:19:12,910 --> 00:19:14,600 باشه. 244 00:19:14,600 --> 00:19:17,880 است که آن را برای لوله ها و تغییر مسیر است. 245 00:19:18,370 --> 00:19:24,090 >> در حال حاضر ما به چیزهای واقعی، مسائل برنامه نویسی. 246 00:19:24,090 --> 00:19:29,100 در داخل این PDF، شما می توانید این دستور را ببینید، 247 00:19:29,100 --> 00:19:32,950 و شما می خواهید این دستور برای اجرا در دستگاه های خود را. 248 00:19:36,240 --> 00:19:42,250 دستور wget دستور فقط برای گرفتن چیزی از اینترنت، در واقع، 249 00:19:42,250 --> 00:19:45,180 بنابراین دستور wget و این URL. 250 00:19:45,180 --> 00:19:49,110 اگر شما به این URL را در مرورگر خود رفت، آن را که فایل را دانلود کنید. 251 00:19:49,110 --> 00:19:52,510 من فقط بر روی آن کلیک، پس از آن فایل را برای من دریافت شده است. 252 00:19:52,510 --> 00:19:55,650 اما نوشتن چیزی که در داخل ترمینال دستور wget 253 00:19:55,650 --> 00:19:58,620 فقط رفتن به آن را به ترمینال خود را دانلود کنید. 254 00:19:58,620 --> 00:20:02,750 من از section5.zip است، و شما می خواهید به زیپ لباس را باز کردن section5.zip، 255 00:20:02,750 --> 00:20:06,520 است که به شما یک پوشه به نام section5، 256 00:20:06,520 --> 00:20:11,550 است که به زودی همه از فایل های ما قصد داریم با استفاده از امروز در داخل آن است. 257 00:20:33,380 --> 00:20:37,710 این برنامه نام فایل نشان می دهد، آنها کمی حشره دار، 258 00:20:37,710 --> 00:20:40,990 ماموریت شما این است که چرا با استفاده از GDB. 259 00:20:40,990 --> 00:20:44,560 آیا همه آنها را دانلود / می دانم که چگونه می توانید آنها را دریافت 260 00:20:44,560 --> 00:20:47,480 به دستگاه خود را؟ باشه. 261 00:20:47,480 --> 00:20:56,400 >> در حال اجرا ./buggy1، آن را به خطا تقسیم بندی (هسته ریخته) می گویند، 262 00:20:56,400 --> 00:21:00,500 که هر زمان شما segfault، این یک چیز بد است. 263 00:21:00,500 --> 00:21:03,810 تحت چه شرایطی انجام segfault می کنید؟ 264 00:21:03,810 --> 00:21:08,210 [دانشجو] غیر مرجع اشاره گر تهی است. >> آره. به طوری که یک نمونه است. 265 00:21:08,210 --> 00:21:11,580 بصورت غیر مرجع اشاره گر تهی که شما در حال رفتن به segfault. 266 00:21:11,580 --> 00:21:16,720 چه segfault به معنی این است که شما در حال لمس کردن حافظه شما نباید لمس کردن است. 267 00:21:16,720 --> 00:21:21,350 بنابراین غیر مرجع اشاره گر تهی دست زدن به آدرس 0. 268 00:21:21,350 --> 00:21:28,060 و در واقع، تمام کامپیوترها در حال حاضر می گویند که 0 آدرس حافظه شما نباید لمس کردن است. 269 00:21:28,060 --> 00:21:31,920 بنابراین به همین دلیل است که بصورت غیر مرجع اشاره گر تهی در segfault. 270 00:21:31,920 --> 00:21:37,210 هنگامی که شما اتفاق می افتد به مقداردهی اولیه اشاره گر، سپس آن را دارای ارزش زباله، 271 00:21:37,210 --> 00:21:41,520 و بنابراین، هنگامی که شما سعی کنید به dereference آن، به احتمال زیاد شما در حال لمس کردن حافظه 272 00:21:41,520 --> 00:21:43,540 که در وسط هیچ جا. 273 00:21:43,540 --> 00:21:45,650 اگر شما اتفاق می افتد به خوش شانس و ارزش زباله 274 00:21:45,650 --> 00:21:48,440 اتفاق افتاده به نقطه را به جایی در پشته و یا چیزی، 275 00:21:48,440 --> 00:21:50,820 پس از آن زمانی که شما dereference که اشاره گر آن شما را مقداردهی اولیه نیست، 276 00:21:50,820 --> 00:21:52,730 هیچ چیز اشتباه است. 277 00:21:52,730 --> 00:21:55,480 اما اگر آن را با اشاره به، می گویند، جایی میان پشته و پشته، 278 00:21:55,480 --> 00:21:59,850 و یا آن را با اشاره فقط به جایی است که از طریق برنامه خود را استفاده نمی شود در عین حال، 279 00:21:59,850 --> 00:22:02,240 سپس شما لمس کردن حافظه شما نباید لمس کردن و شما segfault. 280 00:22:02,240 --> 00:22:06,370 هنگامی که شما در نوشتن یک تابع بازگشتی و بار بیش از حد بسیاری از recurses 281 00:22:06,370 --> 00:22:08,720 و پشته شما رشد می کند به همه چیز بیش از حد بزرگ و از برخورد پشته 282 00:22:08,720 --> 00:22:12,270 که باید آن را نه با برخورد، شما در حال لمس کردن حافظه شما نباید لمس کردن، 283 00:22:12,270 --> 00:22:14,810 بنابراین شما segfault. 284 00:22:14,810 --> 00:22:17,010 است که چه segfault. 285 00:22:17,010 --> 00:22:21,810 >> همچنین به همین دلیل است که اگر شما یک رشته مانند - 286 00:22:21,810 --> 00:22:23,930 اجازه بازگشت به برنامه های قبلی است. 287 00:22:23,930 --> 00:22:28,530 در hello.c-I'm فقط رفتن را به چیز دیگری است. 288 00:22:28,530 --> 00:22:33,770 کاراکتر * S = "سلام جهان!"؛ 289 00:22:33,770 --> 00:22:42,310 اگر من با استفاده از * S = چیزی یا S [0] = 'X'؛ 290 00:22:42,310 --> 00:22:47,290 بنابراین مطمئن خوش آمدید. / سلام، چرا که segfault؟ 291 00:22:48,410 --> 00:22:51,250 چرا این segfault؟ 292 00:22:55,660 --> 00:22:57,890 چه شما انتظار می رود رخ می دهد؟ 293 00:22:57,890 --> 00:23:06,640 اگر من printf ("٪ S \ N"، s)؛ آنچه را که شما انتظار می رود که باید چاپ شود؟ 294 00:23:06,640 --> 00:23:09,930 [دانشجوی] X سلام. >> آره. 295 00:23:09,930 --> 00:23:15,140 مشکل این است که هنگامی که یک رشته مانند این به شما اعلام، 296 00:23:15,140 --> 00:23:18,190 یک اشاره گر است که بر روی پشته است، 297 00:23:18,190 --> 00:23:25,880 و چه با اشاره به این رشته موجود است که در حافظه فقط خواندنی است. 298 00:23:25,880 --> 00:23:30,560 بنابراین فقط با نام، حافظه فقط خواندنی، شما باید این ایده را بدست آورید 299 00:23:30,560 --> 00:23:33,010 که اگر شما سعی می کنید را تغییر دهید چه چیزی در حافظه فقط خواندنی، 300 00:23:33,010 --> 00:23:36,670 شما در حال انجام چیزی است که شما نباید با حافظه انجام و شما segfault. 301 00:23:36,670 --> 00:23:45,360 این است که در واقع یک تفاوت بزرگ بین کاراکتر و کاراکتر ها []. 302 00:23:45,360 --> 00:23:48,790 پس کاراکتر []، در حال حاضر این رشته در حال رفتن به در پشته قرار داده می شود، 303 00:23:48,790 --> 00:23:53,960 و پشته فقط خواندنی است، که بدان معنی است که این کار کاملا خوب است. 304 00:23:55,500 --> 00:23:57,370 و این هم اینکار را در مورد شما نمی کنند. 305 00:23:57,370 --> 00:24:06,250 به یاد داشته باشید که زمانی که من کاراکتر * S = "سلام جهان!"، S خود را بر روی پشته 306 00:24:06,250 --> 00:24:10,390 اما به جای دیگری، و این که در جایی دیگر اتفاق می افتد فقط خواندنی است. 307 00:24:10,390 --> 00:24:15,640 اما کاراکتر ها [] است که تنها چیزی را بر روی پشته. 308 00:24:17,560 --> 00:24:21,760 به طوری که به عنوان مثال دیگری از segfault اتفاق می افتد. 309 00:24:21,760 --> 00:24:27,820 >> ما شاهد که ./buggy1 در segfault. 310 00:24:27,820 --> 00:24:31,810 در تئوری، شما نباید نگاه کنید buggy1.c بلافاصله. 311 00:24:31,810 --> 00:24:35,170 در عوض، ما در آن را از طریق GDB نگاه کنید. 312 00:24:35,170 --> 00:24:37,750 توجه داشته باشید که هنگامی که شما خطا تقسیم بندی (هسته ریخته)، 313 00:24:37,750 --> 00:24:40,850 شما می توانید این فایل بر هسته در اینجا به نام. 314 00:24:40,850 --> 00:24:45,200 اگر ما LS-L، خواهیم دید که هسته است که معمولا یک فایل بسیار بزرگ است. 315 00:24:45,200 --> 00:24:51,580 این تعداد بایت از فایل است، پس از آن به نظر می رسد مانند آن را 250 چیزی کیلوبایت. 316 00:24:51,580 --> 00:24:56,120 دلیل این امر این است که آنچه روگرفت اصلی واقع شده است 317 00:24:56,120 --> 00:25:01,410 وقتی است که قفل برنامه، دولت از حافظه برنامه شما 318 00:25:01,410 --> 00:25:05,230 فقط کپی می شود و به این فایل چسبانده شده است. 319 00:25:05,230 --> 00:25:07,270 این می شود که به فایل ریخته شده است. 320 00:25:07,270 --> 00:25:13,060 این برنامه، در حالی که در حال اجرا بود، به طور اتفاقی به استفاده از حافظه از حدود 250 کیلوبایت، 321 00:25:13,060 --> 00:25:17,040 و به طوری که به این فایل ریخته شدم. 322 00:25:17,040 --> 00:25:23,630 حالا شما می توانید در آن فایل نگاه کنید اگر ما GDB هسته buggy1. 323 00:25:23,630 --> 00:25:30,130 ما فقط می تواند GDB buggy1، انجام دهند و که فقط راه اندازی خواهد شد GDB به طور منظم، 324 00:25:30,130 --> 00:25:33,800 با استفاده از buggy1 به عنوان فایل ورودی آن است. 325 00:25:33,800 --> 00:25:38,260 اما اگر شما GDB هسته buggy1، سپس آن را به طور خاص برای راه اندازی GDB 326 00:25:38,260 --> 00:25:40,330 با نگاه کردن به فایل اصلی که. 327 00:25:40,330 --> 00:25:45,560 و شما می گوید buggy1 وسیله GDB می داند که که فایل اصلی می آید از برنامه buggy1. 328 00:25:45,560 --> 00:25:49,580 بنابراین GDB buggy1 هسته را به سرعت ما را 329 00:25:49,580 --> 00:25:52,060 به جایی که این برنامه رخ داده است برای پایان دادن به. 330 00:25:57,720 --> 00:26:02,340 ما در اینجا شاهد برنامه با سیگنال 11، گسل تقسیم خاتمه یافته است. 331 00:26:02,340 --> 00:26:10,110 ما اتفاق می افتد برای دیدن یک خط مونتاژ، که احتمالا خیلی مفید نیست. 332 00:26:10,110 --> 00:26:15,360 اما اگر BT یا backtrace شما نوع، که برای رفتن به تابع 333 00:26:15,360 --> 00:26:19,430 است که به ما می دهد لیستی از فریم پشته فعلی ما است. 334 00:26:19,430 --> 00:26:23,150 بنابراین backtrace. به نظر می رسد که ما فقط دو قاب پشته. 335 00:26:23,150 --> 00:26:26,310 اولین قاب پشته اصلی ما است. 336 00:26:26,310 --> 00:26:29,810 و دوم قاب پشته برای این تابع است که ما اتفاق می افتد به در است، 337 00:26:29,810 --> 00:26:34,440 که به نظر می رسد مثل ما فقط کد اسمبلی است. 338 00:26:34,440 --> 00:26:38,050 پس اجازه بازگشت به تابع اصلی ما، 339 00:26:38,050 --> 00:26:42,300 و برای انجام این کار ما می توانیم قاب 1 انجام دهید، و من فکر می کنم ما نیز می توانید انجام دهید، 340 00:26:42,300 --> 00:26:45,160 اما من تقریبا هرگز - و یا تا. آره. 341 00:26:45,160 --> 00:26:50,710 بالا و پایین. نام شما به ارمغان می آورد تا یک پشته قاب، پایین به ارمغان می آورد شما یک قاب پشته. 342 00:26:50,710 --> 00:26:53,240 من تمایل دارم که با استفاده از هرگز. 343 00:26:53,240 --> 00:26:59,120 من فقط به طور خاص قاب 1 می گویند، که به قاب برچسب 1. 344 00:26:59,120 --> 00:27:01,750 قاب (1) ما را به قاب پشته اصلی 345 00:27:01,750 --> 00:27:05,570 آن را می گوید و حق در اینجا خط از کد ما اتفاق می افتد به در. 346 00:27:05,570 --> 00:27:07,950 اگر ما می خواستیم چند خط از کد، ما می توانید لیست می گویند، 347 00:27:07,950 --> 00:27:11,280 و این برای همه ما خط از کد را در اطراف آن به من بدهید. 348 00:27:11,280 --> 00:27:13,360 خط ما در segfaulted 6 بود: 349 00:27:13,360 --> 00:27:17,360 اگر (strcmp ("CS50 سنگ"، و argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 اگر آن را آشکار نشده است، شما می توانید آن را مستقیما از اینجا دریافت کنید تنها با فکر همین دلیل آن را segfaulted. 351 00:27:24,130 --> 00:27:28,800 اما ما می توانیم آن را یک قدم جلوتر ببریم و می گویند، "چرا ی argv [1] segfault؟" 352 00:27:28,800 --> 00:27:38,830 چاپ بیایید و argv [1]، و آن را مانند 0x0 آن، است که اشاره گر تهی به نظر می رسد. 353 00:27:38,830 --> 00:27:44,750 ما در حال strcmping CS50 سنگ و تهی، و به طوری که رفتن به segfault. 354 00:27:44,750 --> 00:27:48,280 و به همین دلیل است و argv [1] تهی؟ 355 00:27:48,640 --> 00:27:51,280 [دانشجوی] از آنجا که ما را از آن استدلال خط فرمان نیست. 356 00:27:51,280 --> 00:27:53,390 آره. ما را از آن استدلال خط فرمان نیست. 357 00:27:53,390 --> 00:27:58,460 بنابراین ./buggy1 فقط رفتن به ی argv [0] ./buggy1. 358 00:27:58,460 --> 00:28:02,100 این نخواهیم داشت و argv [1]، به طوری که رفتن به segfault. 359 00:28:02,100 --> 00:28:07,450 اما، در عوض، اگر من فقط CS50، آن را به رفتن به می گویند D شما 360 00:28:07,450 --> 00:28:09,950 چرا که این چیزی است که در آن قرار است برای انجام این کار است. 361 00:28:09,950 --> 00:28:15,240 به دنبال در buggy1.c، قرار است به چاپ "شما دریافت می کنید D" - 362 00:28:15,240 --> 00:28:20,820 اگر ی argv [1] است که نه "CS50 سنگ"، "شما دریافت می کنید D"، دیگری "شما دریافت می کنید!" 363 00:28:20,820 --> 00:28:25,660 بنابراین اگر ما می خواهیم، ​​ما باید این را به عنوان واقعی مقایسه، 364 00:28:25,660 --> 00:28:28,710 که بدان معنی است که آن را به 0 مقایسه است. 365 00:28:28,710 --> 00:28:31,100 بنابراین ی argv [1] نیاز به "CS50 سنگ". 366 00:28:31,100 --> 00:28:35,660 اگر شما می خواهید برای انجام این کار در خط فرمان، شما نیاز به استفاده از \ برای فرار از فضا. 367 00:28:35,660 --> 00:28:41,690 بنابراین CS50 \ سنگها و شما دریافت می کنید! 368 00:28:41,690 --> 00:28:44,060 اگر شما بک اسلش را انجام ندهید، چرا این کار نمی کند؟ 369 00:28:44,060 --> 00:28:47,190 [دانشجو] این دو استدلال متفاوت است. >> آره. 370 00:28:47,190 --> 00:28:52,540 ی argv [1] رفتن به CS50، و ی argv [2] رفتن به سنگ. باشه. 371 00:28:52,540 --> 00:28:56,470 >> در حال حاضر ./buggy2 رفتن دوباره به segfault. 372 00:28:56,470 --> 00:29:01,880 به جای باز کردن آن با فایل اصلی خود را، ما فقط باز buggy2 به طور مستقیم، 373 00:29:01,880 --> 00:29:05,000 بنابراین GDB buggy2. 374 00:29:05,000 --> 00:29:09,590 در حال حاضر اگر ما فقط اجرای یک برنامه، و سپس آن را به رفتن به برنامه دریافت سیگنال SIGSEGV، 375 00:29:09,590 --> 00:29:15,530 است که segfault سیگنال، و این جایی است که آن را به طور اتفاقی به اتفاق می افتد. 376 00:29:15,530 --> 00:29:21,250 نگاهی backtrace ما، ما می بینیم که ما در oh_no تابع، 377 00:29:21,250 --> 00:29:23,900 که تمیز تابع، را که توسط binky تابع نامیده می شد به نام شد، 378 00:29:23,900 --> 00:29:26,460 که اصلی به نام بود. 379 00:29:26,460 --> 00:29:31,680 ما همچنین می توانیم استدلال به این توابع را ببینید. 380 00:29:31,680 --> 00:29:34,680 این استدلال به شیک و binky 1 بود. 381 00:29:34,680 --> 00:29:44,390 اگر oh_no تابع را به لیست اضافه می کنیم، می بینیم که oh_no فقط انجام کاراکتر ** = NULL؛ 382 00:29:44,390 --> 00:29:47,410 * S = "BOOM"؛ 383 00:29:47,410 --> 00:29:50,330 چرا که شکست؟ 384 00:29:54,330 --> 00:29:58,380 [دانشجوی] شما می توانید dereference اشاره گر تهی نیست؟ >> آره. 385 00:29:58,380 --> 00:30:06,090 این فقط گفت: NULL است، بدون در نظر گرفتن در صورتی که اتفاق می افتد به عنوان یک ** کاراکتر، 386 00:30:06,090 --> 00:30:12,070 که بسته به چگونه آن را تفسیر، این می تواند یک اشاره گر به اشاره گر به یک رشته 387 00:30:12,070 --> 00:30:15,550 و یا آرایه ای از رشته ها است. 388 00:30:15,550 --> 00:30:21,430 این NULL است، به طوری * S بصورت غیر مرجع اشاره گر تهی، 389 00:30:21,430 --> 00:30:24,800 و غیره این است که رفتن به سقوط. 390 00:30:24,800 --> 00:30:27,540 این یکی از سریعترین راه شما احتمالا می تواند segfault است. 391 00:30:27,540 --> 00:30:31,300 این فقط اعلام یک اشاره گر تهی و بلافاصله segfaulting. 392 00:30:31,300 --> 00:30:34,570 این چیزی است که oh_no در حال انجام است. 393 00:30:34,570 --> 00:30:43,400 اگر ما به یک قاب، پس از آن ما در حال رفتن به تابع است که به نام oh_no. 394 00:30:43,400 --> 00:30:44,830 من نیاز به انجام این کار پایین است. 395 00:30:44,830 --> 00:30:48,610 اگر شما یک فرمان وارد نمی کند و شما فقط ضربه را وارد کنید دوباره، 396 00:30:48,610 --> 00:30:52,350 فقط به دستور قبلی است که به شما زد را تکرار کنید. 397 00:30:52,350 --> 00:30:56,610 ما در قاب 1. 398 00:30:56,610 --> 00:31:04,650 فهرست این چارچوب، ما می بینیم که در اینجا تابع ما است. 399 00:31:04,650 --> 00:31:08,520 شما می توانید لیست دوباره ضربه، یا شما می توانید لیست 20 انجام و آن را بیشتر لیست. 400 00:31:08,520 --> 00:31:13,640 زیبا عملکرد می گوید: اگر من به 1 است، پس از آن به تابع oh_no بروید. 401 00:31:13,640 --> 00:31:15,960 دیگری برای تابع دزدکی بروید. 402 00:31:15,960 --> 00:31:18,700 و ما می دانیم من 1 از آنجا که ما اتفاق می افتد برای دیدن اینجا 403 00:31:18,700 --> 00:31:22,560 که شیک با استدلال 1 نامیده می شد. 404 00:31:22,560 --> 00:31:27,560 یا شما فقط می توانید نسخه قابل چاپ کنم و آن را می گویند من به 1 است. 405 00:31:27,560 --> 00:31:33,770 ما در حال حاضر در شیک، و اگر ما به یک قاب دیگر، ما می دانیم که ما در نهایت در binky. 406 00:31:33,770 --> 00:31:36,600 بالا. در حال حاضر ما در binky هستیم. 407 00:31:36,600 --> 00:31:41,340 در لیست این تابع - فهرست از قبل از نیمی من قطع - 408 00:31:41,340 --> 00:31:52,670 آن آغاز شده است که اگر من 0 است، پس از آن ما در حال رفتن به آن را oh_no، شیک دیگری تماس بگیرید. 409 00:31:52,670 --> 00:31:57,000 ما می دانیم که من 1 بود، به طوری که آن را به نام شیک. 410 00:31:57,000 --> 00:32:05,030 و در حال حاضر ما در حال پشت در اصلی، اصلی و فقط برای رفتن به اعضای هیات من = رند ()٪ 3؛ 411 00:32:05,030 --> 00:32:08,790 است که فقط می خواهم به شما یک عدد تصادفی است که یا 0، 1 و یا 2. 412 00:32:08,790 --> 00:32:12,780 این برای تماس binky که با شماره، و آن را به 0 بازگشت. 413 00:32:12,780 --> 00:32:16,700 با نگاه کردن به این، 414 00:32:16,700 --> 00:32:19,880 فقط راه رفتن را از طریق این برنامه به صورت دستی و بدون در حال اجرا آن را بلافاصله، 415 00:32:19,880 --> 00:32:25,400 شما می توانید نقطه شکستن در اصلی تعیین می کنند، به این معنی که هنگامی که ما برای اجرای برنامه 416 00:32:25,400 --> 00:32:31,020 برنامه شما اجرا می شود تا آن بازدید یک نقطه شکست. 417 00:32:31,020 --> 00:32:35,450 بنابراین در حال اجرا این برنامه، آن را اجرا خواهد کرد و سپس آن را به تابع اصلی و ضربه زدن به توقف در حال اجرا است. 418 00:32:35,450 --> 00:32:44,700 در حال حاضر ما در داخل از اصلی هستید، و مرحله بعدی این است که ما را به خط بعدی کد. 419 00:32:44,700 --> 00:32:47,050 شما می توانید مرحله بعدی را انجام دهید. 420 00:32:47,050 --> 00:32:51,800 زدن بعد، حالا من شده است به رند ()٪ 3 است، بنابراین ما می توانیم ارزش من نسخه قابل چاپ، 421 00:32:51,800 --> 00:32:55,280 و آن را می گویند من به 1 است. 422 00:32:55,280 --> 00:32:58,110 در حال حاضر این مهم که آیا ما از آینده یا مرحله است. 423 00:32:58,110 --> 00:33:01,000 من حدس می زنم آن را در یکی از قبلی اهمیت است، اما ما می خواهیم به استفاده از آینده. 424 00:33:01,000 --> 00:33:06,000 اگر ما استفاده از گام، ما را به تابع قدم، که به معنی نگاهی به چیزی واقعی 425 00:33:06,000 --> 00:33:07,940 که اتفاق می افتد در داخل binky. 426 00:33:07,940 --> 00:33:10,510 اگر ما استفاده از بعد، پس از آن به این معنی است که به بیش از تابع 427 00:33:10,510 --> 00:33:14,070 و فقط به خط بعدی کد در تابع اصلی ما بروید. 428 00:33:14,070 --> 00:33:17,900 حق در اینجا بر روی این خط، من که در آن گفت: رند ()٪ 3 بود؛ 429 00:33:17,900 --> 00:33:21,320 اگر من گام، آن را به پیاده سازی از رند 430 00:33:21,320 --> 00:33:25,110 و نگاه کردن به آنچه اتفاق می افتد وجود دارد، و من می توانم از طریق تابع رند گام. 431 00:33:25,110 --> 00:33:26,920 اما من در مورد تابع رند اهمیتی نمی دهند. 432 00:33:26,920 --> 00:33:30,190 من فقط می خواهم برای رفتن به خط بعدی کد در متد Main، بنابراین من استفاده بعدی. 433 00:33:30,190 --> 00:33:35,800 اما در حال حاضر من مراقبت در مورد تابع binky، بنابراین من می خواهم به این گام است. 434 00:33:35,800 --> 00:33:37,730 در حال حاضر من در binky هستم. 435 00:33:37,730 --> 00:33:42,040 اولین خط از کد رفتن به می گویند اگر (من == 0)، من را یک گام به، 436 00:33:42,040 --> 00:33:44,930 ما می بینیم ما تا پایان در شیک. 437 00:33:44,930 --> 00:33:51,620 اگر ما موارد فهرست، ما می بینیم که در آن بررسی شده است I = 0. 438 00:33:51,620 --> 00:33:55,470 من برابر با 0 است، بنابراین آن را به شرایط دیگری رفت، 439 00:33:55,470 --> 00:33:59,540 است که شیک (من) به تماس. 440 00:33:59,540 --> 00:34:04,030 شما ممکن است اشتباه گرفته شود. 441 00:34:04,030 --> 00:34:07,380 اگر شما فقط در این خطوط به طور مستقیم، شما ممکن است فکر می کنم اگر (من == 0) 442 00:34:07,380 --> 00:34:10,800 خوب، پس من در زمان یک گام است و در حال حاضر من در شیک (من) هستم، 443 00:34:10,800 --> 00:34:14,120 شما ممکن است فکر می کنم که به نظر من = 0 و یا چیزی. 444 00:34:14,120 --> 00:34:18,980 نه، این فقط بدان معنی است که آن را می داند که آن را به طور مستقیم می توانید به چوب خط زیبا (من) است. 445 00:34:18,980 --> 00:34:23,300 چون من 0 است، گام بعدی این است که قصد ندارم به دیگری پایان. 446 00:34:23,300 --> 00:34:26,239 دیگری یک خط آن را به رفتن به توقف در نیست. 447 00:34:26,239 --> 00:34:31,570 این فقط برای رفتن به خط بعدی آن را در واقع می تواند اجرا، شیک است که (من). 448 00:34:31,570 --> 00:34:36,090 پله به شیک (من)، ما می بینیم اگر (من == 1). 449 00:34:36,090 --> 00:34:42,670 ما من = 1 می دانیم، تا زمانی که ما مرحله، ما می دانیم که ما قصد داریم برای پایان دادن به در oh_no 450 00:34:42,670 --> 00:34:46,489 به خاطر اینکه من = 1 خواستار oh_no تابع، که شما می توانید به مرحله، 451 00:34:46,489 --> 00:34:52,969 است که به مجموعه کاراکتر ** = پوچ و بلافاصله "BOOM". 452 00:34:54,270 --> 00:34:59,690 و پس از آن در واقع در اجرای buggy2 به دنبال 453 00:34:59,690 --> 00:35:04,590 این، من فقط یک عدد تصادفی - 0، 1 و یا 2 - تماس binky، 454 00:35:04,590 --> 00:35:10,610 که اگر من 0 است در آن خواستار oh_no، دیگری آن را خواند شیک، که می آید اینجا. 455 00:35:10,610 --> 00:35:18,100 اگر من 1، oh_no تماس، دیگری دزدکی، که آمدن اینجا، 456 00:35:18,100 --> 00:35:20,460 اگر من 2، با oh_no. 457 00:35:20,460 --> 00:35:24,720 من حتی فکر می کنم یک راه وجود دارد - 458 00:35:24,720 --> 00:35:30,030 آیا کسی راه ساخت این برنامه ای است که نمی خواهد segfault؟ 459 00:35:30,030 --> 00:35:37,530 از آنجا که، مگر من گم شده چیزی، اگر من 0 است، شما فورا خواهید segfault 460 00:35:37,530 --> 00:35:41,250 دیگری شما را به یک تابع است که اگر من 1 شما segfault 461 00:35:41,250 --> 00:35:44,540 دیگری شما را به یک تابع که اگر من 2 شما segfault بروید. 462 00:35:44,540 --> 00:35:46,810 بنابراین بدون توجه به آنچه شما انجام دهد، شما segfault. 463 00:35:46,810 --> 00:35:52,380 >> من حدس می زنم یکی از راه های رفع آن را به جای انجام کاراکتر ** = NULL باشد، 464 00:35:52,380 --> 00:35:55,610 شما می توانید فضایی را برای این رشته malloc. 465 00:35:55,610 --> 00:36:04,230 sizeof چه - ما می توانیم malloc (sizeof) را انجام دهید؟ 466 00:36:09,910 --> 00:36:15,190 [دانشجو] (کاراکتر) * 5؟ >> آیا این به نظر می رسد درست است؟ 467 00:36:15,190 --> 00:36:21,060 من با فرض این کار خواهد کرد اگر من در واقع آن را زد، اما آن چیزی است که من به دنبال. 468 00:36:24,400 --> 00:36:32,940 نگاهی به نوع S. اجازه دهید اضافه کردن * نوع int است، به طوری که از نوع int * x است. 469 00:36:32,940 --> 00:36:35,600 من می خواهم malloc (sizeof (INT)) انجام دهد. 470 00:36:35,600 --> 00:36:40,490 یا اگر من می خواستم یک آرایه از 5، من می خواهم انجام دهید (sizeof (هوشمند) * 5)؛ 471 00:36:40,490 --> 00:36:44,210 چه می شود اگر من ** از نوع int؟ 472 00:36:46,260 --> 00:36:49,140 چه می توانم malloc؟ 473 00:36:49,140 --> 00:36:53,510 [دانشجو] حجم از اشاره گر. >> آره. (sizeof (نوع int *))؛ 474 00:36:53,510 --> 00:36:56,960 همین را در اینجا. 475 00:36:56,960 --> 00:37:01,280 من می خواهم (sizeof (کاراکتر *))؛ 476 00:37:06,170 --> 00:37:12,840 این امر برای اختصاص فضا برای اشاره گر است که اشاره به "BOOM". 477 00:37:12,840 --> 00:37:15,330 من نیازی به تخصیص فضا برای "BOOM" به خودی خود 478 00:37:15,330 --> 00:37:17,210 به دلیل این است که اساسا معادل به آنچه قبل از من گفت: 479 00:37:17,210 --> 00:37:20,870 کاراکتر * x = "BOOM". 480 00:37:20,870 --> 00:37:27,950 "BOOM" در حال حاضر وجود دارد. این اتفاق می افتد وجود دارد در این منطقه از حافظه فقط خواندنی است. 481 00:37:27,950 --> 00:37:35,200 اما در حال حاضر وجود دارد، که به معنی این خط از کد، اگر S ** کاراکتر، 482 00:37:35,200 --> 00:37:43,900 پس از آن * S * کاراکتر است و شما در حال تنظیم این کاراکتر * برای اشاره به "BOOM". 483 00:37:43,900 --> 00:37:50,040 اگر من می خواستم برای کپی کردن "BOOM" به ها، پس من نیاز به تخصیص فضا برای S. 484 00:37:55,170 --> 00:38:03,900 من * s = malloc (sizeof (کاراکتر) * 5)؛ 485 00:38:03,900 --> 00:38:06,210 چرا 5؟ 486 00:38:06,210 --> 00:38:10,860 چرا 4؟ به نظر می رسد مانند "BOOM" 4 کاراکتر است. >> [دانشجو] شخصیت تهی. 487 00:38:10,860 --> 00:38:14,580 آره. همه رشته های خود را در حال رفتن به نیاز به کاراکتر تهی. 488 00:38:14,580 --> 00:38:23,590 در حال حاضر من می توانم چیزی مثل strcat - چه تابع برای کپی کردن یک رشته است؟ 489 00:38:23,590 --> 00:38:28,520 [دانشجوی] CPY؟ >> strcpy. 490 00:38:28,520 --> 00:38:32,700 strcpy مرد است. 491 00:38:36,120 --> 00:38:39,590 بنابراین strcpy یا strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy است که کمی امن تر از شما می توانید مشخص کنید دقیقا چه بسیاری از شخصیت ها، 493 00:38:43,410 --> 00:38:46,190 اما در اینجا مهم نیست چون ما می دانیم. 494 00:38:46,190 --> 00:38:50,340 بنابراین strcpy و در استدلال. 495 00:38:50,340 --> 00:38:53,100 اولین آرگومان مقصد ما این است که. 496 00:38:53,100 --> 00:38:56,770 آرگومان دوم منبع ما است. 497 00:38:56,770 --> 00:39:10,310 ما در حال رفتن به به * مقصد ما کپی اشاره گر "BOOM" است. 498 00:39:10,310 --> 00:39:19,820 چرا ممکن است که شما می خواهید برای انجام این کار با strcpy به جای تنها چیزی که ما تا به حال قبل از 499 00:39:19,820 --> 00:39:22,800 * S = "BOOM"؟ 500 00:39:22,800 --> 00:39:28,630 دلیل شما ممکن است بخواهید برای انجام این کار وجود دارد، اما آنچه در این است که دلیل؟ 501 00:39:28,630 --> 00:39:31,940 [دانشجوی] اگر می خواهید به تغییر چیزی در "BOOM". >> آره. 502 00:39:31,940 --> 00:39:37,950 در حال حاضر من می توانم چیزی مثل انجام [0] = 'X'؛ 503 00:39:37,950 --> 00:39:48,190 چرا که نقاط ها به پشته و آن فضا را بر روی پشته ها است با اشاره به 504 00:39:48,190 --> 00:39:52,320 اشاره گر به فضای بیشتری بر روی پشته است که ذخیره سازی "BOOM" است. 505 00:39:52,320 --> 00:39:55,150 بنابراین این نسخه از "BOOM" است که در پشته ذخیره می شود. 506 00:39:55,150 --> 00:39:58,780 از لحاظ فنی دو نسخه از "BOOM" در برنامه ما وجود دارد. 507 00:39:58,780 --> 00:40:03,500 این برای اولین بار است که فقط توسط این "BOOM" ثابت رشته داده شده است وجود دارد. 508 00:40:03,500 --> 00:40:09,250 و نسخه دوم از "BOOM"، strcpy ایجاد کپی از "BOOM". 509 00:40:09,250 --> 00:40:13,100 اما نسخه ای از "BOOM" است که بر روی پشته ذخیره می شود، و پشته شما برای تغییر است. 510 00:40:13,100 --> 00:40:17,250 پشته فقط خواندنی است، به طوری که بدان معنی است که [0] 511 00:40:17,250 --> 00:40:20,500 اجازه رفتن به شما ارزش "BOOM" تغییر است. 512 00:40:20,500 --> 00:40:23,130 اجازه رفتن به شما در آن شخصیت را تغییر دهید. 513 00:40:23,130 --> 00:40:26,640 >> پرسش و پاسخ؟ 514 00:40:27,740 --> 00:40:29,290 باشه. 515 00:40:29,290 --> 00:40:35,500 >> در حال حرکت به buggy3، بیایید GDB buggy3. 516 00:40:35,500 --> 00:40:39,840 ما آن را فقط و اجرا شود ما می بینیم segfault ما. 517 00:40:39,840 --> 00:40:46,550 اگر ما backtrace، تنها دو تابع وجود دارد. 518 00:40:46,550 --> 00:40:52,970 اگر ما را به تابع اصلی ما، ما می بینیم که ما در این خط segfaulted. 519 00:40:52,970 --> 00:41:00,180 پس فقط در این خط به دنبال، برای (اعضای هیات خط = 0؛ fgets این مسائل می کند NULL برابر نیست؛ 520 00:41:00,180 --> 00:41:03,770 خط + +). 521 00:41:03,770 --> 00:41:08,010 قاب قبلی ما _IO_fgets نامیده می شد. 522 00:41:08,010 --> 00:41:10,720 شما خواهید دید که بسیاری با ساخته شده در توابع C، 523 00:41:10,720 --> 00:41:15,350 که زمانی که شما می توانید از segfault، وجود خواهد داشت واقعا مرموز نام تابع 524 00:41:15,350 --> 00:41:18,090 مانند این _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 اما این مربوط به این فراخوان fgets. 526 00:41:21,770 --> 00:41:25,850 جایی در داخل اینجا، ما در حال segfaulting. 527 00:41:25,850 --> 00:41:30,340 اگر ما در استدلال به fgets نگاه کنید، ما می توانیم بافر چاپ. 528 00:41:30,340 --> 00:41:41,180 بیایید چاپ - آه، نه. 529 00:41:48,980 --> 00:41:51,900 چاپ به کار دقیقا همان که من می خواهم آن را به. 530 00:41:55,460 --> 00:41:58,000 اجازه دهید نگاهی به این برنامه واقعی. 531 00:42:02,200 --> 00:42:09,640 بافر یک آرایه کاراکتری است. این یک آرایه کاراکتر از 128 کاراکتر است. 532 00:42:09,640 --> 00:42:14,980 بنابراین، هنگامی که من می گویم بافر چاپ، آن را به چاپ آن 128 کاراکتر را، 533 00:42:14,980 --> 00:42:18,300 که من حدس می زنم آن چیزی است که انتظار می رود. 534 00:42:18,300 --> 00:42:21,390 آنچه من به دنبال چاپ آدرس بافر، 535 00:42:21,390 --> 00:42:23,680 اما واقعا من خیلی بگویید. 536 00:42:23,680 --> 00:42:30,770 بنابراین، هنگامی که من به اتفاق می گویند اینجا بافر X، آن را نشان می دهد به من 0xbffff090، 537 00:42:30,770 --> 00:42:38,690 که اگر شما به یاد داشته باشید از زودتر یا برخی از نقطه، Oxbffff گرایش به منطقه پشته پذیری. 538 00:42:38,690 --> 00:42:46,020 در پشته تمایل به شروع در جایی درست زیر 0xc000. 539 00:42:46,020 --> 00:42:51,890 فقط با دیدن این آدرس، من می دانم که بافر در پشته اتفاق می افتد. 540 00:42:51,890 --> 00:43:04,500 شروع مجدد برنامه، اجرا، تا، بافر ما شاهد این دنباله ای از کاراکتر ها 541 00:43:04,500 --> 00:43:06,530 که خیلی بی معنی است. 542 00:43:06,530 --> 00:43:12,270 سپس چاپ فایل ها، چه فایل نگاه می کنید؟ 543 00:43:15,120 --> 00:43:17,310 [دانشجوی] تهی. >> آره. 544 00:43:17,310 --> 00:43:22,610 یک فایل * نوع فایل است، پس از آن است که یک اشاره گر، 545 00:43:22,610 --> 00:43:26,610 و ارزش که اشاره گر null است. 546 00:43:26,610 --> 00:43:33,240 بنابراین fgets رفتن سعی کنید که اشاره گر به عنوان خوانده شده را به یک روش غیر مستقیم، 547 00:43:33,240 --> 00:43:37,320 اما به منظور دسترسی به آن اشاره گر، آن را به dereference آن است. 548 00:43:37,320 --> 00:43:40,550 یا، به منظور دسترسی به آنچه که باید آن را اشاره به آن ارجاع میدهد. 549 00:43:40,550 --> 00:43:43,810 پس از آن بصورت غیر مرجع اشاره گر تهی و segfaults آن است. 550 00:43:46,600 --> 00:43:48,730 من می توانستم آن را دوباره راه اندازی وجود دارد. 551 00:43:48,730 --> 00:43:52,170 اگر ما در نقطه اصلی ما شکستن و اجرا، 552 00:43:52,170 --> 00:43:57,320 خط اول از کد کاراکتر * نام فایل = "nonexistent.txt" است؛ 553 00:43:57,320 --> 00:44:00,870 که باید یک اشاره بزرگ و زیبا که به همین دلیل این برنامه با شکست مواجه می دهد. 554 00:44:00,870 --> 00:44:06,080 تایپ در کنار من به ارمغان می آورد به خط بعد، جایی که من برای باز کردن این فایل، 555 00:44:06,080 --> 00:44:11,140 و پس از آن من بلافاصله به خط ما، جایی که یک بار من بعدی، این رفتن به segfault. 556 00:44:11,140 --> 00:44:16,880 آیا کسی می خواهید به پرتاب کردن به همین دلیل ممکن است segfaulting؟ 557 00:44:16,880 --> 00:44:19,130 [دانشجو] فایل وجود ندارد. >> آره. 558 00:44:19,130 --> 00:44:22,250 قرار است به یک اشاره 559 00:44:22,250 --> 00:44:29,570 که هر زمان که شما در حال باز کردن یک فایل شما نیاز به بررسی کنید که این فایل در واقع وجود دارد. 560 00:44:29,570 --> 00:44:31,510 بنابراین در اینجا، "nonexistent.txt"؛ 561 00:44:31,510 --> 00:44:34,700 هنگامی که ما نام فایل fopen برای خواندن، سپس ما نیاز به گفتن 562 00:44:34,700 --> 00:44:45,870 اگر (پرونده == NULL) و می گویند: printf ("فایل وجود ندارد!" 563 00:44:45,870 --> 00:44:56,340 یا - بهتر است - نام فایل)؛ بازگشت 1؛ 564 00:44:56,340 --> 00:45:00,300 بنابراین در حال حاضر ما چک کنید و ببینید که اگر آن را NULL 565 00:45:00,300 --> 00:45:03,930 قبل از ادامه و تلاش برای از آن فایل به عنوان خوانده شده. 566 00:45:03,930 --> 00:45:08,800 ما می توانیم آن را بازسازی فقط برای دیدن است که که با این نسخهها کار. 567 00:45:11,020 --> 00:45:14,970 من در نظر گرفته شده که شامل یک خط جدید است. 568 00:45:21,090 --> 00:45:25,290 بنابراین در حال حاضر nonexistent.txt وجود ندارد. 569 00:45:26,890 --> 00:45:30,040 شما همیشه باید برای این نوع از چیزی که به بررسی کنید. 570 00:45:30,040 --> 00:45:33,870 شما همیشه باید برای دیدن اگر fopen NULL را برمی گرداند. 571 00:45:33,870 --> 00:45:38,170 شما همیشه باید چک کنید تا مطمئن شوید که malloc NULL را بر نمی گرداند، 572 00:45:38,170 --> 00:45:41,410 یا دیگری شما segfault. 573 00:45:42,200 --> 00:45:45,930 >> در حال حاضر buggy4.c. 574 00:45:49,190 --> 00:45:58,440 در حال اجرا است. من حدس می زنم این است که انتظار برای ورودی یا حلقه احتمالا نامحدود است. 575 00:45:58,440 --> 00:46:01,870 بله، آن را حلقه بی نهایت است. 576 00:46:01,870 --> 00:46:05,560 بنابراین buggy4. به نظر می رسد مثل حلقه بی نهایت ما. 577 00:46:05,560 --> 00:46:12,590 ما می توانیم در بخش اصلی شکستن، اجرای برنامه های ما است. 578 00:46:12,590 --> 00:46:20,180 در GDB، تا زمانی که از حروف اختصاری استفاده می کنید بدون ابهام است 579 00:46:20,180 --> 00:46:23,420 یا اختصارات خاص است که آنها را برای شما فراهم می کند، 580 00:46:23,420 --> 00:46:29,020 سپس شما می توانید برای استفاده از بعد به جای نیاز به تایپ از آینده تمام راه را استفاده کنید. 581 00:46:29,020 --> 00:46:33,730 و در حال حاضر که من ضربه N یک بار، من فقط می توانید وارد کنید برای حفظ آینده ضربه 582 00:46:33,730 --> 00:46:36,640 به جای نیاز به ضربه را وارد کنید N، N را وارد کنید، N را وارد کنید. 583 00:46:36,640 --> 00:46:44,630 به نظر می رسد مثل من در برخی از انواع حلقه که در خصوص آرایه های [i] تا 0، هستم. 584 00:46:44,630 --> 00:46:50,510 به نظر می رسد مثل من شکستن هرگز از این حلقه for. 585 00:46:50,510 --> 00:46:54,780 اگر من نسخه قابل چاپ، بنابراین من 2 است، پس از آن من به آینده است. 586 00:46:54,780 --> 00:46:59,250 من، من، من 3، چاپ و سپس من به آینده. 587 00:46:59,250 --> 00:47:05,360 من من و چاپ من 3 است. بعد، چاپ من، من 4 است. 588 00:47:05,360 --> 00:47:14,520 در واقع، چاپ sizeof (آرایه ای)، به طوری که اندازه آرایه 20 است. 589 00:47:16,310 --> 00:47:32,870 اما به نظر می رسد که برخی از فرمان GDB خاص برای رفتن تا زمانی که چیزی اتفاق می افتد وجود دارد. 590 00:47:32,870 --> 00:47:37,620 آن را مانند تنظیم وضعیت در مقدار متغیر است. اما من به یاد داشته باشید که آنچه در آن است. 591 00:47:37,620 --> 00:47:44,100 بنابراین اگر ما در حفظ و رفتن - 592 00:47:44,100 --> 00:47:47,120 شما را چه می گفتند؟ چه چیزی شما را؟ 593 00:47:47,120 --> 00:47:50,500 [دانشجو] نمایش اضافه کنم - >> آره. بنابراین من می تواند کمک به نمایش داده می شود. 594 00:47:50,500 --> 00:47:54,530 اگر ما فقط من نمایش داده شود، آن را قرار داده است تا چه مقدار از من است 595 00:47:54,530 --> 00:47:56,470 بنابراین من لازم نیست که آن را چاپ کردن در هر زمان. 596 00:47:56,470 --> 00:48:02,930 اگر ما فقط رفتن بعدی، ما می بینیم 0، 1، 2، 3، 4، 5، 0، 1، 2، 3، 4، 5، 0، 1، 2، 3، 4، 5. 597 00:48:02,930 --> 00:48:08,530 چیزی است سخت در اشتباه است، و من تا 0، تنظیم مجدد. 598 00:48:13,330 --> 00:48:22,220 به دنبال در buggy4.c، ما می بینیم که اتفاق می افتد این است آرایه از نوع int [5]؛ 599 00:48:22,220 --> 00:48:26,200 برای (من = 0؛ من <= sizeof (آرایه ای)، من + +) 600 00:48:26,200 --> 00:48:28,550 آرایه های [i] = 0؛ 601 00:48:28,550 --> 00:48:31,390 چه ما می بینیم که در اینجا اشتباه است؟ 602 00:48:31,390 --> 00:48:39,480 به عنوان یک اشاره، زمانی که من انجام شده بود GDB buggy4 - اجازه را می شکند اصلی، اجرا - 603 00:48:39,480 --> 00:48:45,980 من چاپ sizeof (آرایه ای) تا فقط ببینیم چه وضعیتی است که در آن من در نهایت باید شکستن. 604 00:48:47,690 --> 00:48:51,100 من کجا هستم؟ آیا من را اجرا می کند؟ 605 00:48:51,100 --> 00:48:54,280 من اعلام نشده است. 606 00:48:54,280 --> 00:48:58,680 بنابراین sizeof (آرایه ای) و چاپ است که در 20، 607 00:48:58,680 --> 00:49:06,690 است که انتظار می رود از آرایه من از سایز 5 و از 5 عدد صحیح است، 608 00:49:06,690 --> 00:49:12,410 تمام چیزی که باید 5 * sizeof (هوشمند) کلمه در ادامه متن، که در آن sizeof (هوشمند) تمایل به 4 است. 609 00:49:12,410 --> 00:49:14,780 بنابراین sizeof (آرایه ای) 20 می باشد. 610 00:49:14,780 --> 00:49:17,420 چه باید باشد؟ 611 00:49:17,420 --> 00:49:21,720 [دانشجو] توسط sizeof (بین المللی) تقسیم شده است. >> آره، / sizeof (بین المللی). 612 00:49:21,720 --> 00:49:30,630 به نظر می رسد هنوز هم وجود دارد یک مشکل در اینجا است. من فکر می کنم این فقط باید < 613 00:49:30,630 --> 00:49:36,960 از آن تقریبا همیشه <و <هرگز. 614 00:49:36,960 --> 00:49:44,860 در حال حاضر فکر می کنم در مورد اینکه چرا این در واقع شکسته شد. 615 00:49:44,860 --> 00:49:53,370 آیا کسی حدس بزند چرا من تا 0، از طریق هر تکرار از حلقه تنظیم مجدد؟ 616 00:50:01,300 --> 00:50:09,350 تنها چیزی که در داخل است که در اینجا اتفاق می افتد این است که آرایه های [i] است که به 0 است. 617 00:50:09,350 --> 00:50:15,350 تا حدودی، این خط از کد است که باعث بین المللی خود می رود من می شود تا 0، تنظیم شده است. 618 00:50:16,730 --> 00:50:23,130 [دانشجو] آیا به این دلیل آن را برجسته حافظه از این بخش از من 619 00:50:23,130 --> 00:50:27,970 هنگامی که به آن فکر می کند آن را به عنصر بعدی آرایه؟ >> [Bowden] بله. 620 00:50:27,970 --> 00:50:33,880 هنگامی که ما در حال فراتر رفتن از آرایه های ما، 621 00:50:33,880 --> 00:50:39,870 به نحوی که فضای است که ما در حال برجسته برجسته ارزش من. 622 00:50:39,870 --> 00:50:48,030 و به این ترتیب اگر ما به buggy4 نگاه کنید، شکست اصلی، اجرا، 623 00:50:48,030 --> 00:50:53,120 اجازه دهید چاپ آدرس من. 624 00:50:53,120 --> 00:50:57,280 به نظر می رسد مانند آن را bffff124. 625 00:50:57,280 --> 00:51:03,930 حالا نسخه قابل چاپ آدرس آرایه [0]. 110. 626 00:51:03,930 --> 00:51:06,290 چه در مورد [1] 114. 627 00:51:06,290 --> 00:51:07,920 [2] 118. 628 00:51:07,920 --> 00:51:14,530 11C، 120. آرایه [5] bfff124 است. 629 00:51:14,530 --> 00:51:26,990 بنابراین آرایه [5] همان نشانی است که من، که بدان معنی است که آرایه [5] است که من. 630 00:51:26,990 --> 00:51:30,720 اگر آنها را به همان آدرس، آنها همین. 631 00:51:30,720 --> 00:51:38,410 بنابراین، هنگامی که ما مجموعه آرایه [5] تا 0،، ما، من تنظیم از 0. 632 00:51:38,410 --> 00:51:46,070 و اگر شما در این مورد فکر می کنم در شرایط استفاده از پشته 633 00:51:46,070 --> 00:51:55,590 من بین المللی اعلام شده است، که به معنی من می شود برخی از فضای در پشته. 634 00:51:55,590 --> 00:52:04,730 سپس آرایه [5] به خود اختصاص داده، به طوری که پس از آن 20 بایت در پشته اختصاص داده شده است. 635 00:52:04,730 --> 00:52:08,400 بنابراین من می شود اختصاص داده شده، و سپس این 20 بایت دریافت اختصاص داده شده است. 636 00:52:08,400 --> 00:52:11,400 بنابراین من درست قبل از آرایه اتفاق می افتد، 637 00:52:11,400 --> 00:52:19,230 و چون از راه، مثل من گفت: هفته گذشته، که در آن از لحاظ فنی پشته پایین رشد می کند، 638 00:52:19,230 --> 00:52:28,520 هنگامی که شما به یک آرایه اول، ما تضمین شده است که موقعیت 0 در آرایه 639 00:52:28,520 --> 00:52:31,970 همیشه اتفاق می افتد قبل از مقام اول در آرایه. 640 00:52:31,970 --> 00:52:35,900 این نوع چگونه من آن را کشید هفته گذشته است. 641 00:52:35,900 --> 00:52:42,210 توجه کنید که در پایین آدرس 0 و در بالای صفحه، ما حداکثر آدرس. 642 00:52:42,210 --> 00:52:44,880 پشته است که همیشه در حال رشد کردن. 643 00:52:48,100 --> 00:52:53,500 اجازه دهید بگویم من در اختصاص می دهیم. 644 00:52:53,500 --> 00:52:59,680 تخصیص صحیح من، که بدان معنی است اجازه دهید فقط می گویند تا اینجا صحیح من می شود اختصاص داده شده است. 645 00:52:59,680 --> 00:53:06,420 سپس آرایه 5 عدد صحیح، که بدان معنی است که که در زیر به ما اختصاص، 646 00:53:06,420 --> 00:53:11,230 از پشته در حال رشد است، کسانی که 5 عدد صحیح دریافت اختصاص داده است. 647 00:53:11,230 --> 00:53:15,900 اما از آنجا که از چگونگی آرایه ها کار می کنند، ما تضمین شده است که مقام اول در آرایه 648 00:53:15,900 --> 00:53:22,260 همیشه آدرس کمتر از چیزی که در آرایه. 649 00:53:22,260 --> 00:53:28,270 بنابراین آرایه 0 موقعیت همیشه برای اولین بار در حافظه اتفاق می افتد، 650 00:53:28,270 --> 00:53:30,700 در حالی که موقعیت آرایه 1 پس از آن اتفاق می افتد 651 00:53:30,700 --> 00:53:33,310 و جایگاه آرایه 2 به بعد از آن اتفاق می افتد، 652 00:53:33,310 --> 00:53:37,900 که بدان معنی است که آرایه 0 موقعیت در جایی اتفاق می افتد را در اینجا، 653 00:53:37,900 --> 00:53:40,690 موقعیت آرایه 1 به بالا که اتفاق می افتد 654 00:53:40,690 --> 00:53:45,530 چرا که در حال حرکت کردن به این معنی است آدرس بالاتر از آدرس حداکثر تا اینجا. 655 00:53:45,530 --> 00:53:50,490 بنابراین آرایه [0] پایین در اینجا، آرایه [1] تا اینجا، آرایه [2] تا اینجا، آرایه [3] تا اینجا. 656 00:53:50,490 --> 00:53:55,620 توجه کنید که چگونه قبل از من تمام راه را تا اینجا به ما اختصاص داده شده عدد صحیح، 657 00:53:55,620 --> 00:54:01,040 همانطور که ما حرکت می کند بیشتر و بیشتر به آرایه ما، ما در حال گرفتن نزدیک و نزدیکتر به عدد صحیح خود می رود من است. 658 00:54:01,040 --> 00:54:07,640 این فقط اتفاق می افتد که آرایه [5]، که یکی از موقعیت فراتر از آرایه ما 659 00:54:07,640 --> 00:54:13,010 دقیقا همان جایی که عدد صحیح به طور اتفاقی به اختصاص داده شود. 660 00:54:13,010 --> 00:54:16,920 به طوری که نقطه ای که در آن ما اتفاق می افتد را به هدف قرار دادن فضا بر روی پشته 661 00:54:16,920 --> 00:54:21,680 که برای عدد صحیح من اختصاص داده شده بود، و ما در حال تنظیم است که تا 0. 662 00:54:21,680 --> 00:54:26,160 >> این است که چگونه است که کار می کند. پرسش و پاسخ؟ آره. 663 00:54:26,160 --> 00:54:30,710 [دانشجو] هرگز ذهن. باشه. 664 00:54:30,710 --> 00:54:33,090 [دانشجو] چگونه می توانم به این نوع از خطاها اجتناب می کنید؟ 665 00:54:33,090 --> 00:54:41,190 این نوع از خطاها؟ آیا C به عنوان یک زبان برنامه نویسی خود استفاده نمی کنند. 666 00:54:41,190 --> 00:54:45,840 استفاده از یک زبان است که دارای چک کننده مرزهای آرایه. 667 00:54:45,840 --> 00:54:55,900 تا زمانی که شما مراقب باشید، شما فقط نیاز به جلوگیری از رفتن گذشته از مرزهای آرایه شما. 668 00:54:55,900 --> 00:54:58,300 [دانشجوی] بنابراین در اینجا زمانی که ما گذشته از مرزهای آرایه خود را رفت - 669 00:54:58,300 --> 00:55:01,840 [Bowden که در آن همه چیز شروع می شود اشتباه است. >> [دانشجو] اوه، درست است. 670 00:55:01,840 --> 00:55:05,730 تا زمانی که شما در حافظه اختصاص داده شده به آرایه خود را داشته باشید، خوب شما. 671 00:55:05,730 --> 00:55:12,400 اما C هیچ نشانی از چک کردن خطا است. اگر من آرایه [1000]، آن را کمال مسرت از هر آنچه اتفاق می افتد را تغییر دهید - 672 00:55:12,400 --> 00:55:16,500 به ابتدای آرایه می رود، پس از آن می رود 1000 موقعیت پس از کند و آن را به 0. 673 00:55:16,500 --> 00:55:20,000 هیچ چک کردن که آه، این واقعا نیست که 1000 همه چیز در آن نمی کنند. 674 00:55:20,000 --> 00:55:22,750 1000 است فراتر از چیزی است که من باید در حال تغییر، 675 00:55:22,750 --> 00:55:26,940 در حالی که جاوا یا چیزی شما آرایه ای از گرفتن شاخص مرزهای 676 00:55:26,940 --> 00:55:29,820 یا شاخص از استثنا مرزهای. 677 00:55:29,820 --> 00:55:33,950 به همین دلیل بسیاری از زبان های سطح بالاتر، این چیزها 678 00:55:33,950 --> 00:55:37,340 که در آن اگر شما فراتر از مرزهای آرایه، شما قادر 679 00:55:37,340 --> 00:55:40,070 به طوری که شما می توانید همه چیز را از زیر شما را تغییر نمی دهد 680 00:55:40,070 --> 00:55:42,590 و پس از آن همه چیز خیلی بدتر از فقط یک استثنا 681 00:55:42,590 --> 00:55:44,940 گفت که شما را فراتر از انتهای آرایه رفت. 682 00:55:44,940 --> 00:55:50,970 [دانشجو] و بنابراین باید ما به تازگی تغییر کرده <= فقط به <؟ >> [Bowden] آره. 683 00:55:50,970 --> 00:55:54,800 باید 00:55:59,560 از sizeof (آرایه ای) 20 است، اما ما فقط می خواهید 5. >> [دانشجو] درست است. 685 00:55:59,560 --> 00:56:04,060 بیشتر است؟ باشه. 686 00:56:04,060 --> 00:56:07,380 >> [دانشجو] من یک سوال. >> آره. 687 00:56:07,380 --> 00:56:16,440 [دانشجوی] متغیر آرایه واقعی چیست؟ 688 00:56:16,440 --> 00:56:20,000 [Bowden] مانند آنچه در آرایه؟ 689 00:56:20,000 --> 00:56:24,930 آرایه ی خود یک نماد است. 690 00:56:24,930 --> 00:56:31,490 فقط آدرس شروع از 20 بایت است که ما در حال ارجاع است. 691 00:56:31,490 --> 00:56:38,070 شما می توانید از آن به عنوان یک اشاره گر فکر می کنم، اما از آن است که یک اشاره گر ثابت است. 692 00:56:38,070 --> 00:56:44,140 به محض این که اوضاع وارد شده، آرایه متغیر وجود ندارد. 693 00:56:44,140 --> 00:56:48,210 [دانشجو] پس چگونه اندازه آرایه آن را پیدا کنم؟ 694 00:56:48,210 --> 00:56:54,130 اندازه آرایه اشاره به اندازه آن بلوک که که نماد اشاره به. 695 00:56:54,130 --> 00:57:01,240 هنگامی که من انجام کاری مانند printf ("٪ P \ N"، آرایه)؛ 696 00:57:01,240 --> 00:57:05,140 اجازه دهید آن را اجرا کنید. 697 00:57:12,960 --> 00:57:15,530 چه من فقط اشتباه کردم؟ 698 00:57:15,530 --> 00:57:19,220 'آرایه آرایه اعلام کرد. 699 00:57:20,820 --> 00:57:23,200 آه، تا در اینجا. 700 00:57:23,200 --> 00:57:31,250 صدای جرنگ جرنگ باهوش است، و آن اتفاق می افتد توجه کنید که من اعلام کرد که مجموعه ای به عنوان 5 عنصر 701 00:57:31,250 --> 00:57:34,540 اما من به نمایه سازی را به سمت 1000. 702 00:57:34,540 --> 00:57:38,450 این می تواند که از آنجا که این فقط ثابت انجام دهید. 703 00:57:38,450 --> 00:57:43,370 این فقط می تواند تا کنون در توجه به این که من قصد دارم فراتر از مرزهای آرایه برو. 704 00:57:43,370 --> 00:57:46,880 اما توجه کنید قبل از زمانی که ما تا به حال من نادرست باشد، 705 00:57:46,880 --> 00:57:51,040 احتمالا نمی تواند تعیین کنید که چگونه بسیاری از ارزش های من را در، 706 00:57:51,040 --> 00:57:55,540 پس از آن نمی تواند تعیین کند که من فراتر از انتهای آرایه خواهد بود. 707 00:57:55,540 --> 00:57:59,430 که فقط صدای جرنگ جرنگ باهوش بودن. 708 00:57:59,430 --> 00:58:03,340 >> اما در حال حاضر buggy4 کند. پس چه چیز دیگری کار من اشتباه است؟ 709 00:58:03,340 --> 00:58:05,970 به طور ضمنی اعلام کرد تابع کتابخانه printf '. 710 00:58:05,970 --> 00:58:14,960 من قصد دارم به # . 711 00:58:14,960 --> 00:58:18,710 باشه. حال حاضر در حال اجرا buggy4. 712 00:58:18,710 --> 00:58:24,840 چاپ مقدار از آرایه مثل من در اینجا، چاپ آن را به عنوان یک اشاره گر 713 00:58:24,840 --> 00:58:30,060 چیزی چاپ است که به نظر می رسد شبیه به این - bfb8805c - است که برخی از آدرس 714 00:58:30,060 --> 00:58:33,450 که در منطقه پشته پذیری است. 715 00:58:33,450 --> 00:58:41,820 آرایه ی خود مانند یک اشاره گر است، اما آن است که یک اشاره گر واقعی نیست، 716 00:58:41,820 --> 00:58:45,410 ما می توانیم از یک اشاره گر به طور منظم تغییر می کند. 717 00:58:45,410 --> 00:58:54,700 آرایه تنها برخی ثابت است. 20 بلوک از حافظه شروع 0xbfb8805c آدرس. 718 00:58:54,700 --> 00:59:09,020 بنابراین bfb8805c از طریق این آدرس +20- یا من حدس می زنم -20 - 719 00:59:09,020 --> 00:59:17,400 همه از حافظه اختصاص داده شده برای این آرایه است. 720 00:59:17,400 --> 00:59:20,350 آرایه، متغیر خود ذخیره شده است به جایی نمی. 721 00:59:20,350 --> 00:59:27,660 هنگامی که شما در حال کامپایل، کامپایلر - موج دست در آن - 722 00:59:27,660 --> 00:59:33,060 اما کامپایلر فقط می خواهد که در آن می داند که آرایه را به استفاده کنید. 723 00:59:33,060 --> 00:59:36,090 این می داند که در آن است که آرایه شروع می شود، 724 00:59:36,090 --> 00:59:40,910 و پس از آن همیشه می توانید فقط چیز در شرایط استفاده از جبران از آن ابتدا انجام دهید. 725 00:59:40,910 --> 00:59:43,960 این کار یک متغیر خود را برای نشان دادن به آرایه نیاز نیست. 726 00:59:43,960 --> 00:59:53,730 اما وقتی که من چیزی برای مثال، int * p = آرایه در حال حاضر P یک اشاره گر است که اشاره به آن آرایه می باشد. 727 00:59:53,730 --> 00:59:57,830 و در حال حاضر P واقع در پشته وجود دارد. 728 00:59:57,830 --> 01:00:01,950 من آزاد به تغییر P. من می توانم p = malloc انجام دهد. 729 01:00:01,950 --> 01:00:06,500 پس از آن ابتدا به آرایه اشاره کرد، در حال حاضر آن را به برخی از فضای پشته اشاره است. 730 01:00:06,500 --> 01:00:09,620 من می توانم آرایه = malloc انجام نیست. 731 01:00:09,620 --> 01:00:13,710 اگر صدای جرنگ جرنگ باهوش است، آن را در من حق کردن خفاش داد. 732 01:00:17,000 --> 01:00:21,430 در واقع، من کاملا مطمئنم که شورای همکاری خلیج فارس که این بیش از حد انجام دهد. 733 01:00:21,430 --> 01:00:25,010 بنابراین نوع آرایه از نوع int [5] "است قابل تخصیص نیست. 734 01:00:25,010 --> 01:00:28,040 شما می توانید چیزی را به یک نوع آرایه را مشخص نمی کند 735 01:00:28,040 --> 01:00:30,500 به دلیل آرایه ثابت است. 736 01:00:30,500 --> 01:00:34,760 این یک نماد است که مراجع آن 20 بایت است. من می توانم آن را تغییر دهید. 737 01:00:34,760 --> 01:00:37,690 >> [دانشجو] و در جایی که اندازه آرایه ذخیره می شود؟ 738 01:00:37,690 --> 01:00:40,670 [Bowden] آن ذخیره می شود به جایی نمی. هنگامی که آن را تدوین است. 739 01:00:40,670 --> 01:00:46,310 تا جایی که به اندازه آرایه ذخیره می شود؟ 740 01:00:46,310 --> 01:00:51,870 شما فقط می توانید sizeof (آرایه ای) در داخل تابعی که آرایه ای خود را اعلام کرد استفاده کنید. 741 01:00:51,870 --> 01:01:03,150 بنابراین اگر من برخی از تابع، صنایع غذایی، و من انجام می دهم (آرایه از نوع int []) 742 01:01:03,150 --> 01:01:10,450 printf ("٪ D \ N"، sizeof (آرایه ای))؛ 743 01:01:10,450 --> 01:01:21,330 و سپس در اینجا من اسمش صنایع غذایی (آرایه ای)؛ 744 01:01:21,330 --> 01:01:24,840 در داخل این تابع - اجازه دهید آن را اجرا کنید. 745 01:01:34,200 --> 01:01:36,840 این صدای جرنگ جرنگ باهوش بودن دوباره است. 746 01:01:36,840 --> 01:01:43,890 این به من گفتن که sizeof در پارامتر تابع آرایه 747 01:01:43,890 --> 01:01:46,690 اندازه * بین المللی 'بازگشت. 748 01:01:46,690 --> 01:01:55,150 این خطا خواهد بود اگر آن چیزی است که من می خواستم به اتفاق می افتد. 749 01:01:55,150 --> 01:01:58,960 اجازه دهید در واقع خاموش Werror. 750 01:02:14,950 --> 01:02:17,590 هشدار. هشدارها خوب است. 751 01:02:17,590 --> 01:02:19,960 هنوز هم تا زمانی تدوین آن را به عنوان یک هشدار است. 752 01:02:19,960 --> 01:02:22,910 a.out / چاپ 4. 753 01:02:22,910 --> 01:02:28,650 هشدار که تولید یک شاخص واضح و روشن از آنچه رفت را اشتباه است. 754 01:02:28,650 --> 01:02:34,120 این آرایه از نوع int است فقط به چاپ sizeof (هوشمند) می باشد. 755 01:02:34,120 --> 01:02:39,790 حتی اگر من آرایه [5] در اینجا قرار دهید، آن را هنوز هم به چاپ sizeof (هوشمند). 756 01:02:39,790 --> 01:02:47,440 بنابراین به عنوان به زودی به عنوان آن را به شما منتقل می کند را به یک تابع، تمایز بین آرایه ها و اشاره گرها 757 01:02:47,440 --> 01:02:49,670 است وجود ندارد. 758 01:02:49,670 --> 01:02:52,640 این اتفاق می افتد به عنوان یک آرایه که در پشته اعلام شد، 759 01:02:52,640 --> 01:02:58,300 اما به محض این که ما منتقل می کند که ارزش، که 0xbf، اه، اه، اه، به این تابع، 760 01:02:58,300 --> 01:03:03,350 سپس این اشاره گر به اشاره به آن آرایه را بر روی پشته. 761 01:03:03,350 --> 01:03:08,310 به طوری که بدان معنی است که sizeof تنها در تابعی که آرایه اعلام شد شامل، 762 01:03:08,310 --> 01:03:11,230 به این معنی که هنگامی که شما در حال جمع آوری این تابع، 763 01:03:11,230 --> 01:03:17,330 وقتی که صدای جرنگ جرنگ می رود از طریق این تابع، آن را می بیند آرایه یک آرایه از نوع int است از حجم 5. 764 01:03:17,330 --> 01:03:20,640 پس از آن می بیند sizeof (آرایه ای) می باشد. خوب، که 20 است. 765 01:03:20,640 --> 01:03:26,440 که در واقع sizeof اساسا برای تقریبا همه موارد کار می کند. 766 01:03:26,440 --> 01:03:31,150 Sizeof یک تابع نیست، این اپراتور است. 767 01:03:31,150 --> 01:03:33,570 شما تابع sizeof را صدا نمی زنم. 768 01:03:33,570 --> 01:03:38,280 Sizeof (هوشمند)، کامپایلر خواهد شد که تا 4 را ترجمه کنید. 769 01:03:41,480 --> 01:03:43,700 فهمیدی؟ باشه. 770 01:03:43,700 --> 01:03:47,520 >> [دانشجو] پس چه تفاوت بین sizeof (آرایه ای) در اصلی و در صنایع غذایی است؟ 771 01:03:47,520 --> 01:03:52,840 دلیل این است که ما در حال گفت sizeof (آرایه ای) است، که از نوع int *، 772 01:03:52,840 --> 01:03:57,120 در حالی که آرایه را در اینجا نمی باشد از نوع int *، آن را به یک آرایه از نوع int است. 773 01:03:57,120 --> 01:04:04,540 >> [دانشجو] بنابراین اگر شما پارامتر در آرایه [] به جای آرایه از نوع int *، 774 01:04:04,540 --> 01:04:09,230 که بدان معنی است که شما هنوز هم می تواند تغییر آرایه چرا که در حال حاضر آن را در یک اشاره گر؟ 775 01:04:09,230 --> 01:04:14,250 [Bowden] مثل این؟ >> [دانشجو] آره. آرایه شما به تغییر در درون تابع در حال حاضر؟ 776 01:04:14,250 --> 01:04:18,420 [Bowden] شما می توانید مجموعه ای در هر دو مورد را تغییر دهید. 777 01:04:18,420 --> 01:04:23,130 در هر دو این موارد، شما آزاد هستید برای گفتن آرایه [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [دانشجو] اما می تواند نقطه آرایه شما را به چیز دیگری؟ 779 01:04:26,590 --> 01:04:30,230 [Bowden: اوه. آره. در هر دو مورد - >> [دانشجو] آره. 780 01:04:30,230 --> 01:04:38,410 [Bowden] تفاوت بین آرایه [] و یک آرایه از نوع int *، هیچ است وجود دارد. 781 01:04:38,410 --> 01:04:42,570 شما همچنین می توانید برخی از آرایه های چند بعدی را از اینجا دریافت کنید 782 01:04:42,570 --> 01:04:47,050 برای برخی از نحو مناسب است، اما هنوز فقط یک اشاره گر است. 783 01:04:47,050 --> 01:04:56,400 این به این معنی است که من آزاد برای انجام آرایه = malloc (sizeof (INT))، و در حال حاضر نقطه در جایی دیگر است. 784 01:04:56,400 --> 01:04:59,610 اما فقط دوست دارم که چگونه این کار برای همیشه و همیشه، 785 01:04:59,610 --> 01:05:03,210 تغییر این آرایه با ساخت آن به چیز دیگری اشاره 786 01:05:03,210 --> 01:05:07,570 این آرایه را تغییر نمی کردن اینجا به دلیل آن را یک کپی از این استدلال، 787 01:05:07,570 --> 01:05:10,780 یک اشاره گر به آن استدلال نیست. 788 01:05:10,780 --> 01:05:16,070 و در واقع، فقط به عنوان نشانه ای است که آن را دقیقا همان - 789 01:05:16,070 --> 01:05:21,100 ما در حال حاضر شاهد چاپ چاپ آرایه - 790 01:05:21,100 --> 01:05:31,410 چه می شود اگر ما از آرایه چاپ آدرس و یا به آدرس آدرس آرایه 791 01:05:31,410 --> 01:05:36,290 به هر کدام از این؟ 792 01:05:41,770 --> 01:05:45,220 بیایید چشم پوشی از این یکی. 793 01:05:48,140 --> 01:05:51,660 باشه. این خوب است. در حال حاضر در حال اجرا / a.out. 794 01:05:51,660 --> 01:06:00,220 آرایه چاپ، پس از چاپ آدرس از آرایه، همین. 795 01:06:00,220 --> 01:06:02,870 آرایه وجود ندارد. 796 01:06:02,870 --> 01:06:08,190 این می داند که هنگامی که شما در حال چاپ آرایه، شما در حال چاپ نماد است که اشاره به آن 20 بایت است. 797 01:06:08,190 --> 01:06:11,940 چاپ آدرس از آرایه، آرایه می کند وجود ندارد. 798 01:06:11,940 --> 01:06:17,200 آن را نشانی از آدرس ندارد، بنابراین آن را به چاپ آدرس آن 20 بایت است. 799 01:06:20,820 --> 01:06:28,150 به محض این که شما کامپایل کردن، در buggy4 وارد شده خود را می خواهم. / a.out، 800 01:06:28,150 --> 01:06:30,340 آرایه وجود ندارد. 801 01:06:30,340 --> 01:06:33,640 اشاره گرها وجود دارد. آرایه نمی کنند. 802 01:06:34,300 --> 01:06:38,060 بلوک های حافظه به نمایندگی از آرایه هنوز هم وجود دارد، 803 01:06:38,060 --> 01:06:43,270 اما آرایه متغیر و متغیر از این نوع وجود ندارد. 804 01:06:46,260 --> 01:06:50,270 کسانی مثل تفاوت های اصلی بین آرایه ها و اشاره گرها 805 01:06:50,270 --> 01:06:55,590 به محض اینکه شما را فراخوانی تابع است، تفاوت وجود دارد. 806 01:06:55,590 --> 01:07:00,460 اما در داخل تابعی که آرایه ی خود اعلام کرد، sizeof کار می کند متفاوت 807 01:07:00,460 --> 01:07:05,190 از شما چاپ اندازه از بلوک به جای آن از اندازه از نوع، 808 01:07:05,190 --> 01:07:08,950 و شما می توانید آن را تغییر دهید، زیرا این یک نماد است. 809 01:07:08,950 --> 01:07:14,370 چاپ چیز و آدرس از چیزی چاپ همین. 810 01:07:14,370 --> 01:07:18,480 که تقریبا آن را. 811 01:07:18,480 --> 01:07:20,820 [دانشجو] که می تواند یک بار دیگر به شما می گویند؟ 812 01:07:21,170 --> 01:07:24,170 من ممکن است از دست رفته چیزی. 813 01:07:24,170 --> 01:07:29,260 آرایه چاپ و آدرس آرایه چاپ همان چیزی است، 814 01:07:29,260 --> 01:07:33,180 در حالی که اگر شما نسخه قابل چاپ یک اشاره گر در مقابل آدرس از اشاره گر، 815 01:07:33,180 --> 01:07:36,010 یک چیز چاپ آدرس از آنچه شما اشاره به 816 01:07:36,010 --> 01:07:40,360 چاپ آدرس اشاره گر را بر روی پشته است. 817 01:07:40,360 --> 01:07:47,040 شما می توانید یک اشاره گر را تغییر دهید، شما می توانید یک نماد آرایه را تغییر نمی دهد. 818 01:07:47,740 --> 01:07:53,270 و اشاره گر sizeof برای چاپ اندازه از نوع اشاره گر است که. 819 01:07:53,270 --> 01:07:57,470 بنابراین اعضای هیات * P sizeof (p) به چاپ 4، 820 01:07:57,470 --> 01:08:04,110 اما اعضای هیات آرایه [5] چاپ sizeof (آرایه ای) به چاپ 20. 821 01:08:04,110 --> 01:08:07,480 [دانشجو] بنابراین اعضای هیات آرایه [5] از 20 نسخه قابل چاپ؟ >> بله. 822 01:08:07,480 --> 01:08:13,300 به همین دلیل در داخل buggy4 زمانی که از آن استفاده می شود sizeof (آرایه ای) 823 01:08:13,300 --> 01:08:16,660 این انجام شده بود <20، که همان چیزی است که ما می خواستیم. 824 01:08:16,660 --> 01:08:20,880 ما می خواهیم من <5. >> [دانشجو] باشه. 825 01:08:20,880 --> 01:08:25,569 [Bowden] و پس از آن به محض اینکه شما شروع به عبور در توابع، 826 01:08:25,569 --> 01:08:34,340 اگر ما از نوع int * p = آرایه؛ 827 01:08:34,340 --> 01:08:39,779 در داخل این تابع، ما اساسا می تواند فسفر و آرایه دقیقا در همان راه استفاده کنید، 828 01:08:39,779 --> 01:08:43,710 به جز مشکل sizeof و مشکل در حال تغییر است. 829 01:08:43,710 --> 01:08:49,810 اما P [0] = 1؛ همان است که گفت: آرایه [0] = 1؛ 830 01:08:49,810 --> 01:08:55,600 و به محض این که ما می گویند صنایع غذایی (آرایه ای) صنایع غذایی (p)؛ 831 01:08:55,600 --> 01:08:59,760 در داخل تابع صنایع غذایی، این تماس دو برابر است. 832 01:08:59,760 --> 01:09:03,350 تفاوت بین این دو تماس وجود دارد. 833 01:09:07,029 --> 01:09:11,080 >> هر کس که در آن خوب است؟ باشه. 834 01:09:14,620 --> 01:09:17,950 ما 10 دقیقه است. 835 01:09:17,950 --> 01:09:28,319 >> ما سعی خواهیم کرد تا از طریق این برنامه هکر Typer، 836 01:09:28,319 --> 01:09:32,350 این وب سایت، که سال گذشته و یا چیزی بیرون آمد. 837 01:09:34,149 --> 01:09:41,100 این فقط تصور می شود مانند شما نوع به صورت تصادفی و چاپ - 838 01:09:41,100 --> 01:09:46,729 هر فایل آن اتفاق می افتد که به لود شده همان چیزی است که به نظر می رسد که شما در حال تایپ کردن است. 839 01:09:46,729 --> 01:09:52,069 مثل نوعی از کد سیستم عامل به نظر می رسد. 840 01:09:53,760 --> 01:09:56,890 این چیزی است که ما می خواهیم برای به اجرا درآوردن. 841 01:10:08,560 --> 01:10:11,690 شما باید اجرایی باینری به نام hacker_typer 842 01:10:11,690 --> 01:10:14,350 طول می کشد که تنها یک آرگومان، فایل را به "نوع هکر است." 843 01:10:14,350 --> 01:10:16,480 در حال اجرا اجرایی باید صفحه نمایش روشن 844 01:10:16,480 --> 01:10:20,850 و پس از آن چاپ یکی از شخصیت ها از فایل در گذشته هر بار که کاربر فشار یک کلید. 845 01:10:20,850 --> 01:10:24,990 بنابراین هر کلید را فشار می دهید، آن را دور باید پرتاب و به جای چاپ یک کاراکتر از فایل 846 01:10:24,990 --> 01:10:27,810 که این استدلال است. 847 01:10:29,880 --> 01:10:34,350 من بسیار به شما بگویم چه چیزهایی که ما در حال رفتن به نیاز به دانستن هستند. 848 01:10:34,350 --> 01:10:36,440 اما ما می خواهیم به اتمام کتابخانه termios. 849 01:10:36,440 --> 01:10:44,840 من در تمام عمر من، این کتابخانه استفاده می شود هرگز، به طوری که آن را تا به اهداف بسیار ناچیز است. 850 01:10:44,840 --> 01:10:48,610 اما این است که برای رفتن به کتابخانه ما می توانیم با استفاده از به دور انداختن شخصیت شما ضربه 851 01:10:48,610 --> 01:10:52,390 هنگامی که شما در حال تایپ کردن را به استاندارد وارد 852 01:10:56,970 --> 01:11:05,840 بنابراین hacker_typer.c، و ما در حال رفتن به خواهید به # . 853 01:11:05,840 --> 01:11:12,870 با نگاه کردن به مرد برای termios - I'm ترمینال حدس زدن آن OS و یا چیزی - 854 01:11:12,870 --> 01:11:16,240 من نمی دانم چگونه به آن را بخوانید. 855 01:11:16,240 --> 01:11:21,040 با نگاه کردن به این، آن را می گوید به این 2 فایل، پس ما به سراغ انجام این کار است. 856 01:11:37,620 --> 01:11:46,820 >> اولین چیزی که برای اولین بار، ما می خواهیم را در تنها یک آرگومان است، که فایل ما باید باز. 857 01:11:46,820 --> 01:11:52,420 بنابراین چه چیزی من می خواهم کاری انجام دهید؟ چگونه می توانم چک کنید من از تنها یک آرگومان؟ 858 01:11:52,420 --> 01:11:56,480 [دانشجوی] اگر argc برابر است. >> [Bowden] آره. 859 01:11:56,480 --> 01:12:21,250 بنابراین اگر (argc = 2!) printf ("استفاده شده: درصد [برای باز کردن فایل]"). 860 01:12:21,250 --> 01:12:32,750 بنابراین در حال حاضر اگر من این کار را بدون ارائه یک آرگومان دوم اجرا - آه، من نیاز به خط جدید - 861 01:12:32,750 --> 01:12:36,240 خواهید دید آن را می گوید استفاده از: / hacker_typer 862 01:12:36,240 --> 01:12:39,770 و پس از آن آرگومان دوم باید فایل من می خواهم برای باز کردن. 863 01:12:58,430 --> 01:13:01,260 حالا چه کار کنم؟ 864 01:13:01,260 --> 01:13:08,490 من می خواهم از این فایل به عنوان خوانده شده. چگونه می توانم از یک فایل به عنوان خوانده شده؟ 865 01:13:08,490 --> 01:13:11,920 [دانشجو] شما آن را باز کنید اول است. >> آره. 866 01:13:11,920 --> 01:13:15,010 بنابراین fopen. چه fopen شبیه؟ 867 01:13:15,010 --> 01:13:22,980 [دانشجو] نام فایل. >> [Bowden] فایل در حال رفتن به ی argv [1]. 868 01:13:22,980 --> 01:13:26,110 [دانشجو] و پس از آن چیزی که شما می خواهید با آن انجام دهید، به طوری که - >> [Bowden] آره. 869 01:13:26,110 --> 01:13:28,740 بنابراین اگر شما به یاد داشته باشید، شما می توانید fopen مرد تنها، 870 01:13:28,740 --> 01:13:32,960 جایی که برای رفتن به مسیر توایع * کاراکتر است که در آن مسیر نام فایل 871 01:13:32,960 --> 01:13:34,970 * حالت ثابت کاراکتر باشد. 872 01:13:34,970 --> 01:13:38,660 اگر شما اتفاق می افتد به یاد داشته باشید چه حالت است، پس از آن شما می توانید برای حالت نگاه کنید. 873 01:13:38,660 --> 01:13:44,660 داخل صفحات man، شخصیت بریده بریده چیزی است که شما می توانید استفاده کنید برای چیزهایی است. 874 01:13:44,660 --> 01:13:49,790 بنابراین من نوع / حالت جستجو برای حالت. 875 01:13:49,790 --> 01:13:57,130 N و N همان چیزی است که شما می توانید به چرخه را از طریق جستجو در بازی ها استفاده کنید. 876 01:13:57,130 --> 01:13:59,800 در اینجا به آن می گوید: استدلال به حالت رشته ای 877 01:13:59,800 --> 01:14:01,930 با شروع با یکی از توالی زیر است. 878 01:14:01,930 --> 01:14:06,480 بنابراین تحقیق، باز کردن فایل متنی برای خواندن. این چیزی است که ما می خواهیم انجام دهیم. 879 01:14:08,930 --> 01:14:13,210 برای خواندن، و من می خواهم برای ذخیره آن. 880 01:14:13,210 --> 01:14:18,720 چیزی است که برای رفتن به یک فایل *. حالا چه من می خواهم به انجام این کار؟ 881 01:14:18,720 --> 01:14:21,200 یک لحظه هم به من بده. 882 01:14:28,140 --> 01:14:30,430 باشه. حالا چه من می خواهم به انجام این کار؟ 883 01:14:30,430 --> 01:14:32,940 [دانشجو] بررسی کنید اگر آن را NULL است. >> [Bowden] آره. 884 01:14:32,940 --> 01:14:38,690 هر زمانی که شما برای باز کردن یک فایل، مطمئن شوید که شما با موفقیت قادر به آن را باز کنید. 885 01:14:58,930 --> 01:15:10,460 >> در حال حاضر من می خواهم به انجام این کار چیزهای termios جایی که من می خواهم به خواندن تنظیمات من 886 01:15:10,460 --> 01:15:14,050 و صرفه جویی در آن را به چیزی، پس از آن من می خواهم به تغییر تنظیمات من 887 01:15:14,050 --> 01:15:19,420 به دور انداختن هر شخصیت که من تایپ، 888 01:15:19,420 --> 01:15:22,520 و پس از آن من می خواهم برای به روز رسانی این تنظیمات می پردازیم. 889 01:15:22,520 --> 01:15:27,250 و سپس در پایان این برنامه، من می خواهم به تغییر برگشت به تنظیمات اصلی من است. 890 01:15:27,250 --> 01:15:32,080 بنابراین ساختار termios نوع، و من می خواهم دو نفر از آنها. 891 01:15:32,080 --> 01:15:35,600 یکی از اولین بار است برای رفتن به current_settings من، 892 01:15:35,600 --> 01:15:42,010 و پس از آن که آنها در حال رفتن به hacker_settings من. 893 01:15:42,010 --> 01:15:48,070 اول، من قصد دارم که می خواهید برای ذخیره تنظیمات فعلی من، 894 01:15:48,070 --> 01:15:53,790 پس از آن من می خواهم برای به روز رسانی hacker_settings، 895 01:15:53,790 --> 01:16:01,570 و پس از آن راه در پایان برنامه من، من می خواهم به برگرداندن به تنظیمات فعلی است. 896 01:16:01,570 --> 01:16:08,660 بنابراین صرفه جویی در تنظیمات فعلی، راه است که کار می کند، ما termios مرد. 897 01:16:08,660 --> 01:16:15,810 ما می بینیم که در حال حاضر این tcsetattr هوشمند، اعضای هیات tcgetattr. 898 01:16:15,810 --> 01:16:22,960 من در یک ساختار termios با اشاره گر خود را منتقل می کند. 899 01:16:22,960 --> 01:16:30,640 راه نگاه خواهد کرد - I've در حال حاضر فراموش شده چه تابع نامیده می شد. 900 01:16:30,640 --> 01:16:34,930 کپی و چسباندن آن است. 901 01:16:39,150 --> 01:16:45,500 پس tcgetattr، پس از آن من می خواهم به تصویب در ساختار که من ذخیره اطلاعات در، 902 01:16:45,500 --> 01:16:49,650 است که برای رفتن به current_settings، 903 01:16:49,650 --> 01:16:59,120 و استدلال برای اولین بار فایل را برای توصیف چیزی که من می خواهم برای نجات از ویژگی های می باشد. 904 01:16:59,120 --> 01:17:04,360 توصیفگر فایل مانند هر زمانی که شما برای باز کردن یک فایل، آن را می شود یک توصیفگر فایل. 905 01:17:04,360 --> 01:17:14,560 وقتی که من fopen ی argv [1]، این می شود یک توصیفگر فایل که شما در حال ارجاع 906 01:17:14,560 --> 01:17:16,730 هر زمان که شما می خواهید به خواندن و یا نوشتن آن. 907 01:17:16,730 --> 01:17:19,220 این فایل توصیف من می خواهم به استفاده از نیست. 908 01:17:19,220 --> 01:17:21,940 سه فایل شما به طور پیش فرض وجود دارد، 909 01:17:21,940 --> 01:17:24,310 که استاندارد می باشند، از استاندارد، خطای استاندارد. 910 01:17:24,310 --> 01:17:29,960 به طور پیش فرض، من فکر می کنم آن استاندارد است 0، از استاندارد است 1، و 2 خطای استاندارد است. 911 01:17:29,960 --> 01:17:33,980 بنابراین آنچه که من می خواهم به تغییر تنظیمات؟ 912 01:17:33,980 --> 01:17:37,370 من می خواهم به تغییر تنظیمات هر زمان که من یک شخصیت، 913 01:17:37,370 --> 01:17:41,590 من می خواهم آن را به پرتاب است که شخصیت را به جای چاپ آن به روی صفحه نمایش. 914 01:17:41,590 --> 01:17:45,960 چه جریان - استاندارد، از استاندارد، خطای استاندارد - 915 01:17:45,960 --> 01:17:52,050 پاسخ به چیزهایی که زمانی که من در صفحه کلید تایپ؟ >> [دانشجوی] استاندارد وارد >> آره. 916 01:17:52,050 --> 01:17:56,450 پس من هم می تواند 0 یا انجام من می تواند STDIN انجام. 917 01:17:56,450 --> 01:17:59,380 من current_settings استاندارد وارد 918 01:17:59,380 --> 01:18:01,720 >> در حال حاضر من می خواهم برای به روز رسانی این تنظیمات، 919 01:18:01,720 --> 01:18:07,200 بنابراین در ابتدا من به hacker_settings آنچه current_settings من را کپی کنید. 920 01:18:07,200 --> 01:18:10,430 و چگونه کار ساختمانها است آن را فقط کپی کنید. 921 01:18:10,430 --> 01:18:14,510 این کپی همه زمینه ها، به عنوان انتظار می رود. 922 01:18:14,510 --> 01:18:17,410 >> در حال حاضر من می خواهم برای به روز رسانی برخی از زمینه ها. 923 01:18:17,410 --> 01:18:21,670 نگاهی به termios، شما می توانید از طریق بسیاری از این به عنوان خوانده شده 924 01:18:21,670 --> 01:18:24,110 فقط برای دیدن آنچه که شما می خواهید به دنبال، 925 01:18:24,110 --> 01:18:28,210 اما پرچم شما می خواهید به دنبال اکو 926 01:18:28,210 --> 01:18:33,110 به طوری که پژواک پژواک کاراکتر ورودی است. 927 01:18:33,110 --> 01:18:37,710 در ابتدا من می خواهم به مجموعه - I've در حال حاضر فراموش شده چه زمینه هستند. 928 01:18:45,040 --> 01:18:47,900 این همان چیزی است که ساختار به نظر می رسد مانند. 929 01:18:47,900 --> 01:18:51,060 بنابراین نوع ورودی من فکر می کنم ما می خواهیم را تغییر دهید. 930 01:18:51,060 --> 01:18:54,210 ما به راه حل نگاه کنید تا مطمئن شوید که این چیزی است که ما می خواهیم به تغییر شده است. 931 01:19:04,060 --> 01:19:12,610 ما می خواهیم برای تغییر lflag به منظور جلوگیری از نیاز به از طریق تمام این نگاه. 932 01:19:12,610 --> 01:19:14,670 ما می خواهیم برای تغییر حالت های محلی. 933 01:19:14,670 --> 01:19:17,710 شما می توانید از طریق این کل چیزی که به درک که در آن همه چیز به آن تعلق دارد به عنوان خوانده شده 934 01:19:17,710 --> 01:19:19,320 که ما می خواهیم را تغییر دهید. 935 01:19:19,320 --> 01:19:24,120 اما آن را در داخل از حالت محلی که در آن ما در حال رفتن به می خواهید به تغییر آن. 936 01:19:27,080 --> 01:19:33,110 بنابراین hacker_settings.cc_lmode همان چیزی است که آن را به نام. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 این جایی است که ما به اپراتورهای بیتی می باشد. 939 01:19:52,280 --> 01:19:54,860 ما نوع از زمان است، اما ما را از طریق آن سریع واقعی. 940 01:19:54,860 --> 01:19:56,600 این جایی است که ما به اپراتورهای بیتی، 941 01:19:56,600 --> 01:19:59,950 جایی که من فکر می کنم من یک مدت طولانی قبل گفت که هر زمان که شما شروع به خرید و فروش با پرچم، 942 01:19:59,950 --> 01:20:03,370 شما با استفاده از عملگر بیتی خیلی. 943 01:20:03,370 --> 01:20:08,240 هر بیت در پرچم مربوط به نوعی از رفتار است. 944 01:20:08,240 --> 01:20:14,090 بنابراین در اینجا، این پرچم دارای یک دسته از اشیای مختلف، که همه آنها را به معنای چیزی متفاوت است. 945 01:20:14,090 --> 01:20:18,690 اما آنچه من می خواهم به انجام آن فقط خاموش بیتی که مربوط به اکو. 946 01:20:18,690 --> 01:20:25,440 بنابراین به نوبه خود که خاموش من = ¬ ECHO. 947 01:20:25,440 --> 01:20:30,110 در واقع، من فکر می کنم آن را مانند tECHO و یا چیزی است. من فقط رفتن را دوباره چک کنید. 948 01:20:30,110 --> 01:20:34,050 من می توانم آن را termios. این فقط اکو. 949 01:20:34,050 --> 01:20:38,440 ECHO است برای رفتن به یک بیت است. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO در حال رفتن به معنی همه بیت به 1 تنظیم شده باشد، به این معنی است که تمامی پرچم ها درست تنظیم 951 01:20:44,230 --> 01:20:47,140 به جز بیت ECHO. 952 01:20:47,140 --> 01:20:53,830 پایان دادن پرچم های محلی من با این، به این معنی تمام پرچم است که در حال حاضر به True را 953 01:20:53,830 --> 01:20:56,520 هنوز هم درست تنظیم شود. 954 01:20:56,520 --> 01:21:03,240 اگر پرچم ECHO من درست تعیین می کنند، سپس این لزوما تنظیم به بر روی پرچم ECHO مقدار false. 955 01:21:03,240 --> 01:21:07,170 بنابراین این خط از کد خاموش پرچم ECHO. 956 01:21:07,170 --> 01:21:16,270 خط از کد، من فقط آنها را در زمان به نفع و کپی کنید و سپس توضیح می دهد آنها. 957 01:21:27,810 --> 01:21:30,180 در محلول، او گفت: 0. 958 01:21:30,180 --> 01:21:33,880 این احتمالا بهتر است به صراحت می گویند STDIN. 959 01:21:33,880 --> 01:21:42,100 >> توجه داشته باشید که من هم انجام ECHO | ICANON اینجا. 960 01:21:42,100 --> 01:21:46,650 ICANON اشاره به چیزی جداگانه، که به معنی حالت متعارف. 961 01:21:46,650 --> 01:21:50,280 چه معنی حالت متعارف است که معمولا هنگامی که شما در حال تایپ کردن از خط فرمان، 962 01:21:50,280 --> 01:21:54,670 استاندارد در هر چیزی را پردازش کند تا زمانی که شما ضربه خط جدید است. 963 01:21:54,670 --> 01:21:58,230 بنابراین، هنگامی که شما GetString، شما نوع یک دسته از چیزها، و سپس شما ضربه خط جدید. 964 01:21:58,230 --> 01:22:00,590 که زمانی که آن را به این استاندارد فرستاده شد وارد 965 01:22:00,590 --> 01:22:02,680 که به طور پیش فرض است. 966 01:22:02,680 --> 01:22:05,830 وقتی که من خاموش کردن حالت متعارف، در حال حاضر هر کاراکتر را فشار می دهید 967 01:22:05,830 --> 01:22:10,910 همان چیزی است که پردازش می شود، که معمولا نوع بد است چرا آن را به روند کند این چیزها، 968 01:22:10,910 --> 01:22:14,330 به همین دلیل است که آن را خوب به آن را به خطوط کل بافر. 969 01:22:14,330 --> 01:22:16,810 اما من می خواهم هر یک از شخصیت به پردازش 970 01:22:16,810 --> 01:22:18,810 از آنجا که من نمی خواهم آن را به صبر برای من به آمار خط جدید 971 01:22:18,810 --> 01:22:21,280 قبل از آن پردازش تمام شخصیت های من تایپ شده است. 972 01:22:21,280 --> 01:22:24,760 این تبدیل کردن حالت متعارف است. 973 01:22:24,760 --> 01:22:31,320 این مسائل فقط به این معنی که هنگامی که آن را در واقع پردازش شخصیت های. 974 01:22:31,320 --> 01:22:35,830 این به این معنی است که پردازش آنها را فورا و به محض این که من آنها را تایپ، پردازش آنها. 975 01:22:35,830 --> 01:22:42,510 و این تابع است که به روز رسانی تنظیمات استاندارد است. 976 01:22:42,510 --> 01:22:45,480 و وسایل TCSA در حال حاضر آن را انجام دهد. 977 01:22:45,480 --> 01:22:50,310 گزینه های دیگر صبر کنید تا همه چیز است که در حال حاضر در جریان است پردازش شده است. 978 01:22:50,310 --> 01:22:52,030 است که واقعا مهم نیست. 979 01:22:52,030 --> 01:22:56,920 در حال حاضر تغییر تنظیمات من به آنچه در حال حاضر در hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 من حدس می زنم من نام آن را hacker_settings، بنابراین تغییر آن بگذارید. 981 01:23:09,610 --> 01:23:13,500 تغییر همه چیز را به hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> در حال حاضر در پایان از برنامه های ما در حال رفتن به خواهید به برگرداندن 983 01:23:16,870 --> 01:23:20,210 به آنچه که در حال حاضر در داخل normal_settings، 984 01:23:20,210 --> 01:23:26,560 است که به فقط مانند و normal_settings نگاه. 985 01:23:26,560 --> 01:23:30,650 توجه داشته باشید که هر یک از normal_settings من از زمان قرار گرفتن تغییر نکرده است. 986 01:23:30,650 --> 01:23:34,520 سپس به آنها را تغییر دهید، و پس از من به آنها منتقل می کند، در پایان. 987 01:23:34,520 --> 01:23:38,390 این به روز رسانی شد. باشه. 988 01:23:38,390 --> 01:23:43,900 >> در حال حاضر در داخل از اینجا من فقط کد در منافع زمان را توضیح دهد. 989 01:23:43,900 --> 01:23:46,350 این که کد بسیار نیست. 990 01:23:50,770 --> 01:24:03,750 ما می بینیم که یک کاراکتر از فایل خوانده می کنیم. ما آن را به نام F. 991 01:24:03,750 --> 01:24:07,850 در حال حاضر شما می توانید مرد fgetc، اما چگونه fgetc در حال رفتن به محل کار 992 01:24:07,850 --> 01:24:11,910 فقط آن را برای بازگشت به کاراکتر است که شما فقط به خواندن و یا EOF، 993 01:24:11,910 --> 01:24:15,680 که مربوط به پایان فایل ها و یا برخی از خطا اتفاق می افتد. 994 01:24:15,680 --> 01:24:19,900 ما به حلقه، در ادامه به خواندن یک کاراکتر از فایل، 995 01:24:19,900 --> 01:24:22,420 ایم تا از شخصیت های اجرا شده را بخوانید. 996 01:24:22,420 --> 01:24:26,650 و در حالی که ما در حال انجام این کار، ما تنها بر روی یک شخصیت از استاندارد وارد صبر کنید 997 01:24:26,650 --> 01:24:29,090 هر بار تنها شما چیزی را در خط فرمان تایپ کنید، 998 01:24:29,090 --> 01:24:32,820 که خواندن یک کاراکتر از استاندارد وارد 999 01:24:32,820 --> 01:24:38,330 سپس putchar فقط رفتن برای قرار دادن کاراکتر می خوانیم تا از فایل را به خارج از استاندارد است. 1000 01:24:38,330 --> 01:24:42,890 شما می توانید مرد putchar، اما آن را فقط به استاندارد قرار دادن، آن را چاپ می کند که شخصیت. 1001 01:24:42,890 --> 01:24:51,600 شما همچنین می توانید فقط printf انجام (٪ C، C)، همان ایده است. 1002 01:24:53,330 --> 01:24:56,670 که رفتن را به انجام بخش عمده ای از کار ما. 1003 01:24:56,670 --> 01:25:00,300 >> آخرین چیزی که ما در حال رفتن به می خواهید برای انجام شده است فقط fclose فایل ما. 1004 01:25:00,300 --> 01:25:03,310 اگر شما fclose نیست، که نشت حافظه است. 1005 01:25:03,310 --> 01:25:06,680 ما می خواهیم به fclose فایل ما در اصل باز کرد، و من فکر می کنم که آن را. 1006 01:25:06,680 --> 01:25:13,810 اگر ما را که، من در حال حاضر مشکل است. 1007 01:25:13,810 --> 01:25:17,260 اجازه دهید را ببینید. 1008 01:25:17,260 --> 01:25:19,960 چه آن شکایت در مورد؟ 1009 01:25:19,960 --> 01:25:30,220 انتظار می رود 'بین المللی' اما استدلال از نوع ساختار _IO_FILE *. 1010 01:25:36,850 --> 01:25:39,370 ما را مشاهده می کنید در صورتی که با این نسخهها کار. 1011 01:25:45,210 --> 01:25:53,540 فقط در C99 مجاز می باشد. Augh. خوب، hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 در حال حاضر ما دریافت توضیحات بیشتر مفید است. 1013 01:25:57,760 --> 01:25:59,900 پس از شناسه اعلام نشده "normal_settings استفاده کنید. 1014 01:25:59,900 --> 01:26:04,170 من را صدا نمی زنم normal_settings. من نام آن را current_settings. 1015 01:26:04,170 --> 01:26:12,090 بنابراین تغییر همه از آن اجازه دهید. 1016 01:26:17,920 --> 01:26:21,710 در حال حاضر بحث عبور. 1017 01:26:26,290 --> 01:26:29,500 من این 0 برای. 1018 01:26:29,500 --> 01:26:36,720 باشه. / hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 من هم از صفحه نمایش در ابتدا مشخص نیست. 1020 01:26:39,590 --> 01:26:42,960 اما شما می توانید به عقب نگاه به مجموعه مشکل تاریخ و زمان آخرین برای دیدن صفحه نمایش شما روشن است. 1021 01:26:42,960 --> 01:26:45,160 این فقط در چاپ برخی از شخصیت های 1022 01:26:45,160 --> 01:26:47,210 در حالی که این در حال انجام آنچه که من می خواهم به انجام. 1023 01:26:47,210 --> 01:26:48,900 باشه. 1024 01:26:48,900 --> 01:26:55,280 و فکر کردن در مورد اینکه چرا این مورد نیاز به 0 به جای STDIN، 1025 01:26:55,280 --> 01:27:00,560 که باید # 0 تعریف، 1026 01:27:00,560 --> 01:27:03,890 این شاکی است که - 1027 01:27:13,150 --> 01:27:19,360 قبل از وقتی که من گفتم که فایل وجود دارد اما بعد از آن همچنین شما می توانید فایل خود را، 1028 01:27:19,360 --> 01:27:23,210 یک توصیفگر فایل فقط یک عدد صحیح است، 1029 01:27:23,210 --> 01:27:26,970 در حالی که فایل * دارای یک دسته از مسائل در ارتباط با آن است. 1030 01:27:26,970 --> 01:27:30,380 به این دلیل که ما نیاز به گفتن نیست 0 به جای STDIN 1031 01:27:30,380 --> 01:27:37,480 این است که STDIN * فایل است که اشاره به چیزی است که ارجاع توصیفگر فایل 0 است. 1032 01:27:37,480 --> 01:27:45,070 بنابراین حتی زمانی که من fopen (ی argv [1]، من گرفتن یک فایل *. 1033 01:27:45,070 --> 01:27:51,180 اما در جایی که در فایل * چیزی که مربوط به توصیف گر فایل ها برای آن فایل است. 1034 01:27:51,180 --> 01:27:57,430 اگر شما در صفحه مرد باز نگاه کنید، بنابراین من فکر می کنم شما باید به مرد 3 - نه - 1035 01:27:57,430 --> 01:27:59,380 مرد 2 باز - آره. 1036 01:27:59,380 --> 01:28:06,250 اگر شما در صفحه باز نگاه کنید، باز مانند fopen سطح پایین، 1037 01:28:06,250 --> 01:28:09,350 و آن را بازگشت فایل توصیف واقعی است. 1038 01:28:09,350 --> 01:28:12,050 fopen کند یک دسته از مسائل در بالا باز، 1039 01:28:12,050 --> 01:28:17,640 که به جای بازگشت که فقط توصیف گر فایل را برمی گرداند کل یک فایل اشاره گر * 1040 01:28:17,640 --> 01:28:20,590 در داخل است که فایل ما کمی توصیف. 1041 01:28:20,590 --> 01:28:25,020 بنابراین استاندارد در اشاره به چیزی FILE *، 1042 01:28:25,020 --> 01:28:29,120 در حالی که 0 اشاره به استاندارد فایل توصیف را در خود می شود. 1043 01:28:29,120 --> 01:28:32,160 >> پرسش و پاسخ؟ 1044 01:28:32,160 --> 01:28:35,930 [می خندد] که از طریق منفجر. 1045 01:28:35,930 --> 01:28:39,140 بسیار خوب. ما در حال انجام شده است. [می خندد] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]