[Powered by Google Translate] [অনুচ্ছেদ 5 - আরো আরামদায়ক] [Rob Bowden - হার্ভার্ড বিশ্ববিদ্যালয়] [এটি CS50. - CS50.TV] ভালো লেগেছে আমি আমার ইমেল বলেন, যা আপনি ব্যবহার করতে পারেন অনেক আছে প্রয়োগ যাও আসলে সমস্যা সেট করবেন ছাড়া অন্য. আমরা আপনাকে সুপারিশ প্রয়োগ মধ্যে এটি ঠিক কারণ তাহলে আমরা আপনাকে আরো সহজে সাহায্য করতে পারেন এবং আমরা জানতে পারি কিভাবে সবকিছু কাজ করে যাচ্ছে. কিন্তু যেখানে আপনি এই ধরনের জিনিস যদি, বলতে পারেন একটি উদাহরণ হিসাবে, আপনি ব্যবহার না একটি যন্ত্র অথবা আপনি বিজ্ঞান কেন্দ্র বুনিয়াদ হিসেবে কাজ করতে চান - যা আসলে তারা প্রয়োগ খুব আছে - যদি আপনি কোথাও কাজ করতে চান. একটি উদাহরণ হল আপনি হয় দেখা / SSH 'র শুনেছেন? SSH-র সাথে সংযোগ কিছু ঠিক মত মূলত. বাস্তবিক, এখন আমি ডান প্রয়োগ মধ্যে SSHed করছি. আমি সরাসরি কাজ প্রয়োগ না. এখানে যন্ত্রপাতি, এবং যদি আপনি দেখুন এখানে নিচে আপনি এই IP ঠিকানা দেখতে পাবেন. আমি নিজেই যন্ত্র কাজ না; আমি সবসময় একটি iTerm2 উইন্ডো / টার্মিনাল উইন্ডোর মাধ্যমে আসা. আপনি SSH-র মাধ্যমে যে আইপি ঠিকানা, ssh-র jharvard@192.168.129.128 করতে পারেন. আমি যে নম্বর মনে রাখা খুব সহজে কারণ এটা যেমন একটি সুন্দর প্যাটার্ন. কিন্তু যে আমার পাসওয়ার্ড জন্য সম্পর্কে জিজ্ঞেস করা এবং এখন আমি প্রয়োগ করি. এই সময়ে, মূলত যদি আপনি উন্মুক্তকারী যন্ত্রপাতি নিজে এর ভিতরে একটি টার্মিনাল আপ, এই ইন্টারফেস, তবে আপনি এটি ব্যবহার করেন, ঠিক একই ইন্টারফেস হিসাবে আমি উপর এখানে ব্যবহার করছি কিন্তু এখন আপনি SSHed করছি. আপনি SSH-প্রয়োগ যাও যাও নেই. অন্য জায়গায় আপনি SSH-পারা এর একটা উদাহরণ হল আমি চমত্কার নিশ্চিত করুন যে আপনি ডিফল্ট আছে - ওহ. বৃহত্তর. আপনার সমস্ত FAS সার্ভারের ডিফল্ট FAS অ্যাকাউন্ট দ্বারা থাকা উচিত. আমার জন্য, আমি rbowden@nice.fas.harvard.edu SSH-কি. এটি আপনি যে প্রথমবার জিজ্ঞাসা যাচ্ছে, এবং এর আপনাকে হ্যাঁ বলার জন্য. আমার পাসওয়ার্ড ঠিক না আমার FAS পাসওয়ার্ড হবে. তাই এখন, আমি চমৎকার সার্ভার যাও, SSHed এবং আমি কিছু আমি এখানে চান করতে পারেন না. ক্লাস আপনি 124 মত নিতে পারে, অনেক আপনাকে এখানে আপলোড উপাদান আছে, যাচ্ছি প্রকৃতপক্ষে আপনার সমস্যা সেট জমা দিতে হবে. কিন্তু বলতে আপনি আপনার প্রয়োগ অ্যাক্সেস নেই. এর পরে আপনি এই ধরনের জিনিস, এখানে মত কথাই পারেন - এটা একটা প্রশ্ন আমাদের অধ্যায়. এটি প্রয়োগ করি আপনাকে জিজ্ঞাসা করবে. পরিবর্তে আমি সার্ভারে এটি করব. আমি যে আনজিপ যাচ্ছি. সমস্যা যে আপনি ভালো কিছু gedit ব্যবহার করে ব্যবহার করতেন হবে বা প্রকরণ যাই হোক না কেন এর ভিতরে. আপনি FAS সার্ভার আছে চলুন না. এটা সব ঠিক এর এই টেক্সচুয়াল ইন্টারফেস হবে. তাই আপনি, হয় একটি টেক্সট এডিটর যা তারা না জানার চেষ্টা করে দেখতে পারেন. তারা Nano আছে. Nano সাধারণত বেশ ব্যবহার করা সহজ. আপনি আপনার অবস্থিত তীরচিহ্নগুলি ব্যবহার করে এবং সাধারণত টাইপ করতে পারেন. যাতে শক্ত না. আপনি যদি সত্যিই অভিনব পেতে চান তাহলে আপনি Emacs ব্যবহার করতে পারেন, যার ফলে সম্ভবত আমি খোলা কারণ আমি কিভাবে Emacs নিকট এমন কি এটাও জানেন না তাদের উচিত ছিল. এক্স কন্ট্রোল, কন্ট্রোল সি? হাঁ. অথবা আপনি তেজ, যা কি আমি ব্যবহার করতে পারেন. তাই যারা আপনার অপশন. যদি আপনি তা করতে না চান, আপনি, এছাড়াও আপনি যদি তাকান manual.cs50.net-পারেন - ওহ. একটি পিসি অন, আপনি SSH-পুটিং ব্যবহার করতে পারেন, যা আপনার আলাদাভাবে ডাউনলোড আছে চলুন. একটি Mac এ, শুধুমাত্র ডিফল্ট ব্যবহারের দ্বারা টার্মিনাল অথবা আপনি করতে পারেন iTerm2 ডাউনলোড, যা একটা চমৎকার, অভিনব টার্মিনাল ভালো হয়. আপনি যদি manual.cs50.net যান আপনি নোটপ্যাড একটি লিঙ্ক দেখতে পাবেন + + ', যা কি আপনি একটি পিসি ব্যবহার করতে পারবেন. এটা আপনাকে নোটপ্যাড থেকে এসএফটিপি + + ', যা মূলত SSH-র মাধ্যমে. এই কি কি করা হয় আপনার ফাইল স্থানীয়ভাবে সম্পাদনা, এবং তারপর যখনই আপনি তাদের সংরক্ষণ করতে চান, এটা nice.fas সংরক্ষণ করতে হবে, যেখানে আপনি তা রান করতে পারেন. এবং একটি Mac-সমতুল্য TextWrangler হবে. সুতরাং আপনাকে একই জিনিস করে. এটি আপনাকে বিভিন্ন ফাইল এডিট এবং স্থানীয়ভাবে nice.fas তাদের সংরক্ষণ, যেখানে আপনি তা রান করতে পারেন. তাই আপনি যদি কখনও কোনও যন্ত্র ছাড়া আটকে, আপনি এই বিকল্প আছে আপনার সমস্যা সেট না এখনও. এক সমস্যা যে আপনি CS50 লাইব্রেরি আছে চলুন না হবে কারণ nice.fas ডিফল্টরূপে যে নেই. হয় আপনি CS50 লাইব্রেরি ডাউনলোড করে নিতে পারেন - আমি আমি এই সময়ে যে প্রয়োজন মনে করি না. হয় আপনি CS50 লাইব্রেরি ডাউনলোড করুন এবং এটি কপি nice.fas মাধ্যমে করতে পারেন, অথবা আমি মনে করি এই সময়ে আর আমরা ব্যবহার করি না যে কোনোভাবে. অথবা যদি আমরা না, সময়ের জন্য আপনি এটি করতে পারেন হচ্ছে প্রতিস্থাপন করুন CS50 লাইব্রেরি ফাংশন যাইহোক বাস্তবায়নের. যাতে একটি সীমাবদ্ধতার কারণে যে অনেক উচিত নয়. এবং যে যে. আমি যন্ত্রপাতি যেতে এখন ফিরে যাব; আমরা প্রয়োগ সবকিছুই করব. দেখার জন্যে শুরুতে প্রশ্নের আমাদের অধ্যায় এ,, যেমন আমি আমার ইমেল বলেন, আমরা এক সংক্ষিপ্ত আপনার দেখতে অনুমিত হয় কথা বলার আছে. আমরা পুনঃনির্দিষ্ট & পাইপ এবং এই তিনটি প্রশ্ন আছে. যা প্রবাহ ফাংশন ভালো ডিফল্টরূপে printf লিখুন না? সুতরাং প্রবাহ. একটি প্রবাহ কি? স্ট্রিম মূলত মত এটি শুধু কিছু - এটা এমনকি 1s এবং 0 সেঃ একটি উৎস. এটি স্ট্রিম এখানে জন্য জিজ্ঞেস প্রমিত আউট. তাই মান আউট একটি প্রবাহ যে যখন আপনি এটা লিখতে, এটা পর্দায় প্রদর্শিত হবে. স্ট্রিম দ্বারা স্ট্যান্ডার্ড আউট,, এটা মানে আপনি শুধুমাত্র এবং 1s 0 সেঃ এটা লিখতে, এবং মান আউট অপর প্রান্তের ঠিক যে প্রবাহ থেকে সার্চ. এটি শুধু 1s এবং 0 সেঃ একটি পংক্তি. আপনি স্ট্রিম বা আপনি স্ট্রিম থেকে পড়তে পারেন লিখতে পারেন আসলে কি স্ট্রীম টি উপর নির্ভর করে. অন্য দুটি ডিফল্ট স্ট্রিম হয় এবং ভুল করে প্রমিত মান. স্ট্যান্ডার্ড হয় যখনই আপনি GetString না, এটা করার জন্য আপনাকে ইনপুট স্টাফ এর অপেক্ষা. সুতরাং আপনার জন্য অপেক্ষা করছে, এটা আসলে প্রমাণ উপর এর অপেক্ষা, যা সত্যিই কি আপনি পান, তখন আপনি কীবোর্ড এ টাইপ করুন. এখনো সদস্য না মান মধ্যে টাইপ করছেন স্ট্যান্ডার্ড ত্রুটি প্রমিত আউট মূলত সমতুল্য, কিন্তু এটা যে বিশেষ যখন আপনি স্ট্যান্ডার্ড ত্রুটির মুদ্রণ, শুধু আপনি যে ত্রুটির বার্তা মুদ্রণ অনুমিত করছি তাই আপনি নিয়মিত ছাপা পর্দায় বার্তা মধ্যে পার্থক্য করতে পারেন প্রমিত বনাম ত্রুটি কিনা তারা আউট বা মান ত্রুটির বার্তাগুলি গিয়েছিলাম উপর নির্ভর করে. কোন ফাইল খুব. স্ট্যান্ডার্ড আউট, প্রমাণ, এবং মান ত্রুটি শুধু বিশেষ স্ট্রিম, কিন্তু সত্যিই কোনো ফাইল, যখন আপনি একটি ফাইল খুলুন, তা বাইট একটি প্রবাহ যেখানে শুধু আপনি যে প্রবাহ থেকে পড়তে পারেন. অধিকাংশ অংশ জন্য আপনি, শুধুমাত্র, মনে বাইটের একটি প্রবাহ হিসাবে একটি ফাইল নিতে পারেন. তাই স্ট্রিম যাও তারা ডিফল্টরূপে লিখুন? স্ট্যান্ডার্ড আউট. > এবং >> মধ্যে পার্থক্য কি? কেউ কি পূর্বেই ভিডিওটি? ঠিক আছে. > কিভাবে আপনি ফাইল এ পুনর্নির্দেশ করা হচ্ছে, এবং এছাড়াও >> ফাইল মধ্যে আউটপুট পুনর্নির্দেশ করা হচ্ছে, কিন্তু এর পরিবর্তে এটি ফাইলে লিখবেন যাও যাচ্ছে. উদাহরণস্বরূপ, এর দেওয়া বলতে আমি অভিধান অধিকার এখানে আছে এরকম, এবং এর ভিতরে অভিধান শুধুমাত্র স্টাফ হয় বিড়াল, বিড়াল, কুকুর, মাছ, কুকুর. আর মাত্র একটি কমান্ড যে আপনি কমান্ড লাইন এ আছে বিড়াল, যা শুধুমাত্র একটি ফাইলের মধ্যে কি মুদ্রণ যাচ্ছে. সুতরাং যখন আমি বিড়াল অভিধান বলে, এটা বিড়াল, বিড়াল, কুকুর, মাছ, কুকুর মুদ্রণ যাচ্ছে. যে সব বিড়াল আছে. তার মানে যে মান এটি বিড়াল, বিড়াল, কুকুর, মাছ, কুকুর আউট মুদ্রিত. যদি আমি এর পরিবর্তে একটি ফাইলে যে রিডিরেক্ট করতে চান, আমি> এবং ব্যবহার যাই হোক না কেন ফাইলটি এটি পুনর্নির্দেশ করতে পারেন. আমি ফাইল ফাইল ডাকবো. সুতরাং এখন যদি আমি ls, আমি আমি একটি নতুন ফাইল নামক ফাইল দেখতে পাবেন. এবং আমি যদি এটা খোলা, এটা ঠিক কি কমান্ড লাইনে বিড়াল দিতে হবে যাচ্ছে. সুতরাং এখন যদি আমি যে আবার কি, তারপর যাও ফাইলে আউটপুট রিডিরেক্ট করে যাচ্ছে, এবং আমি একই সঠিক জিনিস আছে যাচ্ছি. তাই টেকনিক্যালি, এটি সম্পূর্ণরূপে overrode কি আমরা ছিল. এবং আমরা যদি আমি অভিধান পরিবর্তন দেখতে পাবেন না, আমি গ্রহণ কুকুর আউট. এখন যদি আমরা বিড়াল ফাইলের মধ্যে আবার অভি, আমরা কুকুর সরানো সঙ্গে নতুন সংস্করণ আছে চলুন. সম্পূর্ণরূপে তাই তা অগ্রাহ্য করা হয়. পরিবর্তে, আমরা যদি >> ব্যবহার, এটি ফাইল যুক্ত করা যাচ্ছে. এখন, ফাইল খোলার, আমরা দেখতে আমরা ঠিক একই জিনিস দুইবার ছাপা আছে কারণ এটি ছিল একবার তারপর, আমরা মূল যাও যোগ করা. যাতে এর কি> এবং >> না. কিন্তু পরের এক জিজ্ঞাসা - এটি সম্পর্কে জিজ্ঞাসা করবে না না. অন্য এক যে বর্তমানে আমাদের রয়েছে তাই <, যা যদি> মান আউট পুননির্দেশনা, <যাও প্রমিত ইন পুনর্নির্দেশ করা যাচ্ছে না চলুন আমরা যদি একটি উদাহরণ আছে দেখুন. আমি এক সত্যিকারের দ্রুত লিখতে পারেন. যাক এর মধ্যে কোনো ফাইল, hello.c নিতে. তুলনামূলকভাবে সহজবোধ্য ফাইল. আমি শুধু একটি স্ট্রিং পেয়ে এবং তারপর "হ্যালো" যাই হোক না কেন স্ট্রিং আমি শুধু প্রবেশ করানো ছিল মুদ্রণ. তাই হ্যালো এবং তারপর না. হ্যালো /. এখন এটি সম্পর্কে কিছু লিখুন এর প্ররোচনা, যার মানে হচ্ছে এটা জিনিষ ইন মান প্রবেশ করা অপেক্ষা এর তাই লিখুন যাই হোক না কেন আমি প্রমিত মধ্যে চান ইন মাত্র আমরা হ্যালো, রব বলে করছি যাচ্ছে! তারপর এটি মানক হ্যালো আউট মুদ্রণ রব, এর! যদি আমি না. / হ্যালো এবং তারপর পুনর্নির্দেশ, এখন জন্য শুধুমাত্র আপনি একটি ফাইল থেকে রিডিরেক্ট করতে পারেন. সুতরাং যদি আমি কিছু ফাইল, txt রাখা, এবং আমি রব করা, যদি আমি হ্যালো চালানো এবং তারপর মধ্যে ফাইল txt পুনর্নির্দেশ. / হ্যালো, এটি যাও হ্যালো বলে, রব যাচ্ছে! অবিলম্বে. যখন এটি প্রথম GetString যাও পায় এবং এটি স্ট্যান্ডার্ড এর উপর বসে আছে এমন, মান নেই তথ্য পেতে প্রবেশ জন্য কীবোর্ড এ অপেক্ষা. পরিবর্তে, আমরা সাধারণ ফাইল txt থেকে পড়তে পুনঃনির্দেশিত মধ্যে আছে. এবং তাই txt ফাইল, যা শুধু লাইন Rob থেকে পড়তে যাচ্ছে, এবং তারপর এটি যাও হ্যালো, রব মুদ্রণ যাচ্ছে! এবং আমি যদি চান, আমি না. / হ্যালো আপনি কি 2> যে মান ত্রুটি এর পুনঃনির্দেশ করা হচ্ছে. তাই আপনি যদি মান ত্রুটির কিছু, এটি txt2 পুরা হবে না যায়. কিন্তু যদি আমি 2> না বিজ্ঞপ্তি তারপর, এটা এখনও হ্যালো এর মুদ্রণ, রব! কমান্ড লাইন কারণ আমি কেবল মানক ত্রুটি করছি পুনঃচালিত, আমি আউট পুনঃচালিত মান না. স্ট্যান্ডার্ড ত্রুটি এবং মান আউট হয় বিভিন্ন. আপনি যদি প্রকৃতপক্ষে মান ত্রুটি লিখতে চেয়েছিলেন, তারপর আমি fprintf stderr হবে এই পরিবর্তন হতে পারে. ডিফল্টরূপে তাই printf,, ছাপে মান আউট. যদি আমি প্রমিত ত্রুটির ম্যানুয়ালি প্রিন্ট করতে চান, তাহলে আমি fprintf ব্যবহার আছে এবং নির্দিষ্ট কি আমি প্রিন্ট করতে চান. যদি পরিবর্তে আমি fprintf stdout-এ কি তারপর, যে printf যাও মূলত সমতুল্য. কিন্তু fprintf যাও মান ত্রুটি. সুতরাং এখন, যদি আমি txt2 মধ্যে এই পুনর্নির্দেশ, হ্যালো, রব! এখনও কমান্ড লাইনে ছাপা হচ্ছে যেহেতু এটি মানক ত্রুটির এবং এর ছাপানো হচ্ছে আমি কেবল মানক পুনঃচালিত আউট করছি. এখন যদি আমি প্রমিত ত্রুটি পুনর্নির্দেশ এখন, এটি, প্রিন্ট করা শুরু করে থাকেন এবং txt2 যাও হ্যালো করা, রব যাচ্ছে! সুতরাং এখন, আপনি আপনার প্রকৃত ত্রুটি মান ত্রুটির মুদ্রণ করতে পারেন এবং মান আউট আপনার নিয়মিত বার্তা মুদ্রণ. তাই যখন আপনি আপনার প্রোগ্রাম চালানো, আপনি এটি হিসাবে. চালানো / হ্যালো পারেন 2 সঙ্গে এই টাইপ> যাতে আপনার প্রোগ্রাম স্বাভাবিকভাবে চালানো যাচ্ছে না, কিন্তু কোনো ত্রুটির বার্তা যে আপনি পাবেন আপনার ত্রুটি লগের মধ্যে পরে চেক করতে পারেন, তাই ত্রুটি, এবং তারপর পরে দেখুন এবং আপনার ফাইলটি ত্রুটি ঘটেছে যে কোনো ধরনের উত্পন্ন ত্রুটি থাকবে. প্রশ্ন? শেষ একটি নল, যা আপনি আর মাত্র একটি কমান্ড গ্রহণ থেকে স্ট্যান্ডার্ড আউট হিসাবে মনে করতে পারেন এবং এটিকে পরবর্তী কমান্ড প্রমাণ. একটি উদাহরণ এখানে প্রতিধ্বনি হল একটি কমান্ড লাইন জিনিস যে ঠিক হয় যাই হোক না কেন আমি যুক্তি হিসাবে প্রতিধ্বনি করা যাচ্ছে. আমি কোট না করা. প্রতিধ্বনি বাজে, বাজে কথা, কেবল বাজে বাজে কথা যাও, বাজে কথা, বাজে কথা মুদ্রণ যাচ্ছে. পূর্বে, যখন আমি তাকে বললাম আমি একটা txt ফাইল Rob মধ্যে রাখা ছিল কারণ আমি শুধুমাত্র txt ফাইল, পুনর্নির্দেশ করতে পারেন, / যদি আমি রব echo এবং তারপর নল তা. / হ্যালো, যে জিনিস একই টাইপ করবেন. এই কমান্ডের আউটপুট, প্রতিধ্বনি রব করছে, এবং জন্য ইনপুট হিসাবে এটি ব্যবহার করে. / হ্যালো. আপনি এটা হিসাবে প্রথম একটি ফাইলের মধ্যে প্রতিধ্বনি Rob পুনর্নির্দেশ মনে করতে পারেন এবং তারপর. / হ্যালো যে ইনপুট ফাইলের মধ্যে শুধুমাত্র যে outputted ছিল. কিন্তু এটি লাগে ছবি অস্থায়ী ফাইল. যে প্রশ্ন? পরের প্রশ্নে এই কাজে নিযুক্ত করা হবে. কি পাইপলাইন আপনি নামক কোনো ফাইল names.txt মধ্যে অনন্য নামের নম্বর খুঁজতে ব্যবহার করতে পারেন? কমান্ড আমরা এখানে ব্যবহার করতে চান তাহলে চলুন হয় অনন্য, তাই uniq, এবং তারপর wc. আপনি আসলে কি যে আছে তাকান মানুষ uniq করতে পারেন, এবং এটা ইনপুট থেকে সন্নিহিত মেলা লাইন ফিল্টার যাচ্ছে. এবং মানুষ wc যাও newline, শব্দ, এবং প্রতিটি ফাইলের জন্য বাইট সংখ্যা প্রিন্ট করতে যাচ্ছে. এবং গত এক আমরা ব্যবহার করতে চান সেটি বাছাই করা যাচ্ছে, যা শুধু txt ফাইল লাইনের সাজাতে হবে. যদি আমি কিছু txt ফাইল, names.txt, না এবং এটা রব, টমি, জোসেফ, টমি, জোসেফ, RJ, রব, আমি কি এখানে কাজ করতে চান এই ফাইলের মধ্যে অনন্য নামের নম্বর খুঁজতে. তাই উত্তর হওয়া উচিত? >> [ছাত্রদের] 4. >> হ্যাঁ. এটা রব, টমি, জোসেফ থেকে 4 করা উচিত, RJ এই ফাইলের মধ্যে শুধুমাত্র অনন্য নাম. প্রথম ধাপে, যদি আমি names.txt লেখা শব্দ গণনা ঃ না, এই প্রকৃতপক্ষে কহন সবকিছু সম্পর্কে. এটি আসলে প্রিন্টিং - এর দেখতে দিন, মানুষ wc - newlines, শব্দ, এবং বাইট গণনা. যদি আমি শুধুমাত্র লাইন যত্নশীল তারপর, আমি wc-l names.txt ঠিক করতে পারেন. সুতরাং যে পদক্ষেপ 1. কিন্তু আমি wc-l names.txt কারণ শুধু names.txt সকল নামের মধ্যে রয়েছে করতে না চান, এবং আমি কোন অ অনন্য বেশী ফিল্টার আউট করতে চান. সুতরাং যদি আমি uniq names.txt না, যে সম্পর্কে বেশ দেয় না কি আমি চাই কারণ সদৃশ নাম এখনও আছে. কেন হল? কেন uniq হয় আমি কি করতে চান করছেন না? [ছাত্রদের] অনুরূপ নয় [শ্রবণাতীত] >> হ্যাঁ. Uniq জন্য man পৃষ্ঠা মনে রাখুন ফিল্টার সন্নিহিত ম্যাচিং লাইন বলছেন. ঐগুলি, তাই সন্নিহিত না তা না ফিল্টার করবে. যদি আমি তাদের প্রথম বাছাই, সাজানোর names.txt একসাথে সব প্রতিলিপি লাইন স্থাপন করা হবে. তাই এখন সাজানোর names.txt হল. Uniq | আমি uniq, যা ইনপুট হিসাবে ব্যবহার করতে চান যে যাচ্ছি. যে সম্পর্কে জোসেফ, RJ, রব, টমি দেয়, এবং আমি wc-l দ্বারা ইনপুট হিসাবে ব্যবহার করতে চান যে, যা সম্পর্কে 4 দিতে হবে. ভালো লেগেছে তা এখানে বলে কি পাইপলাইন, আপনি ব্যবহার করতে পারেন? আপনি কমান্ড ব্যবহার করে একটি ধারাবাহিক ভালো জিনিস অনেক কিছু করতে পারেন যেখানে আপনি আর মাত্র একটি কমান্ড থেকে পরের কমান্ড ইনপুট আউটপুট হিসাবে ব্যবহার. আপনি একটা অনেক, চতুর একটা অনেক কিছু করতে পারেন. প্রশ্ন? ঠিক আছে. এটা পাইপ এবং ফেরৎ জন্য এটি. এখন আমরা প্রকৃত পণ্যদ্রব্য, কোডিং স্টাফ নেভিগেশন এড়িয়ে যান. এই পিডিএফ ইনসাইড, আপনি এই কমান্ড দেখতে পাবেন, এবং আপনার প্রয়োগ মধ্যে এই কমান্ডটি প্রয়োগ করুন চাইবেন. wget ব্যবহারেরে অনুরোধ জানানো ঠিক ইন্টারনেট থেকে কিছু পাওয়ার জন্য কমান্ড, মূলত, তাই wget ব্যবহারেরে অনুরোধ জানানো এবং এই URL-এ. যদি এই URL-টি আপনার ব্রাউজারের গিয়েছিলাম, এটি যে ফাইল ডাউনলোড হবে. আমি এটা নিজে ক্লিক করেছেন, তাই এটা আমার জন্য ফাইল ডাউনলোড করা. কিন্তু টার্মিনাল ভিতরে লেখা যে জিনিস wget হয় শুধুমাত্র আপনার টার্মিনাল মধ্যে এটা ডাউনলোড করতে যাচ্ছে. আমি section5.zip আছে, এবং আপনি section5.zip আনজিপ করতে চাইবেন, যাতে আপনি একটি ফোল্ডার নামক section5 দিতে হবে, যা ফাইল আমরা তা ব্যবহার করা ভিতরে আজ চলুন সব আছে যাচ্ছে. ফাইলের নাম হিসাবে এই প্রোগ্রামগুলি 'সুপারিশ, তারা একটি বিট বগী, তাই আপনার মিশন জিনিসটা কেন সময় gdb ব্যবহার হয়. প্রত্যেকের তাদের কি আছে ডাউনলোড / কিভাবে তাদের ডাউনলোড পেতে জানি তাদের মধ্যে যন্ত্র? ঠিক আছে. ./buggy1 চালনা, এটি সেগমেন্টেশন ফল্ট (কোর ডাম্প) বলতে হবে, যা যে কোনো সময় আপনি একটি segfault পেতে, কিন্তু এটাকে একটা বাজে জিনিস. কি পরিস্থিতিতে আপনি কি একটি segfault পেতে পারি? [ছাত্রদের] একটি নাল পয়েন্টার Dereferencing. >> হ্যাঁ. যাতে একটি উদাহরণ. একটি নাল পয়েন্টার আপনি একটি segfault পেতে যাচ্ছেন Dereferencing. কি উপায় segfault আপনার মেমরি স্পর্শ করছি আপনি স্পর্শ করা উচিত নয়. সুতরাং একটি নাল পয়েন্টার dereferencing ঠিকানা 0 স্পর্শ হয়, এবং মূলত, আজকাল সব কম্পিউটারের যে ঠিকানা 0 মেমরি আপনাকে স্পর্শ করা উচিত নয়. সুতরাং যে কেন একটি নাল পয়েন্টার মধ্যে একটি segfault ফলাফল dereferencing. আপনি যখন একটি পয়েন্টার আরম্ভ না ঘটতে তাহলে, এটি একটি গার্বেজ মূল্য আছে, এবং যখন আপনি dereference চেষ্টা সমস্ত সম্ভাবনা তা, আপনি মেমরি স্পর্শ করছি যে দাঁড়াতেই মাঝখানে এর. যদি আপনি ভাগ্যবান এবং আবর্জনা মান পেতে ঘটতে যাও বা কিছু স্ট্যাকের উপর কোথাও নির্দেশ ঘটেছে, তারপর যখন আপনি dereference পয়েন্টার যা আপনি সক্রিয়া করা হয়নি, কিছুই ভুল হয়ে যেতে পারে. কিন্তু যদি এর প্রতি নির্দেশ করে, যেমন কোথাও স্ট্যাকের মধ্যে এবং গাদা, অথবা এটা কোথাও যে আপনার প্রোগ্রাম দ্বারা ব্যবহার করা হয়েছে এখনো এর প্রতি নির্দেশ করে, তারপর আপনি মেমরি স্পর্শ করছি আপনি স্পর্শ করা উচিত নয় এবং আপনি segfault. আপনি যখন একটি recursive ফাংশন লিখুন এবং এটি অনেকবার recurses এবং আপনার জিনিষ স্ট্যাকের মধ্যে বৃদ্ধি খুব বড় এবং স্ট্যাকের collides যে এটা colliding করা উচিত নয়, আপনি মেমরি স্পর্শ করছি আপনি স্পর্শ করা উচিত নয়, যাতে আপনি segfault. এটা কি একটি segfault হয়. এছাড়াও একই কারণে যে যদি আপনার মত একটি পংক্তি আছে - এর আগের দিন প্রোগ্রাম ফিরে যান. ইন hello.c-I'm শুধু অন্য কিছু করতে যাচ্ছে. গৃহস্থালি * গুলি = "হ্যালো দুনিয়া!"; যদি আমি ব্যবহার * গুলি = কিছু বা গুলি [0] = 'এক্স'; তাই হ্যালো করতে,. / হ্যালো, কেন যে segfault কি? কেন এই নি segfault? আশা আপনি কি ঘটবে? যদি আমি কি printf ("% s \ n", গুলি); আপনি কি আশা করা মুদ্রিত চাইবে? কেন? [ছাত্রদের] এক্স হ্যালো. >> হ্যাঁ. সমস্যা হল যখন আপনি ভালো একটি স্ট্রিং ঘোষণা, গুলি একটি পয়েন্টার যে স্ট্যাকের যেতে হচ্ছে, এবং কি গুলি যাও প্রতি নির্দেশ হয় এই পংক্তি যা শুধুমাত্র পাঠযোগ্য মেমরি উপস্থিত রয়েছে. সুতরাং শুধুমাত্র নামের দ্বারা, শুধুমাত্র পাঠযোগ্য মেমরি, আপনি ধারণা পাওয়া উচিত আপনি যদি শুধুমাত্র পাঠযোগ্য মেমরির মধ্যে কি কি পরিবর্তন করতে চেষ্টা করে, আপনার পছন্দের কিছু স্মৃতি সঙ্গে কাজ করা উচিত নয় করছি এবং আপনি segfault. এটি আসলে একটি গৃহস্থালি * গুলি এবং গৃহস্থালির কাজ গুলি [] মধ্যে বড় পার্থক্য. সুতরাং গৃহস্থালির কাজ গুলি [] এখন, এই পংক্তিটি স্ট্যাক করা হবে না, এবং স্ট্যাকের হয়, যার মানে এই পুরোপুরি সূক্ষ্ম কাজ করা উচিত শুধুমাত্র পাঠযোগ্য না. এবং এটি আছে. মনে রাখবেন যখন আমি গৃহস্থালি * গুলি = "হ্যালো দুনিয়া!", গুলি নিজেই স্ট্যাকের হয় কিন্তু অন্য কোথাও গুলি পয়েন্ট, এবং যে শুধুমাত্র পাঠযোগ্য হতে অন্য কোথাও ঘটবে. কিন্তু গৃহস্থালির কাজ গুলি [] শুধুমাত্র স্ট্যাকের উপর কিছু. যাতে এর একটি segfault ঘটছে আরেকটি উদাহরণ. আমরা দেখেছি যে ./buggy1 একটি segfault ফলে. তত্ত্ব, আপনি buggy1.c তাকান না অবিলম্বে উচিত. পরিবর্তে, আমরা তা এ সময় gdb মাধ্যমে সন্ধান করব. যে যখন আপনি সেগমেন্টেশন ফল্ট (কোর ডাম্প) পেতে বিজ্ঞপ্তি, আপনি এখানে বলা কোর উপর এই ফাইল পেতে. যদি আমরা ls-l, আমরা সাধারণত যে কোর একটি চমত্কার বড় ফাইলটি দেখতে পাবেন. এই ফাইলের মাপ, বাইট হিসাবে সংখ্যা, তাই এটা দেখে মনে হচ্ছে এটা কিছু-250 কিলোবাইট. এই জন্য কারণ হতে পারে কি আসলে কোর ডাম্প করা হয় যখন আপনার প্রোগ্রাম বিপর্যের, আপনার প্রোগ্রাম মেমরি রাষ্ট্র মাত্র কপি এবং এই ফাইলের মধ্যে আটকানো হয়. এটা যে ফাইলে ডাম্প করা হয়. এই প্রোগ্রামটি করে, যখন তা চলমান ছিল, একটি প্রায় 250 কিলোবাইট মেমরির ব্যবহার আছে ঘটেছে, এবং যাতে কি এই ফাইলের মধ্যে ডাম্প করা আছে. এখন আপনি যে ফাইলের দিকে যদি আমরা সময় gdb buggy1 কোর কি প্রত্যাশা করতে পারেন. আমরা শুধু সময় gdb buggy1, এবং কি করতে পারেন যে মাত্র শুরু সময় gdb নিয়মিত আপ করা, তার ইনপুট ফাইল হিসাবে buggy1 ব্যবহার করে. তবে আপনি যদি সময় gdb buggy1 কোর না, তাহলে এটি বিশেষভাবে যাও সময় gdb শুরু আপ যাচ্ছে দ্বারা যে কোর ফাইল দিকে তাকিয়ে আছে. এবং আপনি buggy1 মানে সময় gdb বলছে যে জানে যে কোর ফাইল buggy1 প্রোগ্রাম থেকে আসে. তাই সময় gdb buggy1 কোর অবিলম্বে আমাদের আনা হবে যাও যেখানে প্রোগ্রামটিকে শেষ ঘটেছে. আমরা এখানে দেখতে সংকেত 11, সেগমেন্টেশন ফল্ট সঙ্গে প্রোগ্রাম বাতিল. আমরা সমাবেশ, যা সম্ভবত খুব সহায়ক নয় একটি লাইন দেখতে এরকম. তবে আপনি যদি BT বা backtrace টাইপ করুন, যে ফাংশন হতে যাচ্ছে যে দেয় আমাদের বর্তমান স্ট্যাকের ফ্রেম তালিকা আমাদের. সুতরাং backtrace. মনে হচ্ছে যে, আমরা কেবল দুই স্ট্যাকের ফ্রেম আছে. প্রথম হল আমাদের প্রধান স্ট্যাকের ফ্রেম, এবং দ্বিতীয়টি হল এই যে আমরা ফাংশন করা ঘটতে জন্য স্ট্যাকের ফ্রেম, যা দেখে মনে হচ্ছে আমরা শুধু সমাবেশ জন্য কোড আছে. তাই আমাদের প্রধান ফাংশন এর মধ্যে ফিরে যাওয়া, এবং যে আমরা 1 ফ্রেম করতে পারেন না, এবং আমি মনে করি আমরা আরও বাড়তেও পারে না, কিন্তু আমি প্রায় নিচে কখনও না - আপ বা. হাঁ. উপরে এবং নিচে. আপ এটি আপনি এক স্ট্যাকের ফ্রেম আপ ডাউন, আপনি এটি নিচে একটি স্ট্যাক ফ্রেম. আমি যা ব্যবহার না দেয়. আমি বিশেষভাবে শুধুমাত্র ফ্রেম 1, যা ফ্রেম 1 লেবেল যেতে হয় বলে. ফ্রেম 1 প্রধান স্ট্যাকের মধ্যে ফ্রেম হয় আমাদের আনতে যাচ্ছে, এবং এটি কোড লাইন আমরা হতে ঘটতে অধিকার এখানে. যদি আমরা কোড কয়েক লাইন আরো চেয়েছিল, আমরা তালিকা বলতে পারেন, এবং যে আমাদের সমস্ত কোড এটি চারপাশে লাইন দিতে যাচ্ছে. লাইন আমরা এ segfaulted ছিল 6: যদি (strcmp ("CS50 স্কচ", argv [1]) == 0). যদি তা এখনো সুস্পষ্ট নয়, আপনি এখানে এটা পাওয়া সোজা শুধু চিন্তা কেন segfaulted এটা করতে পারেন. কিন্তু আমরা এটিকে আরও এক ধাপ এবং বলতে পারে, "কেন [1] argv segfault চান?" বিশ্বকাপ মুদ্রণ argv [1], এবং এটিকে 0x0, যা নাল পয়েন্টার মত দেখাচ্ছে. আমরা CS50 স্কচ এবং নাল strcmping করছি, যাতে এবং যে segfault যাচ্ছে. এবং কেন হয় argv [1] নাল? [ছাত্রদের] যেহেতু আমরা কোনো কমান্ড লাইন আর্গুমেন্ট এটা না. হাঁ. আমরা এটি কোন কমান্ড লাইন আর্গুমেন্ট না দিতে. সুতরাং শুধুমাত্র ./buggy1 যাও argv [0] ./buggy1 হতে যাচ্ছে. এটা [1] আছে একটি argv যাচ্ছে না, যাতে যাও segfault যাচ্ছে. কিন্তু যদি, পরিবর্তে, আমি ঠিক CS50, তাহলে আপনি একজন D পেতে বলে যাচ্ছে কারণ যে কি তা না অনুমিত না. Buggy1.c এ জন্যে, এটা মুদ্রণ অনুমিত এর "আপনি একজন D পেতে" - যদি argv [1] "CS50 স্কচ" না না, "আপনি একজন D পেতে" অন্যথায়, "আপনি একটি একটি পেতে!" তাই আপনি যদি আমরা একটি একটি চান, আমরা সত্য হিসাবে তুলনা এই প্রয়োজন, যার মানে হল যে এটি 0 তুলনীয়. সুতরাং argv যাও "CS50 স্কচ" হতে [1] প্রয়োজন. আপনি যদি কমান্ড লাইনে যে কাজ করতে চান, আপনি \ যাও স্থান অব্যাহতি ব্যবহার করতে হবে. সুতরাং CS50 \ স্কচ এবং আপনি একটি একটি পেতে! আপনি যদি backslash করবেন না, কেন এই কাজ করে না? [ছাত্রদের] এটি দুটি ভিন্ন আর্গুমেন্ট. >> হ্যাঁ. Argv [1] CS50 হবে, এবং হয় argv যাও দেউলিয়া হতে [2] যাচ্ছে. ঠিক আছে. এখন ./buggy2 আবার segfault যাচ্ছে. পরিবর্তে এর কোর ফাইল খোলার সাথে, আমরা খুলুন buggy2 আপ সরাসরি করব, তাই সময় gdb buggy2. এখন যদি আমরা আমাদের প্রোগ্রাম চালানো হয় তাহলে সেটা যাও প্রোগ্রামের সংকেত SIGSEGV পেয়েছি বলে যাচ্ছে, যা সংকেত segfault, এবং এই হয় যেখানে এটি ঘটতে ঘটেছে. আমাদের backtrace এ জন্যে, আমরা দেখতে যে আমরা ফাংশন oh_no ছিল, যা ফাংশন ছিমছাম, যা ফাংশন binky দ্বারা বলা ছিল দ্বারা বলা হয়, যা প্রধান দ্বারা বলা হয়. আমরা এই ফাংশন আর্গুমেন্ট দেখতে পারেন. ছিমছাম এবং binky যুক্তি ছিল 1. যদি আমরা ফাংশন oh_no তালিকা, আমরা দেখতে যে শুধু oh_no হয় গৃহস্থালি ** গুলি = শূন্য করছেন; * গুলি = "Boom"; কেন যে কর্ম ব্যর্থ হবে? [ছাত্রদের] আপনি নাল পয়েন্টার dereference করতে পারেন না? >> হ্যাঁ. এই মাত্র হয় বলছে গুলি হল শূন্য নির্বিশেষে, যদি যে একটি গৃহস্থালি ** হতে হবে, যা, কিভাবে আপনি এটি ব্যাখ্যা উপর নির্ভর করে, এটি একটি পংক্তি একটি পয়েন্টার একটি পয়েন্টার হতে পারে বা স্ট্রিং একটি অ্যারে. এটা গুলি হয় শূন্য, তাই * গুলি একটি নাল পয়েন্টার dereferencing হয়, এবং তাই এই ক্র্যাশ করতে যাচ্ছে. এটি দ্রুততম উপায়ে আপনি সম্ভবত segfault করতে পারে. এটি শুধু একটি নাল পয়েন্টার প্রকাশক এবং অবিলম্বে segfaulting. এটা কি oh_no করছে. যদি আমরা এক ফ্রেম আপ তারপর, আমরা ফাংশন যে oh_no নামক মধ্যে পেতে যাচ্ছেন. আমি নিচে যে প্রয়োজন. যদি আপনি প্রবেশ করবেন এবং একটি কমান্ডের শুধুমাত্র আপনি Enter আবার, এটা পূর্ববর্তী কমান্ডের যে আপনি দৌড়ে পুনরাবৃত্তি করবেন. আমরা ফ্রেম 1 এ আছে. এই ফ্রেম তালিকা নির্মাণ, আমরা দেখতে এখানে আমাদের ফাংশন. আপনি তালিকা আবার আঘাত, বা করতে পারেন 20 তালিকা করতে পারেন এবং এটি আরো তালিকা প্রস্তুত করা যাবে. ফাংশন ছিমছাম বলে যদি আমি 1, তারপর oh_no ফাংশন যান, slinky ফাংশন অন্য যান. এবং আমরা জানতে পারি তোমার 1, কারণ আমরা এখানে দেখতে ঘটতে যে ফুটফুটে 1 যুক্তি দিয়ে বলা হয়. অথবা আপনি করতে পারেন না তোমার মুদ্রণ এবং তা হল 1 বলবে. আমরা ফুটফুটে বর্তমানে, এবং যদি আমরা অন্য ফ্রেম ওঠো, আমরা জানি যে আমরা binky শেষ অংশ নেব. আপ. এখন আমরা binky মধ্যে আছেন. আগে অর্ধেক সম্পর্কে ছিন্ন থেকে তালিকা - এই ফাংশন তালিকা - এটি শুরু বন্ধ হিসাবে যদি তোমার 0 তারপর, আমরা একে oh_no কল চলুন অন্যথায়, ফুটফুটে কল. আমরা জানি তোমার ছিল 1, তাই এটা বলা ফুটফুটে. এবং এখন আমরা মূল মধ্যে ফিরে এসেছি, এবং প্রধান ঠিক হয় int i = র্যান্ড্ ()% 3 হবে; ঠিক হয় যে আপনি একটি র্যান্ডম সংখ্যা যে হয় 0, 1, বা 2 দিতে যাচ্ছে. এটা যে নম্বর সঙ্গে binky কল যাচ্ছে, এবং এর এটি 0 ফিরে আসবে. এই সময়ে খুঁজছি, প্রোগ্রামের মাধ্যমে শুধু হাঁটা নিজে অবিলম্বে চলমান ছাড়া, আপনি প্রধান একটি বিভাজক পয়েন্ট সেট করে, যার অর্থ হল যে, যখন আমরা প্রোগ্রাম চালানো আপনার প্রোগ্রাম রান আপ পর্যন্ত এটি একটি বিভাজক বিন্দু হিট. প্রোগ্রাম, তাই এটি এবং তারপর এটা মূল ফাংশন আঘাত এবং চলমান থামাতে হবে চালানো হবে. এখন আমরা মূল ভিতরে করছি, এবং পরবর্তী পদক্ষেপ বা কোড এর পরের লাইন আমাদের আনা যাচ্ছে না. আপনি পরবর্তী পদক্ষেপ বা করতে পারেন. আঘাত পরের এখন, তোমার র্যান্ড্ ()% 3, যাতে আমরা তোমার মান মুদ্রণ করতে পারেন হয়েছে সেট, এবং এটা হল 1 বলবে. এখন এটা ব্যাপার আছে কিনা আমরা পরবর্তী পদক্ষেপ বা ব্যবহার. আমি অনুমান এটি আগের এক mattered, কিন্তু আমরা পরের ব্যবহার করতে চান না. যদি আমরা ধাপে ব্যবহার, আমরা ফাংশন মধ্যে সিঁড়ির ধাপ, প্রকৃত জিনিস এ বর্ণন অর্থ যে binky অভ্যন্তরে ঘটছে. যদি আমরা ব্যবহার পরের তারপর, এটা মানে ফাংশন যান উপর এবং আমাদের প্রধান ফাংশন কোড এর পরের লাইনে যান. এই লাইন এখানে ডান, আমি যেখানে এটা বলেন র্যান্ড্ ()% 3 এ ছিল; যদি আমি ধাপে দিত, তাহলে র্যান্ড্ বাস্তবায়ন করে যেতে হবে সেখানে কি কি ঘটছে এবং এ, চেহারা এবং আমি র্যান্ড্ ফাংশন মাধ্যমে পইঠা পারে. কিন্তু আমি র্যান্ড্ ফাংশন যত্নশীল না. আমি কোড পরের লাইন যাও প্রধান মধ্যে যেতে চান, তাই আমি ব্যবহার পরের. কিন্তু এখন আমি binky ফাংশন যত্ন সম্পর্কে না, তাই আমি যে ভাগ দিতে চান. এখন আমি binky আছি. কোড প্রথম লাইন যদি (তোমার == 0), আমি একটি পদক্ষেপ গ্রহণ করা যাচ্ছে না বলে, আমরা দেখতে ফুটফুটে আমরা এ পর্যন্ত শেষ. যদি আমরা তালিকা জিনিস, আমরা দেখতে যে এটা চেক করা হয় না = 0. আমি না, তাই সমান 0 যাও না এটা অন্য শর্ত গিয়েছিলাম, যা ফুটফুটে (ঝ) কল করতে যাচ্ছে. আপনাকে বিভ্রান্ত করতে পারে. যদি আপনি শুধু এই লাইন সরাসরি তাকান, আপনি কি মনে হতে পারে যদি: (i == 0), ঠিক আছে, তাহলে আমি একটি পদক্ষেপ গ্রহণ করেন এবং এখন আমি ছিমছাম (ঝ) এ না, আপনি যে আমি = 0 অথবা কিছু মানে অবশ্যই মনে হতে পারে. নং ঠিক মানে জানেন এটি লাইন ফুটফুটে (ঝ) সরাসরি বিদ্ধ করা হতে পারে. কারণ তোমার 0 নয়, পরবর্তী পদক্ষেপ অন্য সময়ে শেষ হবে না. অন্য একটি লাইন এটা থামাতে যাচ্ছে না. এটা প্রমান করে যে এর পরের লাইন এটি আসলে চালানো, যা ফুটফুটে (তোমার) যাবে যেতে যাচ্ছে. ফুটফুটে (ঝ) মধ্যে পদবিন্যাস, আমরা যদি (তোমার == 1). আমরা = 1 আমি জানি, তাই যখন আমরা পইঠা, আমরা জানি আমরা oh_no আপ শেষ হয়ে যাচ্ছেন কারণ i = 1 ফাংশন oh_no, যার মধ্যে আপনি পইঠা কল করতে পারেন, যা সেট হবে গৃহস্থালি ** গুলি = যাও এবং অবিলম্বে NULL "Boom". এবং তারপর আসলে buggy2 বাস্তবায়নের দিকে তাকিয়ে আছে, 0, 1, বা 2 - - কলিং binky, এই, শুধু তোমার একটি র্যান্ডম সংখ্যা আসছে যা যদি তোমার 0 এটি কল oh_no অন্যথায়, এটি কল ছিমছাম, যা আসে এখানে. যদি আমি 1, কল oh_no অন্যথায়, slinky, যা কল আসছে এখানে আপ, যদি না হয় 2, oh_no কল. আমি একটি উপায় আছে না এমনকি মনে করি না - কেউ কি এই তৈরীর একটি প্রোগ্রাম যা না segfault হবে একটি উপায় দেখতে? কারণ, যদি না আমি কিছু অনুপস্থিত করছি, যদি তোমার 0 হলে, আপনি অবিলম্বে segfault করব, অন্যথায় আপনি একটি ফাংশন যা তোমার হয় যদি আপনি 1 segfault যান, অন্যথায় আপনি একটি ফাংশন যেখানে আপনি যদি তোমার হল 2 segfault যান. সুতরাং কোন ব্যাপার আপনি কি করবেন, আপনি segfault. আমি এটি স্থাপন পরিবর্তে গৃহস্থালি ** গুলি = শূন্য কাজ হতে পারে একটি পদ্ধতি অনুমান, আপনি যে পংক্তিটি স্থান malloc পারে. Sizeof কি - আমরা malloc (sizeof) করতে পারে? [ছাত্রদের] (গৃহস্থালি) * 5? >> এই কি সঠিক বলে মনে হচ্ছে? আমি আসলে এই যদি আমি এটা দৌড়ে কাজ করবে ধৃষ্ট, কিন্তু এটি কি করছি আমি চাই না. গুলি ধরণ তাকান. এর int-* যোগ করা যাক, যাতে * int-x. আমি malloc না (sizeof (int-)) হবে. অথবা আমি যদি 5 'র একটি অ্যারের চেয়েছিলেন, আমি (sizeof (int) * 5) করে; আমি যদি কোন int ** আছে আমি কি malloc হবে? [ছাত্রদের] পয়েন্টার আকার. >> হ্যাঁ. (Sizeof (int-*)); নিচে এখানে একই জিনিস. আমি চাই (sizeof (গৃহস্থালি *)); এই পয়েন্টার "Boom" যে স্থানটিকে জন্য স্থান বরাদ্দ করা হবে. আমি "Boom" নিজেই জন্য স্থান বরাদ্দ করা প্রয়োজন হবে না কারণ এই কি আমি আগে বলেন যাও মূলত সমতুল্য এর গৃহস্থালির কাজ * x = "Boom". "Boom" ইতিমধ্যেই বিদ্যমান. এটা অস্তিত্ব মেমরি শুধুমাত্র পাঠযোগ্য অঞ্চলে ঘটবে. কিন্তু এটি আগে থেকেই আছে, যা কোড এই লাইন এর অর্থ হল, যদি গুলি একটি গৃহস্থালি **, তারপর * গুলি একটি গৃহস্থালি * এবং আপনি এই গৃহস্থালি * করছি "Boom" নির্দেশ নির্দিষ্ট করতে হবে. যদি আমি গুলি করে "Boom" কপি চেয়েছিলেন তারপর, আমি গুলি জন্য স্থান বরাদ্দ করা আবশ্যক. আমি চেষ্টা করবো * গুলি = malloc (sizeof (গৃহস্থালি) * 5); 5 কেন? কেন না 4? মনে হচ্ছে "Boom" 4 টি অক্ষর. >> [ছাত্রদের] নাল অক্ষর. হাঁ. আপনার স্ট্রিং সমস্ত যাও নাল অক্ষর প্রয়োজন হবে. এখন আমি strcat ভালো কিছু করতে পারি - কি একটি স্ট্রিং অনুলিপি জন্য ফাংশন? [ছাত্রদের] cpy? >> Strcpy. মানুষ strcpy. সুতরাং strcpy বা strncpy. strncpy একটি বিট নিরাপদ যেহেতু আপনি নির্দিষ্ট করতে পারেন ঠিক কতগুলি অক্ষর, কিন্তু এখানে এটি কারণ আমরা জানি না ব্যাপার. সুতরাং strcpy এবং আর্গুমেন্ট দেখুন. প্রথম যুক্তি হল, আমাদের গন্তব্য. দ্বিতীয় যুক্তি হল, আমাদের উৎস. আমরা আমাদের গন্তব্য * মধ্যে কপি করুন চলুন সবচেয়ে পয়েন্টার "Boom". তাহলে কেন আপনি পরিবর্তে শুধু কি আমরা তা নিয়ে একটি strcpy সঙ্গে এই আগে করতে পারে র * গুলি = "Boom"? কারণ আপনি এটি করতে চান সে পর্যন্ত, কিন্তু কি কারণে? [ছাত্রদের] যদি আপনি "Boom" কিছু পরিবর্তন চান. >> হ্যাঁ. এখন আমি গুলি ভালো কিছু করতে পারি [0] = 'এক্স'; গাদা গাদা উপর স্থান এবং যে কারণ গুলি পয়েন্ট যে গুলি যাও প্রতি নির্দেশ করা হয় গাদা হয়, যা "Boom" সংরক্ষণ করা হয় আরও একটি স্থান পয়েন্টার. সুতরাং "Boom" এই কপি গাদা মধ্যে সঞ্চিত হচ্ছে. হয় টেকনিক্যালি পর্যন্ত আমাদের প্রোগ্রামে "Boom" দুটি অনুলিপি. প্রথমে যে এই "Boom" স্ট্রিং ধ্রুবক দ্বারা শুধুমাত্র এর দেওয়া আছে, এবং "Boom" দ্বিতীয় কপি, strcpy নির্মিত "Boom" কপি. কিন্তু "Boom" কপি হিপ, সঞ্চিত হয় এবং হচ্ছে গাদা আপনি পরিবর্তন বিনামূল্যে. গাদা শুধুমাত্র পাঠযোগ্য হয় না, তাই তার মানে তাদের গুলি [0] আপনাকে "Boom" মান পরিবর্তন সায়ীদ হয়. এটা আপনাকে সেই অক্ষর পরিবর্তন দেওয়া যাচ্ছে. প্রশ্ন? ঠিক আছে. Buggy3 যাও মুভিং উপর let এর সময় gdb buggy3,. আমরা চাই বিষয়টি এবং এটি চালানোর জন্য আমরা দেখতে আমরা একটি segfault পেতে. যদি আমরা backtrace, শুধুমাত্র দুটি ফাংশন আছে. যদি আমরা আমাদের প্রধান ফাংশন মধ্যে আপ যান, আমরা দেখতে যে আমরা এই লাইনে segfaulted. সুতরাং শুধু এই লাইন দিকে তাকিয়ে আছে, এর জন্য (int-লাইন = 0; fgets এই স্টাফ সমান নয় শূন্য আছে; লাইন +). আমাদের আগের ফ্রেম _IO_fgets বলা ছিল. আপনি যে বিল্ট ইন ফাংশন সি সঙ্গে অনেক, দেখতে পাবেন যে যখন আপনি segfault পেতে হবে, সত্যিই রহস্যপূর্ণ ফাংশন নাম থাকবে না ভালো লেগেছে _IO_fgets. কিন্তু যে এই fgets কল সঙ্গে সম্পর্কযুক্ত যাও যাচ্ছে. কোথাও ভিতরে এখানে, আমরা segfaulting হয়. যদি আমরা আর্গুমেন্ট তাকান fgets যাও, আমরা বাফার মুদ্রণ করতে পারেন. এর প্রিন্ট করা যাক হিসাবে একটি - ওহো, না. প্রিন্ট করুন যথাযথভাবে হিসাবে আমি চাই এটা কাজ হবে না. যাক এর প্রকৃত প্রোগ্রাম তাকান. বাফার একটি অক্ষর অ্যারে. এটি একটি 128 অক্ষরের অক্ষর অ্যারে. সুতরাং যখন আমি বলতে মুদ্রণ বাফার, এটি ঐ 128 টি অক্ষর মুদ্রণ যাচ্ছে, যা আমি অনুমান কি বলে আশা করা হচ্ছে. কি আমি খুঁজছিলাম হয় বাফার ঠিকানা মুদ্রণ, কিন্তু যে অনেক বলা সত্যিই না সম্পর্কে. সুতরাং যখন আমি আপ বলতে এখানে x বাফার ঘটবে, এটা দেখায় 0xbffff090 সম্পর্কে, যা, যদি আপনি আগে বা কিছু বিন্দু থেকে মনে রাখবেন, Oxbffff যাও একটি স্ট্যাক পর অঞ্চলের হতে থাকে. স্ট্যাকে কোথাও ঠিক 0xc000 অধীন শুরু থাকে. শুধু এই ঠিকানা এইজন্য দ্বারা, আমি জানি যে স্ট্যাক বাফার ঘটছে. আমার প্রোগ্রাম পুনরায় আরম্ভ করুন,, রান আপ, বাফার আমরা দেখেছি অক্ষরের এই ক্রম ছিল যা প্রায় কাছাকাছি অর্থহীন. তারপর ফাইলটি মুদ্রণ, কি ফাইল এর মত দেখতে? [ছাত্রদের] শূন্য. >> হ্যাঁ. ফাইলটি ফাইল টাইপ * একটি, যাতে এটি একটি পয়েন্টার, এবং যে পয়েন্টার মান নাল. সুতরাং fgets যে পয়েন্টার থেকে একটি পরোক্ষ ভাবে পড়ার চেষ্টা হবে, কিন্তু যাতে পয়েন্টার অ্যাক্সেস, এটা করেছে এটি dereference. অথবা, যাতে এটি কি, যাও এটা dereferences করা উচিত প্রতি নির্দেশ অ্যাক্সেস. সুতরাং এটি একটি নাল পয়েন্টার এবং এটি segfaults dereferencing এর. আমি কি এটি পুনরায় আরম্ভ করা হতে পারে. যদি আমাদের প্রধান সময়ে আমরা বিরতি এবং চালানো, কোড প্রথম লাইনটি গৃহস্থালি * ফাইলের নাম = "nonexistent.txt"; যে একটি চমত্কার যাও কেন এই প্রোগ্রাম ব্যর্থ হিসাবে বড় ইঙ্গিতটি দিতে হবে. টাইপ পরের পরের লাইন যাও সম্পর্কে এনেছে, যেখানে আমি এই ফাইলটি খুলুন, এবং তারপর আমি অবিলম্বে আমাদের লাইন, যেখানে আমি একবার আঘাত পরবর্তী ঢোকা, এটা segfault যাচ্ছে. কেউ কি একটা কারণ হতে পারে আমরা segfaulting নিক্ষেপ করতে ইচ্ছুক কি? [ছাত্রদের] ফাইল বিদ্যমান নেই. >> হ্যাঁ. এটি একটি ইংগিত করা অনুমিত হয় যে যখনই আপনি একটি ফাইল খোলার করছেন আপনি যে আসলে ফাইল বিদ্যমান চেক প্রয়োজন. তাই এখানে, "nonexistent.txt"; যখন আমরা পড়ার জন্য fopen ফাইলের নাম, তারপর আমরা বলতে প্রয়োজন যদি (ফাইল == NULL) এবং বলার printf ("ফাইল বিদ্যমান নেই!" অথবা - এখনো ভাল - ফাইলের নাম); 1 রিটার্ন; তাই এখন আমরা যদি এটা শূন্য দেখুন আগে আসলে অব্যাহত এবং যে ফাইল থেকে পড়তে চেষ্টা. আমরা পুনর্নির্মাণ এটা ঠিক যে যে কাজ করে দেখতে পারেন. আমি একটা নতুন লাইন অন্তর্ভুক্ত উদ্দেশ্যে. তাই এখন nonexistent.txt বিদ্যমান নেই. আপনি সর্বদা এই জিনিস সাজানোর জন্য চেক করা উচিত. আপনি সর্বদা যদি fopen শূন্য ফেরৎ দেখুন উচিত. আপনি সর্বদা নিশ্চিত যে malloc NULL ফেরত না চেক করতে হবে, অন্যথায় আপনি segfault. এখন buggy4.c. রানিং. আমি এই অনুমান করছি ইনপুট অথবা সম্ভবত অসীম looping জন্য অপেক্ষা করছে. হ্যা, এটা অসীম looping. সুতরাং buggy4. দেখে মনে হচ্ছে আমরা অসীম looping. আমরা এ প্রধান ভাঙ্গতে পারে, আমাদের প্রোগ্রাম চালানো. সময় gdb ইন, যতদিন সমাহার আপনি ব্যবহার করছেন তা দ্ব্যর্থহীন বা বিশেষ করে যেখানে যে তারা আপনার জন্য প্রদান, তাহলে এর পরিবর্তে পরবর্তী সমস্ত উপায় টাইপ আউট থাকার পরের ব্যবহার এন ব্যবহার করতে পারেন. এবং এখন আমি যে এন একবার আঘাত করেছি, আমি লিখুন যাচ্ছে পরবর্তী রাখা আঘাত করতে পারেন বদলে যাও n আঘাত লিখুন, লিখুন এন, এন লিখুন না. মনে হচ্ছে কিছু আমি যে লুপ [i] 0 অ্যারে এর জন্য সেটিং না. দেখে মনে হচ্ছে আমি আউট ভঙ্গ এই লুপ জন্য am না. যদি আমি তোমার মুদ্রণ, তাই তোমার হল 2 পরে, আমি পরের যাবেন. আমি তোমার মুদ্রণ তারপর, তোমার হল 3, করব আমি পরের যাবেন. আমি তোমার মুদ্রণ এবং হল 3 করব. এর পরে, তোমার মুদ্রণ, তোমার হল 4. বাস্তবিক, মুদ্রণ sizeof (অ্যারে), তাই অ্যারের আকার 20. কিন্তু মনে হচ্ছে এর জন্য কিছু হয়ে যাচ্ছে পর্যন্ত সেখানে বিশেষ কিছু সময় gdb কমান্ড. এটা পরিবর্তনশীল মূল্যের একটি শর্ত সেটিং এর মত. কিন্তু আমি কি তা না হয় না মনে রাখবেন. তাই আপনি যদি আমরা রাখা যাচ্ছে - আপনি কি বলছে? আপনি কি উদ্গীরণ? [ছাত্রদের] তোমার প্রদর্শন কি যুক্ত করুন - >> হ্যাঁ. সুতরাং প্রদর্শন আমি সাহায্য করতে পারেন. যদি আমরা তোমার প্রদর্শন, এটা এখানে আপ করা হবে কি তোমার মান তাই আমি এটি প্রিন্ট প্রতিটি সময় না. যদি আমরা পরের রাখা যাচ্ছে, আমরা 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5 দেখুন. ভয়ঙ্কর কিছু একটা ভুল হচ্ছে, এবং হয় তোমার 0 হয় রিসেট করা হচ্ছে. Buggy4.c সময়ে খুঁজছি, আমরা যে সব ঘটনা হবার int-এ অ্যারে [5]; জন্য: (i = 0; তোমার <= sizeof (অ্যারে); i + +) অ্যারে [i] = 0; কি আমরা দেখতে যে এখানে ভুল? হিসাবে একটি ইঙ্গিতটি, যখন আমি সময় gdb buggy4 করছেন - লেট এর প্রধান, রান বিরতি - আমি মুদ্রণ sizeof (অ্যারে) ঠিক কি কি শর্ত হল যেখানে পরিশেষে আমি ভঙ্গ করা হবে কি না. কোথায় আমি? আমি রান? আমি এখনো ঘোষণা করা হয়নি. সুতরাং sizeof (অ্যারে) এবং মুদ্রণ যে 20, যা থেকে আমার অ্যারের আকার 5 হল প্রত্যাশিত এবং এটা 5 ইন্টিজার এর মধ্যে হয়, তাই সমগ্র বস্তু 5 * sizeof (int) বাইট, যেখানে sizeof (int) 4 হতে থাকে উচিত. সুতরাং sizeof (অ্যারে) হল 20. এই কি উচিত? [ছাত্রদের] sizeof (int) দ্বারা বিভাজিত. >> হ্যাঁ, / sizeof (int). মনে হয় এখনও সেখানে একটি সমস্যা এখানে. আমি মনে করি এই মাত্র হওয়া উচিত < যেহেতু এটি বেশ অনেক সবসময় <এবং =. <কখনও এখন আসুন কেন আসলে এই ভাঙ্গা ছিল আমার মনে. কেউ কি অনুমান কেন থাকে, 0 যাও তোমার লুপ প্রতিটি পুনরাবৃত্তির মাধ্যমে পুনরায় সেট? এখানে যে কি ঘটছে সে ভেতরে আছে শুধু যে অ্যারের [i] 0 হচ্ছে সেট. তাই একরকম, কোড এই লাইন আমাদের int কারণ তোমার 0 যাও যাও সেট করা হবে. [ছাত্রদের] এটি হবে কারণ এটি তোমার এই অংশ মেমরি অগ্রাহ্য এর যায়নি যখন এটি মনে করে এটা অ্যারের পরবর্তী উপাদান? >> [Bowden] হ্যাঁ. যখন আমরা আমাদের অ্যারের শেষ অতিক্রম চলুন, একরকম যে স্থান যে আমরা অগ্রাহ্য করছি তোমার মান অগ্রাহ্য করা হয়. এবং তাই যদি আমরা buggy4 দেখব, প্রধান, রান বিরতি, আমি কি তোমার ঠিকানা মুদ্রণ. দেখে মনে হচ্ছে এটা bffff124. এখন এর অ্যারের ঠিকানা মুদ্রণ যাক [0]. 110. কি হবে [1]? 114. [2], 118. 11c, 120. অ্যারে [5] bfff124 হয়. সুতরাং অ্যারের [5] আমি, যার অর্থ হল যে অ্যারের [5] হয় তোমার হিসাবে একই ঠিকানা আছে. যদি তারা একই ঠিকানা আছে, তারা একই জিনিস. 0 যাও সুতরাং যখন আমরা অ্যারে [5] সেট, আমরা তোমার সেটিং করা হয় 0 থেকে. এবং যদি এই বিষয়ে আপনাকে স্ট্যাকের পদ মনে হয়, int তোমার প্রথম ঘোষণা করেন, যার মানে তোমার স্ট্যাকের উপর কিছু স্থান পায়. তারপর অ্যারের [5], বরাদ্দ অতএব 20 বাইট স্ট্যাকের বন্টন করা হয়. সুতরাং প্রথম তোমার জন্য বরাদ্দ, তাহলে এই 20 বাইট বরাদ্দ পেতে হয়. আমি ডান অ্যারের আগে ঘটবে, এবং ভালো কারণ কি, আমি গত সপ্তাহে বলেন, যেখানে টেকনিক্যালি স্ট্যাকের নিচে বৃদ্ধি, যখন আপনি একটি অ্যারের মধ্যে সূচক, আমরা নিশ্চিত হয় যে অ্যারের মধ্যে 0th অবস্থান অ্যারের মধ্যে প্রথম স্থান আগে সবসময় ঘটবে. এটি কিভাবে আমি এটা সৃষ্টি গত সপ্তাহে ধরনের. উল্লেখ্য নীচে আমরা ঠিকানা 0 আছে এবং উপরের আমরা ঠিকানা সর্বোচ্চ আছে. স্ট্যাকের সর্বদাই ক্রমবর্ধমান ডাউন. চলুন শুরু করা যাক বলতে আমরা তোমার বরাদ্দ করা. আমরা পূর্ণসংখ্যা বরাদ্দ করা হবে, যার মানে এর let আপ বলতে এখানে শুধুমাত্র পূর্ণসংখ্যা তোমার জন্য বরাদ্দ করা হয়. তারপর আমরা 5 পূর্ণসংখ্যার আমাদের অ্যারে, যা নীচে যে অর্থ বরাদ্দ করা, যেহেতু স্ট্যাকের নিচে ক্রমবর্ধমান হয়, যারা 5 পূর্ণসংখ্যার বরাদ্দ পেতে. কিন্তু কিভাবে অ্যারে কাজ কারণ, আমরা নিশ্চিত করছি যে অ্যারের মধ্যে প্রথম স্থান সর্বদা একটি ঠিকানা অ্যারের মধ্যে দ্বিতীয় জিনিস কম. সুতরাং অ্যারের অবস্থান 0 সবসময় যা মেমরির মধ্যে প্রথম এরকম হয়েছে, যেহেতু অ্যারের অবস্থান 1 পরে যে ঘটতে আছে এবং অ্যারের অবস্থান 2 পরে যে ঘটতে থাকে, যার মানে অ্যারের অবস্থান 0 কোথাও নিচে এখানে ঘটতে পারে, অ্যারে অবস্থান 1 উপরের যে ঘটতে পারে কারণ চলন্ত আপ উচ্চতর মানে ঠিকানাগুলি থেকে সর্বোচ্চ ঠিকানা হল এখানে. সুতরাং অ্যারের [0] নিচে এখানে, অ্যারে [1] এখানে, অ্যারে [2] এখানে, অ্যারে [3] এখানে. লক্ষ্য করুন কিভাবে আগে আমরা পূর্ণসংখ্যা বরাদ্দ তোমার সমস্ত উপায় এখানে আপ, হিসাবে আমরা আমাদের অ্যারের সরাতে আরও এবং আরও, আমরা কাছাকাছি এবং ঘনিষ্ঠ আমাদের পূর্ণসংখ্যা তোমার হচ্ছে. এটা ঠিক এরকম ঘটে [5] যে অ্যারের, যা আমাদের অ্যারের বহুদূরে এক স্থান, ঠিক যেখানে পূর্ণসংখ্যা তোমার ঘটেছে বরাদ্দ করা হবে যাও. সুতরাং যে বিন্দু যেখানে আমরা ঘটতে যাও স্ট্যাক স্পেস আঘাত করা যে পূর্ণসংখ্যা তোমার জন্য, এবং আমরা যে বরাদ্দ 0 সেটিং করছেন. এটা কিভাবে কাজ করে. প্রশ্ন? হাঁ. [ছাত্রদের] কিছু মনে করবেন না. ঠিক আছে. [ছাত্রদের] আপনি কিভাবে ভুল এই সাজানোর এড়াতে? ভুল এই সাজানোর? আপনার সি প্রোগ্রামিং ভাষা হিসাবে ব্যবহার করবেন না. একটি ভাষা যে অ্যারের চেক বাউন্স হয়েছে ব্যবহার করুন. যতদিন আপনি সতর্ক থাকুন, আপনি শুধু আপনার অ্যারের কোট গত যাওয়া এড়াতে প্রয়োজন. [ছাত্রদের] সুতরাং এখানে যখন আমরা আপনার অ্যারের কোট গত গিয়েছিলাম - [Bowden] এটা শুরু করতে যাচ্ছি যেখানে জিনিস ভুল. >> [ছাত্রদের] ওহ, ঠিক আছে. যতদিন আপনি আপনার অ্যারের জন্য বরাদ্দ মেমরির মধ্যে রাখতে হয়, আপনি সূক্ষ্ম. কিন্তু C আছে কোন ত্রুটি পরীক্ষা করা. যদি আমি অ্যারে না [1000], এটা সহর্ষে যাই হোক না কেন এরকম সংশোধন করতে হবে - এটা অ্যারে শুরুতে যায় তাহলে, এটি পরে 1000 পজিশনে চলে যায় এবং এটি সেট করে যাও 0. এটা কোনো পরীক্ষা যে উহু, এই প্রকৃতপক্ষে এটি 1000 সালে জিনিষ নেই না. 1000 উপায় কি আমি পরিবর্তন করা উচিত তার পরেও হয়, যেহেতু জাভা বা কিছু ক্ষেত্র সূচকের অ্যারের পেতে আউট করব অথবা কোট ব্যতিক্রম সূচী আউট. এটা কেন উচ্চ স্তরের ভাষা অনেকটা এই জিনিস আছে যেখানে আপনি যদি অ্যারের সীমার অতিক্রম করা, আপনি বিফল যাতে আপনি পুনরায় নীচের স্তরের থেকে জিনিষ আপনি পরিবর্তন করতে পারবেন না এবং তারপর জিনিষ শুধুমাত্র একটি ব্যতিক্রম ছাড়া পেয়ে যান অনেক খারাপ বলে যে আপনি অ্যারের শেষ অতিক্রম গিয়েছিলাম. [ছাত্রদের] তাই আমরা ঠিক আছে পরিবর্তিত উচিত <= শুধু > [Bowden] হ্যাঁ. এটা > [ছাত্রদের] ডান. আরো প্রশ্ন? ঠিক আছে. [ছাত্রদের] আমি একটা প্রশ্ন আছে. >> হ্যাঁ. [ছাত্রদের] কি প্রকৃত অ্যারের ভেরিয়েবল? [Bowden] লেগেছে কি অ্যারের? এরে নিজেই একটি প্রতীক. এটা শুধুমাত্র 20 বাইট যে আমরা উল্লেখ করা হয় শুরুর ঠিকানা. আপনি এটি একটি পয়েন্টার হিসাবে, কিন্তু মনে করি এটি একটি ধ্রুবক পয়েন্টার পারেন. যত তাড়াতাড়ি জিনিষ কম্পাইল করতে, আর পরিবর্তনশীল অ্যারে টি বিদ্যমান নেই. [ছাত্রদের] সুতরাং কিভাবে এটি অ্যারের আকার খুঁজে পেতে? অ্যারের ফাইলের আকার যে ব্লকের মাপ যে প্রতীক বোঝায় বোঝায়. যখন আমি ভালো কিছু printf ("% পি \ n", অ্যারে) করবেন; আসুন এটি চালানোর জন্য. কি ঠিক না ভুল? এরে 'অ্যারে' এখানে ঘোষিত. ওহ, আপ এখানে. ঝনঝন শব্দ হয় চতুর, এবং এটা যে আমি 5 উপাদান হিসাবে ঘোষিত লক্ষ্য করা অ্যারে ঘটবে কিন্তু আমি স্থান 1000 মধ্যে সূচিবদ্ধ করাকে করছি. এটা যে না কারণ এই মাত্র ধ্রুবক পারেন. এটা শুধুমাত্র ঠাহর যে আমি অ্যারের সীমার অতিক্রম চলেছি যতদূর যেতে পারেন. আমরা যখন ছিল তোমার ভুল হতে আগে কিন্তু লক্ষ্য করা, এটি সম্ভবত কতগুলি তোমার মান নিতে পারে তা নির্ধারণ করতে পারে না, তাই এটা যে তোমার অ্যারের অতিক্রম শেষ হচ্ছে তা নির্ধারণ করতে পারেন না. মাত্র ঝনঝন শব্দ হচ্ছে চালাক. কিন্তু এখন buggy4 করা. সুতরাং আমি কি কি ভুল করছেন না? পরোক্ষভাবে প্রকাশক লাইব্রেরি ফাংশন 'printf'. আমি # অন্তর্ভুক্ত করতে চাইতে যাচ্ছি. ঠিক আছে. এখন buggy4 চলমান. ভালো অ্যারের মান মুদ্রণ আমি এখানে কি, একটি পয়েন্টার হিসাবে এটি মুদ্রণ কপি করে প্রিন্ট কিছু ভালো যে দেখায় - bfb8805c - যা কিছু ঠিকানা যে স্ট্যাকের পর অঞ্চলে এর. এরে নিজেই একটি পয়েন্টার ভালো হয়, কিন্তু এটি একটি প্রকৃত পয়েন্টার হয় না, একটি নিয়মিত পয়েন্টার যেহেতু আমরা পরিবর্তন করতে পারেন. এরে হয় না কিছু কিছু ধ্রুবক. মেমরি 20 ব্লক ঠিকানা 0xbfb8805c শুরু করা হবে. এই ঠিকানা মাধ্যমে তাই bfb8805c +20--বা আমি অনুমান -20 - মেমরি এই অ্যারের জন্য বরাদ্দ করা সব. এরে, কোথাও পরিবর্তনশীল নিজেই সংরক্ষিত হয় না. আপনি যখন কম্পাইল করছি, কম্পাইলার - এটি হাতে ঢেউ - কিন্তু শুধু কম্পাইলার ব্যবহার যেখানে এটি অ্যারে হতে জানে হবে. এটা জানে যে যেখানে অ্যারের শুরু হয়, এবং সে জন্য এটা সবসময় অফসেটস নিরিখে যে শুরু থেকে জিনিষ করতে পারেন না. এটি একটি পরিবর্তনশীল যাও অ্যারের প্রতিনিধিত্ব নিজেই কোনো প্রয়োজন নেই. কিন্তু যখন আমি int-* পি = অ্যারের ভালো কিছু করতে; এখন পি একটি পয়েন্টার যে অ্যারের যা পয়েন্ট, এবং এখন আসলে পি স্ট্যাকের উপর বিদ্যমান. আমি পি পরিবর্তন বিনামূল্যে. আমি পি = malloc করতে পারেন. সুতরাং এটি মূলত অ্যারের জোরাল; এখন কিছু স্পেস এটি হিপ স্থানটিকে চিহ্নিত করে. আমি অ্যারে = malloc করতে পারবেন না. যদি ঝনঝন শব্দ হয় চালাক, এটা সম্পর্কে এ অধিকার বাদুড় বন্ধ চিত্কার করা. বাস্তবিক, আমি এই খুব চমত্কার নিশ্চিত gcc করে. সুতরাং অ্যারের টাইপ 'int [5]' হস্তান্তরযোগ্য নয়. আপনি একটি অ্যারের টাইপ কিছু না ধার্য করতে পারেন কারণ অ্যারের শুধুমাত্র একটি ধ্রুবক. এটি একটি চিহ্ন যা রেফারেন্স যারা 20 বাইট. আমি এটা পরিবর্তন করতে পারবেন না. [ছাত্রদের] এবং যেখানে অ্যারের আকার সঞ্চিত হয়? [Bowden] এটা কোথাও সঞ্চিত না. এটা যখন এটা কম্পাইল করা হয়. তাই যেখানে অ্যারের আকার সংরক্ষিত হয়? আপনি শুধুমাত্র ফাংশন যে অ্যারের নিজেই ঘোষিত হয় ভিতরে sizeof (অ্যারে) ব্যবহার করতে পারেন. সুতরাং যদি আমি কিছু ফাংশন, foo বিন্যাস, না এবং আমি (int-এ অ্যারে []) printf ("% d \ n", sizeof (অ্যারে)); এবং তারপর নিচে এখানে আমি foo বিন্যাস (অ্যারে) কল; ভিতর এই ফাংশন - এর যাক এটি চালানোর জন্য. এটি ঝনঝন শব্দ হচ্ছে আবার চালাক. এটি সম্পর্কে এর যে অ্যারের ফাংশন স্থিতিমাপে sizeof র 'int-*' আকার ফিরে আসবে. এই সময় একটি ত্রুটি যদি এটা কি আমি ঘটতে চেয়েছিলেন না হবে. চলুন আসলে Werror নিষ্ক্রিয়. সতর্কবাণী. সতর্কতা জরিমানা হয়. এটা এখনও কম্পাইল হিসাবে দীর্ঘ হিসাবে এটি একটি সতর্কবার্তা হয়েছে. . / A.out যাও 4 মুদ্রণ যাচ্ছে. সতর্কবার্তা উৎপন্ন একটি কি ভুল ছিল সুস্পষ্ট সূচক. এই int-এ অ্যারে ঠিক হয় sizeof (int-*) মুদ্রণ যাচ্ছে. আমি যদি এখানে অ্যারের [5] করান, এখনও এটা এর যাও sizeof (int-*) মুদ্রণ যাচ্ছে. তাই যত তাড়াতাড়ি হিসাবে আপনি একটি ফাংশন মধ্যে এটি প্রেরণ অ্যারে এবং পয়েন্টার মধ্যে পার্থক্য হয় নামমাত্র. এর ফলে একটি অ্যারের যে স্ট্যাক ঘোষণা করা হয়, কিন্তু যত তাড়াতাড়ি আমরা যে মান প্রেরণ করার জন্য, যে 0xbf বাজে, বাজে কথা, এই ফাংশনটি মধ্যে বাজে কথা, তারপর যে অ্যারের এই স্ট্যাক পয়েন্টার স্থানটিকে চিহ্নিত করে. সুতরাং তার মানে শুধুমাত্র sizeof ফাংশন যে অ্যারের ঘোষণা করেন মধ্যে প্রয়োগ করা হয়েছে, যার অর্থ হল যে যখন আপনি এই ফাংশন কম্পাইল করা হয়, যখন এই ফাংশনের মাধ্যমে ঝনঝন যায়, এটি সূচিত অ্যারের একটি আকার 5 int-এ অ্যারে. আমি তখন এটি sizeof (অ্যারে) সূচিত করা হবে. ওহ, এটা 20. আসলে কিভাবে sizeof মূলত প্রায় সব ক্ষেত্রে কাজ করে. Sizeof একটি ফাংশন না; এটি একটি অপারেটর. আপনি sizeof ফাংশন কল করবেন না. Sizeof (int), শুধু কম্পাইলার যে 4 অনুবাদ করে দেবে. এটা আছে? ঠিক আছে. [ছাত্রদের] তাহলে sizeof (অ্যারে) মধ্যে প্রধান এবং foo এর পার্থক্য? কারণ আমরা sizeof (অ্যারে), int-এ টাইপ * যা বলছে, যেহেতু ডাউন অ্যারের এখানে টাইপ int-* না, এটা কোন int অ্যারে. [ছাত্রদের] সুতরাং যদি আপনি অ্যারে [] পরিবর্তে int-* অ্যারের মধ্যে পরামিতি ছিল, এর অর্থ যে আপনি এখনও অ্যারের কারণ এখন যে এটা একটা পয়েন্টার পরিবর্তন করতে পারেন? [Bowden] এই লেগেছে? >> [ছাত্রদের] হ্যাঁ. ফাংশন মধ্যে আপনি এখন অ্যারের পরিবর্তন করা যাবে না? [Bowden] আপনি উভয় ক্ষেত্রে অ্যারের পরিবর্তন হতে পারে. আপনি এই ক্ষেত্রে উভয় হয় অ্যারের [4] = 0 বলতে বিনামূল্যে. [ছাত্রদের] কিন্তু অন্য কিছু আপনাকে অ্যারের বিন্দু করতে পারেন? [Bowden] ওহ. হাঁ. ইন উভয় ক্ষেত্রেই - >> [ছাত্রদের] হ্যাঁ. [Bowden] অ্যারের [] এবং কোন int * অ্যারের মধ্যে পার্থক্য, none 'ও আছে. আপনি এখানে কিছু বহুমাত্রিক অ্যারের পেতে পারেন কিছু সুবিধাজনক সিনট্যাক্স জন্য, কিন্তু এটি এখনও ঠিক একটি পয়েন্টার. এর অর্থ এই যে আমি অ্যারে না বিনামূল্যে = malloc (sizeof (int-)); এবং এখন অন্য কোথাও নির্দেশ. কিন্তু মত কিভাবে এই কাজ করে চিরকালের জন্য এবং সবসময়, অন্য কিছু যাও এটি করে এই অ্যারের পরিবর্তন নির্দেশ কিন্তু নিচে পরিবর্তন এই অ্যারে এখানে না কারণ এটা আর্গুমেন্টের একটি কপি, এটি যে আর্গুমেন্টের একটি পয়েন্টার না. এবং আসলে, ঠিক হিসাবে আরো ইঙ্গিত যে এটা ঠিক একই - আমরা ইতিমধ্যে কি প্রিন্টিং অ্যারে টি প্রিন্ট দেখেছি - কি যদি আমরা অ্যারের ঠিকানা অথবা অ্যারের ঠিকানা ঠিকানা মুদ্রণ যারা হয়? চলুন এই এক উপেক্ষা করা. ঠিক আছে. এই সূক্ষ্ম. এটা এখন এর. / A.out চলমান. মুদ্রণ অ্যারের তারপর, অ্যারের ঠিকানা মুদ্রণ, একই জিনিসের. এরে শুধু বিদ্যমান নয়. জানেন যখন আপনি অ্যারে মুদ্রণ করছি, আপনি প্রতীক যারা 20 বাইট যে বোঝায় মুদ্রণ করছি. অ্যারের ঠিকানা মুদ্রণ ভাল,, অ্যারে বিদ্যমান নেই. তবে, নেই কোনো ঠিকানা না তাই এটা যারা 20 বাইট ঠিকানা ছাপে. যত তাড়াতাড়ি আপনি নিচে কম্পাইল আপনার কম্পাইল buggy4 মধ্যে,. পছন্দ / a.out, অ্যারে হয় নামমাত্র. পয়েন্টার বিদ্যমান. অ্যারেগুলির না. মেমরি অ্যারের প্রতিনিধিত্বমূলক ব্লক এখনও বিদ্যমান, কিন্তু পরিবর্তনশীল অ্যারে এবং যে ধরনের ভেরিয়েবল উপস্থিত নয়. যারা অ্যারে এবং পয়েন্টার মধ্যে প্রধান পার্থক্য মত হয় যত তাড়াতাড়ি আপনি ফাংশান কল করা, কোনো পার্থক্য নেই. কিন্তু ভিতর ফাংশন যে অ্যারের নিজেই ঘোষিত হয়, sizeof ভিন্নভাবে কাজ করে যেহেতু আপনি পরিবর্তে ধরনের আকারের ব্লকের মাপ মুদ্রণ করছি, এবং আপনি তা না কারণ এটি একটি চিহ্ন পরিবর্তন করতে পারবেন না. আর জিনিস এবং ঠিকানা মুদ্রণ একই জিনিস ছাপে. এবং যে বেশ ভালো এটা. [ছাত্রদের] যে এক সময় আপনি আরো বলতে পারবেন? আমি কিছু মিস হতে পারে. মুদ্রণ অ্যারের অ্যারে এবং ঠিকানা একই জিনিস ছাপে, পক্ষান্তরে আপনি যদি পয়েন্টার ঠিকানা বনাম একটি পয়েন্টার মুদ্রণ, এক জিনিস কি ইশারা করছেন ঠিকানা ছাপে, অন্যান্য স্ট্যাক পয়েন্টার ঠিকানা ছাপে. আপনি একটি পয়েন্টার পরিবর্তন করতে পারেন; আপনি একটি অ্যারের চিহ্ন পরিবর্তন করতে পারবেন না. এবং sizeof পয়েন্টার যে পয়েন্টার টাইপ মাপ মুদ্রণ যাচ্ছে. সুতরাং int-* পি sizeof (পি) 4 মুদ্রণ যাচ্ছে, কিন্তু int-এ অ্যারে [5] 20 মুদ্রণ মুদ্রণ sizeof (অ্যারে) চালু হয়. [ছাত্রদের] সুতরাং int-এ অ্যারে [5] 20 মুদ্রণ হবে? >> হ্যাঁ. এটা কেন buggy4 ভেতরে যখন এটি যাও sizeof (অ্যারে) ব্যবহার করা হয় এই আমি <20 করছেন, যা কি না আমরা চেয়েছিলেন. আমরা তোমার <5 চান. >> [ছাত্রদের] ঠিক আছে. [Bowden] তারপর যত তাড়াতাড়ি আপনি কাজ শুরু করতে পার, যদি আমরা কি int-* পি = অ্যারের; এই ফাংশনের ভিতর, আমরা মূলত ঠিক একই উপায়ে পি এবং অ্যারের ব্যবহার করতে পারেন, ব্যতীত জন্য sizeof সমস্যা এবং পরিবর্তন সমস্যা. কিন্তু পি [0] = 1; হয় অ্যারের [0] = 1 বলছে একই; এবং যত তাড়াতাড়ি আমরা foo বিন্যাস (অ্যারে) বলে; বা foo বিন্যাস (পি); foo বিন্যাস ফাংশন এর ভিতরে, এই দুবার একই কল. এই দুটি কল মধ্যে কোন পার্থক্য নেই. প্রত্যেকেরই যে ভালো? ঠিক আছে. আমরা 10 মিনিট আছে. আমরা এই হ্যাকার Typer প্রোগ্রামের মাধ্যমে পেতে চেষ্টা করব, এই ওয়েবসাইট, যা বেরিয়ে আসেন গত বছর বা কিছু. এটা ঠিক করা অনুমিত এর মত আপনি এলোমেলোভাবে টাইপ করুন এবং সেটা ছাপে আউট - যাই হোক এটা ফাইল আছে লোড হয় কি এটা দেখে মনে হচ্ছে আপনি টাইপ করছেন. এটি অপারেটিং সিস্টেমের কোড কোন ধরণের মত দেখাচ্ছে. আমরা প্রয়োগ করতে চান. আপনি বাইনারি এক্সিকিউটেবল নামে hacker_typer থাকা উচিত যে একটি আর্গুমেন্ট নেয়, যাও ফাইল "হ্যাকার টাইপ." এক্সিকিউটেবল চালনা পর্দা পরিষ্কার করা উচিত এবং তারপর পাশ-এ ফাইল থেকে প্রতিটি সময় ব্যবহারকারী একটি কী presses মুদ্রণ একটি অক্ষর আউট. তাই যাই হোক না কেন আপনি কি টেপা, দূরে নিক্ষেপ করা এবং এটি পরিবর্তে ফাইল থেকে একটি অক্ষর মুদ্রণ উচিত যে যুক্তি. আমি আপনি কাছাকাছি কি জিনিষ আমরা জানতে হবে চলুন হয় বলতে পারবেন. কিন্তু আমরা termios লাইব্রেরী চেক আউট করতে চান. আমি এই লাইব্রেরি ব্যবহার আমার সমগ্র জীবনে না, তাই এটা খুব সংক্ষিপ্ত উদ্দেশ্য. কিন্তু এই লাইব্রেরি আমরা অক্ষর আপনি আঘাত সরিয়ে ব্যবহার করতে পারেন হবে যখন আপনি ইন মান মধ্যে টাইপ করছে সুতরাং hacker_typer.c, এবং আমরা # অন্তর্ভুক্ত করতে চাইতে চলুন. Termios জন্যে man পৃষ্ঠা এ - I'm এটি অপারেটিং সিস্টেম এর টার্মিনাল বা কিছু মনন - আমি কিভাবে এটা পড়তে জানি না. এই সময়ে খুঁজছি, এই 2 ফাইল অন্তর্ভুক্ত বলছেন, তাই আমরা যে করব. প্রথম প্রথম জিনিস, আমরা একটি একক যুক্তি, যা আমরা ফাইল খুলুন হওয়া উচিত নিতে চান. আমি কি করতে চান? আমি কিভাবে আমি একটি একক যুক্তি আছে দেখুন? [ছাত্রদের] যদি argc সমান এটি. >> [Bowden] হ্যাঁ. তাই আপনি যদি (argc = 2!) Printf ("ব্যবহার:% s [ফাইলটি খোলার]"). সুতরাং এখন যদি আমি একটি দ্বিতীয় যুক্তি ছাড়া এই রান - ওহ, আমি নতুন লাইন প্রয়োজন - আপনি এটি ব্যবহার দেখতে পাবেন:. / hacker_typer, এবং তারপর দ্বিতীয় যুক্তি আমি ফাইল খুলতে চান হওয়া উচিত. আমি এখন কি করবেন? আমি এই ফাইল থেকে পড়তে চাই. আমি কিভাবে একটি ফাইল থেকে পড়া? [ছাত্রদের] আপনি এটি প্রথম খুলুন. >> হ্যাঁ. সুতরাং fopen. কি fopen কেমন হয়েছে? [ছাত্রদের] ফাইলনাম. >> [Bowden] ফাইলনামটিতে argv [1] হবে. [ছাত্রদের] তারপর কি আপনি কাজ করতে চান, - >> [Bowden] হ্যাঁ. তাই আপনি যদি মনে করে থাকেন, আপনি মানুষ fopen ঠিক করতে পারে, যেখানে এটি একটি const গৃহস্থালি * পাথ যেখানে পথটি ফাইলের নাম হতে যাচ্ছে, const গৃহস্থালি * মোড. যদি আপনি কি মোডে মনে ঘটতে থাকে, তাহলে আপনি মোডের জন্য ব্যবহার করতে পারেন. র man পৃষ্ঠা ইনসাইড, স্ল্যাশ চরিত্র কি জিনিষ অনুসন্ধান করার জন্য ব্যবহার করতে পারেন. তাই আমি মোড অনুসন্ধান করার জন্য / মোডে টাইপ করুন. এন এবং N কি আপনি চক্র অনুসন্ধান মিল মাধ্যমে ব্যবহার করতে পারেন. এখানে এটি একটি পংক্তি যুক্তি মোড পয়েন্ট বলছেন নিম্নলিখিত ক্রম এক প্রারম্ভে. আর তাই, ওপেন পড়ার জন্য টেক্সট ফাইল. আমরা যেতে চাই. পড়ার জন্য, এবং আমি যে সঞ্চয় করতে চান. বিষয় একটি ফাইল * হবে. এখন আমি কি করতে চান? সম্পর্কে একটি দ্বিতীয় দিন. ঠিক আছে. এখন আমি কি করতে চান? [ছাত্রদের] যদি শূন্য চেক করুন. >> [Bowden] হ্যাঁ. কোন সময় আপনি একটি ফাইল খুলুন, নিশ্চিত করুন যে আপনি সফলভাবে করছি এটি খুলতে সক্ষম হয়েছে. এখন আমি যে termios স্টাফ করে যেতে চাই যেখানে আমি প্রথমে আমার বর্তমান সেটিংস পড়তে চাই এবং কিছু মধ্যে যারা সংরক্ষণ করুন, তারপরে আমি আমার সেটিংস পরিবর্তন করতে চান কোনো চরিত্র যে আমি টাইপ করে বাতিল, এবং তারপর আমি ঐ সেটিংস আপডেট করতে চান. প্রোগ্রাম শেষে এবং তারপর, আমি আমার মূল সেটিংস ফিরে পরিবর্তন করতে চান. সুতরাং struct termios টাইপ করা যাচ্ছে, এবং আমি ঐ দুটি চান যাচ্ছি. প্রথম এক যাও আমার current_settings হবে, এবং তারপর তারা আমার hacker_settings হতে যাচ্ছেন. প্রথমত, আমি আমার বর্তমান সেটিংস সংরক্ষণ করতে চান চলেছি, তারপর আমি hacker_settings আপডেট করতে চান, চলেছি, এবং তারপর আমার প্রোগ্রাম শেষে উপায়, আমি বর্তমান সেটিংস প্রত্যাবর্তন করতে চান. তাই বর্তমান সেটিংস সংরক্ষণ, পথ যে কাজ আমরা মানুষ termios,. আমরা যে আমরা এই int-tcsetattr, int-tcgetattr আছে. আমি তার একটি পয়েন্টার দ্বারা termios struct পাস. এই পথ সন্ধান করা হয় - I've ইতিমধ্যে বিস্মৃত কি ফাংশন বলা হয়. কপি এবং পেস্ট করুন. সুতরাং tcgetattr তারপর, আমি struct মধ্যে আমি যে তথ্য সংরক্ষণ করছি প্রেরণ করতে ইচ্ছুক, যা current_settings হবে, এবং প্রথম যুক্তি হল জিনিস আমি বৈশিষ্ট্যাবলী সংরক্ষণ করতে চান জন্য ফাইল বর্ণনাকারী. যে কোনো সময় আপনি একটি ফাইল খোলার মত কি ফাইল বর্ণনাকারী হয়, এটি একটি ফাইল বর্ণনাকারী পায়. যখন আমি fopen argv [1], এটি একটি ফাইল বর্ণনাকারী যা আপনি উল্লেখ পায় যখনই আপনি এটা পড়তে বা লিখতে চান. যে ফাইল বর্ণনাকারী আমি এখানে ব্যবহার করতে চান না. তিনটি ফাইল বর্ণনাকারী আপনি ডিফল্ট আছে, যা সাধারণ, মান আউট, এবং মান ত্রুটি. ডিফল্টরূপে, আমি মনে হয় মান 0, মান আউট হয় 1, এবং মান ত্রুটি 2. তাই আমি সেটিংস পরিবর্তন করতে চান? আমি যখনই আমি একটি অক্ষর আঘাত হানা সেটিংস পরিবর্তন করতে চান, আমি যে চরিত্র যাও সরিয়ে রাখার পরিবর্তে পর্দায় এটি মুদ্রণ চাহিদা. কি স্ট্রীম -, প্রমাণ আউট, অথবা প্রমিত মান ত্রুটি - সাড়া জিনিষ যখন আমি কীবোর্ড এ টাইপ? >> [ছাত্রদের] স্ট্যান্ডার্ড >> হ্যাঁ ইন. তাই আমি হয় 0 বা না আমি stdin করতে পারেন পারেন. আমি ইন করছি current_settings মান পেয়ে এখন আমি ঐ সেটিংস আপডেট করতে চান, তাই প্রথম hacker_settings আমি কি আমার current_settings বিভক্ত অনুলিপি করব. এবং কিভাবে structs কাজ শুধুমাত্র কপি করা হবে. এই কপি করা সব ক্ষেত্র, হিসাবে আপনি আশা করবে. এখন আমি ক্ষেত্রগুলি কিছু আপডেট করতে চান. Termios এ খুঁজছি, আপনি এই বহুত মাধ্যমে পড়তে হবে ঠিক কি জন্য সন্ধান করতে চান তাহলে দেখুন, কিন্তু পতাকা আপনি সন্ধান করতে চান চলুন হয় প্রতিধ্বনি, তাই ECHO ইকো ইনপুট অক্ষর. প্রথম আমি সেট করতে চান - ইতিমধ্যে বিস্মৃত I've কি ক্ষেত্রগুলি. এটা কি struct মত দেখাচ্ছে. তাই আমি মনে করি আমরা ইনপুট মোড পরিবর্তন করতে চান. আমরা নিশ্চিত যে কি আমরা পরিবর্তন চাই না সমাধান তাকান করব. আমরা lflag যাতে এই সব দেখেত্ত প্রয়োজন প্রতিরোধ পরিবর্তন করতে চান. আমরা স্থানীয় মোড পরিবর্তন করতে চান. আপনি যেখানে সবকিছু বোঝার জন্যে এই জিনিস মাধ্যমে সম্পূর্ণ পড়তে হবে আমরা পরিবর্তন চাই. কিন্তু এটা স্থানীয় মোড যেখানে আমরা যে পরিবর্তন চাই চলুন ভেতরে এর. সুতরাং hacker_settings.cc_lmode কি বলা হচ্ছে. c_lflag. এই যেখানে আমরা bitwise অপারেটরদের মধ্যে পেতে. আমরা সময় আউট ধরনের, কিন্তু আমরা তা বাস্তব দ্রুত মধ্য দিয়ে যেতে হবে. এই যেখানে আমরা bitwise অপারেটরদের মধ্যে পেতে, যেখানে আমি মনে করি আমি এক সময় অনেক আগে যে যখনই আপনি শুরু পতাকা আচরণ, আপনি ব্যবহার করা অনেক bitwise অপারেটর যাও চলুন. পতাকা প্রতিটি বিট ব্যবহার করে কিছু সাজানোর অনুরূপ. তাই এখানে, এই পতাকা ভিন্ন জিনিষ, যেখানে তাদের সব কিছু বিভিন্ন অর্থ একটি গুচ্ছ আছে. কিন্তু শুধু কি আমি যেতে চাই বিট যা ECHO অনুরূপ হয় নিষ্ক্রিয়. তাই ছুটিতে যে বন্ধ করব & = ¬ ECHO. আসলে, আমার মনে হয় এটা tECHO বা কিছু মত. আমি শুধু আবার চেক যাচ্ছে. আমি এটি termios পারেন. এটা ঠিক এর প্রতিধ্বনি. ECHO একটি বিট হতে হবে. ¬ ECHO সকল 1 বিট সেট করা হয় অর্থ, যার মানে সমস্ত ফ্ল্যাগ সত্য সেট করা হয় যাচ্ছে ব্যতীত জন্য ECHO বিট. এই সঙ্গে আমার স্থানীয় পতাকা শেষ, এটা সত্য যে সমস্ত ফ্ল্যাগ বর্তমানে সেট অর্থ সত্য এখনও সেট করা হবে. যদি আমার ECHO পতাকা সত্য সেট করা থাকে, তাহলে এই অগত্যা ECHO পতাকার মিথ্যা হয় সেট. সুতরাং শুধু এই লাইন কোড সক্রিয় ECHO পতাকা বন্ধ. কোড অন্যান্য লাইন, আমি তাদের সেই সময় সুদ এবং কপি তারপরে তাদের ব্যাখ্যা. সমাধান সালে তিনি বলেন 0. এটা সম্ভবত ভাল stdin স্পষ্টভাবে বলতে. উল্লেখ্য যে আমি ECHO করছি করছেন | ICANON এখানে. ICANON পৃথক কিছু, যা ক্যানোনিকাল মোড মানে বোঝায়. কি ধর্মসম্মত মোড মানে সাধারণতঃ যখন আপনি কমান্ড লাইন টাইপ করছি, সাধারণ পর্যন্ত আপনি আঘাত newline প্রক্রিয়া না কিছু না. সুতরাং যখন আপনি GetString না, আপনি একটা গুচ্ছ টাইপ করুন, তারপরে আপনি আঘাত newline. এটা যখন এটি মানক ইন প্রেরিত এটা ডিফল্ট. যখন আমি ক্যানোনিকাল মোড নিষ্ক্রিয়, এখন প্রতি একক অক্ষর আপনি প্রেস না কি, প্রক্রিয়া যা সাধারণত খারাপ ধরনের কারণ এটা এইসব জিনিস প্রক্রিয়া ধীর পরার, যা কেন এটা সমগ্র ভাগে এটি বাফার ভাল. কিন্তু আমি চাই প্রতিটি অক্ষর প্রক্রিয়া যেহেতু আমি জন্য সম্পর্কে newline আঘাত কর অপেক্ষা করতে না চান আগে এটি সমস্ত অক্ষর প্রক্রিয়াকরণ আমি টাইপ করছি. এই পরিনত ক্যানোনিকাল মোড বন্ধ. এই স্টাফ শুধুমাত্র মানে যখন প্রকৃতপক্ষে এটি অক্ষর প্রক্রিয়াকরণ করে. এর মানে হল তাদের অবিলম্বে প্রক্রিয়া; যত তাড়াতাড়ি আমি তাদের টাইপ করছি, তাদের প্রক্রিয়া. এবং এই ফাংশন যা প্রমিত মানের জন্য আমার সেটিংস আপডেট করার মধ্যে, এবং TCSA মানে এটা কি অধিকার এখন. অন্যান্য বিকল্প পর্যন্ত যা স্ট্রিমে বর্তমানে প্রক্রিয়াকৃত হয় অপেক্ষা করুন. সত্যিই যে কোনো ব্যাপার নয়. শুধু ডান এখন আমার সেটিংস যাই হোক না কেন hacker_typer_settings বর্তমানে করা পরিবর্তন. আর আমি মনে নামক hacker_settings তাই, লেট এর যে পরিবর্তন. Hacker_settings সবকিছু পরিবর্তন করুন. এখন আমাদের প্রোগ্রাম শেষে আমরা প্রত্যাবর্তন করতে চান চলুন কি বর্তমানে normal_settings ভেতরে, যা শুধু & normal_settings মত চেহারা হবে. আমি আমার normal_settings কোন পরিবর্তন করেছি মূলত এটি পেয়ে থেকে না লক্ষ্য করুন. তারপর শুধু তাদের আবার পরিবর্তন, আমি পাস শেষে তাদের আবার. এই আপডেটে. ঠিক আছে. এখন ভিতর এখানে আমি শুধু সময় আগ্রহের মধ্যে কোড ব্যাখ্যা করব. এটা যে কত কোড না. আমরা দেখতে আমরা ফাইল থেকে একটি অক্ষর পড়তে. আমরা এটা বলা চ. এখন আপনি, মানুষ fgetc পারেন তবে কিভাবে fgetc কাজ হবে না ঠিক তা চরিত্র যে আপনি বা পড়া ফাইলের শেষে ফিরে যাচ্ছে, কোন ফাইল বা কিছু ত্রুটি ঘটনাকেই শেষে অনুরূপ. আমরা, looping একটি ফাইল থেকে একক অক্ষর পড়া অব্যাহত থাকে, যতক্ষণ না আমরা অক্ষরের রান আউট করেছি পড়তে. এবং যখন আমরা যে করছেন, একটি একক চরিত্রের উপর আমরা এখনো সদস্য না হয়ে আদর্শ থেকে অপেক্ষা প্রতি একক সময় আপনি কমান্ড লাইনে টাইপ কিছু, যে একটি অক্ষর মান থেকে পড়া ইন এর তারপর ঠিক putchar যাও গৃহস্থালির কাজ আমরা পড়েছি থেকে ফাইল মান আউট এখানে আপ করা হবে. আপনি, মানুষ putchar পারেন তবে এটা ঠিক এর মান নির্বাপণ, এটি যে অক্ষর মুদ্রণ এর. এছাড়াও আপনি ঠিক কি printf ("% c", গ) পারে; একই ধারণা. যে আমাদের এই কাজ বাল্ক করতে যাচ্ছে. শেষ জিনিস আমরা করতে যাচ্ছে সেটি আমাদের ফাইল fclose. আপনি যদি না fclose না, যে একটি মেমরি লিক. আমরা ফাইলটি আমরা মূলত খোলা fclose করতে চান, এবং আমার মনে হয় এটি. যদি আমরা যা করতে, আমি ইতিমধ্যেই সমস্যা আছে. চলুন দেখুন. কি এটি সম্পর্কে অভিযোগ করবো? প্রত্যাশিত 'int' কিন্তু আর্গুমেন্ট 'struct _IO_FILE *' ধরনের হয়. আমরা যদি কাজ করে দেখতে পাবেন. C99 কেবলমাত্র অনুমোদিত. Augh. ঠিক আছে, hacker_typer করা. এখন আমরা আরো দরকারী বিবরণ পেতে. অঘোষিত শনাক্তকারী 'normal_settings' তাই ব্যবহার. আমি এটি normal_settings না কল. আমি এটা বলা current_settings. সুতরাং আসুন যে সব পরিবর্তন. এখন যুক্তি ক্ষণস্থায়ী. আমি এই জন্য এখন 0 করতে হবে. ঠিক আছে. . / Hacker_typer cp.c. আমি পর্দা শুরুতে কি পরিষ্কার না. কিন্তু আপনি শেষ সমস্যা সেট চেহারা ফিরে যাও কিভাবে আপনি পর্দা পরিষ্কার করে দেখতে পারেন. এটা ঠিক এর কিছু অক্ষর মুদ্রণ এই সময় আমি কি করে যেতে চাই করছে. ঠিক আছে. এবং কেন এই পরিবর্তে stdin 0 প্রয়োজন সম্পর্কে চিন্তা, যা # 0 সংজ্ঞায়িত করা উচিত, এই যে অভিযোগ করা হয় - আগে যখন আমি তাকে বললাম যে ফাইল বর্ণনাকারী আছে কিন্তু তারপর আপনি আপনার ফাইল * আছে, একটি ফাইল বর্ণনাকারী হয় কেবলমাত্র একটি পূর্ণসংখ্যা, যেহেতু একটি ফাইল * একটি উপাদান আভা এর সাথে জড়িত আছে. কারণ আমরা পরিবর্তে stdin 0 বলার প্রয়োজন না যে stdin একটি ফাইল * জিনিস যে ফাইল বর্ণনাকারী 0 উল্লেখ করা হয় যা স্থানটিকে চিহ্নিত করে. তাহলেও এখানে যখন আমি fopen না (argv [1], আমি একটি ফাইল * পেয়ে ফিরে করছি. কিন্তু কোথাও যে ফাইল * একটি বিষয় সংশ্লিষ্ট যে ফাইলটি জন্য ফাইল বর্ণনাকারী যাও. যদি man পৃষ্ঠা আপনাকে খোলা জন্য চেহারা, তাই আমি মনে করি আপনি মানুষ 3 খোলা থাকবে না - নাঃ - মানুষের 2 খোলা - হাঁ. আপনি যদি জন্য খোলা পাতা তাকান, খোলা একটি নিম্ন স্তরের fopen ভালো হয়, এবং এটি প্রকৃত ফাইল বর্ণনাকারী ফিরে পাবে. fopen খোলা শীর্ষে স্টাফ একটি গুচ্ছ আছে, পরিবর্তে ফিরে ঠিক যে ফাইল বর্ণনাকারী ফেরৎ * পয়েন্টার পুরো ফাইল যা ভিতর যা আমাদের সামান্য ফাইল বর্ণনাকারী. বোঝায় ফাইল * জিনিস যাও যাতে মান, যেহেতু 0 শুধু নিজেই ফাইল বর্ণনাকারী মান বোঝায়. প্রশ্ন? [Laughs] যে মাধ্যমে Blew. ঠিক আছে. আমরা কাজ করছি. [Laughs] [CS50.TV]