[Powered by Google Translate] [بخش 5: کمتر راحت] [مقابله Hardison، دانشگاه هاروارد] [این CS50.] [CS50.TV] خوش آمدید، بچه ها. خوش آمدید به بخش 5. در این مرحله، پس از مسابقه 0 و داشتن دیده می شود که چگونه شما انجام داده ام، امیدوارم شما احساس واقعا خوب است چون من بسیار تحت تاثیر نمرات در این بخش شده است. برای مخاطبان آنلاین ما، ما تا به حال چند سوال در مورد تاریخ و زمان آخرین دو در مجموعه ای مشکل - و یا در مسابقه، و نه. بنابراین ما قصد داریم تا بیش از کسانی که واقعا به سرعت به طوری که همه را می بیند چه اتفاقی افتاده است و چگونه از طریق راه حل واقعی و نه فقط مشاهده راه حل خود برود. ما قصد داریم تا بیش از دو گذشته از مشکلات واقعا به سرعت، 32 و 33. فقط، دوباره، به طوری که بینندگان آنلاین می توانید این را ببینید. اگر شما به مشکل خود را به 32، است که در صفحه 13 به نوبه خود، 13 نفر از 16، مشکل 32 همه چیز در مورد معاوضه. همه چیز در مورد مبادله دو عدد صحیح بود. این مشکل این است که ما بیش از چند بار در سخنرانی رفته است. و در اینجا، چیزی است که ما درخواست شما را به انجام ردیابی حافظه سریع است. به پر کردن ارزشهای متغیرهای آنها بر روی پشته در به عنوان کد می رود از طریق این تابع swap. به طور خاص، چیزی است که ما به دنبال آن هستید - I'm رفتن به قرار دادن این اپل - به طور خاص، آنچه ما به دنبال این خط شماره 6 حق در اینجا. و 6 فقط برای مجاورت با مشکل قبلی شماره. چیزی که ما می خواهیم انجام دهیم این است که به صفحه نمایش و یا برچسب دولت از حافظه به عنوان آن را در آن زمان وقتی است که ما در اجرای این خط 6، است که به طور موثر بازگشت از تابع swap ما به حق در اینجا. اگر ما حرکت به پایین در اینجا، ما دیدم که آدرس همه چیز را در حافظه برای ما فراهم شد. این بسیار کلیدی است و ما باید آن را در یک لحظه. و پس از آن را در اینجا در پایین، ما تا به حال یک نمودار حافظه کمی که ما در حال رفتن به مراجعه به. من در واقع انجام این بر روی iPad من. بنابراین من قصد دارم به طور متناوب به عقب و جلو بین iPad و این کد فقط برای مرجع. شروع میکنم. اول، اجازه تمرکز بر روی زن و شوهر برای اولین بار از خطوط اصلی حق در اینجا. برای شروع، ما قصد داریم به مقداردهی اولیه X 1 و Y تا 2. بنابراین ما باید دو متغیر عدد صحیح، هر دوی آنها را در پشته قرار داده شده است. ما قصد داریم برای قرار دادن 1 و 2 در آنها. بنابراین اگر من تلنگر به iPad من، امیدوارم، اجازه دهید را ببینید - اپل TV معکوس، وجود دارد و ما به. باشه. بنابراین اگر من تلنگر به iPad، من می خواهم به مقداردهی اولیه X 1 و Y تا 2. ما که کاملا به سادگی با نوشتن 1 در جعبه مشخص شده X و (2) در جعبه Y مشخص شده اند. نسبتا ساده است. بنابراین در حال حاضر اجازه بازگشت به لپ تاپ، ببینید چه اتفاقی می افتد. بنابراین این خط بعدی می باشد که در آن همه چیز از روی حیله و تزویر. ما عبور به آدرس X و آدرس Y را به عنوان پارامتر A و B به تابع swap. آدرس X و آدرس Y ها چیزهایی هستند که ما نمی توانیم محاسبه بدون مراجعه به این گلوله اشاره سمت راست پایین در اینجا. و خوشبختانه، این دو اولین نقاط گلوله به ما بگویید که دقیقا چه پاسخ است. آدرس x را در حافظه 10 است و آدرس Y در حافظه 14. بنابراین کسانی که ارزش هایی که دریافت به عنوان منتقل می شود A و B تا بالا در تابع swap ما. تا دوباره، سوئیچینگ برگشت به نمودار ما، من می توانم در 10 ارسال و 14 در ب. در حال حاضر، این نکته است که در آن ما با ادامه مبادله است. بنابراین کوه در می رم دوباره به لپ تاپ، ما می بینیم که راه مبادله کار می کند این است که من dereference و ذخیره نتیجه در TMP است. بنابراین اپراتور dereference می گوید، "هی. درمان محتویات متغیر را به عنوان یک آدرس است. برو به هر چه که در آن آدرس های ذخیره شده، و بار آن را. " آنچه شما بار از متغیر به متغیر TMP ما ذخیره شده است. کوه در می رم به iPad است. اگر ما به آدرس 10، ما می دانیم که آدرس 10 X varible از آنجا که ما با نقطه گلوله ما این است که آدرس x را در حافظه 10 گفته شد. بنابراین ما وجود دارد می توانید بروید، بدست آوردن مقدار از آن را، که 1 است، همانطور که ما بر روی iPad را مشاهده کنید. و بار که به TMP است. باز هم، این محتویات نهایی نمی باشد. ما قصد داریم تا از طریق راه رفتن، و ما را به حالت نهایی خود را از این برنامه در پایان. اما در حال حاضر، در حال حاضر ارزش 1 ذخیره شده در TMP است. و یک سوال سریع در اینجا وجود دارد. [اسکندر] dereference اپراتور - که فقط حق ستاره در مقابل متغیر؟ >> بله. بنابراین اپراتور dereference، همانطور که ما تلنگر برگشت به لپ تاپ خود را یک بار دیگر، این ستاره درست در مقابل است. در این معنا، آن است - آن را در تقابل شما را با استفاده از عملگر ضرب که نیاز به دو چیز؛ اپراتور dereference یک عملگر یگانی است. فقط به یک ارزش اعمال به عنوان مخالف به اپراتور باینری، که در آن شما را به دو مقدار مختلف اعمال می شود. بنابراین این چیزی است که اتفاق می افتد در این خط است. بارگذاری ارزش 1 و آن را به ما متغیر عدد صحیح به طور موقت ذخیره می شود. خط بعدی، ذخیره محتویات B به - یا، نه، ما این مطالب است که B اشاره به مکانی که در آن با اشاره به. اگر ما در این تجزیه و تحلیل را از راست به چپ، ما می رویم به B dereference، ما می خواهیم برای رسیدگی به 14، ما می رویم به گرفتن عدد صحیح است که وجود دارد، و پس از آن ما می خواهیم برای رفتن به آدرس 10، و ما در حال رفتن به نتیجه dereference ما از B که به فضا پرتاب. کوه در می رم به iPad، که در آن ما می توانیم این است که یک کمی بیشتر بتن، ممکن است اگر اعداد در تمام آدرس را اینجا بنویسید. بنابراین ما می دانیم که در y، ما در آدرس 14، x در آدرس 10. هنگامی که ما در B شروع، ما dereference B، ما در حال رفتن به گرفتن ارزش 2. ما می رویم به گرفتن این مقدار به دلیل است که ارزش زندگی می کند که در آدرس 14. و ما قصد داریم آن را به متغیر زندگی می کند که در آدرس 10 قرار داده است، است که سمت راست وجود دارد، مربوط به متغیر x است. بنابراین ما می توانیم کمی از جای نوشتن در اینجا که در آن ما خلاص شدن از شر، از مجموع 1 ما و به جای آن 2 ما نوشتن. بنابراین همه به خوبی و خوب در جهان است، حتی اگر X رونویسی در حال حاضر. ما ارزش قدیمی X در متغیر TMP ما ذخیره می شود. بنابراین ما می توانیم مبادله با خط بعدی کامل است. کوه در می رم برگشت به لپ تاپ خود را. در حال حاضر همه که باقی می ماند این است که محتویات متغیر عدد صحیح موقت ما و آنها را ذخیره را به متغیر زندگی می کند که در آدرس است که B برگزاری است. بنابراین ما در حال رفتن به B dereference به طور موثر برای دسترسی به متغیر است که در آدرس که B در آن نگه می دارد، و ما در حال رفتن به چیزهای مقدار که TMP است برگزاری به آن است. کوه در می رم بازگشت به اپل یک بار دیگر. من می توانم این مقدار در اینجا پاک کردن، 2، و به جای آن ما حق خواهیم داشت 1 را در آن کپی کنید. سپس خط بعدی اجرا، که البته - اگر ما تلنگر به لپ تاپ - این 6 نقطه است، است که در نقطه ای که ما می خواستیم به نمودار ما به طور کامل پر کردن. بنابراین کوه در می رم بازگشت به اپل یک بار دیگر، فقط، بنابراین شما می توانید نمودار تکمیل شده را مشاهده کنید، شما می توانید ببینید که در حال حاضر در 10، 14 در B، 1 در TMP، 2 X و 1 در Y است. آیا هر گونه سوال در مورد این وجود دارد؟ آیا این را حس داشتن را از طریق آن راه می رفت؟ ایجاد حس کمتر؟ امیدوارم. باشه. اشاره گرها یک موضوع بسیار مشکل است. یکی از بچه ها که ما با آنها کار می کنیم تا به یک ضرب المثل بسیار معمول است: "برای درک اشاره گر، برای بار اول شما باید اشاره گر. درک" که من فکر می کنم بسیار درست است. این کار را در حالی که برای رسیدن به آن استفاده می شود. طراحی تعداد زیادی از تصاویر، نقاشی بسیاری از نمودارهای حافظه مثل این یکی بسیار مفید است، و پس از آن شما را از طریق مثال بعد از به عنوان مثال پس از مثال راه رفتن، شروع آن را به معنای کمی بیشتر و کمی بیشتر حس و کمی بیشتر حس. در نهایت، یک روز، شما باید آن را به طور کامل تسلط. هر گونه سؤال قبل از ما حرکت به مشکل بعدی؟ بسیار خوب. بنابراین برگشت به لپ تاپ تلنگر. مشکل بعدی که ما داریم مشکل شماره 33 در فایل I / O. بزرگنمایی در این بیت کمی است. مسئله 33 - بله؟ [دانیال] من فقط یک سوال سریع. این ستاره یا ستاره، آن را به نام غیر مرجع زمانی که شما با استفاده از یک ستاره قبل از. آن چه به نام وقتی که شما با استفاده از علامت "قبل از؟ >> علامت قبل از آدرس اپراتور است. بنابراین حرکت به بالا و. متأسفم. من در حالت زوم، بنابراین من واقعا نمی تواند اسکرول هستم. اگر ما به این کد نگاه کنید واقعا به سرعت در اینجا دوباره، همان چیزی که اتفاق می افتد. اگر ما به این کد نگاه حق در اینجا، در این خط که در آن ما را تماس به مبادله، این علامت فقط گفت: "بدست آوردن آدرس که در آن زندگی متغیر x است." هنگامی که کامپایلر شما کد خود را کامپایل، آن است که در واقع از لحاظ فیزیکی علامت از یک محل در حافظه برای همه از متغیرهای خود را به زندگی می کنند. و بنابراین، آنچه پس از آن کامپایلر می تواند یک بار در آن وارد شده همه چیز را انجام دهید، آن را می داند، "اوه، من X در آدرس 10 قرار داده است. من Y در آدرس 14 قرار داده است." پس از آن می توانید در این مقادیر برای شما را پر کنید. بنابراین بعد از آن شما می توانید - آن را می توانید پس از این و با تصویب و Y و همچنین منتقل می کند. این بچه ها را دریافت کنید، اما آنها همچنین، هنگامی که شما آنها را به تصویب به تابع swap، این اطلاعات مربوط به نوع، این نوع int * حق در اینجا، می گوید کامپایلر، "خوب، ما در حال رفتن به تفسیر این آدرس به عنوان آدرس یک متغیر عدد صحیح است." به عنوان یک آدرس از نوع int، که از آدرس یک متغیر شخصیت متفاوت است زیرا یک نوع int طول می کشد تا بر روی یک ماشین 32 بیتی، طول می کشد تا 4 بایت فضا، در حالی که یک شخصیت تنها طول می کشد 1 بایت از فضا. پس از آن مهم است که بدانیم چه شده است - چه زندگی می کند، چه نوع ارزش زندگی در آدرسی که در آن منتقل می کردم و یا آدرس است که شما با خرید و فروش. به این ترتیب، شما می دانید که چگونه بسیاری از بایت از اطلاعات در واقع بار از RAM شما. و پس از آن، بله، این اپراتور dereference، مثل شما می پرسم، می رود و دسترسی به اطلاعات را در یک آدرس خاص. بنابراین آن را می گوید، با این متغیر در اینجا، درمان محتویات یک به عنوان یک آدرس رفتن به این آدرس، بیرون بکشد و به داخل پردازنده، بار، بار را به ثبت نام ارزشهای واقعی و یا محتویات که در آن آدرس زندگی می کنند. هر گونه سؤال؟ این پرسش خوبی است. بسیاری از اصطلاحات جدید بیش از حد باشد. همچنین این نوع از بد بو، دیدن و و * در مکان های مختلف است. بسیار خوب. پس برگشت به مشکل 33، فایل I / O. این یکی از آن دسته از مشکلاتی که من فکر می کنم یک زن و شوهر از چیزهایی که اتفاق افتاده بود. یکی، آن یک موضوع نسبتا جدید است. خیلی زود قبل از مسابقه ارائه شد، و پس از آن من فکر می کنم این نوع مانند یکی از مشکلات کلمه کسانی که در ریاضی جایی که آنها به شما مقدار زیادی از اطلاعات را بدهد، اما شما در واقع پایان ندارد تا نیاز به استفاده از یک تن از آن. اولین بخش از این مشکل است برای توصیف یک فایل CSV است. در حال حاضر، یک فایل CSV، با توجه به توضیحات، یک فایل با کاما جدا ارزش است. این دلیل در همه جالب هستند، و به همین دلیل شما همیشه از آنها استفاده کنید، است، چرا که چند نفر از شما تا به حال استفاده از چیزهای مانند اکسل؟ شکل بسیاری از شما، احتمالا، خواهد شد و یا در برخی از نقطه در زندگی خود استفاده کنید. شما چیزی شبیه به اکسل استفاده کنید. به منظور دریافت داده ها از صفحه گسترده اکسل و یا انجام هر نوع پردازش آن، اگر شما می خواهید برای نوشتن یک برنامه C یا برنامه های پایتون، برنامه های جاوا، برای مقابله با داده های شما در آن وجود دارد ذخیره می شود، یکی از رایج ترین راه به آن را دریافت کند در یک فایل CSV است. و شما می توانید باز کردن اکسل و هنگامی که شما را به گفت و گو "به عنوان ذخیره"، شما می توانید از یک فایل CSV واقعی است. دستی می دانم که چگونه به مقابله با این چیزها. راه کار این است که آن را شبیه به - منظور من، آن را اساسا تقلید از یک صفحه گسترده (spreadsheet)، که در آن، به عنوان ما می بینیم که در اینجا، در این قطعه بسیار چپ ترین، همه ما به نام آخرین. بنابراین ما باید مالان، سپس Hardison، و پس از آن Bowden، MacWilliam، و پس از آن چان است. آخرین نام. و بعد یک کاما از هم جدا نام های گذشته از اولین نام است. دیوید، مقابله، راب، تامی، و Zamyla. من همیشه مخلوط رابی و تام. و سپس، در نهایت، ستون سوم آدرس ایمیل است. هنگامی که شما را در درک آن، باقی مانده از این برنامه نسبتا ساده برای به اجرا درآوردن است. آنچه که ما انجام داده ایم به منظور تقلید این ساختار در برنامه C این است که ما با استفاده از یک ساختار است. ما شروع به بازی کردن با این کمی نیز هست. ما آنها را برای اولین بار در کمی مشکل مجموعه 3، زمانی که ما با فرهنگ خرید و فروش می شد دیدم. اما کارکنان این ساختار ذخیره نام خانوادگی، نام و نام خانوادگی و ایمیل می باشد. فقط مثل فایل CSV ما ذخیره شد. پس این است که فقط از یک فرمت به دیگری تبدیل. ما باید برای تبدیل، در این مورد، یک ساختار پرسنل را در یک خط، یک خط، فقط می خواهم که با کاما از هم جدا شده است. آیا این را حس؟ شما بچه ها داشته اند و تمام مسابقه، بنابراین من تصور شما حداقل تا به حال برخی از زمان را به فکر می کنم در این مورد. استخدام در عملکرد، مشکل می پرسد ما را به در - زوم we'll در این بیت کمی - را در ساختار پرسنل، ساختار کارکنان، با نام، و افزودن محتویات آن به فایل ما staff.csv. به نظر می رسد که این است که نسبتا ساده به استفاده از. ما نوع خواهیم بازی در اطراف با این توابع کمی بیشتر است. اما در این مورد، تابع fprintf واقعا کلیدی است. بنابراین با fprintf، ما می توانیم نسخه قابل چاپ، درست مثل شما بچه ها شده اند با استفاده از printf تمام این مدت. شما می توانید printf یک خط را در یک فایل. بنابراین به جای برقراری تماس printf معمول که در آن شما آن را رشته فرمت و پس از آن همه متغیرها را عوض کنید با استدلال زیر، با fprintf، اولین استدلال خود را به جای فایل شما می خواهید برای نوشتن است. اگر ما در این دستگاه، به عنوان مثال، انسان fprintf، ما می توانیم تفاوت بین printf و fprintf را ببینید. من در اینجا زوم کمی است. بنابراین با printf، ما آن را یک رشته فرمت را، و پس از آن استدلال های بعدی تمام متغیر برای جایگزینی آنها و یا جایگزینی به فرمت رشته ما هستند. در حالی که با fprintf، بحث اول این است که در واقع این فایل به نام جریان است. حال در اینجا به استخدام، ما قبلا فایل * جریان ما برای ما افتتاح شد. این چیزی است که این خط اول می کند، آن باز می شود فایل staff.csv آن را به آن باز می شود در حالت افزودنپرونده، و همه که سمت چپ ما را به انجام ساختار پرسنل را به فایل بنویسید. و بیایید ببینید، من می خواهم به استفاده از اپل؟ من در iPad استفاده کنید. ما خالی - بیایید این کار را بر روی میز، بنابراین من می تواند نوشتن کمی بهتر - از درجه اعتبار ساقط استخدام و آن را در یک آرگومان می گیرد، یک ساختار هیات نامیده میشود. به دست آورده پرانتز ما، ما فایل به نام فایل، ما خط fopen ما که به ما داده شده، و من فقط آن را به عنوان نقطه نوشتن از آن در حال حاضر در pedia. و سپس در خط بعدی ما، ما در حال رفتن به یک تماس به fprintf و ما قصد داریم آن را در فایل منتقل می کند که ما می خواهیم تا در آن چاپ شود، و پس از آن رشته با فرمت ما، که - من به شما اجازه شما بچه ها را به من بگو آنچه در آن مانند به نظر می رسد. چگونه در مورد شما، استلا؟ آیا می دانید اولین بخش از رشته فرمت به نظر می رسد مانند؟ [استلا] من مطمئن نیستم. >> احساس رایگان به درخواست جیمی است. آیا می دانید، جیمی؟ [جیمی] آیا آن را فقط تاریخ و زمان آخرین خواهد بود؟ نمی دانم. من کاملا مطمئن نیست. >> درست است. چگونه در مورد کسی این صحیح در آزمون؟ نه همه حق. به نظر می رسد که همه ما باید انجام دهیم این است که ما می خواهیم هر بخشی از ساختار کارکنان ما می شود به عنوان یک رشته را به فایل ما چاپ شده است. ما فقط رشته کاراکتر جایگزینی استفاده از سه زمان مختلف از آنجا که ما دارای یک نام خانوادگی به دنبال کاما، سپس یک نام اول و پس از آن با کاما از هم، و سپس در نهایت آدرس ایمیل که به دنبال - که نیست اتصالات بر روی صفحه نمایش من است - اما آن را توسط یک کاراکتر خط جدید به دنبال آن است. بنابراین من قصد دارم به نوشتن آن پایین وجود دارد. و سپس پس از رشته فرمت، ما فقط باید تعویض، که ما دسترسی با استفاده از نماد نقطه که ما در مجموعه مشکل 3 را دیدم. ما می توانیم با استفاده از s.last، s.first، و s.email به جای آن سه ارزش را به فرمت رشته ما. پس چگونه است که؟ را حس؟ بله؟ نه؟ احتمالا؟ باشه. آخرین چیزی است که ما انجام می دهیم پس از ایم چاپ شده و پس از ایم باز فایل: هر زمان که ما از یک فایل را باز کرد، ما باید همیشه به یاد داشته باشید به آن نزدیک است. از آنجا که در غیر این صورت ما را به پایان خواهم نشت حافظه، با استفاده از فایل های. پس به آن نزدیک است، که تابع استفاده می کنیم؟ دانیل؟ [دانیال] fclose؟ >> fclose، دقیقا. بنابراین آخرین بخش از این مشکل را به درستی فایل بسته، با استفاده از تابع fclose، که فقط می خواهم که به نظر می رسد. بیش از حد دیوانه نیست. دانلود. به طوری که مشکل 33 در مسابقه. خواهیم فایل قطعا بیشتر I / O بالا آمدن داشته باشد. خواهیم کمی بیشتر در سخنرانی امروز، و یا در بخش امروز زیرا این چیزی است که به شکل فله این pset آینده است. اجازه دهید از مسابقه در این نقطه است. بله؟ [شارلوت]] چرا fclose (پرونده) به جای fclose (staff.csv)؟ >> ه. از آنجا که معلوم است که - بنابراین سوال این است، که یکی از بزرگ همین دلیل است که، هنگامی که ما نوشتن fclose، ما نوشتن fclose (پرونده) متغیر ستاره به عنوان مخالف به نام فایل، staff.csv؟ آیا این درست است؟ آره. پس اجازه دهید نگاهی. اگر من برگشت به لپ تاپ من، و اجازه دهید نگاهی به عملکرد fclose. بنابراین تابع fclose بسته یک جریان است و آن را در اشاره گر به جریان است که ما می خواهیم برای بستن طول می کشد، به عنوان مخالف به نام فایل واقعی است که ما می خواهیم به نزدیک شده است. و دلیل این است که در پشت صحنه، هنگامی که شما را دعوت به fopen، هنگامی که شما یک فایل باز کردن، شما در واقع تخصیص حافظه برای ذخیره اطلاعات مربوط به فایل. بنابراین شما باید اشاره گر فایل است که اطلاعات مربوط به فایل، مانند آن باز است، اندازه آن، که در آن شما در حال حاضر فایل، به طوری که شما می توانید به خواندن و نوشتن تماس به آن محل خاص در درون فایل. شما تا پایان بسته شدن اشاره گر به جای بستن نام فایل. بله؟ [دانیال] لذا به منظور استفاده از استخدام است، به شما می گویند - چگونه ورودی کاربر آن را دریافت کند؟ آیا fprintf را مانند GetString در این معنا عمل می کنند که آن را فقط برای ورودی کاربر صبر کنید و از آنها بخواهید شما را به تایپ - و یا صبر کنید برای شما به نوع این سه چیز را در؟ و یا شما نیاز به استفاده از چیزی به اجرای استخدام؟ >> آره. بنابراین ما نمی - سوال شد، چگونه می توانم ورودی کاربر را دریافت کنید به منظور پیاده سازی استخدام؟ و آنچه ما را در اینجا تماس گیرنده از استخدام است، به تصویب رسید در ساختار پرسنل این کار را با تمام داده های ذخیره شده در ساختار در حال حاضر است. بنابراین fprintf قادر به نوشتن است که داده ها به طور مستقیم به فایل است. بدون انتظار برای ورودی کاربر وجود دارد. این کاربر در حال حاضر ورودی درستی قرار دادن آن در این ساختار کارکنان داده می شود. و همه چیز، البته، می شکستن اگر هر کدام از آن اشاره گر تهی بود، بنابراین ما حرکت به بالا در اینجا و ما در ساختار ما نگاه کنید. در حال حاضر رشته ی گذشته، در رشته اول، ایمیل رشته. ما در حال حاضر می دانیم که همه از کسانی که واقعا در زیر هود، متغیرهای کاراکتر *. که ممکن است یا ممکن است با اشاره به تهی. آنها ممکن است اشاره به حافظه در پشته، شاید حافظه در پشته. ما واقعا نمی دانیم، اما اگر هر یک از این اشاره گر پوچ، یا نامعتبر، که قطعا باید تابع به مشکل استخدام ما. این چیزی است که نوع را فراتر از حوزه امتحان بود. ما در مورد آن نگران کننده نیست. بزرگ است. باشه. پس از مسابقه در حال حرکت است. اجازه دهید نزدیک این مرد، و ما در حال رفتن به در pset 4 نگاه کنید. بنابراین اگر شما بچه ها در تنظیمات pset نگاه، هنگامی که شما می توانید به آن دسترسی داشته باشید، cs50.net/quizzes، ما می رویم به از طریق تعداد کمی از مشکلات بخش امروز. من نوار پیمایش پایین - بخش از سوالات در صفحه سوم از تنظیمات pset آغاز می شود. و بخش اول از شما می خواهد برای رفتن و تماشای کوتاه در هدایت و لوله. که نوع کوتاه سرد بود، به شما نشان می دهد که برخی از کلاهبرداری های جدید، فرمان سرد خط است که شما می توانید استفاده کنید. و پس از آن ما باید چند سوال برای شما نیز هست. این اولین سوال درباره جریان، که printf به طور پیش فرض می نویسد، ما به نوعی در فقط کمی لمس یک لحظه قبل است. این است که ما فقط به بحث در مورد fprintf در یک جریان فایل به عنوان آرگومان آن طول می کشد. fclose طول می کشد در یک فایل * جریان به عنوان خوب، و مقدار بازگشتی fopen به شما می دهد جریان یک فایل *. به این دلیل که ما کسانی که قبل از دیده می شود زمانی که ما با printf برخورد است زیرا printf یک جریان پیش فرض. و جریان به طور پیش فرض است که آن را می نویسد شما می توانید پیدا کردن در کوتاه مدت است. پس قطعا نگاهی به آن است. در بخش امروز، ما قصد داریم به بحث کمی در مورد GDB، از آنجا که آشنایی بیشتر شما با آن هستند، تمرین بیشتر شما را با آن، بهتر می توانند شما به واقع شکار کردن باگ در کد خود را. این سرعت روند اشکال زدایی فوق العاده است. بنابراین با استفاده از printf، هر بار که شما باید انجام دهید که شما را به کامپایل مجدد کد شما، شما باید دوباره آن را اجرا کنید، گاهی اوقات شما باید به حرکت در اطراف تماس printf، اظهار نظر از کد، آن را فقط طول می کشد در حالی که. هدف ما این است که به تلاش برای متقاعد کردن شما که با GDB، شما اساسا می تواند هر چیزی printf در هر نقطه در کد خود را و شما هرگز به آن کامپایل مجدد. شما هرگز برای شروع و نگه داشتن به حدس زدن که در آن به printf بعدی. اولین چیزی که برای انجام شده است به این خط را کپی کنید و کد بخش از وب سایت. من کپی کردن این خط از کد را که می گوید، "http://cdn.cs50.net دستور wget". من قصد دارم آن را کپی کنید. من قصد دارم برای رفتن به دستگاه من، زوم کردن، بنابراین شما می توانید ببینید که چه من انجام می دهند، چسباندن آن را در وجود دارد، و وقتی که من ضربه را وارد کنید، این دستور دستور wget به معنای واقعی کلمه یک وب سایت دریافت کنید. رفتن به جلو و پایین این فایل را از اینترنت، و آن را از رفتن به آن را ذخیره کنید به دایرکتوری جاری. در حال حاضر اگر دایرکتوری جاری من لیست شما می توانید ببینید که من این فایل section5.zip در سمت راست وجود دارد. راهی برای مقابله با آن مرد است که آن را از حالت زیپ خارج، که شما می توانید در خط فرمان انجام دهید، درست مثل این است. Section5.zip. که آن را زیپ لباس را باز کردن، ایجاد پوشه برای من، باد همه از مطالب، آنها را در آنجا قرار داده است. بنابراین در حال حاضر من می توانم به بخش 5 دایرکتوری با استفاده از دستور cd به بروید. پاک کردن صفحه نمایش با استفاده از روشن. بنابراین روی صفحه نمایش روشن است. در حال حاضر من یک ترمینال خوبی تمیز برای مقابله با. حال اگر لیست تمام فایل هایی که من در این پوشه را ببینید، شما می بینید که من در چهار فایل: buggy1، buggy2، buggy3، و buggy4. من هم مربوطه. فایل های خود را در ج. ما قصد داریم در فایل C در حال حاضر نگاه کنید. در عوض، ما قصد داریم به استفاده از آنها زمانی که ما برای باز کردن GDB. ما آنها را نگه داشته در اطراف به طوری که در حال حاضر دسترسی به کد منبع واقعی زمانی که ما در حال استفاده از GDB، اما هدف از این بخش از بخش به سرهم بندی کردن در اطراف با GDB و ببینید که چگونه ما می توانیم آن را به شکل چه خبر اشتباه است با هر یک از این چهار برنامه حشره دار استفاده کنید. بنابراین ما فقط برای رفتن به اطراف اتاق واقعا به سرعت، و من قصد دارم به درخواست از کسی برای اجرای یکی از برنامه های حشره دار، و پس از آن ما را به عنوان یک گروه از طریق GDB بروید، و خواهیم دید که آنچه که ما می توانیم انجام دهیم برای رفع این برنامه ها، و یا به شناسایی حداقل چه خبر اشتباه در هر یک از آنها است. اجازه دهید بیش از شروع در اینجا با دانیل. آیا buggy1 را اجرا می کنید؟ بیایید ببینید که چه اتفاقی می افتد. [دانیال] می گوید: گسل نرم افزار وجود دارد. >> آره. دقیقا. بنابراین اگر من را اجرا buggy1، من خطا SEG. در این نقطه، من می توانم و باز کردن buggy1.c، امتحان کنید و کشف کردن آنچه اشتباه رفتن، اما یکی از نفرت انگیز ترین چیز در مورد این خطا گسل SEG این است که آیا شما را در آنچه از همه چیز برنامه در واقع اشتباه رفت و شکست. شما به نوعی باید به کد نگاه کنید شکل و با استفاده از حدس و بررسی و یا printf تا ببینید که چه اشتباه رفتن. یکی از جالبترین چیزها در مورد GDB این است که آن را واقعا آسان به شکل خط در که قفل برنامه شما. کاملا ارزش آن را به استفاده از آن، حتی اگر فقط برای اون. بنابراین برای راه اندازی GDB، من تایپ GDB، و پس از آن من این مسیر را به اجرایی که من می خواهم به اجرا. در اینجا من تایپ GDB ./buggy1. آمار را وارد کنید. به من می دهد تمام این اطلاعات کپی رایت. و پایین در اینجا شما می توانید این خط را که می گوید، "نمادهای خواندن از / صفحه اصلی / jharvard/section5/buggy1. " و اگر همه به خوبی می رود، خواهید دید آن را چاپ کردن یک پیام است که به نظر می رسد شبیه به این. می خواهیم نمادهای خواندن، آن را خواهم گفت "من خواندن نمادهای از فایل اجرایی خود را،" و سپس آن را به این پیام "انجام شد" را در اینجا داشته باشد. اگر شما بعضی از تغییرات دیگر این است، و یا شما از آن می تواند این نمادها را پیدا کند. یا چیزی شبیه به آن، آنچه را که به معنی این است که شما فقط باید اجرایی شما وارد شده به درستی نمی شده است. هنگامی که برنامه برای استفاده با GDB کامپایل، ما مجبور به استفاده از آن پرچم ویژه-G، که به طور پیش فرض انجام می شود در صورتی که برنامه شما را کامپایل، فقط با تایپ کردن را و یا به آن حشره دار و یا به آن بهبود می یابند، هر یک از آن. اما اگر شما در حال کامپایل دستی با صدای جرنگ جرنگ، و سپس شما باید به در و شامل که G پرچم. در این نقطه، در حال حاضر که در حال حاضر ما GDB اعلان برای اجرای این برنامه آن را بسیار ساده است. ما هم می تواند اجرا شود، نوع و یا ما فقط می تواند نوع R. اکثر دستورات GDB را می توان به صورت مختصر. معمولا برای تنها یک یا حروف زن و شوهر، که خیلی خوب است. سعد، اگر شما با نوع R و ضربه را وارد کنید، چه اتفاقی می افتد؟ [سعد] من SIGSEGV، تقسیم بندی گسل، و پس از آن این همه شر و ور. >> آره. ما در حال دیدن بر روی صفحه نمایش در حال حاضر، و مانند سعد گفت، هنگامی که ما به نوع اجرا و یا تحقیق و آمار را وارد کنید، ما هنوز همان گسل SEG. بنابراین با استفاده از GDB مشکل ما را حل نمی کند. اما آن را به ما می دهد برخی از سخن نامفهوم، و معلوم است که این شر و ور در واقع به ما می گوید که در آن اتفاق می افتد. تجزیه و تحلیل این بیت کمی، این بیت اول تابع که در آن همه چیز اشتباه است. این strcmp_sse4_2 __ وجود دارد، و آن را به ما می گوید که در آن اتفاق می افتد در این فایل نام sysdeps/i386، این همه، دوباره، نوع، از یک ظرف غذا - اما خط 254 است. این نوع تجزیه و تحلیل است. معمولا زمانی که چیزهای مثل این که می بینید، که بدان معنی است که آن را SEG گسلش در یکی از کتابخانه های سیستم. بنابراین چیزی برای انجام با strcmp. شما بچه ها را دیده اند، strcmp قبل. بیش از حد دیوانه نیست، اما آیا این معنی است که strcmp خراب است یا این که یک مشکل با strcmp وجود دارد؟ شما چه فکر میکنید، الکساندر؟ [الکساندر] این است که - 254 خط؟ - نه دودویی است، اما آن را به سقف خود را نه، و پس از آن یکی دیگر از زبان برای هر تابع وجود دارد. این است که 254 نفر در این تابع، یا -؟ >> این خط 254 است. در این فایل به نظر می رسد، پس از آن احتمالا کد اسمبلی. اما من حدس می زنم چیز مبرم تر است، چرا که ما رو بدست گسل SEG، و به نظر می رسد مثل آن که از تابع strcmp، آیا این مفهوم را میرسانند، پس، که strcmp خراب است؟ آن را باید، نه امیدوارم. پس فقط به این دلیل که شما یک خطا تقسیم بندی در یکی از توابع سیستم، به طور معمول که بدان معنی است که شما فقط آن را به نام نه به درستی. سریعترین کاری که به انجام به کشف کردن آنچه که در واقع در جریان هنگامی که شما دیوانه چیزی شبیه به این، هر زمان که شما می بینید یک خطای SEG، به خصوص اگر شما یک برنامه است که با استفاده از بیش از اصلی، به استفاده از backtrace. backtrace خلاصه من با نوشتن BT، به عنوان مخالف به کلمه backtrace کامل. اما شارلوت، چه اتفاقی می افتد وقتی که شما نوع BT و ضربه را وارد کنید؟ [شارلوت] این دو خط، 0 خط و خط 1 را به من نشان می دهد. >> آره. بنابراین خط 0 و خط 1. این قاب پشته واقعی است که در حال حاضر در بازی بودند که برنامه شما سقوط کرد. شروع از بالاترین قاب، قاب 0، و رفتن به پایین ترین است، که قاب 1. بالاترین فریم قاب strcmp است. شما می توانید از این فکر می کنم که مشکل ما فقط در مسابقه با اشاره گر انجام شد، جایی که ما تا به حال تعویض قاب پشته را در بالای قاب پشته اصلی و ما تا به حال از متغیرها است که با استفاده از مبادله در بالای متغیرهای اصلی که با استفاده از. در اینجا سقوط ما اتفاق افتاده، در تابع strcmp ما، که توسط تابع اصلی ما نامیده می شد، و backtrace به ما نه تنها از توابع است که در آن همه چیز شکست خورد، اما آن را نیز به ما می گوید که در آن همه چیز از نامیده می شد. بنابراین اگر من بیش از کمی بیشتر به سمت راست رفته، ما می بینیم که بله، ما در خط 254 این فایل strcmp-sse4.s. اما تماس در buggy1.c، خط 6 ساخته شد. بنابراین این بدان معناست که ما می توانیم انجام دهیم این است - این است که ما فقط می توانید چک کنید و ببینید که آنچه که قرار بود در در buggy1.c، خط 6. دوباره هستند، دو راه برای انجام این کار وجود دارد. یکی این است که خروج از GDB و یا باز کردن کد خود را در یک پنجره دیگر و مرجع متقابل. این، به خودی خود، بسیار مفید است، زیرا در حال حاضر اگر شما در ساعات اداری هستیم و تو خطا SEG و TF خود را در تعجب که در آن همه چیز شکستن، شما تنها می توانید، می گویند: "اوه، خط 6. من نمی دانم چه خبر است، اما چیزی در مورد خط 6 است که باعث برنامه برای شکستن. " راه دیگر برای این کار است، شما می توانید این دستور لیست در GDB نامیده می شود استفاده کنید. شما همچنین می توانید آن را با L مختصر. بنابراین، اگر ما ضربه L، آنچه ما به اینجا برسم؟ ما دسته از مسائل عجیب و غریب است. این کد مونتاژ واقعی است است که در strcmp_sse4_2. این به نظر می رسد نوع بد بو، و به همین دلیل ما این است چرا که در حال حاضر، GDB ما را در فریم 0. تا هر زمان که نگاه می کنیم در متغیرها، هر زمان که ما در کد منبع، ما در حال نگاه کردن به کد منبع است که مربوط به قاب پشته ما در حال حاضر شوید. بنابراین به منظور رسیدن به هر چیزی معنی دار، ما را به حرکت به قاب پشته است که باعث می شود بیشتر حس. در این مورد، قاب اصلی پشته احساس کمی بیشتر را، چرا که در واقع کد که ما نوشت. کد strcmp نشده است. راه شما می توانید بین فریم ها حرکت می کند، در این مورد، از آنجا که ما دو، ما 0 و 1، که با بالا و پایین دستورات شما را انجام دهد. اگر من حرکت یک قاب، در حال حاضر من در قاب پشته اصلی هستم. من می توانم حرکت را برای رفتن به جایی که من، دوباره بالا برود، پایین رفتن دوباره، و دوباره بالا برود. اگر شما تا به حال انجام برنامه های خود را در GDB، شما سقوط، شما backtrace، و شما می بینید که آن را در بعضی از فایل است که شما نمی دانید چه خبر است. شما سعی می کنید به فهرست، کد می کند به نظر نمی آید برای شما آشنا، نگاهی در قاب خود و کشف کردن که در آن شما هستند. شما احتمالا در قاب پشته اشتباه است. یا حداقل شما را در یک قاب پشته است که یکی است که شما واقعا می تواند در اشکال زدایی هستیم. حالا که ما در قاب پشته مناسب هستید، ما را در اصلی هستید، در حال حاضر ما می توانیم فرمان لیست را به شکل چه خط استفاده کنید. و شما می توانید آن را ببینید، آن را برای ما چاپ حق در اینجا. اما ما می توانیم ضربه لیست همه همان، و لیست به ما می دهد این نتیجه چاپی خوبی کد منبع واقعی است که در اینجا. به طور خاص، ما می توانیم در خط 6 نگاه کنید. ما می توانید ببینید چه خبر است در اینجا. و به نظر می رسد که ما در حال ساخت یک مقایسه رشته بین رشته "CS50 سنگ" و ی argv [1]. چیزی در مورد این توفنده. بنابراین دختر خانم، آیا شما هر گونه افکار در مورد آنچه که ممکن است در اینجا؟ دختر خانم من نمی دانم چرا آن را توفنده. >> شما نمی دانم چرا آن را توفنده؟ جیمی، هر گونه افکار؟ [جیمی] من کاملا مطمئن نیست، اما آخرین باری که ما با استفاده از رشته مقایسه، یا strcmp، ما مثل سه مورد مختلف تحت آن بود. ما == را نداشته باشند، من فکر نمی کنم، درست است که در خط اول. در عوض آن را به سه از هم جدا شد، و یک == 0 بود. یکی بود <0، من فکر می کنم، و یک> 0. شاید چیزی که می خواهم؟ >> آره. بنابراین این مسئله وجود دارد از ما انجام مقایسه درستی است؟ استلا؟ هر گونه افکار؟ [استلا] من مطمئن نیستم. >> مطمئن نیستم. دانیل؟ افکار؟ باشه. به نظر می رسد آنچه که اتفاق می افتد در اینجا این است که هنگامی که ما اجرا برنامه و ما گسل SEG، هنگامی که شما به فرار از این برنامه برای اولین بار، دانیل، آیا شما آن را هر استدلال خط فرمان می دهد؟ [دانیال] شماره >> شماره در آن صورت، چه ارزش و argv [1] >> هیچ ارزش وجود دارد. >> راست. خب، هیچ مقدار رشته مناسب وجود دارد. اما برخی از ارزش وجود دارد. چه مقدار است که می شود در آن وجود دارد ذخیره می شود؟ >> ارزش زباله؟ >> یا یک مقدار زباله و یا در این مورد، در پایان از آرایه ی argv است که همیشه با تهی خاتمه یافته است. بنابراین آنچه در واقع ذخیره شده کردم تهی وجود دارد. راه دیگر برای حل این مشکل، به جای فکر کردن آن را از طریق، است که سعی کنید چاپ آن را. این است که من گفته بود که با استفاده از GDB بزرگ است، زیرا شما می توانید نسخه قابل چاپ کردن همه متغیر ها، تمام ارزش هایی که شما می خواهید با استفاده از این فرمان دستی، شیک پوش P. بنابراین اگر من از نوع p و پس از آن مقدار یک متغیر و یا نام یک متغیر نوع، می گویند، argc، من می بینم که argc است 1. اگر من می خواهم به چاپ و argv [0]، من خیلی می توانید انجام دهید فقط می خواهم که. و مانند اره، ی argv [0] همیشه نام برنامه خود را، همیشه نام از اجرایی. در اینجا شما ببینید که آن را به نام مسیر کامل. من نیز می تواند از چاپ و argv [1] و ببینید که چه اتفاقی می افتد. در اینجا ما این نوع از ارزش عرفانی است. ما رو 0x0. به خاطر داشته باشید در آغاز از مدت زمانی که ما در مورد اعداد هگزادسیمال صحبت؟ و یا این سوال کمی در پایان از pset 0 در مورد چگونه به نمایندگی از 50 در سحر و جادو؟ روش نوشتن اعداد هگز در CS، فقط به خودمان اشتباه نمی با اعداد اعشاری، این است که ما همیشه آنها را با 0x ط. بنابراین این پیشوند 0x همیشه فقط به معنای تفسیر به شماره های زیر به عنوان یک عدد هگزادسیمال، نه به عنوان یک رشته، و نه به عنوان یک عدد دهدهی، نه به عنوان یک عدد دودویی است. از آنجا که تعداد 5-0 عدد در مبنای شانزده معتبر است. و این عدد در اعشار، 50. پس این است که چقدر ما disambiguate. بنابراین 0x0 به معنی هگزادسیمال 0، که آن هم دهدهی 0، باینری 0. این فقط 0 ارزش است. به نظر می رسد که این همان چیزی است که تهی است، در واقع، در حافظه است. صفر 0 است. در اینجا، این عنصر در ی argv ذخیره شده [1] تهی است. بنابراین ما در حال تلاش برای مقایسه CS50 سنگ "رشته به یک رشته تهی است. بنابراین غیر مرجع تهی، در تلاش برای دسترسی به همه چیز در تهی، کسانی که به طور معمول به علت برخی از مرتب کردن بر اساس گسل تقسیم بندی و یا سایر چیزهای بد اتفاق می افتد. و معلوم است که strcmp می کند چک برای دیدن یا نه شما در یک مقدار که تهی منتقل می شود. در عوض، آن را فقط پیش می رود، تلاش می کند برای انجام چیزی آن، و اگر آن را SEG گسل، SEG گسل، و آن را به مشکل شما می باشد. شما باید برای تعمیر آن. واقعا به سرعت، چگونه ممکن است این مشکل را حل کنیم؟ شارلوت؟ [شارلوت] شما می توانید استفاده از اگر. بنابراین اگر ی argv [1] تهی است، == 0، و سپس بازگشت 1، یا چیزی [ناخوانا]. >> آره. به طوری که یکی از راه های بسیار خوبی را به انجام آن است، که ما می توانیم چک کنید، ارزش ما در مورد به strcmp منتقل، و argv [1]، است که آن را تهی؟ اگر تهی آن، پس از آن ما می توانیم بگویم خوب، سقط جنین است. روش معمول برای انجام این کار این است که به استفاده از مقدار argc. شما می توانید ببینید که در اینجا در ابتدای اصلی ما حذف شده که آزمون برای اولین بار است که ما به طور معمول هنگامی که ما با استفاده از استدلال خط فرمان، است که برای تست اینکه آیا یا نه مقدار argc ما همان چیزی است که ما انتظار داریم. در این مورد، ما انتظار داریم حداقل دو آرگومان، نام برنامه به همراه یکی دیگر. از آنجا که ما در مورد استفاده از آرگومان دوم در اینجا هستیم. بنابراین با داشتن برخی از مرتب کردن بر اساس آزمون قبل از، قبل از تماس strcmp ما که آزمون یا نه ی argv حداقل 2، همچنین مرتب کردن بر اساس همان چیزی را انجام دهد. ما می توانید ببینید که در صورتی که با اجرای این برنامه دوباره کار می کند. شما همیشه می توانید برنامه های خود را در داخل GDB، که واقعا خوب راه اندازی مجدد. شما می توانید فرار کنی (دور بشی)، و هنگامی که شما را در استدلال به برنامه های خود را منتقل می کند، شما آنها را منتقل می کند در زمانی که با شما تماس اجرا شود، نه زمانی که شما راه اندازی GDB. به این ترتیب شما می توانید به استناد برنامه خود را با استدلال های مختلف در هر زمان است. بنابراین، اجرا و یا باز هم، من می توانم R را تایپ کنید، و اجازه دهید ببینیم که چه اتفاقی می افتد اگر ما را تایپ کنید: "سلام". همیشه به شما اگر شما می خواهید آن را از ابتدا شروع دوباره بپرسید. معمولا، شما می خواهید آن را از ابتدا شروع دوباره. و در این مرحله، آن را ری استارت دوباره آن را، آن را چاپ این برنامه که ما در حال اجرا، buggy1، با این استدلال خوش آمدید، و آن را چاپ از این استاندارد، آن را می گوید، "شما دریافت می کنید D،" چهره غمگین. اما ما گسل SEG نیست. گفت که فرآیند به طور معمول خارج است. به طوری که به نظر می رسد خیلی خوب است. بدون خطا SEG تر، ما ساخته شده از آن گذشته، پس از آن به نظر می رسد که در واقع اشکال گسل SEG که ما گرفتن. متاسفانه، آن را به ما می گوید که ما در حال گرفتن D. ما می توانیم به عقب و نگاه کردن به کد و دیدن آنچه که قرار بود در آنجا بود برای کشف کردن آنچه که بود - چرا از آن به ما می گوید که ما یه D. بیایید ببینید، در اینجا این printf و گفت که شما D. اگر فهرست ما را تایپ کنید، به شما در حفظ و فهرست تایپ کردن، آن را نگه می دارد تکرار را از طریق برنامه خود را، پس از آن شما چند خط اول از برنامه خود را نشان می دهد. سپس آن را به شما خط بعد، و تکه و تکه بعدی را نشان می دهد. و آن را به تلاش برای پایین رفتن. و در حال حاضر ما رو به "خط شماره 16 خارج از محدوده است." زیرا این راه تنها دارای 15 خط است. اگر شما به این نقطه و تعجب خود را، "چه می توانم انجام دهم؟" شما می توانید از دستور راهنما استفاده کنید. استفاده از کمک و پس از آن نام دستور را به آن بدهید. و شما می بینید GDB به ما می دهد این نوع از مسائل است. این گزارش می گوید، "با هیچ استدلال، لیست 10 خط بیشتر یا اطراف فهرست قبلی است. - فهرست فهرست ده خط قبل از - " بنابراین سعی کنید با استفاده از منهای فهرست کنیم. و این لیست 10 خط قبلی، شما می توانید در سراسر بازی با لیست کمی. شما می توانید لیست، لیست را انجام دهد -، شما حتی می توانید لیست را به یک عدد باشد، مانند فهرست 8 و آن را از 10 خط در امتداد خط 8. و شما می توانید ببینید چه خبر است در اینجا شما ساده اگر دیگری. اگر شما در CS50 سنگ تایپ کنید، آن را چاپ A. " در غیر این صورت آن را چاپ "شما دریافت می کنید یک D." شهر چه بدشانسی. بسیار خوب. بله؟ [دانیال] بنابراین، هنگامی که من سعی کردم به انجام CS50 سنگ را بدون نقل قول، می گوید: "شما دریافت می کنید یک D." من نیاز به نقل قول ها برای به دست آوردن آن را به کار، این است که چرا؟ >> آره. به نظر می رسد که زمانی که - این است که یک چیز عالی کمی سرگرم کننده دیگر - هنگامی که برنامه را اجرا می کنید، اگر ما آن را اجرا کنید و ما در CS50 سنگ تایپ، درست مثل دانیل گفت که او انجام داد، و به شما ضربه را وارد کنید. آن را هنوز هم می گوید: D. ما و سوال این است، چرا این؟ و معلوم است که هر دو ترمینال و GDB ما تجزیه این به عنوان دو استدلال جداگانه است. زیرا زمانی که فضا، که به عنوان ضمنی وجود دارد آرگومان اول به پایان رسید، بحث بعدی این است که برای شروع. راه کسانی که به دو ترکیب، یا با عرض پوزش، به یک استدلال، به استفاده از نقل قول است. بنابراین در حال حاضر، اگر ما را در نقل قول ها و دوباره آن را اجرا کنید، A. بنابراین فقط به روکش، بدون نقل قول، CS50 و سنگ به عنوان دو آرگومان جداگانه تجزیه می شود. با نقل قول، آن را به عنوان یک آرگومان به طور کلی تجزیه شده است. ما می توانیم این کار را با یک نقطه انفصال را ببینید. ما تا کنون بوده ام در حال اجرا برنامه های ما، و آن را در حال اجرا تا زمانی که آن را SEG گسل یا آمار بازدید یک خطا یا تا زمانی که از آن خارج شده است و همه چیز کاملا خوب بوده است. این است که لزوما مفید ترین چیز است، زیرا گاهی اوقات شما دارای یک اشکال در برنامه های خود را، اما این یک تقسیم بندی گسل باعث نمی. این برنامه خود را برای متوقف کردن و یا هر چیزی شبیه به آن باعث نمی شود. راه را برای رسیدن GDB به توقف برنامه خود را در یک نقطه خاص برای تنظیم نقطه انفصال است. شما هم می توانید این کار را با قرار دادن یک نقطه انفصال در نام تابع انجام یا شما می توانید یک نقطه انفصال را در یک خط خاص از کد تنظیم کنید. من می خواهم برای تعیین نقاط شکست در نام تابع، به دلیل - آسان برای به یاد داشته باشید، و در واقع اگر شما در داخل و تغییر کد منبع خود را تا یک کمی، سپس نقطه انفصال خود را در واقع در همان محل در داخل کد خود باقی بماند. در حالی که اگر شما با استفاده از شماره خط، شماره خط را تغییر دهید دلیل این که شما اضافه و یا حذف برخی از کد، پس از آن نقاط شکست خود را همه کاملا خراب شده است. یکی از چیزهایی که رایج ترین من انجام می دهم، نقطه انفصال در تابع اصلی است. اغلب من راه اندازی GDB، من ب اصلی، نوع ضربه را وارد کنید که می خواهید یک نقطه انفصال تنظیم در عملکرد اصلی که می گوید، "مکث این برنامه به محض اینکه شما شروع در حال اجرا، و به این ترتیب، زمانی که من برای اجرای برنامه، می گویند، CS50 سنگ به عنوان دو آرگومان و Enter را فشار دهید، آن را به تابع اصلی می شود و آن را در خط اول متوقف می شود، درست قبل از آن را ارزیابی تابع strcmp است. از آنجا که من متوقف شد، در حال حاضر من می توانم شروع به mucking در اطراف و دیدن چه خبر با همه از متغیرهای مختلف که به برنامه منتقل. در اینجا من می توانید نسخه قابل چاپ کردن argc و ببینید چه خبر است. که argc 3 است، به خاطر آن 3 مقادیر مختلف در آن کردم. از این رو نام این برنامه، آن را به استدلال اول و آرگومان دوم رو. ما می توانیم آن را چاپ شده توسط به دنبال در و argv [0] ی argv [1]، و ی argv [2]. بنابراین در حال حاضر شما همچنین می توانید به همین دلیل این فراخوان strcmp رفتن به شکست، چرا که شما می بینید که آن را تقسیم CS50 و سنگ را به دو استدلال جداگانه است. در این مرحله، هنگامی که شما ضربه نقطه انفصال، شما می توانید از طریق برنامه خود را همچنان به گام خط به خط، به عنوان مخالف شروع برنامه خود را دوباره. بنابراین اگر شما نمی خواهید برنامه های خود را به شروع دوباره و فقط در ادامه از اینجا، شما می توانید از فرمان ادامه داده و استفاده از ادامه این برنامه را به پایان اجرا شود. درست مثل آن را انجام داد در اینجا. با این حال، اگر من راه اندازی مجدد برنامه، CS50 سنگ، آن را بازدید نقطه انفصال من دوباره، و در این زمان، اگر من نمی خواهم فقط به تمام راه را از طریق بقیه از برنامه، من می توانم دستور بعدی، که من نیز با N مختصر استفاده کنید. و این کار را از طریق برنامه خط به خط گام. بنابراین شما می توانید به تماشای به عنوان چیزهای اجرا، با تغییر متغیر، به عنوان چیزهایی به روز رسانی شده است. که خیلی خوب است. و چیز دیگری است و نه از تکرار همان دستور بارها و بارها و بارها دوباره، اگر شما فقط ضربه را وارد کنید - در اینجا شما را به من در هر چیزی تایپ - اگر من فقط ضربه را وارد کنید، آن را به دستور قبلی تکرار، و یا دستور GDB قبلی که من فقط قرار داده شوید. من می توانم به ضربه را وارد کنید و آن را قدم به قدم از طریق خط کد من با خط. من شما بچه ها را تشویق به رفتن به چک کردن برنامه حشره دار دیگر را نیز به. ما برای دریافت از طریق تمام آنها امروز در بخش وجود ندارد. کد منبع وجود دارد، بنابراین شما می توانید ببینید چه خبر است در نوع پشت صحنه اگر شما واقعا گیر کرده، اما حداقل، تنها با بوت کردن GDB تمرین، اجرای این برنامه تا زمانی که آن را در تو می شکند، backtrace، بدانند چه عمل تصادف در، چه خط، چاپ کردن برخی از ارزش های متغیر، فقط احساس می کنید، چرا که واقعا کمک خواهد کرد که شما رفتن به جلو است. در این مرحله، ما در حال رفتن به ترک خارج از GDB، که شما با استفاده از ترک و یا فقط س. اگر برنامه خود را در وسط هنوز هم در حال اجرا است، و آن را به خارج نیست، آن را همیشه به شما بپرسید، "آیا شما مطمئن هستید که شما واقعا می خواهید به ترک؟" شما فقط می توانید بله رسید. در حال حاضر ما در حال رفتن به در مشکل بعدی ما این است که برنامه گربه نگاه کنید. اگر شما تماشای کوتاه هدایت و لوله، خواهید دید که تامی با استفاده از این برنامه است که اساسا چاپ تمام خروجی از یک فایل را به روی صفحه نمایش است. بنابراین اگر من را اجرا گربه، این است که در واقع یک برنامه ساخته شده در دستگاه، و اگر شما مکینتاش شما می توانید این کار را بر روی مک خود را بیش از حد، اگر شما در باز کردن ترمینال. و ما - گربه، بیایید می گویند، cp.c، و ضربه را وارد کنید. چه این کار، اگر ما کمی حرکت کنید و ببینید که در آن ما خط را زد، یا جایی که ما فرار فرمان گربه، آن را به معنای واقعی کلمه فقط چاپ محتویات cp.c به صفحه ما. ما می توانیم دوباره آن را اجرا کنید و شما می توانید در چند فایل را با هم. بنابراین شما می تواند cp.c گربه، انجام دهد و سپس ما همچنین می توانیم الحاق فایل cat.c، که برنامه ما در مورد به نوشتن است، و آن را از هر دو فایل های بازگشت چاپ چاپ بازگشت به صفحه ما. بنابراین اگر ما کمی رفته بالا، ما می بینیم که هنگامی که ما به فرار این cp.c گربه، cat.c، برای اولین بار آن را چاپ فایل CP، و سپس در زیر آن، آن را به چاپ فایل cat.c سمت راست پایین در اینجا. ما قصد داریم برای استفاده از این فقط به پای ما مرطوب. بازی در اطراف با چاپ ساده به ترمینال، نگاه کنید که چگونه است که کار می کند. اگر شما بچه ها باز کردن با gedit cat.c، ضربه را وارد کنید، شما می توانید برنامه ای است که ما در مورد به نوشتن هستید را ببینید. ما این ورق دیگ بخار خوب، پس ما لازم نیست که وقت خود را صرف تایپ کردن که از. ما همچنین تعدادی از استدلال گذشت شوید. نسخه قابل چاپ کردن یک پیام استفاده خوب است. این نوع از چیزی که، باز هم، مثل ما شده ایم صحبت کردن در مورد، آن را تقریبا مانند حافظه عضلانی است. فقط برای حفظ انجام مرتب کردن بر اساس همان چیزهای به یاد داشته باشید و همیشه در چاپ برخی از مرتب کردن بر اساس پیام های مفید به طوری که مردم می دانند چگونه برای اجرای برنامه خود را. با گربه، خیلی ساده است، ما فقط رفتن را از طریق تمام استدلال های مختلف که به برنامه ما منتقل شد و ما در حال رفتن به نسخه قابل چاپ مطالب خود را به روی صفحه نمایش در یک زمان. به منظور چاپ فایل ها به خارج را به روی صفحه نمایش، ما قصد داریم برای انجام کاری بسیار شبیه به آنچه که ما در پایان مسابقه بود. در پایان مسابقه، استخدام برنامه، ما تا به حال برای باز کردن یک فایل، و پس از آن ما تا به حال به چاپ آن. در این مورد، ما قصد داریم برای باز کردن یک فایل، و ما در حال رفتن به از آن به جای. آنگاه ما در حال رفتن به چاپ، به جای به یک فایل، ما قصد داریم برای چاپ روی صفحه نمایش. بنابراین چاپ به روی صفحه نمایش شما قبل از همه با printf انجام می شود. به طوری که بیش از حد دیوانه نیست. اما خواندن یک فایل از نوع عجیب و غریب است. ما را از طریق که کمی در یک زمان. اگر شما بچه ها بازگشت به که مشکل آخرین مسابقه خود، مشکل 33، خط اول که ما در حال رفتن به اینجا، باز کردن فایل است، بسیار شبیه به چیزی است که ما همین جا است. بنابراین استلا، آنچه که نگاه می کند خط مانند، هنگامی که ما برای باز کردن یک فایل؟ [استلا] سرمایه * فایل، فایل - >> باشه. >> - برابر با fopen. >> آره. که در این مورد است؟ در نظر است. >> آن را در نظر؟ ی argv [i] و R؟ >> دقیقا. کلیک راست بر روی. بنابراین استلا، کاملا درست است. این همان چیزی است که خط به نظر می رسد مانند. ما در حال رفتن به جریان متغیر یک فایل، ذخیره آن در یک فایل، به طوری که همه کلاه، FILE *، و نام این متغیر خواهد بود فایل. ما می تواند از آن را هر چه ما دوست داریم تماس بگیرید. ما می توانیم آن را first_file، یا file_i، هر آنچه که ما می خواهم. و سپس نام فایل را در خط فرمان به این برنامه تصویب شد. پس از آن در argv ذخیره می شود [،] و پس از آن ما قصد داریم برای باز کردن این فایل در حالت خوانده است. حالا که ما فایل ها رو باز کردم، چیزی که ما باید همیشه به یاد داشته باشید به انجام چه هر زمان که ما یک فایل رو باز کردم؟ نزدیک. بنابراین دختر خانم، چگونه می توانم یک فایل؟ [دختر خانم] fclose (پرونده) >> fclose (پرونده). دقیقا. بزرگ است. باشه. اگر ما در این نگاه به نظر حق در اینجا، آن را می گوید، "باز ی argv [i] و چاپ محتویات آن به STDOUT." خارج از استاندارد یک نام عجیب و غریب است. STDOUT تنها راه ما از گفتن است ما می خواهیم آن را چاپ به ترمینال، ما می خواهیم آن را به جریان خروجی استاندارد چاپ است. ما در واقع می تواند خلاص شدن از شر این نظر گرفتن حق در اینجا. من قصد دارم آن را کپی کنید و آن را از آن چیزی است که ما انجام داد. در این نقطه، در حال حاضر ما باید برای خواندن فایل بیت به بیت. ما بحث زن و شوهر از راه خواندن فایل. که آنهایی که مورد علاقه شما است؟ کدام راه شما دیده می شود و یا آیا شما به یاد داشته باشید، به خواندن فایل ها؟ [دانیال] fread؟ >> fread؟ بنابراین fread یکی است. جیمی، انجام هر گونه دیگران را می شناسید؟ [جیمی] شماره >> خوب است. نه. شارلوت؟ الکساندر؟ از دیگران؟ باشه. آنهایی که دیگر fgetc، یکی است که ما به مقدار زیادی استفاده کنید. نیز وجود دارد fscanf، شما بچه ها یک الگو در اینجا؟ همه آنها با F آغاز خواهد شد. هر چیزی برای انجام با یک فایل. این fread، fgetc، fscanf. این ها همه از توابع خواندن. برای نوشتن ما باید fwrite، ما باید به جای fgetc fputc است. ما همچنین fprintf ما در مسابقه را دیدم. از آنجا که این یک مشکل است که شامل خواندن از یک فایل می باشد، ما قصد داریم به استفاده از یکی از این سه تابع است. ما قصد داریم برای استفاده از این توابع را در اینجا. این توابع در کتابخانه استاندارد I / O در بر داشت. بنابراین اگر شما در ابتدای این برنامه نگاه کنید، شما می توانید ببینید که ما در حال حاضر شامل فایل سرآیند کتابخانه استاندارد I / O است. اگر ما می خواهیم به کشف کردن که ما می خواهیم برای استفاده، ما همیشه می تواند باز کردن صفحات مرد. بنابراین ما می توانیم نوع stdio مرد و خواندن همه ورودی stdio و توابع خروجی در C. و ما در حال حاضر می توانید اوه، نگاه ها را ببینید. این ذکر fgetc، آن را ذکر fputc. بنابراین شما می توانید تمرین کردن کمی و نگاه کردن، می گویند، fgetc و نگاه کردن به صفحه مرد. شما می توانید ببینید که آن را همراه با یک دسته کامل از توابع دیگر می رود: fgetc، fgets، getc، getchar، شود، ungetc، و ورودی خود را از کاراکتر ها و رشته ها. پس این است که چگونه ما در کاراکتر و رشته از فایل ها را از ورودی استاندارد خوانده شده است که در اصل از کاربر است. و این است که چگونه ما آن را انجام دهد در واقع C. بنابراین این GetString و توابع GetChar استفاده نمی که ما از کتابخانه CS50 استفاده می شود. ما قصد داریم تا در یک زن و شوهر از راه های انجام این کار مشکل به طوری که شما می توانید به دو روش مختلف انجام آن را ببینید. هر دو تابع fread که دانیل ذکر و fgetc راه های خوب را به انجام آن هستند. من فکر می کنم fgetc است که کمی آسان تر است، زیرا این راه تنها است، همانطور که می بینید، یک استدلال، * فایل است که ما در حال تلاش برای خواندن کاراکتر از، و مقدار بازگشتی آن از نوع int است. این است که کمی گیج کننده است، درست است؟ از آنجا که ما در حال گرفتن یک شخصیت، بنابراین چرا کاراکتر این بازگشت نه؟ شما بچه ها هر گونه ایده ها که چرا این ممکن است یک کاراکتر را بر نمی گرداند؟ [پاسخ دختر خانم، ناخوانا] >> آره. بنابراین دختر خانم کاملا درست است. اگر آن را ASCII، پس این عدد صحیح می تواند به یک کاراکتر واقعی ترسیم شده است. می تواند یک کاراکتر ASCII است، و درست است. این دقیقا همان چیزی است که اتفاق می افتد. ما با استفاده از یک بین المللی تنها به دلیل آن است بیت. بزرگتر از یک کاراکتر، کاراکتر ما فقط 8 بیت، که 1 بایت ما در ماشین های 32 بیتی است. و بین المللی دارای ارزش هر 4 بایت فضا می باشد. و معلوم است که راه fgetc کار می کند، اگر ما حرکت در پایین خلاصه ما در این صفحه مرد کمی، حرکت تمام راه را به پایین. به نظر می رسد که آنها از این مقدار خاص به نام EOF استفاده می. این یک ثابت خاص به عنوان مقدار بازگشتی از تابع fgetc هر زمان که شما از فایل یا اگر شما یک خطا. و معلوم است که برای انجام این مقایسه با EOF به درستی، شما می خواهید به آن مقدار اضافی از اطلاعات است که شما را در بین المللی به عنوان مخالف به استفاده از یک متغیر کاراکتر است. حتی اگر fgetc به طور موثر یک شخصیت از یک فایل، شما می خواهید برای به یاد داشته باشید که آن چیزی است که از نوع int به شما بازگشته است. همانطور که گفته شد، آن را نسبتا آسان برای استفاده. این به ما یک شخصیت می دهد، بنابراین همه ما باید انجام دهیم این است که نگه داشتن درخواست فایل "من شخصیت بعدی بدهد، شخصیت بعدی را به من بدهید، من شخصیت بعدی بدهد، تا زمانی که ما را به انتهای فایل. و است که در یکی از شخصیت ها را در یک زمان از فایل های ما بکشد، و پس از آن ما می توانیم انجام آنچه که ما با آن را می خواهم. ما می توانیم آن را ذخیره، ما می توانیم آن را به یک رشته اضافه کنید، ما می توانیم آن را چاپ کرده است. آیا هر یک از آن است. زوم به عقب و بازگشت به برنامه cat.c ما، اگر ما قصد استفاده از fgetc، چگونه ممکن است این خط بعد از کدهای رویکرد ما؟ ما قصد داریم تا با استفاده از - fread چیزی کمی متفاوت انجام دهید. و در این زمان، ما فقط قصد استفاده از fgetc یکی از شخصیت ها را در یک زمان. برای پردازش کل فایل، آنچه ممکن است ما باید انجام دهیم؟ در یک فایل چند حرف وجود دارد؟ هستند بسیاری وجود دارد. بنابراین احتمالا شما می خواهید برای دریافت یک و پس از آن دیگر و یکی دیگر و یکی دیگر. چه نوع از الگوریتم آیا شما فکر می کنید ممکن است مجبور به استفاده از؟ چه نوع - [الکساندر] برای حلقه؟ >> دقیقا. برخی از حلقه. برای حلقه است که در واقع بزرگ، در این مورد. و مثل شما می گفتند، آن را برای تلفن های موبایل مانند شما می خواهید یک حلقه بر روی کل فایل، گرفتن یک شخصیت در یک زمان. هر گونه پیشنهادات در مورد آنچه که ممکن است شبیه؟ [الکساندر، ناخوانا] >> خوب، فقط به من بگو در زبان انگلیسی آنچه که شما در حال تلاش برای انجام؟ [الکساندر، ناخوانا] بنابراین در این مورد، آن را برای تلفن های موبایل مثل ما فقط به حلقه بیش از کل فایل در تلاش است. [الکساندر] بنابراین من اندازه از نوع int؟ >> اندازه -؟ من حدس می زنم اندازه فایل، درست است؟ اندازه - we'll فقط آن را مانند این ارسال. اندازه فایل در حال حاضر، من + +. بنابراین معلوم می شود که شما این کار را با استفاده از fgetc، و این جدید است، این است که هیچ راه آسان وجود دارد فقط به اندازه یک فایل با این "sizeof" نوع ساختار که شما را دیده ام قبل از. هنگامی که ما در استفاده از آن تابع fgetc، ما به معرفی برخی از نوع جدید، نحو و بد بو به این حلقه، که در آن به جای استفاده از فقط یک شمارنده پایه برای رفتن به شخصیت، به شخصیت ما در حال رفتن به جلو و یک شخصیت در یک زمان، یک شخصیت در یک زمان، و ما می دانیم که ما در پایان هستید زمانی است که نیست که ما از شمارش تعداد مشخصی از کاراکتر ها، اما هنگامی که شخصیت ما بیرون بکشد این است که پایان خاص از شخصیت فایل. بنابراین ما می توانیم این کار را با انجام - من به این CH، و ما در حال رفتن به آن را مقداردهی اولیه با اولین تماس ما را به شخصیت اول از فایل. بنابراین این بخش حق در اینجا، این است که رفتن به یک کاراکتر از فایل و آن را ذخیره به CH متغیر است. ما قصد داریم برای انجام این کار تا زمانی که ما را به انتهای فایل، که ما آن را توسط تست برای شخصیت که برابر با EOF ویژه که شخصیت انجام دهید. و پس از آن به جای انجام CH + +، که فقط مقدار افزایش، بنابراین اگر ما از یک فایل، پایتخت، می گویند، CH + + به ما ب را، و پس از آن ما می C و سپس D. که به وضوح آنچه ما می خواهیم نیست. آنچه ما می خواهیم در اینجا در این بیت آخر است که ما می خواهیم شخصیت بعدی از فایل. پس چگونه ممکن است شخصیت بعدی از فایل را دریافت کنم؟ چگونه می توانم شخصیت اول از فایل؟ [دانشجو] fgetfile؟ fgetc >>، یا، با عرض پوزش، شما کاملا درست بود. من آن را اشتباه به سمت راست وجود دارد. بنابراین آره. در اینجا به جای انجام CH + +، ما فقط رفتن به تماس fgetc (پرونده) دوباره و ذخیره نتیجه را در متغیر CH ما همان است. [سوال دانشجو، ناخوانا] >> این جایی است که این بچه ها * فایل های ویژه می باشد. راه کار می کنند آنها است - هنگامی که شما برای اولین بار باز کردن - هنگامی که شما برای اولین بار که تماس fopen، * فایل به طور موثر به عنوان یک اشاره گر را به ابتدای فایل می رود. و پس از آن هر زمان که با شما تماس fgetc، آن حرکت می کند یکی از شخصیت ها از طریق فایل. پس هر زمان که با شما تماس، شما در حال افزایش اشاره گر فایل را توسط یکی از شخصیت ها. و زمانی که شما fgetc دوباره، شما در حال حرکت یکی دیگر از شخصیت و یکی دیگر از شخصیت ها و دیگر شخصیت و کاراکتر دیگری. [سوال دانشجو، ناخوانا] >> و that's - آره. این نوع از این سحر و جادو در زیر هود. شما فقط افزایش از طریق نگه دارید. در این مرحله، شما قادر به در واقع با یک شخصیت کار می کنند. پس چگونه ممکن است این را ما چاپ به روی صفحه نمایش، در حال حاضر؟ ما می توانیم چیزی مشابه printf است که ما قبل از استفاده استفاده کنید. ایم که با استفاده از همه ترم. ما printf می توانید تماس بگیرید. و ما می توانیم در شخصیت فقط می خواهم که منتقل می کند. یکی دیگر از راه برای انجام آن است به جای استفاده از printf و نیاز به انجام این رشته با فرمت، ما همچنین می توانیم یکی از توابع دیگر استفاده کنید. ما می توانیم fputc، که چاپ یک کاراکتر را به روی صفحه نمایش استفاده کنید، به جز اگر ما در fputc نگاه - به من اجازه زوم کردن کمی. ما می بینیم چه خوب است آن را در شخصیت طول می کشد که ما با استفاده از fgetc، اما بعد از آن ما باید آن را یک جریان به چاپ می دهد. ما همچنین می توانیم از تابع putchar، که به طور مستقیم قرار داده به خارج از استاندارد استفاده کنید. بنابراین یک دسته از گزینه های مختلف است که ما می توانیم برای چاپ استفاده کنید وجود دارد. همه آنها در کتابخانه استاندارد I / O. هر زمان که شما می خواهید برای چاپ - تا printf، به طور پیش فرض، به ویژه استاندارد جریان چاپ، این است که STDOUT. بنابراین ما فقط می تواند آن را به عنوان نوع از این ارزش سحر و جادو، STDOUT در اینجا مراجعه کنید. متأسفم. قرار دادن نقطه و ویرگول خارج. این یک مقدار زیادی از اطلاعات جدید، بد بو در اینجا است. بسیاری از این بسیار اصطلاحی است، به این معنا است که این کد نوشته شده است که این راه را فقط به خاطر اینکه آن ها را تمیز به خواندن، آسان به خواندن. هستند بسیاری از راه های مختلفی را برای انجام این کار، بسیاری از توابع مختلف وجود دارد که شما می توانید استفاده کنید، اما ما تمایل به پیروی از این الگوها و بیش از بیش. پس آیا می شود جای تعجب نیست اگر می بینید کد بالا آمدن دوباره و دوباره. بسیار خوب. در این مرحله، ما باید برای روز شکستن. با تشکر برای آینده. با تشکر برای تماشای اگر آنلاین هستید. و ما به شما در هفته آینده را ببینید. [CS50.TV]