[Powered by Google Translate] [খণ্ড 5: কম আরামদায়ক] [Nate Hardison, হার্ভার্ড বিশ্ববিদ্যালয়] [এটি CS50.] [CS50.TV] সুতরাং স্বাগত জানাই, বলছি. স্বাগতম অধ্যায় 5. এই সময়ে, না ব্যঙ্গ 0 সম্পন্ন এবং কিভাবে আপনি করেছেন দেখা যায় না, আশা আপনার মনে সত্যিই খুব ভাল, কারণ আমি এই বিভাগে স্কোর দ্বারা প্রভাবিত ছিল. আমাদের অনলাইন দর্শকদের জন্য, আমরা সেই প্রশ্নগুলির একটি দম্পতি ছিল করেছি সম্পর্কে শেষ সমস্যা সেট দুটি সমস্যা - বা ব্যঙ্গ, বরং. তাই আমরা যারা সত্যিই উপর দ্রুত যেতে যাতে সবাই দেখছে তা ঘটেছে চলুন এবং কিভাবে বরং সমাধান নিজেই দেখছেন তুলনায় প্রকৃত সমাধান মধ্য দিয়ে যেতে. আমরা সমস্যার শেষ দম্পতি উপর সত্যিই দ্রুত যেতে যাচ্ছে 32 এবং 33, করছি. ঠিক, আবার, যাতে অনলাইন দর্শকদের এই দেখতে পারেন. আপনি যদি আপনার সমস্যা 32, পৃষ্ঠা 13 যা চালু, 16 13 আউট, সমস্যা সমস্ত 32 অদলবদল হয়. এটা দুই পূর্ণসংখ্যার সোয়াপিং সম্পর্কে সব ছিল. এটা কোন সমস্যা আছে যা আমরা বক্তৃতা মধ্যে বার কয়েক উপর চলে গেছে চাই. এবং এখানে, আমরা কি কি বলার ছিল একটি দ্রুত মেমরি ট্রেস. ভেরিয়েবল এর মান হিসাবে তারা স্ট্যাকের মধ্যে থাকে পূরণ নতুন swap হিসাবে কোড ফাংশন মাধ্যমে যায়. বিশেষ করে, কি আমরা এ খুঁজছেন - I'm এই রহমান দমন করা যাচ্ছে - বিশেষ করে, কি আমরা এ খুঁজছেন সেটি এই লাইন 6 অধিকার এখানে সংখ্যাযুক্ত. এবং এটি আগের সমস্যা শুধু সান্নিধ্য জন্য 6 এর সংখ্যাযুক্ত. আমরা কি করতে চান বা প্রদর্শন মেমরি রাষ্ট্র লেবেল হিসাবে এটি সময়ে যখন আমরা এই লাইন নম্বর 6 চালানো, যা কার্যকরভাবে আমাদের করতে swap ফাংশান থেকে একটি ফিরতি অধিকার এখানে. যদি আমরা এখানে স্ক্রল ডাউন, আমরা দেখেছি যে যা মেমরির মধ্যে সবকিছু ঠিকানাগুলি আমাদের জন্য সরবরাহ করা হয়েছিল. এটি খুবই কী; আমরা তা ফিরে আসবে ঠিক এক মুহূর্ত করব. এবং তারপর নীচে নিচে এখানে, আমরা একটু চিত্রটি মেমরি ছিল যা আমরা নির্দেশ চলুন. আমি আসলে কাজ আছে আমার iPad এ এই আউট. আমি শুধু উল্লেখের জন্য রহমান এবং এই কোড মধ্যে আগে পিছে বিকল্প যাচ্ছি. শুরু করা যাক. প্রথম, যাক প্রধান লাইনের প্রথম দম্পতি এর উপর ডান এখানে ফোকাস. শুরু করার জন্য, আমরা 1 এবং y টিপে x 2 সূচনা চলুন. তাই আমরা দুটি ভেরিয়েবল পূর্ণসংখ্যা আছে, তারা উভয় চলুন যাও স্ট্যাকের উপর স্থাপন করা হবে. আমরা তাদের মধ্যে একটি এবং একটি 1 2 করা চলুন. সুতরাং যদি আমি আমার রহমান মাধ্যমে টুসকি আশা, এবার এর দেখুন - আপেল টিভি মিরর, এবং আমরা সেখানে যান. ঠিক আছে. সুতরাং যদি আমি আমার রহমান মাধ্যমে টুসকি, আমি 1 এবং y টিপে x 2 সূচনা করতে চান. আমরা পছন্দ করি বাক্স x চিহ্নিত একটি 1 লিখে যে বেশ সহজভাবে এবং বাক্সে একটি 2 y চিহ্নিত. মোটামুটি সহজ. তাই এখন এর ল্যাপটপ ফিরে যাওয়া দেখতে, পরবর্তীতে কি ঘটবে. তাই এই পরের লাইন যেখানে জিনিসপত্র পেতে চতুর. আমরা পরামিতি হিসাবে x এর ঠিকানা এবং y এর ঠিকানা পাস একটি swap ফাংশন এবং খ. x এবং y এর ঠিকানা ঠিকানা হল যে আমরা গণনা করতে পারেন নির্দেশকারী এইসব বুলেট যাও ছাড়া স্থানটিকে এখানে ডান ডাউন. এবং ভাগ্যক্রমে, প্রথম দুটি বুলেট পয়েন্ট আমাদের বলতে ঠিক কি উত্তর আছে. x এর মধ্যে মেমরি ঠিকানা 10, এবং y এর মেমরি ঠিকানা হল 14. সুতরাং যারা হয় মান হিসাবে পাশ করতে এবং a ও b আমাদের করতে swap রূপে আপ উপরে. তাই আবার, আমাদের চিত্রটি পাল্টাবার ফিরে যাও, আমি একটি মধ্যে একটি 10 ​​লিখতে পারেন বো এবং একটি 14. এখন, এই পয়েন্ট হয় যেখানে আমরা swap 'র সাথে এগিয়ে যান. তাই ল্যাপটপ আলোকসম্পাতের আবার ফিরে, আমরা দেখতে যে ভাবে কাজ করতে swap হল আমি প্রথম dereference একটি দোকান এবং tmp ফলাফল. সুতরাং dereference অপারেটর বলে, "আরে. একটি ঠিকানা হিসাবে একটি পরিবর্তনশীল বিষয়বস্তু ব্যবহার করুন. যাই হোক না কেন যে ঠিকানা এ সংরক্ষিত হয় যান, এবং এটি লোড করা. " আপনি কি ভেরিয়েবলের আউট লোড আমাদের tmp পরিবর্তনশীল মধ্যে সংরক্ষিত হবে না. রহমান আলোকসম্পাতের ফিরে যাও. যদি আমরা 10 মোকাবেলার যান, আমরা জানি যে ঠিকানা হল 10 x varible কারণ আমরা আমাদের বুলেট পয়েন্ট যে x মেমরির মধ্যে ঠিকানা হল 10 দ্বারা বলা হয়েছিল. তাই সেখানে আমরা, যাব মান, যা 1 পেতে পারেন হিসাবে আমরা আমাদের iPad-এ দেখুন, যে tmp মধ্যে লোড করে. আবার, এই চূড়ান্ত বিষয়বস্তু নয়. আমরা ভিতর দিয়ে হেটে যেতে যাচ্ছি এবং আমরা আমাদের প্রোগ্রাম চূড়ান্ত অবস্থায় শেষে পাবেন করছি. কিন্তু এখন নয়, আমরা মান 1 tmp সঞ্চিত আছে. এবং এখানে একটি উপর দ্রুত প্রশ্ন আছে. [আলেকজান্ডার] এটা dereference অপারেটর - যে শুধু পরিবর্তনশীল সামনে তারকা ডান? >> হ্যাঁ. সুতরাং dereference অপারেটর, হিসাবে আমরা আমাদের ল্যাপটপ ফিরে টুসকি আবার, এই মুহুর্তে সামনে এই তারকা. যে অর্থে, এটা - আপনি গুণ অপারেটর সঙ্গে এটি বিপরীতে যা দুটি জিনিস প্রয়োজন; dereference অপারেটর একটি ইউনারী অপারেটর. একটি মান প্রয়োগ শুধু একটি বাইনারি অপারেটর থেকে ভিন্ন, যেখানে আপনি দুটি বিভিন্ন মান প্রয়োগ করুন. সুতরাং যে এই লাইনে কি. আমরা মান 1 লোড এবং আমাদের অস্থায়ী পূর্ণসংখ্যা পরিবর্তনশীল মধ্যে এটি সংরক্ষণ করা হয়. পরের লাইন, আমরা মধ্যে বো বিষয়বস্তু সঞ্চয় - অথবা পরিবর্তে, আমরা বিষয়বস্তু যে বো যাও জায়গা যেখানে একটি যাও প্রতি নির্দেশ না করে প্রতি নির্দেশ ধারণ. যদি আমরা বাম ডান থেকে এই বিশ্লেষণ, আমরা dereference বো যাচ্ছে, আমরা 14 সুরাহা করতে যাচ্ছি, আমরা পূর্ণসংখ্যা যে আছে দখল হয়ে যাচ্ছে, এবং তারপর আমরা ঠিকানা 10 যেতে যাচ্ছি, এবং আমরা যে মহাকাশ বো আমাদের dereference ফলাফল নিক্ষেপ করা যাচ্ছে. আমাদের রহমান, যেখানে আমরা এই সামান্য আরো কংক্রিট করতে পারেন ফিরে আলোকসম্পাতের, এটা যদি আমি এখানে ঠিকানাগুলি সমস্ত নম্বর লিখুন সাহায্য করতে পারে. যাতে আমরা জানতে পারি যে y সময়ে, আমরা ঠিকানা 14 এ আছে, x এর ঠিকানা 10 এ. যখন আমরা বো শুরু, আমরা dereference বো, আমরা মান 2 দখল চলুন. আমরা এই মান কারণ যে মান ঠিকানা 14 এ যে বাড়ি দখল করতে যাচ্ছি. এবং আমরা পরিবর্তনশীল ঠিকানা 10 এ যে জীবন তা করা যাচ্ছেন, যা অধিকার আছে, আমাদের পরিবর্তনশীল এর অনুরূপ x যাও. সুতরাং আমরা একটি overwriting এখানে সামান্য বিট করতে পারেন যেখানে আমরা আমাদের 1 পরিত্রাণ এবং পরিবর্তে আমরা একটি 2 লিখুন. তাই সব ভাল এবং বিশ্বের ভাল, যদিও আমরা এখন মুছে ফেলা x করেছেন. আমরা x এর মধ্যে আমাদের tmp পরিবর্তনশীল পুরোনো মান সংরক্ষিত আছে. সুতরাং আমরা পরের লাইন swap 'র সঙ্গে সম্পন্ন করতে পারবেন. আমাদের ল্যাপটপ ফিরে আলোকসম্পাতের. এখন যে সমস্ত দেহাবশেষের যাও বিষয়বস্তু নিতে আমাদের অস্থায়ী পূর্ণসংখ্যা চলকের আউট হয় এবং পরিবর্তনশীল ঠিকানা যে বো অধিষ্ঠিত হয় যে জীবন সেগুলি সঞ্চয়. তাই আমরা পরিবর্তনশীল এক্সেস পাবেন কার্যকরভাবে dereference বো যাও চলুন যে ঠিকানা যে বো এটি অধিষ্ঠিত হয়, এবং আমরা যে মূল্য তা tmp অধিষ্ঠিত হয় সামগ্রী চলুন. রহমান যাও আলোকসম্পাতের ফিরে আরো একবার. আমি এই মান এখানে নিশ্চিহ্ন করা, 2 করতে পারেন, এবং পরিবর্তে আমরা তা 1 ডান অনুলিপি করব. তারপর পরের লাইন কোর্স করুন যে, - যদি আমরা ল্যাপটপ ফিরে টুসকি - এই পয়েন্ট 6, যা বিন্দু যা আমরা আমাদের চিত্রটি সম্পূর্ণরূপে পূরণ আউট করতে চেয়েছিলেন. সুতরাং রহমান ফিরে আলোকসম্পাতের আরো একবার মাত্র, যাতে আপনি সম্পূর্ণ চিত্রটি দেখতে পারেন, আপনি যে আমরা একটি মধ্যে একটি 10, বো মধ্যে একটি 14, tmp মধ্যে একটি 1, 2 x এর মধ্যে একটি, এবং y মধ্যে একটি 1 আছে দেখতে পারেন. সেখানে এই বিষয়ে কোন প্রশ্ন থাকে? এই অনুভূতি আরো, তার মাধ্যমে পদচারণা না? কম জানার জন্য? . আশা না ঠিক আছে. পয়েন্টার হয় একটি বিষয় খুব চতুর. আমরা তোমার সঙ্গে কাজ এক একটি খুব সাধারণ কথা আছে: "বন্ধ পয়েন্টার বুঝতে, আপনি প্রথম পয়েন্টার. বুঝতে হবে" যা আমি মনে করি খুবই সত্য. এটি একটি এটি ব্যবহার করতে সময় লাগতে আছে. প্রচুর ছবি আঁকা, এই মত মেমরি ডায়াগ্রামে প্রচুর অঙ্কন খুব সহায়ক হয়, এবং পরে আপনি উদাহরণ ভিতর দিয়ে হেটে যেতে উদাহরণ পরে উদাহরণ পরে, এটি একটি সামান্য আরো অনুভূতি এবং আরো কিছু অনুভূতি এবং আরো কিছু জানার জন্য করা শুরু করব. অবশেষে, এক দিন, আপনি এটি সমস্ত সম্পূর্ণরূপে আয়ত্ত করতে হবে. কোন প্রশ্ন করার আগে আমরা পরবর্তী সমস্যাটি স্থানান্তরের উপর? ঠিক আছে. সুতরাং ল্যাপটপ টুসকি. পরবর্তী সমস্যাটি বর্তমানে আমাদের রয়েছে তাই সমস্যা নম্বর 33 নম্বর ফাইলটি আমি / O. এই অল্প জুম. সমস্যা 33 - হ্যাঁ? [ড্যানিয়েল] আমি দ্রুত একটি প্রশ্ন ছিল. এই তারকা, বা তারকাচিহ্ন, এটি dereferencing যখন আপনি একটি তারকা আগে ব্যবহার করার জন্য বলা হচ্ছে. কি এটি যখন আপনি আগে ampersand ব্যবহার হয়? >> আগে ampersand হয় অপারেটর এর ঠিকানা. সুতরাং আসুন স্ক্রল ব্যাক আপ. ওহো. আমি জুম মোড যাতে সত্যিই আমি স্ক্রল না করতে পারেন না. যদি আমরা এই কোড তাকান সত্যিই দ্রুত ডান এখানে, আবার, একই জিনিস ঘটছে. এই লাইন আমরা যদি এই কোড তাকান অধিকার এখানে, যেখানে আমরা কল অদলবদল করতে, ampersand ঠিক হয় বলছে "ঠিকানা যার পরিবর্তনশীল x জীবন পেতে." যখন আপনার কম্পাইলার আপনার কোড কম্পাইল করা, এটি আসলে আপনার ভেরিয়েবল শারীরিকভাবে বেঁচে থাকার জন্য মেমরির এমন একটি স্থানে চিহ্নিত আউট হয়েছে. তাই কি কম্পাইলার করবেন একবার এর সবকিছু কম্পাইল করতে পারেন, জানেন, "ওহ, আমি ঠিকানা 10 x করা. আমি ঠিকানা 14 এ y করান." এর পরে আপনার জন্য এই মানগুলি পূরণ করতে পারেন. সুতরাং আপনি পরে দেখতে পারেন - এটি করতে পারেন এবং তারপর হিসাবে ভাল পাস & y এই পাস. এইসব বলছি ঠিকানা পেতে, কিন্তু তারা, যখন আপনি swap-র কার্যকারিতা সেগুলি প্রেরণ করার জন্য, এই ধরনের তথ্য, এই int-* অধিকার এখানে, কম্পাইলার বলে, "ঠিক আছে, আমরা একটি পূর্ণসংখ্যা ভেরিয়েবলের একটি ঠিকানা হিসাবে এই ঠিকানা ব্যাখ্যা করা যাচ্ছে করছি." কোন int একটি ঠিকানা হিসাবে, যা একটি অক্ষর পরিবর্তনশীল এর ঠিকানা থেকে বিভিন্ন কারণ কোন int নেয় একটি 32 বিট মেশিনের আপ,, স্থান নেয় 4 বাইট আপ, যেহেতু মাত্র একটি অক্ষর লাগে স্থান 1 বাইট আপ. এটা আবার কি হল গুরুত্বপূর্ণ - কি জীবন, কি মান ধরণ যে ঠিকানা ইন পাশ ফেরার সময়ে জীবিত হয় অথবা যে ঠিকানা আপনার সাথে আচরণ করছেন. এইভাবে আপনি কিভাবে তথ্য অনেক বাইট আসলে আপনার RAM-র লোড আউট জানা. এবং তারপর, হ্যাঁ, এই আপনার মত dereference অপারেটর, জিজ্ঞাসা করা হয়, যায় এবং একটি নির্দিষ্ট ঠিকানায় তথ্যে অ্যাক্সেস করে. সুতরাং এই একটি পরিবর্তনশীল সঙ্গে বলছেন এখানে,, একটি ঠিকানা হিসাবে একটি বিষয়বস্তু আচরণ, যে ঠিকানা যান, এবং উঠিয়ে ফেলা, একটি খাতা মধ্যে প্রসেসর, চাপের মধ্যে লোড করা প্রকৃত মান বা বিষয়বস্তু যে ঠিকানায় যে বাস. কোন প্রশ্ন? এগুলি ভালো প্রশ্ন. এটা খুবই নতুন পরিভাষা অনেক. এখানে ভীতু ধরনের, বিভিন্ন জায়গায় এইজন্য & এবং *. ঠিক আছে. তাই ফিরে যাও সমস্যা 33, দায়ের আমি / O. এই ছিল তাদের যে সমস্যা রয়েছে, আমি মনে করি একটা ঘটেছে এক দম্পতি. এক, যে এটা একটা মোটামুটি নতুন বিষয়. এটা ব্যঙ্গ পূর্বে উপস্থিত ছিল প্রশংসনীয় শীঘ্রই, এবং তারপর আমার মনে হয় এটা যারা গণিত শব্দ সমস্যার মত ধরনের যেখানে তারা আপনার তথ্য অনেক দিন, কিন্তু বাস্তবে আপনি পর্যন্ত এটি একটি টন ব্যবহার করা হচ্ছে না শেষ. এই সমস্যা প্রথম অংশ কি একটি CSV ফাইলটি বর্ণনা করা হয়. এখন, যাও বর্ণনা অনুযায়ী একটি CSV ফাইল,, একটি কমা দ্বারা পৃথক মান ফাইল. কারণ এই সব আকর্ষণীয় হয়, এবং কারণ আপনি কি কখনও তাদের ব্যবহার, কারণ,, আপনি কি কখনও অনেক এক্সেল মত উপাদান ব্যবহার করেন? আপনি অধিকাংশ আছে সম্ভবত,, বা আপনার জীবনের কিছু সময় ব্যবহার করা চিত্র. আপনি ভালো কিছু এক্সেল ব্যবহার করব. যাতে তথ্য পেতে একটি এক্সেল স্প্রেডশীট আউট বা এটি সঙ্গে প্রক্রিয়াকরণে কোনো সাজান না, যদি আপনি একটি সি প্রোগ্রাম বা প্রোগ্রাম পাইথন, জাভা প্রোগ্রাম লিখতে চেয়েছিলেন, তথ্য আপনি সেখানে সঞ্চিত আছে সঙ্গে নিয়ে, সবচেয়ে সাধারণ ভাবে এটাকে সবচেয়ে ভাল ভাবে একটি CSV ফাইল হয়. এবং আপনি এক্সেল আপ খুলুন এবং যখন আপনি সংলাপ 'এই রূপে সংরক্ষণ করুন' যেতে পারেন, আপনি একটি প্রকৃত CSV ফাইল আউট পেতে পারেন. কিভাবে এইসব জিনিষ নিয়ে জানা কুশলী. এটার কাজ হল যে এটা অনুরূপ যাও - আমি বলতে চাচ্ছি, এটি মূলত একটি স্প্রেডশীট এর অনুকারী, যেখানে, খুব বাকি-অধিকাংশ টুকরা হিসাবে আমরা এখানে দেখতে,, আমরা সব শেষ নাম আছে. সুতরাং আমরা Malan তারপর, Hardison, এবং তারপর Bowden, MacWilliam, এবং তারপর Chan আছে. সমস্ত শেষ নাম. এবং তারপর একটি কমা নামের প্রথম থেকে শেষ নাম বিভাজন করা হয়. ডেভিড, Nate, রব, টমি, এবং Zamyla. আমি সবসময় Robby এবং টম মিশ্রিত করা হয়. এবং তারপর পরিশেষে,, তৃতীয় কলামে, ইমেল ঠিকানা. একবার আপনি যা বোঝেন, প্রোগ্রাম বাকি অতিশয় প্রয়োগ সহজবোধ্য. যাতে আমাদের সি প্রোগ্রাম এই একই কাঠামো অনুকরণমূলক কি আমরা সম্পন্ন করেছি হয় আমরা একটি কাঠামো ব্যবহার করেছি. আমরা এইসব একটু ভাল সঙ্গে আরো হিসাবে খেলা শুরু করব. আমরা প্রথম সমস্যা সেট 3, যখন আমরা অভিধান সাথে ডিল ছিল সামান্য বিট জন্য তাদের দেখেছি. কিন্তু এই কর্মীরা struct নামের শেষ অংশ, একটি নামের প্রথম অংশ, এবং একটি ইমেল সঞ্চয়. আমাদের CSV ফাইল মত শুধু মজুত ছিল. সুতরাং এই মাত্র এক থেকে অন্য ফরম্যাটে রূপান্তর করা হয়. আমরা এই ক্ষেত্রে, রূপান্তর একটি লাইন মধ্যে একটি কর্মী struct, আছে, কমা চিহ্ন দ্বারা ঠিক সেই মতো লাইন,. কি যে জানার জন্য? আপনি না সব ব্যঙ্গ নেওয়া, তাই আমি মনে করুন আপনার অন্তত আছে এই সম্পর্কে ভাবতে কিছু সময় ছিল. ভাড়া ফাংশন ইন, আমাদের সমস্যা নিয়ে জিজ্ঞেস করে - এই অল্প we'll জুম - নামের সঙ্গে গুলি নিতে কর্মীদের গঠন, স্টাফ struct মধ্যে,, এবং আমাদের staff.csv ফাইল এর বিষয়বস্তু লিখবেন. এটা পরিনত হয় যে এই হল মোটামুটি ব্যবহার সহজবোধ্য. আমরা এই ফাংশন একটি সামান্য বিট আরো আজকের সঙ্গে ধরনের কাছাকাছি খেলা করব. কিন্তু এই ক্ষেত্রে, fprintf ফাংশন সত্যিই কি. সুতরাং fprintf সাথে, আমরা, আপনি যেমন বলছি হয়েছে printf এই পুরো শব্দটি ব্যবহার করে মুদ্রণ করতে পারেন. আপনি printf একটি ফাইলে একটি লাইন পারেন. সুতরাং পরিবর্তে শুধুমাত্র স্বাভাবিক printf কল যেখানে আপনি এটি ফরম্যাট স্ট্রিং দেত্তয়া এবং তারপর আপনি নিম্নলিখিত আর্গুমেন্টগুলি সঙ্গে সব ভেরিয়েবল প্রতিস্থাপন, fprintf সঙ্গে, আপনার প্রথম যুক্তি পরিবর্তে একটি ফাইল আপনি লিখতে চান. যদি আমরা এই সময়ে প্রয়োগ ইন চেহারা, উদাহরণস্বরূপ, মানুষ fprintf ছিল, আমরা printf এবং fprintf মধ্যে পার্থক্য দেখতে পারেন. আমি এখানে একটি সামান্য বিট জুম করব. তাই সঙ্গে printf, আমরা এটি একটি ফরম্যাট স্ট্রিং দিন, এবং তারপর পরবর্তী আর্গুমেন্টগুলি সব আমাদের ফরম্যাট স্ট্রিং মধ্যে প্রতিস্থাপন বা প্রতিকল্পন ভেরিয়েবলের জন্য. সঙ্গে fprintf যেহেতু, প্রথম যুক্তি প্রকৃতপক্ষে এই ফাইলটি * নামক একটি প্রবাহ. এখানে উপর মুভিং ব্যাক আমাদের ভাড়া যাও, আমরা ইতিমধ্যে পেয়েছেন আমাদের ফাইলটি * প্রবাহে আমাদের জন্য খোলা. এর যে কি এই প্রথম লাইন আছে; এটি staff.csv ফাইল খোলেন, এটি append মোডে এটি খোলেন, এবং যে সব জন্য আমাদের করার বাকি এর হয় ফাইল কর্মী গঠন লিখুন. এবং, এর দেখতে দিন, না আমি রহমান ব্যবহার করতে চান? আমি রহমান ব্যবহার করব. আমরা শূন্যস্থান আছে - এর এই টেবিলের উপর তাই আমি কিছুটা ভালো লিখতে পারেন করা যাক - ভাড়া এবং বাতিলযোগ্য এটি একটি আর্গুমেন্ট লাগে স্টাফ গঠন নামক গুলি,. আমাদের ধনুর্বন্ধনী পেয়েছেন, আমরা আমাদের ফাইলটি * নামক ফাইলটি পেয়েছেন, আমরা আমাদের fopen লাইন দেওয়া আমাদের আছে, এবং আমি বিন্দু হিসাবে এটি যেহেতু এটি pedia ইতিমধ্যেই লিখুন করব. আমাদের পরের লাইন এবং তারপর, আমরা fprintf ফোন করতে যাচ্ছেন এবং আমরা ফাইলটি পাস যাচ্ছে যে আমরা প্রিন্ট করতে ইচ্ছুক থাকেন, এবং তারপর আমাদের ফরম্যাট স্ট্রিং, যা - আমি আপনাকে বলছি সম্পর্কে কি মত দেখায় বলুন জানাবো. কিভাবে সম্পর্কে আপনি, স্টেলা? আপনি কি জানেন যে বিন্যাসে string এর প্রথম অংশ বলে মনে হচ্ছে? [স্টেলা] আমি নিশ্চিত না. >> আর যাও জিমি জিজ্ঞাসা বিনামূল্যে. আপনি কি জানেন জিমি,? [জিমি] এটা শেষ হতে চান? আমি জানি না. আমি সম্পূর্ণভাবে নিশ্চিত না. >> ঠিক আছে. কেমন হয়, কেহ পরীক্ষা উপর এই সঠিক পেতে পারি? নং ঠিক আছে. এটা পরিনত হয় যে এখানে সমস্ত আমরা মনে হয় আমরা আমাদের কর্মীদের গঠন প্রতিটি অংশ করতে চান আমাদের ফাইলের মধ্যে একটি স্ট্রিং হিসেবে আউট প্রিন্ট করা হবে. আমরা মাত্র তিনটি ভিন্ন বার ব্যবহার স্ট্রিং প্রতিকল্পন অক্ষর কারণ আমরা একটি পদবি আছে কমা দ্বারা পরে, একটি প্রথম নামের একটি কমা দ্বারা অনুসৃত, এবং পরিশেষে তারপর ইমেল ঠিকানা যা অনুসরণ করা হয় - যা নয় ঝুলানো আমার পর্দায় - কিন্তু এটি একটি newline অক্ষর এর দ্বারা অনুসৃত. আমি এটা ঠিক নিচে লিখুন সেখানে যাচ্ছি. এবং তারপর আমাদের বিন্যাস নিম্নলিখিত পংক্তি, আমরা শুধু পরিবর্তকগুলি আছে, যা আমরা বিন্দু নোটেশন ব্যবহার করে একসেস আমরা যে সমস্যা সেট 3 দেখেছি. আমরা s.last, s.first, এবং s.email ব্যবহার করতে পারেন যারা আমাদের ফরম্যাট স্ট্রিং মধ্যে তিনটি মান খেলোয়াড়রা. কিভাবে যাতে যান নি? জানার জন্য? হ্যাঁ? না? সম্ভবত? ঠিক আছে. চূড়ান্ত জিনিস যে আমরা পরে আমরা মুদ্রিত এবং পরে আমরা আমাদের ফাইল খোলা করেছি: যখনই আমরা একটি ফাইল খোলা, আমরা সর্বদা বন্ধ স্মরণে রাখতে হবে. কারণ অন্যথায় আমরা আপ মেমরি লিক শেষ করব, ব্যবহার করে ফাইল বর্ণনাকারী আপ. সুতরাং, বন্ধ ফাংশন যা আমরা ব্যবহার করবেন? Daniel? [ড্যানিয়েল] fclose? >> Fclose ঠিক,. সুতরাং এই সমস্যার শেষ অংশ সঠিকভাবে ফাইল বন্ধ ছিল, fclose ফাংশন ব্যবহার করে, যা ঠিক মতো দেখতে. ছবি খুব বেশি নেই. কুল. যাতে এর ব্যঙ্গ সমস্যার 33. আমরা নিশ্চিতভাবে আরো ফাইল আছে, I / O উত্ক্রান্ত করব. আমরা বক্তৃতায় একটা সামান্য বিট আরো আজ, করব বা বিভাগে আজ, কারণ কি এই যে আসন্ন pset বাল্ক গঠন করে যাচ্ছে. চলুন এই সময়ে ব্যঙ্গ থেকে যান. হ্যাঁ? [Charlotte]] কেন fclose (ফাইল) এর পরিবর্তে fclose (staff.csv)? >> আহ্. কারণ এটি সক্রিয় করে - তাই প্রশ্ন, যা একটি মহান এক, না কেন, যখন আমরা fclose লিখুন, আমরা fclose (ফাইল) তারকা ভেরিয়েবল লেখা হয় ফাইলের নাম, staff.csv বিপরীতে? এটা কি সঠিক? হাঁ. সুতরাং আসুন কটাক্ষপাত. যদি আমি আমার ল্যাপটপ ফিরে যাও সুইচ, এবং আসুন fclose ফাংশন তাকান. সুতরাং fclose ফাংশন একটি প্রবাহ প্রচেষ্টা এবং এটি পয়েন্টার মধ্যে লাগে প্রবাহ যে আমরা বন্ধ করতে চান যাও, প্রকৃত ফাইল নামের যে আমরা বন্ধ করতে চান উল্টোদিকে. এবং এই কারণ লোকচক্ষুর অন্তরালে, যখন আপনি fopen ফোন করতে, হয় যখন আপনি একটি ফাইল খুলুন, আসলে আপনি মেমরি করছি ফাইল সম্পর্কে তথ্য সংরক্ষণ বণ্টন. সুতরাং আপনি যে ফাইল পয়েন্টার ফাইল সম্পর্কে তথ্য আছে, যেমন এটা খোলা, তার আকার, যেখানে আপনি ফাইলটি বর্তমানে, যাতে আপনি পড়া এবং সেই বিশেষ স্থান ফাইলের মধ্যে লেখা কল করতে পারেন. আপনি শেষ পর্যন্ত বন্ধ করার পরিবর্তে ফাইলের নামের মধ্যে পয়েন্টার বন্ধ. হ্যাঁ? [ড্যানিয়েল] তাই অর্ডার ভাড়া ব্যবহার করতে, আপনাকে বলতে হবে - কিভাবে এটা ব্যবহারকারীর ইনপুট পেতে পারি? কি fprintf GetString মত অনুভূতি কাজ যে শুধু এটি ব্যবহারকারী ইনপুট জন্য অপেক্ষা করব এবং আপনি এই টাইপ চান - বা করার জন্য আপনাকে এই তিনটি জিনিষ টাইপ অপেক্ষা? অথবা আপনি কি কিছু ভাড়া প্রয়োগ করার প্রয়োজন? >> হ্যাঁ. সুতরাং আমরা না - প্রশ্ন করা হয়েছিল কিভাবে আমরা ব্যবহারকারীর ইনপুট পাওয়া যাতে ভাড়া প্রয়োগ? আমরা কি এখানে আছে ভাড়া মধ্যে আহ্বানকারী, এই সঞ্চিত ইতিমধ্যে struct ডেটা সব কর্মীদের struct সালে পাশ. সুতরাং fprintf হয় ঠিক সেই তথ্য লিখুন সরাসরি ফাইল পারবেন. ব্যবহারকারীর ইনপুট জন্য কোন অপেক্ষা নেই. ব্যবহারকারী ইতিমধ্যেই সঠিকভাবে এই কর্মীরা struct তা নির্বাণ দ্বারা ইনপুট দেওয়া. আর অবশ্যই জিনিস,, যদি তাদের কোনো ছিল নাল পয়েন্টার বিরতি চাই, তাই আমরা ফিরে স্ক্রল আপ এবং এখানে আমরা আমাদের struct তাকান. আমরা স্ট্রিং শেষ, প্রথম পংক্তি, স্ট্রিং ইমেল আছে. আমরা এখন জানি যে ফণা অধীন যারা সত্যিই সব,, গৃহস্থালির কাজ হয় * ভেরিয়েবল. যে প্রতি নির্দেশ করা নাল বা হতে পারে নাও হতে পারে. তারা গাদা মেমরি হতে পারে প্রতি নির্দেশ, স্ট্যাক মেমরি হয়তো. আমরা সত্যিই জানি না, কিন্তু যদি এই পয়েন্টার কোনো নাল হয়, বা অবৈধ, যে যে স্পষ্টভাবে আমাদের ভাড়া ফাংশন বিপর্যস্ত হবে. যে ছিল যে কিছু পরীক্ষার সুযোগ অতিক্রম ছিল ধরনের. আমরা যে বিষয়ে উদ্বেজক করছি না. গ্রেট. ঠিক আছে. তাই ব্যঙ্গ থেকে সরানোর উপর. এর এই তামাশা বন্ধ করে দিন এবং আমরা pset 4 তাকান চলুন. তাই আপনি যদি না pset বৈশিষ্ট তাকান একবার, আপনি এটি ব্যবহার করতে পারেন, cs50.net/quizzes, আমরা অধ্যায় সমস্যা আজকের কয়েক মধ্য দিয়ে যেতে হবে. আমি নিচে প্রদর্শনের করছি - প্রশ্নের অধ্যায় pset বৈশিষ্ট তৃতীয় পাতা শুরু হয়. এবং প্রথম অংশ পুনঃনির্দেশিত হচ্ছেন এবং পাইপের যান এবং ছোট ঘড়ি অনুরোধ জানাবে. যা ছিল একটি শান্ত ছোট ধরনের, নতুন কিছু দেখায়, শীতল কমান্ড লাইন ঠাট যে আপনি ব্যবহার করতে পারেন. এবং তারপর আমরা আপনার জন্য কিছু প্রশ্নের পেয়েছেন হিসাবে ভাল. এই স্ট্রিম সম্পর্কে প্রথম প্রশ্ন, যা printf ডিফল্টরূপে লিখেছেন, আমরা অল্পমাত্র বিট ধরনের ছোঁয়া একটি মুহূর্ত আগে. এই fprintf যে আমরা আলোচনা হয়েছে একটি যুক্তি হিসাবে ফাইলটি * প্রবাহে লাগে. fclose একটি ফাইল * প্রবাহে হিসাবে ভাল লাগে, এবং fopen ফেরত মূল্য দেয় একটি ফাইল * প্রবাহ হিসাবে আপনি ভাল. কারণ আমরা যখন আমরা printf মোকাবেলা করেছি যারা আগে দেখা হয়নি কারণ হল, printf একটি ডিফল্ট স্ট্রিম আছে. এবং ডিফল্ট স্ট্রিম তা লিখেছেন আপনার সম্পর্কে সংক্ষিপ্ত আউট করব. তাই স্পষ্টভাবে এটি কটাক্ষপাত করা. আজ এর অধ্যায়, আমরা GDB সম্পর্কে অল্প কথা বলতে যাচ্ছেন, যেহেতু আপনি এটা আরো পরিচিত হয়, আরো অনুশীলন আপনি এটি দিয়ে পেতে, ভাল সক্ষম আপনি আসলে আপনার নিজস্ব কোডে বাগ বাহির নিচে হবেন. এই ডিবাগিং এইসা আপ প্রক্রিয়ার গতি. তাই ব্যবহার printf দ্বারা, প্রত্যেক সময় কি আপনি যে আপনার কোড recompile আছে, আপনি আবার কখনও কখনও এটি চালানোর আছে, আপনি কাছাকাছি printf কল সরানো আছে, কোড মন্তব্য আউট, এটা একটি সময় লাগে. আমাদের লক্ষ্য এবং চেষ্টা করুন যে আপনি GDB সঙ্গে, মূলত আপনি পারেন সন্তুষ্ট হয় আপনার কোড মধ্যে যে কোনো স্থানে printf কিছু এবং আপনি তা recompile কখনও. আপনি এবং মনন শুরু যেখানে যাও printf পরের রাখতে হবে না. প্রথম জিনিস না এই লাইন এবং কপি অধ্যায় কোড পেতে ওয়েবের বন্ধ হয়. আমি কোড এই লাইন যে, "wget ​​ব্যবহারেরে অনুরোধ জানানো http://cdn.cs50.net" অনুলিপি করছি. আমি কপি যাচ্ছি. আমি আমার যন্ত্র নিয়ে যেতে যাচ্ছি, জুম আউট যাতে আপনি কি আমি করছি দেখতে পারেন, সেখানে পেস্ট, এবং যখন আমি আঘাত লিখুন, আক্ষরিক এই wget কমান্ডের একটি ওয়েব পেতে. এটি চূর্ণ ইন্টারনেটের এই ফাইলটি বন্ধ করবে, এবং এটা বর্তমান ডিরেক্টরিতে সংরক্ষণ করে যাচ্ছে. এখন যদি আমি আমার বর্তমান ডিরেক্টরির তালিকা আপনি যে আমি অধিকার আছে এই ফাইলটি section5.zip পেয়েছেন দেখতে পারেন. উপায় যে লোক সঙ্গে মোকাবিলা করার জন্য এটি আনজিপ হয়, যা আপনি কমান্ড লাইন মধ্যে, ভালো করতে পারেন. Section5.zip. যে এটি আনজিপ করতে হবে, আমার জন্য ফোল্ডার তৈরি, বিষয়বস্তু ফোলান, সেখানে তাদের করা. তাই এখন আমি আমার অধ্যায় 5 নির্দেশিকা cd কমান্ড ব্যবহার করে যেতে পারেন. পর্দা ব্যবহার করে পরিষ্কার করুন. তাই পর্দা পরিষ্কার. এখন আমি একটা চমৎকার মোকাবেলা পরিষ্কার টার্মিনাল পেয়েছেন. এখন যদি আমি সব ফাইল এই আমি এই ডিরেক্টরির তালিকা দেখুন, আপনি দেখতে যে আমি চার ফাইল পেয়েছেন: buggy1, buggy2, buggy3, এবং buggy4. আমি করেছি তাদের অনুরূপ. গ ফাইল আছে. আমরা. গ ফাইল এ জন্য এখন তার থেকে চলুন না. পরিবর্তে, আমরা তাদের যখন আমরা খুলুন GDB আপ ব্যবহার চলুন. আমরা তাদের রাখা করেছি তাই চারপাশে যে আমরা প্রকৃত সোর্স কোড এক্সেস আছে যখন আমরা GDB ব্যবহার করছেন, কিন্তু মেরামত বিভাগের এই অংশ লক্ষ্যে GDB প্রায় এবং দেখুন কিভাবে আমরা জিনিসটা কি এই চারটি বগী প্রোগ্রামের সাথে যাচ্ছে ভুল এটি ব্যবহার করতে পারেন. তাই আমরা ঠিক করছি যাচ্ছে রুম চারপাশে সত্যিই দ্রুত, এবং আমি কারো যাও বগী প্রোগ্রামের রান জিজ্ঞাসা চলেছি, এবং তারপর আমরা GDB মাধ্যমে একটি গ্রুপ হিসাবে যান এবং আমরা এইসব প্রোগ্রাম ফিক্স করতে পারেন দেখতে পাবেন পাবেন, বা অন্তত চিহ্নিত কি তাদের প্রতিটি ভুল হতেই থাকবে. চলুন ড্যানিয়েল সঙ্গে এখানে শুরু উপর. Buggy1 আপনি চালানো হবে? এর কি চলুন দেখা যাক. [ড্যানিয়েল] এটি বলছে যে একটি আবেদন দোষ আছে. >> হ্যাঁ. ঠিক. সুতরাং যদি আমি buggy1 চালানো, আমি একটি seg ফল্ট পেতে. এই পর্যায়ে, আমি এবং buggy1.c খুলে যেতে পারে, এবং চেষ্টা জিনিসটা কি ভুল করছেন, কিন্তু এই seg দোষ ত্রুটি সম্পর্কে সবচেয়ে বিরক্তিকর জিনিস এক হয় যে আপনি এটি কি আসলে প্রোগ্রাম জিনিস লাইন ভুল হয়েছে এবং কপর্দকশূন্য থেকে বলুন না. আপনি কোড তাকান ধরনের আছে অনুমান আউট ব্যবহার করে এবং এবং চিত্র বা চেক printf কি ভুল দেখতে যাচ্ছে. GDB সম্পর্কে কখনই বিষয় হল যে এটা আসলে সত্যিই, সহজ যাও লাইন আউট চিত্র যা আপনার প্রোগ্রাম বিপর্যস্ত. এটি সম্পূর্ণই তা ব্যবহার মূল্যহীন, এমনকি যদি ঠিক যে জন্য. সুতরাং GDB বুট আপ, আমি GDB টাইপ করুন, এবং তারপর আমি এক্সিকিউটেবল যে আমি চালাতে চান দিতে পাথ এটি. এখানে আমি সময় gdb ./buggy1 টাইপ করছি. হিট লিখুন. দেয় এই সব কপিরাইট সম্পর্কে তথ্য, এবং এখানে আপনি নিচে এই লাইন যে, / হোম / থেকে পড়া চিহ্ন "দেখতে পাবেন jharvard/section5/buggy1. " এবং যদি সব ঠিক যায়, আপনি এটি একটি বার্তা ভালো যে দেখায় প্রিন্ট আউট দেখতে পাবেন. এটা চিহ্ন পড়তে হবে, এটি "আমি আপনার এক্সিকিউটেবল ফাইল থেকে চিহ্ন করছি পড়া," বলবো এবং তারপর এটি এখানে মাধ্যমে এই "কাজ" বার্তা থাকবে. আপনি যদি এই কিছু অন্য ভেরিয়েশন দেখুন, অথবা আপনি সেটি দেখতে চিহ্ন খুঁজে পাইনি বা ওই জাতীয় কিছু, কি যে এর মানে হল যে আপনি সঠিকভাবে আপনার এক্সিকিউটেবল কম্পাইল করেন নি. যখন আমরা GDB সাথে ব্যবহারের জন্য প্রোগ্রাম কম্পাইল, আমরা যে বিশেষ-g পতাকা ব্যবহার আছে, এবং যে ডিফল্ট দ্বারা যদি আপনি আপনার প্রোগ্রাম কম্পাইল কাজ শুধু টাইপ করতে দ্বারা, এর বা বগী বা পুনরুদ্ধার করা হয়েছে, যারা কোনো. তবে আপনি যদি ঝনঝন সঙ্গে নিজে কম্পাইল করছি, তাহলে যান এবং যে-g ফ্ল্যাগ অন্তর্ভুক্ত করতে হবে. এই পর্যায়ে এখন, যে আমরা আমাদের GDB প্রম্পট আছে, এটা বেশ সহজ প্রোগ্রাম চালানো. আমরা রান হয়, টাইপ করতে পারেন বা আমরা শুধু কিছু টাইপ করতে পারেন. সর্বাধিক GDB কমান্ড সংক্ষিপ্ত হতে পারেন. সাধারণত শুধু এক অথবা একটি দম্পতি অক্ষর, যা পরিষ্কার - পরিচ্ছন্ন সুন্দর. সুতরাং Saad, যদি আপনি কিছু টাইপ করুন এবং আঘাত, Enter কি? [Saad] আমি SIGSEGV, সেগমেন্টেশন ফল্ট, এবং তারপর এই সব gobbledygook পেয়েছিলাম. >> হ্যাঁ. ভালো লেগেছে আমরা পর্দায় অধিকার এখন দেখেন, এবং ভালো সাদ বলেন, যখন আমরা রান বা r টাইপ করুন এবং Enter আঘাত, এখনও আমরা একই seg ফল্ট পেতে. সুতরাং GDB ব্যবহার করে আমাদের সমস্যা সমাধানের জন্য না. কিন্তু এটি আপনাকে কিছু gobbledygook আমাদের, এবং এটি সক্রিয় আউট যে এই gobbledygook আসলে আমাদেরকে বলে যেখানে এটা ঘটছে. এই অল্প পার্স, এই প্রথম বিট হয় ফাংশন যা সবকিছু ভুল করে যাচ্ছে. এই __ strcmp_sse4_2 আছে, এবং এটি আমাদেরকে বলে যে, এটি এই ফাইলের মধ্যে ঘটছে বলা sysdeps/i386, এই সব, আবার, একটি জগাখিচুড়ি ধরনের - কিন্তু লাইন 254. যে ধরনের যাও পার্স করা কঠিন. সাধারণত যখন আপনি ভালো স্টাফ দেখুন, তার মানে এটি সিস্টেম লাইব্রেরি এক faulting seg এর. তাই কিছু strcmp না. আপনি না strcmp দেখা আগে. ছবি খুব, নেই কিন্তু আছে এই গড় যে strcmp বা ভাঙ্গা যে strcmp সঙ্গে একটা সমস্যা আছে না? আপনি কি মনে করেন আলেকজান্ডার,? [আলেকজান্ডার] এটা কি - 254 লাইন হয়? এবং - বাইনারি না, কিন্তু এটি তাদের সিলিং না, এবং তারপর প্রতিটি ফাংশানের জন্য অন্য ভাষা আছে. এটা 254 যে ফাংশনে, বা -? >> এটা লাইন 254. এটা এই. গুলি ফাইল মত দেখাচ্ছে, সুতরাং এটি সম্ভবত সমাবেশ এর কোড. কিন্তু, আমি অনুমান আরো চাপা জিনিস হল, কারণ আমরা একটি seg ফল্ট অর্জিত করেছি, এবং এটা দেখে মনে হচ্ছে এটা strcmp ফাংশন এর থেকে আসছে, কিন্তু এই পরোক্ষভাবে তারপর, যে strcmp নষ্ট হয়ে গেছে? এটা আশা, না করা উচিত. শুধু তাই না, কারণ আপনি একটি সেগমেন্টেশন ফল্ট আছে সিস্টেমের কর্ম এক হয়, সাধারণত এর অর্থ হল যে আপনি কেবলমাত্র এটি সঠিকভাবে বলা হয় নি. দ্রুততম জিনিস যাও যাও জিনিসটা আসলে কি যাচ্ছে না যখন আপনি কিছু ভালো ছবি, দেখতে যখনই আপনি একটি seg ফল্ট দেখতে, বিশেষ করে যদি আপনি একটি প্রোগ্রাম যা আরো অনেক কিছুতে প্রধান এর ব্যবহার আছে, একটি backtrace ব্যবহার হয়. আমি BT লেখা, পূর্ণ backtrace শব্দ হিসাবে বিরোধিতা দ্বারা backtrace সংক্ষিপ্ত. কিন্তু কোরআন, কি যখন আপনি BT টাইপ করুন এবং Enter আঘাত? [Charlotte] এটা দেখায় দুই লাইন, লাইন 0 এবং 1 লাইন সম্পর্কে. >> হ্যাঁ. তাই লাইন 0 এবং 1 টি লাইন. এগুলি প্রকৃত স্ট্যাকের ফ্রেম যে খেলার মধ্যে বর্তমানে ছিল যখন আপনার প্রোগ্রামটি ক্র্যাশ করেছে. শুরু আগ ফ্রেম, ফ্রেম 0 থেকে, যাচ্ছে এবং নিচের অধিকাংশ, যা ফ্রেম 1 যাও. আমাদের সর্বোচ্চ ফ্রেম strcmp ফ্রেম. আপনি এই যে আমরা সমস্যাটি পয়েন্টার সঙ্গে ব্যঙ্গ মাত্র ছিল অনুরুপ অনুরূপ হিসাবে মনে করতে পারেন, যেখানে আমরা প্রধান স্ট্যাকের ফ্রেমের উপরে স্ট্যাকের ফ্রেম ছিল swap, ভেরিয়েবল এবং আমরা যে যে প্রধান ভেরিয়েবলগুলি ব্যবহার ছিল শীর্ষে swap-র ব্যবহার ছিল. এখানে আমাদের ক্র্যাশ আমাদের strcmp ফাংশন, যা আমাদের প্রধান ফাংশন দ্বারা বলা হয়েছিল ঘটেছে, এবং আমাদের backtrace না শুধুমাত্র ফাংশন যা জিনিষ প্রদান করতে ব্যর্থ হয়, কিন্তু এটা আমাদের এর বলছে যেখানে সবকিছু থেকে বলা হয়েছিল. সুতরাং যদি আমি আরো একটু উপরে ডান দিকে স্ক্রোল করুন, আমরা যে হাঁ, আমরা এই strcmp-sse4.s ফাইলের লাইন 254 ছিল দেখতে পারেন. কিন্তু কল buggy1.c, লাইন 6 হয়েছিল. সুতরাং তার মানে আমরা কি করতে পারি - শুধু আমরা যেতে পারে চেক এবং কি ঘটছে ছিল দেখুন এ buggy1.c, লাইন 6. আবার, একটি দম্পতি উপায়ে এই কাজ করতে হয়. এক GDB আউট হয় প্রস্থান বা আছে আপনার কোড অন্য উইন্ডোতে এবং ক্রস রেফারেন্স খুলুন. এবং তার মধ্যে যে,, অত্যন্ত সুবিধাজনক কারণ এখন যদি আপনি অফিস করেন এবং আপনি একটি seg ফল্ট পেয়েছেন এবং আপনার TF যেখানে সবকিছু ভঙ্গ ছিল হতাশ এর, আপনি শুধু বলে, "ওহ, লাইন 6. পারেন আমি কি করছেন জানি না, কিন্তু লাইন 6 সম্পর্কে আমার কিছু প্রোগ্রাম বিরতি যার ফলে হয়. " অন্য উপায় না হয় আপনি এই কমান্ড GDB নামে তালিকা ব্যবহার করতে পারেন. এছাড়াও আপনি ঠ সঙ্গে এটি হ্রাস করা যাবে. তাই আপনি যদি আমরা ঠ আঘাত কি, এখানে আমরা পেতে পারি? আমরা একটি অদ্ভুত জিনিস আভা পেতে. এটি প্রকৃত সমাবেশ কোড যে strcmp_sse4_2 হয়. এই ভীতু ধরনের দেখায়, এবং কারণ আমরা এই করছি পাওয়ার কারণ হল, এখন ডান, GDB ফ্রেম 0 আমাদের আছে. তাই যে কোন সময় আমরা চেহারা এ ভেরিয়েবল, যে কোন সময় আমরা সোর্স কোড তাকান, আমরা সোর্স কোড যে pertains স্ট্যাকের ফ্রেম আমরা বর্তমানে করছি ইন খুঁজছেন তাই অর্ডার কিছু অর্থপূর্ণ পেতে, আমরা আছে একটি স্ট্যাক ফ্রেম যে আরো অর্থ স্থানান্তরের. এই ক্ষেত্রে, প্রধান স্ট্যাকের ফ্রেম একটু আরো জানার জন্য চাই, কারণ যে আসলে আমরা যে কোড লেখেন. Strcmp কোড নেই. আপনার মধ্যে ফ্রেম, এই ক্ষেত্রে সরানো, কারণ আমরা দুটি থাকতে পারে, আমরা 0 এবং 1 আছে, আপনি আপ করুন এবং নিচে কমান্ড দিয়ে যে কি. যদি আমি সরাতে এক ফ্রেম আপ, এখন আমি প্রধান স্ট্যাকের ফ্রেম আছি. আমি যেখানে আমি ফিরে যেতে পারেন নিচে নামাও, আবার যান, আবার নিচে যান, এবং আবার যান. আপনি যদি কখনও GDB আপনার প্রোগ্রাম না, আপনি একটি ক্র্যাশ পেতে, আপনি backtrace পেতে, এবং আপনি দেখতে যে এটা কিছু ফাইল যে আপনি কি করছেন না জানা আছে. আপনি তালিকা চেষ্টা করুন, কোড পরিচিত দেখালে আপনাকে না, আপনার ফ্রেম এ দেখব এবং জিনিসটা যেখানে আপনি. আপনি ভুল স্ট্যাকের ফ্রেমে সম্ভবত করছি. বা অন্তত আপনি একটি স্ট্যাক ফ্রেম যে এক যে সত্যিই আপনি ডিবাগ করতে পারবেন না আপনি আছেন. এখন যে আমরা যথাযথ স্ট্যাকের মধ্যে ফ্রেম, আমরা প্রধান আছেন, এখন আমরা চিন্তা কি লাইন ছিল তালিকা দেখতে নিম্নলিখিত কমান্ড ব্যবহার করতে পারেন. এবং আপনি এটি দেখতে পারেন; এটা আমাদের জন্য এটি মুদ্রিত অধিকার এখানে. কিন্তু আমরা সবাই একই তালিকা, আঘাত এবং তালিকা দেয় এই চমৎকার আউটে আমাদের করতে পারেন প্রকৃত সোর্স কোড যে এখানে যাচ্ছে না. বিশেষ করে, আমরা লাইন 6 তাকান পারেন. আমরা কি এখানে হচ্ছে দেখতে পারেন. এবং এটা দেখে মনে হচ্ছে আমরা একটি স্ট্রিং তৈরি তুলনা করছি মধ্যে স্ট্রিং "CS50 স্কচ" এবং argv [1]. এই সম্পর্কে কিছু বিপর্যয় ছিল. তাই দু: আপনি কি অদ্ভুত আচরণ করা হতে পারে এখানে কোনো চিন্তা নেই? [দু] আমি কেন এটা বিপর্যয় এর জানি না. >> আপনি কেন এটা বিপর্যয় এর জানেন না? জিমি, কোনো চিন্তা? [জিমি] আমি, কিন্তু সম্পূর্ণরূপে নিশ্চিত না শেষ সময় আমরা স্ট্রিং ব্যবহার তুলনা, অথবা strcmp, আমরা তিনটি এটি অধীন বিভিন্ন ক্ষেত্রে ভালো ছিল. আমরা একটি == কি না, আমি, মনে হয় না ঠিক প্রথম লাইনে না. এর পরিবর্তে এটি তিন ভাগ, বিভক্ত ছিল এবং এক == 0 ছিল, এক <0, আমি মনে করি, এবং এক ছিল> 0. তাই হয়তো যে ভালো কিছু? >> হ্যাঁ. তাই এই সমস্যা আছে আমাদের তুলনা হয় সঠিকভাবে করছে? স্টেলা? কোন চিন্তা? [স্টেলা] আমি নিশ্চিত না. নিশ্চিত >> নেই. Daniel? চিন্তা? ঠিক আছে. এটি সক্রিয় কি অধিকার এখানে ঘটছে তা হল যখন আমরা দৌড়ে প্রোগ্রাম এবং আমরা seg দোষ না, আপনি যখন প্রথম বারের জন্য প্রোগ্রাম, ড্যানিয়েল দৌড়ে, আপনি কি এটি কোন কমান্ড লাইন আর্গুমেন্ট দিতে হবে কেন? [ড্যানিয়েল] নং >> নং সেই ক্ষেত্রে, কি argv মান [1]? >> কোন মূল্য নেই. >> রাইট. ওয়েল, কোন উপযুক্ত স্ট্রিং ভ্যালু আছে. কিন্তু কিছু মূল্য আছে. মান যা আছে সঞ্চিত সম্ভার কি? >> একটি গার্বেজ মান? >> এটা হয় একটা আবর্জনা মান এই ক্ষেত্রে বা,, argv অ্যারের শেষ নাল সঙ্গে সবসময় বাতিল করা হয়. তাই আসলে সঞ্চিত আছে নাল আছে. অন্য কোন উপায়ে এই সমস্যা সমাধানের পরিবর্তে এটি চিন্তা মাধ্যমে তুলনায়,, এটি প্রিন্ট আউট চেষ্টা হয়. এই যে আমি যেখানে GDB ব্যবহার মহান বলছে ছিল, কারণ আপনি সব ভেরিয়েবল আউট মুদ্রণ করতে পারেন, সব মান যে আপনি চান এই কুশলী-সপ্রতিভ পি কমান্ড ব্যবহার করে. তখন যদি আমি পি টাইপ করুন এবং আমি একটি পরিবর্তনশীল অথবা একটি ভেরিয়েবলের মান নাম টাইপ করুন, argc বলে, আমি দেখতে যে argc হয় 1. যদি আমি argv প্রিন্ট আউট করতে চান [0], আমি ঠিক সেই মতো তা করতে পারেন. এবং ভালো আমরা দেখেছি, argv [0] সর্বদা আপনার প্রোগ্রামের নাম, সর্বদা এক্সেকিউটেবলের নামের. এখানে আপনি দেখতে এটি সম্পূর্ণ পাথ এর নাম আছে. আমি প্রিন্ট আউট argv [1] এবং দেখুন সেখানে কি ঘটছে. পারেন এখানে আমরা রহস্যময় মান এই ধরণের না. আমরা এই 0x0 পেয়েছিলাম. শব্দের শুরুতে যখন আমরা হেক্সাডেসিমাল সংখ্যা সম্পর্কে বলার সময়ে মনে রাখুন? অথবা যে pset 0 শেষে সামান্য কিভাবে হেক্স মধ্যে 50 প্রতিনিধিত্ব সম্পর্কে প্রশ্ন? আমাদের সি এস এ হেক্স সংখ্যা লিখুন, শুধু নিজেদেরকে গুলান না দশমিক সংখ্যা দিয়ে, হল আমরা সবসময় 0x সঙ্গে তাদের উপসর্গ. তাই সবসময় এই 0x উপসর্গ মাত্র মানে একটি হেক্সাডেসিমাল সংখ্যা হিসাবে নিম্নলিখিত নম্বর ব্যাখ্যা করা, না হিসাবে একটি স্ট্রিং হইনি হিসাবে একটি দশমিক সংখ্যা, না হিসাবে একটি বাইনারি সংখ্যা. যেহেতু সংখ্যা 5-0 একটি বৈধ হেক্সাডেসিমেল সংখ্যা. এবং এটা দশমিক, 50 মধ্যে একটি নম্বর. সুতরাং এটি ঠিক কিভাবে আমরা disambiguate. সুতরাং 0x0 মানে হেক্সাডেসিমেল 0, যা হয় দশমিক 0, বাইনারি 0. এটি শুধু মান 0. এটা পরিনত হয় যে এই কি নাল হয়, আসলে মেমরি,. নাল শুধুমাত্র 0. এখানে, উপাদান argv এ সঞ্চিত [1] হল নাল. তাই আমরা একটি নাল পংক্তি আমাদের "CS50 স্কচ" স্ট্রিং তুলনা করার চেষ্টা করছেন. সুতরাং নাল dereferencing, যাও নাল এ জিনিষ অ্যাক্সেস করার চেষ্টা, যারা সাধারণত সেগমেন্টেশন ফল্ট যাও বা অন্যান্য খারাপ জিনিষ ঘটতে কিছু সাজানোর ঘটাতে যাচ্ছে. এবং এটি সক্রিয় যে strcmp দেখতে না চেক না কিনা অথবা আপনি একটি মান যে নাল সালে পাশ করেছি. বরং, এটা নিজে থেকেই এগিয়ে যায়, তার চেষ্টা জিনিস করে, এবং এটি যদি ফল্ট seg, এটি ফল্ট seg, এবং এটা আপনার সমস্যা. আপনি এটা ঠিক আছে যান. সত্যিই দ্রুত কিভাবে, আমরা ঠিক করব এই সমস্যা হতে পারে? Charlotte? [Charlotte] ব্যবহার করে আপনি যদি চেক করতে পারেন. তাই আপনি যদি argv [1] হল নাল, তারপর == 0, 1, বা ফিরে কিছু [অপাচ্য]. >> হ্যাঁ. যাতে এর একটি দুর্দান্ত উপায় না, আমরা পরীক্ষা করতে পারবেন, মান সম্পর্কে আমরা করছি strcmp হত্তয়া যাও, argv [1], এটি অকার্যকর হয়? যদি এর নাল তারপর, আমরা অনুমোদন বাতিল করা বলতে পারেন. আরো একটি প্রচলিত উপায় এই না argc মান ব্যবহার করা হয়. আপনি প্রধান প্রারম্ভে দেখুন ডান এখানে করতে পারেন, আমরা যে প্রথম পরীক্ষা বাদ যে সাধারণত আমরা যখন আমরা কমান্ড লাইন আর্গুমেন্ট ব্যবহার, যা কিনা বা না আমাদের argc মূল্য কি আমরা আশা পরীক্ষা হয়. এই ক্ষেত্রে, আমরা অন্তত দুটি আর্গুমেন্ট আশা করছি, প্রোগ্রামের নামের অন্য একটি প্লাস. কারণ আমরা দ্বিতীয় যুক্তি অধিকার এখানে ব্যবহার সম্পর্কে. তাই পরীক্ষার কিছু বাছাই করা হচ্ছে পূর্বেই আমাদের strcmp কল করার আগে, যে কিনা পরীক্ষা বা না argv অন্তত 2, এছাড়াও একই জিনিস করে সাজান. আমরা যদি যে প্রোগ্রাম আবার চলমান কাজ দেখতে পারেন. আপনি সবসময় GDB, যা সত্যিই চমৎকার মধ্যে আপনার প্রোগ্রাম পুনরায় আরম্ভ করতে পারেন. আপনি, এবং রান যখন আপনি আর্গুমেন্ট পাস আপনার প্রোগ্রাম করতে পারেন, আপনি যখন আপনি রান কলে তাদের পাস, না হলে আপনি GDB বুট আপ. এই ভাবে আপনি বিভিন্ন যুক্তির সাথে আপনার প্রোগ্রাম invoking প্রতিটি সময় রাখতে পারেন. সুতরাং, সঞ্চালন বা আবার, আমি কিছু টাইপ করতে পারেন, এবং এর যাক কি যদি আমরা টাইপ করুন এবং "হ্যালো" দেখুন. সর্বদা আপনি যদি আপনি শুরু থেকে আবার শুরু করতে চান তা জিজ্ঞাসা করবে. সাধারণত, আপনি কি শুরু থেকে আবার শুরু করতে চান. এবং এই সময়ে, এটি পুনরায় আরম্ভ আবার সেটা ছাপে আউট প্রোগ্রাম যা আমরা, চলমান buggy1 যুক্তি হ্যালো সঙ্গে করছেন,, এবং এটি এই মান আউট ছাপে; এটা বলে, "আপনি একজন D পেতে," দুঃখী মুখ. কিন্তু আমরা ফল্ট seg না. এটা বলেন যে প্রক্রিয়া সাধারণত প্রস্থান করেছে. যাতে ভালো দেখায় প্রশংসনীয়. না আরো seg ফল্ট, আমরা এটি অতীত, তাই এটা মনে হচ্ছে যে সত্যিই seg ফল্ট বাগ আমরা পেয়ে ছিল. দুর্ভাগ্যবশত, এটা আমাদেরকে বলে যে, আমরা একটি ডি পেয়ে থাকেন আমরা ফিরে যান এবং কোড তাকান এবং সেখানে কি কি ঘটছে ছিল দেখতে পারেন যাও জিনিসটা কি ছিল - কেন এটা আমাদের বলার ছিল যে আমরা একটি ডি পেয়েছে এর চলুন দেখা যাক এখানে, ছিল printf এই বলে যে আপনি একটি ডি পেয়েছে যদি আমরা তালিকা টাইপ করুন, হিসাবে আপনি টাইপ তালিকা রাখা, এটি রাখে আপনার প্রোগ্রামের মাধ্যমে iterating ডাউন, সুতরাং এটি আপনার প্রথম কয়েক লাইন প্রোগ্রাম আপনাকে দেখানো হবে. তারপর পরবর্তী কয়েক লাইন, এবং পরের খণ্ড খণ্ড এবং পরবর্তী আপনাকে দেখানো হবে. এবং এটা নামা চেষ্টা চালিয়ে যাব. এবং এখন আমরা "নম্বর 16 পরিসীমার বাইরে রেখায়." পাবেন কারণ এটি শুধুমাত্র 15 লাইন আছে. আপনি যদি এই পয়েন্ট পেতে পারেন এবং আপনার হতাশ, "আমি কি করব?" আপনি সাহায্য কমান্ড ব্যবহার করতে পারেন. এবং তারপর সাহায্য এটি একটি কমান্ডের নাম দিন ব্যবহার করুন. এবং আপনি দেখতে GDB দেয় সব উপাদান এই সাজানোর আমাদের. এরা বলছে, "কোন যুক্তি দিয়ে, দশ বা পরে প্রায় আগের তালিকা আরো লাইন তালিকা. তালিকা - দশটার আগে লাইন তালিকা - " সুতরাং আসুন তালিকা বিয়োগ ব্যবহার করার চেষ্টা করুন. এবং যে তালিকা পূর্ববর্তী 10 টি লাইন; আপনি তালিকা সঙ্গে খেলা অল্প কাছাকাছি পারেন. আপনি তালিকা, তালিকা করতে পারেন - এমনকি আপনাকে তালিকা তালিকা 8 মত একটি নম্বর পারেন,, এবং এটি লাইন 8 প্রায় 10 লাইন তালিকা পাবেন. এবং আপনি কি এখানে যাচ্ছে না আপনি একটি সহজ যদি অন্য পেয়েছেন দেখতে পারেন. আপনি যদি CS50 স্কচ টাইপ, সেটা ছাপে আউট "আপনি একটি এ পেতে" অন্যথা এটি ছাপে আউট "আপনি একটি ডি পেতে" অকর্মা শহরে. ঠিক আছে. হ্যাঁ? [ড্যানিয়েল] সুতরাং যখন আমি চেষ্টা কোট ছাড়া CS50 স্কচ করছেন, তাদের মতে "আপনি একটি ডি পেতে" আমি এটা কাজ পেতে কোট প্রয়োজন; কেন হল? >> হ্যাঁ. এটা পরিনত হয় যে যখন - এই একটি মজার সামান্য খোশগল্প - যখন আপনি প্রোগ্রাম চালানো, আমরা যদি এটা চালানো এবং আমরা CS50 স্কচ টাইপ, ঠিক মত Daniel সে কি বলছে, এবং ছিল আপনি Enter, এটি এখনও বলেছেন আমরা একটি ডি পেতে এবং প্রশ্ন, কেন হয় এই? এবং এটি সক্রিয় যে উভয় আমাদের টার্মিনাল এবং GDB এই হিসাবে দুটি পৃথক আর্গুমেন্ট পার্স. কারণ যখন একটি স্থান, যে হিসাবে উহ্য এর আছে প্রথম যুক্তি শেষ; পরের যুক্তি হল লাগা সম্পর্কে. উপায় দুটি যারা মেশা, বা দুঃখিত, ভাগ করে যুক্তি, যাও কোট ব্যবহার করতে হয়. সুতরাং এখন, যদি আমরা কোট মধ্যে এটি করা এবং এটি পুনরায় চালানোর জন্য, আমরা একটি এ পেতে তাই ঠিক সংক্ষিপ্তবৃত্তি যাও, কোন কোট, CS50 এবং স্কচ দুটি পৃথক আর্গুমেন্ট হিসাবে পার্স করা হয়. কোট সঙ্গে, এটি একটি পুরাপুরি আর্গুমেন্ট হিসাবে পার্স এর. আমরা একটি ব্রেকপয়েন্ট সঙ্গে এই দেখতে পারেন. এ পর্যন্ত আমরা করছি আমাদের প্রোগ্রাম, এবং এটা চলমান করা হয়েছে পর্যন্ত এটি হয়ত seg একটি ত্রুটি ফল্ট বা হিট বা পর্যন্ত এবং এটি সব থেকে প্রস্থান সম্পূর্ণভাবে জরিমানা করা হয়েছে করেনি. এটি সবচেয়ে বড় জিনিস অগত্যা, না, কারণ কখনও কখনও আপনি আপনার প্রোগ্রামের মধ্যে একটি ত্রুটি আছে, কিন্তু এটি একটি সেগমেন্টেশন ফল্ট না. এটা বন্ধ করার জন্য আপনার প্রোগ্রাম বা যে ভালো কিছু ঘটাচ্ছে না. উপায় বিরাম একটি নির্দিষ্ট বিন্দু এ GDB পেতে আপনার প্রোগ্রাম একটি ব্রেকপয়েন্ট সেট হয়. হয় আপনি একটি ফাংশন নামের উপর একটি ব্রেকপয়েন্ট সেটিং এটা করতে পারেন অথবা আপনি একটি বিশেষ কোড লাইনে একটি ব্রেকপয়েন্ট সেট করতে পারেন. আমি ফাংশন নামের উপর ব্রেকপয়েন্ট সেট কিনতে, কারণ - সহজ স্মরণ, এবং যদি আপনি আসলে যান এবং একটি সামান্য বিট আপ আপনার সোর্স কোড পরিবর্তন, তারপর আসলে আপনার ব্রেকপয়েন্ট আপনার কোড মধ্যে একই স্থানে থাকবে. যেহেতু আপনি যদি লাইন নম্বর ব্যবহার করছেন, এবং লাইন নম্বর পরিবর্তন কারণ আপনি কিছু কোড যোগ করতে অথবা মুছে ফেলেন, তাহলে আপনার সমস্ত ব্রেকপয়েন্ট সম্পূর্ণই হয় মাতাল আপ. সবচেয়ে সাধারণ জিনিস আমি এক প্রধান ফাংশন একটি ব্রেকপয়েন্ট সেট করা আছে. প্রায়ই আমি GDB আপ বুট করব, আমি বো প্রধান টাইপ করুন, আঘাত লিখুন, করব এবং যে একটি ব্রেকপয়েন্ট সেট করব প্রধান ফাংশন যা বলছেন ঠিক উপর, "প্রোগ্রাম বিরতি যত তাড়াতাড়ি আপনি শুরু চলমান," এবং যে উপায়, যখন আমি,, বলতে সঙ্গে CS50 স্কচ আমার প্রোগ্রাম চালানো হিসাবে দুটি আর্গুমেন্ট এবং আঘাত লিখুন, এটা মূল ফাংশন পায় এবং এটি খুব ডান প্রথম লাইনে স্টপ, ডান আগে এটি strcmp ফাংশন মূল্যায়ন করা. যেহেতু আমি বিরাম দেওয়া করছি এখন, আমি mucking কাছাকাছি এবং এইজন্য কি করছেন শুরু করতে পারেন সঙ্গে বিভিন্ন ভেরিয়েবল যে আমার প্রোগ্রাম পাস হয় সব. এখানে আমি argc আউট মুদ্রণ এবং কি ঘটছে তা দেখতে পারেন. দেখুন যে argc 3, কারণ এতে বিভিন্ন মান 3 এর পেয়েছিলাম. এটি প্রোগ্রাম এর নাম আছে, এটা প্রথম যুক্তি এবং দ্বিতীয় যুক্তি আছে এর. আমরা argv এ খুঁজছেন দ্বারা যারা প্রিন্ট আউট করতে পারেন [0], argv [1], এবং argv [2]. তাই এখন এছাড়াও আপনি দেখতে কেন এই strcmp কল বিফল হবে পারেন, কারণ আপনি দেখতে পাবেন যে দুটি পৃথক আর্গুমেন্ট মধ্যে CS50 এবং স্কচ বিভক্ত আপ নি. এই মুহুর্তে, একবার আপনি একটি ব্রেকপয়েন্ট আঘাত করেছেন, আপনি আপনার প্রোগ্রামের মাধ্যমে পইঠা অবিরত করতে পারেন পাতিপাতি, আপনার প্রোগ্রাম আবার শুরু থেকে ভিন্ন. সুতরাং যদি আপনি আপনার প্রোগ্রাম পুনরায় আরম্ভ এবং ঠিক করতে না চান তাহলে এখানে থেকে অবিরত, আপনি হলে continue কমান্ড ব্যবহার করুন এবং প্রোগ্রাম চালানোর জন্য অবিরত শেষ করা যাবে. ঠিক মত এখানে কি. যাইহোক, যদি আমি প্রোগ্রাম, CS50 স্কচ পুনরারম্ভ, এটা আমার ব্রেকপয়েন্ট আবার হিট সংখ্যা, এবং এই সময়, যদি আমি ঠিক প্রোগ্রাম বাকি মাধ্যমে সব পথ যেতে না চান, আমি পরের কমান্ড, যা আমি n সঙ্গে সংক্ষিপ্ত ব্যবহার করতে পারেন. এবং এই প্রোগ্রামটি লাইন মাধ্যমে লাইন দ্বারা পইঠা হবে. সুতরাং আপনি জিনিস হিসাবে চালানো হিসাবে ভেরিয়েবল পরিবর্তন ঘড়ি,, পারেন হিসাবে জিনিষ আপডেট পেতে. যা বেশ চমৎকার. অন্যান্য শীতল জিনিস বরং এবং বহুবার উপর একই কমান্ড আবার পুনরায় তুলনায়, আপনি যদি শুধুমাত্র লিখুন আঘাত - এখানে যাতে আপনি দেখতে আমি কিছু টাইপ না - যদি আমি আঘাত লিখুন, এটি পূর্ববর্তী কমান্ডের পুনরাবৃত্তি করবেন, অথবা আগের GDB কমান্ড যে আমি ইন করা আমি আঘাত লিখুন এবং রাখা এটা আমার লাইন কোড দ্বারা লাইন মাধ্যমে সরে যাব পারেন. আমি আপনাকে বলছি অন্যান্য বগী প্রোগ্রাম চেক আউট হিসাবে ভাল যেতে উত্সাহিত করবে. আমরা সব তাদের আজকের মধ্যে বিভাগের মাধ্যমে পেতে সময় নেই. সোর্স কোড আছে, তাই আপনি কি ঘটছে তা দেখতে ধরনের পারেন লোকচক্ষুর অন্তরালে যদি সত্যিই আপনি আটকে যান, কিন্তু অন্ততপক্ষে, শুধুমাত্র বুট করার GDB আপ অভ্যাস, প্রোগ্রাম পর্যন্ত এটি আপনাকে বিরতি, backtrace পেয়ে, figuring কি কাজ ক্র্যাশ মধ্যে ছিল, এটা কি লাইন ছিল, মুদ্রণ কিছু পরিবর্তনশীল মান আউট, ঠিক তাই আপনি এটি জন্য একটি অনুভূতি, পান, কারণ এটি আপনাকে আপনার এগিয়ে যাওয়া হবে. এই মুহুর্তে, আমরা GDB আউট করে প্রস্থান করার, যা আপনি ব্যবহার করে প্রস্থান করার জন্য q ও বা কি ঠিক চলুন. যদি আপনার প্রোগ্রাম এখনও মাঝখানে হয়, এবং এটি থেকে প্রস্থান না করেনি, সবসময় এটি আপনাকে জিজ্ঞাসা করবে "আপনি কি নিশ্চিত আপনি সত্যিই ছেড়ে দিতে চান?" আপনি শুধু হ্যাঁ আঘাত করতে পারেন. এখন আমরা পরবর্তী সমস্যাটি আমরা আছে, যা বিড়াল প্রোগ্রাম তাকান চলুন. আপনি যদি পুনঃচালিত এবং পাইপের ছোট ঘড়ি, আপনি যে টমি ব্যবহার করে এই প্রোগ্রাম দেখতে পাবেন মূলত পর্দায় সমস্ত একটি ফাইল আউটপুট ছাপে. সুতরাং যদি আমি বিড়াল চালানো, সে আসলে এই যন্ত্র একটি বিল্ট ইন প্রোগ্রাম, এবং যদি আপনি Macs-আছে আপনি আপনার Mac খুব এই কাজ করতে পারেন, যদি আপনি টার্মিনাল খুলুন. এবং আমরা - বিড়াল, এর cp.c বলে, যাক, এবং লিখুন আঘাত. কি করেন, যদি আমরা একটি স্ক্রল আপ সামান্য বিট এবং যেখানে আমরা লাইন দৌড়ে দেখতে, অথবা যেখানে আমরা cat কমান্ডের দৌড়ে, আক্ষরিক এটা ছাপা আমাদের পর্দায় cp.c বিষয়বস্তু আউট. আমরা এটিকে আবার চালানো এবং আপনি একসাথে একাধিক ফাইল স্থাপন করা যাবে. সুতরাং আপনি বিড়াল cp.c করবেন, এবং তারপর আমরা cat.c ফাইল কনক্যাটেনেট করতে পারেন, যা প্রোগ্রাম আমরা সম্পর্কে লিখুন, এবং এটি উভয় ফাইল ফিরে মুদ্রণ আমাদের পর্দায় ব্যাক যাবেন. তাই আমরা যদি একটু স্ক্রল আপ বিট, আমরা দেখতে যে, যখন আমরা এই বিড়াল cp.c, cat.c দৌড়ে, এটি প্রথম মুদ্রিত cp ফাইল, এবং তারপর এটিকে নীচে, এটি মুদ্রিত cat.c ফাইল ডানে নিচে এখানে. আমরা শুধু আমাদের এই ফুট ভিজা ব্যবহার চলুন. টার্মিনালে সহজ মুদ্রণ সঙ্গে প্রায় খেলুন, কিভাবে কাজ করে. আপনি যদি না gedit cat.c সঙ্গে পূর্ণপ্রকাশিত, আঘাত লিখুন, আপনার প্রোগ্রাম যে আমরা লিখুন সম্বন্ধে দেখতে পারেন. আমরা এই সুন্দর বয়লার প্লেট অন্তর্ভুক্ত করেছেন, তাই আমরা সব সময় যে আউট টাইপ ব্যয় করতে হবে না. আমরা আর্গুমেন্টের সংখ্যা পাস চেক আমরা মুদ্রণ একটি চমৎকার ব্যবহার বার্তা আউট. এই জিনিস যে, আবার মত, আমরা যে বিষয়ে কথা বলছি করছি ধরণের, এটি প্রায় পেশী মেমরি মত. শুধুমাত্র স্টাফ একই সাজানোর কাজ স্মরণ রাখা এবং সর্বদা মুদ্রণ সহায়ক বার্তা কিছু সাজানোর আউট মানুষ যাতে জানতে কিভাবে আপনার প্রোগ্রাম চালানোর জন্য. বিড়াল সঙ্গে, এটা বেশ সহজ; আমরা ঠিক করছি বিভিন্ন আর্গুমেন্ট সমস্ত মধ্য দিয়ে যেতে যাচ্ছে যে আমাদের প্রোগ্রাম, পাস এবং আমরা মুদ্রণ চলুন ছিল তাদের একটি সময়ে পর্দায় এক বিষয়বস্তু আউট. যাতে ফাইল প্রিন্ট আউট পর্দা যাও, আমরা কিছু খুব অনুরূপ করতে যাচ্ছেন আমরা কী ব্যঙ্গ শেষে কি. ব্যঙ্গ, যে প্রোগ্রাম ভাড়া শেষে, আমরা একটি ফাইল খুলুন ছিল, এবং তারপর আমরা তা মুদ্রণ করা ছিল. এই ক্ষেত্রে, আমরা একটি ফাইল খুলে যাচ্ছে, এবং করছি আমরা তা থেকে পরিবর্তে পড়তে যাচ্ছেন. তারপর আমরা পরিবর্তে একটি ফাইল প্রিন্ট চলুন, আমরা পর্দায় প্রিন্ট চলুন. পর্দায় আপনাকে সব করেছি printf সঙ্গে কাজ করার আগে তাই ছাপাই. যাতে খুব পাগল না. কিন্তু একটি ফাইল পড়া হয় অদ্ভুত ধরনের. আমরা যে অল্প মাধ্যমে একটি সময়ে যাবেন. যদি আপনি না যে শেষ সমস্যা যান আপনার ব্যঙ্গ, সমস্যা 33 আবার, প্রথম পংক্তিতে যে আমরা এখানে করতে যাচ্ছেন, ফাইল খোলার, এটা কি আমরা সেখানে কি অনুরূপ. তাই স্টেলা, কি যে, যেমন যখন আমরা একটি ফাইল খুলুন লাইন বর্ণন আছে? [স্টেলা] ক্যাপিটাল ফাইল *, ফাইল - >> ঠিক আছে. >> - সমান fopen যাও. >> হ্যাঁ. যা এই ক্ষেত্রে হয়? এটা মন্তব্যে এর. >> এটা মন্তব্যে এর? argv [i] এবং কিছু? >> যথাযথভাবে. অধিকারের. তাই স্টেলা এর সম্পূর্ণ অধিকার. এটা কি লাইন মত দেখাচ্ছে. আমরা একটি ফাইল প্রবাহ পরিবর্তনশীল, পেতে একটি ফাইল * মধ্যে এটি সংরক্ষণ যাচ্ছে, তাই করছি সব ক্যাপ, ফাইল, *, এবং এই পরিবর্তনশীল নামের ফাইল হতে হবে. আমরা এটা বলতে পেরেছিলাম যাই হোক না কেন আমরা চাই. আমরা এটা first_file, বা file_i, যাই হোক না কেন আমরা চাই কল করতে পারেনি. এবং তারপর ফাইল নামের উপর এই প্রোগ্রামের কমান্ড লাইন এ প্রেরণ করা হত. সুতরাং argv সঞ্চিত [i] এবং তারপর আমরা পড়তে মোডে এই ফাইলটি খুলতে যাচ্ছেন. এখন আমরা যে ফাইল খোলা, কি ব্যাপার যে আমরা সবসময় কি স্মরণ আছে যখনই আমরা একটি ফাইল খোলা করেছি? এটা বন্ধ করুন. তাই দু: আমরা কিভাবে একটি ফাইল বন্ধ করবেন? [দু] fclose (ফাইল) >> fclose (ফাইল). ঠিক. গ্রেট. ঠিক আছে. যদি আমরা এই মন্তব্যটি ঠিক না তাকান, এটা বলে, "খুলুন argv [i] এবং stdout-এর বিষয়বস্তু. মুদ্রণ" স্ট্যান্ডার্ড আউট একটি অদ্ভুত নাম. Stdout-এ ঠিক বলছে আমাদের উপায় আমরা টার্মিনালে এটি প্রিন্ট করতে চান; আমরা স্ট্যান্ডার্ড আউপুট প্রবাহে তা প্রিন্ট করতে চান. আমরা আসলে পেতে এই মন্তব্যটি পরিত্রাণ অধিকার এখানে করতে পারেন. আমি তা কপি করুন এবং তা থেকে যে কি আমরা কি আটকান যাচ্ছি. এই পর্যায়ে এখন, আমরা বিট দ্বারা ফাইল বিট পড়া আছে. আমরা পড়া ফাইলের উপায় কয়েক আলোচনা করেছি. কোন কোনটি আপনার পছন্দসই এতদূর? কোন উপায় আছে দেখা বা না আপনি ফাইল পড়া, মনে পড়ে? [ড্যানিয়েল] fread? >> Fread? সুতরাং fread এক. জিমি, আপনি কোনো অন্যদের জানি? [জিমি] নং >> ঠিক আছে. না. Charlotte? আলেকজান্ডার? কোন অন্যদের? ঠিক আছে. সুতরাং অন্যান্য বেশী হয় fgetc, এক যে আমরা অনেক ব্যবহার করব না. এর রয়েছে fscanf; আপনি না একটা প্যাটার্ন এখানে দেখতে? তারা সব চ সঙ্গে লাগা. কিছু একটি ফাইল না. Fread আছে, fgetc, fscanf. এগুলি পড়া র সমস্ত কর্ম ব্যবহার. লেখা আমরা fwrite আছে, আমরা এর পরিবর্তে fgetc fputc আছে. আমরা fprintf আমরা ব্যঙ্গ উপর করাত আছে চাই. যেহেতু এটি একটি সমস্যা যে এতে একটি ফাইল থেকে পড়া, আমরা এই তিনটি ফাংশন ব্যবহার চলুন. আমরা এই ফাংশন নিচে এখানে ব্যবহার করতে বলছে না. এই ফাংশন স্ট্যান্ডার্ড ইনপুট / আউটপুট লাইব্রেরি সব পাওয়া যায়. তাই আপনি যদি এই প্রোগ্রামের উপরে তাকান, আপনি যে ইতিমধ্যে আমরা স্ট্যান্ডার্ড ইনপুট / আউটপুট গ্রন্থাগারের জন্য হেডার ফাইলটি অন্তর্ভুক্ত করেছেন দেখতে পারেন. যদি আমরা চিন্তা করতে চান যা আমরা ব্যবহার করতে চান, আমরা সবসময় খোলা man পৃষ্ঠাগুলি আপ করতে পারেন. সুতরাং আমরা মানুষ stdio টাইপ করতে পারেন এবং stdio সি ইনপুট এবং আউটপুট কর্ম সম্পর্কে সব পড়া এবং ইতিমধ্যে আমরা দেখতে পারেন উহু, চেহারা. এটা fgetc এর উল্লেখও, এটি fputc উল্লেখ না. সুতরাং আপনি একটি সামান্য বিট নিচে কসরত এবং তাকান, বলতে পারেন, fgetc এবং এ সংশ্লিষ্ট man পৃষ্ঠা দেখুন. আপনি যে এটি একটি অন্যান্য কার্যাবলী আভা সঙ্গে যায় বরাবর দেখতে পারেন: fgetc, fgets, getc, getchar, পায়, ungetc, এবং অক্ষর এবং স্ট্রিং এর ইনপুট. তাই এই ভাবে অক্ষর এবং স্ট্রিং আমরা স্ট্যান্ডার্ড ইনপুট থেকে ফাইল থেকে পড়া, যা ব্যবহারকারী থেকে মূলত হয়. এবং এই ভাবে আমরা প্রকৃত সি মধ্যে তা করে তাই এই GetString এবং GetChar ফাংশন ব্যবহার করছে না আমরা যে লাইব্রেরি CS50 থেকে ব্যবহৃত. আমরা উপায়ে একটি দম্পতি এই সমস্যা কি যাচ্ছেন যাতে আপনি দুটি এরকম বিভিন্ন উপায় দেখতে পারেন. উভয় fread ফাংশন যে ড্যানিয়েল উল্লেখ করেছে এবং fgetc ভাল উপায় এটা. আমি মনে করি fgetc হয় একটু সহজ, কারণ শুধু এটা আছে, হিসাবে আপনি দেখুন, এক যুক্তি, ফাইল * যে আমরা চরিত্র থেকে পড়ার চেষ্টা করছি, এবং তার ফিরতি মূল্য হল কোন int. এবং এই সামান্য একটি বিভ্রান্তিকর, ডান? কারণ আমরা একটি চরিত্র পেয়ে করছি, তাই কেন আছে এই একটি ফিরতি গৃহস্থালির কাজ না? আপনি না কেন এই একটি গৃহস্থালির কাজ না ফিরে হতে পারে কোনো ধারনা আছে? [দু উত্তর, অপাচ্য] >> হ্যাঁ. তাই দু এর সম্পূর্ণ অধিকার. এটি যদি ASCII তারপর, এই একটি পূর্ণসংখ্যা প্রকৃত গৃহস্থালির কাজ করা যাবে ম্যাপ. একটি ASCII অক্ষর, এবং এটি ঠিক করা যায়নি. এটা ঠিক কি ঘটছে. আমরা কোন int সহজভাবে ব্যবহার করছেন, কারণ এটি আরো বিট আছে. এটি একটি গৃহস্থালি চেয়ে বড়; আমাদের গৃহস্থালির কাজ শুধুমাত্র 8 বিট হয়েছে, আমাদের যে 32 বিট মেশিনের 1 বাইট. এবং কোন int স্থান সমস্ত 4 বাইট 'মূল্য আছে. এবং এটি সক্রিয় যে উপায় fgetc কাজ করে, যদি আমরা আমাদের সংক্ষিপ্তসার মধ্যে স্ক্রোল এই man পৃষ্ঠা অল্প ডাউন, সমস্ত উপায় নিচে স্ক্রোল করুন. এটি সক্রিয় করে বলেন যে তারা এই বিশেষ মান নামক ফাইলের শেষে ব্যবহার. এটা একটা fgetc ফাংশন ফিরতি মূল্য হিসাবে বিশেষ ধ্রুবক যখনই আপনি ফাইলের শেষে আঘাত অথবা আপনি যদি একটি ভুল পান. এবং এটি সক্রিয় যে ফাইলের শেষে সঙ্গে সঠিকভাবে এই তুলনা না, আপনি কোন int সেই তথ্য আমরা অতিরিক্ত পরিমাণ যে আপনি আছে চাই একটি গৃহস্থালি ভেরিয়েবল ব্যবহার থেকে ভিন্ন. যদিও কার্যকরভাবে fgetc একটি ফাইল থেকে একটি চরিত্র পেয়ে, আপনি যে কোন কিছু টাইপ int-এর যে আপনি ফিরে না স্মরণ করতে চান. তাই বলা হয়, এটা মোটামুটি ব্যবহার করা সহজ. এটা আমাদের একটি অক্ষর দিতে যাচ্ছে; তাই আমরা সব করতে হবে তা হচ্ছে ফাইল জিজ্ঞাসা রাখা, "সম্পর্কে পরবর্তী অক্ষর দিন সম্পর্কে পরবর্তী অক্ষর দিতে, সম্পর্কে পরবর্তী অক্ষর দিতে," যতক্ষণ না আমরা ফাইলের শেষে পেতে. এবং যে ফাইল থেকে একটি একটি অক্ষর আমাদের সময় টান মারা হবে, এবং তারপর আমরা যাই হোক না কেন আমরা এটা দিয়ে করতে পারেন. আমরা এটি সঞ্চয় করতে পারেন, আমরা এটি একটি পংক্তি, যুক্ত করার জন্য আমরা এটা প্রিন্ট আউট করতে পারেন. যে কোনো কি. Zooming হঠা এবং আমাদের cat.c প্রোগ্রাম ফিরে যাওয়া, যদি আমরা fgetc ব্যবহার করতে যাচ্ছেন, কিভাবে এই কোড এর পরের লাইন আমরা অগ্রসর হতে পারে? আমরা ব্যবহার চলুন - fread কিছু কিছুটা ভিন্ন করবেন. এবং এই সময়, আমরা fgetc এক সময়ে এক অক্ষর ব্যবহার করছেন পেতে যাচ্ছে. একটি সম্পূর্ণ ফাইল প্রক্রিয়া, আমরা কি কি থাকতে পারে? কত অক্ষরের একটি ফাইলে আছে? অনেক আছে. সুতরাং আপনি সম্ভবত একটি পেতে চাই এবং তারপর অন্য পেতে পেতে এবং অন্য আরেকটি পেতে. অ্যালগোরিদম কি ধরনের আপনি মনে করেন আমরা এখানে ব্যবহার থাকতে পারে? কি ধরনের -? [আলেকজান্ডার] একটি লুপ জন্য? >> যথাযথভাবে. লুপ কিছু টাইপ. একটি লুপ জন্য এই ক্ষেত্রে প্রকৃতপক্ষে মহান,. এবং বলছে আপনি ভালো ছিল, শোনাচ্ছে ভালো আপনি সম্পূর্ণ ফাইল উপর একটি লুপ করতে চান, একটি সময়ে একটি চরিত্র পেয়ে. কি যে কোন পরামর্শ অনুরূপ হতে পারে? [আলেকজান্ডার, অপাচ্য] >> ঠিক আছে, শুধু ইংরেজী সম্পর্কে আপনি কি চেষ্টা করছেন? [আলেকজান্ডার, অপাচ্য] তাই এই ক্ষেত্রে, আমরা ঠিক মত শোনাচ্ছে সম্পূর্ণ ফাইল উপর লুপ যাও চেষ্টা করছি. [আলেকজান্ডার] সুতরাং আমি > মাপ -? আমি ফাইলের আকার অনুমান অধিকার,? আকার - we'll এটা ভালো লেগেছে লিখুন. সময় ফাইলের আকার হচ্ছে, আমি +. সুতরাং দেখা যাচ্ছে যে ভাবে আপনি এই না fgetc ব্যবহার করে, এবং এই হল নতুন, যে কোন সহজ উপায় নেই শুধু একটি ফাইলের আকার পেতে আছে সঙ্গে এই "sizeof" যে আপনি আগে দেখা করেছি গড়া ধরণ. যখন আমরা যে fgetc ফাংশান ব্যবহার, আমরা কিছু ধরনের পরিচায়ক করছি নতুন, এই ভীতু লুপ জন্য বাক্য গঠন, যেখানে পরিবর্তে শুধুমাত্র একটি মৌলিক পাল্টা ব্যবহার যাও অক্ষর দ্বারা অক্ষর যান, আমরা এক সময়ে এক অক্ষর বৈঠাচালনা চলুন, একটি সময়ে একটি অক্ষর, এবং আমরা জানি যে আমরা পথ শেষে করছি হয় আমরা যখন হইনি করেছি একটি নির্দিষ্ট সংখ্যক অক্ষর গণনা, কিন্তু আমরা যখন অক্ষর বৈঠাচালনা আউট হয় যে ফাইলটি বিশেষ অক্ষর শেষ. সুতরাং আমরা এই দ্বারা করতে পারেন - আমি এই ch কল, এবং আমরা এটি আরম্ভ চলুন আমাদের সাথে প্রথম কল যাও ফাইল আউট প্রথম অক্ষরটি পেতে. এই অংশ ঠিক তাই, এই একটি অক্ষর ফাইল পেতে যাচ্ছে এবং পরিবর্তনশীল ch মধ্যে এটি সঞ্চয়. আমরা এই কাজ রাখা যাচ্ছে না হওয়া পর্যন্ত আমরা ফাইলের শেষে পেতে করছি, যা আমরা অক্ষর সমান যে বিশেষ অক্ষর ফাইলের শেষে যাও না করার জন্য পরীক্ষার দ্বারা. এবং তারপর পরিবর্তে ch করছেন + + ', যা শুধু মান বাড়াতে হবে, তাই আমরা যদি একটি ফাইলের একটি আউট, একটি একটি মূলধন, বলা, পড়া, ch + বো আমাদের দিতে, এবং তারপর আমরা সি এবং তারপর ঘ পেতে চাই না. এটা স্পষ্ট যে আমরা কি করতে চান না. চাই কি এখানে আমরা এই শেষ বিট আমরা হয় ফাইল থেকে পরবর্তী অক্ষর পেতে চান. সুতরাং কিভাবে ফাইল থেকে পরবর্তী অক্ষর আমরা পেতে পারে? কিভাবে আমরা ফাইল থেকে প্রথম অক্ষরটি পেতে পারি? [ছাত্র] fgetfile? >> Fgetc, বা দুঃখিত, আপনি ছিল সম্পূর্ণ সঠিক. আমি এটি misspelled অধিকার আছে. হাঁ তাই. এখানে পরিবর্তে ch করছেন + + ', আমরা ঠিক করছি fgetc আবার (ফাইল) কল যাচ্ছে এবং আমাদের একই ch পরিবর্তনশীল ফলাফল সঞ্চয়. [ছাত্র প্রশ্ন, অপাচ্য] >> এটি যেখানে এই ফাইল * ছেলেরা বিশেষ. উপায় তারা কাজ হল তারা - যখন প্রথম আপনি খুলুন - যখন প্রথম আপনি যে fopen কল করতে, ফাইল * কার্যকরভাবে ফাইলের শুরুতে একটি পয়েন্টার হিসেবে কাজ করে. এবং তারপর প্রতি সময় আপনি কল fgetc, এটি ফাইল মাধ্যমে একটি অক্ষর চলে আসে. তাই যখনই আপনি এই কল, আপনি একটি অক্ষর দ্বারা ফাইল পয়েন্টার করছি বৃদ্ধিশীল. এবং যখন আপনি আবার fgetc, আপনি এটি অন্য অক্ষর চলন্ত করছি এবং অন্য অক্ষর এবং অন্য অক্ষর এবং অন্য চরিত্র. [ছাত্র প্রশ্ন, অপাচ্য] >> এবং that's - হাঁ. এটা ফণা এর অধীন এই জাদু ধরনের. আপনি শুধুমাত্র বৃদ্ধিশীল মাধ্যমে রাখা. এই সময়ে, আপনি আসলে একটি অক্ষর দিয়ে কাজ করতে পারবেন. সুতরাং কিভাবে পর্দায় আমরা এই আউট, মুদ্রণ এখন হতে পারে? আমরা একই printf জিনিস যে আমরা আগে ব্যবহৃত ব্যবহার করতে পারেন. যে আমরা আসছি সব সেমেস্ত্র ব্যবহার করে. আমরা printf কল করতে পারেন, এবং আমরা অক্ষর ঠিক মত পাস করতে পারেন. আরেকটি উপায় এটা বরং printf ব্যবহার করে এবং এই বিন্যাসে স্ট্রিং না থাকার চেয়ে, আমরা অন্য ফাংশন ব্যবহার করতে পারবেন. আমরা fputc, যা পর্দায় একটি ছাপে অক্ষর ব্যবহার করতে পারেন, ছাড়া যদি আমরা fputc তাকান - আমাকে একটু বিট জুম আউট. আমরা দেখতে কি সুন্দর এটা অক্ষর লাগে যে আমরা পড়তে fgetc আউট ব্যবহার করে, কিন্তু পরে আমরা তা মুদ্রণ করা একটি স্ট্রিম করা আছে. আমরা putchar ফাংশন, যা মান আউট সরাসরি করা ব্যবহার করতে পারেন. সুতরাং একজন বিভিন্ন বিকল্প ব্যবহার করতে পারেন যে আমরা ছাপানোর জন্য আভা আছে. ঐগুলি স্ট্যান্ডার্ড ইনপুট / আউটপুট লাইব্রেরি সব. যখনই আপনি প্রিন্ট করতে চান - ডিফল্ট তাই printf,, স্ট্রিম আউট বিশেষ মান প্রিন্ট করা, যা যে stdout-এ. সুতরাং আমরা এটা এই জাদু মান, এখানে stdout-এ ধরনের হিসাবে পাঠাতে পারেন. ওহো. সেমিকোলন বাইরে রাখুন. এই হল নতুন, এখানে ভীতু তথ্য অনেক. এই অনেক, এই অর্থে যে এই কোড খুব বাগ্বৈশিষ্ট্যসম্মত, যে এই ভাবে করা ঠিক না কারণ এটি যাও, পড়তে পড়তে সহজ পরিষ্কার. অনেক বিভিন্ন উপায় এটা, আপনি অনেক বিভিন্ন ফাংশন ব্যবহার করতে পারে, কিন্তু আমরা শুধু বারংবার এই একই নিদর্শন অনুসরণ ঝোঁক. তাই আপনি যদি এই উত্ক্রান্ত আবার এবং আবার ভালো কোড দেখতে বিস্মিত হইনি করা হবে না. ঠিক আছে. এই মুহুর্তে, আমরা দিনের জন্য বিরতি প্রয়োজন. আসার জন্য ধন্যবাদ. পর্যবেক্ষক যদি আপনি অনলাইন জন্য ধন্যবাদ. এবং আমরা আপনাকে দেখতে আগামী সপ্তাহে যাব. [CS50.TV]