1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [القسم 5 - أكثر راحة] 2 00:00:02,500 --> 00:00:04,690 [روب بودين - جامعة هارفارد] 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 I في الجهاز. 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 I تأتي دائما على لنافذة / محطة iTerm2. 19 00:01:08,840 --> 00:01:15,910 يمكنك SSH إلى ذلك العنوان IP، سه 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 بالنسبة لي، وأود أن SSH لrbowden@nice.fas.harvard.edu. 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 لديهم نانو. 47 00:03:12,130 --> 00:03:14,990 نانو عادة ما يكون من السهل جدا للاستخدام. 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 إذا كنت ترغب في الحصول على يتوهم حقا يمكنك استخدام إيماكس، 51 00:03:24,720 --> 00:03:29,850 وأنا ربما لا ينبغي وقد فتحت لأنني لا أعرف حتى كيفية إغلاق ايماكس. 52 00:03:29,850 --> 00:03:32,760 السيطرة X، C التحكم؟ نعم. 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 فإنه يتيح لك SFTP من المفكرة + +، والذي هو في الأساس 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 وتعادل على ماك سيكون 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 و 0s. 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 و 0s إليها، 95 00:06:36,860 --> 00:06:40,220 وعلى الطرف الآخر من خارج للتو من قراءة القياسية التي تيار. 96 00:06:40,220 --> 00:06:43,540 انها مجرد سلسلة من 1s و 0s. 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 على سبيل المثال، دعونا نقول I يحدث لديها ديكت هنا، 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 حتى الآن إذا كنت ليرة سورية، سوف أرى ولدي ملف جديد يسمى الملف. 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 من الناحية الفنية كان الأمر كذلك، فإنه تجاهلت تماما ما كان لدينا. 133 00:09:17,910 --> 00:09:22,970 وأخذت سنرى إذا قمت بتغيير DICT، من كلب. 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 إذا كان الأمر كذلك وضعت في بعض الملفات، النص، وأضع روب، 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 وذلك انه سيكون لقراءة النص من ملف، الذي هو مجرد روب الخط، 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 وستكون لدينا إخراج / TXT <مرحبا، التي ستكون مرحبا، روب! 167 00:12:41,370 --> 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 إذا فعلت بدلا STDOUT fprintf، ثم وهذا ما يعادل في الأساس إلى 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 199 00:15:20,600 --> 00:15:28,830 لأنني لا يمكن إعادة توجيه ملفات TXT فقط، بدلا من ذلك، / لو كنت أردد روب 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 يمكنك التفكير في الأمر على النحو توجيه 1 صدى روب في ملف 204 00:15:49,560 --> 00:15:54,160 ومن ثم الإسهام في / مرحبا هذا الملف الذي أنتج فقط. 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 بذلك، ومن ثم مرحاض. 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 والإنسان هو الذهاب الى الحمام طباعة السطر الجديد، وورد، وعدد وحدات بايت لكل ملف. 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 هذا هو في الواقع الطباعة - دعونا نرى، رجل حمامات - الأسطر الجديدة، والكلمات، وعدد البايت. 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 تصفية خطوط مطابقة المجاورة. 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 داخل هذا PDF، سترى هذا الأمر، 247 00:19:29,100 --> 00:19:32,950 وسوف تحتاج إلى تشغيل هذا الأمر في الأجهزة الخاصة بك. 248 00:19:36,240 --> 00:19:42,250 مجلد مشترك هو الأمر لمجرد الحصول على شيء من الإنترنت، في الأساس، 249 00:19:42,250 --> 00:19:45,180 وحتى مجلد مشترك 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 ولكن كتابة مجلد مشترك من هذا الشيء داخل المحطة 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 حتى مهمتكم هي لمعرفة لماذا استخدام جدب. 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 [طالب] يعتبر إلغاء مرجعية مؤشر فارغة. نعم >>. بحيث هو مثال واحد. 265 00:21:08,210 --> 00:21:11,580 يعتبر إلغاء مرجعية مؤشر فارغة وأنت تسير في الحصول على سوف segfault. 266 00:21:11,580 --> 00:21:16,720 ما سوف segfault يعني كنت لمس الذاكرة يجب أن لا يتم لمس. 267 00:21:16,720 --> 00:21:21,350 يعتبر إلغاء مرجعية ذلك مؤشر فارغة لمس عنوان 0، 268 00:21:21,350 --> 00:21:28,060 وأساسا، كافة أجهزة الكمبيوتر في الوقت الحاضر أن نقول 0 العنوان هو الذاكرة التي لا ينبغي أن تمس. 269 00:21:28,060 --> 00:21:31,920 ولهذا السبب يعتبر إلغاء مرجعية لنتائج مؤشر فارغة في سوف segfault. 270 00:21:31,920 --> 00:21:37,210 عندما كنت يحدث لتتم تهيئة مؤشر، ثم أنه يحتوي على قيمة القمامة، 271 00:21:37,210 --> 00:21:41,520 وذلك عند محاولة إلغاء مرجعية لها، في جميع الاحتمالات كنت لمس الذاكرة 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 ثم عند إلغاء مرجعية هذا المؤشر الذي لديك لم يتم تهيئة، 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 عند كتابة دالة العودية وrecurses مرات كثيرة جدا 281 00:22:06,370 --> 00:22:08,720 والكدسة ينمو كبيرة جدا ويصطدم في كومة الأشياء 282 00:22:08,720 --> 00:22:12,270 أنه لا ينبغي أن تصطدم معها، كنت لمس الذاكرة يجب أن لا يتم لمس، 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 صباحا مجرد الذهاب الى تقديم شيء آخر. 288 00:22:28,530 --> 00:22:33,770 تشار * S = "أهلا بالعالم!"؛ 289 00:22:33,770 --> 00:22:42,310 * إذا كنت تستخدم ق = ق أو شيء [0] = 'X'؛ 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 [طالب] X مرحبا. نعم >>. 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 هذا هو في الواقع فرق كبير بين شار * S شار وق []. 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 تذكر أنه عندما أفعل شار * S = "أهلا بالعالم!"، ق نفسه هو على المكدس 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 بدلا من ذلك، سوف نبحث في ذلك من خلال جدب. 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 حتى جدب 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 أو التتبع المعاكس، التي ستكون وظيفة 333 00:26:15,360 --> 00:26:19,430 أن يعطينا قائمة إطارات المكدس الحالي لدينا. 334 00:26:19,430 --> 00:26:23,150 حتى التتبع المعاكس. يبدو ليس لدينا سوى إطارات المكدس اثنين. 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 ولكن يمكن أن نأخذ خطوة واحدة أخرى ويقول: "لماذا argv [1] سوف segfault؟" 352 00:27:28,800 --> 00:27:38,830 طباعة دعونا argv [1]، ويبدو انها 0x0، وهو مؤشر فارغة. 353 00:27:38,830 --> 00:27:44,750 نحن strcmping CS50 الصخور وفارغة، وبحيث سيكون لسوف 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 انها لن يكون لها argv [1]، لذلك أن يحدث لسوف 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"، وإلا "تحصل على A!" 363 00:28:20,820 --> 00:28:25,660 إذا كان الأمر كذلك فإننا نريد A، نحن بحاجة لمقارنة هذه على النحو الصحيح، 364 00:28:25,660 --> 00:28:28,710 مما يعني أنه يقارن إلى 0. 365 00:28:28,710 --> 00:28:31,100 حتى argv [1] يجب أن يكون "CS50 الصخور". 366 00:28:31,100 --> 00:28:35,660 إذا كنت ترغب في القيام بذلك على سطر الأوامر، تحتاج إلى استخدام \ هربا من الفضاء. 367 00:28:35,660 --> 00:28:41,690 حتى CS50 \ الصخور وتحصل على A! 368 00:28:41,690 --> 00:28:44,060 إذا كنت لا تفعل مائل، لماذا لا تعمل هذه؟ 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 حتى جدب 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 أبحث في التتبع المعاكس لنا، ونحن نرى أن كنا في 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 يقوم به فقط شار ** S = NULL؛ 382 00:29:44,390 --> 00:29:47,410 * S = "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 هذا هو فقط أقول هذا هو NULL، بغض النظر إذا كان هذا يحدث ليكون ** شار، 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 انها ليالي هو NULL، لذلك يعتبر إلغاء مرجعية * S هو مؤشر فارغة، 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 إذا لم تقم بإدخال أمر وكنت مجرد ضرب أدخل مرة أخرى، 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 انتقل إلى وظيفة أخرى فاتنة. 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 والآن نعود في الرئيسي، والرئيسي هو الذهاب لمجرد أن يكون الباحث ط = RAND ()٪ 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 وأنا أعتقد أنه يهم في السابق، ولكن كنا نريد لاستخدام المقبل. 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 ولكن أنا لا يهمني الدالة RAND. 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)، I اتخاذ خطوة، 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 إذا كنت مجرد إلقاء نظرة على هذه الخطوط مباشرة، قد تعتقد اذا كان (ط == 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 لأنني = 1 يستدعي oh_no ظيفة، والتي يمكنك الخطوة إلى، 451 00:34:46,489 --> 00:34:52,969 التي سيتم وضع حرف S = ** لاغية وعلى الفور "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، استدعاء آخر فاتنة، والتي تأتي إلى هنا، 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 >> أعتقد طريقة واحدة لتحديد ذلك سيكون بدلا من القيام شار ** S = NULL، 464 00:35:52,380 --> 00:35:55,610 هل يمكن لهذا الفضاء malloc السلسلة. 465 00:35:55,610 --> 00:36:04,230 يمكن أن نفعل malloc (sizeof) - 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 ننظر إلى نوع من ليالي. دعونا نضيف * الباحث، لذلك الباحث * س. 469 00:36:32,940 --> 00:36:35,600 وأود أن تفعل malloc (sizeof (الباحث)). 470 00:36:35,600 --> 00:36:40,490 أو إذا أردت مجموعة من 5، أود أن تفعل (sizeof (الباحث) * 5)؛ 471 00:36:40,490 --> 00:36:44,210 ماذا لو لدي ** الباحث؟ 472 00:36:46,260 --> 00:36:49,140 ما أود malloc؟ 473 00:36:49,140 --> 00:36:53,510 [طالب] حجم المؤشر. نعم >>. (sizeof (كثافة العمليات *))؛ 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 ثم * S * هو حرف وكنت تعيين هذه شار * للإشارة إلى "BOOM". 483 00:37:43,900 --> 00:37:50,040 إذا أردت أن نسخ "BOOM" في ثانية، ثم أود أن تحتاج إلى تخصيص مساحة ليالي. 484 00:37:55,170 --> 00:38:03,900 سأفعل * S = 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 * S = من "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] = 'X'؛ 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، دعونا GDB buggy3. 516 00:40:35,500 --> 00:40:39,840 نحن فقط تشغيله، ونحن نرى أن نحصل على سوف segfault. 517 00:40:39,840 --> 00:40:46,550 إذا كنا التتبع المعاكس، لا يوجد سوى اثنين من وظائف. 518 00:40:46,550 --> 00:40:52,970 إذا كان لنا أن ترتفع إلى وظيفتنا الرئيسية، ونحن نرى أننا في segfaulted هذا الخط. 519 00:40:52,970 --> 00:41:00,180 حتى مجرد النظر في هذا الخط، ل(الباحث خط = 0؛ fgets هذه الاشياء لا NULL لا على قدم المساواة؛ 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 سترى أن كثيرا مع وظائف C المدمج في، 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 الملف هو من نوع FILE *، لذلك هو المؤشر، 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 ولكن من أجل الوصول إلى هذا المؤشر، فقد لإلغاء مرجعية ذلك. 548 00:43:37,320 --> 00:43:40,550 أو، من أجل الوصول إلى ما ينبغي أن يكون لافتا إلى أنه dereferences ذلك. 549 00:43:40,550 --> 00:43:43,810 لذلك يعتبر إلغاء مرجعية انها مؤشر فارغة وsegfaults ذلك. 550 00:43:46,600 --> 00:43:48,730 يمكن أن يكون إعادة تشغيل I هناك. 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 حتى الآن نحن تحقق لمعرفة ما اذا كان NULL 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 ترجع NULL. 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 على التوالي. انا التخمين هذا هو انتظار إدخال أو حلقات لانهائية ربما. 575 00:45:58,440 --> 00:46:01,870 نعم، انها حلقات لانهائية. 576 00:46:01,870 --> 00:46:05,560 حتى buggy4. يبدو أننا حلقات لانهائية. 577 00:46:05,560 --> 00:46:12,590 يمكننا كسر في الرئيسية، تشغيل برنامجنا. 578 00:46:12,590 --> 00:46:20,180 في جدب، طالما كنت تستخدم اختصار هو لا لبس فيها 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 بدلا من الاضطرار لتصل ن أدخل، أدخل ن، ن أدخل. 583 00:46:36,640 --> 00:46:44,630 يبدو أنا في نوع من لحلقة هذا ما وضع مجموعة [أنا] إلى 0. 584 00:46:44,630 --> 00:46:50,510 يبدو أنني لم الخروج من هذه الحلقة ل. 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 لكن يبدو أن هناك بعض الأوامر جدب خاصة للذهاب حتى يحدث شيء. 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 إذا كان لنا أن مجرد عرض الأول، فإنه سيتم طرح هنا ما قيمة i هو 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، ونحن نرى كل ما يحدث هو مجموعة الباحث [5]؛ 599 00:48:22,220 --> 00:48:26,200 ل(ط = 0، وأنا <= sizeof (مجموعة)، وأنا + +) 600 00:48:26,200 --> 00:48:28,550 مجموعة [ط] = 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 (الباحث) بايت، حيث sizeof (الباحث) يميل إلى أن يكون 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 (الباحث). نعم >>، / sizeof (الباحث). 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 الشيء الوحيد داخل هنا أن يحدث هو أن مجموعة [ط] ويجري تعيين إلى 0. 617 00:50:09,350 --> 00:50:15,350 على نحو ما كان الأمر كذلك، هذا الخط من التعليمات البرمجية تسبب الباحث لدينا أن أضع إلى 0. 618 00:50:16,730 --> 00:50:23,130 يمكن [طالب] يكون ذلك بسبب انها تجاوز ذكرى هذا الجزء من أنا 619 00:50:23,130 --> 00:50:27,970 عندما يعتقد انها العنصر التالي من مجموعة؟ >> [بودين] نعم. 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 لذلك عندما وضعناها مجموعة [5] إلى 0، ونحن ط وضع إلى 0. 632 00:51:38,410 --> 00:51:46,070 وإذا كنت تفكر في هذا من حيث المكدس، 633 00:51:46,070 --> 00:51:55,590 الباحث وأعلن لي أولا، وهو ما يعني أنني يحصل بعض المساحة على المكدس. 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 عند مؤشر إلى صفيف، ويضمن لنا أن موقف 0 في الصفيف 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 نحن تخصيص عدد صحيح الأول، وهو ما يعني دعونا نقول فقط هنا عدد صحيح يحصل المخصصة ط. 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 هذا النوع من الأخطاء؟ لا تستخدم لغة البرمجة C كما الخاصة بك. 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 [بودين] حيث ان تبدأ الامور تسير بشكل خاطئ. >> [طالب] أوه، حسنا. 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 هو الطريق إلى أبعد مما ينبغي تغيير I، 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 [طالب] وهكذا ينبغي لنا أن تغيرت فقط <= لمجرد <؟ >> [بودين] نعم. 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 [بودين] مثل ما هو صفيف؟ 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 ("٪ P \ 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 ولكن عندما أفعل شيئا من هذا القبيل * الباحث مجموعة = P، أما الآن ف هو مؤشر الذي يشير إلى أن مجموعة، 727 00:59:53,730 --> 00:59:57,830 والآن ف فعلا موجود على المكدس. 728 00:59:57,830 --> 01:00:01,950 أنا حرة لتغيير ف. يمكنني أن أفعل p = 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 في الواقع، أنا متأكد من دول مجلس التعاون الخليجي سوف نفعل ذلك أيضا. 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 [بودين] ليست المخزنة في أي مكان. انها عندما يكون تجميع. 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 حتى لو كنت تفعل بعض من وظيفة، فو، والقيام I (الباحث مجموعة []) 742 01:01:03,150 --> 01:01:10,450 printf ("٪ د \ ن"، sizeof (مجموعة))؛ 743 01:01:10,450 --> 01:01:21,330 ثم إلى هنا أدعو فو (مجموعة)؛ 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 سيعود حجم '* كثافة العمليات'. 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 هذه المجموعة كثافة العمليات هو مجرد الذهاب لطباعة sizeof (كثافة العمليات *). 755 01:02:34,120 --> 01:02:39,790 حتى لو وضعت مجموعة [5] هنا، انها لا تزال مجرد الذهاب لطباعة sizeof (كثافة العمليات *). 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. 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 (الباحث)، والمترجم يترجم ذلك تماما إلى 4. 769 01:03:41,480 --> 01:03:43,700 حصلت عليه؟ حسنا. 770 01:03:43,700 --> 01:03:47,520 >> [طالب] فما هو الفرق بين sizeof (مجموعة) في الرئيسية وفي فو؟ 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 >> [طالب] حتى إذا كان لديك المعلمة في مجموعة [] بدلا من مجموعة الباحث *، 774 01:04:04,540 --> 01:04:09,230 فهل يعني ذلك لك قد تتغير بسبب مجموعة الآن حان مؤشر؟ 775 01:04:09,230 --> 01:04:14,250 [بودين] مثل هذا؟ >> [طالب] نعم. يمكنك تغيير مجموعة ضمن الدالة الآن؟ 776 01:04:14,250 --> 01:04:18,420 [بودين] هل يمكن تغيير مجموعة في كلتا الحالتين. 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 [بودين] أوه. نعم. في كلتا الحالتين - >> [طالب] نعم. 780 01:04:30,230 --> 01:04:38,410 [بودين] التمييز بين مجموعة [] ومجموعة * الباحث، هناك لا شيء. 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 (الباحث))، ويشير الآن في مكان آخر. 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 * الباحث ذلك ف sizeof (ع) هو الذهاب الى طباعة 4، 820 01:07:57,470 --> 01:08:04,110 ولكن الباحث مجموعة [5] طباعة sizeof (مجموعة) هو الذهاب الى طباعة 20. 821 01:08:04,110 --> 01:08:07,480 [طالب] وهكذا الباحث مجموعة [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 نريد I <5. >> [طالب] حسنا. 825 01:08:20,880 --> 01:08:25,569 [بودين] وبعد ذلك بمجرد بدء يمر في وظائف، 826 01:08:25,569 --> 01:08:34,340 إذا فعلنا الباحث * p = مجموعة؛ 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 وبمجرد أن يقول فو (مجموعة)، أو فو (ع)؛ 831 01:08:55,600 --> 01:08:59,760 داخل الدالة فو، وهذا هو نفس المكالمة مرتين. 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 >> سنحاول من خلال الحصول على هذا البرنامج من نوع هاكر، 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 وبعد ذلك طباعة حرف واحد من الملف مرت في كل مرة يقوم المستخدم بالضغط على مفتاح. 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 - أنا التخمين انها محطة OS أو شيء - 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 يساوي ذلك. >> [بودين] نعم. 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 [طالب] اسم الملف. >> [بودين] اسم الملف سيكون argv [1]. 868 01:13:22,980 --> 01:13:26,110 [طالب] وبعد ذلك ما تريد أن تفعله حيال ذلك، وبالتالي فإن - >> [بودين] نعم. 869 01:13:26,110 --> 01:13:28,740 حتى إذا كنت لا تذكر، هل يمكن أن تفعل فقط الدالة fopen الرجل، 870 01:13:28,740 --> 01:13:32,960 حيث انها ستكون CONST مسار * شار حيث أن path هو اسم الملف، 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 داخل صفحات الرجل، مائل الحرف هو ما يمكنك استخدامها للبحث عن الأشياء. 874 01:13:44,660 --> 01:13:49,790 اكتب ذلك I / وضع للبحث عن واسطة. 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 الشيء هو سيكون * FILE. الآن ماذا أريد أن أفعل؟ 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 [طالب] تحقق ما اذا كان NULL. >> [بودين] نعم. 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 لرمي بعيدا أي حرف I اكتب، 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 وبالتالي فإن البنية ستكون من نوع 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 ونحن نرى أن لدينا هذا tcsetattr الباحث، الباحث tcgetattr. 898 01:16:15,810 --> 01:16:22,960 أمرر في البنية termios بواسطة مؤشر لها. 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، ثم أريد أن تمر في البنية أنني إنقاذ المعلومات في، 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 أو يمكنني القيام به ستدين. 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 وكيف البنيات العمل فإنه مجرد نسخ. 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 هذا هو ما يشبه البنية. 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 هذا هو المكان الذي نصل إلى مشغلي أحادي المعامل. 939 01:19:52,280 --> 01:19:54,860 نحن نوع من الخروج من الزمن، ولكننا سوف يمر منه سريعة الحقيقي. 940 01:19:54,860 --> 01:19:56,600 هذا هو المكان الذي نصل إلى مشغلي أحادي المعامل، 941 01:19:56,600 --> 01:19:59,950 حيث أعتقد قلت مرة واحدة منذ فترة طويلة أنه كلما كنت بدء التعامل مع الأعلام، 942 01:19:59,950 --> 01:20:03,370 وأنت تسير إلى استخدام أحادي المعامل مشغل الكثير. 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 ولكن ما أريد القيام به هو بدوره قبالة بت والتي تتطابق مع الصدى. 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 ذلك. انها مجرد ECHO. 949 01:20:34,050 --> 01:20:38,440 ECHO سيكون قليلا واحد. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO سوف يعني يتم تعيين كافة البتات إلى 1، مما يعني يتم تعيين كافة الأعلام إلى true 951 01:20:44,230 --> 01:20:47,140 باستثناء بعض الشيء ECHO. 952 01:20:47,140 --> 01:20:53,830 من خلال إنهاء أعلام مدينتي مع هذا، فإنه يعني كل الأعلام التي تم تعيينها حاليا إلى true 953 01:20:53,830 --> 01:20:56,520 سوف لا يزال يتم تعيين إلى true. 954 01:20:56,520 --> 01:21:03,240 إذا تم تعيين وائي ECHO إلى true، ثم يتم تعيين هذا إلى false بالضرورة على العلم 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 هو على الأرجح الأفضل أن نقول صراحة ستدين. 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 المعيار في أي شيء لا يتم معالجة حتى تصل السطر الجديد. 963 01:21:54,670 --> 01:21:58,230 لذلك كنت اكتب عندما كنت GetString، حفنة من الأشياء، ثم تضغط على زر السطر الجديد. 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 منذ أنا لا أريد أن انتظر لي لتصل إلى السطر الجديد 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 ثم لتغيير منهم فقط إلى الوراء، I تمريرها مرة أخرى في نهاية المطاف. 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 هو مجرد انه سيكون لإرجاع الحرف الذي قرأت للتو أو EOF، 993 01:24:11,910 --> 01:24:15,680 والتي تتطابق مع نهاية الملف أو بعض حدوث الخطأ. 994 01:24:15,680 --> 01:24:19,900 نحن حلقات، الاستمرار في قراءة حرف واحد من الملف، 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 يتوقع 'الباحث' ولكن الحجة هي من نوع 'البنية _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 والتفكير لماذا هذا يحتاج إلى 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 قبل عندما قلت أن هناك اصفات الملف ولكن ثم لديك أيضا * FILE الخاص، 1028 01:27:19,360 --> 01:27:23,210 واصف الملف هو مجرد عدد صحيح واحد، 1029 01:27:23,210 --> 01:27:26,970 في حين أن لديه FILE * مجموعة كاملة من الاشياء المرتبطة به. 1030 01:27:26,970 --> 01:27:30,380 السبب في أننا بحاجة إلى أن أقول 0 بدلا من ستدين 1031 01:27:30,380 --> 01:27:37,480 هو أن ستدين هو FILE * الذي يشير إلى الشيء الذي يتم الرجوع اصف الملف 0. 1032 01:27:37,480 --> 01:27:45,070 وحتى مع ذلك هنا عندما أفعل الدالة fopen (argv [1]، وأنا الحصول على الملف مرة أخرى *. 1033 01:27:45,070 --> 01:27:51,180 ولكن في مكان ما في هذا FILE * هو شيء الموافق ملف واصف لهذا الملف. 1034 01:27:51,180 --> 01:27:57,430 إذا نظرتم الى صفحة مفتوحة للرجل، لذلك أعتقد سيكون لديك للقيام رجل 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 معيار ذلك في يشير إلى شيء FILE *، 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 فجر [يضحك] من خلال ذلك. 1045 01:28:35,930 --> 01:28:39,140 حسنا. ننتهي. [يضحك] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]