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