[Powered by Google Translate] [بخش 5 - راحت تر]
[راب Bowden - دانشگاه هاروارد
[این CS50 است. - CS50.TV]
>> مثل من در ایمیل من گفت، هستند بسیاری از چیزهایی که شما می توانید استفاده کنید وجود دارد
دیگر از این دستگاه در واقع به مجموعه مشکل است.
ما توصیه می کنیم شما آن را انجام دهید فقط به خاطر اینکه در این دستگاه پس از آن ما به راحتی می تواند به شما کمک کند
و ما می دانیم که چگونه همه چیز را در حال رفتن به محل کار است.
اما به عنوان یکی از نمونه های که در آن شما می توانید همه چیز را اگر، می گویند، شما دسترسی ندارد
به دستگاه و یا شما می خواهید به کار در زیرزمین مرکز علوم -
که در واقع آنها را به دستگاه بیش از حد -
اگر شما می خواهید به کار در هر نقطه.
یکی از نمونه های است که شما دیده / شنیده از SSH؟
SSH است که اساسا درست مثل اتصال به چیزی.
در واقع، در حال حاضر من به دستگاه SSHed.
من هرگز به طور مستقیم در دستگاه است.
در اینجا است که لوازم خانگی، و اگر شما نگاه کردن در اینجا این آدرس IP شما را ببینید.
من در خود دستگاه کار می کنند؛
من همیشه به پنجره / پنجره ترمینال iTerm2 آمده است.
شما می توانید به آن آدرس IP، jharvard@192.168.129.128 SSH SSH.
من به یاد داشته باشید که شماره به راحتی به دلیل آن را مانند یک الگوی خوب است.
اما این به من برای رمز عبور من را بپرسید، و در حال حاضر من در دستگاه هستم.
در واقع، در این نقطه، اگر شما باز کردن یک ترمینال در داخل خود دستگاه،
، با این حال شما می توانید از آن استفاده کنید، این رابط دقیقا همان
به عنوان رابط من با استفاده از اینجا، اما در حال حاضر شما در حال SSHed.
شما را به SSH به دستگاه ندارد.
یکی از نمونه های دیگر جایی است که شما می تواند SSH برای من کاملا مطمئنم که شما به طور پیش فرض -
آه. بزرگتر است.
همه شما باید با حساب FAS به طور پیش فرض بر روی سرورهای FAS داشته باشد.
برای من، من می خواهم SSH به rbowden@nice.fas.harvard.edu.
این رفتن به از شما بخواهد که برای اولین بار، و به شما می گویند بله.
رمز عبور من فقط رفتن به رمز عبور FAS من.
و بنابراین در حال حاضر، من به سرور خوب SSHed، و من می توانم هر چیزی که من در اینجا می خواهم انجام دهد.
بسیاری از کلاس های که ممکن است، مانند 124، رفتن به چیزهای به اینجا آپلود کنید
در واقع به مجموعه مشکل خود را ارسال کنید.
اما می گویند که شما به دستگاه شما دسترسی داشته باشند.
سپس شما می توانید از همه چیز، می خواهم در اینجا از آن خواهند گفت -
این تنها بخش از سوالات.
آن را به شما برای انجام این کار در دستگاه بپرسید.
در عوض من فقط آن را بر روی سرور انجام دهد.
من قصد دارم به زیپ لباس را باز کردن که.
مشکل این است که رفتن به این باشد که شما با استفاده از چیزی شبیه به gedit استفاده می شود
و یا هر آنچه در داخل دستگاه.
شما نمی خواهید که این کار را بر روی سرور FAS.
این همه فقط برای رفتن به این رابط متنی.
بنابراین شما می توانید هر یک، سعی کنید یک ویرایشگر متن که آنها مجبور به یادگیری.
آنها نانو.
نانو است که معمولا بسیار آسان برای استفاده.
شما می توانید فلش خود استفاده کنید و به طور معمول.
به طوری که سخت نیست.
اگر می خواهید واقعا فانتزی، شما می توانید ایمکس استفاده کنید،
که من احتمالا باید باز نمی چرا که من حتی نمی دانند که چگونه به نزدیک ایمکس.
کنترل X، کنترل C؟ آره.
یا شما می توانید نیرو، که همان چیزی است که من با استفاده از استفاده کنید.
و بنابراین کسانی که گزینه های خود را.
اگر شما نمی خواهید برای انجام این کار، شما می توانید همچنین، اگر شما در نگاه manual.cs50.net -
آه.
بر روی یک کامپیوتر، شما می توانید از SSH با استفاده از بتونه،
که شما در حال رفتن به برای دانلود به صورت جداگانه.
در مک، شما می توانید تنها با استفاده از ترمینال به طور پیش فرض و یا شما می توانید iTerm2 دانلود،
است که مانند ترمینال فانتزی و زیبا،.
اگر شما به manual.cs50.net شما یک لینک به دفترچه یادداشت + +،
که این همان چیزی است که شما می توانید بر روی یک کامپیوتر استفاده کنید.
این به شما اجازه می دهد تا از SFTP دفترچه یادداشت + +، است که اساسا SSH.
این به شما اجازه انجام ویرایش فایل های خود را به صورت محلی،
و پس از آن هر زمان که شما می خواهید به آنها را ذخیره کنید، آن را به nice.fas ذخیره کنید،
جایی که بعد از آن شما می توانید آنها را اجرا کنید.
و معادل در مک به TextWrangler.
پس از آن به شما اجازه می دهد تا انجام کار مشابه می باشد.
این اجازه می دهد تا فایل های شما به صورت محلی و ذخیره آنها را به nice.fas،
جایی که بعد از آن شما می توانید آنها را اجرا کنید.
بنابراین اگر شما همیشه بدون دستگاه گیر کرده است، شما باید این گزینه
به مجموعه مشکل خود را انجام دهد هنوز.
یک مشکل خواهد بود که شما در حال رفتن به کتابخانه CS50
چون nice.fas می کند به طور پیش فرض نداشته باشند.
شما هم می توانید کتابخانه CS50 دانلود -
من فکر نمی کنم نیاز دارم که در این نقطه است.
شما هم می توانید کتابخانه CS50 دانلود و کپی آن را به nice.fas
یا من فکر می کنم در این مرحله ما از آن استفاده نمی کنه به هر حال.
و یا در صورتی که ما انجام می دهیم، شما می توانید در حال حاضر آن را جایگزین با
پیاده سازی توابع در کتابخانه CS50 به هر حال.
به طوری که نه باید این باشد که بسیاری از محدودیت است.
و این است.
>> من به دستگاه در حال حاضر، ما همه چیز را در دستگاه انجام دهد.
در حال جستجو در بخش ما را از سوالات، در آغاز، مثل من در ایمیل من گفت،
ما باید به صحبت در مورد یکی کوتاه شما را به تماشای قرار بود.
ما هدایت و لوله ها و این سه پرسش.
>> تا که جریان توابع مانند printf به طور پیش فرض ارسال کنید؟
بنابراین جریان است. جریان چیست؟
جریان است که اساسا آن را دوست دارم فقط برخی از -
حتی یک منبع 1s و 0s.
جریان آن را برای درخواست اینجا خارج از استاندارد است.
و استاندارد کردن یک جریان است که هنگامی که شما را به نوشتن آن،
آن را بر روی صفحه نمایش ظاهر می شود.
خارج از استاندارد، توسط جریان، به این معنی شما فقط نوشتن 1s و 0s به آن،
و انتهای دیگر خارج از استاندارد فقط از آن جریان می خواند.
این فقط یک رشته از 1s و 0s.
شما می توانید به جریان ارسال و یا شما می توانید از رودخانه ها به عنوان خوانده شده
بسته در چه جریان واقع شده است.
دو تن دیگر از جریان پیش فرض استاندارد در و خطای استاندارد است.
استاندارد در هر زمان که شما GetString، این انتظار را برای شما به مسائل ورودی است.
بنابراین آن را برای شما در انتظار، در واقع این استاندارد در انتظار،
است که واقعا آنچه کسب می کنید زمانی که شما در صفحه کلید تایپ.
شما در حال تایپ کردن را به استاندارد وارد
خطای استاندارد به خارج از استاندارد است که اساسا معادل،
اما تخصصی که در زمانی که شما را به خطا استاندارد نسخه قابل چاپ،
شما قرار است به چاپ پیغام خطا به آن
بنابراین شما می توانید بین پیام به طور منظم چاپ شده به روی صفحه نمایش متفاوت
در مقابل پیام های خطا با توجه به اینکه آیا آنها به خارج از استاندارد و یا خطای استاندارد رفت.
فایل های بیش از حد.
خارج از استاندارد، استاندارد، و خطای استاندارد فقط ویژه جریان،
اما واقعا هر فایل، زمانی که شما برای باز کردن یک فایل، آن را به یک جریان کلمه در ادامه متن می شود
که در آن شما فقط می توانید از آن جریان را بخوانید.
شما، در بیشتر قسمت ها، فقط می توانید از یک فایل به عنوان یک جریان بایت ها فکر می کنم.
بنابراین جریان چه چیزی آنها را به طور پیش فرض بنویسید؟ خارج از استاندارد است.
>> تفاوت بین> >> چه خبر؟
آیا کسی تماشای این ویدئو را از قبل؟ باشه.
> رفتن به چگونه شما را به فایل های تغییر مسیر،
و >> همچنین رفتن به تغییر مسیر خروجی را به فایل،
اما آن به جای رفتن به الحاق به فایل.
به عنوان مثال، اجازه دهید بگویم من به اتفاق DICT حق در اینجا،
و این مسائل تنها در داخل بینی گربه، گربه، سگ، ماهی، سگ است.
گربه یک دستور است که شما را در خط فرمان است.
است که فقط رفتن به چاپ چه چیزی در یک فایل.
بنابراین، هنگامی که من می گویم DICT گربه، آن را به چاپ گربه، گربه، سگ، ماهی، سگ است. که تمام گربه می کند.
این بدان معنی است که آن را به استاندارد کردن گربه، گربه، سگ، ماهی، سگ چاپ.
اگر من به جای می خواهید به تغییر مسیر است که به یک فایل، می توانید استفاده کنید> و هدایت آن را به هر فایل است.
من فایل تماس بگیرید.
بنابراین در حال حاضر اگر من LS، من نگاه کنید من یک فایل جدید به نام فایل.
و اگر من آن را باز کردن، آن را دقیقا همان چیزی است که گربه را در خط فرمان است.
بنابراین در حال حاضر اگر من این کار را دوباره، و سپس آن را به رفتن به تغییر مسیر خروجی را به فایل،
و من قصد دارم به چیزی یکسان است.
بنابراین از لحاظ فنی، آن را به طور کامل overrode آنچه که ما تا به حال.
و خواهیم دید که اگر DICT را عوض کنم، من در زمان به سگ.
در حال حاضر اگر ما گربه DICT به فایل دیگر، ما در حال رفتن به نسخه جدید با سگ برداشته است.
پس آن را به طور کامل آن را لغو.
در عوض، اگر ما به استفاده از >>، آن را به رفتن به پیوست فایل.
در حال حاضر، باز کردن فایل، ما می بینیم ما تنها چیزی که چاپ دو برابر
چرا که آنجا بود یک بار، پس از آن ما به متن اصلی اضافه شده است.
بنابراین این چیزی است که> و >> انجام دهد.
آیا یکی از بعدی بپرسید - این کار در مورد آن بپرسید.
>> یکی دیگر که در حال حاضر <، که اگر> تغییرمسیر خارج از استاندارد است،
<برای رفتن به تغییر مسیر استاندارد وارد
بیایید ببینیم که اگر ما به عنوان مثال.
من می توانم یک میانبر واقعی بنویسید.
بیایید هر فایل، hello.c.
نسبتا ساده فایل.
من فقط یک رشته و سپس چاپ "سلام" هر چه رشته بود من فقط وارد است.
با سلام و پس از آن را. / سلام.
حال حاضر آن را به من باعث به چیزی وارد کنید
که بدان معنی است که در انتظار همه چیز را به استاندارد وارد می شود وارد
بنابراین هر آنچه که من را به استاندارد می خواهید شوید. ما فقط برای گفتن سلام، راب را وارد کنید!
سپس آن را چاپ استاندارد از خوش آمدید، راب!
اگر من / با سلام و پس از آن تغییر مسیر،
در حال حاضر شما تنها می توانید از یک فایل هدایت.
بنابراین اگر من در بعضی از فایل، TXT قرار داده است، و من قرار راب،
اگر من را اجرا سلام و سپس تغییر مسیر فایل TXT به / سلام، آن را برای گفتن سلام، راب! بلافاصله.
هنگامی که آن را برای اولین بار به GetString می شود و آن را در انتظار استاندارد در،
استاندارد در دیگر انتظار بر روی صفحه کلید برای داده ها را به وارد.
در عوض، ما را در خواندن از فایل TXT استاندارد هدایت می شوید.
و پس از آن رفتن به خواندن از کلیپ برد چند منظوره فایل است که فقط راب خط،
و سپس آن را به چاپ میهمان گرامی، راب!
و اگر من می خواستم، من نیز می توانند انجام دهند / خوش آمدید <TXT
و پس از آن استاندارد خارج است که چاپ آن، است که میهمان گرامی، راب!
من می توانم آن را به فایل های خاص خود را هدایت کنید.
من فقط فایل خوش آمدید تماس بگیرید - نه، من نمی خواهد، چرا که اجرایی - txt2.
در حال حاضر، txt2 رفتن به خروجی / سلام <کلیپ برد چند منظوره، که به خوش آمدید راب!
>> پرسش و پاسخ؟
>> باشه. بنابراین در اینجا ما به خط لوله.
لوله، واحد آخرین تغییر مسیر است.
>> آه. من حدس می زنم یک واحد بیشتر از تغییر مسیر است اگر به جای آن از> 2>
که هدایت خطای استاندارد.
بنابراین اگر چیزی رفت و به خطای استاندارد، آن را به txt2 می کنید قرار داده است.
اما توجه کنید که اگر من 2>، سپس آن را هنوز چاپ میهمان گرامی، راب! از خط فرمان
چون من فقط هدایت خطای استاندارد، من استاندارد هدایت نمی کردن.
خطای استاندارد و استاندارد کردن متفاوت است.
اگر شما می خواهید به واقع به خطای استاندارد نوشتن،
پس از آن من می توانم این را به fprintf به stderr را تغییر دهید.
تا printf، به طور پیش فرض، چاپ به خارج از استاندارد است.
اگر من می خواهم برای چاپ به خطای استاندارد به صورت دستی، پس از آن من مجبور به استفاده از fprintf
و مشخص آنچه که من می خواهم تا در آن چاپ شود.
اگر به جای من به STDOUT fprintf، پس از آن که اساسا معادل printf است.
اما fprintf به خطای استاندارد.
بنابراین در حال حاضر، در صورتی که این تغییر مسیر به txt2، خوش آمدید، راب! هنوز هم در خط فرمان چاپ
از آن رسیدن به خطای استاندارد چاپ شده و من فقط هدایت استاندارد خارج شده است.
اگر من در حال حاضر تغییر مسیر خطای استاندارد، در حال حاضر آن را انجام نمی چاپ شده، و txt2 است برای رفتن به میهمان گرامی، راب!
بنابراین در حال حاضر، شما می توانید خطاهای واقعی خود را به خطای استاندارد چاپ
و چاپ پیام به طور منظم خود را به خارج از استاندارد است.
و تا زمانی که اجرای برنامه خود را، شما می توانید آن را به عنوان اجرا / خوش آمدید این نوع با 2>
به طوری که برنامه خود را به اجرا به طور معمول،
اما هر پیغام خطا که شما بعدا می توانید چک کنید در ورود خطا،
بنابراین اشتباهات، و سپس بعد از آن نگاه و خطاهای فایل خود را به هر خطایی که اتفاق افتاده است را به همراه خواهد داشت.
>> پرسش و پاسخ؟
>> یکی از آخرین لوله، که شما می توانید از فکر می کنم به عنوان استاندارد از یک دستور است
و ساخت آن استاندارد در دستور بعدی.
به عنوان مثال در اینجا اکو خط فرمان چیزی است
است که فقط رفتن به اکو هر آنچه که من به عنوان آرگومان آن قرار داده است. من به نقل قول قرار داده است.
اکو، اه، اه، اه، فقط رفتن است به چاپ، اه، اه، اه.
پیش از این، زمانی که من گفتم: من تا به حال برای قرار دادن راب را به یک فایل TXT
چون من فقط می تواند تغییر مسیر فایل های TXT، به جای آن، / اگر من اکو راب
و پس از آن لوله آن را به. / سلام، که همچنین انجام خواهد داد از همان نوع از چیزی.
این است که با در نظر گرفتن خروجی این دستور، اکو راب،
و با استفاده از آن به عنوان ورودی برای. / سلام.
شما می توانید از آن فکر می کنم به عنوان اولین تغییر مسیر اکو راب را به یک فایل
و سپس ورودی را به / خوش آمدید که فایل که فقط خروجی بود.
اما طول می کشد فایل موقت خارج از تصویر است.
>> سوالات مطرح شده در آن؟
>> سوال بعدی این است در صدد این است.
چه خط لوله می تواند شما را برای پیدا کردن شماره از نام های منحصر به فرد در یک فایل به نام names.txt؟
ما قصد داریم که مایل به استفاده از دستورات منحصر به فرد، به طوری uniq، و سپس WC.
شما می توانید uniq مرد به در واقع در آنچه که نمی تواند انجام دهد،
و آن را فقط برای فیلتر کردن مجاور مطابق خطوط از ورودی است.
و انسان WC به چاپ خط جدید، ورد، و تعداد بایت برای هر فایل.
و آخرین ما قصد داریم که مایل به استفاده از مرتب کردن بر اساس:
که در حال رفتن به مرتب کردن خطوط از فایل TXT.
اگر من بعضی از فایل TXT، names.txt، و آن را راب، تامی، جوزف، تامی، یوسف، RJ، راب،
آنچه من می خواهم به انجام این کار در اینجا پیدا کردن شماره از نام های منحصر به فرد در این فایل است.
پس چه باید پاسخ می شود؟ >> [دانشجو] 4. >> آره.
باید 4 از راب، تامی، جوزف، RJ به نام تنها منحصر به فرد در این فایل است.
مرحله اول، اگر من فقط تعداد کلمه در names.txt،
این است که در واقع به من گفتن همه چیز است.
این است که در واقع چاپ - بیایید ببینید، انسان WC - خطوط، کلمات، و تعداد بایت.
اگر من فقط در مورد خطوط، پس من فقط می تواند WC-L names.txt انجام دهد.
به طوری که مرحله 1.
اما من به WC-L names.txt می خواهم نه به خاطر names.txt فقط شامل تمام اسامی،
و من می خواهم به فیلتر کردن هر گونه منحصر به فرد است.
بنابراین اگر من uniq names.txt، که نمی تواند کاملا به من به آنچه من می خواهم
به این دلیل که نام تکرار هنوز هم وجود دارد.
این است که چرا؟ چرا uniq انجام نمی دهد چه من می خواهم؟
[دانشجو] تکراری نیستند [نامفهوم] >> آره.
به یاد داشته باشید به صفحه uniq می گوید خطوط فیلتر تطبیق مجاور.
آنها مجاور نیست، پس از آن آنها را فیلتر نیست.
اگر من مرتب آنها را، names.txt مرتب سازی بر رفتن به قرار دادن تمام خطوط تکراری را با هم.
بنابراین در حال حاضر names.txt مرتب کردن بر اساس آن است که.
من می خواهم به استفاده از آن به عنوان ورودی به uniq، که | uniq.
است که به من یوسف، RJ، راب، تامی،
و من می خواهم به استفاده از آن به عنوان ورودی به WC-L،
است که به من 4 را.
مانند آن را می گوید در اینجا، چه خط لوله می تواند شما را استفاده می کنید؟
شما می توانید بسیاری از چیزهایی مثل استفاده از یک سری از دستورات را انجام دهد
که در آن شما با استفاده از خروجی یک دستور به عنوان ورودی به فرمان بعدی.
شما می توانید بسیاری از چیزها، بسیاری از چیزهایی هوشمندانه انجام دهد.
>> پرسش و پاسخ؟
باشه.
است که آن را برای لوله ها و تغییر مسیر است.
>> در حال حاضر ما به چیزهای واقعی، مسائل برنامه نویسی.
در داخل این PDF، شما می توانید این دستور را ببینید،
و شما می خواهید این دستور برای اجرا در دستگاه های خود را.
دستور wget دستور فقط برای گرفتن چیزی از اینترنت، در واقع،
بنابراین دستور wget و این URL.
اگر شما به این URL را در مرورگر خود رفت، آن را که فایل را دانلود کنید.
من فقط بر روی آن کلیک، پس از آن فایل را برای من دریافت شده است.
اما نوشتن چیزی که در داخل ترمینال دستور wget
فقط رفتن به آن را به ترمینال خود را دانلود کنید.
من از section5.zip است، و شما می خواهید به زیپ لباس را باز کردن section5.zip،
است که به شما یک پوشه به نام section5،
است که به زودی همه از فایل های ما قصد داریم با استفاده از امروز در داخل آن است.
این برنامه نام فایل نشان می دهد، آنها کمی حشره دار،
ماموریت شما این است که چرا با استفاده از GDB.
آیا همه آنها را دانلود / می دانم که چگونه می توانید آنها را دریافت
به دستگاه خود را؟ باشه.
>> در حال اجرا ./buggy1، آن را به خطا تقسیم بندی (هسته ریخته) می گویند،
که هر زمان شما segfault، این یک چیز بد است.
تحت چه شرایطی انجام segfault می کنید؟
[دانشجو] غیر مرجع اشاره گر تهی است. >> آره. به طوری که یک نمونه است.
بصورت غیر مرجع اشاره گر تهی که شما در حال رفتن به segfault.
چه segfault به معنی این است که شما در حال لمس کردن حافظه شما نباید لمس کردن است.
بنابراین غیر مرجع اشاره گر تهی دست زدن به آدرس 0.
و در واقع، تمام کامپیوترها در حال حاضر می گویند که 0 آدرس حافظه شما نباید لمس کردن است.
بنابراین به همین دلیل است که بصورت غیر مرجع اشاره گر تهی در segfault.
هنگامی که شما اتفاق می افتد به مقداردهی اولیه اشاره گر، سپس آن را دارای ارزش زباله،
و بنابراین، هنگامی که شما سعی کنید به dereference آن، به احتمال زیاد شما در حال لمس کردن حافظه
که در وسط هیچ جا.
اگر شما اتفاق می افتد به خوش شانس و ارزش زباله
اتفاق افتاده به نقطه را به جایی در پشته و یا چیزی،
پس از آن زمانی که شما dereference که اشاره گر آن شما را مقداردهی اولیه نیست،
هیچ چیز اشتباه است.
اما اگر آن را با اشاره به، می گویند، جایی میان پشته و پشته،
و یا آن را با اشاره فقط به جایی است که از طریق برنامه خود را استفاده نمی شود در عین حال،
سپس شما لمس کردن حافظه شما نباید لمس کردن و شما segfault.
هنگامی که شما در نوشتن یک تابع بازگشتی و بار بیش از حد بسیاری از recurses
و پشته شما رشد می کند به همه چیز بیش از حد بزرگ و از برخورد پشته
که باید آن را نه با برخورد، شما در حال لمس کردن حافظه شما نباید لمس کردن،
بنابراین شما segfault.
است که چه segfault.
>> همچنین به همین دلیل است که اگر شما یک رشته مانند -
اجازه بازگشت به برنامه های قبلی است.
در hello.c-I'm فقط رفتن را به چیز دیگری است.
کاراکتر * S = "سلام جهان!"؛
اگر من با استفاده از * S = چیزی یا S [0] = 'X'؛
بنابراین مطمئن خوش آمدید. / سلام، چرا که segfault؟
چرا این segfault؟
چه شما انتظار می رود رخ می دهد؟
اگر من printf ("٪ S \ N"، s)؛ آنچه را که شما انتظار می رود که باید چاپ شود؟
[دانشجوی] X سلام. >> آره.
مشکل این است که هنگامی که یک رشته مانند این به شما اعلام،
یک اشاره گر است که بر روی پشته است،
و چه با اشاره به این رشته موجود است که در حافظه فقط خواندنی است.
بنابراین فقط با نام، حافظه فقط خواندنی، شما باید این ایده را بدست آورید
که اگر شما سعی می کنید را تغییر دهید چه چیزی در حافظه فقط خواندنی،
شما در حال انجام چیزی است که شما نباید با حافظه انجام و شما segfault.
این است که در واقع یک تفاوت بزرگ بین کاراکتر و کاراکتر ها [].
پس کاراکتر []، در حال حاضر این رشته در حال رفتن به در پشته قرار داده می شود،
و پشته فقط خواندنی است، که بدان معنی است که این کار کاملا خوب است.
و این هم اینکار را در مورد شما نمی کنند.
به یاد داشته باشید که زمانی که من کاراکتر * S = "سلام جهان!"، S خود را بر روی پشته
اما به جای دیگری، و این که در جایی دیگر اتفاق می افتد فقط خواندنی است.
اما کاراکتر ها [] است که تنها چیزی را بر روی پشته.
به طوری که به عنوان مثال دیگری از segfault اتفاق می افتد.
>> ما شاهد که ./buggy1 در segfault.
در تئوری، شما نباید نگاه کنید buggy1.c بلافاصله.
در عوض، ما در آن را از طریق GDB نگاه کنید.
توجه داشته باشید که هنگامی که شما خطا تقسیم بندی (هسته ریخته)،
شما می توانید این فایل بر هسته در اینجا به نام.
اگر ما LS-L، خواهیم دید که هسته است که معمولا یک فایل بسیار بزرگ است.
این تعداد بایت از فایل است، پس از آن به نظر می رسد مانند آن را 250 چیزی کیلوبایت.
دلیل این امر این است که آنچه روگرفت اصلی واقع شده است
وقتی است که قفل برنامه، دولت از حافظه برنامه شما
فقط کپی می شود و به این فایل چسبانده شده است.
این می شود که به فایل ریخته شده است.
این برنامه، در حالی که در حال اجرا بود، به طور اتفاقی به استفاده از حافظه از حدود 250 کیلوبایت،
و به طوری که به این فایل ریخته شدم.
حالا شما می توانید در آن فایل نگاه کنید اگر ما GDB هسته buggy1.
ما فقط می تواند GDB buggy1، انجام دهند و که فقط راه اندازی خواهد شد GDB به طور منظم،
با استفاده از buggy1 به عنوان فایل ورودی آن است.
اما اگر شما GDB هسته buggy1، سپس آن را به طور خاص برای راه اندازی GDB
با نگاه کردن به فایل اصلی که.
و شما می گوید buggy1 وسیله GDB می داند که که فایل اصلی می آید از برنامه buggy1.
بنابراین GDB buggy1 هسته را به سرعت ما را
به جایی که این برنامه رخ داده است برای پایان دادن به.
ما در اینجا شاهد برنامه با سیگنال 11، گسل تقسیم خاتمه یافته است.
ما اتفاق می افتد برای دیدن یک خط مونتاژ، که احتمالا خیلی مفید نیست.
اما اگر BT یا backtrace شما نوع، که برای رفتن به تابع
است که به ما می دهد لیستی از فریم پشته فعلی ما است.
بنابراین backtrace. به نظر می رسد که ما فقط دو قاب پشته.
اولین قاب پشته اصلی ما است.
و دوم قاب پشته برای این تابع است که ما اتفاق می افتد به در است،
که به نظر می رسد مثل ما فقط کد اسمبلی است.
پس اجازه بازگشت به تابع اصلی ما،
و برای انجام این کار ما می توانیم قاب 1 انجام دهید، و من فکر می کنم ما نیز می توانید انجام دهید،
اما من تقریبا هرگز - و یا تا. آره.
بالا و پایین. نام شما به ارمغان می آورد تا یک پشته قاب، پایین به ارمغان می آورد شما یک قاب پشته.
من تمایل دارم که با استفاده از هرگز.
من فقط به طور خاص قاب 1 می گویند، که به قاب برچسب 1.
قاب (1) ما را به قاب پشته اصلی
آن را می گوید و حق در اینجا خط از کد ما اتفاق می افتد به در.
اگر ما می خواستیم چند خط از کد، ما می توانید لیست می گویند،
و این برای همه ما خط از کد را در اطراف آن به من بدهید.
خط ما در segfaulted 6 بود:
اگر (strcmp ("CS50 سنگ"، و argv [1]) == 0).
اگر آن را آشکار نشده است، شما می توانید آن را مستقیما از اینجا دریافت کنید تنها با فکر همین دلیل آن را segfaulted.
اما ما می توانیم آن را یک قدم جلوتر ببریم و می گویند، "چرا ی argv [1] segfault؟"
چاپ بیایید و argv [1]، و آن را مانند 0x0 آن، است که اشاره گر تهی به نظر می رسد.
ما در حال strcmping CS50 سنگ و تهی، و به طوری که رفتن به segfault.
و به همین دلیل است و argv [1] تهی؟
[دانشجوی] از آنجا که ما را از آن استدلال خط فرمان نیست.
آره. ما را از آن استدلال خط فرمان نیست.
بنابراین ./buggy1 فقط رفتن به ی argv [0] ./buggy1.
این نخواهیم داشت و argv [1]، به طوری که رفتن به segfault.
اما، در عوض، اگر من فقط CS50، آن را به رفتن به می گویند D شما
چرا که این چیزی است که در آن قرار است برای انجام این کار است.
به دنبال در buggy1.c، قرار است به چاپ "شما دریافت می کنید D" -
اگر ی argv [1] است که نه "CS50 سنگ"، "شما دریافت می کنید D"، دیگری "شما دریافت می کنید!"
بنابراین اگر ما می خواهیم، ​​ما باید این را به عنوان واقعی مقایسه،
که بدان معنی است که آن را به 0 مقایسه است.
بنابراین ی argv [1] نیاز به "CS50 سنگ".
اگر شما می خواهید برای انجام این کار در خط فرمان، شما نیاز به استفاده از \ برای فرار از فضا.
بنابراین CS50 \ سنگها و شما دریافت می کنید!
اگر شما بک اسلش را انجام ندهید، چرا این کار نمی کند؟
[دانشجو] این دو استدلال متفاوت است. >> آره.
ی argv [1] رفتن به CS50، و ی argv [2] رفتن به سنگ. باشه.
>> در حال حاضر ./buggy2 رفتن دوباره به segfault.
به جای باز کردن آن با فایل اصلی خود را، ما فقط باز buggy2 به طور مستقیم،
بنابراین GDB buggy2.
در حال حاضر اگر ما فقط اجرای یک برنامه، و سپس آن را به رفتن به برنامه دریافت سیگنال SIGSEGV،
است که segfault سیگنال، و این جایی است که آن را به طور اتفاقی به اتفاق می افتد.
نگاهی backtrace ما، ما می بینیم که ما در oh_no تابع،
که تمیز تابع، را که توسط binky تابع نامیده می شد به نام شد،
که اصلی به نام بود.
ما همچنین می توانیم استدلال به این توابع را ببینید.
این استدلال به شیک و binky 1 بود.
اگر oh_no تابع را به لیست اضافه می کنیم، می بینیم که oh_no فقط انجام کاراکتر ** = NULL؛
* S = "BOOM"؛
چرا که شکست؟
[دانشجوی] شما می توانید dereference اشاره گر تهی نیست؟ >> آره.
این فقط گفت: NULL است، بدون در نظر گرفتن در صورتی که اتفاق می افتد به عنوان یک ** کاراکتر،
که بسته به چگونه آن را تفسیر، این می تواند یک اشاره گر به اشاره گر به یک رشته
و یا آرایه ای از رشته ها است.
این NULL است، به طوری * S بصورت غیر مرجع اشاره گر تهی،
و غیره این است که رفتن به سقوط.
این یکی از سریعترین راه شما احتمالا می تواند segfault است.
این فقط اعلام یک اشاره گر تهی و بلافاصله segfaulting.
این چیزی است که oh_no در حال انجام است.
اگر ما به یک قاب، پس از آن ما در حال رفتن به تابع است که به نام oh_no.
من نیاز به انجام این کار پایین است.
اگر شما یک فرمان وارد نمی کند و شما فقط ضربه را وارد کنید دوباره،
فقط به دستور قبلی است که به شما زد را تکرار کنید.
ما در قاب 1.
فهرست این چارچوب، ما می بینیم که در اینجا تابع ما است.
شما می توانید لیست دوباره ضربه، یا شما می توانید لیست 20 انجام و آن را بیشتر لیست.
زیبا عملکرد می گوید: اگر من به 1 است، پس از آن به تابع oh_no بروید.
دیگری برای تابع دزدکی بروید.
و ما می دانیم من 1 از آنجا که ما اتفاق می افتد برای دیدن اینجا
که شیک با استدلال 1 نامیده می شد.
یا شما فقط می توانید نسخه قابل چاپ کنم و آن را می گویند من به 1 است.
ما در حال حاضر در شیک، و اگر ما به یک قاب دیگر، ما می دانیم که ما در نهایت در binky.
بالا. در حال حاضر ما در binky هستیم.
در لیست این تابع - فهرست از قبل از نیمی من قطع -
آن آغاز شده است که اگر من 0 است، پس از آن ما در حال رفتن به آن را oh_no، شیک دیگری تماس بگیرید.
ما می دانیم که من 1 بود، به طوری که آن را به نام شیک.
و در حال حاضر ما در حال پشت در اصلی، اصلی و فقط برای رفتن به اعضای هیات من = رند ()٪ 3؛
است که فقط می خواهم به شما یک عدد تصادفی است که یا 0، 1 و یا 2.
این برای تماس binky که با شماره، و آن را به 0 بازگشت.
با نگاه کردن به این،
فقط راه رفتن را از طریق این برنامه به صورت دستی و بدون در حال اجرا آن را بلافاصله،
شما می توانید نقطه شکستن در اصلی تعیین می کنند، به این معنی که هنگامی که ما برای اجرای برنامه
برنامه شما اجرا می شود تا آن بازدید یک نقطه شکست.
بنابراین در حال اجرا این برنامه، آن را اجرا خواهد کرد و سپس آن را به تابع اصلی و ضربه زدن به توقف در حال اجرا است.
در حال حاضر ما در داخل از اصلی هستید، و مرحله بعدی این است که ما را به خط بعدی کد.
شما می توانید مرحله بعدی را انجام دهید.
زدن بعد، حالا من شده است به رند ()٪ 3 است، بنابراین ما می توانیم ارزش من نسخه قابل چاپ،
و آن را می گویند من به 1 است.
در حال حاضر این مهم که آیا ما از آینده یا مرحله است.
من حدس می زنم آن را در یکی از قبلی اهمیت است، اما ما می خواهیم به استفاده از آینده.
اگر ما استفاده از گام، ما را به تابع قدم، که به معنی نگاهی به چیزی واقعی
که اتفاق می افتد در داخل binky.
اگر ما استفاده از بعد، پس از آن به این معنی است که به بیش از تابع
و فقط به خط بعدی کد در تابع اصلی ما بروید.
حق در اینجا بر روی این خط، من که در آن گفت: رند ()٪ 3 بود؛
اگر من گام، آن را به پیاده سازی از رند
و نگاه کردن به آنچه اتفاق می افتد وجود دارد، و من می توانم از طریق تابع رند گام.
اما من در مورد تابع رند اهمیتی نمی دهند.
من فقط می خواهم برای رفتن به خط بعدی کد در متد Main، بنابراین من استفاده بعدی.
اما در حال حاضر من مراقبت در مورد تابع binky، بنابراین من می خواهم به این گام است.
در حال حاضر من در binky هستم.
اولین خط از کد رفتن به می گویند اگر (من == 0)، من را یک گام به،
ما می بینیم ما تا پایان در شیک.
اگر ما موارد فهرست، ما می بینیم که در آن بررسی شده است I = 0.
من برابر با 0 است، بنابراین آن را به شرایط دیگری رفت،
است که شیک (من) به تماس.
شما ممکن است اشتباه گرفته شود.
اگر شما فقط در این خطوط به طور مستقیم، شما ممکن است فکر می کنم اگر (من == 0)
خوب، پس من در زمان یک گام است و در حال حاضر من در شیک (من) هستم،
شما ممکن است فکر می کنم که به نظر من = 0 و یا چیزی.
نه، این فقط بدان معنی است که آن را می داند که آن را به طور مستقیم می توانید به چوب خط زیبا (من) است.
چون من 0 است، گام بعدی این است که قصد ندارم به دیگری پایان.
دیگری یک خط آن را به رفتن به توقف در نیست.
این فقط برای رفتن به خط بعدی آن را در واقع می تواند اجرا، شیک است که (من).
پله به شیک (من)، ما می بینیم اگر (من == 1).
ما من = 1 می دانیم، تا زمانی که ما مرحله، ما می دانیم که ما قصد داریم برای پایان دادن به در oh_no
به خاطر اینکه من = 1 خواستار oh_no تابع، که شما می توانید به مرحله،
است که به مجموعه کاراکتر ** = پوچ و بلافاصله "BOOM".
و پس از آن در واقع در اجرای buggy2 به دنبال
این، من فقط یک عدد تصادفی - 0، 1 و یا 2 - تماس binky،
که اگر من 0 است در آن خواستار oh_no، دیگری آن را خواند شیک، که می آید اینجا.
اگر من 1، oh_no تماس، دیگری دزدکی، که آمدن اینجا،
اگر من 2، با oh_no.
من حتی فکر می کنم یک راه وجود دارد -
آیا کسی راه ساخت این برنامه ای است که نمی خواهد segfault؟
از آنجا که، مگر من گم شده چیزی، اگر من 0 است، شما فورا خواهید segfault
دیگری شما را به یک تابع است که اگر من 1 شما segfault
دیگری شما را به یک تابع که اگر من 2 شما segfault بروید.
بنابراین بدون توجه به آنچه شما انجام دهد، شما segfault.
>> من حدس می زنم یکی از راه های رفع آن را به جای انجام کاراکتر ** = NULL باشد،
شما می توانید فضایی را برای این رشته malloc.
sizeof چه - ما می توانیم malloc (sizeof) را انجام دهید؟
[دانشجو] (کاراکتر) * 5؟ >> آیا این به نظر می رسد درست است؟
من با فرض این کار خواهد کرد اگر من در واقع آن را زد، اما آن چیزی است که من به دنبال.
نگاهی به نوع S. اجازه دهید اضافه کردن * نوع int است، به طوری که از نوع int * x است.
من می خواهم malloc (sizeof (INT)) انجام دهد.
یا اگر من می خواستم یک آرایه از 5، من می خواهم انجام دهید (sizeof (هوشمند) * 5)؛
چه می شود اگر من ** از نوع int؟
چه می توانم malloc؟
[دانشجو] حجم از اشاره گر. >> آره. (sizeof (نوع int *))؛
همین را در اینجا.
من می خواهم (sizeof (کاراکتر *))؛
این امر برای اختصاص فضا برای اشاره گر است که اشاره به "BOOM".
من نیازی به تخصیص فضا برای "BOOM" به خودی خود
به دلیل این است که اساسا معادل به آنچه قبل از من گفت:
کاراکتر * x = "BOOM".
"BOOM" در حال حاضر وجود دارد. این اتفاق می افتد وجود دارد در این منطقه از حافظه فقط خواندنی است.
اما در حال حاضر وجود دارد، که به معنی این خط از کد، اگر S ** کاراکتر،
پس از آن * S * کاراکتر است و شما در حال تنظیم این کاراکتر * برای اشاره به "BOOM".
اگر من می خواستم برای کپی کردن "BOOM" به ها، پس من نیاز به تخصیص فضا برای S.
من * s = malloc (sizeof (کاراکتر) * 5)؛
چرا 5؟
چرا 4؟ به نظر می رسد مانند "BOOM" 4 کاراکتر است. >> [دانشجو] شخصیت تهی.
آره. همه رشته های خود را در حال رفتن به نیاز به کاراکتر تهی.
در حال حاضر من می توانم چیزی مثل strcat - چه تابع برای کپی کردن یک رشته است؟
[دانشجوی] CPY؟ >> strcpy.
strcpy مرد است.
بنابراین strcpy یا strncpy.
strncpy است که کمی امن تر از شما می توانید مشخص کنید دقیقا چه بسیاری از شخصیت ها،
اما در اینجا مهم نیست چون ما می دانیم.
بنابراین strcpy و در استدلال.
اولین آرگومان مقصد ما این است که.
آرگومان دوم منبع ما است.
ما در حال رفتن به به * مقصد ما کپی اشاره گر "BOOM" است.
چرا ممکن است که شما می خواهید برای انجام این کار با strcpy به جای تنها چیزی که ما تا به حال قبل از
* S = "BOOM"؟
دلیل شما ممکن است بخواهید برای انجام این کار وجود دارد، اما آنچه در این است که دلیل؟
[دانشجوی] اگر می خواهید به تغییر چیزی در "BOOM". >> آره.
در حال حاضر من می توانم چیزی مثل انجام [0] = 'X'؛
چرا که نقاط ها به پشته و آن فضا را بر روی پشته ها است با اشاره به
اشاره گر به فضای بیشتری بر روی پشته است که ذخیره سازی "BOOM" است.
بنابراین این نسخه از "BOOM" است که در پشته ذخیره می شود.
از لحاظ فنی دو نسخه از "BOOM" در برنامه ما وجود دارد.
این برای اولین بار است که فقط توسط این "BOOM" ثابت رشته داده شده است وجود دارد.
و نسخه دوم از "BOOM"، strcpy ایجاد کپی از "BOOM".
اما نسخه ای از "BOOM" است که بر روی پشته ذخیره می شود، و پشته شما برای تغییر است.
پشته فقط خواندنی است، به طوری که بدان معنی است که [0]
اجازه رفتن به شما ارزش "BOOM" تغییر است.
اجازه رفتن به شما در آن شخصیت را تغییر دهید.
>> پرسش و پاسخ؟
باشه.
>> در حال حرکت به buggy3، بیایید GDB buggy3.
ما آن را فقط و اجرا شود ما می بینیم segfault ما.
اگر ما backtrace، تنها دو تابع وجود دارد.
اگر ما را به تابع اصلی ما، ما می بینیم که ما در این خط segfaulted.
پس فقط در این خط به دنبال، برای (اعضای هیات خط = 0؛ fgets این مسائل می کند NULL برابر نیست؛
خط + +).
قاب قبلی ما _IO_fgets نامیده می شد.
شما خواهید دید که بسیاری با ساخته شده در توابع C،
که زمانی که شما می توانید از segfault، وجود خواهد داشت واقعا مرموز نام تابع
مانند این _IO_fgets.
اما این مربوط به این فراخوان fgets.
جایی در داخل اینجا، ما در حال segfaulting.
اگر ما در استدلال به fgets نگاه کنید، ما می توانیم بافر چاپ.
بیایید چاپ - آه، نه.
چاپ به کار دقیقا همان که من می خواهم آن را به.
اجازه دهید نگاهی به این برنامه واقعی.
بافر یک آرایه کاراکتری است. این یک آرایه کاراکتر از 128 کاراکتر است.
بنابراین، هنگامی که من می گویم بافر چاپ، آن را به چاپ آن 128 کاراکتر را،
که من حدس می زنم آن چیزی است که انتظار می رود.
آنچه من به دنبال چاپ آدرس بافر،
اما واقعا من خیلی بگویید.
بنابراین، هنگامی که من به اتفاق می گویند اینجا بافر X، آن را نشان می دهد به من 0xbffff090،
که اگر شما به یاد داشته باشید از زودتر یا برخی از نقطه، Oxbffff گرایش به منطقه پشته پذیری.
در پشته تمایل به شروع در جایی درست زیر 0xc000.
فقط با دیدن این آدرس، من می دانم که بافر در پشته اتفاق می افتد.
شروع مجدد برنامه، اجرا، تا، بافر ما شاهد این دنباله ای از کاراکتر ها
که خیلی بی معنی است.
سپس چاپ فایل ها، چه فایل نگاه می کنید؟
[دانشجوی] تهی. >> آره.
یک فایل * نوع فایل است، پس از آن است که یک اشاره گر،
و ارزش که اشاره گر null است.
بنابراین fgets رفتن سعی کنید که اشاره گر به عنوان خوانده شده را به یک روش غیر مستقیم،
اما به منظور دسترسی به آن اشاره گر، آن را به dereference آن است.
یا، به منظور دسترسی به آنچه که باید آن را اشاره به آن ارجاع میدهد.
پس از آن بصورت غیر مرجع اشاره گر تهی و segfaults آن است.
من می توانستم آن را دوباره راه اندازی وجود دارد.
اگر ما در نقطه اصلی ما شکستن و اجرا،
خط اول از کد کاراکتر * نام فایل = "nonexistent.txt" است؛
که باید یک اشاره بزرگ و زیبا که به همین دلیل این برنامه با شکست مواجه می دهد.
تایپ در کنار من به ارمغان می آورد به خط بعد، جایی که من برای باز کردن این فایل،
و پس از آن من بلافاصله به خط ما، جایی که یک بار من بعدی، این رفتن به segfault.
آیا کسی می خواهید به پرتاب کردن به همین دلیل ممکن است segfaulting؟
[دانشجو] فایل وجود ندارد. >> آره.
قرار است به یک اشاره
که هر زمان که شما در حال باز کردن یک فایل شما نیاز به بررسی کنید که این فایل در واقع وجود دارد.
بنابراین در اینجا، "nonexistent.txt"؛
هنگامی که ما نام فایل fopen برای خواندن، سپس ما نیاز به گفتن
اگر (پرونده == NULL) و می گویند: printf ("فایل وجود ندارد!"
یا - بهتر است - نام فایل)؛ بازگشت 1؛
بنابراین در حال حاضر ما چک کنید و ببینید که اگر آن را NULL
قبل از ادامه و تلاش برای از آن فایل به عنوان خوانده شده.
ما می توانیم آن را بازسازی فقط برای دیدن است که که با این نسخهها کار.
من در نظر گرفته شده که شامل یک خط جدید است.
بنابراین در حال حاضر nonexistent.txt وجود ندارد.
شما همیشه باید برای این نوع از چیزی که به بررسی کنید.
شما همیشه باید برای دیدن اگر fopen NULL را برمی گرداند.
شما همیشه باید چک کنید تا مطمئن شوید که malloc NULL را بر نمی گرداند،
یا دیگری شما segfault.
>> در حال حاضر buggy4.c.
در حال اجرا است. من حدس می زنم این است که انتظار برای ورودی یا حلقه احتمالا نامحدود است.
بله، آن را حلقه بی نهایت است.
بنابراین buggy4. به نظر می رسد مثل حلقه بی نهایت ما.
ما می توانیم در بخش اصلی شکستن، اجرای برنامه های ما است.
در GDB، تا زمانی که از حروف اختصاری استفاده می کنید بدون ابهام است
یا اختصارات خاص است که آنها را برای شما فراهم می کند،
سپس شما می توانید برای استفاده از بعد به جای نیاز به تایپ از آینده تمام راه را استفاده کنید.
و در حال حاضر که من ضربه N یک بار، من فقط می توانید وارد کنید برای حفظ آینده ضربه
به جای نیاز به ضربه را وارد کنید N، N را وارد کنید، N را وارد کنید.
به نظر می رسد مثل من در برخی از انواع حلقه که در خصوص آرایه های [i] تا 0، هستم.
به نظر می رسد مثل من شکستن هرگز از این حلقه for.
اگر من نسخه قابل چاپ، بنابراین من 2 است، پس از آن من به آینده است.
من، من، من 3، چاپ و سپس من به آینده.
من من و چاپ من 3 است. بعد، چاپ من، من 4 است.
در واقع، چاپ sizeof (آرایه ای)، به طوری که اندازه آرایه 20 است.
اما به نظر می رسد که برخی از فرمان GDB خاص برای رفتن تا زمانی که چیزی اتفاق می افتد وجود دارد.
آن را مانند تنظیم وضعیت در مقدار متغیر است. اما من به یاد داشته باشید که آنچه در آن است.
بنابراین اگر ما در حفظ و رفتن -
شما را چه می گفتند؟ چه چیزی شما را؟
[دانشجو] نمایش اضافه کنم - >> آره. بنابراین من می تواند کمک به نمایش داده می شود.
اگر ما فقط من نمایش داده شود، آن را قرار داده است تا چه مقدار از من است
بنابراین من لازم نیست که آن را چاپ کردن در هر زمان.
اگر ما فقط رفتن بعدی، ما می بینیم 0، 1، 2، 3، 4، 5، 0، 1، 2، 3، 4، 5، 0، 1، 2، 3، 4، 5.
چیزی است سخت در اشتباه است، و من تا 0، تنظیم مجدد.
به دنبال در buggy4.c، ما می بینیم که اتفاق می افتد این است آرایه از نوع int [5]؛
برای (من = 0؛ من <= sizeof (آرایه ای)، من + +)
آرایه های [i] = 0؛
چه ما می بینیم که در اینجا اشتباه است؟
به عنوان یک اشاره، زمانی که من انجام شده بود GDB buggy4 - اجازه را می شکند اصلی، اجرا -
من چاپ sizeof (آرایه ای) تا فقط ببینیم چه وضعیتی است که در آن من در نهایت باید شکستن.
من کجا هستم؟ آیا من را اجرا می کند؟
من اعلام نشده است.
بنابراین sizeof (آرایه ای) و چاپ است که در 20،
است که انتظار می رود از آرایه من از سایز 5 و از 5 عدد صحیح است،
تمام چیزی که باید 5 * sizeof (هوشمند) کلمه در ادامه متن، که در آن sizeof (هوشمند) تمایل به 4 است.
بنابراین sizeof (آرایه ای) 20 می باشد.
چه باید باشد؟
[دانشجو] توسط sizeof (بین المللی) تقسیم شده است. >> آره، / sizeof (بین المللی).
به نظر می رسد هنوز هم وجود دارد یک مشکل در اینجا است. من فکر می کنم این فقط باید <
از آن تقریبا همیشه <و <هرگز.
در حال حاضر فکر می کنم در مورد اینکه چرا این در واقع شکسته شد.
آیا کسی حدس بزند چرا من تا 0، از طریق هر تکرار از حلقه تنظیم مجدد؟
تنها چیزی که در داخل است که در اینجا اتفاق می افتد این است که آرایه های [i] است که به 0 است.
تا حدودی، این خط از کد است که باعث بین المللی خود می رود من می شود تا 0، تنظیم شده است.
[دانشجو] آیا به این دلیل آن را برجسته حافظه از این بخش از من
هنگامی که به آن فکر می کند آن را به عنصر بعدی آرایه؟ >> [Bowden] بله.
هنگامی که ما در حال فراتر رفتن از آرایه های ما،
به نحوی که فضای است که ما در حال برجسته برجسته ارزش من.
و به این ترتیب اگر ما به buggy4 نگاه کنید، شکست اصلی، اجرا،
اجازه دهید چاپ آدرس من.
به نظر می رسد مانند آن را bffff124.
حالا نسخه قابل چاپ آدرس آرایه [0]. 110.
چه در مورد [1] 114.
[2] 118.
11C، 120. آرایه [5] bfff124 است.
بنابراین آرایه [5] همان نشانی است که من، که بدان معنی است که آرایه [5] است که من.
اگر آنها را به همان آدرس، آنها همین.
بنابراین، هنگامی که ما مجموعه آرایه [5] تا 0،، ما، من تنظیم از 0.
و اگر شما در این مورد فکر می کنم در شرایط استفاده از پشته
من بین المللی اعلام شده است، که به معنی من می شود برخی از فضای در پشته.
سپس آرایه [5] به خود اختصاص داده، به طوری که پس از آن 20 بایت در پشته اختصاص داده شده است.
بنابراین من می شود اختصاص داده شده، و سپس این 20 بایت دریافت اختصاص داده شده است.
بنابراین من درست قبل از آرایه اتفاق می افتد،
و چون از راه، مثل من گفت: هفته گذشته، که در آن از لحاظ فنی پشته پایین رشد می کند،
هنگامی که شما به یک آرایه اول، ما تضمین شده است که موقعیت 0 در آرایه
همیشه اتفاق می افتد قبل از مقام اول در آرایه.
این نوع چگونه من آن را کشید هفته گذشته است.
توجه کنید که در پایین آدرس 0 و در بالای صفحه، ما حداکثر آدرس.
پشته است که همیشه در حال رشد کردن.
اجازه دهید بگویم من در اختصاص می دهیم.
تخصیص صحیح من، که بدان معنی است اجازه دهید فقط می گویند تا اینجا صحیح من می شود اختصاص داده شده است.
سپس آرایه 5 عدد صحیح، که بدان معنی است که که در زیر به ما اختصاص،
از پشته در حال رشد است، کسانی که 5 عدد صحیح دریافت اختصاص داده است.
اما از آنجا که از چگونگی آرایه ها کار می کنند، ما تضمین شده است که مقام اول در آرایه
همیشه آدرس کمتر از چیزی که در آرایه.
بنابراین آرایه 0 موقعیت همیشه برای اولین بار در حافظه اتفاق می افتد،
در حالی که موقعیت آرایه 1 پس از آن اتفاق می افتد
و جایگاه آرایه 2 به بعد از آن اتفاق می افتد،
که بدان معنی است که آرایه 0 موقعیت در جایی اتفاق می افتد را در اینجا،
موقعیت آرایه 1 به بالا که اتفاق می افتد
چرا که در حال حرکت کردن به این معنی است آدرس بالاتر از آدرس حداکثر تا اینجا.
بنابراین آرایه [0] پایین در اینجا، آرایه [1] تا اینجا، آرایه [2] تا اینجا، آرایه [3] تا اینجا.
توجه کنید که چگونه قبل از من تمام راه را تا اینجا به ما اختصاص داده شده عدد صحیح،
همانطور که ما حرکت می کند بیشتر و بیشتر به آرایه ما، ما در حال گرفتن نزدیک و نزدیکتر به عدد صحیح خود می رود من است.
این فقط اتفاق می افتد که آرایه [5]، که یکی از موقعیت فراتر از آرایه ما
دقیقا همان جایی که عدد صحیح به طور اتفاقی به اختصاص داده شود.
به طوری که نقطه ای که در آن ما اتفاق می افتد را به هدف قرار دادن فضا بر روی پشته
که برای عدد صحیح من اختصاص داده شده بود، و ما در حال تنظیم است که تا 0.
>> این است که چگونه است که کار می کند. پرسش و پاسخ؟ آره.
[دانشجو] هرگز ذهن. باشه.
[دانشجو] چگونه می توانم به این نوع از خطاها اجتناب می کنید؟
این نوع از خطاها؟ آیا C به عنوان یک زبان برنامه نویسی خود استفاده نمی کنند.
استفاده از یک زبان است که دارای چک کننده مرزهای آرایه.
تا زمانی که شما مراقب باشید، شما فقط نیاز به جلوگیری از رفتن گذشته از مرزهای آرایه شما.
[دانشجوی] بنابراین در اینجا زمانی که ما گذشته از مرزهای آرایه خود را رفت -
[Bowden که در آن همه چیز شروع می شود اشتباه است. >> [دانشجو] اوه، درست است.
تا زمانی که شما در حافظه اختصاص داده شده به آرایه خود را داشته باشید، خوب شما.
اما C هیچ نشانی از چک کردن خطا است. اگر من آرایه [1000]، آن را کمال مسرت از هر آنچه اتفاق می افتد را تغییر دهید -
به ابتدای آرایه می رود، پس از آن می رود 1000 موقعیت پس از کند و آن را به 0.
هیچ چک کردن که آه، این واقعا نیست که 1000 همه چیز در آن نمی کنند.
1000 است فراتر از چیزی است که من باید در حال تغییر،
در حالی که جاوا یا چیزی شما آرایه ای از گرفتن شاخص مرزهای
یا شاخص از استثنا مرزهای.
به همین دلیل بسیاری از زبان های سطح بالاتر، این چیزها
که در آن اگر شما فراتر از مرزهای آرایه، شما قادر
به طوری که شما می توانید همه چیز را از زیر شما را تغییر نمی دهد
و پس از آن همه چیز خیلی بدتر از فقط یک استثنا
گفت که شما را فراتر از انتهای آرایه رفت.
[دانشجو] و بنابراین باید ما به تازگی تغییر کرده <= فقط به <؟ >> [Bowden] آره.
باید <sizeof (آرایه ای) / sizeof (هوشمند)؛
از sizeof (آرایه ای) 20 است، اما ما فقط می خواهید 5. >> [دانشجو] درست است.
بیشتر است؟ باشه.
>> [دانشجو] من یک سوال. >> آره.
[دانشجوی] متغیر آرایه واقعی چیست؟
[Bowden] مانند آنچه در آرایه؟
آرایه ی خود یک نماد است.
فقط آدرس شروع از 20 بایت است که ما در حال ارجاع است.
شما می توانید از آن به عنوان یک اشاره گر فکر می کنم، اما از آن است که یک اشاره گر ثابت است.
به محض این که اوضاع وارد شده، آرایه متغیر وجود ندارد.
[دانشجو] پس چگونه اندازه آرایه آن را پیدا کنم؟
اندازه آرایه اشاره به اندازه آن بلوک که که نماد اشاره به.
هنگامی که من انجام کاری مانند printf ("٪ P \ N"، آرایه)؛
اجازه دهید آن را اجرا کنید.
چه من فقط اشتباه کردم؟
'آرایه آرایه اعلام کرد.
آه، تا در اینجا.
صدای جرنگ جرنگ باهوش است، و آن اتفاق می افتد توجه کنید که من اعلام کرد که مجموعه ای به عنوان 5 عنصر
اما من به نمایه سازی را به سمت 1000.
این می تواند که از آنجا که این فقط ثابت انجام دهید.
این فقط می تواند تا کنون در توجه به این که من قصد دارم فراتر از مرزهای آرایه برو.
اما توجه کنید قبل از زمانی که ما تا به حال من نادرست باشد،
احتمالا نمی تواند تعیین کنید که چگونه بسیاری از ارزش های من را در،
پس از آن نمی تواند تعیین کند که من فراتر از انتهای آرایه خواهد بود.
که فقط صدای جرنگ جرنگ باهوش بودن.
>> اما در حال حاضر buggy4 کند. پس چه چیز دیگری کار من اشتباه است؟
به طور ضمنی اعلام کرد تابع کتابخانه printf '.
من قصد دارم به # .
باشه. حال حاضر در حال اجرا buggy4.
چاپ مقدار از آرایه مثل من در اینجا، چاپ آن را به عنوان یک اشاره گر
چیزی چاپ است که به نظر می رسد شبیه به این - bfb8805c - است که برخی از آدرس
که در منطقه پشته پذیری است.
آرایه ی خود مانند یک اشاره گر است، اما آن است که یک اشاره گر واقعی نیست،
ما می توانیم از یک اشاره گر به طور منظم تغییر می کند.
آرایه تنها برخی ثابت است. 20 بلوک از حافظه شروع 0xbfb8805c آدرس.
بنابراین bfb8805c از طریق این آدرس +20- یا من حدس می زنم -20 -
همه از حافظه اختصاص داده شده برای این آرایه است.
آرایه، متغیر خود ذخیره شده است به جایی نمی.
هنگامی که شما در حال کامپایل، کامپایلر - موج دست در آن -
اما کامپایلر فقط می خواهد که در آن می داند که آرایه را به استفاده کنید.
این می داند که در آن است که آرایه شروع می شود،
و پس از آن همیشه می توانید فقط چیز در شرایط استفاده از جبران از آن ابتدا انجام دهید.
این کار یک متغیر خود را برای نشان دادن به آرایه نیاز نیست.
اما وقتی که من چیزی برای مثال، int * p = آرایه در حال حاضر P یک اشاره گر است که اشاره به آن آرایه می باشد.
و در حال حاضر P واقع در پشته وجود دارد.
من آزاد به تغییر P. من می توانم p = malloc انجام دهد.
پس از آن ابتدا به آرایه اشاره کرد، در حال حاضر آن را به برخی از فضای پشته اشاره است.
من می توانم آرایه = malloc انجام نیست.
اگر صدای جرنگ جرنگ باهوش است، آن را در من حق کردن خفاش داد.
در واقع، من کاملا مطمئنم که شورای همکاری خلیج فارس که این بیش از حد انجام دهد.
بنابراین نوع آرایه از نوع int [5] "است قابل تخصیص نیست.
شما می توانید چیزی را به یک نوع آرایه را مشخص نمی کند
به دلیل آرایه ثابت است.
این یک نماد است که مراجع آن 20 بایت است. من می توانم آن را تغییر دهید.
>> [دانشجو] و در جایی که اندازه آرایه ذخیره می شود؟
[Bowden] آن ذخیره می شود به جایی نمی. هنگامی که آن را تدوین است.
تا جایی که به اندازه آرایه ذخیره می شود؟
شما فقط می توانید sizeof (آرایه ای) در داخل تابعی که آرایه ای خود را اعلام کرد استفاده کنید.
بنابراین اگر من برخی از تابع، صنایع غذایی، و من انجام می دهم (آرایه از نوع int [])
printf ("٪ D \ N"، sizeof (آرایه ای))؛
و سپس در اینجا من اسمش صنایع غذایی (آرایه ای)؛
در داخل این تابع - اجازه دهید آن را اجرا کنید.
این صدای جرنگ جرنگ باهوش بودن دوباره است.
این به من گفتن که sizeof در پارامتر تابع آرایه
اندازه * بین المللی 'بازگشت.
این خطا خواهد بود اگر آن چیزی است که من می خواستم به اتفاق می افتد.
اجازه دهید در واقع خاموش Werror.
هشدار. هشدارها خوب است.
هنوز هم تا زمانی تدوین آن را به عنوان یک هشدار است.
a.out / چاپ 4.
هشدار که تولید یک شاخص واضح و روشن از آنچه رفت را اشتباه است.
این آرایه از نوع int است فقط به چاپ sizeof (هوشمند) می باشد.
حتی اگر من آرایه [5] در اینجا قرار دهید، آن را هنوز هم به چاپ sizeof (هوشمند).
بنابراین به عنوان به زودی به عنوان آن را به شما منتقل می کند را به یک تابع، تمایز بین آرایه ها و اشاره گرها
است وجود ندارد.
این اتفاق می افتد به عنوان یک آرایه که در پشته اعلام شد،
اما به محض این که ما منتقل می کند که ارزش، که 0xbf، اه، اه، اه، به این تابع،
سپس این اشاره گر به اشاره به آن آرایه را بر روی پشته.
به طوری که بدان معنی است که sizeof تنها در تابعی که آرایه اعلام شد شامل،
به این معنی که هنگامی که شما در حال جمع آوری این تابع،
وقتی که صدای جرنگ جرنگ می رود از طریق این تابع، آن را می بیند آرایه یک آرایه از نوع int است از حجم 5.
پس از آن می بیند sizeof (آرایه ای) می باشد. خوب، که 20 است.
که در واقع sizeof اساسا برای تقریبا همه موارد کار می کند.
Sizeof یک تابع نیست، این اپراتور است.
شما تابع sizeof را صدا نمی زنم.
Sizeof (هوشمند)، کامپایلر خواهد شد که تا 4 را ترجمه کنید.
فهمیدی؟ باشه.
>> [دانشجو] پس چه تفاوت بین sizeof (آرایه ای) در اصلی و در صنایع غذایی است؟
دلیل این است که ما در حال گفت sizeof (آرایه ای) است، که از نوع int *،
در حالی که آرایه را در اینجا نمی باشد از نوع int *، آن را به یک آرایه از نوع int است.
>> [دانشجو] بنابراین اگر شما پارامتر در آرایه [] به جای آرایه از نوع int *،
که بدان معنی است که شما هنوز هم می تواند تغییر آرایه چرا که در حال حاضر آن را در یک اشاره گر؟
[Bowden] مثل این؟ >> [دانشجو] آره. آرایه شما به تغییر در درون تابع در حال حاضر؟
[Bowden] شما می توانید مجموعه ای در هر دو مورد را تغییر دهید.
در هر دو این موارد، شما آزاد هستید برای گفتن آرایه [4] = 0.
[دانشجو] اما می تواند نقطه آرایه شما را به چیز دیگری؟
[Bowden: اوه. آره. در هر دو مورد - >> [دانشجو] آره.
[Bowden] تفاوت بین آرایه [] و یک آرایه از نوع int *، هیچ است وجود دارد.
شما همچنین می توانید برخی از آرایه های چند بعدی را از اینجا دریافت کنید
برای برخی از نحو مناسب است، اما هنوز فقط یک اشاره گر است.
این به این معنی است که من آزاد برای انجام آرایه = malloc (sizeof (INT))، و در حال حاضر نقطه در جایی دیگر است.
اما فقط دوست دارم که چگونه این کار برای همیشه و همیشه،
تغییر این آرایه با ساخت آن به چیز دیگری اشاره
این آرایه را تغییر نمی کردن اینجا به دلیل آن را یک کپی از این استدلال،
یک اشاره گر به آن استدلال نیست.
و در واقع، فقط به عنوان نشانه ای است که آن را دقیقا همان -
ما در حال حاضر شاهد چاپ چاپ آرایه -
چه می شود اگر ما از آرایه چاپ آدرس و یا به آدرس آدرس آرایه
به هر کدام از این؟
بیایید چشم پوشی از این یکی.
باشه. این خوب است. در حال حاضر در حال اجرا / a.out.
آرایه چاپ، پس از چاپ آدرس از آرایه، همین.
آرایه وجود ندارد.
این می داند که هنگامی که شما در حال چاپ آرایه، شما در حال چاپ نماد است که اشاره به آن 20 بایت است.
چاپ آدرس از آرایه، آرایه می کند وجود ندارد.
آن را نشانی از آدرس ندارد، بنابراین آن را به چاپ آدرس آن 20 بایت است.
به محض این که شما کامپایل کردن، در buggy4 وارد شده خود را می خواهم. / a.out،
آرایه وجود ندارد.
اشاره گرها وجود دارد. آرایه نمی کنند.
بلوک های حافظه به نمایندگی از آرایه هنوز هم وجود دارد،
اما آرایه متغیر و متغیر از این نوع وجود ندارد.
کسانی مثل تفاوت های اصلی بین آرایه ها و اشاره گرها
به محض اینکه شما را فراخوانی تابع است، تفاوت وجود دارد.
اما در داخل تابعی که آرایه ی خود اعلام کرد، sizeof کار می کند متفاوت
از شما چاپ اندازه از بلوک به جای آن از اندازه از نوع،
و شما می توانید آن را تغییر دهید، زیرا این یک نماد است.
چاپ چیز و آدرس از چیزی چاپ همین.
که تقریبا آن را.
[دانشجو] که می تواند یک بار دیگر به شما می گویند؟
من ممکن است از دست رفته چیزی.
آرایه چاپ و آدرس آرایه چاپ همان چیزی است،
در حالی که اگر شما نسخه قابل چاپ یک اشاره گر در مقابل آدرس از اشاره گر،
یک چیز چاپ آدرس از آنچه شما اشاره به
چاپ آدرس اشاره گر را بر روی پشته است.
شما می توانید یک اشاره گر را تغییر دهید، شما می توانید یک نماد آرایه را تغییر نمی دهد.
و اشاره گر sizeof برای چاپ اندازه از نوع اشاره گر است که.
بنابراین اعضای هیات * P sizeof (p) به چاپ 4،
اما اعضای هیات آرایه [5] چاپ sizeof (آرایه ای) به چاپ 20.
[دانشجو] بنابراین اعضای هیات آرایه [5] از 20 نسخه قابل چاپ؟ >> بله.
به همین دلیل در داخل buggy4 زمانی که از آن استفاده می شود sizeof (آرایه ای)
این انجام شده بود <20، که همان چیزی است که ما می خواستیم.
ما می خواهیم من <5. >> [دانشجو] باشه.
[Bowden] و پس از آن به محض اینکه شما شروع به عبور در توابع،
اگر ما از نوع int * p = آرایه؛
در داخل این تابع، ما اساسا می تواند فسفر و آرایه دقیقا در همان راه استفاده کنید،
به جز مشکل sizeof و مشکل در حال تغییر است.
اما P [0] = 1؛ همان است که گفت: آرایه [0] = 1؛
و به محض این که ما می گویند صنایع غذایی (آرایه ای) صنایع غذایی (p)؛
در داخل تابع صنایع غذایی، این تماس دو برابر است.
تفاوت بین این دو تماس وجود دارد.
>> هر کس که در آن خوب است؟ باشه.
ما 10 دقیقه است.
>> ما سعی خواهیم کرد تا از طریق این برنامه هکر Typer،
این وب سایت، که سال گذشته و یا چیزی بیرون آمد.
این فقط تصور می شود مانند شما نوع به صورت تصادفی و چاپ -
هر فایل آن اتفاق می افتد که به لود شده همان چیزی است که به نظر می رسد که شما در حال تایپ کردن است.
مثل نوعی از کد سیستم عامل به نظر می رسد.
این چیزی است که ما می خواهیم برای به اجرا درآوردن.
شما باید اجرایی باینری به نام hacker_typer
طول می کشد که تنها یک آرگومان، فایل را به "نوع هکر است."
در حال اجرا اجرایی باید صفحه نمایش روشن
و پس از آن چاپ یکی از شخصیت ها از فایل در گذشته هر بار که کاربر فشار یک کلید.
بنابراین هر کلید را فشار می دهید، آن را دور باید پرتاب و به جای چاپ یک کاراکتر از فایل
که این استدلال است.
من بسیار به شما بگویم چه چیزهایی که ما در حال رفتن به نیاز به دانستن هستند.
اما ما می خواهیم به اتمام کتابخانه termios.
من در تمام عمر من، این کتابخانه استفاده می شود هرگز، به طوری که آن را تا به اهداف بسیار ناچیز است.
اما این است که برای رفتن به کتابخانه ما می توانیم با استفاده از به دور انداختن شخصیت شما ضربه
هنگامی که شما در حال تایپ کردن را به استاندارد وارد
بنابراین hacker_typer.c، و ما در حال رفتن به خواهید به # .
با نگاه کردن به مرد برای termios - I'm ترمینال حدس زدن آن OS و یا چیزی -
من نمی دانم چگونه به آن را بخوانید.
با نگاه کردن به این، آن را می گوید به این 2 فایل، پس ما به سراغ انجام این کار است.
>> اولین چیزی که برای اولین بار، ما می خواهیم را در تنها یک آرگومان است، که فایل ما باید باز.
بنابراین چه چیزی من می خواهم کاری انجام دهید؟ چگونه می توانم چک کنید من از تنها یک آرگومان؟
[دانشجوی] اگر argc برابر است. >> [Bowden] آره.
بنابراین اگر (argc = 2!) printf ("استفاده شده: درصد [برای باز کردن فایل]").
بنابراین در حال حاضر اگر من این کار را بدون ارائه یک آرگومان دوم اجرا - آه، من نیاز به خط جدید -
خواهید دید آن را می گوید استفاده از: / hacker_typer
و پس از آن آرگومان دوم باید فایل من می خواهم برای باز کردن.
حالا چه کار کنم؟
من می خواهم از این فایل به عنوان خوانده شده. چگونه می توانم از یک فایل به عنوان خوانده شده؟
[دانشجو] شما آن را باز کنید اول است. >> آره.
بنابراین fopen. چه fopen شبیه؟
[دانشجو] نام فایل. >> [Bowden] فایل در حال رفتن به ی argv [1].
[دانشجو] و پس از آن چیزی که شما می خواهید با آن انجام دهید، به طوری که - >> [Bowden] آره.
بنابراین اگر شما به یاد داشته باشید، شما می توانید fopen مرد تنها،
جایی که برای رفتن به مسیر توایع * کاراکتر است که در آن مسیر نام فایل
* حالت ثابت کاراکتر باشد.
اگر شما اتفاق می افتد به یاد داشته باشید چه حالت است، پس از آن شما می توانید برای حالت نگاه کنید.
داخل صفحات man، شخصیت بریده بریده چیزی است که شما می توانید استفاده کنید برای چیزهایی است.
بنابراین من نوع / حالت جستجو برای حالت.
N و N همان چیزی است که شما می توانید به چرخه را از طریق جستجو در بازی ها استفاده کنید.
در اینجا به آن می گوید: استدلال به حالت رشته ای
با شروع با یکی از توالی زیر است.
بنابراین تحقیق، باز کردن فایل متنی برای خواندن. این چیزی است که ما می خواهیم انجام دهیم.
برای خواندن، و من می خواهم برای ذخیره آن.
چیزی است که برای رفتن به یک فایل *. حالا چه من می خواهم به انجام این کار؟
یک لحظه هم به من بده.
باشه. حالا چه من می خواهم به انجام این کار؟
[دانشجو] بررسی کنید اگر آن را NULL است. >> [Bowden] آره.
هر زمانی که شما برای باز کردن یک فایل، مطمئن شوید که شما با موفقیت قادر به آن را باز کنید.
>> در حال حاضر من می خواهم به انجام این کار چیزهای termios جایی که من می خواهم به خواندن تنظیمات من
و صرفه جویی در آن را به چیزی، پس از آن من می خواهم به تغییر تنظیمات من
به دور انداختن هر شخصیت که من تایپ،
و پس از آن من می خواهم برای به روز رسانی این تنظیمات می پردازیم.
و سپس در پایان این برنامه، من می خواهم به تغییر برگشت به تنظیمات اصلی من است.
بنابراین ساختار termios نوع، و من می خواهم دو نفر از آنها.
یکی از اولین بار است برای رفتن به current_settings من،
و پس از آن که آنها در حال رفتن به hacker_settings من.
اول، من قصد دارم که می خواهید برای ذخیره تنظیمات فعلی من،
پس از آن من می خواهم برای به روز رسانی hacker_settings،
و پس از آن راه در پایان برنامه من، من می خواهم به برگرداندن به تنظیمات فعلی است.
بنابراین صرفه جویی در تنظیمات فعلی، راه است که کار می کند، ما termios مرد.
ما می بینیم که در حال حاضر این tcsetattr هوشمند، اعضای هیات tcgetattr.
من در یک ساختار termios با اشاره گر خود را منتقل می کند.
راه نگاه خواهد کرد - I've در حال حاضر فراموش شده چه تابع نامیده می شد.
کپی و چسباندن آن است.
پس tcgetattr، پس از آن من می خواهم به تصویب در ساختار که من ذخیره اطلاعات در،
است که برای رفتن به current_settings،
و استدلال برای اولین بار فایل را برای توصیف چیزی که من می خواهم برای نجات از ویژگی های می باشد.
توصیفگر فایل مانند هر زمانی که شما برای باز کردن یک فایل، آن را می شود یک توصیفگر فایل.
وقتی که من fopen ی argv [1]، این می شود یک توصیفگر فایل که شما در حال ارجاع
هر زمان که شما می خواهید به خواندن و یا نوشتن آن.
این فایل توصیف من می خواهم به استفاده از نیست.
سه فایل شما به طور پیش فرض وجود دارد،
که استاندارد می باشند، از استاندارد، خطای استاندارد.
به طور پیش فرض، من فکر می کنم آن استاندارد است 0، از استاندارد است 1، و 2 خطای استاندارد است.
بنابراین آنچه که من می خواهم به تغییر تنظیمات؟
من می خواهم به تغییر تنظیمات هر زمان که من یک شخصیت،
من می خواهم آن را به پرتاب است که شخصیت را به جای چاپ آن به روی صفحه نمایش.
چه جریان - استاندارد، از استاندارد، خطای استاندارد -
پاسخ به چیزهایی که زمانی که من در صفحه کلید تایپ؟ >> [دانشجوی] استاندارد وارد >> آره.
پس من هم می تواند 0 یا انجام من می تواند STDIN انجام.
من current_settings استاندارد وارد
>> در حال حاضر من می خواهم برای به روز رسانی این تنظیمات،
بنابراین در ابتدا من به hacker_settings آنچه current_settings من را کپی کنید.
و چگونه کار ساختمانها است آن را فقط کپی کنید.
این کپی همه زمینه ها، به عنوان انتظار می رود.
>> در حال حاضر من می خواهم برای به روز رسانی برخی از زمینه ها.
نگاهی به termios، شما می توانید از طریق بسیاری از این به عنوان خوانده شده
فقط برای دیدن آنچه که شما می خواهید به دنبال،
اما پرچم شما می خواهید به دنبال اکو
به طوری که پژواک پژواک کاراکتر ورودی است.
در ابتدا من می خواهم به مجموعه - I've در حال حاضر فراموش شده چه زمینه هستند.
این همان چیزی است که ساختار به نظر می رسد مانند.
بنابراین نوع ورودی من فکر می کنم ما می خواهیم را تغییر دهید.
ما به راه حل نگاه کنید تا مطمئن شوید که این چیزی است که ما می خواهیم به تغییر شده است.
ما می خواهیم برای تغییر lflag به منظور جلوگیری از نیاز به از طریق تمام این نگاه.
ما می خواهیم برای تغییر حالت های محلی.
شما می توانید از طریق این کل چیزی که به درک که در آن همه چیز به آن تعلق دارد به عنوان خوانده شده
که ما می خواهیم را تغییر دهید.
اما آن را در داخل از حالت محلی که در آن ما در حال رفتن به می خواهید به تغییر آن.
بنابراین hacker_settings.cc_lmode همان چیزی است که آن را به نام.
c_lflag.
این جایی است که ما به اپراتورهای بیتی می باشد.
ما نوع از زمان است، اما ما را از طریق آن سریع واقعی.
این جایی است که ما به اپراتورهای بیتی،
جایی که من فکر می کنم من یک مدت طولانی قبل گفت که هر زمان که شما شروع به خرید و فروش با پرچم،
شما با استفاده از عملگر بیتی خیلی.
هر بیت در پرچم مربوط به نوعی از رفتار است.
بنابراین در اینجا، این پرچم دارای یک دسته از اشیای مختلف، که همه آنها را به معنای چیزی متفاوت است.
اما آنچه من می خواهم به انجام آن فقط خاموش بیتی که مربوط به اکو.
بنابراین به نوبه خود که خاموش من = ¬ ECHO.
در واقع، من فکر می کنم آن را مانند tECHO و یا چیزی است. من فقط رفتن را دوباره چک کنید.
من می توانم آن را termios. این فقط اکو.
ECHO است برای رفتن به یک بیت است.
¬ ECHO در حال رفتن به معنی همه بیت به 1 تنظیم شده باشد، به این معنی است که تمامی پرچم ها درست تنظیم
به جز بیت ECHO.
پایان دادن پرچم های محلی من با این، به این معنی تمام پرچم است که در حال حاضر به True را
هنوز هم درست تنظیم شود.
اگر پرچم ECHO من درست تعیین می کنند، سپس این لزوما تنظیم به بر روی پرچم ECHO مقدار false.
بنابراین این خط از کد خاموش پرچم ECHO.
خط از کد، من فقط آنها را در زمان به نفع و کپی کنید و سپس توضیح می دهد آنها.
در محلول، او گفت: 0.
این احتمالا بهتر است به صراحت می گویند STDIN.
>> توجه داشته باشید که من هم انجام ECHO | ICANON اینجا.
ICANON اشاره به چیزی جداگانه، که به معنی حالت متعارف.
چه معنی حالت متعارف است که معمولا هنگامی که شما در حال تایپ کردن از خط فرمان،
استاندارد در هر چیزی را پردازش کند تا زمانی که شما ضربه خط جدید است.
بنابراین، هنگامی که شما GetString، شما نوع یک دسته از چیزها، و سپس شما ضربه خط جدید.
که زمانی که آن را به این استاندارد فرستاده شد وارد
که به طور پیش فرض است.
وقتی که من خاموش کردن حالت متعارف، در حال حاضر هر کاراکتر را فشار می دهید
همان چیزی است که پردازش می شود، که معمولا نوع بد است چرا آن را به روند کند این چیزها،
به همین دلیل است که آن را خوب به آن را به خطوط کل بافر.
اما من می خواهم هر یک از شخصیت به پردازش
از آنجا که من نمی خواهم آن را به صبر برای من به آمار خط جدید
قبل از آن پردازش تمام شخصیت های من تایپ شده است.
این تبدیل کردن حالت متعارف است.
این مسائل فقط به این معنی که هنگامی که آن را در واقع پردازش شخصیت های.
این به این معنی است که پردازش آنها را فورا و به محض این که من آنها را تایپ، پردازش آنها.
و این تابع است که به روز رسانی تنظیمات استاندارد است.
و وسایل TCSA در حال حاضر آن را انجام دهد.
گزینه های دیگر صبر کنید تا همه چیز است که در حال حاضر در جریان است پردازش شده است.
است که واقعا مهم نیست.
در حال حاضر تغییر تنظیمات من به آنچه در حال حاضر در hacker_typer_settings.
من حدس می زنم من نام آن را hacker_settings، بنابراین تغییر آن بگذارید.
تغییر همه چیز را به hacker_settings.
>> در حال حاضر در پایان از برنامه های ما در حال رفتن به خواهید به برگرداندن
به آنچه که در حال حاضر در داخل normal_settings،
است که به فقط مانند و normal_settings نگاه.
توجه داشته باشید که هر یک از normal_settings من از زمان قرار گرفتن تغییر نکرده است.
سپس به آنها را تغییر دهید، و پس از من به آنها منتقل می کند، در پایان.
این به روز رسانی شد. باشه.
>> در حال حاضر در داخل از اینجا من فقط کد در منافع زمان را توضیح دهد.
این که کد بسیار نیست.
ما می بینیم که یک کاراکتر از فایل خوانده می کنیم. ما آن را به نام F.
در حال حاضر شما می توانید مرد fgetc، اما چگونه fgetc در حال رفتن به محل کار
فقط آن را برای بازگشت به کاراکتر است که شما فقط به خواندن و یا EOF،
که مربوط به پایان فایل ها و یا برخی از خطا اتفاق می افتد.
ما به حلقه، در ادامه به خواندن یک کاراکتر از فایل،
ایم تا از شخصیت های اجرا شده را بخوانید.
و در حالی که ما در حال انجام این کار، ما تنها بر روی یک شخصیت از استاندارد وارد صبر کنید
هر بار تنها شما چیزی را در خط فرمان تایپ کنید،
که خواندن یک کاراکتر از استاندارد وارد
سپس putchar فقط رفتن برای قرار دادن کاراکتر می خوانیم تا از فایل را به خارج از استاندارد است.
شما می توانید مرد putchar، اما آن را فقط به استاندارد قرار دادن، آن را چاپ می کند که شخصیت.
شما همچنین می توانید فقط printf انجام (٪ C، C)، همان ایده است.
که رفتن را به انجام بخش عمده ای از کار ما.
>> آخرین چیزی که ما در حال رفتن به می خواهید برای انجام شده است فقط fclose فایل ما.
اگر شما fclose نیست، که نشت حافظه است.
ما می خواهیم به fclose فایل ما در اصل باز کرد، و من فکر می کنم که آن را.
اگر ما را که، من در حال حاضر مشکل است.
اجازه دهید را ببینید.
چه آن شکایت در مورد؟
انتظار می رود 'بین المللی' اما استدلال از نوع ساختار _IO_FILE *.
ما را مشاهده می کنید در صورتی که با این نسخهها کار.
فقط در C99 مجاز می باشد. Augh. خوب، hacker_typer.
در حال حاضر ما دریافت توضیحات بیشتر مفید است.
پس از شناسه اعلام نشده "normal_settings استفاده کنید.
من را صدا نمی زنم normal_settings. من نام آن را current_settings.
بنابراین تغییر همه از آن اجازه دهید.
در حال حاضر بحث عبور.
من این 0 برای.
باشه. / hacker_typer cp.c.
من هم از صفحه نمایش در ابتدا مشخص نیست.
اما شما می توانید به عقب نگاه به مجموعه مشکل تاریخ و زمان آخرین برای دیدن صفحه نمایش شما روشن است.
این فقط در چاپ برخی از شخصیت های
در حالی که این در حال انجام آنچه که من می خواهم به انجام.
باشه.
و فکر کردن در مورد اینکه چرا این مورد نیاز به 0 به جای STDIN،
که باید # 0 تعریف،
این شاکی است که -
قبل از وقتی که من گفتم که فایل وجود دارد اما بعد از آن همچنین شما می توانید فایل خود را،
یک توصیفگر فایل فقط یک عدد صحیح است،
در حالی که فایل * دارای یک دسته از مسائل در ارتباط با آن است.
به این دلیل که ما نیاز به گفتن نیست 0 به جای STDIN
این است که STDIN * فایل است که اشاره به چیزی است که ارجاع توصیفگر فایل 0 است.
بنابراین حتی زمانی که من fopen (ی argv [1]، من گرفتن یک فایل *.
اما در جایی که در فایل * چیزی که مربوط به توصیف گر فایل ها برای آن فایل است.
اگر شما در صفحه مرد باز نگاه کنید، بنابراین من فکر می کنم شما باید به مرد 3 - نه -
مرد 2 باز - آره.
اگر شما در صفحه باز نگاه کنید، باز مانند fopen سطح پایین،
و آن را بازگشت فایل توصیف واقعی است.
fopen کند یک دسته از مسائل در بالا باز،
که به جای بازگشت که فقط توصیف گر فایل را برمی گرداند کل یک فایل اشاره گر *
در داخل است که فایل ما کمی توصیف.
بنابراین استاندارد در اشاره به چیزی FILE *،
در حالی که 0 اشاره به استاندارد فایل توصیف را در خود می شود.
>> پرسش و پاسخ؟
[می خندد] که از طریق منفجر.
بسیار خوب. ما در حال انجام شده است. [می خندد]
>> [CS50.TV]