1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [القسم 5: أقل راحة] 2 00:00:02,730 --> 00:00:05,180 [نيت Hardison، جامعة هارفارد] 3 00:00:05,180 --> 00:00:08,260 [هذا CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 نرحب مرة أخرى حتى، رجال. 5 00:00:11,690 --> 00:00:16,320 مرحبا بكم في القسم 5. 6 00:00:16,320 --> 00:00:20,220 في هذه المرحلة، بعد أن استكملت مسابقة 0 وبعد أن شهدت كيف قمت به، 7 00:00:20,220 --> 00:00:25,770 نأمل أن أشعر أنني بحالة جيدة حقا لأن لقد تأثرت كثيرا من النقاط في هذا القسم. 8 00:00:25,770 --> 00:00:28,050 للمشاهدين عبر الإنترنت، لدينا بضعة أسئلة 9 00:00:28,050 --> 00:00:33,680 حول المشاكل الماضيين على مجموعة مشكلة - أو على مسابقة، إلى حد ما. 10 00:00:33,680 --> 00:00:39,690 لذلك نحن في طريقنا للذهاب بسرعة على هذه الحقيقة حتى أن الجميع يرى ما حدث 11 00:00:39,690 --> 00:00:45,060 وكيف أن يذهب من خلال الحل الفعلي بدلا من النظر فقط الحل نفسه. 12 00:00:45,060 --> 00:00:50,330 ونحن في طريقنا للذهاب خلال العقدين الماضيين من المشاكل بسرعة حقا و 32 و 33. 13 00:00:50,330 --> 00:00:53,240 فقط، مرة أخرى، بحيث يمكن للمشاهدين عبر الإنترنت شاهد. 14 00:00:53,240 --> 00:00:59,080 >> إذا كنت أنتقل إلى مشكلتك 32، والذي هو في صفحة 13، 15 00:00:59,080 --> 00:01:02,730 13 من 16، 32 هو المشكلة كل شيء عن التبادل. 16 00:01:02,730 --> 00:01:05,010 كان كل شيء عن مبادلة اثنين من الأعداد الصحيحة. 17 00:01:05,010 --> 00:01:08,740 انها المشكلة التي نحن قد ذهب أكثر من بضع مرات في المحاضرة. 18 00:01:08,740 --> 00:01:13,590 وهنا، ما كنا يطلب منك القيام به هو عملية تتبع الذاكرة سريع. 19 00:01:13,590 --> 00:01:17,000 لملء في قيم المتغيرات كما هي على المكدس 20 00:01:17,000 --> 00:01:20,250 كما رمز يمر عبر هذه الوظيفة المبادلة. 21 00:01:20,250 --> 00:01:24,500 على وجه الخصوص، ما نحن نبحث في - أنا ذاهب لوضع هذه أسفل باد - 22 00:01:24,500 --> 00:01:29,650 على وجه الخصوص، ما نحن نبحث في هذا الخط هو مرقمة 6 الحق هنا. 23 00:01:29,650 --> 00:01:36,740 وانها مرقمة من 6 لتواصل فقط مع المشكلة السابقة. 24 00:01:36,740 --> 00:01:41,720 ما نريد القيام به هو عرض أو علامة للدولة من الذاكرة 25 00:01:41,720 --> 00:01:46,090 كما هو في الوقت الذي نقوم بتنفيذ هذا رقم السطر 6، 26 00:01:46,090 --> 00:01:52,540 التي هي بالفعل العودة من وظيفة مبادلة لدينا هنا. 27 00:01:52,540 --> 00:01:59,450 إذا كان لنا أن انتقل لأسفل هنا، رأينا أن قدمت عناوين من كل شيء في الذاكرة بالنسبة لنا. 28 00:01:59,450 --> 00:02:02,540 هذا هو المفتاح للغاية، ونحن سوف نعود إليه في لحظة واحدة. 29 00:02:02,540 --> 00:02:09,240 ثم إلى هنا في الأسفل، كان لدينا مخطط الذاكرة الصغيرة التي نحن في طريقنا للإشارة إلى. 30 00:02:09,240 --> 00:02:12,490 وقد فعلت فعلا من ذلك على باد الخاص بي. 31 00:02:12,490 --> 00:02:20,720 لذلك أنا ذاهب إلى البديل ذهابا وإيابا بين آي باد ورمز هذا فقط للرجوع اليها. 32 00:02:20,720 --> 00:02:26,540 >> دعونا نبدأ. أولا، دعونا نركز على أول زوجين من الخطوط الرئيسية من هنا. 33 00:02:26,540 --> 00:02:30,220 للبدء، ونحن في طريقنا لتهيئة X و y إلى 1 إلى 2. 34 00:02:30,220 --> 00:02:33,040 لذلك لدينا متغيرين عدد صحيح، وانهم على حد سواء سوف توضع على المكدس. 35 00:02:33,040 --> 00:02:36,050 ونحن في طريقنا لوضع 1 و 2 من فيها. 36 00:02:36,050 --> 00:02:43,150 حتى لو كنت على الوجه لباد بلدي، ونأمل، دعونا نرى - 37 00:02:43,150 --> 00:02:48,660 آبل النسخ المتطابق، ونحن نذهب إلى هناك. حسنا. 38 00:02:48,660 --> 00:02:51,670 حتى لو كنت على الوجه لباد بلدي، 39 00:02:51,670 --> 00:02:56,220 أريد أن تهيئة X و y إلى 1 إلى 2. 40 00:02:56,220 --> 00:03:00,580 ونحن نفعل ذلك بكل بساطة عن طريق كتابة 1 في المربع وضع علامة X 41 00:03:00,580 --> 00:03:07,730 ويمثل 2 في المربع ذ. بسيطة إلى حد ما. 42 00:03:07,730 --> 00:03:11,620 حتى الآن دعونا نعود إلى الكمبيوتر المحمول، ونرى ما سيحدث بعد ذلك. 43 00:03:11,620 --> 00:03:15,810 لذلك هذا هو السطر التالي حيث تصبح الأمور صعبة. 44 00:03:15,810 --> 00:03:28,110 نحن نمر عنوان x و Y عنوان كمعلمات أ و ب إلى وظيفة المبادلة. 45 00:03:28,110 --> 00:03:32,380 عنوان x و Y عنوان هي الأشياء التي لا يمكننا حساب 46 00:03:32,380 --> 00:03:36,360 دون الإشارة إلى هذه الرصاصة يشير صولا هنا. 47 00:03:36,360 --> 00:03:39,750 ولحسن الحظ، أول اثنين من النقاط يقول لنا بالضبط ما هي الأجوبة. 48 00:03:39,750 --> 00:03:44,740 عنوان X في الذاكرة هو 10، وعنوان Y في الذاكرة هو 14. 49 00:03:44,740 --> 00:03:51,870 حتى تلك هي القيم التي مرت في الحصول على وأ و ب في وظيفة أعلى حتى مبادلة لدينا. 50 00:03:51,870 --> 00:04:00,760 ذلك مرة أخرى، والتحول مرة أخرى إلى الرسم البياني لدينا، ويمكنني أن اكتب 10 في 51 00:04:00,760 --> 00:04:07,400 وب 14 في. 52 00:04:07,400 --> 00:04:11,610 الآن، وهذا هو وضعنا نقطة المضي قدما في المبادلة. 53 00:04:11,610 --> 00:04:14,520 التقليب حتى عودة إلى كمبيوتر محمول جديد، 54 00:04:14,520 --> 00:04:21,079 ونحن نرى أن الطريقة التي تعمل مبادلة هو أنني لأول مرة إلغاء مرجعية وتخزين النتيجة في TMP. 55 00:04:21,079 --> 00:04:27,650 وبالتالي فإن المشغل إلغاء مرجعية يقول: "يا. علاج محتويات متغير كعنوان. 56 00:04:27,650 --> 00:04:33,830 انتقل إلى كل ما هو مخزن في هذا العنوان، وتحميله ". 57 00:04:33,830 --> 00:04:41,720 ما قمت بتحميل من متغير يجري ليتم تخزينها في متغير TMP لدينا. 58 00:04:41,720 --> 00:04:45,150 عودة إلى التقليب باد. 59 00:04:45,150 --> 00:04:51,690 إذا ذهبنا إلى العنوان 10، ونحن نعلم أن 10 هو عنوان X varible 60 00:04:51,690 --> 00:04:55,480 لأن قيل لنا من قبل النقطة التي لدينا عنوان في الذاكرة X هو 10. 61 00:04:55,480 --> 00:05:00,180 حتى نتمكن من الذهاب إلى هناك، والحصول على قيمة، والذي هو 1، كما نرى في باد لدينا، 62 00:05:00,180 --> 00:05:06,300 وذلك في تحميل TMP. 63 00:05:06,300 --> 00:05:08,250 مرة أخرى، هذه ليست محتويات النهائي. 64 00:05:08,250 --> 00:05:14,350 ونحن في طريقنا إلى المشي من خلال ونحن سنصل إلى دولتنا النهائي للبرنامج في نهاية المطاف. 65 00:05:14,350 --> 00:05:17,210 ولكن في الوقت الراهن، لدينا القيمة 1 المخزنة في TMP. 66 00:05:17,210 --> 00:05:19,210 >> وهناك سؤال سريع أكثر من هنا. 67 00:05:19,210 --> 00:05:23,980 [ألكسندر] هي المشغل إلغاء مرجعية - هذا مجرد حق نجمة أمام المتغير؟ 68 00:05:23,980 --> 00:05:27,600 نعم >>. وبالتالي فإن المشغل إلغاء مرجعية، ونحن نقف إلى كمبيوتر محمول لدينا مرة أخرى، 69 00:05:27,600 --> 00:05:33,780 هو هذا النجم الحق في الجبهة. 70 00:05:33,780 --> 00:05:37,460 وبهذا المعنى، فإنه - كنت على النقيض مع المشغل الضرب 71 00:05:37,460 --> 00:05:42,400 الأمر الذي يتطلب أمرين، وإلغاء مرجعية المشغل هو مشغل أحادي. 72 00:05:42,400 --> 00:05:46,130 تطبيق لقيمة واحدة فقط بدلا من مشغل ثنائي، 73 00:05:46,130 --> 00:05:48,810 حيث تقوم بتطبيقها على قيمتين مختلفة. 74 00:05:48,810 --> 00:05:52,080 بحيث ما يحدث في هذا الخط. 75 00:05:52,080 --> 00:05:58,390 حملنا القيمة 1 وتخزينها في متغير عدد صحيح لدينا مؤقتة. 76 00:05:58,390 --> 00:06:05,800 السطر التالي، نقوم بتخزين محتويات ب إلى - 77 00:06:05,800 --> 00:06:12,630 أو، بدلا من ذلك، نقوم بتخزين المحتويات التي يتم الإشارة إلى ب في المكان الذي يتم الإشارة إلى. 78 00:06:12,630 --> 00:06:17,690 إذا حللنا هذا من اليمين إلى اليسار، ونحن نذهب إلى إلغاء مرجعية ب، 79 00:06:17,690 --> 00:06:23,580 نحن نذهب لمعالجة 14، ونحن نذهب للاستيلاء على عدد صحيح هو هناك، 80 00:06:23,580 --> 00:06:26,900 ومن ثم نحن في سبيلنا للذهاب إلى عنوان 10، 81 00:06:26,900 --> 00:06:34,240 ونحن نذهب لرمي نتيجة لإلغاء مرجعية لدينا في هذه المساحة ب. 82 00:06:34,240 --> 00:06:40,080 التقليب مرة أخرى إلى آي باد لدينا، حيث أننا يمكن أن تجعل هذا قليلا أكثر واقعية، 83 00:06:40,080 --> 00:06:44,070 قد يساعد إذا أنا أكتب الأرقام على كافة العناوين هنا. 84 00:06:44,070 --> 00:06:53,820 لذلك نعرف ان في ذ، ونحن في العنوان 14، x هو في العنوان 10. 85 00:06:53,820 --> 00:07:00,180 عندما نبدأ في B، ونحن ب إلغاء مرجعية، ونحن في طريقنا للاستيلاء على القيمة 2. 86 00:07:00,180 --> 00:07:08,320 نحن نذهب للاستيلاء على هذه القيمة لأن ذلك هو القيمة التي يعيش في العنوان 14. 87 00:07:08,320 --> 00:07:15,700 ونحن في طريقنا لوضعها موضع المتغير الذي يعيش في العنوان 10، 88 00:07:15,700 --> 00:07:19,160 وهو هناك حق، المقابلة لدينا X متغير. 89 00:07:19,160 --> 00:07:21,810 حتى نتمكن من القيام قليلا من الكتابة هنا 90 00:07:21,810 --> 00:07:35,380 حيث نتخلص من 1 لدينا وبدلا من ذلك نكتب (أ) 2. 91 00:07:35,380 --> 00:07:39,560 لذلك كل من حسن وجيد في العالم، على الرغم من أننا قمت X الكتابة الآن. 92 00:07:39,560 --> 00:07:44,890 نحن بتخزينها قيمة x القديمة في متغير TMP لدينا. 93 00:07:44,890 --> 00:07:50,210 حتى نتمكن من إكمال مبادلة مع السطر التالي. 94 00:07:50,210 --> 00:07:53,030 التقليب مرة أخرى إلى جهاز الكمبيوتر المحمول لدينا. 95 00:07:53,030 --> 00:07:58,150 الآن كل ما تبقى هو أن تأخذ محتويات متغير من لدينا عدد صحيح المؤقتة 96 00:07:58,150 --> 00:08:05,630 وتخزينها في المتغير الذي يعيش في العنوان الذي تحتجز ب. 97 00:08:05,630 --> 00:08:10,230 لذلك نحن ذاهبون الى إلغاء مرجعية ب فعال للوصول إلى المتغير 98 00:08:10,230 --> 00:08:14,340 وهذا هو في العنوان الذي يحمل فيه ب، 99 00:08:14,340 --> 00:08:19,190 ونحن في طريقنا الى الاشياء القيمة التي TMP تحتجز فيه. 100 00:08:19,190 --> 00:08:23,280 عودة إلى التقليب باد مرة أخرى. 101 00:08:23,280 --> 00:08:31,290 هل يمكنني مسح هذه القيمة هنا، 2، 102 00:08:31,290 --> 00:08:41,010 وبدلا من ذلك سنقوم نسخ الحق 1 في ذلك. 103 00:08:41,010 --> 00:08:43,059 ثم السطر التالي الذي ينفذ، وبطبيعة الحال - 104 00:08:43,059 --> 00:08:47,150 إذا كان لنا أن نقف مرة أخرى إلى الكمبيوتر المحمول - هو هذا 6 نقاط، 105 00:08:47,150 --> 00:08:52,500 وهو النقطة التي كنا نريد أن يكون لدينا مخطط شغل بالكامل. 106 00:08:52,500 --> 00:08:58,940 التقليب حتى عودة إلى باد مرة أخرى، فقط حتى تستطيع أن ترى في الرسم البياني الانتهاء، 107 00:08:58,940 --> 00:09:06,610 يمكنك أن ترى أن لدينا 10 في، 14 في ب، 1 في TMP، وهي 2 في العاشر، و1 في ذ. 108 00:09:06,610 --> 00:09:11,000 هل هناك أي أسئلة حول هذا؟ 109 00:09:11,000 --> 00:09:14,640 هل هذا أكثر منطقية، بعد أن مشى من خلال ذلك؟ 110 00:09:14,640 --> 00:09:24,850 جعل من المنطق؟ نأمل أن لا. حسنا. 111 00:09:24,850 --> 00:09:28,230 >> مؤشرات هي موضوع صعب للغاية. 112 00:09:28,230 --> 00:09:33,420 واحد من اللاعبين ونحن نعمل مع القول لديه شائعة جدا: 113 00:09:33,420 --> 00:09:36,590 "لفهم المؤشرات، يجب أولا أن نفهم المؤشرات." 114 00:09:36,590 --> 00:09:40,530 وهو ما أعتقد أنه صحيح جدا. الأمر يستغرق بعض الوقت لتعتاد على ذلك. 115 00:09:40,530 --> 00:09:45,360 الرسم الكثير من الصور، القرعة من المخططات مثل هذه الذاكرة هي مفيدة جدا، 116 00:09:45,360 --> 00:09:49,480 وبعد المشي من خلال مثالا تلو بعد سبيل المثال، 117 00:09:49,480 --> 00:09:54,450 وأنها سوف تبدأ في معنى أكثر من ذلك بقليل والشعور أكثر من ذلك بقليل والشعور أكثر من ذلك بقليل. 118 00:09:54,450 --> 00:10:01,560 وأخيرا، يوم واحد، سيكون لديك كل شيء يتقن تماما. 119 00:10:01,560 --> 00:10:13,800 أي سؤال قبل أن ننتقل إلى مشكلة في المرة القادمة؟ حسنا. 120 00:10:13,800 --> 00:10:18,840 الوجه حتى عودة إلى كمبيوتر محمول. 121 00:10:18,840 --> 00:10:23,300 المشكلة القادمة لدينا هو المشكلة رقم 33 بشأن الملف I / O. 122 00:10:23,300 --> 00:10:26,350 التكبير في هذا قليلا قليلا. 123 00:10:26,350 --> 00:10:28,710 مشكلة 33 - نعم؟ 124 00:10:28,710 --> 00:10:32,110 >> [دانيال] كان لي مجرد سؤال سريع. هذا النجم، أو النجمة و، 125 00:10:32,110 --> 00:10:35,590 انه دعا يعتبر إلغاء مرجعية عند استخدام علامة نجمية قبل. 126 00:10:35,590 --> 00:10:38,820 ما كل شيء يسمى عند استخدام العطف من قبل؟ 127 00:10:38,820 --> 00:10:43,140 والعطف >> معروض على عنوان من المشغل. 128 00:10:43,140 --> 00:10:45,880 لذلك دعونا انتقل احتياطي. 129 00:10:45,880 --> 00:10:49,310 عفوا. أنا في وضع التكبير حتى لا استطيع ان انتقل حقا. 130 00:10:49,310 --> 00:10:52,780 إذا نظرنا إلى هذا الرمز بسرعة حقا هنا، 131 00:10:52,780 --> 00:10:54,980 مرة أخرى، الشيء نفسه يحدث. 132 00:10:54,980 --> 00:10:59,180 إذا نظرنا إلى هذا الرمز هنا، على هذا الخط حيث يمكننا أن نجعل من الدعوة إلى مبادلة، 133 00:10:59,180 --> 00:11:10,460 ويقول العلامة فقط "الحصول على عنوان في حياة التي المتغير x." 134 00:11:10,460 --> 00:11:14,460 عندما المترجم الخاص بك يجمع التعليمات البرمجية، 135 00:11:14,460 --> 00:11:20,590 في الواقع أنه لا علامة جسديا من مكان في الذاكرة لجميع المتغيرات الخاصة بك للعيش. 136 00:11:20,590 --> 00:11:24,910 وذلك ما يمكن القيام به المترجم ثم بمجرد أن جمعت كل شيء، 137 00:11:24,910 --> 00:11:31,110 من يدري، "أوه، أنا وضعت في عنوان X 10. أضع Y في العنوان 14." 138 00:11:31,110 --> 00:11:34,640 يمكن أن تملأ هذه القيم ثم في لك. 139 00:11:34,640 --> 00:11:44,740 بحيث يمكنك بعد ذلك - فإنه يمكن أن تمر ثم تمرير ذلك في و& Y في كذلك. 140 00:11:44,740 --> 00:11:50,730 هؤلاء الرجال الحصول على عنوان، لكنها أيضا، عند تمريرها إلى الدالة المبادلة 141 00:11:50,730 --> 00:11:55,690 هذه المعلومات النوع، هذا الباحث * هنا، يقول المترجم، 142 00:11:55,690 --> 00:12:01,350 "حسنا، نحن ذاهبون إلى أن تفسير هذا العنوان كعنوان لمتغير عدد صحيح." 143 00:12:01,350 --> 00:12:05,900 كعنوان لكثافة العمليات، والتي تختلف من عنوان متغير حرف 144 00:12:05,900 --> 00:12:09,930 لأن الباحث يستغرق، على جهاز 32 بت، يستغرق 4 بايت من المساحة، 145 00:12:09,930 --> 00:12:13,310 في حين أن الطابع يستغرق سوى بنسبة 1 بايت من المساحة. 146 00:12:13,310 --> 00:12:17,310 لذلك فمن المهم أن نعرف أيضا ما هو - ما يعيش، ما هو نوع من القيمة 147 00:12:17,310 --> 00:12:20,340 يعيش في العنوان الذي حصلت تمريره. 148 00:12:20,340 --> 00:12:22,020 أو العنوان الذي كنت تتعامل معها. 149 00:12:22,020 --> 00:12:29,020 بهذه الطريقة، يمكنك معرفة عدد بايت من المعلومات لتحميل فعلا من ذاكرة الوصول العشوائي الخاصة بك. 150 00:12:29,020 --> 00:12:31,780 ومن ثم، نعم، وهذا المشغل إلغاء مرجعية، مثلك يسأل، 151 00:12:31,780 --> 00:12:37,200 ويذهب إلى معلومات في عنوان معين. 152 00:12:37,200 --> 00:12:42,820 لذلك يقول: مع هذا المتغير هنا، وعلاج محتويات كعنوان، 153 00:12:42,820 --> 00:12:47,880 يذهب إلى هذا العنوان، وسحب، تحميل إلى المعالج، تحميل إلى سجل 154 00:12:47,880 --> 00:12:56,340 القيم الفعلية أو محتويات التي تعيش في هذا العنوان. 155 00:12:56,340 --> 00:12:59,620 أي أسئلة أخرى؟ هذه هي الأسئلة الجيدة. 156 00:12:59,620 --> 00:13:01,650 انها الكثير من المصطلحات الجديدة أيضا. 157 00:13:01,650 --> 00:13:09,800 كما انها نوع من غير تقليدي، ورؤية و* وفي أماكن مختلفة. 158 00:13:09,800 --> 00:13:13,180 >> حسنا. 159 00:13:13,180 --> 00:13:18,530 عودة إلى مشكلة حتى 33، ملف I / O. 160 00:13:18,530 --> 00:13:22,540 وكان هذا واحد من تلك المشاكل التي أعتقد بضعة أشياء حدث. 161 00:13:22,540 --> 00:13:25,400 واحد، هو موضوع جديد إلى حد ما. 162 00:13:25,400 --> 00:13:30,590 قدم اليها في وقت قريب جدا قبل هذه المسابقة، 163 00:13:30,590 --> 00:13:33,400 ومن ثم أعتقد أنه كان نوع من مثل واحدة من تلك المسائل الكلامية في الرياضيات 164 00:13:33,400 --> 00:13:39,720 حيث أنها تعطيك الكثير من المعلومات، ولكن كنت في الواقع لا ينتهي الحاجة إلى استخدام للطن منه. 165 00:13:39,720 --> 00:13:44,060 الجزء الأول من هذه المشكلة واصفا ما ملف CSV هو. 166 00:13:44,060 --> 00:13:50,620 الآن، ملف CSV، وفقا لوصف، هو ملف قيم مفصولة بفواصل. 167 00:13:50,620 --> 00:13:55,300 السبب هذه هي مثيرة للاهتمام على الإطلاق، والسبب كنت تستخدم أي وقت مضى لهم، 168 00:13:55,300 --> 00:14:00,800 و، لأنه، واستخدمت كم كنت من أي وقت مضى الاشياء مثل إكسل؟ 169 00:14:00,800 --> 00:14:03,240 الشخصية الأكثر منكم، على الأرجح، أو سوف تستخدم في مرحلة ما من حياتك. 170 00:14:03,240 --> 00:14:06,430 عليك استخدام شيء مثل Excel. 171 00:14:06,430 --> 00:14:10,940 من أجل الحصول على البيانات من جدول بيانات Excel أو القيام بأي نوع من تجهيز معها، 172 00:14:10,940 --> 00:14:17,240 إذا أردت كتابة برنامج C أو Python البرنامج، برنامج جافا، 173 00:14:17,240 --> 00:14:20,070 للتعامل مع البيانات التي قمت بتخزينها في هناك، 174 00:14:20,070 --> 00:14:23,170 واحدة من الطرق الأكثر شيوعا ليخرجه في ملف CSV. 175 00:14:23,170 --> 00:14:26,850 ويمكنك فتح Excel وعندما تذهب إلى 'حفظ باسم' الحوار، 176 00:14:26,850 --> 00:14:32,840 يمكنك الحصول على ملف CSV من الفعلية. 177 00:14:32,840 --> 00:14:35,890 >> مفيد لمعرفة كيفية التعامل مع هذه الأمور. 178 00:14:35,890 --> 00:14:42,010 الطريقة التي يعمل هو أنه مماثل ل- أعني، انها محاكاة أساسا جدول بيانات، 179 00:14:42,010 --> 00:14:47,590 حيث، كما نرى هنا، في قطعة جدا أقصى اليسار، 180 00:14:47,590 --> 00:14:49,910 لدينا كل الأسماء الأخيرة. 181 00:14:49,910 --> 00:14:54,670 لذلك لدينا مالان، ثم Hardison، ثم بودين، MacWilliam، ثم تشان. 182 00:14:54,670 --> 00:14:59,470 جميع الأسماء الأخيرة. ثم فاصلة تفصل بين الأسماء الأخيرة من الأسماء الأولى. 183 00:14:59,470 --> 00:15:02,970 ديفيد، نيت، روب، تومي، وZamyla. 184 00:15:02,970 --> 00:15:06,850 I خلط دائما روبي وتوم. 185 00:15:06,850 --> 00:15:10,940 ومن ثم، أخيرا، العمود الثالث هو عناوين البريد الالكتروني. 186 00:15:10,940 --> 00:15:18,500 بمجرد فهم ذلك، فإن بقية البرنامج هو اضحة إلى حد ما لتنفيذها. 187 00:15:18,500 --> 00:15:23,850 ما فعلناه من أجل تقليد هذه البنية نفسها في برنامج C لدينا 188 00:15:23,850 --> 00:15:27,510 ولقد استخدمنا هيكل. 189 00:15:27,510 --> 00:15:30,520 سوف نبدأ اللعب مع هذه أكثر قليلا أيضا. 190 00:15:30,520 --> 00:15:35,790 رأينا منهم لبت القليل الأولى في مجموعة المشكلة 3، عندما كنا نتعامل مع القواميس. 191 00:15:35,790 --> 00:15:40,290 ولكن هذا البنية الموظفين بتخزين اسم العائلة، الاسم الأول، وبريد إلكتروني. 192 00:15:40,290 --> 00:15:44,500 وتماما مثل ملف CSV لدينا تخزين. 193 00:15:44,500 --> 00:15:47,950 لذلك هذا هو تحويل للتو من شكل الى آخر. 194 00:15:47,950 --> 00:15:54,630 لدينا لتحويل، في هذه الحالة، البنية الموظفين في الخط، 195 00:15:54,630 --> 00:15:59,060 خط مفصولة بفواصل، تماما مثل ذلك. 196 00:15:59,060 --> 00:16:01,500 هل هذا معقول؟ كنت قد اتخذت جميع اللاعبين هذه المسابقة، 197 00:16:01,500 --> 00:16:07,680 لذلك أتصور لديك على الأقل لديه بعض الوقت للتفكير في ذلك. 198 00:16:07,680 --> 00:16:16,410 >> في وظيفة تأجير، مشكلة يطلب منا أن تأخذ في - التكبير في we'll على هذا قليلا قليلا - 199 00:16:16,410 --> 00:16:22,480 تأخذ في بنية الموظفين، والبنية الموظفين، مع اسم ثانية، 200 00:16:22,480 --> 00:16:30,900 وإلحاق محتوياته إلى ملف staff.csv لدينا. 201 00:16:30,900 --> 00:16:34,230 كما تبين أن هذا هو اضحة إلى حد ما للاستخدام. 202 00:16:34,230 --> 00:16:37,430 سنقوم النوع من اللعب حولها مع هذه الوظائف أكثر قليلا اليوم. 203 00:16:37,430 --> 00:16:44,510 لكن في هذه الحالة، فإن وظيفة fprintf هو حقا المفتاح. 204 00:16:44,510 --> 00:16:51,960 حتى مع fprintf، يمكننا طباعة، مثلك تماما الرجال قد تم استخدام هذا المصطلح printf كله. 205 00:16:51,960 --> 00:16:55,050 يمكنك printf خط إلى ملف. 206 00:16:55,050 --> 00:16:59,030 وذلك بدلا من مجرد جعل الدعوة المعتادة printf حيث تعطيه سلسلة التنسيق 207 00:16:59,030 --> 00:17:05,380 ثم استبدال كافة المتغيرات مع الوسائط التالية، 208 00:17:05,380 --> 00:17:11,290 مع fprintf، حجتك الأولى بدلا من ذلك هو الملف الذي تريد الكتابة إلى. 209 00:17:11,290 --> 00:17:21,170 إذا كان لنا أن ننظر إلى هذا الأمر في الأجهزة، على سبيل المثال، رجل fprintf، 210 00:17:21,170 --> 00:17:25,980 يمكننا أن نرى الفرق بين printf وfprintf. 211 00:17:25,980 --> 00:17:28,960 أنا هنا في تكبير قليلا. 212 00:17:28,960 --> 00:17:33,140 حتى مع printf، الذي يطلق عليها سلسلة تنسيق، ثم الحجج لاحقة 213 00:17:33,140 --> 00:17:37,580 كلها متغيرات لاستبدال أو استبدال في سلسلة التنسيق لدينا. 214 00:17:37,580 --> 00:17:47,310 في حين مع fprintf، فإن الحجة الأولى هي في الواقع هذه * ملف يسمى تيار. 215 00:17:47,310 --> 00:17:51,800 >> في العودة إلى هنا لتوظيف لدينا، 216 00:17:51,800 --> 00:17:54,550 لدينا بالفعل لدينا تيار * ملف مفتوح بالنسبة لنا. 217 00:17:54,550 --> 00:17:57,810 هذا ما يفعل هذا السطر الأول، بل يفتح الملف staff.csv، 218 00:17:57,810 --> 00:18:01,690 فإنه يفتح في وضع إلحاق، وهي كل ما تبقى لنا للقيام 219 00:18:01,690 --> 00:18:08,640 كتابة هيكل الموظفين إلى الملف. 220 00:18:08,640 --> 00:18:10,870 و، دعونا نرى، هل تريد استخدام جهاز آي باد؟ 221 00:18:10,870 --> 00:18:17,900 سوف تستخدم جهاز آي باد. لدينا الفراغ - دعونا نضع هذا على الطاولة حتى أتمكن من كتابة أفضل قليلا - 222 00:18:17,900 --> 00:18:33,680 إفراغ تأجير ويستغرق في وسيطة واحدة، وهيكل الموظفين دعا ق. 223 00:18:33,680 --> 00:18:44,120 حصلت الأقواس لدينا، لدينا لدينا * ملف يسمى ملف، 224 00:18:44,120 --> 00:18:48,380 لدينا لدينا خط الدالة fopen التي توافرت لدينا، 225 00:18:48,380 --> 00:18:51,890 وأنا أكتب فقط كنقاط لأنه بالفعل في موسوعة. 226 00:18:51,890 --> 00:19:00,530 وبعد ذلك لدينا خط المقبلة، ونحن في طريقنا لإجراء مكالمة إلى fprintf 227 00:19:00,530 --> 00:19:03,700 ونحن في طريقنا لتمرير في الملف الذي نريد الطباعة إلى، 228 00:19:03,700 --> 00:19:10,290 ثم لدينا سلسلة التنسيق، والتي - 229 00:19:10,290 --> 00:19:14,300 سادعك الرجال تقول لي ما يبدو. 230 00:19:14,300 --> 00:19:20,500 كيف عنك، ستيلا؟ هل تعرف ما الجزء الأول من سلسلة التنسيق يشبه؟ 231 00:19:20,500 --> 00:19:24,270 [ستيلا] لست متأكدا. >> لا تتردد في طرح جيمي. 232 00:19:24,270 --> 00:19:27,690 هل تعرف، جيمي؟ 233 00:19:27,690 --> 00:19:31,000 [جيمي] هل من الماضي؟ لا أعرف. لست متأكدا تماما. 234 00:19:31,000 --> 00:19:39,020 حسنا >>. ماذا عن، لم تحصل أي شخص هذا صحيح في الامتحان؟ 235 00:19:39,020 --> 00:19:41,770 رقم حسنا. 236 00:19:41,770 --> 00:19:47,920 اتضح أن كل ما لدينا هنا القيام به هو أننا نريد كل جزء من هيكل موظفينا 237 00:19:47,920 --> 00:19:53,290 التي سيتم طباعتها من كسلسلة في ملف لدينا. 238 00:19:53,290 --> 00:19:59,900 نحن فقط استخدام حرف استبدال سلسلة ثلاث مرات مختلفة لأن لدينا اسم العائلة 239 00:19:59,900 --> 00:20:07,160 تليها فاصلة، ثم الاسم الأول ثم بفاصلة، 240 00:20:07,160 --> 00:20:12,430 ثم أخيرا ويتبع عنوان البريد الإلكتروني الذي - التي ليست 241 00:20:12,430 --> 00:20:15,140 تركيب على الشاشة - ولكن جاء بعد ذلك بواسطة حرف السطر الجديد. 242 00:20:15,140 --> 00:20:20,060 لذلك أنا ذاهب لأنه يكتب فقط الى هناك. 243 00:20:20,060 --> 00:20:23,560 وبعد سلسلة لدينا ثم تنسيق، 244 00:20:23,560 --> 00:20:27,880 لدينا فقط بدائل، وهو ما وصول باستخدام نقطة تدوين 245 00:20:27,880 --> 00:20:31,370 أن رأينا في مجموعة مكونة المشكلة 3. 246 00:20:31,370 --> 00:20:48,820 يمكننا استخدام s.last، s.first، وs.email 247 00:20:48,820 --> 00:20:58,990 لتحل محل تلك القيم في الثلاثة في سلسلة التنسيق لدينا. 248 00:20:58,990 --> 00:21:06,190 فكيف لم تذهب أن؟ معنى؟ 249 00:21:06,190 --> 00:21:09,700 نعم؟ لا؟ ربما؟ حسنا. 250 00:21:09,700 --> 00:21:14,180 >> الشيء الأخير الذي نقوم به بعد أن كنت قد طبعت بعد وقمنا فتح ملف لدينا: 251 00:21:14,180 --> 00:21:17,370 كلما قمنا فتح ملف، لدينا دائما أن نتذكر لإغلاقه. 252 00:21:17,370 --> 00:21:19,430 لأن خلاف ذلك سنقوم في نهاية المطاف تسرب الذاكرة، 253 00:21:19,430 --> 00:21:22,500 باستخدام ما يصل اصفات الملف. 254 00:21:22,500 --> 00:21:25,950 ذلك لإغلاقه، التي تعمل نستخدم؟ دانيال؟ 255 00:21:25,950 --> 00:21:30,120 [دانيال] fclose؟ fclose >>، بالضبط. 256 00:21:30,120 --> 00:21:37,520 لذلك كان الجزء الأخير من هذه المشكلة بشكل صحيح إغلاق الملف، وذلك باستخدام وظيفة fclose، 257 00:21:37,520 --> 00:21:40,370 والتي تبدو تماما مثل ذلك. 258 00:21:40,370 --> 00:21:43,880 لا مجنونة جدا. 259 00:21:43,880 --> 00:21:46,990 بارد. 260 00:21:46,990 --> 00:21:49,520 ذلك أن المشكلة 33 على هذه المسابقة. 261 00:21:49,520 --> 00:21:52,480 سيكون لدينا بالتأكيد أكثر ملف I / O الخروج. 262 00:21:52,480 --> 00:21:55,130 سنفعل أكثر قليلا في محاضرة اليوم، أو في القسم اليوم، 263 00:21:55,130 --> 00:22:01,710 لأن هذا هو ما يحدث لتشكيل الجزء الأكبر من هذه pset المقبلة. 264 00:22:01,710 --> 00:22:05,020 دعنا ننتقل من هذه المسابقة في هذه المرحلة. نعم؟ 265 00:22:05,020 --> 00:22:10,880 >> [شارلوت]] لماذا fclose (ملف) بدلا من fclose (staff.csv)؟ 266 00:22:10,880 --> 00:22:19,100 آه >>. لأنه تبين أن - لذلك السؤال، الذي هو واحد كبير، 267 00:22:19,100 --> 00:22:27,800 هو السبب، عندما نكتب fclose، نحن fclose كتابة متغير نجمة (ملف) 268 00:22:27,800 --> 00:22:33,680 بدلا من اسم الملف، staff.csv؟ فهل هذا صحيح؟ نعم. 269 00:22:33,680 --> 00:22:39,570 لذلك دعونا نلقي نظرة. إذا كنت التبديل إلى جهاز الكمبيوتر المحمول، 270 00:22:39,570 --> 00:22:45,040 ودعونا ننظر في وظيفة fclose. 271 00:22:45,040 --> 00:22:51,460 وبالتالي فإن وظيفة fclose يغلق تيار ويستغرق في المؤشر إلى تيار أننا نريد أن يغلق، 272 00:22:51,460 --> 00:22:57,010 بدلا من اسم الملف الفعلي الذي نريد إغلاقه. 273 00:22:57,010 --> 00:23:01,620 وذلك لأن وراء الكواليس، عند إجراء مكالمة إلى الدالة fopen، 274 00:23:01,620 --> 00:23:12,020 عند فتح الملف، كنت في الواقع تخصيص الذاكرة لتخزين المعلومات عن الملف. 275 00:23:12,020 --> 00:23:16,380 بحيث يكون لديك مؤشر الملف يحتوي على معلومات حول الملف، 276 00:23:16,380 --> 00:23:23,080 مثل انها مفتوحة، وحجمها، حيث كنت حاليا في الملف، 277 00:23:23,080 --> 00:23:29,100 بحيث يمكنك إجراء مكالمات القراءة والكتابة إلى أن مكان معين داخل الملف. 278 00:23:29,100 --> 00:23:38,060 كنت في نهاية المطاف يغلق المؤشر بدلا من إغلاق اسم الملف. 279 00:23:38,060 --> 00:23:48,990 >> نعم؟ [دانيال] ذلك من أجل استخدام تأجير، هل سوف تقول - كيف تحصل على مدخلات المستخدم؟ 280 00:23:48,990 --> 00:23:53,830 لا تتصرف مثل GetString في fprintf بمعنى أنه سوف ننتظر فقط لإدخال المستخدم 281 00:23:53,830 --> 00:23:57,180 وأطلب منك أن اكتب هذا - أو الانتظار لكتابة هذه الأمور الثلاثة في؟ 282 00:23:57,180 --> 00:24:00,480 أو هل تحتاج إلى استخدام شيء لتنفيذ استئجار؟ 283 00:24:00,480 --> 00:24:04,100 نعم >>. لذلك نحن لسنا - كان السؤال، كيف نحصل على إدخال المستخدم 284 00:24:04,100 --> 00:24:09,220 من أجل تنفيذ استئجار؟ وما لدينا هنا هو المتصل من تأجير، 285 00:24:09,220 --> 00:24:17,690 مرت في هذا البنية الموظفين مع كافة البيانات المخزنة في البنية بالفعل. 286 00:24:17,690 --> 00:24:22,990 ذلك هو fprintf قادرا على الكتابة فقط أن البيانات مباشرة إلى الملف. 287 00:24:22,990 --> 00:24:25,690 ليس هناك انتظار إدخال المستخدم. 288 00:24:25,690 --> 00:24:32,110 بالفعل بالنظر الى المستخدم عن طريق وضع الإدخال بشكل صحيح في هذا البنية الموظفين. 289 00:24:32,110 --> 00:24:36,510 والأشياء، بطبيعة الحال، إذا كسر أي من هذه المؤشرات لاغية، 290 00:24:36,510 --> 00:24:40,370 لذلك نحن انتقل إلى هنا حتى ونحن نتطلع في البنية دينا. 291 00:24:40,370 --> 00:24:43,640 لدينا سلسلة الماضي، السلسلة الأولى، والبريد الإلكتروني السلسلة. 292 00:24:43,640 --> 00:24:48,530 ونحن نعرف الآن أن كل تلك حقا، تحت غطاء محرك السيارة، من المتغيرات * شار. 293 00:24:48,530 --> 00:24:53,470 التي قد تكون أو لا تكون لافتا إلى قيمة خالية. 294 00:24:53,470 --> 00:24:55,800 أنها قد تكون لافتا إلى الذاكرة على الكومة، 295 00:24:55,800 --> 00:24:59,650 الذاكرة ربما على المكدس. 296 00:24:59,650 --> 00:25:04,580 نحن لا نعرف حقا، ولكن، إذا كان أي من هذه المؤشرات تعتبر لاغية، أو غير صالحة 297 00:25:04,580 --> 00:25:08,120 أن يتلف التي سوف بالتأكيد لدينا وظيفة تأجير. 298 00:25:08,120 --> 00:25:11,050 كان ذلك شيئا هو نوع من خارج نطاق الامتحان. 299 00:25:11,050 --> 00:25:16,440 نحن لا يدعو للقلق بشأن ذلك. 300 00:25:16,440 --> 00:25:22,170 كبيرة. حسنا. الانتقال هلم جرا من هذه المسابقة. 301 00:25:22,170 --> 00:25:25,760 >> دعونا إغلاق هذا الرجل، ونحن سوف ننظر في pset 4. 302 00:25:25,760 --> 00:25:34,700 إذا كان الأمر كذلك يا رفاق إلقاء نظرة على المواصفات pset، مرة واحدة يمكنك الوصول إليه، cs50.net/quizzes، 303 00:25:34,700 --> 00:25:42,730 ونحن في سبيلنا للذهاب من خلال عدد قليل من المشاكل القسم اليوم. 304 00:25:42,730 --> 00:25:52,240 أنا التمرير لأسفل - قسم من الأسئلة يبدأ في الصفحة الثالثة من المواصفات pset. 305 00:25:52,240 --> 00:25:57,800 والجزء الأول يطلب منك أن تذهب ومشاهدة قصيرة على إعادة توجيه والأنابيب. 306 00:25:57,800 --> 00:26:02,820 الذي كان نوع من Cool قصير، يظهر لك بعض جديدة، سطر الأوامر بارد الحيل التي يمكنك استخدامها. 307 00:26:02,820 --> 00:26:06,050 ثم لدينا بعض الأسئلة لكنت كذلك. 308 00:26:06,050 --> 00:26:10,860 هذا السؤال الأول حول الجداول، والتي يكتب printf بشكل افتراضي، 309 00:26:10,860 --> 00:26:15,920 نحن نوع من تطرق قليلا فقط قبل لحظة. 310 00:26:15,920 --> 00:26:22,380 هذا fprintf التي كنا نناقش فقط يأخذ في ملف * تيار وحجتها. 311 00:26:22,380 --> 00:26:26,580 fclose يأخذ في ملف تيار * كذلك، 312 00:26:26,580 --> 00:26:32,660 والقيمة المرجعة من الدالة fopen يعطيك تيار * الملف أيضا. 313 00:26:32,660 --> 00:26:36,060 السبب في أننا لم نر تلك قبل عندما كنا التعامل مع printf 314 00:26:36,060 --> 00:26:39,450 لأن لديه printf تيار الافتراضي. 315 00:26:39,450 --> 00:26:41,810 وتيار الافتراضي الذي فإنه يكتب 316 00:26:41,810 --> 00:26:45,190 عليك معرفة في الأجل القصير. 317 00:26:45,190 --> 00:26:50,080 حتى تأخذ بالتأكيد نظرة على ذلك. 318 00:26:50,080 --> 00:26:53,010 >> في القسم اليوم، ونحن في طريقنا للحديث قليلا عن GDB، 319 00:26:53,010 --> 00:26:57,720 منذ أكثر دراية كنت مع ذلك، فإن المزيد من الممارسة تحصل معها، 320 00:26:57,720 --> 00:27:01,390 وأقدر عليك أن تكون لاصطياد الواقع أسفل الخلل في التعليمات البرمجية الخاصة بك. 321 00:27:01,390 --> 00:27:05,540 هذا يسرع عملية التصحيح حتى بشكل هائل. 322 00:27:05,540 --> 00:27:09,230 ذلك باستخدام printf، في كل مرة كنت تفعل ذلك لديك إلى إعادة ترجمة التعليمات البرمجية، 323 00:27:09,230 --> 00:27:13,000 لديك لتشغيله مرة أخرى، وأحيانا يكون لديك لتحريك الدعوة printf حولها، 324 00:27:13,000 --> 00:27:17,100 تعليق خارج رمز، فإنه يأخذ بعض الوقت فقط. 325 00:27:17,100 --> 00:27:20,850 هدفنا هو محاولة اقناع لكم ان مع GDB، يمكنك أساسا 326 00:27:20,850 --> 00:27:26,810 printf أي شيء في أي لحظة في التعليمات البرمجية ولست مضطرا ابدا الى إعادة ترجمة عليه. 327 00:27:26,810 --> 00:27:35,120 ولست مضطرا ابدا لبدء والحفاظ على التخمين أين printf المقبل. 328 00:27:35,120 --> 00:27:40,910 أول شيء فعله هو نسخ هذا الخط، والحصول على رمز القسم الخروج من شبكة الإنترنت. 329 00:27:40,910 --> 00:27:47,530 أنا نسخ هذا السطر من التعليمات البرمجية التي تقول، "http://cdn.cs50.net مجلد مشترك". 330 00:27:47,530 --> 00:27:49,510 أنا ذاهب لنسخه. 331 00:27:49,510 --> 00:27:55,950 انا ذاهب للذهاب الى بلدي الأجهزة، تصغير حتى تتمكن من رؤية ما أفعله، 332 00:27:55,950 --> 00:28:01,890 صقه في هناك، وعندما ضرب أدخل هذا الأمر مجلد مشترك على شبكة الإنترنت هو حرفيا الحصول عليها. 333 00:28:01,890 --> 00:28:06,210 انه سيكون لهدم هذا الملف الخروج من الإنترنت، 334 00:28:06,210 --> 00:28:11,790 وانه سيكون لحفظه إلى الدليل الحالي. 335 00:28:11,790 --> 00:28:21,630 الآن إذا كنت أقوم بها حاليا قائمة الدليل يمكنك أن ترى أن أنا عندي هذا الملف section5.zip الحق في هناك. 336 00:28:21,630 --> 00:28:25,260 وطريقة للتعامل مع هذا الرجل هو فك الضغط عن الملف، 337 00:28:25,260 --> 00:28:27,650 والتي يمكن أن تفعل في سطر الأوامر، تماما مثل ذلك. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 التي سوف فك الضغط عن الملف، إنشاء المجلد بالنسبة لي، 340 00:28:36,980 --> 00:28:40,410 تضخيم كل محتويات، ووضعها في هناك. 341 00:28:40,410 --> 00:28:47,410 حتى الآن لا أستطيع الخوض في دليل بلدي 5 القسم باستخدام الأمر cd. 342 00:28:47,410 --> 00:28:58,310 مسح الشاشة باستخدام واضحة. مسح حتى الشاشة. 343 00:28:58,310 --> 00:29:02,280 الآن لقد حصلت على محطة لطيفة نظيفة للتعامل معها. 344 00:29:02,280 --> 00:29:06,200 >> إذا أنا الآن سرد كافة الملفات التي أرى في هذا الدليل، 345 00:29:06,200 --> 00:29:12,270 ترى أنني قد حصلت على أربعة ملفات: buggy1، buggy2، buggy3، وbuggy4. 346 00:29:12,270 --> 00:29:16,180 لقد حصلت أيضا على المقابلة. الملفات ج. 347 00:29:16,180 --> 00:29:20,400 نحن لن ننظر إلى الملفات ج. في الوقت الراهن. 348 00:29:20,400 --> 00:29:24,140 بدلا من ذلك، ونحن في طريقنا لاستخدامها عندما نفتح الباب GDB. 349 00:29:24,140 --> 00:29:28,220 لقد حافظنا حول لهم حتى نتمكن من الوصول إلى شفرة المصدر الفعلي عندما نستخدمه GDB، 350 00:29:28,220 --> 00:29:32,740 ولكن الهدف من هذا الجزء من الفرع إلى العبث حولها مع GDB 351 00:29:32,740 --> 00:29:40,370 ونرى كيف يمكننا استخدامها لمعرفة ما يجري خطأ مع كل من هذه البرامج عربات التي تجرها الدواب الأربعة. 352 00:29:40,370 --> 00:29:43,380 لذلك نحن مجرد الذهاب الى جميع أنحاء الغرفة بسرعة حقا، 353 00:29:43,380 --> 00:29:47,000 وانا ذاهب الى تسأل شخص ما لتشغيل أحد البرامج عربات التي تجرها الدواب، 354 00:29:47,000 --> 00:29:54,730 وبعد ذلك سوف نذهب كمجموعة من خلال GDB، وسنرى ما يمكننا القيام به لإصلاح هذه البرامج، 355 00:29:54,730 --> 00:29:58,460 أو على الأقل تحديد ما على غير ما يرام في كل منها. 356 00:29:58,460 --> 00:30:04,760 دعونا نبدأ مع دانيال أكثر من هنا. سيتم تشغيل buggy1؟ دعونا نرى ما سيحدث. 357 00:30:04,760 --> 00:30:09,470 [دانيال] ويقول هناك خطأ التطبيق. نعم >>. بالضبط. 358 00:30:09,470 --> 00:30:12,460 حتى إذا قمت بتشغيل buggy1، أحصل على خطأ SEG. 359 00:30:12,460 --> 00:30:16,210 عند هذه النقطة، يمكن أن أذهب وفتح buggy1.c، 360 00:30:16,210 --> 00:30:19,450 محاولة لمعرفة ما على غير ما يرام، 361 00:30:19,450 --> 00:30:22,000 ولكن واحدة من أكثر الأمور البغيضة حول هذا الخطأ خطأ SEG 362 00:30:22,000 --> 00:30:27,610 هو أنه لا اقول لكم على ما سطر من الأشياء الخاطئة البرنامج فعلا ذهبت وكسر. 363 00:30:27,610 --> 00:30:29,880 كنت نوع من أن ننظر إلى رمز 364 00:30:29,880 --> 00:30:33,990 ومعرفة باستخدام تخمين وتحقق printf أو لمعرفة ما على غير ما يرام. 365 00:30:33,990 --> 00:30:37,840 واحدة من أروع الأشياء عن GDB هو أنه حقا، حقا سهلة 366 00:30:37,840 --> 00:30:42,170 لمعرفة خط الذي تعطل البرنامج. 367 00:30:42,170 --> 00:30:46,160 انه يستحق ذلك تماما لاستخدامها، حتى لو لمجرد ذلك. 368 00:30:46,160 --> 00:30:56,190 حتى ليصل الحذاء GDB، اكتب I GDB، ثم أعطيها المسار إلى القابل للتنفيذ الذي اريد ان اشغل. 369 00:30:56,190 --> 00:31:01,960 أنا هنا بكتابة GDB ./buggy1. 370 00:31:01,960 --> 00:31:06,600 ضرب أدخل. يعطيني كل هذه المعلومات حق المؤلف، 371 00:31:06,600 --> 00:31:13,000 وإلى هنا سترى هذا الخط الذي يقول: "من رموز القراءة / الوطن / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1 ". 373 00:31:17,680 --> 00:31:22,060 وإذا سارت الامور بشكل جيد، سوف نرى ذلك بطباعة الرسالة التي يبدو مثل هذا. 374 00:31:22,060 --> 00:31:25,500 انها سوف قراءة الرموز، وأنها سوف يقول "أنا أقرأ الرموز من الملف القابل للتنفيذ الخاص بك" 375 00:31:25,500 --> 00:31:29,900 وبعد ذلك سوف يكون هذا "فعل" رسالة إلى هنا. 376 00:31:29,900 --> 00:31:35,410 إذا كنت ترى بعض الاختلاف أخرى من هذا، هل يمكن أن نرى أو لا تجد الرموز 377 00:31:35,410 --> 00:31:41,460 أو شيء من هذا القبيل، ما يعنيه ذلك هو انك لم يجمعوا تنفيذ الخاص بك بشكل صحيح. 378 00:31:41,460 --> 00:31:49,980 عندما كنا تجميع البرامج للاستخدام مع GDB، لدينا لاستخدام هذا العلم الخاصة غرام، 379 00:31:49,980 --> 00:31:54,540 وانها فعلت ذلك بشكل افتراضي إذا كنت ترجمة البرامج الخاصة بك، فقط بكتابة جعل 380 00:31:54,540 --> 00:31:59,320 عربات التي تجرها الدواب أو إجراء أو إجراء استرداد، أي من هؤلاء. 381 00:31:59,320 --> 00:32:07,800 ولكن إذا كنت تجميع يدويا مع ضجيج، ثم عليك أن تذهب في ادراج ذلك والجميع العلم. 382 00:32:07,800 --> 00:32:10,310 >> عند هذه النقطة، الآن أن لدينا لدينا موجه GDB، 383 00:32:10,310 --> 00:32:12,310 انها بسيطة جدا لتشغيل البرنامج. 384 00:32:12,310 --> 00:32:19,740 يمكننا كتابة إما تشغيل، أو يمكننا فقط اكتب ص. 385 00:32:19,740 --> 00:32:22,820 يمكن أن تكون الأوامر الأكثر GDB مختصرة. 386 00:32:22,820 --> 00:32:25,940 عادة واحدة فقط أو الرسائل زوجين، التي هي لطيفة جدا. 387 00:32:25,940 --> 00:32:30,980 سعد ذلك، إذا قمت بكتابة البحث وهاهنا، ماذا يحدث؟ 388 00:32:30,980 --> 00:32:39,390 [سعد] وصلت SIGSEGV، خطأ تجزئة، وبعد ذلك كل الهراء هذا. 389 00:32:39,390 --> 00:32:43,650 نعم >>. 390 00:32:43,650 --> 00:32:47,990 مثل نراه على الشاشة في الوقت الراهن، ومثل سعد قال، 391 00:32:47,990 --> 00:32:53,430 عندما كنا اكتب المدى أو r وضرب أدخل، ونحن لا يزال الحصول على خطأ SEG نفسه. 392 00:32:53,430 --> 00:32:55,830 وذلك باستخدام GDB لا يحل مشكلتنا. 393 00:32:55,830 --> 00:32:59,120 لكنه يتيح لنا بعض الهراء، وتبين أن هذا الهراء 394 00:32:59,120 --> 00:33:03,080 يقول لنا الواقع حيث يحدث. 395 00:33:03,080 --> 00:33:10,680 تحليل هذا قليلا قليلا، وهذا الشيء الأول هو وظيفة في كل شيء والتي على غير ما يرام. 396 00:33:10,680 --> 00:33:20,270 هناك __ strcmp_sse4_2 هذا، ويخبرنا أنه يحدث في هذا الملف 397 00:33:20,270 --> 00:33:29,450 دعا sysdeps/i386، كل هذا، مرة أخرى، نوع من الفوضى - ولكن خط 254. 398 00:33:29,450 --> 00:33:31,670 وهذا النوع من الصعب تحليل. عادة عندما ترى مثل هذه الاشياء، 399 00:33:31,670 --> 00:33:38,770 وهذا يعني أن يخطأ انها SEG في واحدة من المكتبات النظام. 400 00:33:38,770 --> 00:33:43,220 ذلك أن تفعل شيئا مع strcmp. شهدت يا رفاق strcmp من قبل. 401 00:33:43,220 --> 00:33:52,730 لا مجنونة جدا، ولكن هل هذا يعني أن يتم تقسيم strcmp أو أن هناك مشكلة مع strcmp؟ 402 00:33:52,730 --> 00:33:57,110 ما رأيك الكسندر؟ 403 00:33:57,110 --> 00:34:04,890 [ألكسندر] هل هذا - هو 254 خط؟ و- وليس ثنائي، ولكنها ليست حدودها القصوى، 404 00:34:04,890 --> 00:34:10,590 وبعد ذلك هناك لغة أخرى لكل وظيفة. هو أن تلك الوظيفة 254 في، أو -؟ 405 00:34:10,590 --> 00:34:21,460 انها >> خط 254. يبدو في هذا الملف ثانية.، لذلك ربما رمز التجميع. 406 00:34:21,460 --> 00:34:25,949 >> ولكن، أعتقد أن الشيء الأكثر إلحاحا هو، لأننا قد حصلت على خطأ SEG، 407 00:34:25,949 --> 00:34:29,960 ويبدو انها قادمة من وظيفة strcmp، 408 00:34:29,960 --> 00:34:38,030 هل هذا يعني، إذن، أن يتم تقسيم strcmp؟ 409 00:34:38,030 --> 00:34:42,290 فإنه لا ينبغي، ونأمل. ذلك فقط لأن لديك خطأ تجزئة 410 00:34:42,290 --> 00:34:49,480 في واحدة من وظائف النظام، وهذا عادة يعني أنك فقط لم يطلق عليه بشكل صحيح. 411 00:34:49,480 --> 00:34:52,440 أسرع ما يمكن فعله لمعرفة ما يجري في الواقع على 412 00:34:52,440 --> 00:34:55,500 عندما ترى شيئا مثل هذا الجنون، كلما رأيت خطأ SEG، 413 00:34:55,500 --> 00:34:59,800 وخاصة إذا كان لديك برنامج هذا ما تستخدم أكثر من مجرد الرئيسي، 414 00:34:59,800 --> 00:35:03,570 هو استخدام التتبع المعاكس. 415 00:35:03,570 --> 00:35:13,080 I اختصار التتبع المعاكس من خلال كتابة BT، بدلا من الكلمة التتبع المعاكس كاملة. 416 00:35:13,080 --> 00:35:16,510 ولكن شارلوت، فإن ما يحدث عند كتابة BT وهاهنا؟ 417 00:35:16,510 --> 00:35:23,200 [شارلوت] ويظهر لي خطين، 0 خط وسطر 1. 418 00:35:23,200 --> 00:35:26,150 نعم >>. 0 حتى خط وسطر 1. 419 00:35:26,150 --> 00:35:34,560 هذه هي إطارات المكدس الفعلية التي هي حاليا في اللعب عندما تحطمت البرنامج. 420 00:35:34,560 --> 00:35:42,230 بدءا من أعلى الإطار، إطار 0، والذهاب إلى أكثر من الأسفل، وهو الإطار 1. 421 00:35:42,230 --> 00:35:45,140 لدينا أعلى الإطار هو الإطار strcmp. 422 00:35:45,140 --> 00:35:50,080 يمكنك التفكير في هذا مماثلة لتلك المشكلة كما كنا نفعل فقط على هذه المسابقة مع المؤشرات، 423 00:35:50,080 --> 00:35:54,890 حيث كان لدينا مبادلة إطار مكدس على رأس الإطار الرئيسي مكدس، 424 00:35:54,890 --> 00:35:59,700 وكان لدينا المتغيرات التي كانت تستخدم المبادلة على رأس المتغيرات التي كانت تستخدم الرئيسي. 425 00:35:59,700 --> 00:36:08,440 حدث هنا تحطم لدينا في وظيفتنا strcmp، الذي كان يسمى من قبل وظيفتنا الرئيسية، 426 00:36:08,440 --> 00:36:14,370 والتتبع المعاكس ويعطينا ليس فقط في وظائف الأشياء التي فشلت، 427 00:36:14,370 --> 00:36:16,440 ولكنه يقول لنا أيضا حيث كان يسمى كل شيء من. 428 00:36:16,440 --> 00:36:18,830 حتى لو كنت على تمرير أكثر من ذلك بقليل للحق، 429 00:36:18,830 --> 00:36:26,110 يمكننا أن نرى أن نعم، كنا على خط 254 من هذا الملف strcmp-sse4.s. 430 00:36:26,110 --> 00:36:32,540 ولكن هذه الدعوة في buggy1.c، السطر 6. 431 00:36:32,540 --> 00:36:35,960 وهذا يعني أننا يمكن أن تفعل - هي يمكننا أن نذهب فقط سحب ونرى ما يجري 432 00:36:35,960 --> 00:36:39,930 في buggy1.c، السطر 6. 433 00:36:39,930 --> 00:36:43,780 مرة أخرى، هناك بضعة طرق للقيام بذلك. واحد هو الخروج من GDB 434 00:36:43,780 --> 00:36:49,460 أو لديك التعليمات البرمجية فتح في إطار آخر وإشارة الصليب. 435 00:36:49,460 --> 00:36:54,740 ذلك، في حد ذاته، هو مفيد جدا لأنه الآن إذا كنت في ساعات العمل 436 00:36:54,740 --> 00:36:57,220 وكنت قد حصلت على خطأ SEG وTF الخاص بك أتساءل أين كان كل شيء كسر، 437 00:36:57,220 --> 00:36:59,710 يمكنك فقط أن أقول، "أوه، السطر 6. أنا لا أعرف ما يحدث، 438 00:36:59,710 --> 00:37:03,670 ولكن شيئا ما عن الخط 6 يسبب برنامجي لكسر ". 439 00:37:03,670 --> 00:37:10,430 في الاتجاه الآخر للقيام بذلك هو أن تتمكن من استخدام هذا الأمر دعا القائمة في GDB. 440 00:37:10,430 --> 00:37:13,650 يمكنك أيضا مع اختصار ل. 441 00:37:13,650 --> 00:37:18,910 حتى إذا ضربنا ل، ماذا وصلنا إلى هنا؟ 442 00:37:18,910 --> 00:37:21,160 نحصل على مجموعة كاملة من الاشياء الغريبة. 443 00:37:21,160 --> 00:37:26,030 هذا هو رمز التجميع الفعلي 444 00:37:26,030 --> 00:37:29,860 وهذا هو في strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 هذا يبدو نوع من غير تقليدي، 446 00:37:32,440 --> 00:37:36,520 والسبب نحن نحصل على هذا لأن في الوقت الحالي، 447 00:37:36,520 --> 00:37:40,160 GDB ولنا في الإطار 0. 448 00:37:40,160 --> 00:37:43,070 >> حتى ننظر في أي وقت المتغيرات، في أي وقت ونحن ننظر إلى شفرة المصدر، 449 00:37:43,070 --> 00:37:50,530 نحن نبحث في التعليمات البرمجية المصدر التي تنتمي إلى الإطار مكدس نحن فيه حاليا. 450 00:37:50,530 --> 00:37:53,200 وذلك من أجل الحصول على أي شيء مفيد، علينا أن 451 00:37:53,200 --> 00:37:57,070 الانتقال إلى الإطار مكدس أكثر منطقية. 452 00:37:57,070 --> 00:38:00,180 في هذه الحالة، فإن الإطار الرئيسي كومة معنى أكثر من ذلك بقليل، 453 00:38:00,180 --> 00:38:02,680 لأن الواقع هو أن التعليمات البرمجية التي كتبنا. 454 00:38:02,680 --> 00:38:05,330 لا رمز strcmp. 455 00:38:05,330 --> 00:38:08,650 الطريقة التي يمكن أن تنقل بين الإطارات، في هذه الحالة، لأن لدينا اثنين، 456 00:38:08,650 --> 00:38:10,430 لدينا 0 و 1، 457 00:38:10,430 --> 00:38:13,650 يمكنك أن تفعل ذلك مع صعودا ونزولا الأوامر. 458 00:38:13,650 --> 00:38:18,480 إذا كنت تتحرك صعودا إطار واحد، 459 00:38:18,480 --> 00:38:21,770 الآن أنا في الإطار الرئيسي مكدس. 460 00:38:21,770 --> 00:38:24,330 لا أستطيع التحرك وصولا الى العودة الى حيث كنت، 461 00:38:24,330 --> 00:38:32,830 ترتفع مرة أخرى، انتقل إلى أسفل مرة أخرى، وترتفع مرة أخرى. 462 00:38:32,830 --> 00:38:39,750 إذا كنت تفعل أي وقت مضى البرنامج في GDB، وتحصل على الحادث، يمكنك الحصول على التتبع المعاكس، 463 00:38:39,750 --> 00:38:42,380 وترى أنه في بعض الملفات التي كنت لا تعرف ما يجري. 464 00:38:42,380 --> 00:38:45,460 حاولت القائمة، رمز لا تبدو مألوفة بالنسبة لك، 465 00:38:45,460 --> 00:38:48,150 نلقي نظرة على الأطر الخاصة بك ومعرفة مكان وجودك. 466 00:38:48,150 --> 00:38:51,010 ربما كنت في الإطار مكدس الخطأ. 467 00:38:51,010 --> 00:38:58,760 أو على الأقل كنت في الإطار مكدس ليست واحدة التي يمكنك تصحيح حقا. 468 00:38:58,760 --> 00:39:03,110 الآن أننا في إطار مكدس المناسبة، نحن في الرئيسية، 469 00:39:03,110 --> 00:39:08,100 الآن يمكننا استخدام الأمر قائمة لمعرفة ما كان خط. 470 00:39:08,100 --> 00:39:13,590 ويمكنك ان ترى ذلك، بل طباعته بالنسبة لنا هنا. 471 00:39:13,590 --> 00:39:19,470 ولكن يمكننا ضرب قائمة كل نفس، وتتيح لنا هذه القائمة المطبوعة لطيفة 472 00:39:19,470 --> 00:39:23,920 من قانون المصدر الفعلي الذي يحدث هنا. 473 00:39:23,920 --> 00:39:26,420 >> على وجه الخصوص، يمكننا أن ننظر في السطر 6. 474 00:39:26,420 --> 00:39:29,330 يمكننا أن نرى ما يحدث هنا. 475 00:39:29,330 --> 00:39:31,250 ويبدو أننا نحقق مقارنة سلسلة 476 00:39:31,250 --> 00:39:41,050 بين "الصخور CS50" سلسلة وargv [1]. 477 00:39:41,050 --> 00:39:45,700 كان هذا شيئا عن تحطمها. 478 00:39:45,700 --> 00:39:54,120 حتى ميسي، هل لديك أية أفكار حول ما يمكن أن يحدث هنا؟ 479 00:39:54,120 --> 00:39:59,400 [ميسي] أنا لا أعرف لماذا انها تحطمها. أنت >> لا أعرف لماذا انها تحطمها؟ 480 00:39:59,400 --> 00:40:02,700 جيمي، أي أفكار؟ 481 00:40:02,700 --> 00:40:06,240 [جيمي] لست متأكدا تماما، ولكن في المرة الأخيرة مقارنة كنا السلسلة، 482 00:40:06,240 --> 00:40:10,260 أو strcmp، كان لدينا ثلاث حالات مختلفة مثل ظله. 483 00:40:10,260 --> 00:40:12,800 لم يكن لدينا ل==، لا أعتقد، والحق في أن السطر الأول. 484 00:40:12,800 --> 00:40:16,700 بدلا من ذلك تم فصلها إلى ثلاثة، واحد كان == 0، 485 00:40:16,700 --> 00:40:19,910 واحد كان <0، كما أعتقد، واحد كان> 0. 486 00:40:19,910 --> 00:40:22,590 لذلك ربما شيء من هذا القبيل؟ نعم >>. ولذلك لا يوجد هذا الموضوع 487 00:40:22,590 --> 00:40:27,200 من نحن فاعلون المقارنة بشكل صحيح؟ 488 00:40:27,200 --> 00:40:31,660 ستيلا؟ أي أفكار؟ 489 00:40:31,660 --> 00:40:38,110 [ستيلا] لست متأكدا. لست متأكدا >>. دانيال؟ الأفكار؟ حسنا. 490 00:40:38,110 --> 00:40:44,770 تبين ما يحدث هنا هو عندما هربنا البرنامج 491 00:40:44,770 --> 00:40:48,370 وحصلنا على خطأ SEG، عندما قمت بتشغيل البرنامج للمرة الأولى، دانيال، 492 00:40:48,370 --> 00:40:50,800 هل تقدم له أية وسائط سطر الأوامر؟ 493 00:40:50,800 --> 00:40:58,420 [دانيال] رقم >> رقم في هذه الحالة، ما هي قيمة argv [1]؟ 494 00:40:58,420 --> 00:41:00,920 لا يوجد >> قيمة. الحق >>. 495 00:41:00,920 --> 00:41:06,120 حسنا، ليس هناك قيمة السلسلة المناسبة. 496 00:41:06,120 --> 00:41:10,780 ولكن هناك بعض القيمة. ما هي القيمة التي يحصل المخزنة في هناك؟ 497 00:41:10,780 --> 00:41:15,130 A >> قيمة القمامة؟ انها >> إما قيمة أو القمامة، في هذه الحالة، 498 00:41:15,130 --> 00:41:19,930 يتم إنهاء دائما نهاية الصفيف مع argv فارغة. 499 00:41:19,930 --> 00:41:26,050 وذلك ما حصل فعلا هناك المخزنة في باطل. 500 00:41:26,050 --> 00:41:30,810 في الاتجاه الآخر لحل هذه، بدلا من التفكير من خلال، 501 00:41:30,810 --> 00:41:33,420 هو محاولة الطباعة من ذلك. 502 00:41:33,420 --> 00:41:35,880 هذا هو المكان الذي كنت أقول أن استخدام GDB كبيرة، 503 00:41:35,880 --> 00:41:40,640 لأنه يمكنك طباعة جميع المتغيرات، وجميع القيم التي تريد 504 00:41:40,640 --> 00:41:43,230 باستخدام هذا الأمر مفيد ص-مدهش. 505 00:41:43,230 --> 00:41:48,520 حتى لو كنت اكتب ع وبعد ذلك اكتب قيمة متغير أو اسم متغير، 506 00:41:48,520 --> 00:41:55,320 يقول argc، أرى أن argc هو 1. 507 00:41:55,320 --> 00:42:01,830 إذا كنت ترغب في طباعة argv [0]، ويمكنني أن تفعل ذلك فقط من هذا القبيل. 508 00:42:01,830 --> 00:42:04,840 وكما رأينا، argv [0] دائما اسم البرنامج الخاص بك، 509 00:42:04,840 --> 00:42:06,910 دائما اسم الملف القابل للتنفيذ. 510 00:42:06,910 --> 00:42:09,740 هنا ترى انها حصلت على اسم المسار الكامل. 511 00:42:09,740 --> 00:42:15,920 يمكنني أيضا طباعة من argv [1] ونرى ما سيحدث. 512 00:42:15,920 --> 00:42:20,890 >> وصلنا إلى هنا هذا النوع من قيمة باطني. 513 00:42:20,890 --> 00:42:23,890 وصلنا هذا 0x0. 514 00:42:23,890 --> 00:42:27,850 تذكر في بداية الفصل الدراسي عندما تحدثنا عن أرقام ست عشرية؟ 515 00:42:27,850 --> 00:42:34,680 أو هذا السؤال قليلا في نهاية pset 0 من كيفية تمثيل 50 في عرافة؟ 516 00:42:34,680 --> 00:42:39,410 الطريقة نكتب الأرقام في عرافة CS، لمجرد عدم الخلط بين أنفسنا 517 00:42:39,410 --> 00:42:46,080 مع الأرقام العشرية، هو أننا دائما البادئة 0x لهم. 518 00:42:46,080 --> 00:42:51,420 لذلك هذا البادئة 0x دائما يعني فقط تفسير الرقم التالي إلى عدد عشري، 519 00:42:51,420 --> 00:42:57,400 لا كسلسلة، وليس كرقم عشري، وليس كما رقم ثنائي. 520 00:42:57,400 --> 00:43:02,820 ولما كان عدد 5-0 هو رقم صحيح في ست عشري. 521 00:43:02,820 --> 00:43:06,240 وانها في عدد عشري، 50. 522 00:43:06,240 --> 00:43:10,050 لذلك هذا هو فقط كيف أننا أزل غموض. 523 00:43:10,050 --> 00:43:14,860 حتى وسائل 0x0 0 ست عشري، الذي هو أيضا العشرية 0، ثنائي 0. 524 00:43:14,860 --> 00:43:17,030 انها مجرد القيمة 0. 525 00:43:17,030 --> 00:43:22,630 وتبين أن هذا ما هو باطل، في الواقع، في الذاكرة. 526 00:43:22,630 --> 00:43:25,940 هو مجرد فارغة 0. 527 00:43:25,940 --> 00:43:37,010 هنا، العنصر المخزنة في argv [1] فارغة. 528 00:43:37,010 --> 00:43:45,220 لذلك نحن نحاول المقارنة لدينا "CS50 الصخور" السلسلة إلى سلسلة فارغة. 529 00:43:45,220 --> 00:43:48,130 يعتبر إلغاء مرجعية حتى فارغة، في محاولة للوصول إلى الأشياء في فارغة، 530 00:43:48,130 --> 00:43:55,050 تلك تسير عادة أن تسبب نوعا من الخطأ تجزئة أو غيرها من الأشياء السيئة يحدث. 531 00:43:55,050 --> 00:43:59,350 وتبين أن strcmp لا تحقق لمعرفة 532 00:43:59,350 --> 00:44:04,340 أم لا لقد مرت عليك في قيمة هذا باطل. 533 00:44:04,340 --> 00:44:06,370 بدلا من ذلك، يذهب فقط إلى الأمام، يحاول بذل كل شيء، 534 00:44:06,370 --> 00:44:14,640 وإذا كان SEG أخطاء، فإنه SEG أخطاء، وانها مشكلتك. عليك أن تذهب اصلاحها. 535 00:44:14,640 --> 00:44:19,730 بسرعة حقا، كيف يمكن لنا إصلاح هذه المشكلة؟ شارلوت؟ 536 00:44:19,730 --> 00:44:23,540 [شارلوت] يمكنك التحقق باستخدام إذا. 537 00:44:23,540 --> 00:44:32,240 إذا كان الأمر كذلك argv [1] باطل، == 0، ثم العودة 1، أو شيء (غير مفهوم). 538 00:44:32,240 --> 00:44:34,590 نعم >>. بحيث واحد طريقة رائعة للقيام بذلك، ونحن يمكن أن تحقق لمعرفة، 539 00:44:34,590 --> 00:44:39,230 القيمة نحن على وشك أن تنتقل إلى strcmp، argv [1]، وكأن لم؟ 540 00:44:39,230 --> 00:44:45,830 إذا فارغة انها، ثم يمكننا أن نقول حسنا، إحباط. 541 00:44:45,830 --> 00:44:49,450 >> وهناك طريقة أكثر شيوعا للقيام بذلك هو استخدام قيمة argc. 542 00:44:49,450 --> 00:44:52,040 يمكنك ان ترى هنا في بداية الرئيسي، 543 00:44:52,040 --> 00:44:58,040 نحن حذفت أن الاختبار الأول الذي نقوم به عادة عندما نستخدم وسائط سطر الأوامر، 544 00:44:58,040 --> 00:45:05,240 وهو اختبار ما إذا كان أو لا قيمة لدينا argc هو ما نتوقع. 545 00:45:05,240 --> 00:45:10,290 في هذه الحالة، نتوقع على الأقل من الحجج، 546 00:45:10,290 --> 00:45:13,660 اسم البرنامج زائد واحد آخر. 547 00:45:13,660 --> 00:45:17,140 لأننا على وشك استخدام الوسيطة الثانية هنا. 548 00:45:17,140 --> 00:45:21,350 وذلك بعد نوعا من الاختبار من قبل، قبل دعوتنا strcmp 549 00:45:21,350 --> 00:45:37,390 من شأنها أن الاختبارات أم لا argv هو لا يقل عن 2، كما تفعل نفس الشيء. 550 00:45:37,390 --> 00:45:40,620 يمكننا أن نرى ما اذا كان يعمل عن طريق تشغيل البرنامج مرة أخرى. 551 00:45:40,620 --> 00:45:45,610 يمكنك إعادة تشغيل البرنامج دائما داخل GDB، التي هي لطيفة حقا. 552 00:45:45,610 --> 00:45:49,310 يمكنك تشغيل، وعند تمرير الوسائط إلى البرنامج في الكمبيوتر، 553 00:45:49,310 --> 00:45:53,060 كنت مارة في تشغيل عند استدعاء، وليس عند الحذاء GDB. 554 00:45:53,060 --> 00:45:57,120 بهذه الطريقة يمكنك الاحتفاظ استدعاء البرنامج مع الحجج مختلفة في كل مرة. 555 00:45:57,120 --> 00:46:08,080 تشغيل ذلك، أو مرة أخرى، أستطيع أن اكتب R، ودعونا نرى ما سيحدث لو أننا اكتب "مرحبا". 556 00:46:08,080 --> 00:46:11,140 سوف يطلب منك إذا كنت دائما تريد أن تبدأ من البداية مرة أخرى. 557 00:46:11,140 --> 00:46:17,490 عادة، كنت لا تريد أن تبدأ من البداية مرة أخرى. 558 00:46:17,490 --> 00:46:25,010 وعند هذه النقطة، إعادة تشغيل مرة أخرى، فإنه يطبع خارج 559 00:46:25,010 --> 00:46:28,920 البرنامج الذي نحن على التوالي، buggy1، مع حجة مرحبا، 560 00:46:28,920 --> 00:46:32,720 وهذا فإنه يطبع من معيار، بل يقول: "يمكنك الحصول على D،" وجها حزينا. 561 00:46:32,720 --> 00:46:37,610 لكننا لم SEG خطأ. وقال أن عملية خرجت بشكل طبيعي. 562 00:46:37,610 --> 00:46:39,900 بحيث تبدو جيدة. 563 00:46:39,900 --> 00:46:43,050 أي خطأ أكثر SEG، التي قطعناها على أنفسنا من الماضي، 564 00:46:43,050 --> 00:46:48,190 لذلك يبدو أن الواقع كان علة خطأ SEG التي كنا نحصل. 565 00:46:48,190 --> 00:46:51,540 للأسف، فإنه يقول لنا أننا الحصول على D. 566 00:46:51,540 --> 00:46:54,090 >> يمكن أن نعود وننظر في رمز ونرى ما يجري هناك 567 00:46:54,090 --> 00:46:57,980 لمعرفة ما كان - لماذا كان يقول لنا ان حصلنا على D. 568 00:46:57,980 --> 00:47:03,690 دعونا نرى، وهذا القول هنا أن printf كنت حصلت على D. 569 00:47:03,690 --> 00:47:08,540 إذا كان لنا أن اكتب قائمة، كما يمكنك الاحتفاظ بكتابة قائمة، فإنه يحتفظ بالتكرار إلى الأسفل من خلال البرنامج الخاص بك، 570 00:47:08,540 --> 00:47:10,940 ذلك أنها سوف تظهر لك الأسطر القليلة الأولى من البرنامج. 571 00:47:10,940 --> 00:47:15,450 ثم سوف تظهر لك السطور القادمة القليلة، وقطعة قطعة المقبل والمقبل. 572 00:47:15,450 --> 00:47:18,240 وأنها سوف تحاول أن تبقي للذهاب إلى أسفل. 573 00:47:18,240 --> 00:47:21,180 والآن سوف نصل الى "الخط رقم 16 هو خارج النطاق." 574 00:47:21,180 --> 00:47:23,940 لأنه ليس لديها سوى 15 خطوط. 575 00:47:23,940 --> 00:47:30,310 إذا كنت تحصل على هذه النقطة والخاص متسائلا "ماذا أفعل؟" يمكنك استخدام الأمر المساعدة. 576 00:47:30,310 --> 00:47:34,340 استخدام تعليمات ثم تعطيه اسم أمر. 577 00:47:34,340 --> 00:47:36,460 وترى GDB يعطينا كل هذا النوع من الاشياء. 578 00:47:36,460 --> 00:47:43,870 فإنه يقول: "ومع عدم وجود حجة، تحدد عشر بعد أكثر من الخطوط أو حول القائمة السابقة. 579 00:47:43,870 --> 00:47:47,920 قائمة - يسرد خطوط العاشرة قبل - " 580 00:47:47,920 --> 00:47:52,960 لذلك دعونا حاول استخدام ناقص القائمة. 581 00:47:52,960 --> 00:47:57,000 وتسرد خطوط 10 السابقة؛ يمكن أن تقوم به حولها مع قائمة قليلا. 582 00:47:57,000 --> 00:48:02,330 يمكنك القيام قائمة، قائمة -، يمكنك إعطاء قائمة حتى رقم، مثل قائمة 8، 583 00:48:02,330 --> 00:48:07,500 وانها سوف قائمة الخطوط حوالي 10 السطر 8. 584 00:48:07,500 --> 00:48:10,290 ويمكنك ان ترى ما يحدث هنا هو أن لديك بسيطة إذا آخر. 585 00:48:10,290 --> 00:48:13,980 إذا قمت بكتابة CS50 في الصخور، فإنه يطبع خارجا "تحصل على A." 586 00:48:13,980 --> 00:48:16,530 وإلا فإنه بطباعة "تحصل على D." 587 00:48:16,530 --> 00:48:23,770 المشكله المدينة. حسنا. نعم؟ 588 00:48:23,770 --> 00:48:26,730 >> [دانيال] لذلك عندما حاولت القيام CS50 الصخور بدون الاقتباس، 589 00:48:26,730 --> 00:48:29,290 تقول "يمكنك الحصول على D." 590 00:48:29,290 --> 00:48:32,560 أنا في حاجة إلى الاقتباس الحصول على عمل، لماذا ذلك؟ 591 00:48:32,560 --> 00:48:38,490 نعم >>. تبين أنه عندما - وهذا هو آخر طعام شهي القليل من المرح - 592 00:48:38,490 --> 00:48:47,900 عند تشغيل البرنامج، واذا كنا تشغيله ونحن في CS50 اكتب الصخور، 593 00:48:47,900 --> 00:48:50,800 تماما مثل دانيال وقال انه فعل، وأنت هاهنا، 594 00:48:50,800 --> 00:48:52,870 تقول تزال نحصل على D. 595 00:48:52,870 --> 00:48:55,580 والسؤال هو، لماذا هذا؟ 596 00:48:55,580 --> 00:49:02,120 وتبين أن كلا من لدينا محطة وتحليل هذه GDB عن اثنين من الحجج منفصلة. 597 00:49:02,120 --> 00:49:04,800 لأن عندما يكون هناك مسافة، وهذا يعني كما 598 00:49:04,800 --> 00:49:08,730 انتهت الوسيطة الأولى، والحجة التالية هي على وشك أن تبدأ. 599 00:49:08,730 --> 00:49:13,260 الطريق إلى الجمع بين تلك إلى قسمين، أو عذرا، إلى وسيطة واحدة، 600 00:49:13,260 --> 00:49:18,510 هو استخدام علامات التنصيص. 601 00:49:18,510 --> 00:49:29,560 حتى الآن، إذا وضعنا في الاسعار وتشغيله مرة أخرى، ونحن الحصول على A. 602 00:49:29,560 --> 00:49:38,780 حتى لمجرد باختصار، لا يتم تحليل عروض الأسعار وCS50 والصخور عن اثنين من الحجج منفصلة. 603 00:49:38,780 --> 00:49:45,320 مع الاسعار، انها تحليل بأنها وسيطة واحدة تماما. 604 00:49:45,320 --> 00:49:53,070 >> يمكننا أن نرى ذلك مع نقطة توقف. 605 00:49:53,070 --> 00:49:54,920 حتى الآن كنا تشغيل برنامجنا، وانه تم تشغيله 606 00:49:54,920 --> 00:49:58,230 حتى إما أن SEG أخطاء أو ضربات خطأ 607 00:49:58,230 --> 00:50:05,930 أو حتى أنها قد خرجت وأصبحت الامور بخير تماما. 608 00:50:05,930 --> 00:50:08,360 هذه ليست بالضرورة الشيء الأكثر مفيدة، لأن في بعض الأحيان 609 00:50:08,360 --> 00:50:11,840 لديك خطأ في البرنامج، لكنه لا يسبب تجزئة الخطأ. 610 00:50:11,840 --> 00:50:16,950 انها لا تسبب البرنامج إلى إيقاف أو أي شيء من هذا القبيل. 611 00:50:16,950 --> 00:50:20,730 الطريق للحصول على GDB إلى وقفة البرنامج عند نقطة معينة 612 00:50:20,730 --> 00:50:23,260 هو تعيين نقطة توقف. 613 00:50:23,260 --> 00:50:26,520 يمكنك القيام بذلك عن طريق إما تعيين نقطة توقف على اسم الدالة 614 00:50:26,520 --> 00:50:30,770 أو يمكنك تعيين نقطة توقف على خط معين من التعليمات البرمجية. 615 00:50:30,770 --> 00:50:34,450 أود أن تعيين نقاط إيقاف على أسماء دالة، لأنه - من السهل أن نتذكر، 616 00:50:34,450 --> 00:50:37,700 وإذا ذهبت فعلا في تغيير والتعليمات البرمجية المصدر قليلا قليلا، 617 00:50:37,700 --> 00:50:42,020 ثم توقف إقامتك في الواقع في نفس المكان داخل التعليمات البرمجية. 618 00:50:42,020 --> 00:50:44,760 في حين إذا كنت تستخدم أرقام الأسطر، وتغيير أرقام الأسطر 619 00:50:44,760 --> 00:50:51,740 لأنك إضافة أو حذف بعض التعليمات البرمجية، ثم يتم شد جميع نقاط التوقف الخاصة بك تماما حتى. 620 00:50:51,740 --> 00:50:58,590 وضعت واحدة من أكثر الأمور شيوعا أفعل نقطة توقف على الدالة الرئيسية. 621 00:50:58,590 --> 00:51:05,300 في كثير من الأحيان سوف يصل الحذاء GDB، وأنا من النوع B الرئيسي، هاهنا، والتي سوف تعيين نقطة توقف 622 00:51:05,300 --> 00:51:10,630 على الوظيفة الرئيسية التي تقول فقط، "وقفة البرنامج بمجرد بدء تشغيل" 623 00:51:10,630 --> 00:51:17,960 وبهذه الطريقة، عند تشغيل برنامجي مع، ويقول، CS50 الصخور وحجتان 624 00:51:17,960 --> 00:51:24,830 وضرب أدخل، فإنه يحصل على الوظيفة الرئيسية ويتوقف الحق في السطر الأول جدا، 625 00:51:24,830 --> 00:51:30,620 الحق قبل فالتقييم وظيفة strcmp. 626 00:51:30,620 --> 00:51:34,940 >> منذ توقف أنا أنا، والآن أستطيع أن أبدأ التلويث ورؤية حول ما يحدث 627 00:51:34,940 --> 00:51:40,250 مع كل من المتغيرات المختلفة التي تم تمريرها في برنامجي. 628 00:51:40,250 --> 00:51:43,670 هنا يمكنني طباعة argc ونرى ما يحدث. 629 00:51:43,670 --> 00:51:50,030 نرى أن argc هو 3، لأنها حصلت على 3 قيم مختلفة في ذلك. 630 00:51:50,030 --> 00:51:54,060 انها حصلت على اسم البرنامج، انها حصلت على الوسيطة الأولى والوسيطة الثانية. 631 00:51:54,060 --> 00:52:09,330 يمكننا طباعة هذه من خلال النظر في argv [0]، argv [1]، وargv [2]. 632 00:52:09,330 --> 00:52:12,030 حتى الآن يمكنك ان ترى لماذا هذه الدعوة strcmp سوف تفشل، 633 00:52:12,030 --> 00:52:21,650 لأنك ترى أنه لم تقسيم للCS50 والصخور إلى قسمين منفصلين الحجج. 634 00:52:21,650 --> 00:52:27,250 عند هذه النقطة، مرة واحدة كنت قد بلغت نقطة توقف، يمكنك متابعة إلى الخطوة من خلال برنامج 635 00:52:27,250 --> 00:52:32,920 سطرا سطرا، بدلا من بدء تشغيل البرنامج مرة أخرى. 636 00:52:32,920 --> 00:52:35,520 حتى إذا كنت لا تريد أن تبدأ البرنامج مرة أخرى وتواصل فقط القراءة من هنا، 637 00:52:35,520 --> 00:52:41,970 يمكنك استخدام الأمر ما زالت مستمرة وسوف تستمر تشغيل البرنامج حتى النهاية. 638 00:52:41,970 --> 00:52:45,010 مثلما فعلت هنا. 639 00:52:45,010 --> 00:52:54,880 ومع ذلك، إذا كنت إعادة تشغيل البرنامج، CS50 الصخور، كان يضرب توقف بلدي مرة أخرى، 640 00:52:54,880 --> 00:52:59,670 وهذه المرة، إذا كنت لا تريد أن فقط يذهب كل في طريقه من خلال ما تبقى من البرنامج، 641 00:52:59,670 --> 00:53:08,040 يمكنني استخدام الأمر التالي، وأنا أيضا مع اختصار ن. 642 00:53:08,040 --> 00:53:12,960 وهذه الخطوة سوف من خلال خط برنامج سطرا. 643 00:53:12,960 --> 00:53:17,530 حتى تتمكن من مشاهدة الأشياء كما تنفيذ، والمتغيرات التغيير، والحصول على تحديث الأشياء. 644 00:53:17,530 --> 00:53:21,550 وهو لطيف جدا. 645 00:53:21,550 --> 00:53:26,570 والشيء الآخر هو بارد بدلا من تكرار الأمر نفسه مرارا وتكرارا وتكرارا، 646 00:53:26,570 --> 00:53:30,670 إذا كنت مجرد ضرب أدخل - حتى هنا ترى أنا لم كتبته في أي شيء - 647 00:53:30,670 --> 00:53:33,780 إذا كنت مجرد ضرب أدخل، فإنه سيتم تكرار الأمر السابق، 648 00:53:33,780 --> 00:53:36,900 أو الأمر GDB السابقة التي أنا فقط وضعت فيه. 649 00:53:36,900 --> 00:53:56,000 يمكنني الحفاظ على ضرب أدخل وسوف تبقى التنقل خلال قانون بلدي خط سطرا. 650 00:53:56,000 --> 00:53:59,310 وأود أن أشجعكم اللاعبين لتذهب للتحقق من البرامج عربات التي تجرها الدواب الأخرى كذلك. 651 00:53:59,310 --> 00:54:01,330 ليس لدينا الوقت للحصول على كل منهم من خلال اليوم في القسم. 652 00:54:01,330 --> 00:54:05,890 شفرة المصدر هو هناك، حتى تتمكن من نوع من معرفة ما يجري 653 00:54:05,890 --> 00:54:07,730 وراء الكواليس إذا واجهتك مشكلة حقا لكم، 654 00:54:07,730 --> 00:54:11,940 ولكن على أقل تقدير، وممارسة فقط تمهيد GDB، 655 00:54:11,940 --> 00:54:13,940 تشغيل البرنامج حتى يكسر عليك، 656 00:54:13,940 --> 00:54:18,260 الحصول على التتبع المعاكس، ومعرفة ما يعمل الحادث كان في، 657 00:54:18,260 --> 00:54:24,450 ما كان على خط وطباعة بعض قيم المتغيرات، 658 00:54:24,450 --> 00:54:30,140 لذلك أنت فقط التعود على ذلك، لأن من شأنها أن تساعد حقا لكم في المستقبل. 659 00:54:30,140 --> 00:54:36,340 في هذه المرحلة، ونحن في طريقنا لإنهاء من GDB، والتي لا تستخدم أو مجرد ترك س. 660 00:54:36,340 --> 00:54:40,460 إذا كان البرنامج الخاص بك هو في منتصف يزال قيد التشغيل، وأنها خرجت لا، 661 00:54:40,460 --> 00:54:43,510 سوف أطلب دائما لكم، "هل أنت متأكد من أنك تريد حقا أن تترك؟" 662 00:54:43,510 --> 00:54:48,770 يمكنك مجرد ضرب نعم. 663 00:54:48,770 --> 00:54:55,250 >> الآن ونحن في طريقنا للنظر في المشكلة القادمة لدينا، والذي هو برنامج القط. 664 00:54:55,250 --> 00:54:59,880 إذا كنت قصيرة على مشاهدة إعادة توجيه وخراطيم سترى أن يستخدم هذا البرنامج تومي 665 00:54:59,880 --> 00:55:07,540 الذي يطبع كافة الإخراج أساسا من ملف إلى الشاشة. 666 00:55:07,540 --> 00:55:12,660 إذا كان الأمر كذلك أركض القط، وهذا هو في الواقع برنامج المدمج في الجهاز ل، 667 00:55:12,660 --> 00:55:16,860 وإذا كان لديك أجهزة ماكينتوش يمكنك القيام بذلك على ماك الخاص بك أيضا، إذا كنت فتح المعبر. 668 00:55:16,860 --> 00:55:25,630 ونحن - القط، دعنا نقول، cp.c، وضرب أدخل. 669 00:55:25,630 --> 00:55:29,640 ما هذا فعل، واذا كنا انتقل لأعلى قليلا ونرى أين نحن ركض الخط، 670 00:55:29,640 --> 00:55:40,440 أو عندما هربنا الأمر القط، فإنه حرفيا طبع للتو محتويات الشاشة إلى cp.c لدينا. 671 00:55:40,440 --> 00:55:44,140 يمكننا تشغيله مرة أخرى ويمكنك وضعها في ملفات متعددة معا. 672 00:55:44,140 --> 00:55:49,880 حتى تتمكن من القيام cp.c القط، وبعد ذلك يمكننا أيضا سلسلة ملف cat.c، 673 00:55:49,880 --> 00:55:53,250 وهو البرنامج الذي على وشك الكتابة، 674 00:55:53,250 --> 00:55:58,140 وأنها سوف طباعة كل الملفات العودة إلى الوراء إلى شاشة لدينا. 675 00:55:58,140 --> 00:56:05,490 حتى إذا كنا انتقل لأعلى قليلا، ونحن نرى أنه عندما ركضنا هذا cp.c القط، cat.c، 676 00:56:05,490 --> 00:56:17,110 طبع لأول مرة خارج الملف القطري، ومن ثم تحته، فإنه تطبع الملف cat.c الحق هنا إلى أسفل. 677 00:56:17,110 --> 00:56:19,650 نحن ذاهبون الى استخدام هذا لمجرد الحصول على أقدامنا الرطب. 678 00:56:19,650 --> 00:56:25,930 لعب مع حولها الطباعة بسيطة لمحطة، انظر كيف يعمل. 679 00:56:25,930 --> 00:56:39,170 إذا يا رفاق فتح مع gedit cat.c، هاهنا، 680 00:56:39,170 --> 00:56:43,760 تستطيع أن ترى في البرنامج الذي نحن على وشك الكتابة. 681 00:56:43,760 --> 00:56:48,980 لقد تضمنت هذه لوحة جميلة المرجل، لذلك ليس لدينا لقضاء بعض الوقت بكتابة كل ما بها. 682 00:56:48,980 --> 00:56:52,310 ونحن أيضا التحقق من عدد من الحجج تمريره. 683 00:56:52,310 --> 00:56:56,910 نحن طباعة رسالة لطيفة الاستخدام. 684 00:56:56,910 --> 00:57:00,950 >> هذا هو النوع من الشيء الذي، مرة أخرى، وكأننا نتحدث عن، 685 00:57:00,950 --> 00:57:04,490 انها تقريبا مثل الذاكرة العضلات. 686 00:57:04,490 --> 00:57:07,190 فقط تذكر لتستمر في فعل نفس النوع من الاشياء 687 00:57:07,190 --> 00:57:11,310 والطباعة دائما نوعا من رسالة مفيدة 688 00:57:11,310 --> 00:57:17,670 لدرجة أن الناس يعرفون كيفية تشغيل البرنامج. 689 00:57:17,670 --> 00:57:21,630 مع القط، انها بسيطة جدا، ونحن في طريقنا للذهاب فقط من خلال كل من الحجج المختلفة 690 00:57:21,630 --> 00:57:24,300 صدرت أن برنامجنا، ونحن في طريقنا للطباعة 691 00:57:24,300 --> 00:57:29,950 محتوياتها إلى الشاشة في وقت واحد. 692 00:57:29,950 --> 00:57:35,670 من أجل طباعة الملفات إلى الشاشة، ونحن في طريقنا للقيام بشيء مماثل للغاية 693 00:57:35,670 --> 00:57:38,120 لماذا فعلنا في نهاية هذه المسابقة. 694 00:57:38,120 --> 00:57:45,350 في نهاية هذه المسابقة، التي توظف البرنامج، كان لدينا لفتح الملف، 695 00:57:45,350 --> 00:57:48,490 ومن ثم كان علينا أن الطباعة إليها. 696 00:57:48,490 --> 00:57:54,660 في هذه الحالة، ونحن في طريقنا لفتح الملف، ونحن في طريقنا للقراءة منه بدلا من ذلك. 697 00:57:54,660 --> 00:58:00,630 ثم ونحن في طريقنا للطباعة، بدلا من ملف، ونحن في طريقنا لطباعة على الشاشة. 698 00:58:00,630 --> 00:58:05,830 الطباعة حتى إلى الشاشة كنت قد فعلت من قبل مع جميع printf. 699 00:58:05,830 --> 00:58:08,290 بحيث لا مجنونة جدا. 700 00:58:08,290 --> 00:58:12,190 لكن قراءة ملف هو نوع من غريب. 701 00:58:12,190 --> 00:58:17,300 سوف نذهب من خلال قليلا أن القليل في وقت واحد. 702 00:58:17,300 --> 00:58:20,560 إذا يا رفاق العودة لتلك المشكلة مشاركة في مسابقة الخاصة بك، مشكلة 33، 703 00:58:20,560 --> 00:58:27,280 السطر الأول أننا في طريقنا للقيام هنا، وفتح ملف، هي مشابهة جدا لما فعلناه هناك. 704 00:58:27,280 --> 00:58:36,370 حتى ستيلا، ما يفعل ذلك نظرة مثل خط، ونحن عندما فتح ملف؟ 705 00:58:36,370 --> 00:58:47,510 [ستيلا] FILE * رأس المال، ملف - >> حسنا. >> - تساوي الدالة fopen. نعم >>. 706 00:58:47,510 --> 00:58:55,980 وهو في هذه الحالة هو؟ انها في التعليق. 707 00:58:55,980 --> 00:59:06,930 انها >> في التعليق؟ argv [i] و ص؟ 708 00:59:06,930 --> 00:59:11,300 بالضبط >>. على حق. ذلك صحيح تماما ستيلا. 709 00:59:11,300 --> 00:59:13,720 هذا هو ما يبدو وكأنه خط. 710 00:59:13,720 --> 00:59:19,670 ونحن في طريقنا للحصول على متغير تيار الملف، واحفظها في ملف * FILE، لذلك كل مباراة دولية، 711 00:59:19,670 --> 00:59:25,720 سوف FILE، *، واسم هذا المتغير يكون الملف. 712 00:59:25,720 --> 00:59:32,250 يمكن أن نسميها ما نشاء. يمكن أن نسميها first_file، أو file_i، مهما نود. 713 00:59:32,250 --> 00:59:37,590 ومن ثم تم تمرير اسم الملف في على سطر الأوامر لهذا البرنامج. 714 00:59:37,590 --> 00:59:44,450 لذلك يتم تخزينها في argv [أنا] ثم ونحن في طريقنا لفتح هذا الملف في وضع القراءة. 715 00:59:44,450 --> 00:59:48,100 والآن بعد أن قمنا فتح الملف، ما هو الشيء الذي لدينا أن نتذكر دائما أن تفعل 716 00:59:48,100 --> 00:59:52,230 لقد فتحنا كلما ملف؟ إغلاقه. 717 00:59:52,230 --> 00:59:57,220 حتى ميسي، كيف يمكننا إغلاق ملف؟ 718 00:59:57,220 --> 01:00:01,020 [ميسي] fclose (ملف) >> fclose (ملف). بالضبط. 719 01:00:01,020 --> 01:00:05,340 كبيرة. حسنا. إذا نظرنا إلى هذا القيام تعليق هنا، 720 01:00:05,340 --> 01:00:11,940 تقول، "فتح argv [i] و طباعة محتوياته إلى STDOUT." 721 01:00:11,940 --> 01:00:15,460 >> من معيار هو اسم غريب. STDOUT هو مجرد لدينا طريقة للقول 722 01:00:15,460 --> 01:00:22,880 نريد أن طباعته إلى محطة، ونحن نريد أن طباعته إلى دفق إخراج قياسي. 723 01:00:22,880 --> 01:00:26,450 يمكننا في الواقع الحصول على التخلص من هذا التعليق هنا. 724 01:00:26,450 --> 01:00:36,480 أنا ذاهب لنسخه ولصقه ومنذ ذلك ما فعلناه. 725 01:00:36,480 --> 01:00:41,290 في هذه المرحلة، والآن لدينا لقراءة ملف بت فشيئا. 726 01:00:41,290 --> 01:00:46,300 لقد ناقشنا عدة طرق لقراءة الملفات. 727 01:00:46,300 --> 01:00:51,830 تلك التي هي المفضلة لديك حتى الآن؟ 728 01:00:51,830 --> 01:00:57,960 طرق التي هل رأيت أو هل تذكرين، لقراءة الملفات؟ 729 01:00:57,960 --> 01:01:04,870 [دانيال] fread؟ fread >>؟ fread ذلك هو واحد. جيمي، هل تعرف أي أشخاص آخرين؟ 730 01:01:04,870 --> 01:01:12,150 [جيمي] رقم >> حسنا. كلا. شارلوت؟ الكسندر؟ أي أشخاص آخرين؟ حسنا. 731 01:01:12,150 --> 01:01:20,740 وبالتالي فإن تلك هي آخر fgetc، هي واحدة أننا سوف تستخدم الكثير. 732 01:01:20,740 --> 01:01:26,410 هناك أيضا fscanf؛ انظر يا رفاق نمط هنا؟ 733 01:01:26,410 --> 01:01:29,170 وتبدأ جميعها و. أي علاقة مع ملف. 734 01:01:29,170 --> 01:01:35,260 هناك fread، fgetc، fscanf. هذه كلها وظائف القراءة. 735 01:01:35,260 --> 01:01:49,120 للكتابة لدينا fwrite، لدينا fputc بدلا من fgetc. 736 01:01:49,120 --> 01:01:58,250 لدينا أيضا مثل fprintf رأينا على هذه المسابقة. 737 01:01:58,250 --> 01:02:01,680 حيث أن هذه هي المشكلة التي ينطوي القراءة من ملف، 738 01:02:01,680 --> 01:02:04,940 ونحن في طريقنا لاستخدام واحد من هذه الوظائف الثلاث. 739 01:02:04,940 --> 01:02:10,890 نحن لا تنوي استخدام هذه الوظائف إلى هنا. 740 01:02:10,890 --> 01:02:14,880 تم العثور على جميع هذه الوظائف في مكتبة I / O القياسية. 741 01:02:14,880 --> 01:02:17,510 حتى إذا كنت تبحث في الجزء العلوي من هذا البرنامج، 742 01:02:17,510 --> 01:02:24,110 يمكنك أن ترى أن لدينا بالفعل تضمين ملف الرأس للمكتبة I / O القياسية. 743 01:02:24,110 --> 01:02:27,120 إذا كنا نريد لمعرفة أي واحد نريد للاستخدام، 744 01:02:27,120 --> 01:02:29,690 يمكننا فتح دائما على صفحات رجل. 745 01:02:29,690 --> 01:02:34,350 حتى نتمكن من كتابة stdio والرجل 746 01:02:34,350 --> 01:02:43,180 وقراءة كل شيء عن المدخلات وstdio وظائف الإخراج في C. 747 01:02:43,180 --> 01:02:49,870 ويمكننا أن نرى بالفعل يا، نظرة. انها بالذكر fgetc، انها بالذكر fputc. 748 01:02:49,870 --> 01:02:57,220 حتى تتمكن من النفاذ إلى الأسفل قليلا وننظر، يقول، fgetc 749 01:02:57,220 --> 01:03:00,060 وإلقاء نظرة على الصفحة رجل والخمسين. 750 01:03:00,060 --> 01:03:03,430 يمكنك أن ترى أن ذلك يسير جنبا إلى جنب مع مجموعة كاملة من وظائف أخرى: 751 01:03:03,430 --> 01:03:12,640 fgetc، fgets، getc، getchar، يحصل، ungetc، ومدخلاته من الحروف والجمل. 752 01:03:12,640 --> 01:03:19,180 لذلك هذا هو كيف نقرأ في الشخصيات وسلاسل من الملفات من الإدخال القياسي، 753 01:03:19,180 --> 01:03:21,990 التي هي في جوهرها من المستخدم. 754 01:03:21,990 --> 01:03:24,780 وهذه هي الطريقة التي نفعل ذلك في C. الفعلية 755 01:03:24,780 --> 01:03:30,850 لذلك هذا لا يستخدم وظائف GetString GetChar 756 01:03:30,850 --> 01:03:36,840 أن كنا من مكتبة CS50. 757 01:03:36,840 --> 01:03:39,710 ونحن في طريقنا للقيام بذلك مشكلة في زوجين من الطرق 758 01:03:39,710 --> 01:03:43,430 بحيث يمكنك ان ترى بطريقتين مختلفتين للقيام بذلك. 759 01:03:43,430 --> 01:03:48,490 كل وظيفة fread ان دانيال المذكورة وfgetc هي طرق جيدة للقيام بذلك. 760 01:03:48,490 --> 01:03:53,790 أعتقد fgetc هو أسهل قليلا، لأنه يحتوي فقط، كما ترون، 761 01:03:53,790 --> 01:03:59,660 وسيطة واحدة، و* FILE أن نحاول قراءة حرف من، 762 01:03:59,660 --> 01:04:02,740 وقيمته هو عودة الباحث. 763 01:04:02,740 --> 01:04:05,610 وهذا هو قليلا مربكة، أليس كذلك؟ 764 01:04:05,610 --> 01:04:11,450 >> لأننا نحصل على حرف، لذلك لماذا لا هذه العودة وشار؟ 765 01:04:11,450 --> 01:04:18,700 يا رفاق لديك أي أفكار حول لماذا هذا قد لا ترجع شار؟ 766 01:04:18,700 --> 01:04:25,510 [الأجوبة ميسي، غير مفهومة] >> نعم. ذلك صحيح تماما ميسي. 767 01:04:25,510 --> 01:04:31,570 اذا كان ASCII، ويمكن بعد ذلك أن يتم تعيين هذا صحيح إلى شار الفعلية. 768 01:04:31,570 --> 01:04:33,520 يمكن أن يكون حرف ASCII، وهذا صحيح. 769 01:04:33,520 --> 01:04:36,220 هذا هو بالضبط ما يحدث. 770 01:04:36,220 --> 01:04:39,190 نحن باستخدام الباحث لمجرد ان لديها أكثر بت. 771 01:04:39,190 --> 01:04:44,750 انها أكبر من شار؛ شار لديها 8 بت فقط، أن 1 بايت على الأجهزة لدينا 32-بت. 772 01:04:44,750 --> 01:04:48,520 والباحث لديه يستحق كل بايت 4 'من الفضاء. 773 01:04:48,520 --> 01:04:50,940 واتضح أن الطريقة fgetc يعمل، 774 01:04:50,940 --> 01:04:53,940 إذا كان لنا أن انتقل لأسفل في خلاصة لدينا في هذه الصفحة الرجل قليلا، 775 01:04:53,940 --> 01:05:05,000 انتقل على طول الطريق. اتضح أنهم يستخدمون هذه القيمة خاصة تسمى EOF. 776 01:05:05,000 --> 01:05:09,640 انها ثابتة خاصة حيث بلغت قيمة الإرجاع للدالة fgetc 777 01:05:09,640 --> 01:05:14,570 كلما ضربت لك نهاية الملف أو إذا كنت تحصل على خطأ 778 01:05:14,570 --> 01:05:18,170 واتضح أن للقيام بهذه المقارنات مع EOF بشكل صحيح، 779 01:05:18,170 --> 01:05:24,060 كنت تريد أن يكون هذا المبلغ الاضافي من المعلومات التي لديك في كثافة العمليات 780 01:05:24,060 --> 01:05:28,420 بدلا من استخدام متغير شار. 781 01:05:28,420 --> 01:05:32,130 على الرغم من fgetc هو الحصول على نحو فعال حرف من ملف، 782 01:05:32,130 --> 01:05:38,450 تريد أن نتذكر أنه يعود هذا شيء من نوع int لك. 783 01:05:38,450 --> 01:05:41,360 قلت ذلك، فإنه من السهل إلى حد ما للاستخدام. 784 01:05:41,360 --> 01:05:44,960 انها سوف تعطينا حرف، لذا كل ما عليك القيام به هو الحفاظ على طرح الملف، 785 01:05:44,960 --> 01:05:48,440 "أعطني الحرف التالي، أعطني الحرف التالي، أعطني الحرف التالي،" 786 01:05:48,440 --> 01:05:51,400 حتى نصل إلى نهاية الملف. 787 01:05:51,400 --> 01:05:54,730 وسوف تسحب في ذلك حرف واحد في وقت واحد من الملف لدينا، 788 01:05:54,730 --> 01:05:56,250 ومن ثم يمكننا أن نفعل كل ما نحب معها. 789 01:05:56,250 --> 01:06:00,160 يمكننا تخزينها، ويمكننا أن نضيف إلى سلسلة، ونحن يمكن طباعته. 790 01:06:00,160 --> 01:06:04,630 قم بأي من ذلك. 791 01:06:04,630 --> 01:06:09,600 >> التكبير التراجع والعودة إلى برنامجنا cat.c، 792 01:06:09,600 --> 01:06:16,170 إذا نحن ذاهبون إلى استخدام fgetc، 793 01:06:16,170 --> 01:06:21,710 كيف يمكن نقترب هذا السطر التالي من التعليمات البرمجية؟ 794 01:06:21,710 --> 01:06:26,020 ونحن في طريقنا لاستخدام - fread سوف تفعل شيئا مختلفا قليلا. 795 01:06:26,020 --> 01:06:32,600 وهذه المرة، ونحن في طريقنا لمجرد استخدام fgetc للحصول على حرف واحد في كل مرة. 796 01:06:32,600 --> 01:06:40,910 لمعالجة ملف كامل، ما قد يتعين علينا القيام به؟ 797 01:06:40,910 --> 01:06:44,030 عدد الأحرف هناك في ملف؟ 798 01:06:44,030 --> 01:06:47,390 هناك الكثير. لذلك ربما كنت ترغب في الحصول على واحد 799 01:06:47,390 --> 01:06:49,860 وبعد ذلك الحصول على آخر والحصول على آخر والحصول على آخر. 800 01:06:49,860 --> 01:06:53,330 ما هو نوع من الخوارزمية رأيك قد يكون لدينا لاستخدام هنا؟ 801 01:06:53,330 --> 01:06:55,470 ما هو نوع من -؟ [ألكسندر] حلقة For؟ بالضبط >>. 802 01:06:55,470 --> 01:06:57,500 نوع من الحلقة. 803 01:06:57,500 --> 01:07:03,380 A لحلقة كبيرة في الواقع، في هذه الحالة. 804 01:07:03,380 --> 01:07:08,620 ومثلك كانوا يقولون، يبدو وكأنه كنت ترغب في حلقة على الملف بأكمله، 805 01:07:08,620 --> 01:07:11,820 الحصول على حرف في كل مرة. 806 01:07:11,820 --> 01:07:13,850 أي اقتراحات بشأن ما يمكن أن تبدو وكأنها؟ 807 01:07:13,850 --> 01:07:22,090 [الكسندر، غير مفهومة] 808 01:07:22,090 --> 01:07:30,050 حسنا >>، قل لي باللغة الإنجليزية ما كنت تحاول أن تفعل؟ [الكسندر، غير مفهومة] 809 01:07:30,050 --> 01:07:36,270 حتى في هذه الحالة، وهذا يبدو وكأننا مجرد محاولة لحلقة على الملف بأكمله. 810 01:07:36,270 --> 01:07:45,330 [ألكسندر] لذا أنا <حجم كثافة العمليات؟ >> حجم -؟ 811 01:07:45,330 --> 01:07:49,290 اعتقد ان حجم الملف، أليس كذلك؟ حجم - we'll مجرد كتابة على هذا النحو. 812 01:07:49,290 --> 01:07:57,470 حجم الملف في الوقت الراهن، وأنا + +. 813 01:07:57,470 --> 01:08:04,610 لذلك تبين أن طريقة القيام بذلك باستخدام fgetc، وهذا هو الجديد، 814 01:08:04,610 --> 01:08:10,460 هو أن ليس هناك طريقة سهلة لمجرد الحصول على حجم ملف 815 01:08:10,460 --> 01:08:16,979 مع هذا النوع "sizeof" من بناء التي كنت قد رأيت من قبل. 816 01:08:16,979 --> 01:08:20,910 عندما نستخدم تلك الوظيفة fgetc، إننا نقدم نوعا من 817 01:08:20,910 --> 01:08:29,069 جديدة، بناء جملة غير تقليدي لهذه الحلقة ل، حيث بدلا من مجرد استخدام عداد الأساسية 818 01:08:29,069 --> 01:08:33,920 للذهاب حرف بحرف، ونحن في طريقنا لسحب حرف واحد في كل مرة، 819 01:08:33,920 --> 01:08:37,120 حرف واحد في وقت واحد، والطريقة نعلم أننا في نهاية 820 01:08:37,120 --> 01:08:41,290 لا تحسب عندما قمنا عدد معين من الحروف، 821 01:08:41,290 --> 01:08:49,939 ولكن عندما انسحبنا الطابع هو أن نهاية الخاص للحرف الملف. 822 01:08:49,939 --> 01:08:58,689 حتى نتمكن من القيام بذلك عن طريق - وأنا أسمي هذا الفصل، ونحن في طريقنا إلى تهيئة ذلك 823 01:08:58,689 --> 01:09:08,050 مع دعوتنا أول من يحصل على الحرف الأول من الملف. 824 01:09:08,050 --> 01:09:14,979 حتى هذا الجزء هنا، هذا هو الذهاب الى الحصول على واحد من شخصيات من الملف 825 01:09:14,979 --> 01:09:20,840 وتخزينها في متغير الفصل. 826 01:09:20,840 --> 01:09:25,420 ونحن في طريقنا للحفاظ على القيام بهذا حتى نصل إلى نهاية الملف، 827 01:09:25,420 --> 01:09:41,170 الذي نقوم به من خلال اختبار للحرف لا يجري على قدم المساواة لذلك الحرف EOF خاصة. 828 01:09:41,170 --> 01:09:48,750 ثم بدلا من القيام CH + +، والتي فقط زيادة القيمة، 829 01:09:48,750 --> 01:09:52,710 إذا كان الأمر كذلك نقرأ في الخروج من الملف A، A مال، ويقول، 830 01:09:52,710 --> 01:09:56,810 الفصل + + سوف تعطينا ب، ومن ثم كنا الحصول ج ثم د. 831 01:09:56,810 --> 01:09:59,310 وهذا بوضوح ما لا نريده. ما نريد هنا 832 01:09:59,310 --> 01:10:05,830 في هذا الجزء الأخير هو أننا نريد الحصول على الحرف التالي من الملف. 833 01:10:05,830 --> 01:10:09,500 >> لذلك قد كيف نحصل على الحرف التالي من الملف؟ 834 01:10:09,500 --> 01:10:13,470 كيف نحصل على الحرف الأول من الملف؟ 835 01:10:13,470 --> 01:10:17,200 [طالب] fgetfile؟ fgetc >>، أو، آسف، كنت حق تماما. 836 01:10:17,200 --> 01:10:20,470 I أخطاء إملائية أنه هناك حق. لذلك نعم. 837 01:10:20,470 --> 01:10:26,240 هنا بدلا من القيام CH + +، 838 01:10:26,240 --> 01:10:29,560 ونحن في طريقنا للدعوة فقط fgetc (ملف) مرة أخرى 839 01:10:29,560 --> 01:10:39,180 وتخزين النتيجة في المتغير لدينا نفس الفصل. 840 01:10:39,180 --> 01:10:43,730 [سؤال الطالب، غير مفهومة] 841 01:10:43,730 --> 01:10:52,390 هذا هو المكان >> هؤلاء الرجال * FILE هي خاصة. 842 01:10:52,390 --> 01:10:59,070 طريقة عملها هو أنها - عند فتح الأولى - عند إجراء مكالمة الدالة fopen الأولى التي، 843 01:10:59,070 --> 01:11:04,260 و* FILE يخدم كمؤشر فعال إلى بداية الملف. 844 01:11:04,260 --> 01:11:12,830 ثم في كل مرة استدعاء fgetc، وهو يتحرك حرف واحد من خلال الملف. 845 01:11:12,830 --> 01:11:23,280 كلما بحيث يمكنك استدعاء هذا، كنت تزايد مؤشر الملف بواسطة حرف واحد. 846 01:11:23,280 --> 01:11:26,210 وعند fgetc مرة أخرى، وكنت نقله حرف آخر 847 01:11:26,210 --> 01:11:28,910 وحرف آخر وحرف آخر حرف وآخر. 848 01:11:28,910 --> 01:11:32,030 [سؤال الطالب، غير مفهومة] >> وthat's - نعم. 849 01:11:32,030 --> 01:11:34,810 انها نوع من هذا السحر تحت غطاء محرك السيارة. 850 01:11:34,810 --> 01:11:37,930 عليك أن تبقي فقط من خلال تزايد. 851 01:11:37,930 --> 01:11:46,510 عند هذه النقطة، وكنت قادرا على العمل فعلا مع حرف. 852 01:11:46,510 --> 01:11:52,150 لذلك قد كيف يمكننا طباعة هذا إلى الشاشة، والآن؟ 853 01:11:52,150 --> 01:11:58,340 يمكننا استخدام نفس الشيء printf التي استخدمناها من قبل. 854 01:11:58,340 --> 01:12:00,330 أن كنا باستخدام جميع فصل دراسي. 855 01:12:00,330 --> 01:12:05,450 لا يمكن أن يوصف printf، 856 01:12:05,450 --> 01:12:21,300 ويمكن أن نعبر في شخصية تماما مثل ذلك. 857 01:12:21,300 --> 01:12:27,430 طريقة أخرى للقيام بذلك هو بدلا من استخدام printf والحاجة إلى القيام بذلك سلسلة التنسيق، 858 01:12:27,430 --> 01:12:29,490 يمكننا أيضا استخدام واحدة من وظائف أخرى. 859 01:12:29,490 --> 01:12:40,090 يمكننا استخدام fputc، الذي يطبع حرف على الشاشة، 860 01:12:40,090 --> 01:12:52,580 إلا إذا نظرنا إلى fputc - اسمحوا لي تصغير قليلا. 861 01:12:52,580 --> 01:12:56,430 نرى ما هو جميل هو ما يتطلبه الأمر في الحرف الذي تلا علينا استخدام fgetc، 862 01:12:56,430 --> 01:13:05,100 ولكن بعد ذلك لدينا لاعطائها تيار الطباعة إلى. 863 01:13:05,100 --> 01:13:11,850 يمكننا أيضا استخدام الدالة putchar، والتي سوف يضع مباشرة إلى خارج القياسية. 864 01:13:11,850 --> 01:13:16,070 لذلك هناك مجموعة كاملة من الخيارات المختلفة التي يمكننا استخدامها للطباعة. 865 01:13:16,070 --> 01:13:19,580 انهم جميعا في المكتبة I / O القياسية. 866 01:13:19,580 --> 01:13:25,150 كلما كنت ترغب في طباعة - printf ذلك، افتراضيا، سوف الطباعة إلى مستوى خاص من تيار، 867 01:13:25,150 --> 01:13:27,910 وهو أن STDOUT. 868 01:13:27,910 --> 01:13:41,300 حتى نتمكن من الرجوع فقط إلى أنها نوع من السحر هذه القيمة، في STDOUT هنا. 869 01:13:41,300 --> 01:13:48,410 عفوا. وضع الفاصلة المنقوطة في الخارج. 870 01:13:48,410 --> 01:13:52,790 >> هذا هو الكثير من المعلومات، في غير تقليدي جديدة هنا. 871 01:13:52,790 --> 01:13:58,600 وهناك الكثير من هذه الاصطلاحية جدا، بمعنى أن هذا هو رمز 872 01:13:58,600 --> 01:14:05,700 ما هو مكتوب بهذه الطريقة لمجرد أنها نظيفة على القراءة وسهلة القراءة. 873 01:14:05,700 --> 01:14:11,520 هناك العديد من الطرق المختلفة للقيام بذلك، وظائف عديدة ومختلفة يمكنك استخدامها، 874 01:14:11,520 --> 01:14:14,680 لكننا نميل إلى مجرد اتباع هذه الأنماط نفسها مرارا وتكرارا. 875 01:14:14,680 --> 01:14:20,180 لذلك لا ينبغي أن نندهش إذا كنت ترى رمز مثل هذا الخروج مرة أخرى ومرة ​​أخرى. 876 01:14:20,180 --> 01:14:25,690 حسنا. في هذه المرحلة، نحن بحاجة إلى كسر لهذا اليوم. 877 01:14:25,690 --> 01:14:31,300 أشكركم على الحضور. شكرا لمشاهدة إذا كنت على الانترنت. وسنرى في الأسبوع القادم. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]