1 00:00:00,000 --> 00:00:03,486 [MUSIC PLAYING] 2 00:00:49,800 --> 00:00:50,962 [VIDEO PLAYBACK] 3 00:00:50,962 --> 00:00:52,840 - --نحن نعلم؟ 4 00:00:52,840 --> 00:00:56,660 - أنه في الساعة 9:15، كان راي سانتويا عند جهاز الصراف الآلي. 5 00:00:56,660 --> 00:00:59,890 - إذن السؤال هو، ماذا كان يفعل في الساعة 9:16؟ 6 00:00:59,890 --> 00:01:02,690 - إطلاق عيار ناري 9 ملليمتر على شيء ما. 7 00:01:02,690 --> 00:01:04,330 ربما رأى القناص. 8 00:01:04,330 --> 00:01:06,445 - أو كان يعمل معه. 9 00:01:06,445 --> 00:01:07,680 - حسنًا. 10 00:01:07,680 --> 00:01:08,620 ارجع للصورة السابقة. 11 00:01:08,620 --> 00:01:09,370 - ماذا ترى؟ 12 00:01:17,190 --> 00:01:18,310 - قرّب وجهه. 13 00:01:18,310 --> 00:01:20,900 في وضع ملء الشاشة. 14 00:01:20,900 --> 00:01:22,020 - نظّارته. 15 00:01:22,020 --> 00:01:23,324 - هناك انعكاس. 16 00:01:33,490 --> 00:01:35,080 - هذا فريق نيوفيتاس للبيسبول. 17 00:01:35,080 --> 00:01:36,200 هذا هو شعارهم. 18 00:01:36,200 --> 00:01:39,110 - وهو يتحدث إلى الشخص الذي يرتدي تلك السترة. 19 00:01:39,110 --> 00:01:40,405 - قد يكون لدينا شاهد. 20 00:01:40,405 --> 00:01:41,757 - لعمليتي إطلاق النار. 21 00:01:41,757 --> 00:01:42,340 [END PLAYBACK] 22 00:01:42,340 --> 00:01:45,910 ديفيد مالان: هذه هي دورة CS50، وهذه هي المحاضرة الثالثة، وتلك 23 00:01:45,910 --> 00:01:47,809 ليست الكيفية التي تعمل بها علوم الكمبيوتر. 24 00:01:47,809 --> 00:01:49,600 وبالفعل، بحلول نهاية اليوم، سنوضح 25 00:01:49,600 --> 00:01:52,270 بالضبط ما هو صحيح، وما هو غير صحيح في ذلك، 26 00:01:52,270 --> 00:01:57,340 وآمل أن أجعلكم تفكرون قليلاً في أي وقت تشاهدون فيه التلفاز أو الأفلام فيما بعد 27 00:01:57,340 --> 00:02:00,160 وتلاحظوا هذه الأشياء الصغيرة التي يبدو أن الكثير من المؤلفين 28 00:02:00,160 --> 00:02:02,390 يعدونها من المسلمات. 29 00:02:02,390 --> 00:02:06,620 إذن تذكرون آخر مرة، ألقينا فيها نظرة على ماهية التحويل البرمجي 30 00:02:06,620 --> 00:02:07,120 في الواقع. 31 00:02:07,120 --> 00:02:10,570 وتذكرون أنه كان عبارة عن بضعة أشياء، هذه الخطوات الأربع من المعالجة المسبقة 32 00:02:10,570 --> 00:02:12,386 والتحويل البرمجي والتجميع والربط، 33 00:02:12,386 --> 00:02:14,260 إذن عندما تبدأ بتعليمة المصدر البرمجية الخاصة بها، 34 00:02:14,260 --> 00:02:17,140 التي قد تبدو مثل هذه التعليمة البرمجية التي كتبناها في الماضي، 35 00:02:17,140 --> 00:02:20,590 يتعين عليك أولاً أن تعالجها مسبقًا، وكانت الخطوة الأولى في المعالجة المسبقة 36 00:02:20,590 --> 00:02:23,180 هي تحويل جميع تعليمات المعالج تلك-- 37 00:02:23,180 --> 00:02:26,655 أي شيء يبدأ بعلامة تجزئة في البداية-- إلى ما يعادله. 38 00:02:26,655 --> 00:02:29,530 إذن فتح الملفات ونسخ ولصق المحتويات بفعالية 39 00:02:29,530 --> 00:02:32,680 هناك لكي تعرف تلك البرامج وأداة التحويل البرمجي ما هو get_string 40 00:02:32,680 --> 00:02:34,330 وما هي printf. 41 00:02:34,330 --> 00:02:36,400 كانت الخطوة التالية التي جاءت بعد ذلك في الواقع 42 00:02:36,400 --> 00:02:39,820 هي التحويل البرمجي، حيث إن التحويل البرمجي من الناحية الفنية يعني أخذ تعليمة مصدر 43 00:02:39,820 --> 00:02:42,790 برمجية، بمجرد أن تتم معالجتها مسبقًا، وطباعة وإنشاء 44 00:02:42,790 --> 00:02:45,710 هذه الأشياء التي تبدو مشفرة للغاية والتي تسمّى تعليمة التجميع البرمجية. 45 00:02:45,710 --> 00:02:50,140 وتعليمات التجميع البرمجية تلك أو تعليمات التجميع هي ما تستوعبه وحدة المعالجة المركزية-- 46 00:02:50,140 --> 00:02:52,780 عقل جهاز الكمبيوتر لديك-- في الواقع، 47 00:02:52,780 --> 00:02:55,840 على الرغم من أن الكمبيوتر من الناحية الفنية يستوعبها فقط في شكل 48 00:02:55,840 --> 00:02:57,170 الأصفار والواحدات. 49 00:02:57,170 --> 00:03:00,010 ولذا عندما تقوم بـ "تجميع-- الخطوة الثالثة-- 50 00:03:00,010 --> 00:03:02,952 تعليمة التجميع البرمجية تلك، فأنت في الواقع تُخرِج تلك الأصفار والواحدات. 51 00:03:02,952 --> 00:03:06,160 ولكن حتى أبسط البرامج التي نطالب المستخدم فيها فقط بسلسلة 52 00:03:06,160 --> 00:03:10,010 ثم نطبع اسمه والذي ما زال يتضمّن بضعة ملفات أخرى. 53 00:03:10,010 --> 00:03:15,730 لم يكن هناك فقط cs50.h وstdio.h في الأعلى، 54 00:03:15,730 --> 00:03:20,650 فهناك على الأرجح في مكان ما في نظام الكمبيوتر ملفات باسم cs50.c، 55 00:03:20,650 --> 00:03:25,060 وفي حالة stdio، وprintf.c، التي تكون التعليمة البرمجية فعليًا فيها 56 00:03:25,060 --> 00:03:28,300 لهاتين الدالتين، ويجب تحويل هاتين الدالتين برمجيًا إلى 57 00:03:28,300 --> 00:03:31,690 أصفار وواحدات، ثم نحتاج إلى ربط كل شيء معًا، 58 00:03:31,690 --> 00:03:35,140 ودمج تلك الأصفار والواحدات وبذلك يصل جهاز الكمبيوتر إلى التعليمة البرمجية الخاصة بك 59 00:03:35,140 --> 00:03:39,020 وإلى تعليمة printf البرمجية وإلى تعليمة مكتبة cs50 البرمجية وهكذا. 60 00:03:39,020 --> 00:03:43,420 ولكن يمكننا إنهاء كل ذلك فقط بشكل عام في أداة وصف التحويل البرمجي. 61 00:03:43,420 --> 00:03:45,520 إذن هذه إحدى المسائل التي تناولناها الأسبوع الماضي. 62 00:03:45,520 --> 00:03:49,090 وقدمنا أيضًا، الأسبوع الماضي والذي قبله، بضع أدوات. 63 00:03:49,090 --> 00:03:52,420 وتوجد احتمالات، بأنكم تواجهون إحباطات كثيرة من المحتمل أنها موجودة بالفعل 64 00:03:52,420 --> 00:03:54,667 مع "p-sets" لأنكم حققتم إنجازات 65 00:03:54,667 --> 00:03:55,750 ولديكم شعور بالرضا. 66 00:03:55,750 --> 00:03:59,440 وهذا أمر طبيعي، وتؤكد البقية أن المقاييس ستميل في النهاية أكثر 67 00:03:59,440 --> 00:04:01,900 صوب السعادة وبعيدًا عن الحزن، لكننا سنقدم 68 00:04:01,900 --> 00:04:05,260 لكم في الواقع المزيد من الأدوات اليوم مقارنة بما سبق للعثور على 69 00:04:05,260 --> 00:04:07,750 المشاكل أو أوجه القصور في التعليمة البرمجية لديك. 70 00:04:07,750 --> 00:04:10,690 help50، أتذكرون، يساعد في أي معالجة؟ 71 00:04:10,690 --> 00:04:14,130 عندما تفكر بديهيًا في استخدام help50؟ 72 00:04:14,130 --> 00:04:15,880 عندما ترى رسائل خطأ على الشاشة. 73 00:04:15,880 --> 00:04:18,370 شيء لا تفهمه هذا هو نتيجة خطأ من المحتمل أنك قمت 74 00:04:18,370 --> 00:04:21,411 به ولكنك لا تدرك تمامًا ما الذي يخبرك به جهاز الكمبيوتر، 75 00:04:21,411 --> 00:04:24,527 قم بتشغيل help50، ثم نفس ذلك الأمر ونحن، طاقم العمل، 76 00:04:24,527 --> 00:04:26,860 باستخدام تعليمتنا البرمجية سنحاول فهم الرسالة من أجلك 77 00:04:26,860 --> 00:04:28,390 وتزويدك بالملاحظات. 78 00:04:28,390 --> 00:04:30,500 يقوم style50 بذلك بالضبط. 79 00:04:30,500 --> 00:04:34,449 يساعدك في رؤية ما هي الفراغات التي يجب أن توجد بالضبط، وما التي لا يجب 80 00:04:34,449 --> 00:04:36,740 أن توجد هناك باستخدام ترميز باللونين الأحمر والأخضر-- إنه يساعدك فقط في تزيين 81 00:04:36,740 --> 00:04:39,920 تعليمتك البرمجية بحيث يمكنك قراءتها بشكل أفضل أنت والأشخاص الآخرون أيضًا. 82 00:04:39,920 --> 00:04:44,440 ثم printf، وهو نوع من الأدوات الفظة إلى حد ما الموجودة في مربع الأدوات لديك، 83 00:04:44,440 --> 00:04:47,980 هذا يساعدك ليس فقط في رؤية الرسائل التي تريد أن تراها، 84 00:04:47,980 --> 00:04:49,357 ولكن أيضًا في رؤية قيم المتغيرات. 85 00:04:49,357 --> 00:04:51,440 يمكنك طباعة الأعداد الصحيحة والسلاسل، أيًا كان ما تريد، 86 00:04:51,440 --> 00:04:54,085 ثم يمكنك حذف تلك الأسطر من printf 87 00:04:54,085 --> 00:04:55,960 بمجرد أن تكون واثقًا من عمل برنامجك. 88 00:04:55,960 --> 00:04:59,001 لكن يصبح هذا الأمر مملاً قليلاً، وبصراحة، حيث تصبح برامجنا أكبر، 89 00:04:59,001 --> 00:05:02,140 سنرغب في وجود أدوات أكثر قدرة منها مثل طباعة الأشياء يدويًا، 90 00:05:02,140 --> 00:05:04,702 وإعادة التحويل البرمجي، وإعادة التشغيل، فتصبح مملة بشكل أسرع. 91 00:05:04,702 --> 00:05:07,660 وليس الهدف من البرمجة أن تشعر بالملل، بل أن تكون مُمكنًا، 92 00:05:07,660 --> 00:05:10,840 وهذا ما نرمي إلى القيام به اليوم عبر هذا. 93 00:05:10,840 --> 00:05:14,920 إذن CS50 IDE هو إصدار أروع مما 94 00:05:14,920 --> 00:05:18,910 كنت تستخدمه المسمّى CS50 Sandbox، وبدوره، CS50 Lab. 95 00:05:18,910 --> 00:05:21,555 الآن تذكّروا أن كلا الأداتين، Sandbox وLab، 96 00:05:21,555 --> 00:05:23,680 لديها نافذة طرفية حيث يمكنك كتابة الأوامر، 97 00:05:23,680 --> 00:05:29,242 لديهما محرر تعليمات برمجية حيث يمكنك كتابة تعليماتك البرمجية في الواقع، 98 00:05:29,242 --> 00:05:31,450 ثم لديهما متصفح ملفات مع الرموز وحيث 99 00:05:31,450 --> 00:05:34,100 يمكنك بالفعل رؤية الملفات والمجلدات الخاصة بك. 100 00:05:34,100 --> 00:05:38,410 لذلك يتضح أن CS50 IDE هي أداة أخرى للوهلة الأولى 101 00:05:38,410 --> 00:05:41,740 وهي مشابهة جدًا، وعلى الرغم من أنه تم وضعها بشكل مختلف قليلاً، 102 00:05:41,740 --> 00:05:45,820 لكنها تحتوي على العديد من الميزات مثل Sandbox وLab، ولكن يوجد المزيد. 103 00:05:45,820 --> 00:05:49,630 الميزات الأخرى التي تساعدك في الواقع في حل المشاكل في تعليماتك البرمجية 104 00:05:49,630 --> 00:05:53,010 والتعاون مع الآخرين لإنهاء مشروع بحلول موعده النهائي إذا كنت ترغب في ذلك. 105 00:05:53,010 --> 00:05:54,760 إذن سنرى هل هذا هو CS50 IDE. 106 00:05:54,760 --> 00:05:56,110 إنه يأتي مع ما يسمّى بالوضع الليلي إذًا 107 00:05:56,110 --> 00:05:58,540 يمكنك جعل كل شيء داكن أكثر على شاشتك، خاصةً إذا كان إعداد p 108 00:05:58,540 --> 00:06:00,670 ليلاً، ودعونا في الواقع نلقي نظرة فيما بعد 109 00:06:00,670 --> 00:06:04,150 على ما يمكنكم القيام به باستخدام هذه الأداة. 110 00:06:04,150 --> 00:06:08,525 عندما تسجّل دخولك إلى هذه الأداة للمرة الأولى في مجموعة المشاكل التالية، 111 00:06:08,525 --> 00:06:10,900 سترى أن الواجهة تكون كما كانت عليه من قبل تقريبًا. 112 00:06:10,900 --> 00:06:13,210 تبدو الألوان مختلفة قليلاً، وأحجام الخطوط مختلفة قليلاً، 113 00:06:13,210 --> 00:06:16,100 ولكن في الجزء السفلي بشكل افتراضي، لديك ما تسمّى بالنافذة الطرفية، 114 00:06:16,100 --> 00:06:17,980 وبدلاً من علامة الدولار الآن، سترى 115 00:06:17,980 --> 00:06:21,440 مساحة عمل أكثر تفصيلاً، ولكن المزيد حول ذلك بعد قليل. 116 00:06:21,440 --> 00:06:23,650 هنا في الأعلى لديك فقط نافذة محرر التعليمات البرمجية، 117 00:06:23,650 --> 00:06:25,599 لا يحدث شيء هناك حقًا. 118 00:06:25,599 --> 00:06:27,640 ثم لدينا الميزة المضافة Ceiling Cat 119 00:06:27,640 --> 00:06:29,390 في أعلى الزاوية اليمنى. 120 00:06:29,390 --> 00:06:31,760 كما سنرى بعض الميزات الأخرى أثناء النقاش. 121 00:06:31,760 --> 00:06:35,250 لذا دعونا في الواقع نكتب برنامج في CS50 IDE، وهو، لنكن واضحين، 122 00:06:35,250 --> 00:06:39,390 مجرد بيئة برمجية قائمة على الويب ويتيح لك أيضًا 123 00:06:39,390 --> 00:06:42,600 الوصول إلى الخادم القائم على السحابة الخاص بك. 124 00:06:42,600 --> 00:06:45,990 كما يقوم بتشغيل نظام التشغيل Ubuntu Linux، والذي يعد من أشهر أنظمة التشغيل 125 00:06:45,990 --> 00:06:47,970 وهو ليس macOS ولا Windows. 126 00:06:47,970 --> 00:06:51,420 ولكن على عكس بيئة أداة تحديد الوصول حيث لا تقوم حتى بتسجيل الدخول 127 00:06:51,420 --> 00:06:53,310 وتفقد ملفاتك في نهاية المطاف، لأنه قد 128 00:06:53,310 --> 00:06:56,018 تعرف من أين يتم فقد ملفات تعريف الارتباط الخاصة بك أو عندما يحدث خطأ ما، 129 00:06:56,018 --> 00:06:57,209 يحفظ IDE كل شيء. 130 00:06:57,209 --> 00:06:59,250 وستقوم بتسجيل الدخول باستخدام حسابك، وأيًا كان ما 131 00:06:59,250 --> 00:07:02,130 وضعته هناك الأسبوع الماضي سيكون هناك هذا الأسبوع والأسبوع المقبل 132 00:07:02,130 --> 00:07:03,040 وما بعدها. 133 00:07:03,040 --> 00:07:07,230 إذن دعوني أمضي قُدمًا إلى قائمة الملف، ملف جديد، أو يمكنني فقط النقر فوق رمز علامة الجمع الصغير 134 00:07:07,230 --> 00:07:10,650 في أعلى الزاوية اليمنى، ودعوني أمضي قدمًا وأضغط بشكل استباقي 135 00:07:10,650 --> 00:07:13,300 على Control-S أو Command-S أو أنتقل إلى الملف، وحفظ-- 136 00:07:13,300 --> 00:07:17,110 يجب أن تجد الواجهة مشابهة تمامًا لأي برنامج Mac أو جهاز كمبيوتر شخصي-- 137 00:07:17,110 --> 00:07:20,380 ودعوني أمضي قدمًا وأحفظ هذا الملف على النحو التالي. 138 00:07:20,380 --> 00:07:23,039 سأسمي هذا hello.c. 139 00:07:23,039 --> 00:07:25,080 ومن الهام ذِكر ملحق الملف، 140 00:07:25,080 --> 00:07:27,510 وإلا فإن IDE، مثل Sandbox وLab، 141 00:07:27,510 --> 00:07:29,564 لن يعرف ما هو نوع البرنامج الذي تكتبه. 142 00:07:29,564 --> 00:07:32,230 ثم دعوني أمضي قدمًا وأكتب فقط أبسط برامجي. 143 00:07:32,230 --> 00:07:37,770 إذن دعوني أمضي قدمًا وأقوم بكتابة include stdio.h, int main void. 144 00:07:37,770 --> 00:07:40,920 دعوني أمضي قدمًا وأفتح الأقواس المتعرجة، printf-- 145 00:07:40,920 --> 00:07:43,894 مرحبًا، بالعالم، خط مائل عكسي n، وفاصلة منقوطة. 146 00:07:43,894 --> 00:07:46,060 إذن ستلاحظوا أن تقريبًا كل شيء هو نفسه. 147 00:07:46,060 --> 00:07:48,270 الألوان مختلفة قليلاً، ربما، 148 00:07:48,270 --> 00:07:50,207 قد ترون بعض ميزات مساعدة 149 00:07:50,207 --> 00:07:53,040 مختلفة أثناء كتابة التعليمات البرمجية، ولكن النتيجة النهائية هي نفسها. 150 00:07:53,040 --> 00:07:55,560 وترميز اللون الذي حصلت عليه للتو مجانًا لأنه يساعد 151 00:07:55,560 --> 00:07:57,760 في جذب انتباهك إلى أجزاء مختلفة من التعليمات البرمجية. 152 00:07:57,760 --> 00:07:59,515 دعوني أمضي قُدمًا الآن و-- 153 00:07:59,515 --> 00:08:00,465 أوه لاحظوا هذا. 154 00:08:00,465 --> 00:08:01,740 يوجد اختلاف واحد. 155 00:08:01,740 --> 00:08:05,179 هو أن IDE أداة أكثر قدرةً، إلا أنها، تعد أداة يدوية أكثر 156 00:08:05,179 --> 00:08:07,470 ولا تقوم فقط بحفظ التعليمات البرمجية من أجلك تلقائيًا. 157 00:08:07,470 --> 00:08:10,170 هذا الأمر جيد كما كان بأداة تحديد الوصول، لدرجة أنك لن تقوم أبدًا 158 00:08:10,170 --> 00:08:12,270 بالضغط على Command-S أو Control-S في الواقع-- 159 00:08:12,270 --> 00:08:14,870 وإذا كان الأمر كذلك، فأنت لست بحاجة للقيام بذلك، حيث سيقوم IDE 160 00:08:14,870 --> 00:08:18,570 بحفظ الأشياء عندما تريد ذلك بحيث لن يحدث شيء 161 00:08:18,570 --> 00:08:20,740 بطريقة سحرية بعد الآن. 162 00:08:20,740 --> 00:08:24,570 لذا الأمر الذي يتعين عليّ القيام به هو الرجوع للأعلى هنا، الملف، حفظ، أو Command-S 163 00:08:24,570 --> 00:08:26,460 أو Control-S، سترى نقطة خضراء صغيرة 164 00:08:26,460 --> 00:08:29,070 لفترة وجيزة، والآن إلى المحث الخاص بي. 165 00:08:29,070 --> 00:08:33,750 سأمضي قدمًا الآن وأكتب الأمر المألوف الخاص بي، make hello، Enter، 166 00:08:33,750 --> 00:08:36,270 وسترون تقريبًا أمر العميل نفسه الذي يبدو مشفرًا 167 00:08:36,270 --> 00:08:40,950 كما كان من قبل لأنه تم تكوين IDE تمامًا مثل أداة تحديد الوصول. 168 00:08:40,950 --> 00:08:44,190 وإذا أردت المضي قدمًا وقمت بتشغيل هذا الآن، كيف يمكنني تشغيل هذا البرنامج؟ 169 00:08:44,190 --> 00:08:46,150 فحص سريع؟ 170 00:08:46,150 --> 00:08:48,710 ./hello، إنه بالضبط الأمر نفسه كما كان من قبل. 171 00:08:48,710 --> 00:08:51,680 ./hello، وهناك يكون لدينا، مرحبًا، العالم. 172 00:08:51,680 --> 00:08:54,830 القصة الطويلة جدًا باختصار، واجهة المستخدم حتى الآن مختلفة قليلاً، 173 00:08:54,830 --> 00:08:56,227 لكن من الناحية الوظيفية هي نفسها. 174 00:08:56,227 --> 00:08:58,560 سنبدأ الآن في رؤية بعض ميزات إضافية. 175 00:08:58,560 --> 00:08:59,510 إذن ما هي تلك الميزات؟ 176 00:08:59,510 --> 00:09:02,060 ودعونا نقدم بعض القدرات الجديدة التي كانت في الواقع 177 00:09:02,060 --> 00:09:05,760 ممكنة في أداة تحديد الوصول، ولم نقم بتقديمهم بالفعل في ذلك الوقت. 178 00:09:05,760 --> 00:09:09,710 إذا قمت بالنقر فوق رمز هذا المجلد في أعلى اليسار، سترون كل الملفات والمجلدات الخاصة بي. 179 00:09:09,710 --> 00:09:12,014 واليوم لهذه المحاضرة قمت بإعداد أمثلة متعددة مسبقًا 180 00:09:12,014 --> 00:09:14,930 وهي موجودة بالفعل على موقع الويب الخاص بالدورة، وسنلقي نظرة على بعضها، 181 00:09:14,930 --> 00:09:16,850 وسنشير إلى بعض منها على موقع الويب، 182 00:09:16,850 --> 00:09:18,870 ولكن هذه ليست سوى ملفات ومجلدات مألوفة. 183 00:09:18,870 --> 00:09:21,410 ويمكنكم رؤية أن كل شيء في حسابي 184 00:09:21,410 --> 00:09:23,720 على ما يبدو أنه في شيء ما يسمّى مساحة العمل، وهي 185 00:09:23,720 --> 00:09:26,180 مجرد مجلد، أو اسم، أو دليل. 186 00:09:26,180 --> 00:09:28,190 ها هو دليل Sc3 الخاص بي، والذي يأتي، مجددًا 187 00:09:28,190 --> 00:09:30,980 من موقع الويب لمحاضرة اليوم، المحاضرة الثالثة. 188 00:09:30,980 --> 00:09:33,960 ومن ثم ها هو الملف الذي حولته فقط برمجيًا في البرنامج والملف 189 00:09:33,960 --> 00:09:35,650 الذي كتبته، hello.c. 190 00:09:35,650 --> 00:09:38,662 كما ستلاحظون أنه يوجد رمز غريب هنا، tilde، 191 00:09:38,662 --> 00:09:41,120 حيث قد لا تسنح لكم فرصة لكتابته في كثير من الأحيان باللغة الإنجليزية، 192 00:09:41,120 --> 00:09:44,010 ولكن باللغة الإسبانية، وبلغات أخرى قد تستخدمون هذا الحرف. 193 00:09:44,010 --> 00:09:48,600 هذا في الواقع تدوين شديد الاقتضاب لما يطلق عليه دليلك الرئيسي. 194 00:09:48,600 --> 00:09:52,190 في هذه البيئة، CS50 IDE، يوجد لديك الدليل الرئيسي الخاص بك، والذي 195 00:09:52,190 --> 00:09:55,880 يقصد به مجلد ملفاتك والمجلدات الأخرى التي قمت بإنشائها، 196 00:09:55,880 --> 00:09:59,210 والموجودة لديك، والشيء الموجود في كل مرة تقوم فيها بتسجيل الدخول-- ولن 197 00:09:59,210 --> 00:10:00,920 تفقد المحتويات الموجودة فيه. 198 00:10:00,920 --> 00:10:05,660 إذن هذا يعني أنه في دليلك الرئيسي، والمعروف أيضًا باسم tilde، 199 00:10:05,660 --> 00:10:09,212 يوجد مجلد يسمى مساحة العمل الذي أعمل فيه حاليًا. 200 00:10:09,212 --> 00:10:12,170 وهذا مجلد واحد فقط حيث سيتم كل عملي فيه، 201 00:10:12,170 --> 00:10:15,615 نظرًا لوجود عدد كبير جدًا من المجلدات والملفات الأخرى في بيئة السحابة هذه، 202 00:10:15,615 --> 00:10:17,990 تمامًا كما هو الحال في جهاز Mac و جهاز الكمبيوتر الشخصي لديك، فنحن فقط لا 203 00:10:17,990 --> 00:10:19,430 نهتم بماهيتهم عمومًا. 204 00:10:19,430 --> 00:10:25,520 ولكن لاحظوا ما يمكننا القيام به في هذه النافذة الطرفية إلى جانب التحويل البرمجي 205 00:10:25,520 --> 00:10:26,600 وتشغيل التعليمات البرمجية. 206 00:10:26,600 --> 00:10:27,740 هناك أوامر أخرى. 207 00:10:27,740 --> 00:10:33,650 على سبيل المثال، هذا النص باللون الأزرق هنا، وعلى نحو مشابه لمتصفح الملفات في الأعلى، 208 00:10:33,650 --> 00:10:37,260 يشير الآن ليس فقط إلى أن هذا هو المحث الخاص بي لكل علامة دولار، 209 00:10:37,260 --> 00:10:40,790 ولكن أيضًا في دليل مساحة العمل الخاصة بدليلي الرئيسي. 210 00:10:40,790 --> 00:10:44,666 لذا هذا يعني أنه يمكنني الانتقال إلى أي مكان آخر على الرغم من أنني لم 211 00:10:44,666 --> 00:10:46,040 أحدد إلى أين أريد أن أنتقل بعد. 212 00:10:46,040 --> 00:10:49,460 وفي الواقع، يمكنني القيام بهذا. يرمز ls إلى القائمة، 213 00:10:49,460 --> 00:10:51,270 إنه مجرد تدوين شديد الاقتضاب لذلك. 214 00:10:51,270 --> 00:10:56,450 والآن أرى نسخة نصية من شجرة ملفاتي، إذا جاز التعبير. 215 00:10:56,450 --> 00:10:59,344 إذن سترى هنا، أن sc3 هو مجلد، ويمكنك 216 00:10:59,344 --> 00:11:01,760 القول بقدر كافٍ لأن هناك خط مائل في نهايته. 217 00:11:01,760 --> 00:11:04,500 hello.c هو بالطبع الملف الذي كتبته منذ لحظات. 218 00:11:04,500 --> 00:11:08,750 ثم مرحبًا باللون الأخضر هو برنامجي الذي قمت بتحويله برمجيًا، والنجمة 219 00:11:08,750 --> 00:11:10,275 أو رمز النجمة يوجد فقط-- 220 00:11:10,275 --> 00:11:12,650 وليس اسم الملف، إنه يوضح ليّ فقط 221 00:11:12,650 --> 00:11:14,390 وبشكل مرئي أن هذا قابل للتنفيذ. 222 00:11:14,390 --> 00:11:17,510 هذا برنامج يمكنني تشغيله فقط حتى أعرف ما تم تحويله برمجيًا 223 00:11:17,510 --> 00:11:19,190 وما قد تكون تعليمات المصدر البرمجية. 224 00:11:19,190 --> 00:11:23,120 إذن عندما تقوم بتشغيل ./hello، فإن السبب وراء عمل هذا طوال هذا الوقت 225 00:11:23,120 --> 00:11:28,670 هو لأنه يوجد ملف باسم مرحبًا، في نقطة، مجلدك الحالي، 226 00:11:28,670 --> 00:11:32,160 وعندما تضغط على Enter، فأنت تقوم بتشغيل هذا البرنامج هناك. 227 00:11:32,160 --> 00:11:36,470 لذا إذا رجعتم بعد اليوم إلى CS50 Sandbox أو CS50 Lab وكتبتم ls، 228 00:11:36,470 --> 00:11:39,560 سترون بالضبط الشيء نفسه كما كان بواسطة رمز المجلد 229 00:11:39,560 --> 00:11:41,840 الصغير في تلك البرامج أيضًا. 230 00:11:41,840 --> 00:11:44,660 ولكن لنفترض أنني أرغب في الانتقال إلى الدليل. 231 00:11:44,660 --> 00:11:48,200 في macOS أو Windows أو حتى IDE، يمكنني، بالطبع، 232 00:11:48,200 --> 00:11:51,080 الانتقال إلى رمز الملف، ثم في المثلث الصغير 233 00:11:51,080 --> 00:11:53,390 هنا، والذي قد يبدو بديهيًا، فتقوموا بالنقر فوقه فقط 234 00:11:53,390 --> 00:11:56,150 ويمكنكم رؤية ما يحدث في الداخل، ليس الأمر مفاجئًا. 235 00:11:56,150 --> 00:11:57,740 لكن كيف تقوم بذلك نصيًا؟ 236 00:11:57,740 --> 00:12:00,270 في محث الأوامر، حسنًا الأمر ليس بتلك الصعوبة. 237 00:12:00,270 --> 00:12:02,160 تحتاج فقط إلى تغيير الدليل الخاص بك. 238 00:12:02,160 --> 00:12:08,670 إذن إذا كتبت cd مسافة sc3، Enter، يبدو أن لا شيء يحدث تمامًا حتى الآن 239 00:12:08,670 --> 00:12:10,796 باستثناء أن المحث قد تغيّر. 240 00:12:10,796 --> 00:12:13,670 ها هي الإشارة إلى أن-- هذا هو المحث الخاص بي، ولكن ترون على يساره 241 00:12:13,670 --> 00:12:17,540 باللون الأزرق أنني الآن في مجلد مساحة العمل الخاص بدليلي الرئيسي، 242 00:12:17,540 --> 00:12:19,990 في مجلد sc3 الخاص بي هناك. 243 00:12:19,990 --> 00:12:23,411 إذن هو مجرد إصدار قائم على نص من GUIs، واجهات المستخدم الرسومية 244 00:12:23,411 --> 00:12:25,160 والتي بالتأكيد نعدها جميعًا 245 00:12:25,160 --> 00:12:29,010 من المسلمات في عالم macOS و Windows حتى الآن. 246 00:12:29,010 --> 00:12:33,410 حسنًا، لنفترض أنني انتهيت إلى حد ما من برنامج مرحبًا الخاص بي 247 00:12:33,410 --> 00:12:34,430 وأرغب في حذفه. 248 00:12:34,430 --> 00:12:37,920 حسنًا في IDE، كما في أداة تحديد الوصول، يمكنك بالفعل الانتقال هنا ويمكنك 249 00:12:37,920 --> 00:12:41,030 النقر فوقه، ثم يمكنك عادةً النقر بزر الماوس الأيمن أو النقر فوق زر التحكم 250 00:12:41,030 --> 00:12:44,000 وستحصل على قائمة كاملة من الخيارات الأخرى، أحد هذه الخيارات هو حذف-- 251 00:12:44,000 --> 00:12:46,590 ولا تتردد في إصلاح مثل هذا في بيئتك الخاصة. 252 00:12:46,590 --> 00:12:48,020 ولكن ماذا عن سطر الأوامر؟ 253 00:12:48,020 --> 00:12:52,392 إذا قمت بالتكبير بالأسفل هنا ورغبت في إزالة مرحبًا، ولن تكتب 254 00:12:52,392 --> 00:12:55,100 إزالة لأن هذا يبدو أكثر إطنابًا قليلاً 255 00:12:55,100 --> 00:12:58,250 ومنذ عقود قرر البشر أن أمر الكتابة ممل جدًا، 256 00:12:58,250 --> 00:13:00,410 دعونا نسمّي هذا الأمر rm-- 257 00:13:00,410 --> 00:13:04,920 للإزالة-- مرحبًا، سترون محث مشفر إلى حد ما. 258 00:13:04,920 --> 00:13:07,040 rm-- إزالة الملف المنتظم "مرحبًا؟" 259 00:13:07,040 --> 00:13:09,830 هذا أمر غامض أكثر مما يجب أن يكون عليه، لكنه يسأل فقط، 260 00:13:09,830 --> 00:13:11,590 هل أنت متأكد من أنك تريد حذف "مرحبًا؟" 261 00:13:11,590 --> 00:13:12,950 ثم إنه فقط في انتظارك. 262 00:13:12,950 --> 00:13:18,050 وهنا يمكنك كتابة y أو نعم أو أحيانًا أوامر أخرى أيضًا، 263 00:13:18,050 --> 00:13:20,420 الآن لقد أكدت أن نواياي كانت نعم. 264 00:13:20,420 --> 00:13:23,600 إذا كتبت ls مجددًا، أنا-- عذرًا، في المجلد الخاطىء. 265 00:13:23,600 --> 00:13:27,810 إذا كتبت ls مجددًا بعد كتابة مرحبًا-- 266 00:13:27,810 --> 00:13:31,940 لا-- بعد كتابة مرحبًا وls ، الآن سأرى 267 00:13:31,940 --> 00:13:34,580 شيئين اثنين فقط sc3 وhello.c. 268 00:13:34,580 --> 00:13:36,440 ماذا لو أردت إنشاء مجلد؟ 269 00:13:36,440 --> 00:13:37,340 حسنًا لاحظوا ذلك. 270 00:13:37,340 --> 00:13:41,080 إذا كتبت في الجزء السفلي هنا، make directory-- 271 00:13:41,080 --> 00:13:45,050 mkdir-- test فقط لإنشاء مجلد اختبار، وأنا 272 00:13:45,050 --> 00:13:48,170 على وشك الضغط على Enter، ولكن شاهدوا في أعلى الزاوية اليسرى 273 00:13:48,170 --> 00:13:51,680 حيث لديّ هذه المجلدات والملفات الأخرى حاليًا، وعندما أضغط على Enter، 274 00:13:51,680 --> 00:13:53,040 الآن لديّ مجلد اختبار. 275 00:13:53,040 --> 00:13:54,290 إذن هذه الأشياء متطابقة. 276 00:13:54,290 --> 00:13:57,440 واحدة تكون رسومية، والأخرى سطر أوامر، وتوجد أوامر أخرى 277 00:13:57,440 --> 00:13:59,060 إذا قررت أنني لا أرغب في ذلك. 278 00:13:59,060 --> 00:14:02,210 rmdir هو إزالة الدليل، ثم يختفي فقط 279 00:14:02,210 --> 00:14:04,590 لأنه فارغ وبالتالي آمن. 280 00:14:04,590 --> 00:14:06,680 أي أسئلة لاحقًا على أي من تلك الأوامر 281 00:14:06,680 --> 00:14:11,505 أو فقط التخطيط العام لما ننظر إليه؟ 282 00:14:11,505 --> 00:14:13,880 حسنًا، لذلك لا تتوقفوا أمام أي من تلك الأوامر، 283 00:14:13,880 --> 00:14:15,200 ومجموعة المشاكل وما بعدها والتي ستذكركم دائمًا 284 00:14:15,200 --> 00:14:16,670 بأنواع الميزات هذه. 285 00:14:16,670 --> 00:14:19,461 فالنقطة التي نحن بصدد مناقشتها الآن هي فقط أننا في بيئة جديدة إلى حد ما، 286 00:14:19,461 --> 00:14:23,289 ولكنها ما تزال كما هي في الأساس، ولديها القدرات نفسها. 287 00:14:23,289 --> 00:14:24,830 إذن ما هي الأدوات الأخرى التي نظرنا إليها؟ 288 00:14:24,830 --> 00:14:28,550 إذن ربما سمعتم شائعات عن أداة تسمى check50، وفي الحقيقة، 289 00:14:28,550 --> 00:14:31,970 هذه أداة يستخدمها طاقم العمل في تقييم مجموعة المشاكل 1 ومجموعة المشاكل 290 00:14:31,970 --> 00:14:35,450 2 لتقييم مدى صحتهما حتى لا يتعين علينا كتابة 291 00:14:35,450 --> 00:14:41,660 ./mario أو ./caesar مرارًا وتكرارًا لاختبار التعليمات البرمجية الخاصة بالطلاب. 292 00:14:41,660 --> 00:14:44,640 ولكن بداية من هذا الأسبوع، أنتم، أيضًا، يمكنكم الوصول إلى البرنامج نفسه. 293 00:14:44,640 --> 00:14:48,440 check50 هو أمر من طاقم العمل يتحقق من صحة التعليمات البرمجية الخاصة بك 294 00:14:48,440 --> 00:14:51,800 تمامًا مثلما يفحص style50 أسلوب التعليمات البرمجية لديك. 295 00:14:51,800 --> 00:14:53,990 وفي الواقع، إذا انتقلت مجددًا إلى IDE، 296 00:14:53,990 --> 00:14:57,440 دعونا نحاول استخدام هذا للمرة الأولى عن طريق جعل الإصدار نفسه من مرحبًا 297 00:14:57,440 --> 00:15:00,090 والذي من المحتمل أنك قمت به في مجموعة مشاكلك الأولى. 298 00:15:00,090 --> 00:15:04,400 لذا إذا مضيت قدمًا وقمت بتضمين ليس فقط stdio، ولكن cs50.h أيضًا، 299 00:15:04,400 --> 00:15:07,010 ومضيت قدمًا وحصلت على سلسلة من المستخدم 300 00:15:07,010 --> 00:15:10,280 باستخدام get_string، وقمت بطلب الاسم منه، ثم مضيت قدمًا 301 00:15:10,280 --> 00:15:14,990 وطبعت ليس فقط مرحبًا، بالعالم، ولكن أيضًا مرحبًا، النسبة المئوية s فاصلة اسم، 302 00:15:14,990 --> 00:15:17,960 أعتقد أن هذا هو البرنامج نفسه الذي من المحتمل أنكم قمتم 303 00:15:17,960 --> 00:15:20,010 بكتابته بأنفسكم، أو بديلاً عنه تقريبًا. 304 00:15:20,010 --> 00:15:22,190 إذن إذا مضيت قدمًا الآن واختبرت ذلك بنفسي-- 305 00:15:22,190 --> 00:15:26,150 make hello, Enter، يبدو هذا الأمر على ما يرام، ./hello. 306 00:15:26,150 --> 00:15:29,004 سأمضي قدمًا واكتب فيه اسمي، وها هو ذا، مرحبًا، ديفيد. 307 00:15:29,004 --> 00:15:30,920 الآن لنفترض أنكم تشعرون بالرضا، وواثقين 308 00:15:30,920 --> 00:15:32,711 للغاية أن تعليماتكم البرمجية صحيحة، 309 00:15:32,711 --> 00:15:36,080 والأهم من ذلك، أنكم اختبرتم التعليمات البرمجية بأنفسكم. 310 00:15:36,080 --> 00:15:38,780 لا يكفي الاعتماد على الأداة الخاصة بنا وحدها 311 00:15:38,780 --> 00:15:41,540 من أجل اختبار التعليمات البرمجية لأنها، أيضًا، قد لا تكون شاملة. 312 00:15:41,540 --> 00:15:45,310 إذن بمجرد أنك قد جربت بعض المدخلات، ليس فقط ديفيد، ولكن ربما 313 00:15:45,310 --> 00:15:47,570 اسم فيرونيكا أيضًا، يبدو أنه يعمل. 314 00:15:47,570 --> 00:15:49,940 اسم براين كذلك، يبدو أنه يعمل. 315 00:15:49,940 --> 00:15:52,704 لا يوجد اسم على الإطلاق، لا يبدو أنه يعمل، ربما؟ 316 00:15:52,704 --> 00:15:54,620 ولكن يتعين علينا أن ننظر مجددًا إلى مجموعة المشاكل 317 00:15:54,620 --> 00:15:56,420 لمعرفة ما إذا كانت هذه مشكلة بالفعل. 318 00:15:56,420 --> 00:15:58,640 دعوني أمضي قُدمًا وأشغّل check50. 319 00:15:58,640 --> 00:16:02,330 تتوقع check50 وحدة كتلة خاصة، إذا جاز التعبير. 320 00:16:02,330 --> 00:16:05,335 مجرد معّرف فريد للمشكلة التي ترغب في التحقق منها. 321 00:16:05,335 --> 00:16:07,460 وستعرف هذا فقط من خلال قراءة مجموعة 322 00:16:07,460 --> 00:16:09,081 المشاكل أو الوثائق عبر الإنترنت. 323 00:16:09,081 --> 00:16:12,080 تذكرتُ للتو فقط أنه الأمر الذي كان طاقم العمل يستخدمونه 324 00:16:12,080 --> 00:16:18,280 لتصحيح وتقييم مرحبًا هو فقط cs50/2018/fall/hello. 325 00:16:18,280 --> 00:16:21,030 والخط المائل هو لتمييز تلك الكلمات بشكل مرئي، 326 00:16:21,030 --> 00:16:24,560 هذا ليس مجلدًا أو ملفات أو أي شيء من هذا القبيل في حسابك الخاص. 327 00:16:24,560 --> 00:16:29,030 إذن سأقوم بتشغيل check50 cs50/2018/fall/hello في الدليل 328 00:16:29,030 --> 00:16:31,550 نفسه حيث يوجد hello.c بداخله. 329 00:16:31,550 --> 00:16:32,700 Enter. 330 00:16:32,700 --> 00:16:35,740 ستمضي قُدمًا وتتصل بـ GitHub، وهو الطرف الخلفي، 331 00:16:35,740 --> 00:16:37,490 تذكّروا، أننا نستخدمه لتخزين التعليمات البرمجية. 332 00:16:37,490 --> 00:16:40,800 تتم المصادقة الخاصة بي الآن، وهذا يعني ما هو اسم المستخدم وكلمة المرور لديك؟ 333 00:16:40,800 --> 00:16:43,850 سأمضي قُدمًا وأستخدم إحدى حسابات الاختبار الخاصة بي. 334 00:16:43,850 --> 00:16:45,630 والآن تطلب مني كلمة المرور الخاصة بي، 335 00:16:45,630 --> 00:16:47,360 وسأمضي قُدمًا وأكتب ذلك فيها. 336 00:16:47,360 --> 00:16:49,970 ستلاحظون أنكم تشاهدون نجوم مثلما ترون النقاط في موقع ويب 337 00:16:49,970 --> 00:16:52,950 فقط وبذلك لا يختلق شخص النظر إلى ما تكتبه. 338 00:16:52,950 --> 00:16:55,190 الآن سأمضي قُدمًا وأراقب التقدم. 339 00:16:55,190 --> 00:16:58,490 إنه يستعد، دعوني أمضي قُدمًا وأقوم بالتكبير. 340 00:16:58,490 --> 00:16:59,890 نقطة-نقطة-نقطة. 341 00:16:59,890 --> 00:17:03,050 إنه يفحص التعليمات البرمجية الخاصة بي، ويستعد لتقديمها، 342 00:17:03,050 --> 00:17:07,460 الآن يتم تحميلها إلى GitHub.com، وبمجرد وجودها على الخوادم، 343 00:17:07,460 --> 00:17:11,150 ستقوم بإبلاغ خادم CS50، هنا بأنه يتم تقديم كذا وكذا، 344 00:17:11,150 --> 00:17:14,359 سأمضي قدمًا وأشغّل بعض الاختبارات الآلية عليه، 345 00:17:14,359 --> 00:17:17,960 وبالتالي سيتحقق من صحة ذلك، ونأمل أننا على وشك رؤية بعض 346 00:17:17,960 --> 00:17:21,200 الوجوه الخضراء الباسمة والسعيدة، وها هي ذا، نعم، 347 00:17:21,200 --> 00:17:24,109 إنه يبدو مثل أمر check50 ذاك لهذه المشكلة-- 348 00:17:24,109 --> 00:17:26,150 أو وحدة الكتلة، إذا جاز التعبير-- 349 00:17:26,150 --> 00:17:29,630 تم التحقق من وجود hello.c، لأنه إذا نسيت كتابة الملف 350 00:17:29,630 --> 00:17:32,020 أو إذا أخطأت في تسميته، فلن يعمل أي شيء. 351 00:17:32,020 --> 00:17:33,860 لقد تحققنا من أنه تم تحويله برمجيًا بنجاح، 352 00:17:33,860 --> 00:17:35,630 إذن، سيكون أيضًا، وجهًا أخضرًا سعيدًا. 353 00:17:35,630 --> 00:17:37,070 من الواضح أنه تم فحصه إذًا-- 354 00:17:37,070 --> 00:17:38,840 ماذا لو كتبنا في فيرونيكا؟ 355 00:17:38,840 --> 00:17:40,250 هل نرى مرحبًا، فيرونيكا؟ 356 00:17:40,250 --> 00:17:41,030 على ما يبدو نعم. 357 00:17:41,030 --> 00:17:42,800 ماذا لو كتبنا في كلمة أخرى، براين؟ 358 00:17:42,800 --> 00:17:44,482 نعم، من الواضح أننا قولنا مرحبًا، براين. 359 00:17:44,482 --> 00:17:46,190 وهكذا مع احتمالية عالية، أننا سننتهي، 360 00:17:46,190 --> 00:17:49,920 بناء على تلك الاختبارات الأربعة، إلى أن تعليماتك البرمجية صحيحة، في الواقع، 361 00:17:49,920 --> 00:17:51,810 على الأقل فيما يتعلق بتلك المدخلات. 362 00:17:51,810 --> 00:17:54,302 وغالبًا ما توجد تفاصيل أكثر عبر عنوان URL في الأسفل 363 00:17:54,302 --> 00:17:56,510 حيث يمكنك في الواقع رؤية ملاحظات أكثر وبشكل بياني 364 00:17:56,510 --> 00:17:57,740 في تعليماتك البرمجية. 365 00:17:57,740 --> 00:18:01,490 بالطبع، للمرة الأولى، الثانية، الثالثة من المحتمل أنك تقوم بتشغيل هذا الأمر، 366 00:18:01,490 --> 00:18:03,410 وقد لا تشاهد بعض الوجوه السعيدة الخضراء، 367 00:18:03,410 --> 00:18:06,867 أو قد تشاهد بعض الوجوه التعيسة الحمراء أو بعض الوجوه المسطحة الصفراء، 368 00:18:06,867 --> 00:18:09,950 وهي فقط تعني أنه لا يمكننا تشغيل عمليات الفحص لوجود شيء آخر 369 00:18:09,950 --> 00:18:10,590 خاطئ. 370 00:18:10,590 --> 00:18:14,480 لكن مع مرور الوقت، سيساعدك هذا على الشعور براحة أكثر والثقة بأن 371 00:18:14,480 --> 00:18:18,504 تعليماتك البرمجية صحيحة قبل أن تستخدم submit50 وتقوم بتقديمها. 372 00:18:18,504 --> 00:18:21,170 بالمضي قدمًا في ذلك ستشعروا بالتحسن أو بالإحباط قليلاً 373 00:18:21,170 --> 00:18:24,470 لمعرفة ذلك مسبقًا-- انتظروا لحظة، أنا على وشك تقديم هذا ولكن كلا، 374 00:18:24,470 --> 00:18:25,550 إنه ليس صحيحًا بعد. 375 00:18:25,550 --> 00:18:28,490 إذن لابد أن تدركوا أنه سلاح ذو حدين. 376 00:18:28,490 --> 00:18:34,470 أي أسئلة حول check50 أو أي من هذه الأوامر حتى الآن؟ 377 00:18:34,470 --> 00:18:36,974 أي شيء على الإطلاق؟ 378 00:18:36,974 --> 00:18:37,741 لا؟ 379 00:18:37,741 --> 00:18:38,240 حسنًا. 380 00:18:38,240 --> 00:18:41,030 لذلك دعونا نلقي نظرة على الأداة النهائية والأكثر قدرة 381 00:18:41,030 --> 00:18:45,380 وهي الآن متوفرة لكم في بيئة IDE. 382 00:18:45,380 --> 00:18:49,119 تم إنشاؤها في CS50 IDE، والتي تشير إلى بيئة التنمية 383 00:18:49,119 --> 00:18:52,160 المتكاملة، والتي لا تخص CS50-- هذا مصطلح شائع في الصناعة 384 00:18:52,160 --> 00:18:54,780 للأدوات التي تُسهّل كتابة التعليمات البرمجية، 385 00:18:54,780 --> 00:18:58,470 اتضح أن هناك ميزة أخرى بالإضافة إلى القطة في الأعلى هنا. 386 00:18:58,470 --> 00:19:00,920 تحديدًا، التي بها، يمكنك مشاركة مساحة العمل الخاصة بك 387 00:19:00,920 --> 00:19:03,090 مع زملاء التدريس ومساعدي الدورة 388 00:19:03,090 --> 00:19:06,230 لذا ربما يمكنهم مساعدتك في الوقت الحقيقي مثل Google Docs، وحتى في إجراء الدردشة 389 00:19:06,230 --> 00:19:07,370 معك في الوقت الحقيقي. 390 00:19:07,370 --> 00:19:09,910 ولكنه يوفر لك أيضًا ما يسمّى بمصحح الأخطاء. 391 00:19:09,910 --> 00:19:12,320 مصحح الأخطاء، كما يُوحي اسمه، يزيل الأخطاء-- 392 00:19:12,320 --> 00:19:15,350 أو بالأحرى، يساعدك في إزالة الأخطاء من تعليماتك البرمجية 393 00:19:15,350 --> 00:19:17,630 عن طريق السماح لك بالوصول إلى printf-- 394 00:19:17,630 --> 00:19:19,700 وطباعة الأعداد الصحيحة والسلاسل وأي 395 00:19:19,700 --> 00:19:22,580 شي جيد يحدث في برنامجك، إنه يجعل الأمر تلقائيًا 396 00:19:22,580 --> 00:19:24,140 نوعًا ما ويجعله عملية مملة جدًا بالنسبة لك. 397 00:19:24,140 --> 00:19:26,330 ويتيح لك الانتقال من خلال تعليماتك البرمجية إلى سطر واحد 398 00:19:26,330 --> 00:19:29,330 في آنً واحد على وتيرتك المريحة الخاصة 399 00:19:29,330 --> 00:19:33,984 وترى على طول الطريق جميع قيم المتغيرات الخاصة بك في هذا البرنامج. 400 00:19:33,984 --> 00:19:36,900 لتنشيط مصحح الأخطاء هذا، سأمضي قدمًا وأفعل ما يلي. 401 00:19:36,900 --> 00:19:39,960 سأقوم بالتحويل البرمجي لتعليماتي البرمجية كما جرت العادة مع make hello. 402 00:19:39,960 --> 00:19:42,344 يجب أن يتم تحويلها برمجيًا وإلا قد أرغب في 403 00:19:42,344 --> 00:19:44,510 استخدام help50 وأكتشف لماذا لا يتم تحويلها برمجيًا، 404 00:19:44,510 --> 00:19:46,250 ولكن يبدو أنه تم تحويلها برمجيًا. 405 00:19:46,250 --> 00:19:50,210 والآن سأمضي قدمًا وأقوم بتشغيل debug50، مسافة، ثم 406 00:19:50,210 --> 00:19:52,280 اسم البرنامج الذي أردت تصحيحه من الأخطاء. 407 00:19:52,280 --> 00:19:54,738 واسم البرنامج الذي أردت تصحيحه من الأخطاء في الوقت الحالي 408 00:19:54,738 --> 00:19:56,690 هو ملف الدليل الحالي وهو ما يسمّى مرحبًا. 409 00:19:56,690 --> 00:19:59,106 دعونا نفترض أنه قد يوجد شيء خاطئ به. 410 00:19:59,106 --> 00:20:01,417 في المرة الأولى التي قمت بتشغيل هذا الأمر، رغم أن، debug50 411 00:20:01,417 --> 00:20:03,875 لن يكون راضيًا عني لأنه سيقول، 412 00:20:03,875 --> 00:20:06,270 يبدو أنك لم تقم بتعيين أي نقاط توقف. 413 00:20:06,270 --> 00:20:09,380 قم بتعيين نقطة توقف واحدة على الأقل بالنقر فوق يسار رقم السطر 414 00:20:09,380 --> 00:20:10,920 ثم أعد تشغيل debug50. 415 00:20:10,920 --> 00:20:12,170 حسنًا ما هي نقطة التوقف؟ 416 00:20:12,170 --> 00:20:14,420 حسنً هل يقترح الاسم نوعًا ما، أنه يتيح 417 00:20:14,420 --> 00:20:19,130 لك إلغاء أو إيقاف تشغيل التعليمات البرمجية لديك مؤقتًا في أي سطر من سطورك. 418 00:20:19,130 --> 00:20:21,620 وطوال هذا الوقت للأسابيع القليلة الماضية، 419 00:20:21,620 --> 00:20:23,480 تم ترقيم تعليماتك البرمجية في كل سطر تلقائيًا. 420 00:20:23,480 --> 00:20:27,110 وهذا مفيد لأن أكثر سطر مثير للاهتمام في هذا البرنامج، 421 00:20:27,110 --> 00:20:29,880 بمجرد أن يبدأ بالفعل، ليس تلك الاشياء في الأعلى، 422 00:20:29,880 --> 00:20:31,130 ليس int main void، أليس كذلك؟ 423 00:20:31,130 --> 00:20:33,650 هذا كله نسخ ولصق من البرامج السابقة. 424 00:20:33,650 --> 00:20:37,910 إنه حقًا السطر السادس هنا حيث لديّ بالفعل بعض المنطق لنفسي. 425 00:20:37,910 --> 00:20:41,360 إذًا في CS50 IDE، ما يمكنك القيام به الآن هو 426 00:20:41,360 --> 00:20:43,340 النقر فوق يسار أحد أرقام الأسطر هذه، 427 00:20:43,340 --> 00:20:46,460 ضوء أحمر صغير مثل علامة التوقف سيظهر قائلاً، 428 00:20:46,460 --> 00:20:49,700 ألغاء أو إيقاف برنامجي مؤقتًا على هذا السطر حتى 429 00:20:49,700 --> 00:20:52,130 يمكنني التدقيق في تعليماتي البرمجية الفعلية. 430 00:20:52,130 --> 00:20:54,180 لا يمكن أن يقوم Sandbox وLab بذلك. 431 00:20:54,180 --> 00:20:58,970 الآن سأمضي قدمًا وأعيد تشغيل debug50 بنفس الطريقة بالضبط، وأضغط على 432 00:20:58,970 --> 00:21:01,400 Enter، ولكن الآن لدي نقطة توقف واحدة. 433 00:21:01,400 --> 00:21:05,390 وسترى على الجانب الأيمن قائمة رائعة منبثقة للتو 434 00:21:05,390 --> 00:21:07,827 بواسطة القطة التي توفر لي مجموعة من الميزات. 435 00:21:07,827 --> 00:21:10,160 وللوهلة الأولى، وبصراحة، إنها زاخمة قليلاً 436 00:21:10,160 --> 00:21:13,940 لأنه يوجد الكثير الذي يحدث هنا، ولكنكم ستلاحظون أولاً، 437 00:21:13,940 --> 00:21:17,540 والأهم من ذلك، أن هناك بعض الإشارات لمتغير الاسم الخاص بي. 438 00:21:17,540 --> 00:21:21,470 لا أفهم تماما 0x0 أو أي شيء، ولكني أفهم سلسلة. 439 00:21:21,470 --> 00:21:26,240 إذًا ما يدركه برنامج debug50 هو أوه، على هذا السطر وأدناه، 440 00:21:26,240 --> 00:21:28,160 لديك متغير باسم اسم. 441 00:21:28,160 --> 00:21:29,950 لا يبدو أن لديه قيمة بعد. 442 00:21:29,950 --> 00:21:33,890 يتضح أن، 0x0، يعني فقط فارغ أو خالي أو صفر. 443 00:21:33,890 --> 00:21:37,400 ولكن هذا أمر جيد، لأنه الآن، عندما أقوم بتنفيذ هذا السطر بالفعل، 444 00:21:37,400 --> 00:21:41,000 آمل أن يأخذ اسم ديفيد أو فيرونيكا أو براين. 445 00:21:41,000 --> 00:21:42,510 دعونا نرى ما سيحدث. 446 00:21:42,510 --> 00:21:46,010 لاحظوا أنه مظلل باللون الأصفر، السطر 6، وهذا يعني أنه 447 00:21:46,010 --> 00:21:48,440 لم يقم بتنفيذ سطر التعليمات البرمجية هذا. 448 00:21:48,440 --> 00:21:52,670 لقد توقفت تعليماتي البرمجية مؤقتًا عند تلك النقطة لأنني قمت بتعيين نقطة الإيقاف تلك. 449 00:21:52,670 --> 00:21:57,260 ثم لاحظوا وجود ما يشبه مُشغّل الموسيقى في الأعلى، وتوجد بعض الرموز. 450 00:21:57,260 --> 00:21:59,930 سيقول زر التشغيل فقط، آه، شغّل برنامجي، 451 00:21:59,930 --> 00:22:03,200 شغّله على طول الطريق حتى النهاية، مثل سكراتش نوعًا ما مع العلم الأخضر. 452 00:22:03,200 --> 00:22:04,970 لكن هذا أكثر قدرةً. 453 00:22:04,970 --> 00:22:09,110 يمكنك تجاوز هذا السطر، وبالتالي تنفيذه مرة واحدة فقط. 454 00:22:09,110 --> 00:22:12,020 إذا كانت دالة، فيمكنك الدخول إلى هذا السطر 455 00:22:12,020 --> 00:22:15,710 والنظر في الحقيقة داخل دالة تستخدمها، مثل get_string، 456 00:22:15,710 --> 00:22:19,500 أو يمكنك الخروج إلى دالة أخرى، ولكن المزيد عن ذلك مرة أخرى. 457 00:22:19,500 --> 00:22:20,859 إذن ما سأفعله هو هذا. 458 00:22:20,859 --> 00:22:23,900 والزر الذي سأقوم بالنقر فوقه كثيرًا عند محاولة فهم 459 00:22:23,900 --> 00:22:25,358 كيفية عمل برنامجي هو هذا-- 460 00:22:25,358 --> 00:22:26,340 Step Over. 461 00:22:26,340 --> 00:22:31,670 إذن هو الرمز الثاني من اليسار، بجوار المثلث. 462 00:22:31,670 --> 00:22:34,230 إذن بمجرد أن قمت بالنقر فوق هذا، شاهدوا ما الذي سيحدث، 463 00:22:34,230 --> 00:22:38,635 على الرغم من أنها صغيرة بعض الشيء، على الجانب الأيمن لمتغير اسمي. 464 00:22:38,635 --> 00:22:41,510 لاحظوا أنه تتم مطالبتي بكتابة اسمي لأن البرنامج 465 00:22:41,510 --> 00:22:44,630 ما يزال قيد التشغيل في النافذة الطرفية، ولكن عندما أنقر فوق Enter الآن، 466 00:22:44,630 --> 00:22:49,310 وأقدم اسمي، سترون تلقائيًا على الجانب الأيمن 467 00:22:49,310 --> 00:22:53,270 أن متغير الاسم هذا له قيمة الآن، اقتباس-إنهاء الاقتباس، 468 00:22:53,270 --> 00:22:55,020 "ديفيد" لنوع سلسلة. 469 00:22:55,020 --> 00:22:59,240 يوجد 0x1083010 هذا-- المزيد عن ذلك لاحقًا، فقط مُشفر قليلاً، 470 00:22:59,240 --> 00:23:02,260 ولكن لا يتعين عليّ استخدام printf الآن، يمكنني رؤية ما يحدث بالفعل. 471 00:23:02,260 --> 00:23:04,411 الآن يمكنك رؤية أنه تم تظليل السطر 7، 472 00:23:04,411 --> 00:23:07,160 لأنني قمت بتعيين نقطة توقف فوقه، إذًا أنا الآن في السطر الثاني 473 00:23:07,160 --> 00:23:08,540 لأنني قمت بالدخول فيه. 474 00:23:08,540 --> 00:23:11,090 دعوني أمضي قدمًا وانقر فوق التالي مجددًا، وسترون 475 00:23:11,090 --> 00:23:14,300 ذلك في النافذة الطرفية، تم تنفيذ مرحبًا، ديفيد للتو. 476 00:23:14,300 --> 00:23:17,330 والآن إذا واصلت الاستمرار، سيمضي قدمًا ويعمل للنهاية 477 00:23:17,330 --> 00:23:18,810 ويغلق مصحح الأخطاء. 478 00:23:18,810 --> 00:23:21,530 إذن ليس كل ذلك مفيدًا لهذا البرنامج لأن بصراحة، أنا 479 00:23:21,530 --> 00:23:25,550 متأكد للغاية من أن هذا صحيح، ولكن تلك هي قدرة debug50 ومصحح الأخطاء 480 00:23:25,550 --> 00:23:28,700 بشكل عمومي أكبر حيث يتيح لك، سواء كنت معتادًا بشكل كبير أو صغير، 481 00:23:28,700 --> 00:23:33,050 على التنقل خلال تعليماتك البرمجية في وتيرتك الخاصة تمامًا مثلما قد يقول رفيق التدريس أو مساعد في دورة تدريبية، حسنًا، 482 00:23:33,050 --> 00:23:35,160 ما الذي يفعله هذا السطر؟ 483 00:23:35,160 --> 00:23:38,440 لا يتعين عليك اللجوء إلى printf، يمكنك الانتقال فقط بطريقة منهجية 484 00:23:38,440 --> 00:23:41,410 من خلال تعليماتك البرمجية وإيجاد هذا الخطأ اللعين الذي يزعجك 485 00:23:41,410 --> 00:23:43,120 لدقائق أو حتى ساعات. 486 00:23:43,120 --> 00:23:47,530 إذن من الآن فصاعدًا، في أي وقت لديك خطأ في تعليماتك البرمجية التي تتحول برمجيًا 487 00:23:47,530 --> 00:23:51,010 ولكن هذا غير صحيح من الناحية المنطقية-- الهرم في ماريو ليس صحيحًا تمامًا، 488 00:23:51,010 --> 00:23:53,920 تشفيرك لقيصر ليس صحيحًا تمامًا، أو أي شيء آخر، 489 00:23:53,920 --> 00:23:58,240 يجب أن تكون غريزتك الأولى الآن، دعوني أحوله برمجيًا، وأشغّل debug50 عليه، 490 00:23:58,240 --> 00:24:01,910 والمضي خلال التعليمات البرمجية فقط، وتعيين نقطة توقف أينما أريد، 491 00:24:01,910 --> 00:24:04,450 لذا تركز على عدد قليل من السطور، وليس على الأمر برمته-- 492 00:24:04,450 --> 00:24:05,500 مثلما فعلت للتو-- 493 00:24:05,500 --> 00:24:08,840 وانظروا إذا كان يمكنكم تبين الأمر بشكل منطقي عندما لا تكون القيمة ما كنت تتوقعه، 494 00:24:08,840 --> 00:24:09,490 ثم أوه-- 495 00:24:09,490 --> 00:24:13,000 امضي قدمًا وانقر فقط على استئناف، إصلاح الخطأ، وأعد المحاولة. 496 00:24:13,000 --> 00:24:15,110 هذه الأداة الفعّالة. 497 00:24:15,110 --> 00:24:17,000 أي أسئلة؟ 498 00:24:17,000 --> 00:24:19,180 أجل؟ 499 00:24:19,180 --> 00:24:19,710 ما هو؟ 500 00:24:19,710 --> 00:24:21,780 الجمهور: ما الذي يبدو عليه عندما يكون هناك خطأ؟ 501 00:24:21,780 --> 00:24:24,113 ديفيد ج. مالان: ما الذي يبدو عليه عندما يكون هناك خطأ؟ 502 00:24:24,113 --> 00:24:28,170 إذن لن يجد مصحح الأخطاء الأخطاء ولن يقوم بإظهارها، في حد ذاته. 503 00:24:28,170 --> 00:24:31,137 سيتيح لك مشاهدة ما السطر الذي يتم تنفيذه، 504 00:24:31,137 --> 00:24:32,970 سيتيح لك مشاهدة ما هي المخرجات، 505 00:24:32,970 --> 00:24:34,950 سيتيح لك أخذ المدخل، ولكن كل ما 506 00:24:34,950 --> 00:24:36,949 سيقوم به على الجانب الأيمن هذا هو مجرد عرض 507 00:24:36,949 --> 00:24:38,910 قيم الأشياء على طول الطريق لك. 508 00:24:38,910 --> 00:24:42,840 الأمر متروك لك لتستنتج من تلك المعلومات ما 509 00:24:42,840 --> 00:24:46,140 الذي يسبب الخلل، تمامًا كما كنتم تستخدمون printf في الأسابيع الماضية 510 00:24:46,140 --> 00:24:48,420 لمعرفة ما الذي يجري في برنامجكم. 511 00:24:48,420 --> 00:24:50,590 أي أسئلة أخرى؟ 512 00:24:50,590 --> 00:24:52,360 دعوني أقوم بحفظ هذا أيضًا. 513 00:24:52,360 --> 00:24:55,600 من السهل جدا أن تتعودوا على الأمر، وخصوصًا عندما توجد أشياء كثيرة 514 00:24:55,600 --> 00:24:57,940 جديدة على مدار الأسابيع القليلة الماضية من قول، آه، 515 00:24:57,940 --> 00:24:59,860 هذا شيء آخر لنتعلمه. 516 00:24:59,860 --> 00:25:02,620 هذا بدون بذل الكثير من الجهد نوع من الأدوات التي إذا 517 00:25:02,620 --> 00:25:05,622 قضيت بضع دقائق اضافية هذا الأسبوع والأسبوع القادم فقط في استخدامها، 518 00:25:05,622 --> 00:25:07,330 ستشعر بالراحة في استخدامها، وستوفر 519 00:25:07,330 --> 00:25:09,927 عليك ساعات محتملة على المدى الطويل، 520 00:25:09,927 --> 00:25:12,010 لأنه طوال الوقت الذي كنت تقضيه في محاولة 521 00:25:12,010 --> 00:25:14,550 إصلاح الأخطاء لديك أو نشر الأسئلة عبر الإنترنت 522 00:25:14,550 --> 00:25:16,420 ومحاولة فهم الأشياء بشكل يدوي، هذه أداة 523 00:25:16,420 --> 00:25:18,640 إذا استثمرت تلك الدقائق مسبقًا في استخدامها 524 00:25:18,640 --> 00:25:21,340 ستساعدك على فهم كل شيء يجري داخل برنامجك، 525 00:25:21,340 --> 00:25:27,190 وستوفر لك قطعًا خلال الأسابيع المقبلة المزيد والمزيد من الوقت. 526 00:25:27,190 --> 00:25:30,665 حسنًا، أي أسئلة؟ نعم؟ 527 00:25:30,665 --> 00:25:34,060 الجمهور: إذن لديكم تكرار حلقي من نوع for loop والذي تم تشغيله لعدد [INAUDIBLE] من المرات، 528 00:25:34,060 --> 00:25:38,199 [INAUDIBLE] قام بفصل عبارات break ومن ثم لا يتعين عليكم [INAUDIBLE].. 529 00:25:38,199 --> 00:25:39,490 ديفيد ج. مالان: آه،سؤال جيد. 530 00:25:39,490 --> 00:25:42,156 إذا كان لديك شيء يشبه تكرارًا حلقيًا من نوع for loop أو من نوع while loop، شيء 531 00:25:42,156 --> 00:25:45,630 يحدث كثيرًا، فهل يمكنكم تعيين نقطة توقف بطريقة 532 00:25:45,630 --> 00:25:49,382 تتوقف فقط بحيث لا يتعين عليكم المرور من خلالها 100 مرة 533 00:25:49,382 --> 00:25:50,340 فقط لرؤية تلك القيمة؟ 534 00:25:50,340 --> 00:25:51,480 إجابة مختصرة، نعم. 535 00:25:51,480 --> 00:25:54,720 ودعوني أؤجل قليلاً فقط من هذه الميزات إلى موارد القسم والموارد عبر الإنترنت، 536 00:25:54,720 --> 00:25:57,240 إلا ميزة واحدة، أنكم يمكنكم مشاهدة القيم بالفعل، 537 00:25:57,240 --> 00:25:59,323 ويمكنك الحصول على ما يطلق عليه تعبير watch expression. 538 00:25:59,323 --> 00:26:03,330 يمكنك أن تقول أرني هذه القيمة إذا كانت x أكبر من 50 فقط 539 00:26:03,330 --> 00:26:04,470 أو شيئًا من هذا القبيل. 540 00:26:04,470 --> 00:26:06,840 أو يمكنك أن تضيف بنفسك فقط بعض الأسطر من التعليمة البرمجية. 541 00:26:06,840 --> 00:26:11,430 يمكنكم إضافة دالة، إذا كانت x تساوي-تساوي 50، ثم طباعة شيء ما، 542 00:26:11,430 --> 00:26:14,080 ويمكنك تعيين نقطة توقف على ذلك السطر الجديد، إذا كان سطرًا مؤقتًا، 543 00:26:14,080 --> 00:26:15,724 فتكون هناك إذن طريقتان للقيام بذلك. 544 00:26:15,724 --> 00:26:16,890 سؤال جيد نتوقعه. 545 00:26:16,890 --> 00:26:17,390 نعم؟ 546 00:26:17,390 --> 00:26:18,181 هناك في الخلف. 547 00:26:18,181 --> 00:26:22,029 الجمهور: إذا قمتَ بتشغيل debug50، ألستَ تقوم 548 00:26:22,029 --> 00:26:26,994 بإضافة وسيطة أخرى مع [INAUDIBLE] في طريقتك الأساسية في السطر 4؟ 549 00:26:26,994 --> 00:26:28,410 ديفيد ج. مالان: سؤال جيد حقًا. 550 00:26:28,410 --> 00:26:30,450 إذا كنتَ تقوم بتشغيل debug50، ألستَ تقوم 551 00:26:30,450 --> 00:26:33,540 بإضافة وسيطة أخرى-- argv-- في مناقشتنا الأسبوع الماضي لوسيطات 552 00:26:33,540 --> 00:26:34,320 سطر الأوامر؟ 553 00:26:34,320 --> 00:26:36,827 إجابة مختصرة، لا، لأن debug50 يقوم بالتصحيح لذلك، 554 00:26:36,827 --> 00:26:38,410 لذا لا داعي للقلق بشأن ذلك. 555 00:26:38,410 --> 00:26:40,530 إنها لن تستبق الأشياء عدديًا. 556 00:26:40,530 --> 00:26:41,730 فكرة جيدة حقًا. 557 00:26:41,730 --> 00:26:43,800 أي أسئلة أخرى؟ 558 00:26:43,800 --> 00:26:50,040 حسنًا، مع هذا القول، دعونا الآن نخرج بعض عجلات التدريب. 559 00:26:50,040 --> 00:26:53,070 إذن السبب الوحيد لشرائي لعجلات التدريب هذه منذ سنوات 560 00:26:53,070 --> 00:26:57,870 هو جعل هذه النقطة الدراماتيكية جدًا للوقت الحالي لإخراج عجلات التدريب هي 561 00:26:57,870 --> 00:26:59,660 هذا اليوم. 562 00:26:59,660 --> 00:27:01,470 حسنًا، ماذا يعني هذا؟ 563 00:27:01,470 --> 00:27:03,300 الأمر يستحق زيارة إلى الهدف. 564 00:27:03,300 --> 00:27:04,350 إذن ماذا يعني هذا؟ 565 00:27:04,350 --> 00:27:07,110 خلال الأسابيع القليلة الماضية، كنا نستخدم مجموعة كاملة 566 00:27:07,110 --> 00:27:09,310 من الدوالّ من مكتبة CS50. 567 00:27:09,310 --> 00:27:12,500 وكان من المفترض أن كل هذه الدوالّ كانت مصممة فقط لتجعلها سهلة جدًا، فلنقل نسبيًا، 568 00:27:12,500 --> 00:27:14,712 في الأسابيع القليلة الأولى للحصول على إدخال من المستخدم. 569 00:27:14,712 --> 00:27:16,420 لأنه يتبين، كما سنرى اليوم، 570 00:27:16,420 --> 00:27:20,910 أنها في الواقع تمثل نوعًا ما أمرًا مزعجًا للحصول على إدخال من المستخدمين في C، 571 00:27:20,910 --> 00:27:23,834 وبصراحة، حتى في موثوقية اللغات الأخرى. 572 00:27:23,834 --> 00:27:27,000 لأنكم ستتذكرون أن دالة get_string ودالة get_int وجميع هذه الدوال 573 00:27:27,000 --> 00:27:30,180 تأخذ على عاتقها إعادة مطالبة المستخدم إذا لم يمنحك فعليًا 574 00:27:30,180 --> 00:27:32,130 عددًا صحيحًا int أو إذا لم يمنحك قيمة كسرية float 575 00:27:32,130 --> 00:27:34,880 أو إذا لم يمنحك حرفًا char حسب توقعك، فستقوم هذه الدوال بإعادة المطالبة، 576 00:27:34,880 --> 00:27:37,296 أو تستخدم تكرارًا حلقيًا من النوع while loop أو من النوع do-while loop أو ما شابه، 577 00:27:37,296 --> 00:27:40,200 إذن يوجد فقط كثير من اكتشافات الأخطاء المدمجة في هذه الدوال. 578 00:27:40,200 --> 00:27:44,370 ولكن، الأكثر أهمية-- والأكثر تضليلاً، 579 00:27:44,370 --> 00:27:46,470 هي آخر واحدة في هذه القائمة. 580 00:27:46,470 --> 00:27:50,400 تذكّروا أننا طرحنا منذ أسبوعين من الآن فكرة السلسلة. 581 00:27:50,400 --> 00:27:53,570 وما هو المعنى الحرفي لكلمة سلسلة؟ 582 00:27:53,570 --> 00:27:54,780 مصفوفة من الأحرف، عظيم. 583 00:27:54,780 --> 00:27:57,300 إنها تسلسل من الأحرف، ونحن تعلمنا الأسبوع الماضي أنه يمكن تنفيذ 584 00:27:57,300 --> 00:27:59,758 تسلسل في مصفوفة، وهي مجرد مجموعة في الذاكرة 585 00:27:59,758 --> 00:28:01,290 مصفوفة على التوالي. 586 00:28:01,290 --> 00:28:06,120 إذن فالسلسلة، رغم ذلك، ليست تمامًا كأي من أنواع البيانات الأخرى تلك. 587 00:28:06,120 --> 00:28:10,800 يتضح أنها ليست تمامًا كعدد صحيح int أو حرف char أو حتى قيمة منطقية bool أو قيمة كسرية float، 588 00:28:10,800 --> 00:28:13,480 ويمكننا أن نبدأ في رؤية ذلك الآن على النحو التالي. 589 00:28:13,480 --> 00:28:15,522 سأمضي قدمًا و أنتقل إلى IDE اليوم-- 590 00:28:15,522 --> 00:28:17,813 وسنمضي من الآن فصاعدًا فقط لبدء استخدام IDE، 591 00:28:17,813 --> 00:28:20,942 ولكن لا مانع من استمرارك في استخدام أداة تحديد الوصول للبرامج السريعة والسيئة، 592 00:28:20,942 --> 00:28:22,650 ولكن لأي شيء تريد البقاء حوله، 593 00:28:22,650 --> 00:28:24,937 ينبغي أن تخبرك غريزتك الآن بفتح IDE الخاص بك. 594 00:28:24,937 --> 00:28:26,770 وسأمضي قدمًا وأُنشئ ملفًا جديدًا، 595 00:28:26,770 --> 00:28:31,710 وسأسميه compare0.c من مثالي الأول الخاص بمقارنة الأشياء. 596 00:28:31,710 --> 00:28:34,860 وسأمضي قدمًا وأقوم بتنشيط برنامج قصير نسبيًا 597 00:28:34,860 --> 00:28:37,130 ستأملون أن يعمل على الفور. 598 00:28:37,130 --> 00:28:40,230 إذن سأمضي قدمًا وأقوم بتضمين cs50.h المألوف. 599 00:28:40,230 --> 00:28:42,540 سأقوم بتضمين stdio.h. 600 00:28:42,540 --> 00:28:44,710 سأمضي قدمًا وأجعل int main لاغيًا. 601 00:28:44,710 --> 00:28:46,390 سأمضي قدمًا وهنا-- 602 00:28:46,390 --> 00:28:49,800 دعوني أنشىء متغيرًا يسمى i باستخدام get_int من المستخدم، 603 00:28:49,800 --> 00:28:51,750 ومطالبته فقط بالمتغير i. 604 00:28:51,750 --> 00:28:55,080 دعوني أمضي قدمًا وأطالب المستخدم بدالة get_int أخرى. 605 00:28:55,080 --> 00:28:57,292 سنسميها j ونحصل على تلك الدالة منه. 606 00:28:57,292 --> 00:28:59,000 ثم دعونا فقط نقارن هذه الأشياء. 607 00:28:59,000 --> 00:29:03,120 لذلك إذا كان i يساوي-يساوي j، إذن فلنمضِ قدمًا ونقوم بطباعة 608 00:29:03,120 --> 00:29:05,730 باستخدام printf نفسه وسطر جديد. 609 00:29:05,730 --> 00:29:10,870 ثم أمضي قدمًا وأطبع المقابل، والذي يكون مختلفًا. 610 00:29:10,870 --> 00:29:13,920 وبالتالي فإن المكان الوحيد الذي أظن أني أفسدتّه، ربما، 611 00:29:13,920 --> 00:29:16,200 يكون إذا فعلت هذا، وهو معقول نوعًا ما إذا كنتَ 612 00:29:16,200 --> 00:29:17,783 في طريقك لمعرفة ما تعنيه علامة يساوي. 613 00:29:17,783 --> 00:29:20,250 ولكن مجدّدًا، في التعليمة البرمجية، نحن نحتاج عادةً إلى علامتي يساوي 614 00:29:20,250 --> 00:29:21,710 لأن ذلك يقارن بين قيمتين. 615 00:29:21,710 --> 00:29:24,750 لذلك لم أقع في ذلك الخطأ، ولديّ شعور جيد جدًا حول هذا الأمر. 616 00:29:24,750 --> 00:29:28,170 دعوني أحفظه باستخدام الأمر Command-S أو Control-S أو عن طريق File، 617 00:29:28,170 --> 00:29:31,840 Save؛ وأنتقل إلى مطالبتي وأشغّل make compare0. 618 00:29:31,840 --> 00:29:33,450 عظيم، كل شيء تم تحويله برمجيًا. 619 00:29:33,450 --> 00:29:38,760 ودعوني أمضي وأشغّل compare0، إدخال، وسأقوم بكتابة 50، 620 00:29:38,760 --> 00:29:42,240 وسأكتب 50، ويبدو أنها هي نفسها. 621 00:29:42,240 --> 00:29:46,532 دعوني أمضي قدمًا ونفعل ذلك مجدّدًا، ودعونا نكتب 42 و13، 622 00:29:46,532 --> 00:29:47,490 وهما مختلفان. 623 00:29:47,490 --> 00:29:50,698 وعلى الأرجح ينبغي عليّ اختبار المزيد قليلاً، ربما بعض القيم السالبة، وربما بعض 624 00:29:50,698 --> 00:29:52,609 الأصفار، والقيم الموجبة وما شابه، ولكن لديّ 625 00:29:52,609 --> 00:29:54,900 شعور جيد للغاية حول مدى صحة هذه التعليمة البرمجية. 626 00:29:54,900 --> 00:29:55,500 حسنًا. 627 00:29:55,500 --> 00:29:57,214 إذن دعونا نغير هذا البرنامج قليلاً. 628 00:29:57,214 --> 00:29:59,130 دعوني أمضي قدمًا وأنشىء ملفًا آخر، والذي 629 00:29:59,130 --> 00:30:02,470 يمكنني القيام به بواسطة علامة زائد الخضراء الصغيرة أو عن طريق قائمة File، New File. 630 00:30:02,470 --> 00:30:04,670 سأمضي قدمًا وأحفظ هذا كـ compare1.c. 631 00:30:04,670 --> 00:30:08,880 وفي الوقت الحالي سأمضي قدمًا وأقوم فقط بلصق تلك التعليمة البرمجية 632 00:30:08,880 --> 00:30:11,340 المنسوخة من قبل، لكنني سأجري بعض التغييرات الآن. 633 00:30:11,340 --> 00:30:16,170 سأمضي قدمًا وأعيد تسمية أنماط بياناتي وأعيد كتابتها كسلاسل. 634 00:30:16,170 --> 00:30:18,840 إذن يمنحني سلسلة تسمى s، وستطالب المستخدم 635 00:30:18,840 --> 00:30:21,000 من أجل ذلك باستخدام get_string، ثم سأمضي 636 00:30:21,000 --> 00:30:23,880 قدمًا وأغير هذا الواحد إلى السلسلة t، 637 00:30:23,880 --> 00:30:25,860 وسأمضي قُدمًا وأحصل على get_string. 638 00:30:25,860 --> 00:30:30,180 أنا، بالطبع، بحاجة الآن لمقارنة s وt، وليس i وj. 639 00:30:30,180 --> 00:30:33,510 و s هو اسم متغير مشترك لسلسلة. وتأتي t فقط بعد s، 640 00:30:33,510 --> 00:30:36,860 فهي لذلك معقولة للغاية أيضًا، لكن ينبغي عليّ بالطبع تحديث ذلك أيضًا. 641 00:30:36,860 --> 00:30:39,390 ولذلك أعتقد أن كل شيء الآن هو متشابه منطقيًا. 642 00:30:39,390 --> 00:30:41,940 غيرتُ للتو أنواع بياناتي وأسماء المتغيرات لديّ. 643 00:30:41,940 --> 00:30:42,930 لذا قمتُ بحفظ هذا. 644 00:30:42,930 --> 00:30:45,380 دعوني أمضي قدمًا، وأشغّل make compare1. 645 00:30:45,380 --> 00:30:47,110 عظيم، كل شيء صحيح. 646 00:30:47,110 --> 00:30:51,630 دعوني أمضي قدمًا، وأشغّل ./compare1. 647 00:30:51,630 --> 00:30:56,280 دعوني أمضي قدمًا وأكتب Brian وVeronica. 648 00:30:56,280 --> 00:30:58,380 وبالطبع، فهما مختلفان. 649 00:30:58,380 --> 00:31:01,770 والآن دعوني أمضي قدمًا وأكتب David، ثم دعوني أكتب Da vid مجدّدًا، 650 00:31:01,770 --> 00:31:05,591 وهذان بالطبع مختلفان؟ 651 00:31:05,591 --> 00:31:06,090 ها. 652 00:31:06,090 --> 00:31:08,470 ربما لأنني ضغطت على شريط المسافة أو شيء ما. 653 00:31:08,470 --> 00:31:11,554 إذن دعونا نجرب Erin. 654 00:31:11,554 --> 00:31:12,720 اسمها أقصر قليلاً. 655 00:31:12,720 --> 00:31:13,800 امم. 656 00:31:13,800 --> 00:31:16,530 حسنًا، دعونا نجرب-- أوه، ما اسمها؟ 657 00:31:16,530 --> 00:31:17,040 TJ. 658 00:31:17,040 --> 00:31:19,000 حسنًا، اسم أكثر قصرًا، رائع. 659 00:31:19,000 --> 00:31:21,281 TJ، لا يمكن أن يكون خاطئًا. 660 00:31:21,281 --> 00:31:21,780 مختلفان. 661 00:31:21,780 --> 00:31:23,140 أعني، ما الذي يحدث؟ 662 00:31:23,140 --> 00:31:25,590 دعونا فقط نقول i،i. 663 00:31:25,590 --> 00:31:27,010 مختلفان؟ 664 00:31:27,010 --> 00:31:29,650 إذن أين هو الخطأ المنطقي في هذا البرنامج؟ 665 00:31:34,070 --> 00:31:36,460 ما هذا الذي يجري؟ 666 00:31:36,460 --> 00:31:37,482 أجل، ما رأيكم؟ 667 00:31:37,482 --> 00:31:39,190 الجمهور: هل يقارن قيم أعداد صحيحة؟ 668 00:31:39,190 --> 00:31:40,570 ديفيد ج. مالان: هل يقارن قيم أعداد صحيحة؟ 669 00:31:40,570 --> 00:31:41,140 حسنًا من الممكن. 670 00:31:41,140 --> 00:31:43,150 أعني، حتى الآن عندما استخدمنا يساوي-يساوي 671 00:31:43,150 --> 00:31:45,520 فعلى الأرجح استخدمناها غالبًا لمقارنة أعداد صحيحة، 672 00:31:45,520 --> 00:31:47,560 إذن ربما أسأتُ استخدامه، بالتأكيد. 673 00:31:47,560 --> 00:31:48,862 أي أفكار أخرى؟ 674 00:31:48,862 --> 00:31:51,687 الجمهور: [INAUDIBLE] 675 00:31:51,687 --> 00:31:54,770 ديفيد مالان: أوه، هذه كلمة كبيرة سنصل إليها بعد قليل. 676 00:31:54,770 --> 00:31:58,240 لكنها صحيحة، صحيحة-- ولكن لأسباب متشابهة جدًا. 677 00:31:58,240 --> 00:32:02,650 إذن، شيء ما يحدث منطقيًا يتعلق بالمقارنة، 678 00:32:02,650 --> 00:32:06,580 لأنني أستخدم يساوي-يساوي، ولكن ربما أستخدمه لأنواع البيانات الخاطئة؟ 679 00:32:06,580 --> 00:32:09,580 أعني، أنه من الواضح أنه مقسم لسلاسل. 680 00:32:09,580 --> 00:32:11,890 فلماذا يحدث ذلك فعليًا؟ 681 00:32:11,890 --> 00:32:16,450 حسنًا، يتبين أن السلاسل غير موجودة بالفعل. 682 00:32:16,450 --> 00:32:19,150 إذن فالسلسلة التي نعرفها هي مجرد تسلسل من الأحرف 683 00:32:19,150 --> 00:32:22,720 أو مصفوفة من الأحرف لا تعتبر نوع بيانات فعليًا. 684 00:32:22,720 --> 00:32:27,440 بينما يعتبر int، وfloat، وdouble، وlong ،وbool، وأكثر من ذلك 685 00:32:27,440 --> 00:32:28,870 هي أنواع بيانات فعلية. 686 00:32:28,870 --> 00:32:30,970 فالسلسلة هى كذبة بيضاء نوعًا ما كنا 687 00:32:30,970 --> 00:32:35,170 نقولها لبضعة أسابيع ويتم تنفيذها فقط في مكتبة CS50. 688 00:32:35,170 --> 00:32:37,350 الآن كلمة سلسلة هي شائعة للغاية في البرمجة. 689 00:32:37,350 --> 00:32:40,516 تقريبًا كل مبرمج بالخارج سيعرف ما الذي تعنيه عندما تقول سلسلة. 690 00:32:40,516 --> 00:32:44,740 إنها ليست كلمة CS50، ولكن استخدامنا لها في لغة C هو خاص بـ CS50. 691 00:32:44,740 --> 00:32:47,590 لأنه في ذلك الملف المسمّى cs50.h، بالإضافة إلى 692 00:32:47,590 --> 00:32:50,290 إعلان دوالّ مثل get_string وget_int وget_float 693 00:32:50,290 --> 00:32:53,860 ومجموعة من الأشياء الأخرى، لدينا أيضًا سطر خاص يقول، 694 00:32:53,860 --> 00:32:57,760 إنشاء نوع بيانات يسمى سلسلة. 695 00:32:57,760 --> 00:33:00,860 ولكن ما الذي يفعله حقيقةً أو ما الذي يعنيه حقيقةً؟ 696 00:33:00,860 --> 00:33:04,090 حسنًا دعونا نمضي قدمًا ونفكر فيما قد يحدث بالتفصيل 697 00:33:04,090 --> 00:33:04,850 هنا. 698 00:33:04,850 --> 00:33:08,950 لذلك إذا مضيتُ قدمًا ورسمتُ البرنامج الذي قمنا 699 00:33:08,950 --> 00:33:12,490 بتشغيله للتو، فيحصل ذلك البرنامج compare1 على سلسلة s من المستخدم، 700 00:33:12,490 --> 00:33:15,730 ثم يحصل على سلسلة t من المستخدم، ومن ثم يقارن بينهما. 701 00:33:15,730 --> 00:33:18,500 إذن نعرف من الأسبوع الماضي ما هي السلسلة، إنها مجرد مصفوفة. 702 00:33:18,500 --> 00:33:22,520 إذن، عندما أشغّل ذلك السطر الأول من التعليمة البرمجية وأحصل على سلسلة من المستخدم-- 703 00:33:22,520 --> 00:33:28,270 على سبيل المثال، Brian، فسأمضي قدمًا وأرى B-R-I-A-N، 704 00:33:28,270 --> 00:33:33,415 والتي نعرف من الأسبوع الماضي أنها تعتبر بالفعل مصفوفة في الذاكرة قد تبدو 705 00:33:33,415 --> 00:33:36,040 مثل هذه من الناحية التصويرية-- وهذه، أيضًا، كذبة بيضاء نوعًا ما 706 00:33:36,040 --> 00:33:37,704 فهناك شيء آخر. 707 00:33:37,704 --> 00:33:38,560 الجمهور: الفارغ. 708 00:33:38,560 --> 00:33:41,350 ديفيد مالان: نعم، الحرف الفارغ، إذا جاز التعبير، و ul، 709 00:33:41,350 --> 00:33:45,540 التي نكتبها عادةً فقط باستخدام /0، وهو عبارة عن كل أصفار البت تحديدًا. 710 00:33:45,540 --> 00:33:49,390 ويتضح، ربما تذكرون من مصحح الأخطاء في وقت سابق، أنكم رأيتم هذا-- 711 00:33:49,390 --> 00:33:52,480 تلك هي الطريقة الأكثر تشفيرًا للتعبير عن الحرف الفارغ، 712 00:33:52,480 --> 00:33:53,350 /0. 713 00:33:53,350 --> 00:33:55,940 فقط برامج مختلفة تعرضها بطرق مختلفة. 714 00:33:55,940 --> 00:34:00,200 إذن عندما أحصل على دالة get_string وأكتب Brian، فهذا هو ما يتم تخصيصه في الذاكرة. 715 00:34:00,200 --> 00:34:05,922 وعندما أكتب Veronica، يمكنني رؤية سلسلة V-E-R-O-N-I-C-A. 716 00:34:05,922 --> 00:34:07,630 سأحصل على تلك السلسلة مباشرة على نحو استباقي. 717 00:34:07,630 --> 00:34:08,850 /0. 718 00:34:08,850 --> 00:34:12,190 تلك، أيضًا، هي مجموعة في الذاكرة، سأرسمها على هذا النحو. 719 00:34:12,190 --> 00:34:16,989 1، 2، وأقسّم هذه الأحرف إلى أحرف أو وحدات بايت كفواصل. 720 00:34:16,989 --> 00:34:20,380 وتذكرون من آخر مرة أن وحدات البايت هذه تأتي تحديدًا من الذاكرة الموجودة لديّ، 721 00:34:20,380 --> 00:34:23,469 وأن تلك الذاكرة لديها فقط مجموعة من وحدات البايت بداخلها، ربما الملايين أو حتى 722 00:34:23,469 --> 00:34:24,699 المليارات في الوقت الحالي. 723 00:34:24,699 --> 00:34:26,830 إذن بصراحة، إذا كانت لديك فقط تلك الأشياء العديدة، 724 00:34:26,830 --> 00:34:29,290 يمكن لأي إنسان أو جهاز كمبيوتر بالتأكيد ترقيمها. 725 00:34:29,290 --> 00:34:31,600 على هذا النحو بايت 1، 2، 3، 4. 726 00:34:31,600 --> 00:34:34,030 إذن دعونا نفترض فقط بغرض النقاش 727 00:34:34,030 --> 00:34:36,610 خارج سياق المكونات المادية بجهاز الكمبيوتر الخاص بي، 728 00:34:36,610 --> 00:34:46,659 أن Brian انتهى للتو عند الموقع 100، والموقع 101، و102، 103، 104، 105. 729 00:34:46,659 --> 00:34:49,179 إذن هذا هو البايت رقم 100 في جهاز الكمبيوتر الخاص بي، 730 00:34:49,179 --> 00:34:51,310 وهذا هو البايت رقم 105 في جهاز الكمبيوتر الخاص بي، وBrian 731 00:34:51,310 --> 00:34:53,100 يستخدم تلك الأحرف العديدة في المجمل. 732 00:34:53,100 --> 00:34:55,030 Veronica، انتهى بها المطاف في مكان آخر. 733 00:34:55,030 --> 00:35:02,710 ربما انتهى بها المطاف لأبعد من ذلك فقط لأنه في الموقع 900، 901، 902، 903، 734 00:35:02,710 --> 00:35:09,910 904، 905، 906-- ذاكرة أكبر كثيرًا، 907، و908-- 735 00:35:09,910 --> 00:35:14,010 ولكن يمكنكك الرؤية بشكل مرئي أكثر الآن أن طول اسم Brian-- 736 00:35:14,010 --> 00:35:18,398 strlen "طول السلسلة" الخاص بـ Brian ما هو؟ 737 00:35:18,398 --> 00:35:21,230 الجمهور: [INAUDIBLE] 738 00:35:21,230 --> 00:35:22,950 ديفيد مالان: أسمع خمسة وأسمع ستة. 739 00:35:22,950 --> 00:35:24,330 طول اسم Brian-- 740 00:35:24,330 --> 00:35:25,835 Brian، كم يبلغ طول اسمك؟ 741 00:35:25,835 --> 00:35:26,460 الجمهور: خمسة. 742 00:35:26,460 --> 00:35:28,834 ديفيد مالان: حسنًا، إنه بالتأكيد خمسة أحرف، هذا 743 00:35:28,834 --> 00:35:31,530 هو طول اسم Brian، ولكن يتعين عليك 744 00:35:31,530 --> 00:35:35,370 أن تقدّر ذلك في الكمبيوتر، فاسم Brian بطول خمسة أحرف في الواقع 745 00:35:35,370 --> 00:35:36,270 يستهلك ست وحدات بايت. 746 00:35:36,270 --> 00:35:39,750 إذن كلتا الإجابتين صحيحتان نوعًا ما، ولكن طول السلسلة من الآن فصاعدًا 747 00:35:39,750 --> 00:35:41,700 سيكون دائمًا هو عدد الأحرف الفعلية. 748 00:35:41,700 --> 00:35:45,720 مقدار المساحة الذي تستهلكه هو ذلك الطول زائد 1 للحرف الفارغ. 749 00:35:45,720 --> 00:35:49,710 إذن يمكنك بالفعل أن ترى لماذا يستهلك اسم Brian ست وحدات بايت في هذه الصورة 750 00:35:49,710 --> 00:35:52,380 بدلاً من الطول الفعلي فقط، والذي هو خمسة. 751 00:35:52,380 --> 00:35:55,620 لذلك عندما تطلق اسم get_string الآن، وعندما تطلق اسم 752 00:35:55,620 --> 00:35:57,480 get_string وget_string أخرى-- 753 00:35:57,480 --> 00:36:01,740 Brian وVeronica على الترتيب، فما الذي تتم إعادة تسليمه بالفعل مجددًا؟ 754 00:36:01,740 --> 00:36:04,350 قبل أسبوعين، ظهرت Erin وقامت نوعًا ما بإعادة 755 00:36:04,350 --> 00:36:07,200 تسليم سلسلة إليّ، اسم طالب من الجمهور. 756 00:36:07,200 --> 00:36:11,970 اعتقدنا أن اسم الطالب موجود على تلك الورقة. 757 00:36:11,970 --> 00:36:13,030 لكن الأمر ليس كذلك. 758 00:36:13,030 --> 00:36:15,750 يتضح أنه عندما تقوم دالة بإرجاع قيمة، 759 00:36:15,750 --> 00:36:20,310 فيمكنها فقط إلى حد كبير إرجاع 1 بايت أو ربما 2 أو 4 بايت. 760 00:36:20,310 --> 00:36:25,450 ولا يمكنها إرجاع عدد مهول من وحدات البايت، مثل ستة لـ Brian أو 1، 2، 3، 761 00:36:25,450 --> 00:36:29,460 4، 5، 6، 7، 8، 9-- لا يمكنها إرجاع 9 وحدات بايت لـ Veronica. 762 00:36:29,460 --> 00:36:32,850 وإذا قمتَ حتى بكتابة فقرة كاملة أو صفحة من نص، 763 00:36:32,850 --> 00:36:37,600 فلا يمكنها إرجاع كل ذلك النص، ويمكنها فقط إرجاع قيمة واحدة. 764 00:36:37,600 --> 00:36:40,440 إذن، وفقًا لغريزتك فيما سبق، ما الذي 765 00:36:40,440 --> 00:36:44,730 ربما يتم إرجاعه بواسطة get_string عندما يكتب الشخص 766 00:36:44,730 --> 00:36:47,726 اسمًا مثل Brian أو Veronica؟ 767 00:36:47,726 --> 00:36:49,495 الجمهور: [INAUDIBLE] 768 00:36:49,495 --> 00:36:50,870 ديفيد مالان: موقع الذاكرة. 769 00:36:50,870 --> 00:36:53,510 في الحقيقة، عدد صحيح، أو كما تسمّونها، مؤشر، 770 00:36:53,510 --> 00:36:55,770 وسنقوم بتقديمه بطريقة رسمية بدرجة أكبر في غضون لحظات. 771 00:36:55,770 --> 00:36:58,820 لذلك عندما تقوم السلسلة get_string بإرجاع "Brian،" علامة اقتباس-إنهاء الاقتباس، 772 00:36:58,820 --> 00:37:05,570 فإنها في الواقع لا تقوم بإرجاع B-R-I-A-N /0، إنما تقوم فقط بإرجاع 100. 773 00:37:05,570 --> 00:37:08,360 وعندما تقوم السلسلة get_string بإرجاع Veronica، فإنها لا تقوم بإرجاع اسمها، 774 00:37:08,360 --> 00:37:10,580 وإنما تقوم بإرجاع 900. 775 00:37:10,580 --> 00:37:13,780 وبذلك إذا أدركت ذلك الآن، فعندما تقوم 776 00:37:13,780 --> 00:37:19,820 بالسلسلة s يساوي يساوي t، فما هو السؤال الأكثر اعتيادًا الذي تسأله فعليًا؟ 777 00:37:19,820 --> 00:37:20,960 نعم. 778 00:37:20,960 --> 00:37:24,200 موقع الذاكرة وموقع الذاكرة-- هل 100 تساوي 900؟ 779 00:37:24,200 --> 00:37:25,670 وبالطبع لا. 780 00:37:25,670 --> 00:37:28,680 وذلك هو سبب أن اسم Brian، واسم Veronica، 781 00:37:28,680 --> 00:37:32,870 واسمي، واسم TJ-- كل كلمة كتبتها كانت بالطبع مختلفة، 782 00:37:32,870 --> 00:37:36,560 نظرًا لأن كل مُدخل كان ينتهي في موقع مختلف في الذاكرة. 783 00:37:36,560 --> 00:37:40,509 وحتى لو قمتُ بكتابة الكلمة نفسها مثل David مرتين، فكلمة David الأولى كانت تنتقل إلى هنا، 784 00:37:40,509 --> 00:37:42,800 وكلمة David الأخرى انتقلت إلى مكان آخر، فكانتا ينتهي بهما المطاف 785 00:37:42,800 --> 00:37:44,050 في موقعين مختلفين في الذاكرة. 786 00:37:44,050 --> 00:37:46,460 ربما 100، ربما 900، ربما مكان آخر، 787 00:37:46,460 --> 00:37:48,920 لكن انتهى بهما المطاف في موقعين مختلفين في الذاكرة. 788 00:37:48,920 --> 00:37:51,890 إذن فالدالة يساوي-يساوي تقارن بين القيم، ولكن تبًّا 789 00:37:51,890 --> 00:37:54,280 لها إذا لم تكن تقارن القيم الخاطئة. 790 00:37:54,280 --> 00:37:54,780 أجل؟ 791 00:37:54,780 --> 00:37:56,907 الحضور: حسنًا ماذا لو استخدمت دالة char*s؟ 792 00:37:56,907 --> 00:37:58,740 ديفيد مالان: آه، إذن سنعود لتلك النقطة. 793 00:37:58,740 --> 00:38:00,490 دعوني أعود لتلك النقطة بعد لحظات. 794 00:38:00,490 --> 00:38:02,689 في الواقع أن الدالة char* مرتبطة بطريقة معقدة. 795 00:38:02,689 --> 00:38:03,730 المزيد حول ذلك في غضون لحظات. 796 00:38:03,730 --> 00:38:04,230 أجل؟ 797 00:38:04,230 --> 00:38:06,170 الحضور: إذا قمت بإضافة عددين صحيحين في الذاكرة-- 798 00:38:06,170 --> 00:38:06,658 ديفيد مالان: آها؟ 799 00:38:06,658 --> 00:38:09,098 الحضور: ألن يكونا في مكانين مختلفين في الذاكرة؟ 800 00:38:09,098 --> 00:38:11,050 إذن ستقوم بالإرجاع-- 801 00:38:11,050 --> 00:38:12,727 لذلك تحتاج إلى قيمة مختلفة. 802 00:38:12,727 --> 00:38:14,310 ديفيد مالان: حسنًا، سؤال جيد حقًا. 803 00:38:14,310 --> 00:38:19,700 إذن انتظروا دقيقة، هذا المنطق نفسه أنني أقوم بإرجاع عنوان شيء ما 804 00:38:19,700 --> 00:38:23,750 ينطبق بالتأكيد على الأعداد الصحيحة كذلك أو قيم النقطة الحرة floating كذلك؟ 805 00:38:23,750 --> 00:38:25,910 لأنني إذا كتبتُ الرقم 50 مثلما 806 00:38:25,910 --> 00:38:29,960 فعلتُ سابقًا، ذلك، أيضًا، في مكان ما في الذاكرة-- مثل مربع في الذاكرة، 807 00:38:29,960 --> 00:38:32,780 وذلك، أيضًا، يحتوي على عنوان في مكان ما في الذاكرة، 808 00:38:32,780 --> 00:38:36,135 ولكن يتضح، وذلك لأسباب أشرتم إليها للتو، في الواقع، 809 00:38:36,135 --> 00:38:38,540 أنه يتم إرجاع الأعداد الصحيحة ints كقيمها. 810 00:38:38,540 --> 00:38:40,740 ويتم إرجاع الأحرف Chars كقيمها. 811 00:38:40,740 --> 00:38:42,200 ويتم إرجاع القيم المنطقية Bools كقيمها. 812 00:38:42,200 --> 00:38:43,700 ويتم إرجاع القيم الحرة Floats كقيمها. 813 00:38:43,700 --> 00:38:45,260 بينما تكون السلاسل مختلفة. 814 00:38:45,260 --> 00:38:48,920 حيث يتم إرجاع السلاسل Strings حسب عناوينها. 815 00:38:48,920 --> 00:38:54,080 وتلك العناوين، كما يتضح، سيتم تسميتها في نهاية المطاف 816 00:38:54,080 --> 00:38:56,700 أحرف char*، والتي سنراها في غضون لحظات. 817 00:38:56,700 --> 00:38:59,780 إذن، كيف نمضي ثم نصلح هذا بشكل جذري؟ 818 00:38:59,780 --> 00:39:03,170 تقريبًا حتى لو لم تكن لديك فكرة عن كيفية تشفير هذا بعد، فبديهيًا، 819 00:39:03,170 --> 00:39:06,030 إذا كنت فعلاً أرغب في حذف-- 820 00:39:06,030 --> 00:39:09,670 إذا كنت فعلاً أرغب في مقارنة-- 821 00:39:09,670 --> 00:39:10,170 معذرةً. 822 00:39:13,530 --> 00:39:14,050 حسنًا. 823 00:39:14,050 --> 00:39:19,180 إذا أردت المضي قدمًا ومقارنة تساوي Brian وVeronica، 824 00:39:19,180 --> 00:39:21,370 فما الذي أرغب في فعله بديهيًا؟ 825 00:39:21,370 --> 00:39:23,050 فلا يمكنني مجرد مقارنة عنوانهما. 826 00:39:23,050 --> 00:39:25,872 ماذا عليّ أن أفعل؟ 827 00:39:25,872 --> 00:39:27,955 أعزل الأحرف ثم ماذا أفعل بها؟ 828 00:39:27,955 --> 00:39:30,820 الجمهور: [INAUDIBLE] 829 00:39:30,820 --> 00:39:31,570 ديفيد مالان: جيد. 830 00:39:31,570 --> 00:39:32,445 أجل، بديهيات جيدة. 831 00:39:32,445 --> 00:39:35,260 استخدم تكرارًا حلقيًا من النوع for loop، استخدم تكرارًا حلقيًا من النوع while loop-- أي نوع من بنية التكرار الحلقي. 832 00:39:35,260 --> 00:39:37,184 وبديهيًا، قارن الأحرف الأولى، 833 00:39:37,184 --> 00:39:40,350 واذا كانت مختلفة، فمن ثم نعرف أننا لا يتعين علينا المضي إلى أبعد من ذلك. 834 00:39:40,350 --> 00:39:43,147 B ليست V، لذلك بالتأكيد فهذان الاسمان مختلفان. 835 00:39:43,147 --> 00:39:44,230 لكن ماذا عن الحالة الموجودة لديّ؟ 836 00:39:44,230 --> 00:39:46,870 إذا كانت الحالة هي David وDavid، وكنت ستقارن أول حرفين. 837 00:39:46,870 --> 00:39:48,460 D وD متشابهان. 838 00:39:48,460 --> 00:39:50,710 قارن التاليين، A وA متشابهان. 839 00:39:50,710 --> 00:39:55,570 V وV، ثم I وI، ثم D وD، ثم ما الذي سأضغط عليه أخيرًا؟ 840 00:39:55,570 --> 00:39:56,500 حرف فارغ. 841 00:39:56,500 --> 00:39:58,660 وهل يجب عليّ المتابعة إلى ما بعد الحرف الفارغ؟ 842 00:39:58,660 --> 00:39:59,160 لا. 843 00:39:59,160 --> 00:40:02,250 إذن هذا هو جمال ذلك التصميم الرائع البسيط للسلسلة. 844 00:40:02,250 --> 00:40:07,750 بقدر ما يتم تحديد السلاسل حسب عنوان بدايتها، فإن وحدة البايت فقط 845 00:40:07,750 --> 00:40:10,390 التي تبدأ منها، ستظل بحاجة لمعرفة 846 00:40:10,390 --> 00:40:14,650 طولها، لأنه بطريقة تشغيل خلاف ذلك فأين تبدأ الكلمة الواحدة وأين تنتهي 847 00:40:14,650 --> 00:40:16,330 وأين تبدأ كلمة أخرى؟ 848 00:40:16,330 --> 00:40:20,320 وبالتالي فإن القرار البسيط الذي اتخذناه الأسبوع الماضي-- كما فعل الناس منذ عقود-- 849 00:40:20,320 --> 00:40:25,600 لإنهاء جميع السلاسل باستخدام /0 أو كل الأصفار هو خدعة سهلة للغاية، 850 00:40:25,600 --> 00:40:28,630 بحيث إذا قلت لكم أن Brian يبدأ عند 100، 851 00:40:28,630 --> 00:40:31,120 فيمكنكم استنتاج أين انتهى؟ 852 00:40:33,800 --> 00:40:37,400 عند رقم البايت 105 أو 104، إذا شئت، أيًا كانت الطريقة التي ترغب في التفكير بها، 853 00:40:37,400 --> 00:40:40,610 لأن كل ما عليك القيام به في الزمن الخطي، 854 00:40:40,610 --> 00:40:43,640 إذا أردت، يسارًا أو يمينًا، هو التحقق-- /0، /0-- آه! 855 00:40:43,640 --> 00:40:46,790 /0، الآن أعرف مدى طول اسم Brian. 856 00:40:46,790 --> 00:40:49,880 لذلك دعونا نفكر للحظة في هذا البرنامج المسمى string length "طول السلسلة". 857 00:40:49,880 --> 00:40:52,460 كيف يعمل طول السلسلة strlen فعليًا؟ 858 00:40:52,460 --> 00:40:57,140 عندما تنتقل إلى طول السلسلة strlen، متغير يحتوي على سلسلة، مثل Brian، 859 00:40:57,140 --> 00:41:00,299 ما الذي يحتمل أن يفعله طول السلسلة strlen؟ 860 00:41:00,299 --> 00:41:02,345 الجمهور: [INAUDIBLE] 861 00:41:02,345 --> 00:41:03,220 ديفيد مالان: بالضبط. 862 00:41:03,220 --> 00:41:05,740 إنه ينظر إلى عنوان ذلك الحرف الفارغ 863 00:41:05,740 --> 00:41:09,340 وطرح عنوان البداية وعنوان النهاية، 864 00:41:09,340 --> 00:41:12,160 واستنتاج الفرق وإرجاع 865 00:41:12,160 --> 00:41:14,890 تلك القيمة فعليًا ناقص 1 من العد الإجمالي. 866 00:41:14,890 --> 00:41:16,940 وعلى نحو ميكانيكي بدرجة أكبر، سترون في غضون لحظات، 867 00:41:16,940 --> 00:41:19,090 أنه ربما يفعل بالضبط الشيء نفسه الذي فعلتُه، 868 00:41:19,090 --> 00:41:20,357 وهو، هل هذا /0؟ 869 00:41:20,357 --> 00:41:21,190 هل هذا /0؟ 870 00:41:21,190 --> 00:41:22,780 هل هذا، هل هذا، هل هذا؟ 871 00:41:22,780 --> 00:41:25,840 سألتُ هذا السؤال خمس مرات قبل أن أرى /0. 872 00:41:25,840 --> 00:41:29,320 strlen هى مجرد دالة كتبها بعض الأشخاص منذ سنوات 873 00:41:29,320 --> 00:41:31,930 والتي يُحتمل أن يكون بها تكرار حلقي بسيط من النوع for loop وشرط if، 874 00:41:31,930 --> 00:41:33,220 ومن ثم فهذا كل شيء. 875 00:41:33,220 --> 00:41:35,320 لأن هذا الشخص أدرك حتى من قبل 876 00:41:35,320 --> 00:41:39,050 أن نُشغّل كيفية تنفيذ السلاسل فعليًا. 877 00:41:39,050 --> 00:41:41,047 أي أسئلة أخرى؟ 878 00:41:41,047 --> 00:41:42,880 حسنًا، إذن دعونا ننفّذ هذا بالفعل. 879 00:41:42,880 --> 00:41:46,930 دعوني أمضي قدمًا إلى المحرر الموجود لديّ هنا، وأقدم مثالاً آخر هنا 880 00:41:46,930 --> 00:41:48,730 سأسميه compare2. 881 00:41:48,730 --> 00:41:55,150 سأمضي قدمًا وأقوم بتضمين cs50.h وأقوم بتضمين stdio.h، 882 00:41:55,150 --> 00:41:57,940 ثم سأجعل int main لاغيًا، وسأقوم 883 00:41:57,940 --> 00:42:03,040 الآن بالتقاط التعليمة البرمجية الخاصة بي بسرعة مما سبق حيث حصلت على سلاسل 884 00:42:03,040 --> 00:42:06,380 وقمت بمقارنتها، ولكن يتعين عليّ تثبيت تلك المقارنة. 885 00:42:06,380 --> 00:42:08,290 إذن، ها هي التعليمة البرمجية الخاصة بي مما سبق. 886 00:42:08,290 --> 00:42:10,130 سأقوم بتنفيذها بالطريقة الصحيحة. 887 00:42:10,130 --> 00:42:14,630 سأسستدعي دالة اسمها compare_strings تمر في s وt. 888 00:42:14,630 --> 00:42:16,870 لأنه كما اقترحتم، نحتاج لتنفيذ دالة منطقية ما. 889 00:42:16,870 --> 00:42:18,910 لا يتعين علينا تمريرها إلى دالة، ولكن يمكننا ذلك. 890 00:42:18,910 --> 00:42:20,618 يمكننا فقط إجراء تكرار حلقي من النوع for loop هنا، ولكنني 891 00:42:20,618 --> 00:42:23,600 سأمضي قدمًا وأنفذ سلاسل compare_strings على النحو التالي. 892 00:42:23,600 --> 00:42:28,150 إذا رغبت في كتابة دالة تقوم بإرجاع إجابة نعم/ لا، فما نوع البيانات 893 00:42:28,150 --> 00:42:29,890 التي يجب أن ترجعها؟ 894 00:42:29,890 --> 00:42:30,490 تعبير منطقي bool. 895 00:42:30,490 --> 00:42:32,800 إذن لا يتعين علينا بالضرورة فعل ذلك بعد، لكن 896 00:42:32,800 --> 00:42:36,280 يمكنك إرجاع قيمة منطقية bool مثلما يمكنك ذلك مع عدد صحيح int أو حرف char أو أي شيء آخر. 897 00:42:36,280 --> 00:42:38,500 سأسمي هذه الدالة باسم compare_strings. 898 00:42:38,500 --> 00:42:42,570 ستستوعب سلسلة تسمّى a وسلسلة أخرى تسمى b، 899 00:42:42,570 --> 00:42:44,600 لكن يمكنني تسميتهما بأي اسم أريده. 900 00:42:44,600 --> 00:42:47,740 والآن ما هو أسهل شيء يمكن التحقق منه؟ 901 00:42:47,740 --> 00:42:50,812 إذا قمت بتمرير سلسلتين، a وb، أو Brian وVeronica، 902 00:42:50,812 --> 00:42:53,770 فما هو أسهل سؤال يمكنك طرحه وقوله تحديدًا على الفور، كلا، 903 00:42:53,770 --> 00:42:55,235 هل هذان مختلفان؟ 904 00:42:55,235 --> 00:42:56,110 طول السلسلة، أليس كذلك؟ 905 00:42:56,110 --> 00:43:00,190 كما لو أن B-R-I-A-N ليس بنفس طول اسم Veronica، 906 00:43:00,190 --> 00:43:02,830 فلسنا بحاجة للقيام بأي دالة منطقية على الإطلاق أبعد من ذلك، 907 00:43:02,830 --> 00:43:04,542 يمكننا فقط الخروج وقول خطأ. 908 00:43:04,542 --> 00:43:05,500 إذن دعوني أفعل ذلك. 909 00:43:05,500 --> 00:43:10,430 إذا كان طول السلسلة strlen لـ a لا يساوي طول السلسلة strlen لـ b، أتعرفون ماذا إذن؟ 910 00:43:10,430 --> 00:43:13,300 دعونا نمضي قدمًا ونقوم بإرجاع خطأ وإخراجه هنا. 911 00:43:13,300 --> 00:43:17,200 حسنًا، ولكن الآن، إذا تجاوزنا تلك البوابة، إذا جاز التعبير، 912 00:43:17,200 --> 00:43:19,780 ذلك التحقق، ذلك السؤال، ذلك التعبير المنطقي، 913 00:43:19,780 --> 00:43:23,182 فيتعين عليّ الآن مقارنة الأشياء حرفًا بحرف بحرف. 914 00:43:23,182 --> 00:43:26,390 حتى يمكنني القيام بذلك بعدة طرق، لكني أحب اقتراح تكرار حلقي من النوع for loop. 915 00:43:26,390 --> 00:43:30,610 إذن بالنسبة للعدد الصحيح int i يصل إلى 0، حيث n تشير إلى الفعالية-- ففي الواقع، 916 00:43:30,610 --> 00:43:33,720 دعونا ننفّذ i أقل من طول السلسلة-- 917 00:43:33,720 --> 00:43:36,825 فهل ينبغي عليّ تنفيذ طول السلسلة a أم b؟ 918 00:43:36,825 --> 00:43:38,380 لا يهم، أليس كذلك؟ 919 00:43:38,380 --> 00:43:39,430 إذن دعونا نختار a. 920 00:43:39,430 --> 00:43:41,560 وبصراحة، لو كنتُ ذكيًا في وقت مبكر، 921 00:43:41,560 --> 00:43:44,110 لتمكنتُّ من تخزين القيمة في متغير ثم إعادة استخدامها، 922 00:43:44,110 --> 00:43:45,820 لكننا سنواصل المضي قدمًا الآن. 923 00:43:45,820 --> 00:43:48,590 ثم i زائد-زائد، ولكن أتذكر من آخر مرة-- أن هذا صحيح، 924 00:43:48,590 --> 00:43:49,710 لكنه ليس تصميمًا جيدًا. 925 00:43:49,710 --> 00:43:50,209 لماذا؟ 926 00:43:52,772 --> 00:43:55,980 نعم، أتابع تسمية طول السلسلة strlen مرارًا وتكرارًا، لأنه لو تذكرون، في التكرار الحلقي من النوع for loop، 927 00:43:55,980 --> 00:43:58,110 يتم التحقق من هذا الشرط مرارًا 928 00:43:58,110 --> 00:44:00,160 وتكرارًا-- فأنتم تضيعون وقتكم. 929 00:44:00,160 --> 00:44:02,970 لذا دعوني أمضي قُدمًا وأقوم بهذا بالفعل. 930 00:44:02,970 --> 00:44:09,270 n أو أي متغير يساوي طول السلسلة strlen لـ a، ثم نقارن فقط i مع n، 931 00:44:09,270 --> 00:44:12,960 لأن الآن i تزيد، ولكن n لا تتغير أبداً. 932 00:44:12,960 --> 00:44:15,250 إذن دعوني أمضي قدمًا وأنفّذ هذا للتكرار الحلقي. 933 00:44:15,250 --> 00:44:21,510 إذن لو-- ماذا لو أن الحرف صاحب الترتيب رقم i لـ a لا يساوي الحرف صاحب الترتيب رقم i 934 00:44:21,510 --> 00:44:24,780 لـ b، يمكنني أن أستنتج على الفور 935 00:44:24,780 --> 00:44:28,410 كلا، لا يمكن أن تكون هاتان السلسلتان متشابهتين، لأن حرفًا ما، مثل حرف B، 936 00:44:28,410 --> 00:44:31,440 ليس متشابهًا كحرف آخر، مثل حرف V، أو أي حرف نقوم 937 00:44:31,440 --> 00:44:32,580 بمقارنته بالفعل. 938 00:44:32,580 --> 00:44:34,380 ومن ثم أعتقد أن هذا كل شيء. 939 00:44:34,380 --> 00:44:37,590 إذا تجاوزتُ تحديات الأسئلة هذه-- 940 00:44:37,590 --> 00:44:38,850 فهل أطوال السلاسل لديك مختلفة؟ 941 00:44:38,850 --> 00:44:40,100 هل الأحرف لديك مختلفة؟ 942 00:44:40,100 --> 00:44:45,370 وأنا ما زلتُ لم أقل خطأ، فما الذي ينبغي عليّ إرجاعه افتراضيًا؟ 943 00:44:45,370 --> 00:44:45,870 نعم. 944 00:44:45,870 --> 00:44:49,060 كما لو أنك قمت بكل هذا من خلال جميع تلك الأسئلة وسيكون كل شيء على ما يرام، 945 00:44:49,060 --> 00:44:54,040 إذًا يجب أن يعادل د-ي-ف-ي-د بالفعل د-ي-ف-ي-د أو أيًا كان ما كتبه 946 00:44:54,040 --> 00:44:54,920 المستخدم بالفعل. 947 00:44:54,920 --> 00:44:56,140 الآن أنا لم أنتهِ تمامًا بعد. 948 00:44:56,140 --> 00:44:58,780 عندما انتهيتُ من تنفيذ دالة أو دالة مساعدة 949 00:44:58,780 --> 00:45:01,030 كهذه، لأنها تساعدني في القيام بعملي، 950 00:45:01,030 --> 00:45:02,680 ماذا يجب أن أضيفه أيضًا إلى الملف؟ 951 00:45:02,680 --> 00:45:03,077 أوه؟ 952 00:45:03,077 --> 00:45:04,270 الجمهور: لديّ سؤال منطقي. 953 00:45:04,270 --> 00:45:05,020 ديفيد مالان: بالتأكيد. 954 00:45:05,020 --> 00:45:08,642 الجمهور: في جهاز الكمبيوتر، ألا يمكنك فقط كتابة David بحرف D كبير 955 00:45:08,642 --> 00:45:11,546 ثم david بحرف d صغير، وستقوم بتشغيل [INAUDIBLE]، 956 00:45:11,546 --> 00:45:12,914 فلن يتزامنوا لأن أول حرف ليس 957 00:45:12,914 --> 00:45:13,785 نفس الحرف. 958 00:45:13,785 --> 00:45:14,660 ديفيد مالان: صحيح. 959 00:45:14,660 --> 00:45:17,240 لذلك هذه ميزة، وليست خطأ في الوقت الراهن. 960 00:45:17,240 --> 00:45:20,040 برنامجي في هذه اللحظة حساس لحالة الأحرف. 961 00:45:20,040 --> 00:45:22,790 إذا كتبتُ DAVID وجميع الأحرف كبيرة، فهذا يعني أنها سلسلة مختلفة 962 00:45:22,790 --> 00:45:25,460 أزعم في الوقت الحالي أن david مكتوبة كلها بأحرف صغيرة. 963 00:45:25,460 --> 00:45:27,590 إذا كنت تريد تجاوز حالة الأحرف الكبيرة والأحرف الصغيرة، 964 00:45:27,590 --> 00:45:29,090 فيجب عليك جعل الأمر منطقيًا أكثر. 965 00:45:29,090 --> 00:45:32,460 ولكن في الوقت الراهن هذا هو قرار التصميم الذي أريده. 966 00:45:32,460 --> 00:45:32,960 حسنًا. 967 00:45:32,960 --> 00:45:36,540 ما الذي أحتاج إلى إضافته إلى الملف أيضًا؟ 968 00:45:36,540 --> 00:45:38,057 نعم ، النموذج الأولي في الأعلى. 969 00:45:38,057 --> 00:45:41,140 يمكنك النسخ واللصق حرفيًا-- هذه هي المرة الوحيدة التي يكون فيها النسخ واللصق 970 00:45:41,140 --> 00:45:43,210 الشيء الصحيح للقيام به-- 971 00:45:43,210 --> 00:45:45,880 في الأعلى، ثم فاصلة منقوطة-- لا تقم بتنفيذ ذلك مجددًا. 972 00:45:45,880 --> 00:45:48,550 لكنني أحتاج إلى ملف رأس واحد آخر. 973 00:45:48,550 --> 00:45:54,740 أنا أستخدم دالة ليست في cs50.h أو في stdio.h. 974 00:45:54,740 --> 00:45:56,900 طول السلسلة؟ 975 00:45:56,900 --> 00:45:58,630 أين كان طول السلسلة؟ 976 00:45:58,630 --> 00:45:59,840 نعم، string.h. 977 00:45:59,840 --> 00:46:03,460 لذا أنا بحاجة فقط إلى هذا، بما في ذلك string.h، حفظ. 978 00:46:03,460 --> 00:46:05,510 الآن أعتقد أن هذا صحيح. 979 00:46:05,510 --> 00:46:08,190 سنرى ما إذا كنت أتذكر الكلمة الآن. 980 00:46:08,190 --> 00:46:10,700 ولكن اعلموا أنه إذا كنتم تكتبون هذه التعليمات البرمجية بأنفسكم، 981 00:46:10,700 --> 00:46:13,940 كهذه، فلن تكون كتابة برنامج في ساعات العمل 982 00:46:13,940 --> 00:46:16,648 أو في المنزل في غرفة نومكم وإنهاء ذلك بشكل صحيح من المرة الأولى أمرًا طبيعيًا. 983 00:46:16,648 --> 00:46:19,970 لقد وصلت إلى هذا بعد 20 عامًا من القيام بذلك، لذلك اعلموا أن هذا سيحدث-- 984 00:46:19,970 --> 00:46:21,720 ولدي أيضا ورقة غش هنا-- 985 00:46:21,720 --> 00:46:23,750 سيحدث أن نقوم بهذا بطريقة صحيحة غالبًا، 986 00:46:23,750 --> 00:46:26,010 ولكن لابد أن تدركوا أنها لن تكون مسألة مشتركة. 987 00:46:26,010 --> 00:46:28,490 لذا لنضع ذلك في الاعتبار، لنرى 988 00:46:28,490 --> 00:46:33,140 إذا كان يجب عليّ الآن تناول كل ذلك مجددًا. make compare2. 989 00:46:33,140 --> 00:46:33,860 حسنًا-- بكل سرور. 990 00:46:33,860 --> 00:46:34,700 لقد أثمرت تلك 20 عامًا. 991 00:46:34,700 --> 00:46:37,940 لذا الآن سأمضي قدمًا وأقوم بكتابة ./compare2. 992 00:46:37,940 --> 00:46:40,850 دعونا نكتب في براين، دعونا نكتب في فيرونيكا. 993 00:46:40,850 --> 00:46:42,800 آمل أن هؤلاء في الواقع ما يزالون مختلفين. 994 00:46:42,800 --> 00:46:45,680 الآن دعونا نجرب، ديفيد وديفيد. 995 00:46:45,680 --> 00:46:46,539 بكل سرور! 996 00:46:46,539 --> 00:46:47,330 إنهم نفس الشيء. 997 00:46:47,330 --> 00:46:52,550 والنقطة التي أشرت إليها، ديفيد مكتوبة بالأحرف الكبيرة وديفيد بالأحرف الصغيرة، 998 00:46:52,550 --> 00:46:56,780 مختلفين، لكن هذا ما أتوقعه الآن. 999 00:46:56,780 --> 00:46:58,071 أي أسئلة على compare2؟ 1000 00:46:58,071 --> 00:46:58,571 أجل؟ 1001 00:46:58,571 --> 00:47:01,833 الجمهور: [INAUDIBLE] 1002 00:47:01,833 --> 00:47:02,499 ديفيد مالان: حسنًا. 1003 00:47:02,499 --> 00:47:06,743 الجمهور: [INAUDIBLE] سلسلة في البرنامج وبشكل عام. 1004 00:47:06,743 --> 00:47:07,409 ديفيد مالان: حسنًا. 1005 00:47:07,409 --> 00:47:10,207 الجمهور: هل ما يزال هذا يعمل [INAUDIBLE] 1006 00:47:10,207 --> 00:47:12,290 ديفيد مالان: إذا كنت تشير إلى التعليمات البرمجية الصلبة للسلاسل؟ 1007 00:47:12,290 --> 00:47:14,000 إجابة مختصرة، نعم، التي ما تزال تعمل. 1008 00:47:14,000 --> 00:47:19,160 إذا كنت لأي سبب لم تقم بذلك واستخدمت get_string، 1009 00:47:19,160 --> 00:47:25,100 لكن يمكنك كتابة ديفيد، وهنا، على سبيل المثال، ديفيد، هذا من شأنه أن يعمل أيضًا. 1010 00:47:25,100 --> 00:47:28,088 ومهما كان خطأك، إذا تمكنت من إعادة إنشاؤه، فقط أخبرنا بذلك. 1011 00:47:28,088 --> 00:47:31,574 الجمهور: يبدو أنه مثل سلسلة يمكن أن تزيد 1012 00:47:31,574 --> 00:47:33,566 لمجموعة كانت [INAUDIBLE] فقط؟ 1013 00:47:33,566 --> 00:47:36,557 ولديها مشاكل في [INAUDIBLE]. 1014 00:47:36,557 --> 00:47:39,390 ديفيد مالان: يجب أن أراه لأتأكد، وسأكون سعيدًا بالتحدّث بعد ذلك. 1015 00:47:39,390 --> 00:47:42,090 حسنًا، دعونا نرى إذا لم نتمكّن الآن من تنظيف هذا 1016 00:47:42,090 --> 00:47:45,790 قليلاً فقط على النحو التالي. 1017 00:47:45,790 --> 00:47:51,160 دعوني أمضي قدمًا وأكتشف ماذا يحدث في الواقع. 1018 00:47:51,160 --> 00:47:53,997 لذا بالفعل، لا يوجد شيء مثل سلسلة. 1019 00:47:53,997 --> 00:47:55,830 وبالفعل، كما أشرت سابقًا منذ قليل، 1020 00:47:55,830 --> 00:47:57,371 إنه يحدث في الواقع تحت اسم مختلف. 1021 00:47:57,371 --> 00:48:01,150 السلسلة هي مجرد مرادف لما يسمى بـ char*. 1022 00:48:01,150 --> 00:48:02,440 الآن ما الذي يعنيه ذلك؟ 1023 00:48:02,440 --> 00:48:04,106 إذن char هو نفسه كما كان دائمًا. 1024 00:48:04,106 --> 00:48:05,160 إنه حرف واحد. 1025 00:48:05,160 --> 00:48:09,820 قد تعني النجمة في برنامج مكتوب في C بالطبع الضرب، 1026 00:48:09,820 --> 00:48:10,650 لقد رأينا ذلك. 1027 00:48:10,650 --> 00:48:12,270 إن هذا استخدام آخر للنجمة. 1028 00:48:12,270 --> 00:48:15,480 عندما تراها بعد نوع من البيانات مثل char، 1029 00:48:15,480 --> 00:48:19,500 هذا يعني أن نوع البيانات في السؤال ليس مجرد char، 1030 00:48:19,500 --> 00:48:21,750 إنه عنوان char. 1031 00:48:21,750 --> 00:48:25,330 لذا فإن النجمة تعني فقط عنوان نوع البيانات أيًا كان إلى اليسار، 1032 00:48:25,330 --> 00:48:27,330 وهذا هو، كما أشرتم سابقًا، ما 1033 00:48:27,330 --> 00:48:29,170 سنبدأ في تسميته مؤشر. 1034 00:48:29,170 --> 00:48:32,320 يُعد المؤشر، لجميع النوايا والأغراض، عنوانًا. 1035 00:48:32,320 --> 00:48:34,650 إنه مجرد كلمة طنانة لوصف عنوان. 1036 00:48:34,650 --> 00:48:40,380 يشير نوع البيانات هذا هنا، char*، إلى أنني أريد متغيرًا لا يُخزِّن char، 1037 00:48:40,380 --> 00:48:42,690 إنه يُخزِّن عنوان char. 1038 00:48:42,690 --> 00:48:45,360 الرقم 100، الرقم 900. 1039 00:48:45,360 --> 00:48:48,330 لكن هذا العنوان سنسميه فقط مؤشر. 1040 00:48:48,330 --> 00:48:52,440 متغير المؤشر هو متغير يُخزِّن عنوان شيء ما. 1041 00:48:52,440 --> 00:48:54,850 Char أو أنواع البيانات الأخرى أيضًا. 1042 00:48:54,850 --> 00:49:00,720 لذلك مع أخذ ذلك في الاعتبار، دعوني في الواقع وبسرعة أقوم بإنشاء compare3.c، ولصق هذا 1043 00:49:00,720 --> 00:49:05,670 وحفظه كـ compare3.c، ودعوني أخرِج، إذا صح التعبير، 1044 00:49:05,670 --> 00:49:06,750 عجلات التدريب تلك. 1045 00:49:06,750 --> 00:49:10,110 يتضح أنه عندما تحصل على سلسلة باستخدام get_string، 1046 00:49:10,110 --> 00:49:12,660 فهو لا يعيد سلسلة، في حد ذاته، لأن مجددًا، 1047 00:49:12,660 --> 00:49:16,620 هذه الكلمة غير موجودة في C، فهو يقوم فعليًا بإرجاع char*. 1048 00:49:16,620 --> 00:49:19,905 وعندما أكتبها هنا مجددًا وأقوم بإرجاع سلسلة أخرى، فإنه يعيد 1049 00:49:19,905 --> 00:49:21,090 char* أيضًا. 1050 00:49:21,090 --> 00:49:24,190 الآن من الناحية الفنية، يمكن أن توجد مسافات حول النجمة. 1051 00:49:24,190 --> 00:49:27,420 يكتب بعض الناس شيء كهذا، ولكن نوعًا ما الطريقة الصحيحة للقيام بذلك 1052 00:49:27,420 --> 00:49:30,750 أو الطريقة الافتراضية يجب أن تكون فقط بوضع النجمة بجانب الاسم المتغير 1053 00:49:30,750 --> 00:49:31,900 للتوضيح. 1054 00:49:31,900 --> 00:49:33,870 لذلك يجب أن أجري بعض التغييرات الأخرى. 1055 00:49:33,870 --> 00:49:37,770 يجب أن يتغير هذا أيضًا، لأنه لا يوجد المزيد من السلاسل اليوم. 1056 00:49:37,770 --> 00:49:41,700 سأقوم بتغيير هذا إلى char*؛ ومن ثم أحتاج أيضًا إلى تغييره هنا، 1057 00:49:41,700 --> 00:49:48,990 char*؛ ثم هنا، char*؛ وهذا هو في الواقع. 1058 00:49:48,990 --> 00:49:53,640 وبصراحة، السبب الوحيد وراء عدم تقديمنا هذا منذ أسبوعين تقريبًا 1059 00:49:53,640 --> 00:49:55,015 هو لأنه يبدو مشفرًا فقط. 1060 00:49:55,015 --> 00:49:58,181 لا أحد يريد أن يبرمج في أول مرة يلمس فيها لوحة المفاتيح 1061 00:49:58,181 --> 00:50:01,230 ويكتب تعليمة برمجية ويرى char* ويقلق حول ما يعنيه ذلك، 1062 00:50:01,230 --> 00:50:03,000 إنها مجرد سلسلة من الناحية النظرية. 1063 00:50:03,000 --> 00:50:06,450 لكن التغيير الوحيد الذي أحتاج إلى إجرائه من الناحية الفنية لإخراج عجلات التدريب تلك 1064 00:50:06,450 --> 00:50:11,139 هو فقط تغيير جميع إشارات السلسلة كأنواع البيانات إلى char*. 1065 00:50:11,139 --> 00:50:12,930 وهذا يعني ذلك فقط أتعلمون ماذا-- a؟ 1066 00:50:12,930 --> 00:50:17,160 نعم إنها سلسلة، لكن من الناحية الفنية إنها عنوان السلسلة. 1067 00:50:17,160 --> 00:50:21,720 أو بشكل أكثر دقة، هي عنوان أول بايت من السلسلة، 1068 00:50:21,720 --> 00:50:25,170 مثل 100 لبراين أو 900 لفيرونيكا، وأنا لن 1069 00:50:25,170 --> 00:50:28,950 أخبرك أين تنتهي السلسلة لأنك، كمبرمج، 1070 00:50:28,950 --> 00:50:32,460 يمكنك اكتشاف ذلك عن طريق كتابة strlen أو باستخدام التكرار الحلقي فقط 1071 00:50:32,460 --> 00:50:35,550 واكتشاف مكان خط مائل عكسي 0 في الواقع. 1072 00:50:35,550 --> 00:50:37,990 إذن هذه معلومات كافية لتمريرها. 1073 00:50:37,990 --> 00:50:41,910 لذا إذا مضيت قدمًا الآن وقمت بتحويل هذا برمجيًا، make compare3، 1074 00:50:41,910 --> 00:50:47,190 ومن ثم مضيت قدمًا وقمت بكتابة ./compare3، لنمضي قدمًا ونكتب في براين 1075 00:50:47,190 --> 00:50:49,770 وفيرونيكا، وهم في الواقع مختلفان. 1076 00:50:49,770 --> 00:50:53,662 الآن دعوني أمضي قدمًا واكتب في ديفيد وديفيد، وهما في الواقع الشيء نفسه. 1077 00:50:53,662 --> 00:50:56,370 لذا عجلات التدريب متوقفة، لا يوجد أي شيء كسلسلة، 1078 00:50:56,370 --> 00:50:57,560 من الآن فصاعدًا إنها char*. 1079 00:50:57,560 --> 00:51:00,060 دعونا نمضي قدما ونأخذ استراحة سريعة هنا لمدة خمس دقائق، 1080 00:51:00,060 --> 00:51:02,070 وسنعود ونتعمق في الأمر أكثر. 1081 00:51:02,070 --> 00:51:03,240 حسنًا. 1082 00:51:03,240 --> 00:51:06,630 لقد عدنا، دعونا نمضي قدمًا ونقوم بتبسيط هذا الآن، 1083 00:51:06,630 --> 00:51:07,710 كما تعودنا. 1084 00:51:07,710 --> 00:51:09,450 إنها نوعًا ما مجموعة من التعليمات البرمجية، ولكن أعتقد 1085 00:51:09,450 --> 00:51:10,610 أنه يمكننا أن نجعل هذا أكثر إحكامًا قليلاً. 1086 00:51:10,610 --> 00:51:12,434 ولكن بدلاً من كتابة هذا يدويًا، 1087 00:51:12,434 --> 00:51:14,850 دعوني أمضي قدمًا وأفتح فقط إحدى الأمثلة التي تم إعدادها مسبقًا 1088 00:51:14,850 --> 00:51:18,840 من اليوم، والتي توجد جميعها على موقع الويب الخاص بالدورة، باسم compare4. 1089 00:51:18,840 --> 00:51:21,540 وسترون في compare4، هذا هو الأمر. 1090 00:51:21,540 --> 00:51:23,670 ليس لدي سوى دالة رئيسية هذه المرة. 1091 00:51:23,670 --> 00:51:26,970 لقد تخلصت من دالة compare_strings الخاصة بي لأنه أتعلمون ماذا؟ 1092 00:51:26,970 --> 00:51:29,600 يبدو أنني سأستخدم شيئًا بدلاً من ذلك. 1093 00:51:29,600 --> 00:51:33,090 ما هي الدالة التي من الواضح أنني قمت بنشرها؟ 1094 00:51:33,090 --> 00:51:35,640 نعم، S-T-R-C-M-P، أو قد ينطقها شخص ما، 1095 00:51:35,640 --> 00:51:37,830 فقط str compare أو strcmp. 1096 00:51:37,830 --> 00:51:41,040 لذا هذا، مثل strlen، كما تسمى أيضًا بشكل مختصر، 1097 00:51:41,040 --> 00:51:43,650 وهي مجرد دالة يتم الإعلان عنها بالفعل 1098 00:51:43,650 --> 00:51:46,980 في إحدى مكتباتنا المألوفة في الأعلى، string.h، 1099 00:51:46,980 --> 00:51:49,960 ويتضح أنه إذا نظرنا في صفحة man، إذا جاز التعبير، 1100 00:51:49,960 --> 00:51:53,025 عن طريق كتابة man strcmp، أو إذا انتقلت إلى مرجع CS50 وقمت بالفعل 1101 00:51:53,025 --> 00:51:55,650 بالنظر إلى وصف أقل ارتياحًا للدالة هناك، 1102 00:51:55,650 --> 00:51:57,733 هذه مجرد دالة هدفها الوحيد في الحياة 1103 00:51:57,733 --> 00:51:59,730 هو مقارنة السلاسل من أجلك. 1104 00:51:59,730 --> 00:52:01,899 ولكن الأمر مختلف قليلاً في السلوك لأنه 1105 00:52:01,899 --> 00:52:03,690 أفضل قليلاً من الذي كتبته للتو. 1106 00:52:03,690 --> 00:52:07,860 دعوني أقوم بتكبير هذا، وسترون أن السطر 14 هنا، أنا 1107 00:52:07,860 --> 00:52:11,490 لا أعامله تمامًا بنفس الطريقة. 1108 00:52:11,490 --> 00:52:14,840 منطقى مختلف نوعًا ما. 1109 00:52:14,840 --> 00:52:20,102 ما الذي أتحقق منه فعليًا في تعبيري المنطقي هذه المرة؟ 1110 00:52:20,102 --> 00:52:21,459 الجمهور: [INAUDIBLE] 1111 00:52:21,459 --> 00:52:23,250 ديفيد مالان: نعم، وهو غريب بعض الشيء. 1112 00:52:23,250 --> 00:52:28,860 أنا أتحقق وبشكل صريح-- إذا كانت قيمة إرجاع strcmp يساوي-يساوي 0. 1113 00:52:28,860 --> 00:52:33,140 كما قلت للتو، إذا كان compare_strings s فاصلة 1114 00:52:33,140 --> 00:52:38,460 t، لأنني كنت أتوقع مجددًا قيمة منطقية-- صحيح أم خطأ. ويعمل strcmp، غريب نوعًا ما، 1115 00:52:38,460 --> 00:52:40,060 بالطريقة المعاكسة. 1116 00:52:40,060 --> 00:52:43,380 يتضح أن strcmp لا يعيد صحيح وخطأ. 1117 00:52:43,380 --> 00:52:48,120 إذا قمت بقراءة وثائقه، فهو يعيد 0 إذا كانت السلاسل متساوية، 1118 00:52:48,120 --> 00:52:52,120 لكن بشكل سهل للغاية، فهو يعيد قيمة موجبة 1119 00:52:52,120 --> 00:52:56,190 إذا كان من المفترض أن تأتي s قبل t، ويعيد قيمة سالبة 1120 00:52:56,190 --> 00:52:59,950 إذا كان من المفترض أن تأتي s بعد t أبجديًا. 1121 00:52:59,950 --> 00:53:03,270 لذا يتضح أنه يمكنكم استخدام strcmp ليس فقط للمقارنة من أجل التعادل، 1122 00:53:03,270 --> 00:53:04,530 ولكن أيضًا لعدم التعادل-- 1123 00:53:04,530 --> 00:53:05,760 أقل من أو يساوي-- 1124 00:53:05,760 --> 00:53:08,880 أقل من أو أكبر من، إذا جاز التعبير، أبجديًا، 1125 00:53:08,880 --> 00:53:10,810 أو في ترتيب ASCII، إذا جاز التعبير. 1126 00:53:10,810 --> 00:53:13,860 سيقارن حرف بحرف في الواقع بقيم ASCII، 1127 00:53:13,860 --> 00:53:16,050 وسيُؤكد على أن B تأتي بعد A، 1128 00:53:16,050 --> 00:53:18,430 وC بعد B، وهكذا. 1129 00:53:18,430 --> 00:53:20,940 لذا يمكنك بالفعل استخدام strcmp إلى حد ما كقاموس، 1130 00:53:20,940 --> 00:53:24,310 أو لترتيب جهات الاتصال في جهاز iPhone الخاص بك أو هاتف Android الخاص بك. 1131 00:53:24,310 --> 00:53:27,090 لذا القصة الطويلة باختصار، هذه دالة يمكننا استخدامها، 1132 00:53:27,090 --> 00:53:30,120 لسنا مضطرين لإعادة ابتكار هذه العجلة، وبالتالي، ليس لدينا المزيد من التعليمات البرمجية 1133 00:53:30,120 --> 00:53:30,840 حتى بعد هذا. 1134 00:53:30,840 --> 00:53:33,810 علينا فقط استخدامه بشكل صحيح، وتوجد، هذه الوثائق 1135 00:53:33,810 --> 00:53:34,720 فهي بمثابة صديق لك. 1136 00:53:34,720 --> 00:53:37,770 لذا إذا قمت بتشغيل هذا البرنامج، فسيعمل بنفس الطريقة بالضبط، 1137 00:53:37,770 --> 00:53:40,590 لذا دعوني أمضي قدمًا وأقوم بتوضيح بعض الأخطاء. 1138 00:53:40,590 --> 00:53:44,820 يتضح أنه طوال هذا الوقت، كنت كسولاً قليلاً ولم أفحص أخطائي-- 1139 00:53:44,820 --> 00:53:46,200 فحص الأخطاء. 1140 00:53:46,200 --> 00:53:49,635 توجد مجموعة كاملة من الأشياء التي يمكن أن تسوء في الأسبوع الأول من دورة CS50 1141 00:53:49,635 --> 00:53:52,260 ولم نتناولها، لأنها من شأنها فقط 1142 00:53:52,260 --> 00:53:56,091 أن تنقد تعليماتنا البرمجية، وتجعلها أطول وأقل إثارة للاهتمام ومتعة في الكتابة 1143 00:53:56,091 --> 00:53:57,090 ومفهومة بشكل أقل نوعًا ما. 1144 00:53:57,090 --> 00:53:59,776 ولكن اليوم، الآن نعرف ماذا يحدث في الواقع، 1145 00:53:59,776 --> 00:54:01,650 يمكننا أن نبدأ في طرح بعض الأسئلة الإضافية 1146 00:54:01,650 --> 00:54:04,020 ونجعل تعليماتنا البرمجية أقوى وأكثر متانة لذلك 1147 00:54:04,020 --> 00:54:05,820 لن يسوء شيء في الواقع. 1148 00:54:05,820 --> 00:54:08,940 يتضح أن، إذا قرأت وثائق get_string في صفحة man 1149 00:54:08,940 --> 00:54:11,880 أو في مرجع CS50، يتضح أن get_string 1150 00:54:11,880 --> 00:54:14,010 يعيد سلسلة-- أوه، ليس تمامًا. 1151 00:54:14,010 --> 00:54:15,690 إنه يعيد عنوان السلسلة. 1152 00:54:15,690 --> 00:54:16,380 أوه، ليس تمامًا. 1153 00:54:16,380 --> 00:54:22,230 إنه يعيد عنوان أول بايت من السلسلة، من الناحية الفنية. 1154 00:54:22,230 --> 00:54:26,700 ولكن إذا حدث خطأ ما، فسيعيد حرفًا خاصًا باسم فارغ. 1155 00:54:26,700 --> 00:54:32,230 وينبغي عدم الخلط مع NUL، فهو يعيد عنوان خاص باسم فارغ-- 1156 00:54:32,230 --> 00:54:34,510 اليد اليسرى لا تشبه اليد اليمنى منذ عقود. 1157 00:54:34,510 --> 00:54:41,100 لذا فارغ، ف-ا-ر-غ، تعني فقط العنوان 0، الذي لا يجب أن يوجد في أي شيء على الإطلاق. 1158 00:54:41,100 --> 00:54:44,190 إنه مجرد وهم، عنوان غير صالح. 1159 00:54:44,190 --> 00:54:49,200 طالما يعيد get_string عنوان السلسلة في الذاكرة، 1160 00:54:49,200 --> 00:54:53,760 مثل 100 لبراين أو 900 لفيرونيكا، إذا حدثت 1161 00:54:53,760 --> 00:54:56,640 مشكلة في get_string وحدث خطأ بجهاز الكمبيوتر، 1162 00:54:56,640 --> 00:55:01,830 إذا أعاد 0، على وجه التحديد 0، المعروف أيضًا بهذا الاسم. 1163 00:55:01,830 --> 00:55:07,470 فارغ-- ف-ا-ر-غ، ثم يمكنك اكتشاف حدوث خطأ ما. 1164 00:55:07,470 --> 00:55:10,089 إذن للقيام بذلك، سيكون الأمر مملاً قليلاً، 1165 00:55:10,089 --> 00:55:11,880 لكنه مع ذلك الشيء الصحيح الذي ينبغي عمله، 1166 00:55:11,880 --> 00:55:14,430 أحتاج أن أكون أكثر دفاعية قليلاً. 1167 00:55:14,430 --> 00:55:21,270 إذا كان s يساوي-يساوي فارغ، وإلا يُعرف باسم 0، وإلا يُعرف أيضًا باسم 0x0، 1168 00:55:21,270 --> 00:55:23,160 ولكنني سأكتبه بطريقة تقليدية كهذا، 1169 00:55:23,160 --> 00:55:27,270 سأمضي قدمًا وأعيد 1 كتعليمات الخروج البرمجية الخاصة بي. 1170 00:55:27,270 --> 00:55:32,370 إذا كان t يساوي-يساوي فارغ، فسأمضي قدمًا وأُعيد 1 كتعليمات الخروج البرمجية الخاصة بي، 1171 00:55:32,370 --> 00:55:34,140 أو يمكنني إعادة 2 أو 3-- 1172 00:55:34,140 --> 00:55:36,952 أنا فقط بحاجة إلى إعادة القيمة للإشارة إلى الكمبيوتر 1173 00:55:36,952 --> 00:55:38,910 أن هناك خطأ ما، لكن بشكل افتراضي سنعيد 1174 00:55:38,910 --> 00:55:43,410 فقط 1 كلما حدث خطأ، لكن إذا سار كل شيء بشكل جيد، 1175 00:55:43,410 --> 00:55:44,910 سأمضي قدمًا وأُعيد 0. 1176 00:55:44,910 --> 00:55:47,580 لذا لنتذكر مجددًا من الأسبوع الماضي، ولم نقضي الكثير من الوقت 1177 00:55:47,580 --> 00:55:48,300 في هذا-- 1178 00:55:48,300 --> 00:55:50,340 يمكن أن يعيد main القيم بنفسه. 1179 00:55:50,340 --> 00:55:53,790 بشكل افتراضي، منذ الأسبوع 1، إذا لم تقم بإعادة أي شيء، 1180 00:55:53,790 --> 00:55:58,200 يعيد main بشكل تلقائي وسري 0 لك لأن 0 أمرٌ جيد. 1181 00:55:58,200 --> 00:56:02,079 السبب وراء 0 هو وجود 0 واحد فقط في العالم، بالتأكيد، 1182 00:56:02,079 --> 00:56:03,870 ولكن يوجد عدد لا حصر له على اليسار 1183 00:56:03,870 --> 00:56:06,900 وهناك عدد لا حصر له على اليمين، سالب وموجب. 1184 00:56:06,900 --> 00:56:09,340 هذا عظيم، لأنه كما جربت في الأسابيع القليلة الماضية، 1185 00:56:09,340 --> 00:56:11,640 بدا الامر وكأن هناك عدد لا حصر له من الأشياء التي يمكن أن تسوء عندما 1186 00:56:11,640 --> 00:56:13,410 تكتب حتى أقصر البرامج. 1187 00:56:13,410 --> 00:56:17,190 وهذا يعني أن لدينا الكثير من الأرقام التي يمكننا تعيينها لتعليمات الخطأ البرمجية، 1188 00:56:17,190 --> 00:56:18,250 إذا جاز التعبير. 1189 00:56:18,250 --> 00:56:20,670 الآن لا يهمني حقًا ما هي تعليمات الخطأ البرمجية، 1190 00:56:20,670 --> 00:56:23,340 لذا سأتبنى التقليد البشري في هذه اللحظة-- 1191 00:56:23,340 --> 00:56:27,480 إذا حدث أي خطأ، فسيُعيد أي شيء آخر بخلاف 0. 1192 00:56:27,480 --> 00:56:31,650 ولذا سأقوم بإعادة 1 هنا، ولكن إذا حدث أي خطأ، سأعيد 0. 1193 00:56:31,650 --> 00:56:36,720 المغزى هنا أنه بإضافة هذه السطور الثلاثة هنا وهذه السطور الثلاثة 1194 00:56:36,720 --> 00:56:38,790 هنا، سأتجنب ما يُسمّى 1195 00:56:38,790 --> 00:56:42,210 بخطأ تجزئة أو segfault. هل واجه أحدكم 1196 00:56:42,210 --> 00:56:43,590 هذا الخطأ المشفر؟ 1197 00:56:43,590 --> 00:56:44,130 حسنًا. 1198 00:56:44,130 --> 00:56:46,920 إذن، عدد لا بأس به منكم، وإذا لم يكن لديكم أي فكرة عما يعنيه ذلك، 1199 00:56:46,920 --> 00:56:49,380 ولكن بدءًا من اليوم سيكون أكثر قليلاً، وخلال الأسابيع القادمة، 1200 00:56:49,380 --> 00:56:50,790 ستستوعبون ذلك أكثر. 1201 00:56:50,790 --> 00:56:54,690 يشير خطأ التجزئة إلى أنك تطرقت إلى الذاكرة التي لا يجب أن تملكها. 1202 00:56:54,690 --> 00:56:58,050 أو حدث خطأ ما ولم تكتشفه. 1203 00:56:58,050 --> 00:57:01,320 إنه عبارة شاملة للمشاكل المتعلقة بالذاكرة. 1204 00:57:01,320 --> 00:57:03,960 هذا يساعد على تجنب تلك الأنواع من الأخطاء. 1205 00:57:03,960 --> 00:57:06,690 إنها ليست الطريقة الوحيدة، ولكنها إحدى هذه الطرق. 1206 00:57:06,690 --> 00:57:09,330 لذا لنبدأ اليوم مع برامج مجموعة المشاكل وأي شيء 1207 00:57:09,330 --> 00:57:12,090 تكتبه في الدورة، ستحتاج دائمًا إلى التفكير بشأنه، 1208 00:57:12,090 --> 00:57:14,647 حتى لو رجعت وأضفته في وقت لاحق، هل يمكن أن يسوء هذا؟ 1209 00:57:14,647 --> 00:57:16,313 هل يمكن أن يسوء هذا؟ 1210 00:57:16,313 --> 00:57:18,197 وأضف فقط بعض ماذا لو إضافية وماذا لو أخرى 1211 00:57:18,197 --> 00:57:21,280 وتعامل مع هذه المواقف بحيث لا يحدث خطأ ببرنامجك 1212 00:57:21,280 --> 00:57:25,260 أو segfault أو تفاجئ الشخص الذي يستخدمه بالفعل. 1213 00:57:25,260 --> 00:57:28,410 حسنًا، دعونا نلقي نظرة على مثال أخير، 1214 00:57:28,410 --> 00:57:30,300 لأنه وبصراحة هذا ممل بعض الشيء. 1215 00:57:30,300 --> 00:57:32,110 سأمضي قدمًا وأفتح-- 1216 00:57:32,110 --> 00:57:34,590 ويمكن العثور على هذا الملف في compare5.c. 1217 00:57:34,590 --> 00:57:39,120 دعوني أمضي قدمًا وأحفظ هذا حتى نحصل عليه-- compare5.c. 1218 00:57:39,120 --> 00:57:41,095 سأطرح مثال مقارنة أخير. 1219 00:57:41,095 --> 00:57:43,800 سأقوم بحفظ هذا كـ compare6.c. 1220 00:57:43,800 --> 00:57:46,020 تبين أن البشر مثل موجزاتهم. 1221 00:57:46,020 --> 00:57:50,890 وفارغ، لأنه من الناحية الفنية العنوان 0، 1222 00:57:50,890 --> 00:57:52,920 يمكنك في الواقع أن تكون أكثر ذكاءً. 1223 00:57:52,920 --> 00:57:59,430 إذا لم يكن s وإذا لم يكن t طريقة كافية للتعبير عن تلك الأشياء نفسها. 1224 00:57:59,430 --> 00:58:00,960 والسبب هو ما الذي تفعله إشارة التنبيه؟ 1225 00:58:00,960 --> 00:58:04,050 علامة التعجب في التعليمة البرمجية إذا كنتم تذكرون؟ 1226 00:58:04,050 --> 00:58:05,170 إنها تعكس شيئًا ما. 1227 00:58:05,170 --> 00:58:11,725 لذا فكما لو أن هذا يقول، إذا كانت s ليست 0، كما هو معروف، إذا كانت s ليست فارغة، أو بالأحرى-- 1228 00:58:15,210 --> 00:58:18,005 إذن-- أنا في حيرة الآن. 1229 00:58:18,005 --> 00:58:18,505 نعم. 1230 00:58:18,505 --> 00:58:21,910 فلو أني، كما قلتُ للتو، إذا كانت s، فهي إذن عنوان صالح 1231 00:58:21,910 --> 00:58:23,750 ويجب أن أمضي قدمًا في عملي. 1232 00:58:23,750 --> 00:58:28,300 ولكن إذا لم تكن s أو إذا كانت s فارغة، فأنا أريد 1233 00:58:28,300 --> 00:58:31,240 المضي قدمًا وإرجاع 1 لأنه يوجد خطأ، وتوقف هنا أيضًا. 1234 00:58:31,240 --> 00:58:33,910 لذا في أي وقت تتحقق فيه مما إذا كان هناك شيء ما يساوي قيمة فارغة، 1235 00:58:33,910 --> 00:58:37,390 فيمكنك جعلها أكثر إيجازًا وذلك فقط بقول إذا لم تكن s؛ إذن فهي فارغة، 1236 00:58:37,390 --> 00:58:38,020 فيتم إرجاع 1. 1237 00:58:38,020 --> 00:58:39,190 إذا كانت فارغة، فيتم إرجاع 1. 1238 00:58:39,190 --> 00:58:42,680 إنها مجرد اختزال لبناء الجملة. 1239 00:58:42,680 --> 00:58:43,180 أُف! 1240 00:58:43,180 --> 00:58:45,100 كان علي التفكير بشأن هذا الواحد. 1241 00:58:45,100 --> 00:58:45,820 أي أسئلة؟ 1242 00:58:45,820 --> 00:58:53,160 الجمهور: لماذا سيقوم [INAUDIBLE] بتخزين بعض [INAUDIBLE] 1243 00:58:53,160 --> 00:58:54,280 ديفيد مالان: صحيح. 1244 00:58:54,280 --> 00:58:58,020 أنت تخزن عنوانًا، ولكن إذا كان ذلك العنوان 0. 1245 00:58:58,020 --> 00:59:04,300 فرضًا إذا لم يكن 0، فإن 0 كأنها خطأ، لذلك فقول ليس خطأ تعني صحيح، 1246 00:59:04,300 --> 00:59:07,990 وبالتالي فإن لها تأثير عكس الدالة المنطقية. 1247 00:59:07,990 --> 00:59:08,590 هذا كل شيء. 1248 00:59:08,590 --> 00:59:12,570 في أي وقت تستخدم فيه إشارة تنبيه أو علامة تعجب، فإنها تغيّر 0 إلى non-0 "ليس صفرًا"-- 1249 00:59:12,570 --> 00:59:14,955 الجمهور: [INAUDIBLE]، ولكن حتى-- 1250 00:59:14,955 --> 00:59:20,820 لو أني لا أفهم لماذا يقوم [INAUDIBLE] بتضمين أنه [INAUDIBLE].. 1251 00:59:20,820 --> 00:59:22,820 ديفيد مالان: حتى تتمكن من التفكير فيه بهذه الطريقة. 1252 00:59:22,820 --> 00:59:24,725 إذا كانت s-- كان لدينا هذا سابقًا. 1253 00:59:24,725 --> 00:59:30,350 إذا كانت s تساوي تساوي قيمة فارغة كأن نقول إذا كانت s تساوي 0 حرفيًا. 1254 00:59:30,350 --> 00:59:32,480 ويمكنك نوعًا ما التفكير في ذلك بشكل رسمي كما 1255 00:59:32,480 --> 00:59:34,970 لو كانت s ليس بها مؤشر صالح-- 1256 00:59:34,970 --> 00:59:38,110 0 ليست نقطة صالحة أو أنها ليست عنوانًا صالحًا حسب التعريف. 1257 00:59:38,110 --> 00:59:42,450 100 صالحة، 900 صالحة، 0 غير صالحة فقط حسب التقليد البشري. 1258 00:59:42,450 --> 00:59:46,680 إذن فهذا كقول، إذا كانت s ليست لها قيمة، فهي صالحة. 1259 00:59:46,680 --> 00:59:52,130 إذن لنقل باختصار، إذا لم تكن s، 1260 00:59:52,130 --> 00:59:55,040 وهو مجرد اختصار لذلك فهي طريقة أخرى للتفكير في الأمر. 1261 00:59:55,040 --> 00:59:58,270 حسنًا، دعونا نلقي نظرة على برنامج مختلف آخر، 1262 00:59:58,270 --> 01:00:02,070 لكن هذا يكشف عن النوع نفسه من المشكلات على النحو التالي. 1263 01:00:02,070 --> 01:00:05,030 سأمضي قدمًا وأفتح مثالاً يُسمّى 1264 01:00:05,030 --> 01:00:09,410 copy0، هدفه في الحياة لحسن الحظ هو نسخ سلسلة. 1265 01:00:09,410 --> 01:00:11,690 لذلك لاحظ أنه في برنامجي هنا، والذي 1266 01:00:11,690 --> 01:00:15,440 كتبتُه مقدّمًا، أحصل على سلسلة من المستخدم في السطر 11، 1267 01:00:15,440 --> 01:00:17,240 وأقوم بتخزينها في سلسلة تسمى s. 1268 01:00:17,240 --> 01:00:20,210 يمكنني تغيير هذا إلى char* الآن، ولكننا نعرف ما هو. 1269 01:00:20,210 --> 01:00:24,560 وسأمضي قدمًا وأنسخ عنوان السلسلة من s إلى t. 1270 01:00:24,560 --> 01:00:29,370 ثم سأقول، إذا كان طول t أكبر من 0، 1271 01:00:29,370 --> 01:00:31,620 فمن ثم يتم المضي قدمًا والقيام فقط بجعل الحرف الأول كبيرًا. 1272 01:00:31,620 --> 01:00:32,660 لذا فهو مبهم قليلاً، لكنك ربما فعلت 1273 01:00:32,660 --> 01:00:35,120 شيئًا من هذا القبيل مع Caesar ومع التعامل الأخير 1274 01:00:35,120 --> 01:00:35,930 مع السلسلة. 1275 01:00:35,930 --> 01:00:38,810 هذا لمجرد التأكد، هل لدي حرف واحد على الأقل؟ 1276 01:00:38,810 --> 01:00:42,340 وإذا كان الأمر كذلك، فإن الحرف الأول هو t قوس 0، كما تذكرون. 1277 01:00:42,340 --> 01:00:45,554 toupper دالة في ctype.h من الأسبوع الماضي 1278 01:00:45,554 --> 01:00:46,970 تقوم فقط بجعل هذا الحرف كبيرًا. 1279 01:00:46,970 --> 01:00:50,060 إذن هذا السطر من التعليمة البرمجية، 19، يقوم فقط بجعل الحرف الأول كبيرًا 1280 01:00:50,060 --> 01:00:51,232 في t، وهذا كل شيء. 1281 01:00:51,232 --> 01:00:54,440 ثم في النهاية نقوم فقط بطباعة ما يمثله s وطباعة ما يمثله t. 1282 01:00:54,440 --> 01:00:55,010 هذا كل شيء. 1283 01:00:55,010 --> 01:00:59,390 إذن هذا البرنامج ينسخ فقط s إلى t، ويجعل أحرف t كبيرة، وهذا كل شيء. 1284 01:00:59,390 --> 01:01:02,339 إذن دعوني أمضي قدمًا وأقوم بتنفيذ make copy0. 1285 01:01:02,339 --> 01:01:03,630 هذا في التعليمة البرمجية الخاصة بنا من هذا اليوم. 1286 01:01:03,630 --> 01:01:07,340 لذلك سأقوم بتنفيذ cd sc3، لأنني كتبتُه بالفعل في هذا الدليل. 1287 01:01:07,340 --> 01:01:08,975 make copy0. 1288 01:01:08,975 --> 01:01:12,810 سار الأمر على ما يرام. ./copy0. 1289 01:01:12,810 --> 01:01:17,240 دعوني أمضي قدمًا وأكتب tj مرة أخرى بالحروف الصغيرة. 1290 01:01:17,240 --> 01:01:18,270 إدخال. 1291 01:01:18,270 --> 01:01:19,760 ها. 1292 01:01:19,760 --> 01:01:21,939 TJ ،TJ-- كلاهما أصبحا كبيرين. 1293 01:01:21,939 --> 01:01:24,230 حسنًا، ربما إنه مجرد شيء غريب مع الأحرف الأولى. 1294 01:01:24,230 --> 01:01:28,520 لذلك دعونا فقط نجرّب Veronica، كلها أحرف صغيرة. 1295 01:01:28,520 --> 01:01:30,140 ها، هذا بالتأكيد حرف كبير. 1296 01:01:30,140 --> 01:01:32,720 دعونا نوضح فارقًا أكثر وضوحًا، Brian حيث 1297 01:01:32,720 --> 01:01:35,070 إن حرف B سيبدو مختلفًا حقًا. 1298 01:01:35,070 --> 01:01:38,270 ومع ذلك أنا فقط أقوم بجعل حرف t كبيرًا. 1299 01:01:38,270 --> 01:01:40,580 حسنًا دعونا نفكر ماذا يحدث هنا فعلاً. 1300 01:01:40,580 --> 01:01:46,080 في هذه الحالة، عندما أحصل على سلسلة من المستخدم، s وt، وأقوم بالكتابة، 1301 01:01:46,080 --> 01:01:51,020 على سبيل المثال، brian بالأحرف الصغيرة كلها، /0، وهذه، بالطبع، 1302 01:01:51,020 --> 01:01:54,710 مجرد مصفوفة غير ظاهرة. 1303 01:01:54,710 --> 01:01:56,150 وهذه تستهلك حوالي ست وحدات بايت هنا. 1304 01:01:56,150 --> 01:01:58,922 وعندما أقوم بالتخزين في s، فإن s عبارة عن سلسلة. 1305 01:01:58,922 --> 01:01:59,630 لذلك أتعرفون ما الأمر؟ 1306 01:01:59,630 --> 01:02:00,671 نحن لم نفعل هذا من قبل. 1307 01:02:00,671 --> 01:02:05,300 دعوني في الواقع أقوم بإنشاء متغير، جزء من الذاكرة لـ s وأسمّيه s. 1308 01:02:05,300 --> 01:02:07,760 و لنفترض أن Brian موجود تحديدًا حيثما كان من قبل-- 1309 01:02:07,760 --> 01:02:13,230 100، و101، و102، و103، و104، و105. 1310 01:02:13,230 --> 01:02:18,110 لذا إذا كانت s تساوي get_string وكانت get_string تقوم بإرجاع Brian، 1311 01:02:18,110 --> 01:02:21,626 فما الذي أكتبه في المربع المُسمى s؟ 1312 01:02:21,626 --> 01:02:22,820 نعم، فقط 100، أليس كذلك؟ 1313 01:02:22,820 --> 01:02:24,780 هذا كل ما سيحدث طوال هذا الوقت 1314 01:02:24,780 --> 01:02:27,050 حتى رغم أننا لم نتحدث عنه في هذا المستوى. 1315 01:02:27,050 --> 01:02:30,920 وفي الواقع، يتضح أنه-- يمكن استخدام المؤشر فعليًا بشكل تصويري. 1316 01:02:30,920 --> 01:02:34,940 إذا كنت تفضل فعلاً أن تفكر حول مؤشر كعنوان 1317 01:02:34,940 --> 01:02:37,957 أو نوعًا ما كخريطة تقودك إلى مكانٍ ما، فبطريقة أخرى يمكن لأي شخص 1318 01:02:37,957 --> 01:02:40,040 عادةً أن يرسم مؤشرًا-- لأنه بصراحة، 1319 01:02:40,040 --> 01:02:41,960 من يهتم حقًا أن Brian موجود في العنوان 100؟ 1320 01:02:41,960 --> 01:02:45,230 فمثل ذلك يعد طريقة ذات مستوى منخفض للغاية، من مستوى برامج الأسبوع 0. 1321 01:02:45,230 --> 01:02:46,820 إنه يشير فقط هناك. 1322 01:02:46,820 --> 01:02:49,190 لذلك s هو مؤشر إلى ذلك الجزء من الذاكرة. 1323 01:02:49,190 --> 01:02:52,640 يصادف أن يكون 100، أيًا كان، والسهم هو الطريقة التي ستقوم 1324 01:02:52,640 --> 01:02:56,060 بها حرفيًا للإشارة إلى جزء الذاكرة إذا كنت ترسم هذا على بعض الملاحظات. 1325 01:02:56,060 --> 01:02:57,710 لذا، فذلك، أيضًا، صحيح. 1326 01:02:57,710 --> 01:03:00,980 لذلك تنشأ المشكلة هنا مع ذلك السطر من التعليمة البرمجية. 1327 01:03:00,980 --> 01:03:07,280 عندما أحاول فعليًا نسخ s وتخزينها في t، فكّر ماذا سيحدث. 1328 01:03:07,280 --> 01:03:10,830 الجانب الأيمن هو فقط قيمة s، والتي تصادف أن تكون 100. 1329 01:03:10,830 --> 01:03:13,460 الجانب الأيسر هو مجرد قول، يا كمبيوتر، أعطني 1330 01:03:13,460 --> 01:03:16,760 متغيرًا آخر، أول سلسلة، وسمّها t. 1331 01:03:16,760 --> 01:03:19,730 إذن فذلك كقول، يا، كمبيوتر، أعطني جزءًا آخر من الذاكرة، 1332 01:03:19,730 --> 01:03:22,766 وسمّه t، ثم قم بتخزين s فيه. 1333 01:03:22,766 --> 01:03:24,140 لكن ماذا يعني تخزين s؟ 1334 01:03:24,140 --> 01:03:27,800 حسنًا ما قيمة s في هذه المرحلة؟ 1335 01:03:27,800 --> 01:03:30,140 إنها المؤشر إلى Brian، أو إنها من الناحية التقنية-- 1336 01:03:30,140 --> 01:03:34,000 سأكتب كليهما فقط من أجل الشمولية-- هي حرفيًا العدد 100. 1337 01:03:34,000 --> 01:03:39,720 لذا إذا جعلتَ t تساوي s، فهذا كقول وضع 100 هناك أيضًا، 1338 01:03:39,720 --> 01:03:42,580 وبشكلٍ تصويري كقول هذا. 1339 01:03:42,580 --> 01:03:46,860 عند هذه النقطة من القصة، عندما أنسخ s إلى t، 1340 01:03:46,860 --> 01:03:48,540 قام الكمبيوتر بنقلي حرفيًا. 1341 01:03:48,540 --> 01:03:51,390 إنه قام بنسخ s في t، ولكن ما هي s؟ 1342 01:03:51,390 --> 01:03:52,470 إنها العنوان فقط. 1343 01:03:52,470 --> 01:03:56,800 إنها ليست B-R-I-A-N خط مائل عكسي 0، إنها مجرد العنوان. 1344 01:03:56,800 --> 01:04:00,810 لذا عندما أقول بعد ذلك، t قوس 0 يحصل على toupper-- 1345 01:04:00,810 --> 01:04:02,370 لذلك دعونا ننظر إلى هذا السطر من التعليمة البرمجية. 1346 01:04:02,370 --> 01:04:04,590 هذا السطر من التعليمة البرمجية هنا الذي تم تظليله، 1347 01:04:04,590 --> 01:04:07,740 عندما أقول انتقل إلى الحرف صاحب الترتيب رقم 0 في t وقم بتخزين 1348 01:04:07,740 --> 01:04:11,962 نسخة الأحرف الكبيرة من نفس ذلك الحرف، فما عليك سوى اتباع الأسهم. 1349 01:04:11,962 --> 01:04:13,920 إذا سبق لك أن لعبت السلم والثعبان وأنت طفل، 1350 01:04:13,920 --> 01:04:16,253 فأنت نوعًا ما كنت تتبع الأسهم، لترى أين ينتهي بك المطاف. 1351 01:04:16,253 --> 01:04:19,750 t قوس 0 هو هذا الموقع هنا، لأنه مرةً أخرى، 1352 01:04:19,750 --> 01:04:22,330 إذا كان هذا جزءًا من الذاكرة، فإنه حسب الأسبوع الماضي يعتبر مصفوفة، 1353 01:04:22,330 --> 01:04:26,580 لذا يمكنك التفكير في هذا أيضًا كقوس 0، هذا قوس 1، 1354 01:04:26,580 --> 01:04:30,460 هذا قوس 2، وهكذا دواليك. 1355 01:04:30,460 --> 01:04:31,600 لذلك إنها مجرد مصفوفة. 1356 01:04:31,600 --> 01:04:36,810 لذا يكون t قوس 0 عبارة عن حرف b صغير، ودالة toupper لحرف b صغير، 1357 01:04:36,810 --> 01:04:40,650 بالتأكيد، تغيِّر حرف b الصغير هذا إلى حرف B كبير. لكن الآن 1358 01:04:40,650 --> 01:04:43,220 كلاً من s وt لا يزالان يشيران إلى نفس الجزء من الذاكرة، 1359 01:04:43,220 --> 01:04:47,620 لذا بالتأكيد فإن كلاً من s وt سيمثلان Brian بأحرفٍ كبيرة، 1360 01:04:47,620 --> 01:04:51,000 أو TJ أيضًا في المثال الأول لديّ. 1361 01:04:51,000 --> 01:04:57,260 أي أسئلة على الجزء الذي انتهينا منه للتو ولماذا حدث ذلك؟ 1362 01:04:57,260 --> 01:04:59,100 حسنًا، إذن بديهيًا ما هو الإصلاح؟ 1363 01:04:59,100 --> 01:05:01,100 ألا يهم ما إذا لم تكن لديك فكرة عن كيفية تشفيره، 1364 01:05:01,100 --> 01:05:04,880 مثل ما يتعين علينا القيام به في الأساس لنسخ سلسلة، وليس 1365 01:05:04,880 --> 01:05:06,572 نسخ عنوان؟ 1366 01:05:06,572 --> 01:05:08,830 الجمهور: [INAUDIBLE] 1367 01:05:08,830 --> 01:05:10,136 ديفيد مالان: إنشاء أي جديد؟ 1368 01:05:10,136 --> 01:05:12,500 الجمهور: في الأساس إنشاء [INAUDIBLE].. 1369 01:05:12,500 --> 01:05:13,250 ديفيد مالان: أجل. 1370 01:05:13,250 --> 01:05:15,249 إنشاء نفس السلسلة في جزء جديد من الذاكرة. 1371 01:05:15,249 --> 01:05:17,970 ما أحتاج القيام به فعلاً هو تخصيص أو إعطاء 1372 01:05:17,970 --> 01:05:21,720 جزء من حجم أكبر من الذاكرة لنفسي بحجم كبير مثل Brian، 1373 01:05:21,720 --> 01:05:24,750 تتضمن /0 الخاصة به. 1374 01:05:24,750 --> 01:05:28,450 ثم من الناحية المنطقية أحتاج لنسخ كل حرف في ذلك الجزء. 1375 01:05:28,450 --> 01:05:31,020 لذا إذا رجعت إلى الأصل لديّ عندما كان حرف b صغيرًا، 1376 01:05:31,020 --> 01:05:34,080 فأنا بحاجة لعمل نسخة منطقيًا باستخدام تكرار حلقي من نوع for loop أو من نوع while loop 1377 01:05:34,080 --> 01:05:35,130 أو أيًا كان ما تفضله-- 1378 01:05:35,130 --> 01:05:42,990 B-R-I-A-N خط مائل عكسي 0، لذلك فعندما أنسخ السلسلة ثم أقوم بتخزينها في t، 1379 01:05:42,990 --> 01:05:45,480 فإنها لا تقوم بنسخ s حرفيًا. 1380 01:05:45,480 --> 01:05:49,540 ودعونا نفترض أنه ينتهي عند الموقع 300 فقط بشكل تعسفي-- 1381 01:05:49,540 --> 01:05:51,010 ليكوّن فقط أرقامًا سهلة. 1382 01:05:51,010 --> 01:05:54,780 والآن t تخزن 300، وتشير إلى هنا. 1383 01:05:54,780 --> 01:05:59,370 لذلك عندما أقوم بتنفيذ هذا السطر في هذا الإصدار من القصة، فإن t قوس 0 1384 01:05:59,370 --> 01:06:02,250 تحصل على toupper، فما الذي أفعله في الواقع؟ 1385 01:06:02,250 --> 01:06:04,440 أقوم باتباع سهم مختلف هذه المرة 1386 01:06:04,440 --> 01:06:08,280 لأنني أعطيت نفسي جزءًا مختلفًا من الذاكرة، بجعل Brian هذا بأحرف كبيرة، 1387 01:06:08,280 --> 01:06:13,170 وبالتالي يتم إصلاح الخطأ لحسن الحظ، وإن كان لفظيًا فقط. 1388 01:06:13,170 --> 01:06:14,910 إذن كيف نقوم بفعل ذلك في التعليمة البرمجية؟ 1389 01:06:14,910 --> 01:06:16,300 نحن بحاجة للقيام بذلك تحديدًا. 1390 01:06:16,300 --> 01:06:18,400 نحن بحاجة لإعطاء أنفسنا حيزًا أكثر في الذاكرة، 1391 01:06:18,400 --> 01:06:23,832 لذلك دعونا نقدم ميزة واحدة أخرى للغة C. في دالة copy1.c، 1392 01:06:23,832 --> 01:06:25,930 نرى الحل لهذه المشكلة. 1393 01:06:25,930 --> 01:06:31,260 لاحظ بأعلى أقوم بأشياء بمستوى أدنى قليلاً-- عذرًا، مفاجأة. 1394 01:06:31,260 --> 01:06:33,740 لاحظ في هذا الإصدار من التعليمة البرمجية، copy1.c، 1395 01:06:33,740 --> 01:06:37,950 لقد بدأت تقريبًا نفس الشيء، ولكن فقط لنكون واضحين تمامًا، 1396 01:06:37,950 --> 01:06:39,180 أستخدم فقط char*. 1397 01:06:39,180 --> 01:06:41,057 لا أريد أي سحر، لذلك لا توجد أي سلسلة، 1398 01:06:41,057 --> 01:06:42,390 لا توجد أي عجلات تدريب هنا. 1399 01:06:42,390 --> 01:06:45,300 ولكن منطقيًا هذا نفسه بالضبط كما في السابق-- 1400 01:06:45,300 --> 01:06:46,800 إضافةً إلى التحقق من الخطأ. 1401 01:06:46,800 --> 01:06:47,850 هذا السطر جديد. 1402 01:06:47,850 --> 01:06:51,760 ويبدو غير تقليدي بعض الشيء، لكن دعونا نرى ماذا يحدث. 1403 01:06:51,760 --> 01:06:54,510 وسطر التعليمات البرمجية هذا هنا، ماذا أفعل؟ 1404 01:06:54,510 --> 01:06:57,510 الجانب الأيسر، إنه الأقصر، لنبدأ بالأسهل. 1405 01:06:57,510 --> 01:07:02,780 Char* t، فقط بمصطلحات غير المتخصصين، ماذا يعني هذا التعبير؟ char*؟ 1406 01:07:02,780 --> 01:07:06,700 مرحبًا جهاز الكمبيوتر، يفعل ماذا؟ 1407 01:07:06,700 --> 01:07:07,326 ما هذا؟ 1408 01:07:07,326 --> 01:07:08,200 الجمهور: [INAUDIBLE] 1409 01:07:08,200 --> 01:07:09,325 ديفيد مالان: ليس تمامًا. 1410 01:07:09,325 --> 01:07:10,557 صياغة مختلفة. 1411 01:07:14,140 --> 01:07:17,110 مرحبًا جهاز الكمبيوتر، أعطني-- 1412 01:07:17,110 --> 01:07:17,960 ليس تمامًا. 1413 01:07:17,960 --> 01:07:19,953 كونوا أكثر دقة؟ 1414 01:07:19,953 --> 01:07:21,390 الجمهور: مصفوفة؟ 1415 01:07:21,390 --> 01:07:23,390 ديفيد مالان: ليست مصفوفة تمامًا، فقط هذا الجزء. 1416 01:07:23,390 --> 01:07:25,520 لذا دعوني أقوم بإخفاء كل هذا. 1417 01:07:25,520 --> 01:07:27,485 إذا لم تكن النجمة هناك-- 1418 01:07:27,485 --> 01:07:28,860 لا يمكنني فعل هذا بشكل جيد. 1419 01:07:28,860 --> 01:07:29,964 لذا هذا-- نعم؟ 1420 01:07:29,964 --> 01:07:31,900 الجمهور: حرف [INAUDIBLE]؟ 1421 01:07:31,900 --> 01:07:33,316 ديفيد مالان: جيد، سأتناول ذلك. 1422 01:07:33,316 --> 01:07:35,560 لذا مرحبًا جهاز الكمبيوتر، أعطني مؤشر إلى حرف. 1423 01:07:35,560 --> 01:07:37,960 أو حتى مستوى منخفض أكثر، مرحبًا جهاز الكمبيوتر، أعطني 1424 01:07:37,960 --> 01:07:41,590 جزء من الذاكرة حيث يمكنني تخزين عنوان الحرف به. 1425 01:07:41,590 --> 01:07:42,820 أعني، إنه شيء ممل. 1426 01:07:42,820 --> 01:07:46,000 ارسم مربع على الشاشة، وسمّيه s-- أو بالأحرى، 1427 01:07:46,000 --> 01:07:49,825 t، لكن فقط أعطني مسافة لمؤشر، كما قلت. 1428 01:07:49,825 --> 01:07:50,950 لذا هذا كل ما يفعله. 1429 01:07:50,950 --> 01:07:54,310 إنه يرسم مربعًا على الشاشة ويطلق عليه t، وهو فارغ حاليًا. 1430 01:07:54,310 --> 01:07:56,920 الآن دعونا ننظر إلى الجزء المرعب على الجانب الأيمن. 1431 01:07:56,920 --> 01:07:58,780 malloc، دالة جديدة اليوم. 1432 01:07:58,780 --> 01:08:00,420 تشير إلى تخصيصات الذاكرة. 1433 01:08:00,420 --> 01:08:03,420 إنها تبدو مشفرة، ولكنها تعني أعطني جزء من الذاكرة. 1434 01:08:03,420 --> 01:08:05,800 إنها تقول بالضبط ما تقوله من الناحية الوظيفية. 1435 01:08:05,800 --> 01:08:07,990 ثم تحتاج فقط إلى إجابة سؤال واحد-- 1436 01:08:07,990 --> 01:08:09,610 حسنًا، كم من الذاكرة تريد؟ 1437 01:08:09,610 --> 01:08:11,290 ما عدد وحدات البايت التي تريدها؟ 1438 01:08:11,290 --> 01:08:15,250 والآن من المحتمل أن تبدو الرياضيات، على الرغم من أنها مشفرة للوهلة الأولى، منطقية. 1439 01:08:15,250 --> 01:08:19,689 احصل على طول سلسلة s، وقم بإضافة 1، ثم اضربه 1440 01:08:19,689 --> 01:08:21,132 في حجم الحرف. 1441 01:08:21,132 --> 01:08:23,590 ونحن لم نرَ هذا من قبل. sizeof حرفيًا يفعل ذلك. 1442 01:08:23,590 --> 01:08:26,170 إنه يخبرك عدد وحدات البايت في char. 1443 01:08:26,170 --> 01:08:28,300 ويصادف أن يكون 1، وفي الواقع، إنه محدّد. 1444 01:08:28,300 --> 01:08:32,649 لذا إذا قمنا بتبسيط هذا في لغة C، فإن char دائمًا 1 بايت، 1445 01:08:32,649 --> 01:08:35,029 لذا هذا يعادل فقط الضرب في 1. 1446 01:08:35,029 --> 01:08:37,352 ومن الواضح رياضيًا أن هذا مضيعةً للوقت، 1447 01:08:37,352 --> 01:08:39,310 لذا يمكننا أن نضم هذا حتى يكون أكثر بساطة. 1448 01:08:39,310 --> 01:08:41,120 أريد فقط أن أكون دقيقًا. 1449 01:08:41,120 --> 01:08:45,430 حتى الآن، مرحبًا جهاز الكمبيوتر، خصّص لي هذا العدد الكبير من وحدات البايت من الذاكرة. 1450 01:08:45,430 --> 01:08:46,790 لماذا هو زائد 1؟ 1451 01:08:46,790 --> 01:08:48,470 الجمهور: أنت بحاجة إلى الحرف الفارغ. 1452 01:08:48,470 --> 01:08:50,136 ديفيد مالان: أحتاج إلى هذا الحرف الفارغ. 1453 01:08:50,136 --> 01:08:54,310 براين هو 1، 2، 3، 4، 5 كما قال، ولكن أحتاج السادس لحرفه الفارغ، 1454 01:08:54,310 --> 01:08:56,060 وأنا اعلم فقط أنه سيكون هناك. 1455 01:08:56,060 --> 01:08:59,710 إذن في هذه المرحلة من القصة، ما الذي حدث؟ 1456 01:08:59,710 --> 01:09:04,300 كل ما يفعله malloc هو إعطائي هذا المربع من الذاكرة 1457 01:09:04,300 --> 01:09:07,863 والذي يحتوي على مساحة بها عدد كبير من وحدات البايت في اسم براين. 1458 01:09:07,863 --> 01:09:09,279 ولكن لم تتم تعبئتها حتى الآن. 1459 01:09:09,279 --> 01:09:13,160 الآن أنا بحاجة إلى ملء وحدات البايت تلك منطقيًا مع اسم براين الفعلي. 1460 01:09:13,160 --> 01:09:15,550 لذا إذا قمنا بالتمرير إلى أسفل إلى التكرار الحلقي الخاص بي، 1461 01:09:15,550 --> 01:09:18,490 يمكننا بالفعل نسخ السلسلة إلى تلك المساحة. 1462 01:09:18,490 --> 01:09:21,700 وهو طويل بعض الشيء، التعبير، لكن لا شيء جديدٌ هنا. 1463 01:09:21,700 --> 01:09:28,689 قم بتهيئة i إلى 0، n إلى طول s، i أقل من أو يساوي n-- 1464 01:09:28,689 --> 01:09:30,160 سنعود إلى ذلك، i++. 1465 01:09:30,160 --> 01:09:32,260 لذا هو مجرد معيار جيد للتكرار الحلقي. 1466 01:09:32,260 --> 01:09:36,490 ثم انسخ الحرف i من s إلى الحرف i من t. 1467 01:09:36,490 --> 01:09:40,667 الشيء الوحيد الذي يجعلني عصبيًا قليلاً بصراحة هو هذا الشيء هنا. 1468 01:09:40,667 --> 01:09:43,000 كما أشعر في كل مرة نقوم بفعل شيء أقل من أو يساوي، 1469 01:09:43,000 --> 01:09:45,250 نقوم بإنشاء خطأ مثل الأسبوع الماضي. 1470 01:09:45,250 --> 01:09:46,486 لكن هذا صحيح، لماذا؟ 1471 01:09:50,770 --> 01:09:54,580 لماذا أريد أن أنتقل إلى الأعلى وخلال طول هذا؟ 1472 01:09:54,580 --> 01:09:56,790 الجمهور: هو الحرف الفارغ الذي يضيف-- 1473 01:09:56,790 --> 01:09:57,360 ديفيد مالان: بالضبط. 1474 01:09:57,360 --> 01:09:58,610 بسبب الحرف الفارغ. 1475 01:09:58,610 --> 01:10:02,130 أنا في الواقع لا أريد أن أتوقف عند strlen من s، حتى أتمكن من تغيير هذا. 1476 01:10:02,130 --> 01:10:04,890 إذا كنت مرتاحًا أكثر باستخدام أقل من، لأن عقلك فقط 1477 01:10:04,890 --> 01:10:08,460 لا يستوعب لماذا قمنا بهذا في المقام الأول، هذا جيد، 1478 01:10:08,460 --> 01:10:11,440 نحن بحاجة فقط للقيام بذلك بدلاً من ذلك. 1479 01:10:11,440 --> 01:10:16,020 لذا هذا رياضيًا-- إذا انتقلت إلى strlen زائد 1، نفس الشيء 1480 01:10:16,020 --> 01:10:18,789 حيث لا تقوم بتلك العملية الحسابية ولكن الانتقال خطوة أخرى فقط إلى الأمام. 1481 01:10:18,789 --> 01:10:20,830 فقط أيًا كان ما تريد التفكير فيه على أنه أمرٌ جيد. 1482 01:10:20,830 --> 01:10:22,621 وبالكيفية التي تريد التفكير بها على أنه أمرٌ جيد. 1483 01:10:22,621 --> 01:10:25,020 حسنًا، وأخيرًا، فقط فحص سريع، هل طول 1484 01:10:25,020 --> 01:10:27,420 t على الأقل حرف واحد أو أكثر؟ 1485 01:10:27,420 --> 01:10:29,910 لأنه بخلاف ذلك لا يوجد شيء ليتم بتكبيره، وإذا كان الأمر كذلك، 1486 01:10:29,910 --> 01:10:31,120 أمضي قدمًا وقم بذلك. 1487 01:10:31,120 --> 01:10:34,350 لذا إذا قمت الآن بتشغيل هذا المثال، make-- عذرًا، دعوني أحفظه. 1488 01:10:34,350 --> 01:10:37,040 make copy1، الذي تم تحويله برمجيًا. 1489 01:10:37,040 --> 01:10:42,480 ./copy1، الآن دعونا نكتب tj، tj بأحرف صغيرة، 1490 01:10:42,480 --> 01:10:44,490 ولكن الآن تم تكبير t. 1491 01:10:44,490 --> 01:10:49,140 ودعونا نمضي قدمًا ونكتب اسم براين بأحرف صغيرة، وتم تكبير 1492 01:10:49,140 --> 01:10:51,100 واحد منهم الآن. 1493 01:10:51,100 --> 01:10:54,450 لذا هل يبدو هذا منطقيًا ماذا يحدث؟ 1494 01:10:54,450 --> 01:10:54,950 حسنًا. 1495 01:10:54,950 --> 01:10:57,980 إذن إلى أين قد يؤدي هذا الأمر؟ 1496 01:10:57,980 --> 01:11:00,647 حسنًا يتضح أنه-- دعوني أفتح مثال واحد أخير هنا، 1497 01:11:00,647 --> 01:11:02,480 لأنه بصراحة، هذا الأمر ممل بشكل لا يصدق، 1498 01:11:02,480 --> 01:11:04,010 ولا أحد يريد نسخ سلاسل إذا كنت 1499 01:11:04,010 --> 01:11:05,510 مضطرًا إلى المرور خلال كل هذا العمل. 1500 01:11:05,510 --> 01:11:08,990 يتضح أن نسخة التخزين هذه موجودة. 1501 01:11:08,990 --> 01:11:11,060 لذلك في حالة الشك، تحققوا من صفحة man. 1502 01:11:11,060 --> 01:11:12,710 في حالة الشك، تحققوا من مرجع CS50. 1503 01:11:12,710 --> 01:11:15,194 هل توجد الدالة في مكان ما مرتبط 1504 01:11:15,194 --> 01:11:16,610 ببعض الكلمات الرئيسية التي تتذكرونها؟ 1505 01:11:16,610 --> 01:11:18,650 مثل نسخ سلسلة، لنرى إذا استرجعت شيئًا ما. 1506 01:11:18,650 --> 01:11:22,490 وبالفعل، كان لدينا strlen، وكان لدينا أيضًا strcmp، والآن أصبح لدينا strcpy، 1507 01:11:22,490 --> 01:11:25,970 وإذا قرأت الوثائق، فإن هذا يتم عكسه بشكل متعمد هكذا. 1508 01:11:25,970 --> 01:11:30,050 الوجهة هي هذا المتغير، المصدر أو سلسلة المنشأ 1509 01:11:30,050 --> 01:11:32,680 هي هذه السلسلة، وتُنسخ من نهاية إلى أخرى، 1510 01:11:32,680 --> 01:11:35,150 ومن ثم أنا لست بحاجة إلى هذا من أجل التكرار الحلقي. 1511 01:11:35,150 --> 01:11:37,590 إنه فقط يوفر لي بعض الأسطر من التعليمات البرمجية. 1512 01:11:37,590 --> 01:11:38,240 حسنًا. 1513 01:11:38,240 --> 01:11:41,750 لذا دعونا نأخذ تفصيلاً آخر هنا. 1514 01:11:41,750 --> 01:11:46,520 أوه، وستلاحظوا، في الواقع، دعوني أقم بإصلاح واحد هنا، إصلاح واحد هنا. 1515 01:11:46,520 --> 01:11:50,690 يتضح أن ما أقوم به هنا يُعد كسلاً بعض الشيء. 1516 01:11:50,690 --> 01:11:54,260 يتضح أن malloc لديه مقابل له. 1517 01:11:54,260 --> 01:11:57,230 لذلك في أي وقت تقوم بتخصيص ذاكرة، من الناحية الفنية 1518 01:11:57,230 --> 01:11:59,630 يجب عليك أيضًا تحرير تلك الذاكرة. 1519 01:11:59,630 --> 01:12:02,909 وتتيح لك C أن تطلب من الكمبيوتر الحصول على أكبر قدر من الذاكرة كما تريد، 1520 01:12:02,909 --> 01:12:06,200 ولكن إذا لم تعيدها، هل قمت بتجربة ذلك من قبل على جهاز Mac أو جهاز الكمبيوتر الشخصي الخاص بك، 1521 01:12:06,200 --> 01:12:08,158 بعد تشغيل الكمبيوتر لبعض الوقت 1522 01:12:08,158 --> 01:12:10,700 أو استخدام بعض البرامج الجديدة أو الضخمة مثل المتصفح، 1523 01:12:10,700 --> 01:12:13,100 فأنه يصبح أبطأ وأبطأ وأبطأ؟ 1524 01:12:13,100 --> 01:12:16,610 وفي أسوأ الحالات، فأنه يتجمد فقط أو يتوقف أو شيء من هذا القبيل؟ 1525 01:12:16,610 --> 01:12:19,670 من المحتمل جدًا أن هذا البرنامج ببساطة-- قد تم إنشاؤه بواسطة الإنسان، 1526 01:12:19,670 --> 01:12:20,240 بالطبع-- 1527 01:12:20,240 --> 01:12:21,840 فقط لديه تسرب في الذاكرة. 1528 01:12:21,840 --> 01:12:25,400 لذا كتب بعض الأشخاص سطر واحد أو أكثر من التعليمات البرمجية التي تستخدم malloc 1529 01:12:25,400 --> 01:12:28,525 أو ما يعادلها في لغة أخرى والتي تعمل على تخصيص الذاكرة 1530 01:12:28,525 --> 01:12:29,400 لمُدخل المستخدم فقط. 1531 01:12:29,400 --> 01:12:31,310 تقوم بزيارة صفحة ويب واحدة، صفحتي ويب، 1532 01:12:31,310 --> 01:12:33,620 والتي تتطلب ذاكرة أيًا كان البرنامج. 1533 01:12:33,620 --> 01:12:37,490 وإذا لم يطلب الشخص عكس التخصيص-- إعادة التخصيص، 1534 01:12:37,490 --> 01:12:40,700 والمعروف أنه مجاني، فلن تستعيد الذاكرة مجددًا 1535 01:12:40,700 --> 01:12:41,840 إلى نظام التشغيل. 1536 01:12:41,840 --> 01:12:45,129 لذلك يصبح أبطأ وأبطأ لأنه يُتم تشغيله مع حدوث انخفاض في 1537 01:12:45,129 --> 01:12:47,420 الذاكرة بشكل متكرر، وقد يتعين نقل بعد الأشياء 1538 01:12:47,420 --> 01:12:50,390 لإفراغ مساحة لأشياء، وهذا ما يسمى بتسرب في الذاكرة. 1539 01:12:50,390 --> 01:12:54,170 وفي الواقع، في هذا البرنامج، يجب أن أحسّن هذا قليلاً بالفعل. 1540 01:12:54,170 --> 01:12:58,250 إذا عدت إلى هذا الإصدار هنا والسطر 18، تذكرون، 1541 01:12:58,250 --> 01:13:01,010 أنني قمت بتخصيص هذه الذاكرة فقط لصنع النسخة الخاصة بي، 1542 01:13:01,010 --> 01:13:04,310 الشيء الأخير الذي يجب فعلاً أن أقوم به في هذا البرنامج 1543 01:13:04,310 --> 01:13:05,977 هو هذا السطر هنا-- free. 1544 01:13:05,977 --> 01:13:08,810 ليس عليك إخبار الكمبيوتر كم بايت تريد تحريره، 1545 01:13:08,810 --> 01:13:12,650 إنه سيتذكر هذا من أجلك طالما تمر فقط على المؤشر-- 1546 01:13:12,650 --> 01:13:16,790 المتغير الذي يُخزِّن عنوان جزء من الذاكرة 1547 01:13:16,790 --> 01:13:18,890 الذي قمت بتخصيصه. 1548 01:13:18,890 --> 01:13:19,700 حسنًا. 1549 01:13:19,700 --> 01:13:23,030 لذا دعونا الآن نرى لماذا نستخدم get_string، 1550 01:13:23,030 --> 01:13:25,430 حيث أنها ليست فقط نوعًا من تبسيط التعليمات البرمجية، 1551 01:13:25,430 --> 01:13:28,640 إنها أيضًا تعمل على حل بعض المشاكل السهلة جدًا. 1552 01:13:28,640 --> 01:13:31,220 ها هو برنامج يُسمى scanf0-- 1553 01:13:31,220 --> 01:13:35,070 النص المنسق الممسوح ضوئيًا، دالة أخرى غامضة، 1554 01:13:35,070 --> 01:13:36,630 لكنها مباشرة للغاية. 1555 01:13:36,630 --> 01:13:39,952 يُفتح هذا البرنامج ببساطة من المستخدم باستخدام scanf. 1556 01:13:39,952 --> 01:13:42,410 حتى الآن وعلى مدار الثلاثة أسابيع الماضية، كنتم تستخدمون get_int. 1557 01:13:42,410 --> 01:13:45,050 لذا هذا بديل لـ get_int الذي 1558 01:13:45,050 --> 01:13:48,320 بدأتم استخدامه منذ بضعة أسابيع. 1559 01:13:48,320 --> 01:13:51,430 أعطني int تُدعى x، اطبع x نقطتين أيًا يكن-- 1560 01:13:51,430 --> 01:13:53,190 إنه مجرد مُحث للمستخدم. 1561 01:13:53,190 --> 01:14:01,490 scanf %i, &x;، أيًا كان هذا، ثم اطبع قيمة x باستخدام %i. 1562 01:14:01,490 --> 01:14:02,810 إذًا ما الذي يحدث هنا؟ 1563 01:14:02,810 --> 01:14:06,140 الآن يمكننا أن نبدأ في إدراك ما يدور حول get_int 1564 01:14:06,140 --> 01:14:06,639 في الواقع. 1565 01:14:06,639 --> 01:14:07,910 هذا هو get_int بفعالية. 1566 01:14:07,910 --> 01:14:11,034 إذا نظرت في الواقع إلى تعليمات المصدر البرمجية لـ get_int، ستجدها أفضل قليلاً. 1567 01:14:11,034 --> 01:14:13,999 ولكن في الأساس، ما يفعله get_int أنه يعلن عن متغير يُسمى x، 1568 01:14:13,999 --> 01:14:16,040 ولا يضع أي شيء هناك، لأن هذا 1569 01:14:16,040 --> 01:14:17,630 من المفترض أن تفعله أنت، كإنسان. 1570 01:14:17,630 --> 01:14:20,900 ثم يطلب منك أيًا كانت السلسلة التي تمررها إلى get_int، 1571 01:14:20,900 --> 01:14:22,370 لذا هما أول سطرين. 1572 01:14:22,370 --> 01:14:24,570 وهذا هو المظهر الغريب الوحيد. 1573 01:14:24,570 --> 01:14:26,630 يُعد Scanf هو مقابل printf. 1574 01:14:26,630 --> 01:14:31,920 ما زلتم تستخدمون سلسلة منسقة-- %s، أو %i، أو%f أو أيًا كان، 1575 01:14:31,920 --> 01:14:35,750 ولكن لن تقوموا بإخراج هذا، ستقومون بإدخال هذا من 1576 01:14:35,750 --> 01:14:37,220 لوحة المفاتيح. 1577 01:14:37,220 --> 01:14:41,780 و %x هو مقابل-- 1578 01:14:41,780 --> 01:14:49,160 هو الرمز الخاص في C الذي يقول، امضي قدمًا واحصل لي على عنوان x. 1579 01:14:49,160 --> 01:14:52,370 لذا لا تقم بالتمرير في x، أعطني عنوان x. 1580 01:14:52,370 --> 01:14:53,110 الآن، لماذا هذا؟ 1581 01:14:53,110 --> 01:14:56,390 سنرى، ولكن هذه هي الطريقة حيث يمكنك إخبار الكمبيوتر، 1582 01:14:56,390 --> 01:14:59,510 لقد قمت بعمل متغير لك يُسمى x، وهو يوجد هنا. 1583 01:14:59,510 --> 01:15:03,840 إنها خريطة كنز تقودك إلى x، اذهب لتضع قيمة هنا من أجلي. 1584 01:15:03,840 --> 01:15:06,800 وبالتالي فإن النتيجة النهائية هي أننا، في الواقع، نحصل على int. 1585 01:15:06,800 --> 01:15:13,010 إذا قمت بإجراء scanf0، ثم ./scanf0، سأكتب في 42، حسنًا؟ 1586 01:15:13,010 --> 01:15:16,040 إنه ليس برنامجًا مثيرًا للاهتمام، إنه يعيد لي فقط ما حصلت عليه، 1587 01:15:16,040 --> 01:15:18,330 لكن هذا حرفيًا كل ما يقوم به get_int، بالطبع، 1588 01:15:18,330 --> 01:15:20,270 إذا قمت بعد ذلك بطباعة القيمة. 1589 01:15:20,270 --> 01:15:24,230 لذلك إذا أشرت إلى أن هذا صحيح، فإن هذه هي كيفية حصولك على عدد صحيح من المستخدم، 1590 01:15:24,230 --> 01:15:27,660 ولكن بصراحة، السبب في أننا لم نقم بهذا في الأسبوع 1 من هذه الدورة هو، 1591 01:15:27,660 --> 01:15:31,070 يا إلهي، لقد فقدنا المتعة في الحصول على رقم بسيط من المستخدم 1592 01:15:31,070 --> 01:15:32,987 باستخدام هذه السطور من التعليمات البرمجية ومَن يعرف 1593 01:15:32,987 --> 01:15:35,486 ما هو هذا الرمز-- نحن لا نريد منك أن تفكر في ذلك، 1594 01:15:35,486 --> 01:15:36,800 نحن نريد فقط أن تحصل على عدد صحيح. 1595 01:15:36,800 --> 01:15:39,230 لكن اليوم هذه العجلات التدريبية متوقفة، ولكننا 1596 01:15:39,230 --> 01:15:41,990 سنكتشف المشكلة بأسرع ما يمكن. 1597 01:15:41,990 --> 01:15:44,540 دعونا نحاول نفس الشيء مع سلسلة. 1598 01:15:44,540 --> 01:15:49,680 إذا كنت سأقوم بذلك، قد تعتقدوا أن النتيجة هي ذاتها. 1599 01:15:49,680 --> 01:15:52,070 أو دعونا نفعل ذلك فقط كـ char *. 1600 01:15:52,070 --> 01:15:54,020 لكن سيكون هناك تغييرًا واحدًا. 1601 01:15:54,020 --> 01:15:59,180 إذا مضيت قدمًا وأعطيت نفسي مساحة للحصول على عنوان الحرف، 1602 01:15:59,180 --> 01:16:01,970 أنا لست بحاجة إلى استخدام علامة العطف الآن، لأن scanf 1603 01:16:01,970 --> 01:16:04,880 بحاجة إلى إخباره أين يوجد جزء الذاكرة، 1604 01:16:04,880 --> 01:16:08,630 ولكنه بالفعل عنوان، لذا لست بحاجة إلى علامة العطف هنا. 1605 01:16:08,630 --> 01:16:11,960 تذكرون في وقت سابق، أعلنت عن int x، والتي كانت فقط مجرد عدد صحيح. 1606 01:16:11,960 --> 01:16:14,500 يحصل %x على عنوان العدد الصحيح هذا. 1607 01:16:14,500 --> 01:16:19,160 هنا، أنا أقول من البداية، أحصل لي على عنوان char. 1608 01:16:19,160 --> 01:16:22,070 لا أحتاج إلى علامة العطف لأنني بالفعل لدي عنوان char 1609 01:16:22,070 --> 01:16:24,650 من خلال تعريف رمز النجمة هذا. 1610 01:16:24,650 --> 01:16:26,580 إذن ما الذي يحدث هنا؟ 1611 01:16:26,580 --> 01:16:27,560 دعوني أرى الآن. 1612 01:16:27,560 --> 01:16:30,420 إذا قمت بتشغيل scanf1، ماذا يحدث؟ 1613 01:16:30,420 --> 01:16:33,410 لذا make scanf1 و-- 1614 01:16:33,410 --> 01:16:34,122 أوه، لنرى. 1615 01:16:34,122 --> 01:16:35,330 لقد حصلت على تحذير. 1616 01:16:35,330 --> 01:16:37,372 لم تتم تهيئة المتغير s عند استخدامه هنا. 1617 01:16:37,372 --> 01:16:38,330 حسنًا، هذا جيد. 1618 01:16:38,330 --> 01:16:41,210 يريدني أن أقوم بتهيئته لأن هذا خطأ شائع جدًا. 1619 01:16:41,210 --> 01:16:43,168 الذين أشاروا منكم إلى أخطاء التجزئة 1620 01:16:43,168 --> 01:16:46,040 في وقت سابق قد واجهوا شيئًا مماثلاً لهذا. 1621 01:16:46,040 --> 01:16:47,370 لذا تم سحق هذا الخطأ. 1622 01:16:47,370 --> 01:16:49,330 دعوني أمضي قُدمًا وأشغّل scanf1. 1623 01:16:49,330 --> 01:16:51,961 حسنًا، ها قد بدأنا، TJ. 1624 01:16:51,961 --> 01:16:52,460 امم. 1625 01:16:52,460 --> 01:16:54,495 هذا ليس اسمك، لكن حسنًا. 1626 01:16:54,495 --> 01:16:57,000 لم يتعطل على الأقل، إنها مجرد أمور غريبة بعض الشيء. 1627 01:16:57,000 --> 01:16:58,280 ديفيد. 1628 01:16:58,280 --> 01:16:59,916 فارغ، حسنًا، هذا غريب قليلاً. 1629 01:16:59,916 --> 01:17:01,290 لذلك دعونا نمضي قدمًا ونقوم بذلك مجددًا. 1630 01:17:01,290 --> 01:17:03,740 دعونا نكتب اسم طويل جدًا. 1631 01:17:06,280 --> 01:17:07,140 Enter. 1632 01:17:07,140 --> 01:17:09,060 اللعنة، هذا لم ينجح. 1633 01:17:09,060 --> 01:17:11,250 لذا دعونا نجرب اسمًا أطول. 1634 01:17:16,350 --> 01:17:19,980 أنا اضغط على لصق كثيرًا. 1635 01:17:19,980 --> 01:17:21,790 حسنًا-- اللعنة. 1636 01:17:21,790 --> 01:17:23,920 مراتٍ كثيرة. 1637 01:17:23,920 --> 01:17:26,530 لم يتم العثور على الأمر، هذا بالتأكيد ليس أمرًا. 1638 01:17:26,530 --> 01:17:27,310 مدهش، حسنًا. 1639 01:17:30,450 --> 01:17:32,004 حسنا هذا مثيرٌ للاهتمام. 1640 01:17:32,004 --> 01:17:32,670 أوه، ها هو. 1641 01:17:32,670 --> 01:17:33,610 فارغ، نفس الشيء. 1642 01:17:33,610 --> 01:17:36,260 حسنًا، ما الذي يحدث بالفعل؟ 1643 01:17:36,260 --> 01:17:38,370 حسنًا فارغ، وهو جميع الأحرف الصغيرة هنا، وهي 1644 01:17:38,370 --> 01:17:41,742 من الأشياء الجمالية، حسنًا هذا لا يعمل. 1645 01:17:41,742 --> 01:17:42,450 إنه لا يعمل. 1646 01:17:42,450 --> 01:17:44,010 حسنًا ماذا أفعل في الواقع؟ 1647 01:17:44,010 --> 01:17:49,470 في السطر الأول من التعليمات البرمجية، عندما أقول أعطني s لتكون char*، 1648 01:17:49,470 --> 01:17:52,650 والمعروفة كسلسلة بخلاف ذلك، كل ما تقوم به هو تخصيص هذا. 1649 01:17:52,650 --> 01:17:54,750 وهو من الناحية الفنية حجم المؤشر. 1650 01:17:54,750 --> 01:17:57,330 مؤشر، ونحن لم نذكر هذا سابقًا، ولكن الآن يمكننا ذلك. 1651 01:17:57,330 --> 01:18:02,910 يتضح أنه 64 وحدة بايت أو 8 وحدات بايت. 1652 01:18:02,910 --> 01:18:07,770 8 وحدات بايت هي 1 بايت، وبالتالي فإن المؤشر عن طريق التعريف على العديد من أجهزة الكمبيوتر هذه 1653 01:18:07,770 --> 01:18:11,610 الأيام-- معظم أجهزة Macs، معظم أجهزة الكمبيوتر الشخصي الخاصة بك، Sandbox، Lab-- 1654 01:18:11,610 --> 01:18:12,460 هو 64 وحدة بايت. 1655 01:18:12,460 --> 01:18:16,260 لذا هذا يعني أن هناك 64 وحدة بايت هنا، ولكننا قمنا بتهيئتها لتصبح فارغ، 1656 01:18:16,260 --> 01:18:20,190 بحيث يعني فقط أن هناك أصفار 64 هنا، نقطة-نقطة-نقطة. 1657 01:18:20,190 --> 01:18:24,092 ولكن عندما أحصل على سلسلة باستخدام scanf، ما 1658 01:18:24,092 --> 01:18:26,550 أخبر به الكمبيوتر أن يقوم به مع هذا السطر من التعليمات البرمجية هنا، 1659 01:18:26,550 --> 01:18:31,930 لاحظوا أن، مرحبًا جهاز الكمبيوتر، انتقل إلى هذا العنوان وضَع سلسلة هناك. 1660 01:18:31,930 --> 01:18:34,150 لذا ما الذي يحدث بالفعل؟ 1661 01:18:34,150 --> 01:18:37,680 يتضح أنه لا توجد مساحة كافية للكتابة في TJ. 1662 01:18:37,680 --> 01:18:38,722 لا توجد مساحة كافية-- 1663 01:18:38,722 --> 01:18:41,430 هذه كذبة بيضاء، لأننا يمكن أن نجعلك ملائمًا في 64 وحدة بايت، 1664 01:18:41,430 --> 01:18:45,030 ولكن لا توجد مساحة كافية لكتابة جملة طويلة أو فقرة من نص 1665 01:18:45,030 --> 01:18:46,140 قمت بكتابتها، أليس ذلك صحيحًا؟ 1666 01:18:46,140 --> 01:18:47,340 ما الذي لم نقم به؟ 1667 01:18:47,340 --> 01:18:49,500 لم نخصص أي مساحة هنا. 1668 01:18:49,500 --> 01:18:51,930 كل ما خصصنا له مساحة كان العنوان. 1669 01:18:51,930 --> 01:18:55,770 وهكذا كل مرة أستخدم scanf فيها أقول، احصل لي على سلسلة وضَعها هنا، 1670 01:18:55,770 --> 01:18:57,220 لا يوجد مكان لوضعها. 1671 01:18:57,220 --> 01:19:00,070 وبالتالي فإن القيمة تقول فقط بشكل دفاعي، لا، تعني لا، 1672 01:19:00,070 --> 01:19:03,030 لا يمكن تخزين هذا في أي مكان لك. 1673 01:19:03,030 --> 01:19:05,550 لذا أنا بالفعل بحاجة إلى أن أكون ذكيًا قليلاً بشأن هذا الأمر. 1674 01:19:05,550 --> 01:19:10,860 أنا بالفعل بحاجة للحصول على بعض المساحة حتى أتمكن بالفعل من تخزين شيء 1675 01:19:10,860 --> 01:19:11,750 في المكان الصحيح. 1676 01:19:11,750 --> 01:19:12,670 لنقم بذلك. 1677 01:19:12,670 --> 01:19:15,420 دعوني أمضي قدمًا وأقوم بإنشاء برنامج جديد. 1678 01:19:15,420 --> 01:19:17,280 سأمضي قدمًا وأسمي هذا scanf2. 1679 01:19:21,370 --> 01:19:25,040 نحن بحاجة إلى تعليمة برمجية سرية لتذكرني بذلك. 1680 01:19:25,040 --> 01:19:27,180 أوه، اسم ملف خاطئ. 1681 01:19:27,180 --> 01:19:30,650 إذن سأمضي قدمًا وأقوم بإنشاء ملف باسم scanf2. 1682 01:19:30,650 --> 01:19:32,180 scanf2.c. 1683 01:19:32,180 --> 01:19:37,310 وسأعيد بسرعة إنشاء هذا stdio.h، int main void، 1684 01:19:37,310 --> 01:19:39,950 وبالأسفل هنا سأمضي قدمًا و--أتعلمون؟ 1685 01:19:39,950 --> 01:19:44,270 بدلاً من سلسلة s، والتي أعرف اليوم أنها ستصبح char* s، 1686 01:19:44,270 --> 01:19:45,549 ما هي هذه السلسلة في الواقع؟ 1687 01:19:45,549 --> 01:19:46,590 حسنًا قلتَ ذلك في وقتٍ سابق. 1688 01:19:46,590 --> 01:19:48,520 ما هي هذه السلسلة؟ 1689 01:19:48,520 --> 01:19:49,840 إنها مصفوفة من الأحرف. 1690 01:19:49,840 --> 01:19:51,210 دعوني آخذكم لها بالمعنى الحرفي. 1691 01:19:51,210 --> 01:19:54,570 فقط أعطني مصفوفة، لنَقُل، من خمسة أحرف. 1692 01:19:54,570 --> 01:19:58,980 D-A-V-I-D، أو واحد أكثر، هذا جيد، كافية تمامًا لـ /0. 1693 01:19:58,980 --> 01:20:01,330 دعوني فقط أُنشئ سلسلة-- ذات مستوى منخفض للغاية، 1694 01:20:01,330 --> 01:20:03,676 لكن هذه المرة أعطي لنفسي جزء الذاكرة. 1695 01:20:03,676 --> 01:20:05,550 أنا لا أريد فقط عنوان حرف، 1696 01:20:05,550 --> 01:20:08,290 بل أريد الأحرف الفعلية نفسها. 1697 01:20:08,290 --> 01:20:11,550 اسمحوا لي بالمضي قدمًا ومطالبة الشخص المستخدم بالسلسلة s الخاصة به، 1698 01:20:11,550 --> 01:20:12,510 تمامًا كما سبق. 1699 01:20:12,510 --> 01:20:16,770 ثم دعوني أستدعي scanf وأحصل على سلسلة من المستخدم باستخدام %s ثم أمررها 1700 01:20:16,770 --> 01:20:17,400 في s. 1701 01:20:17,400 --> 01:20:18,720 وإليكم حيلة بسيطة. 1702 01:20:18,720 --> 01:20:22,710 يتضح أنه نظرًا لأن السلسلة هي مجرد مصفوفة في الواقع، 1703 01:20:22,710 --> 01:20:25,620 لكن السلسلة أيضًا مجرد مؤشر، يمكنك في الواقع معاملة 1704 01:20:25,620 --> 01:20:28,440 مصفوفة كما لو أنها مؤشر-- 1705 01:20:28,440 --> 01:20:29,310 عنوان. 1706 01:20:29,310 --> 01:20:33,900 وحتى بالرغم من أن هذه مصفوفة char*، فهذا جيد. 1707 01:20:33,900 --> 01:20:37,710 هذا هو المعادل في هذا السياق لكونها مجرد عنوان لسلسلة. 1708 01:20:37,710 --> 01:20:41,880 ولأن السلاسل هي مصفوفات، فيمكن التعامل مع المصفوفات كمؤشرات حتى الآن. 1709 01:20:41,880 --> 01:20:44,880 ثم دعوني أمضي قدمًا وأقوم فقط بطباعة أي شيء كتبه الشخص المستخدم. 1710 01:20:44,880 --> 01:20:46,470 S هو بالفعل هذا. 1711 01:20:46,470 --> 01:20:49,320 مرّر في s;، حفظ. 1712 01:20:49,320 --> 01:20:49,987 أجل؟ 1713 01:20:49,987 --> 01:20:52,589 الجمهور: إذن هل [INAUDIBLE] بمثابة char*؟ 1714 01:20:52,589 --> 01:20:55,130 ديفيد مالان: عند هذه النقطة سيكون تنفيذ char* أمرًا متكررًا، 1715 01:20:55,130 --> 01:20:58,670 لأنني حرفيًا أريد لهذه القصة ستة أحرف. 1716 01:20:58,670 --> 01:21:01,740 أريد مساحةً، بدلاً من ذلك، لستة أحرف. 1717 01:21:01,740 --> 01:21:05,780 إذن هذا نوعًا ما يمثل برامج الأسبوع الثاني إلى الآن، وليست هناك مؤشرات متضمنة. 1718 01:21:05,780 --> 01:21:08,810 لكن مجددًا، مجرد عرض المعادل لهذه الأفكار في الوقت الحالي. 1719 01:21:08,810 --> 01:21:12,560 لذلك إذا انتقلتُ الآن إلى هذه، وهذه موجودة في الدليل الآخر لديّ في الوقت الحالي، 1720 01:21:12,560 --> 01:21:19,760 make scanf2، إدخال، ./scanf2، s ستكتب-- 1721 01:21:19,760 --> 01:21:22,864 سأكتب اسمي، وأنا أعلم أنني يمكنني إصلاح ذلك، لقد عدنا إلى العمل. 1722 01:21:22,864 --> 01:21:26,030 إنها تعمل الآن تقريبًا لأنني لم أُنشئ فقط العنوان لسلسلة، 1723 01:21:26,030 --> 01:21:27,488 إنما قمتُ بإنشاء المساحة للسلسلة. 1724 01:21:27,488 --> 01:21:31,250 لكن دعوني أنتقل إلى خطوة خطرة قليلاً-- 1725 01:21:31,250 --> 01:21:32,510 ديفيد مالان؟ 1726 01:21:32,510 --> 01:21:35,180 حسنًا، لقد تطور ذلك نوعًا ما، حسنًا. 1727 01:21:35,180 --> 01:21:40,860 ديفيد مالان أو اسم ما آخر طويل حقًا؟ 1728 01:21:40,860 --> 01:21:42,230 حسنًا، تطور ذلك أيضًا. 1729 01:21:42,230 --> 01:21:44,690 دعوني أمضي قُدمًا وأشغّله مجددًا. 1730 01:21:44,690 --> 01:21:48,077 دعوني أحاول مع تلك السلسلة الطويلة مجددًا، ونرى ما سيحدث. 1731 01:21:48,077 --> 01:21:49,910 أعلم أن هذا لم ينجح بشكل كامل في المرة السابقة. 1732 01:21:49,910 --> 01:21:51,470 حسنًا، تمت. 1733 01:21:51,470 --> 01:21:53,090 أوه، حسنًا. 1734 01:21:53,090 --> 01:21:57,470 إذن أنا الآن عضو في نادي هؤلاء الأشخاص أصحاب الأخطاء في التجزئة من بينكم. 1735 01:21:57,470 --> 01:21:59,930 إذن دعونا نفهم ما يجري هنا. 1736 01:21:59,930 --> 01:22:01,970 خطأ التجزئة الذي ارتكبتُه منذ دقيقة كان عبارة عن 1737 01:22:01,970 --> 01:22:05,420 لمس جزء، قطعة من الذاكرة لا تخصك. 1738 01:22:05,420 --> 01:22:06,410 هل حدث لذلك فقط؟ 1739 01:22:06,410 --> 01:22:09,230 حسنًا باستخدام هذا البرنامج البسيط، قلتُ لجهاز الكمبيوتر، يا كمبيوتر، 1740 01:22:09,230 --> 01:22:13,670 أعطني حيزًا لستة أحرف، أعطني ست وحدات بايت. 1741 01:22:13,670 --> 01:22:18,170 مع سطر scanf ، أقول لجهاز الكمبيوتر، ضع إدخال المستخدم 1742 01:22:18,170 --> 01:22:22,280 التالي في ذلك الموقع، في تلك المصفوفة من الأحرف. 1743 01:22:22,280 --> 01:22:24,830 D-A-V-I-D خط مائل عكسي 0 هو خيار مناسب. 1744 01:22:24,830 --> 01:22:27,890 David Malan لم تكن خيارًا مناسبًا حقًا، ولكن لم يبدُ أن هذا أمر مهم. 1745 01:22:27,890 --> 01:22:33,000 كما لم يتسبب اسم David Malan أو اسم ما آخر طويل حقًا، في تعطل الكمبيوتر. 1746 01:22:33,000 --> 01:22:36,365 ولكن هذا لأنه عادةً من دون علمنا، عندما تطلب ست وحدات بايت، 1747 01:22:36,365 --> 01:22:38,990 يقوم الكمبيوتر بترتيبها نوعًا ما-- فيعطيك بضع عناصر إضافية. 1748 01:22:38,990 --> 01:22:41,480 ليس من الآمن استخدامها، لكنها تعطيك ما يكفي 1749 01:22:41,480 --> 01:22:44,870 لكيلا تشاهد بالضرورة مشكلة مثل خطأ التجزئة. 1750 01:22:44,870 --> 01:22:47,310 لكنها عادةً ما تخصص فقط عددًا قليلاً من وحدات البايت الإضافية، 1751 01:22:47,310 --> 01:22:51,019 لذلك إذا تابعت لصق سطور طويلة، طويلة، طويلة من النص، 1752 01:22:51,019 --> 01:22:53,060 فأنت في نهاية المطاف لن تتجاوز وحدات البايت الست فقط، 1753 01:22:53,060 --> 01:22:55,634 إنما أيضًا ستكون بعيدًا تمامًا عن وحدات المساحة الخاصة-- 1754 01:22:55,634 --> 01:22:58,550 وحدات البايت السرية التي استعدتها والتي يجب ألا تستخدمها على أي حال، 1755 01:22:58,550 --> 01:23:00,675 وفي هذه النقطة سيرضخ الكمبيوتر ويقول، 1756 01:23:00,675 --> 01:23:03,080 أنت تلمس الذاكرة لا ينبغي عليك، وهو ما يعرف أيضًا باسم، 1757 01:23:03,080 --> 01:23:04,040 خطأ التجزئة. 1758 01:23:04,040 --> 01:23:06,510 الجمهور: [INAUDIBLE] إذا منحك الكمبيوتر 1759 01:23:06,510 --> 01:23:10,462 قليلاً من وحدات البايت الإضافية، فلماذا لا يقوم بطباعة أي من البرامج الأخرى؟ 1760 01:23:10,462 --> 01:23:14,154 بعد أن قلتَ [INAUDIBLE] فإنه قد قام تحديدًا بطباعة اسم David. 1761 01:23:14,154 --> 01:23:15,570 ديفيد مالان: سؤال جيد حقًا. 1762 01:23:15,570 --> 01:23:18,230 إذن حتى رغم أني أتلقى وحدات البايت الإضافية نوعًا ما هذه، 1763 01:23:18,230 --> 01:23:20,720 لماذا لا أراها بعد D-A-V-I-D؟ 1764 01:23:20,720 --> 01:23:21,920 فأنا على الأرجح محظوظ. 1765 01:23:21,920 --> 01:23:24,560 خلاصة القول، عندما تقوم بتشغيل برنامج لأول مرة، 1766 01:23:24,560 --> 01:23:28,370 فإنه تتم تهيئة مساحة كبيرة من الذاكرة التي يحق لبرنامجك الوصول إليها بشكل افتراضي 1767 01:23:28,370 --> 01:23:29,710 للأصفار. 1768 01:23:29,710 --> 01:23:33,590 0 هو نفسه خط مائل عكسي 0، ولذلك فأنا محظوظ. 1769 01:23:33,590 --> 01:23:37,250 فعندما يكون لديّ D-A-V-I-D ثم مساحة إضافية في تلك المصفوفة، 1770 01:23:37,250 --> 01:23:39,830 فتتم تهيئة الكثير منها بالفعل كأصفار، 1771 01:23:39,830 --> 01:23:43,150 ويتم إنهاء السلسلة بشكل سري بالنسبة لي. 1772 01:23:43,150 --> 01:23:46,880 أو الإجابة الأفضل هي، إنه سلوك غير محدد. 1773 01:23:46,880 --> 01:23:49,160 مثلما أنك يحظر عليك لمس ذاكرة ليست خاصة بك. 1774 01:23:49,160 --> 01:23:52,820 ما يحدث بعد ذلك سيكون مخاطرتك وحدك. 1775 01:23:52,820 --> 01:23:55,490 ولكن ذلك تخمين لسبب حدوث ذلك. 1776 01:23:55,490 --> 01:23:58,460 حسنًا، إذن ما هي الميزة الأساسية عمّا تقدّمه لنا 1777 01:23:58,460 --> 01:23:59,750 دالة get_int؟ 1778 01:23:59,750 --> 01:24:02,480 طوال هذا الوقت كانت دالة get_int في الواقع تتعامل مع 1779 01:24:02,480 --> 01:24:04,417 كل هذا الصداع نيابةً عنا. 1780 01:24:04,417 --> 01:24:07,250 أعني بصراحة، رغم أنني سئمت التفكير، والحديث 1781 01:24:07,250 --> 01:24:09,530 حول الكيفية التي حصلتَ بها للتو على سلسلة لعينة من المستخدم، 1782 01:24:09,530 --> 01:24:12,197 لأنك بحاجة لأن تعرف جيدًا كم وحدة بايت تحتاجها؟ 1783 01:24:12,197 --> 01:24:15,071 وماذا لو كانت الأنواع البشرية في وحدة بايت زيادةً عما كنت تتوقع؟ 1784 01:24:15,071 --> 01:24:17,300 إذن تحتاج إلى تبديل صف والحصول على مزيد من الذاكرة. 1785 01:24:17,300 --> 01:24:20,059 get_string يريحنا من كل هذا الصداع. 1786 01:24:20,059 --> 01:24:22,100 وهذا لا يعني أنك في حاجة لاستخدامه إلى الأبد، 1787 01:24:22,100 --> 01:24:23,933 إنها بالفعل عجلات تدريب، ولكن 1788 01:24:23,933 --> 01:24:27,569 فقط لأنك عندما تستخدم C أو العديد من لغات البرمجة، 1789 01:24:27,569 --> 01:24:29,610 سيقوم جهاز الكمبيوتر فقط بفعل ما تقوله للقيام به. 1790 01:24:29,610 --> 01:24:31,927 وتبين أنه حتى طلب المُدخلات من المستخدم، 1791 01:24:31,927 --> 01:24:34,010 إذا كنت لا تعرف كم عدد الأحرف الذي سيقوم أو التي 1792 01:24:34,010 --> 01:24:37,144 ستقوم بكتابتها من get-go، فعليك أن تتعامل مع الأمر. 1793 01:24:37,144 --> 01:24:40,310 وما تحت الغطاء-- وأنت مرحب بك لتلقي نظرة على تعليمات المصدر 1794 01:24:40,310 --> 01:24:44,090 البرمجية لمكتبة CS50، والتي سأقوم بنشرها على الصفحة الرئيسية لاحقًا اليوم، 1795 01:24:44,090 --> 01:24:48,050 اتضح أن الطريقة التي نقوم بـ get_string بها تحقق تقدمًا صغيرًا. 1796 01:24:48,050 --> 01:24:50,780 نحن حرفيًا نحصل على حرف واحد في كل مرة 1797 01:24:50,780 --> 01:24:54,369 من المستخدم، شيء كبناء الطريق بينما نمشي فيه. 1798 01:24:54,369 --> 01:24:56,660 وإذا لم يكن لدينا مسافة كافية، نطلب من جهاز الكمبيوتر، 1799 01:24:56,660 --> 01:24:58,659 أن يمنحني بعض وحدات البايت الإضافية حتى أتمكن من الحصول على المزيد منها، 1800 01:24:58,659 --> 01:25:01,130 ونحصل على حرف واحد في كل مرة حتى 1801 01:25:01,130 --> 01:25:04,520 يمكننا التعامل مع المستخدم عند كتابة مدخلات أكثر مما نتوقع بطريقة ما 1802 01:25:04,520 --> 01:25:08,460 بشكل متعمد أو عن طريق الخطأ. 1803 01:25:08,460 --> 01:25:10,640 لذلك دعونا نحدد سياقات كل هذا إذن. 1804 01:25:10,640 --> 01:25:12,950 تذكّروا أننا كنا نرسم هذه الصور في الأسبوعين الماضيين. 1805 01:25:12,950 --> 01:25:15,560 دعونا فقط نجعل هذا الأمر واضحًا جدًا لما يحدث. 1806 01:25:15,560 --> 01:25:17,870 هذه وحدة الذاكرة في جهاز كمبيوتر. 1807 01:25:17,870 --> 01:25:20,600 إنها مجرد لوحة خضراء، وهي صغيرة وتم تكبيرها هنا، 1808 01:25:20,600 --> 01:25:24,620 إنها بسهولة تمثل ما بداخل جهاز Mac أو جهاز الكمبيوتر الشخصي أو سطح المكتب لديك، 1809 01:25:24,620 --> 01:25:25,880 على الرغم من أنه يمكن أن يختلف حجمها. 1810 01:25:25,880 --> 01:25:28,501 إحدى هذه الرقاقات السوداء هي الذاكرة الفعلية أو وحدات البايت 1811 01:25:28,501 --> 01:25:29,750 التي كنا نشير إليها. 1812 01:25:29,750 --> 01:25:32,300 وإذا قمنا بتكبير ذلك، تذكّروا أنني اقترحت الأسبوع الماضي 1813 01:25:32,300 --> 01:25:35,097 أنه يمكنكم فقط التفكير في هذا وكأنه شبكة، مصفوفة. 1814 01:25:35,097 --> 01:25:38,180 ولا يتعين أن يكون مستطيلاً، هذا مجرد تصوير فني، 1815 01:25:38,180 --> 01:25:41,120 لكن كل هذه المربعات يمثل، كما زعمنا، وحدة بايت. 1816 01:25:41,120 --> 01:25:44,880 ويمكن أن يكون كل من وحدات البايت هذه مُعالجًا بطريقة ما برقم. 1817 01:25:44,880 --> 01:25:49,250 وهذا الرقم هو موقعه فقط، والمعروف بطريقة أخرى باسم عنوان. 1818 01:25:49,250 --> 01:25:52,590 يمكننا بالفعل رؤية هذا على النحو التالي. 1819 01:25:52,590 --> 01:25:54,677 حسنًا، دعوني أمضي قدمًا وأفتح هذا المثال هنا. 1820 01:25:54,677 --> 01:25:57,260 أو في الواقع، كما تعلمون، دعونا فقط نكتب هذا من سكراتش. 1821 01:25:57,260 --> 01:26:01,930 دعوني أكتب برنامجًا يسمّى addresses.c. 1822 01:26:01,930 --> 01:26:09,230 وسيستخدم هذا أصدقائنا القدامى، ومكتبة CS50 وstdio.h وint 1823 01:26:09,230 --> 01:26:11,090 main void. 1824 01:26:11,090 --> 01:26:13,580 دعوني أمضي قُدمًا وأفعل هذا. 1825 01:26:13,580 --> 01:26:15,307 وسأمضي قُدمًا وأحصل على سلسلة-- 1826 01:26:15,307 --> 01:26:15,890 أتعلمون ماذا؟ 1827 01:26:15,890 --> 01:26:21,420 لا مزيد من السلاسل. char* من المستخدم، get_string، اطلب من المستخدم s. 1828 01:26:21,420 --> 01:26:23,050 ونحصل على سلسلة أخرى، والمعروفة أيضًا. 1829 01:26:23,050 --> 01:26:26,630 بـ char*، get_string، أطلق عليها t من المستخدم. 1830 01:26:26,630 --> 01:26:31,580 ومن ثم، لا أرغب في طباعة السلاسل، التي اعتدت على فعلها هكذا، 1831 01:26:31,580 --> 01:26:32,550 طباعة s. 1832 01:26:32,550 --> 01:26:37,360 أنا أرغب في طباعة المؤشر حيث يكون s، هو العنوان. 1833 01:26:37,360 --> 01:26:42,380 سيظهر %p للمؤشر الذي لن يقوم بطباعة السلسلة في موقع الذاكرة هذا، 1834 01:26:42,380 --> 01:26:45,620 سيقوم بطباعة موقع الذاكرة الفعلية لك الخاص بـ s. 1835 01:26:45,620 --> 01:26:50,480 ويمكنني فعل الشيء نفسه هنا، %p، خط مائل عكسي 0، وألصق في t. 1836 01:26:50,480 --> 01:26:52,940 وفقط لكي أعرف ما الفرق بينهما، دعوني أبدأ فيه 1837 01:26:52,940 --> 01:26:55,460 مع نص ما-- s نقطتين وt نقطتين. 1838 01:26:55,460 --> 01:26:58,846 دعوني أمضي قدمًا الآن في الأسفل هنا، وأقوم بكتابة make addresses. 1839 01:26:58,846 --> 01:27:02,390 أوه، لقد أخطأت، نسيت فاصلة منقوطة. 1840 01:27:02,390 --> 01:27:03,500 دعوني أفعل هذا مجددًا. 1841 01:27:03,500 --> 01:27:07,940 make addresses. 1842 01:27:07,940 --> 01:27:09,830 وأتخلص من هذا. 1843 01:27:09,830 --> 01:27:14,390 تم تحويل هذا برمجيًا حسنًا، ./addresses، وها نحن ذا. 1844 01:27:14,390 --> 01:27:18,210 دعونا نكتب في-- دعونا نكتب براين وفيرونيكا كما فعلنا من قبل. 1845 01:27:18,210 --> 01:27:18,970 Enter. 1846 01:27:18,970 --> 01:27:23,290 وهذا غريب إلى حد ما، ولكن يتضح أن IDE في أجهزة Mac 1847 01:27:23,290 --> 01:27:25,430 وأجهزة الكمبيوتر الشخصي لديك تحتوي على ذاكرة كبيرة. 1848 01:27:25,430 --> 01:27:26,600 إذن هذا هو العنوان. 1849 01:27:26,600 --> 01:27:30,070 إنه ليس صغيرًا مثل 100، وليس صغيرًا مثل 900. 1850 01:27:30,070 --> 01:27:31,750 إنه في الواقع كبير. 1851 01:27:31,750 --> 01:27:36,245 إنه 2331010 مع تلك 0x الغريبة. 1852 01:27:36,245 --> 01:27:38,370 إذن يتضح أن، هذا مجرد تقليد إنساني. 1853 01:27:38,370 --> 01:27:40,510 في الأسبوع 0 تحدثنا عن الأرقام العشرية وجميعنا 1854 01:27:40,510 --> 01:27:43,030 على دراية بالأرقام العشرية منذ الصغر، 10 أرقام من 0 إلى 9. 1855 01:27:43,030 --> 01:27:46,060 وتحدثنا قليلاً حول نظام الأصفار والآحاد الثنائي. 1856 01:27:46,060 --> 01:27:48,700 يتضح أنه يوجد عدد لا حصر له من الأنظمة الأساسية-- 1857 01:27:48,700 --> 01:27:53,350 إن رقم عشري/dec، نظام ثنائي/bi هما اثنين فقط من تلك الأعداد اللانهائية من الاحتمالات. 1858 01:27:53,350 --> 01:27:57,370 يتضح أنه يوجد واحد آخر وهو شائع للغاية باسم السداسيّ العشريّ. 1859 01:27:57,370 --> 01:27:59,890 ويعني السداسيّ 16 في هذه الحالة. 1860 01:27:59,890 --> 01:28:03,940 إذن فإن base-16 يحتوي بالفعل على 16 حرفًا في الأحرف الأبجدية الخاصة به. 1861 01:28:03,940 --> 01:28:11,560 0، 1، 2، 3، 4، 5، 6، 7، 8، 9، a، b، c، d، e، f. 1862 01:28:11,560 --> 01:28:15,990 إذن تبين أن الأنظمة الأساسية التي تحتاج إلى حساب أكثر من 10 أحرف 1863 01:28:15,990 --> 01:28:18,430 بدأت للتو في استخدام الأحرف الأبجدية عن طريق التقليد. 1864 01:28:18,430 --> 01:28:19,840 قرر البشر هذا فقط. 1865 01:28:19,840 --> 01:28:22,620 إذن نحن نحصل فقط على أرقام في هذه الحالة، 1866 01:28:22,620 --> 01:28:24,640 ولكن إذا كانت هذه العناوين أكبر من ذلك، فقد 1867 01:28:24,640 --> 01:28:30,434 نرى بالفعل بعض الأحرف الأبجدية بين a وf هناك. 1868 01:28:30,434 --> 01:28:32,350 وبصراحة لا أعرف ما هو هذا عنوان، 1869 01:28:32,350 --> 01:28:34,308 ولكن Google عادةً ما يجيد التعامل مع تلك الأمور، 1870 01:28:34,308 --> 01:28:39,300 لذا دعوني أفتح نافذة متصفح أخرى. 1871 01:28:39,300 --> 01:28:41,640 إذن Google يصبح صديقك عندما يتعلق الأمر بهذه الأمور، 1872 01:28:41,640 --> 01:28:42,870 أو أي عدد من الحاسبات. 1873 01:28:42,870 --> 01:28:47,300 0x2331010 بأرقام عشرية من فضلك. 1874 01:28:47,300 --> 01:28:48,600 وقد ترجم Google ذلك. 1875 01:28:48,600 --> 01:28:51,320 لذا براين، أنا-- نوعًا ما أسفل وحدة بايت في وقت سابق. 1876 01:28:51,320 --> 01:28:54,540 هو ليس في موقع عنوان 0، هو في الحقيقة 1877 01:28:54,540 --> 01:28:59,190 إنما في 36 مليون بايت داخل جهاز الكمبيوتر الخاص بي 1878 01:28:59,190 --> 01:29:03,060 في الوقت الحالي، الموقع 36,900,880. 1879 01:29:03,060 --> 01:29:05,400 إذن، عنوان أعلى بقليل من 100. 1880 01:29:05,400 --> 01:29:09,390 ثم فيرونيكا، إذا كنا حقًا نريد أن نجعل الأمور معقدة هنا، 1881 01:29:09,390 --> 01:29:12,700 يمكننا القول "بالأرقام العشرية،" ولندع Google يترجم هذا لنا. 1882 01:29:12,700 --> 01:29:16,440 إنها في الموقع 36,900,944. 1883 01:29:16,440 --> 01:29:17,040 لماذا؟ 1884 01:29:17,040 --> 01:29:17,730 مَن يهتم؟ 1885 01:29:17,730 --> 01:29:22,500 يدير جهاز الكمبيوتر كل هذا لنا، ولكن عندما يقوم get_string باستخدام malloc، 1886 01:29:22,500 --> 01:29:26,460 هذه حرفيًا هي الأرقام التي تم إرجاعها حيث يمكننا قول أنه، 1887 01:29:26,460 --> 01:29:29,280 يمكنك استخدام هذا الجزء من الذاكرة. 1888 01:29:29,280 --> 01:29:31,280 ولماذا استخدم البشر السداسيّ العشريّ؟ 1889 01:29:31,280 --> 01:29:39,330 كما لو أنها طريقة أكثر تعقيدًا قليلاً لقول 0x2331050، ثم 36900944-- 1890 01:29:39,330 --> 01:29:41,940 مثلما قمت بحفظ بعض الأرقام، لذلك فهي تقليدية فقط. 1891 01:29:41,940 --> 01:29:43,390 هذا كل شيء، لا يوجد سحر هناك. 1892 01:29:43,390 --> 01:29:44,880 لكن، تذكرون في وقت سابق. 1893 01:29:44,880 --> 01:29:47,700 هل تتذكرون عندما قمت بفتح مصحح الأخطاء في وقت سابق، 1894 01:29:47,700 --> 01:29:52,120 رأيتم بجانب قيمة متغير اسمي التي كانت مشفرة 0x0؟ 1895 01:29:52,120 --> 01:29:54,210 ثم كانت هناك قيمة أخرى لا أتذكرها-- 1896 01:29:54,210 --> 01:29:55,620 0X-وشيء ما؟ 1897 01:29:55,620 --> 01:30:00,570 كان ذلك مجرد عنوان رقمي لاسمي في السداسيّ العشريّ. 1898 01:30:00,570 --> 01:30:06,470 و0x0 هو العنوان الفني المُستخدم من قبل فارغ. 1899 01:30:06,470 --> 01:30:07,250 أجل؟ 1900 01:30:07,250 --> 01:30:13,010 الجمهور: لقد قلت أن العنوان المطبوع كان [INAUDIBLE] x للمتغير s 1901 01:30:13,010 --> 01:30:13,510 و-- 1902 01:30:13,510 --> 01:30:14,260 ديفيد مالان: عذرًا، هل يمكنك قول ذلك مجددًا؟ 1903 01:30:14,260 --> 01:30:17,830 الجمهور: لقد قلت أن العنوان المطبوع على الشاشة كان x، 1904 01:30:17,830 --> 01:30:20,450 ولكن x هو [INAUDIBLE] 1905 01:30:20,450 --> 01:30:22,080 ديفيد مالان: آه، كان علي أن أوضح ذلك. 1906 01:30:22,080 --> 01:30:25,290 0x، قرر البشر منذ سنوات في أي وقت تشاهد أي شيء 1907 01:30:25,290 --> 01:30:29,340 مع 0x، هذا يعني أن أيًا كان يأتي بعد ذلك هو سداسيّ عشريّ. 1908 01:30:29,340 --> 01:30:30,550 التقليد فقط. 1909 01:30:30,550 --> 01:30:35,310 كما أنه من الشائع أيضًا إذا كان يبدأ بـ 0، فهو ثُماني، وهو base-8. 1910 01:30:35,310 --> 01:30:37,760 إذا رأيت حرف b صغير في النهاية، فهذا يعني أنه ثنائي. 1911 01:30:37,760 --> 01:30:39,510 إذن توصل البشر إلى الرموز 1912 01:30:39,510 --> 01:30:42,150 كنوع من توصيل هذا إلى القرّاء، هذا كل شيء. 1913 01:30:42,150 --> 01:30:43,230 ليس جزءًا من القيمة. 1914 01:30:43,230 --> 01:30:46,140 إذن يتضح أنه بالفعل يمكننا القيام بهذه الحسابات بأنفسنا. 1915 01:30:46,140 --> 01:30:48,060 ولا نريد حقًا أن تسوء الأمور لهذا 1916 01:30:48,060 --> 01:30:50,310 لأنها بشكل خاص ليست مهارة مفيدة 1917 01:30:50,310 --> 01:30:52,610 في الحياة، لتكون قادرًا على التحويل إلى أنظمة أساسية متنوعة، 1918 01:30:52,610 --> 01:30:54,780 ولكن دعونا فقط نقدم مثالاً واحدًا حتى نراه. 1919 01:30:54,780 --> 01:30:56,370 فقط لتوضيح أن أنه لا يوجد سحر هنا، 1920 01:30:56,370 --> 01:30:59,360 إنها مجرد طريقة مختلفة للتفكير حول الأرقام مقابل المرحلة الابتدائية. 1921 01:30:59,360 --> 01:31:01,770 إذن إذا رجعنا بذاكرتنا إلى اليوم الذي كان لدينا فيه ثلاثة أرقام عشرية-- 1922 01:31:01,770 --> 01:31:07,050 255، و216، ثم 255 آخر، إذا رجعنا إلى الأسبوع 0، 1923 01:31:07,050 --> 01:31:09,610 يمكننا الانتقال خلال حسابات التحويل لذلك إلى النظام الثنائي. 1924 01:31:09,610 --> 01:31:12,780 وحتى إذا كان ذلك يستغرق وقتًا، فهذا هو معادل النظام الثنائي. 1925 01:31:12,780 --> 01:31:15,890 وبصراحة، الرقم الأول والأخير سهلين نوعًا ما. 1926 01:31:15,890 --> 01:31:19,650 255 هو قيمة خاصة نوعًا ما لأنه مع 8 وحدات بت، كلهم 1927 01:31:19,650 --> 01:31:21,990 1، وهذا ما يمنحك 255. 1928 01:31:21,990 --> 01:31:23,800 إذن فإن الشيء الوحيد الصعب هو هذا في الواقع. 1929 01:31:23,800 --> 01:31:25,710 لكن مَن يهتم بالرياضيات اليوم. 1930 01:31:25,710 --> 01:31:28,650 ونحن نعلم منذ أسابيع أننا يمكننا القيام بذلك إذا حاولنا حقًا. 1931 01:31:28,650 --> 01:31:36,060 ولكن لاحظوا أن وحدات البايت هي 8 وحدات بايت، وبالطبع، ثمانية هي زوج من أربعة، 1932 01:31:36,060 --> 01:31:37,020 إذا صح التعبير. 1933 01:31:37,020 --> 01:31:41,100 حسنًا الشيء الجيد حقًا في السداسيّ العشريّ هو أنه يبدأ في 0 1934 01:31:41,100 --> 01:31:41,860 وينتهي في f. 1935 01:31:41,860 --> 01:31:46,400 وهذا 0، 1، 2، 3، 4، 5، 6، 7، 8، 9-- 1936 01:31:46,400 --> 01:31:47,860 انتظروا-- نعم، هذا هو 10. 1937 01:31:47,860 --> 01:31:48,360 حسنًا. 1938 01:31:48,360 --> 01:31:51,540 ثم a، b، c، d، e، f. 1939 01:31:51,540 --> 01:31:55,140 لقد عددت 16 إصبعًا في المجمل، وبالتالي، السداسيّ العشريّ. 1940 01:31:55,140 --> 01:32:00,930 الشيء الجيد في base-16 هو كم عدد وحدات البايت التي أحتاجها للعدّ من 0 1941 01:32:00,930 --> 01:32:02,310 إلى-- 1942 01:32:02,310 --> 01:32:03,420 واحد، اثنان، ثلاثة، أربعة-- 1943 01:32:03,420 --> 01:32:05,700 15؟ 1944 01:32:05,700 --> 01:32:06,810 4 فقط، أليس كذلك؟ 1945 01:32:06,810 --> 01:32:09,810 لذلك إذا كان لديّ جميع وحدات بايت 0، هذا 0. 1946 01:32:09,810 --> 01:32:13,310 وكان لديّ 1 4 وحدة بايت، وهو-- 1947 01:32:13,310 --> 01:32:13,860 لنرى. 1948 01:32:13,860 --> 01:32:19,240 هذا هو 8 زائد 4 زائد 2 زائد 1 يعطيني 15. 1949 01:32:19,240 --> 01:32:23,130 إذن خلاصة القول، السداسيّ العشريّ مناسب للغاية لأن 0 خلال f 1950 01:32:23,130 --> 01:32:25,530 يقترن بصورة رائعة بسيطة بـ 4 وحدات بايت. 1951 01:32:25,530 --> 01:32:28,410 إذن، إنها طريقة لطيفة للتفكير حول العالم وليس بوحدات 8 1952 01:32:28,410 --> 01:32:29,970 ولكن في 4 بدلاً من ذلك. 1953 01:32:29,970 --> 01:32:32,100 إذن كل ما فعلته هنا أنني أخذت قيمي وقمت فقط 1954 01:32:32,100 --> 01:32:34,020 بإضافة مسافة للتوضيح 1955 01:32:34,020 --> 01:32:36,270 أن 8 وحدات بايت مثل زوج من 4 وحدات بايت. 1956 01:32:36,270 --> 01:32:41,060 يتضح الآن أن 1 1 1 1 هو f للأسباب التي ذكرتها سابقًا. 1957 01:32:41,060 --> 01:32:45,000 كل الآحاد تكون f، والمعروف أيضًا بـ 15. 1958 01:32:45,000 --> 01:32:47,400 جميع الآحاد مجددًا تكون f، والمعروف أيضًا بـ 15. 1959 01:32:47,400 --> 01:32:55,770 إذا قمنا بعملية حسابية، فإن 1 1 0 1 هو d، و1 0 0 0 هو 8، ومن ثم جميع الآحاد هي f وf. 1960 01:32:55,770 --> 01:32:59,010 إذن خلاصة القول، توجد طريقة للتحويل من الأرقام العشرية 1961 01:32:59,010 --> 01:33:01,690 إلى النظام الثنائي، إلى السداسيّ العشريّ، إلى أي عدد من الأنظمة الأساسية الأخرى. 1962 01:33:01,690 --> 01:33:03,900 كل ذلك فقط يتلخص في ما هي الأرقام التي تهتم بها. 1963 01:33:03,900 --> 01:33:05,940 والطريقة التي تكتب بها هذا، لسؤالك في وقت سابق، 1964 01:33:05,940 --> 01:33:07,020 بالتقليد الإنساني. 1965 01:33:07,020 --> 01:33:12,810 ليس فقط FFDAFF، ولكن 0xFF0xD80xFF لسبب فقط. 1966 01:33:12,810 --> 01:33:14,730 ثم يتضح إلى المستخدم ماذا يكون ذلك. 1967 01:33:14,730 --> 01:33:17,040 إذن بعض المرح الآن. 1968 01:33:17,040 --> 01:33:19,560 أنا آسف لفعلي هذا بكم، ولكن آمل من كل ذلك أن تفهموا 1969 01:33:19,560 --> 01:33:21,420 هذه الصورة الهزلية ​​الشهيرة. 1970 01:33:26,860 --> 01:33:29,910 حسنًا، مرحبًا بكم في هذا النادي الخاص بالأشخاص الذين يفهمون أشياء من هذا القبيل. 1971 01:33:29,910 --> 01:33:35,130 لذا دعونا الآن نعثر على مشكلة واحدة أخيرة فقط، 1972 01:33:35,130 --> 01:33:37,220 وسنتناولها في المنزل عن طريق وضعها في السياق 1973 01:33:37,220 --> 01:33:41,480 مجالاً مثيرًا جدًا من الطب الشرعي حيث جميع تلك العناصر الأساسية 1974 01:33:41,480 --> 01:33:42,490 ستدخل حيز التشغيل. 1975 01:33:42,490 --> 01:33:44,040 لكن دعونا نبدأ أولاً بمشكلة. 1976 01:33:44,040 --> 01:33:47,600 لنفترض أنني أريد تنفيذ دالة هنا تسمّى swap غرضها في الحياة 1977 01:33:47,600 --> 01:33:49,460 هو فقط المبادلة بين قيمتين، a وb. 1978 01:33:49,460 --> 01:33:50,960 أريد فقط تبديل الصف. 1979 01:33:50,960 --> 01:33:55,100 دعونا أولاً نقوم بذلك كوجبة خفيفة في منتصف المحاضرة على الأقل 1980 01:33:55,100 --> 01:33:55,700 شخص واحد. 1981 01:33:55,700 --> 01:33:57,180 هل يمكن أن يتطوّع شخص ما ويأتي إلى هنا-- 1982 01:33:57,180 --> 01:33:57,980 حسنًا، كان ذلك سريعًا. 1983 01:33:57,980 --> 01:34:00,380 متطوعة، تعالي. 1984 01:34:00,380 --> 01:34:01,460 ما اسمك؟ 1985 01:34:01,460 --> 01:34:02,880 كيلي، حسنًا. 1986 01:34:02,880 --> 01:34:04,510 شكرًا لتطوعك بشكل مفاجئ. 1987 01:34:08,180 --> 01:34:10,020 كيلي، ديفيد، سررت بلقائك. 1988 01:34:10,020 --> 01:34:12,200 حسنًا، مهمة بسيطة جدًا في متناول اليد. 1989 01:34:12,200 --> 01:34:16,380 لدي هنا كوبين فارغين، ولدينا بعض من عصير البرتقال. 1990 01:34:19,780 --> 01:34:22,700 حسنًا، ضَعي هذا هنا. 1991 01:34:22,700 --> 01:34:27,190 ولدينا بعض الحليب هنا. 1992 01:34:27,190 --> 01:34:30,170 هذا يجب أن تظهر، ألوان مختلفة للغاية. 1993 01:34:30,170 --> 01:34:35,130 حسنًا، أود فقط أن تقومي، كيلي، إذا أمكنك ذلك، بتبديل تلك القيمتين. 1994 01:34:35,130 --> 01:34:37,300 البرتقال إلى حليب، والحليب إلى برتقال، من فضلك. 1995 01:34:42,750 --> 01:34:44,690 هذا غش، حسنًا؟ 1996 01:34:44,690 --> 01:34:46,140 لا، أعني حرفيًا الأكواب. 1997 01:34:46,140 --> 01:34:47,730 لقد وضعتهما في الكوب الخاطئ، وأفضل أن يكون الحليب 1998 01:34:47,730 --> 01:34:50,430 في الكوب الآخر وعصير البرتقال في الكوب الآخر، أنا آسف. 1999 01:34:53,490 --> 01:34:54,940 الجمهور: أسكبي من الزجاجة. 2000 01:34:54,940 --> 01:34:57,030 ديفيد مالان: لا، هذا غير متاح لك، حسنًا؟ 2001 01:34:57,030 --> 01:34:58,160 [LAUGHTER] 2002 01:34:58,160 --> 01:34:59,580 حسنًا، إذًا أنت تعانين. 2003 01:34:59,580 --> 01:35:00,540 لماذا تعانين؟ 2004 01:35:00,540 --> 01:35:02,130 كيلي: لأنني سأقوم بمزجهما. 2005 01:35:02,130 --> 01:35:03,380 ومن ثم لن يكون الأمر ذاته. 2006 01:35:03,380 --> 01:35:04,170 ديفيد مالان: حسنًا. 2007 01:35:04,170 --> 01:35:06,870 لذا من الواضح أنني أعني، هذه مسألة خاسرة نوعًا ما. 2008 01:35:06,870 --> 01:35:07,620 أنه لا يمكنك القيام بذلك بالفعل. 2009 01:35:07,620 --> 01:35:09,600 فما الذي قد يجعل هذا الأمر أسهل بالنسبة لك بجانب وضعهم مجددًا 2010 01:35:09,600 --> 01:35:10,410 في الزجاجات؟ 2011 01:35:10,410 --> 01:35:11,170 كيلي: وجود كوب آخر. 2012 01:35:11,170 --> 01:35:11,920 ديفيد مالان: أجل. 2013 01:35:11,920 --> 01:35:14,790 لذا فأنتي بحاجة إلى ما يكون بمثابة مساحة تخزين مؤقتة لهذا. 2014 01:35:14,790 --> 01:35:15,540 أنتم تعرفوا، دعوني-- 2015 01:35:15,540 --> 01:35:18,860 تارا، هل يمكننا العثور على بعض الأكواب الإضافية هنا؟ 2016 01:35:18,860 --> 01:35:21,000 آه، هذا سيجعل الأمر أسهل. 2017 01:35:21,000 --> 01:35:23,060 حسنًا، إذا حصلتي على مساحة تخزين مؤقتة-- 2018 01:35:23,060 --> 01:35:25,270 ها هو-- هل يمكنك حل هذه المشكلة الآن من فضلك؟ 2019 01:35:28,630 --> 01:35:30,670 آه، جميل جدًا. 2020 01:35:30,670 --> 01:35:35,450 القليل من التلوث، لكن لا بأس. 2021 01:35:35,450 --> 01:35:37,570 لكن أحتاج إلى إعادة ذلك الكوب المؤقت إلى تارا. 2022 01:35:37,570 --> 01:35:39,130 أجل، حسنًا. 2023 01:35:39,130 --> 01:35:40,090 شكرًا لكِ. 2024 01:35:40,090 --> 01:35:42,550 حسنًا، صفقوا بحرارة رجاءً لكيلي هنا. 2025 01:35:42,550 --> 01:35:44,390 [APPLAUSE] 2026 01:35:44,390 --> 01:35:45,190 حسنًا، ها نحن ذا. 2027 01:35:45,190 --> 01:35:47,530 أعتقد أنك لا تريدين حليب دافئ، لكن ما رأيك في عصير البرتقال؟ 2028 01:35:47,530 --> 01:35:48,020 حسنًا. 2029 01:35:48,020 --> 01:35:48,790 شكرًا جزيلاً لكِ. 2030 01:35:48,790 --> 01:35:50,650 حسنًا، ما هو المغزى هنا؟ 2031 01:35:50,650 --> 01:35:51,560 هذا سهل جدًا. 2032 01:35:51,560 --> 01:35:53,650 مثل عندما تكون لديك مساحة تخزين 2033 01:35:53,650 --> 01:35:57,440 مؤقتة-- متغير، إذا صح التعبير، على سبيل المثال لا توجد مشكلة لتبديل القيمتين. 2034 01:35:57,440 --> 01:36:00,380 لذا دعوني أمضي قدمًا وأقوم بذلك على النحو التالي. 2035 01:36:00,380 --> 01:36:03,040 سأمضي قدمًا وسأقوم فقط بتنفيذ دالة التبديل هذه 2036 01:36:03,040 --> 01:36:06,060 وأرى بالضبط ما قامت كيلي فقط بتنفيذه في النهاية. 2037 01:36:06,060 --> 01:36:09,730 إذا كان الهدف هو تبديل a وb، فلا يمكنني فقط القيام بتبديل صف كامل، 2038 01:36:09,730 --> 01:36:10,390 كما يبدو. 2039 01:36:10,390 --> 01:36:13,900 أحتاج إلى وضع إحدى هذه القيم، مثل الحليب، في كوب آخر، 2040 01:36:13,900 --> 01:36:15,400 ومن ثم تبديلها، ثم تبديلها. 2041 01:36:15,400 --> 01:36:17,470 لذا هي تتطلب ثلاث خطوات، وليست خطوة واحدة. 2042 01:36:17,470 --> 01:36:20,110 حسنًا، إذًا يمكنني تسمية هذا كوب أو متغير إضافي 2043 01:36:20,110 --> 01:36:22,570 لقد قدّمت لنا تارا أي شيء نريده-- tmp. 2044 01:36:22,570 --> 01:36:25,510 إذن سأقوم فقط بوضع a في tmp. 2045 01:36:25,510 --> 01:36:28,840 ثم سأقوم بوضع b في a، لأن a فارغة الآن. 2046 01:36:28,840 --> 01:36:31,350 ثم سأقوم بوضع tmp في b، ومن ثم لن أهتم حقًا 2047 01:36:31,350 --> 01:36:34,060 بما سيحدث لـ tmp-- في الواقع، إنه ما زال في مكانه هنا، 2048 01:36:34,060 --> 01:36:35,990 لكن تمت المهمة الآن. 2049 01:36:35,990 --> 01:36:39,910 لذا دعوني أمضي قدمًا وأري هل هذا البرنامج قيد التشغيل، لأن من الواضح يجب 2050 01:36:39,910 --> 01:36:41,290 أن يكون هذا مباشرًا للغاية. 2051 01:36:41,290 --> 01:36:44,560 لذلك دعوني أمضي قدمًا وأشغّل البرنامج 2052 01:36:44,560 --> 01:36:48,220 في سياق دالة رئيسية حيث يمكننا تشغيلها بالفعل. 2053 01:36:48,220 --> 01:36:51,330 في هذه التعليمة البرمجية، سأقوم بشرحها على النحو التالي. 2054 01:36:51,330 --> 01:36:52,330 ها هي دالتي الرئيسية. 2055 01:36:52,330 --> 01:36:55,420 سأقوم بتسمية متغير x، وأعطيه 1، وسأقوم بتسمية متغير y، 2056 01:36:55,420 --> 01:36:58,770 وأعطيه 2، وسأمضي قدمًا وسأقوم بالطباعة فقط من أجل فحص السلامة السريع-- 2057 01:36:58,770 --> 01:37:00,880 x هو هذا، y هو ذاك. 2058 01:37:00,880 --> 01:37:04,690 ومن ثم سأقوم بتسمية دالة المبادلة البسيطة الرائعة هذه، x، y. 2059 01:37:04,690 --> 01:37:08,350 ومن ثم سأقوم بطباعة نفس الشيء بالضبط-- x هو هذا، y هو ذاك، 2060 01:37:08,350 --> 01:37:09,950 لذا يمكنني رؤية ذلك في تلك المتغيرات-- 2061 01:37:09,950 --> 01:37:12,550 يمكنني أيضًا استخدام debug50، لكن من المفترض أن يكون هذا حلاً كاملاً، 2062 01:37:12,550 --> 01:37:13,900 أريد أنا أراه على الشاشة. 2063 01:37:13,900 --> 01:37:14,710 ها هي المبادلة. 2064 01:37:14,710 --> 01:37:16,660 لقد نسخت ولصقت هذا من قبل. 2065 01:37:16,660 --> 01:37:18,910 يبدو أن هذا لا يتطلب التفكير، فهو مباشر للغاية، 2066 01:37:18,910 --> 01:37:24,070 دعوني أنتقل إلى دليلي، وأقوم بتحويل هذا البرنامج برمجيًا، وهو، مفسد قليلاً، 2067 01:37:24,070 --> 01:37:26,890 noswap هو اسمه. 2068 01:37:26,890 --> 01:37:30,030 ./noswap. 2069 01:37:30,030 --> 01:37:32,480 أووف. 2070 01:37:32,480 --> 01:37:34,130 دعوني أقوم بالتكبير. 2071 01:37:34,130 --> 01:37:35,930 كلا، هذا ليس ما كنت أعنيه، أليس كذلك؟ 2072 01:37:35,930 --> 01:37:38,680 أنا أعني بالفعل أن يصبح الحليب عصير برتقال، ويصبح عصير البرتقال حليبًا، 2073 01:37:38,680 --> 01:37:42,250 أو x تصبح y، وy تصبح x، لا يبدو أن هذا يعمل. 2074 01:37:42,250 --> 01:37:45,050 ومجددًا، السحر الوحيد هو أن هذا الشيء يدعو إلى المبادلة. 2075 01:37:45,050 --> 01:37:47,050 حسنًا، ربما قد يعمل فقط لبعض الوقت. 2076 01:37:47,050 --> 01:37:49,350 إذن لا، كلا-- حسنًا. 2077 01:37:49,350 --> 01:37:50,650 الآن حان وقت مصحح الأخطاء. 2078 01:37:50,650 --> 01:37:52,690 أنا لا أفهم ما الذي يجري في برنامجي، 2079 01:37:52,690 --> 01:37:54,730 لا يضيء printf بالفعل هنا. 2080 01:37:54,730 --> 01:37:58,830 لذا دعوني أمضي قدمًا وأشغّل debug50 ./noswap. 2081 01:37:58,830 --> 01:38:00,960 تم فتح لوحات تصحيح الأخطاء جانبًا، 2082 01:38:00,960 --> 01:38:02,740 لكن تمهلوا، أحتاج إلى نقطة توقف. 2083 01:38:02,740 --> 01:38:05,960 سأقوم ببدء نقطة توقف في الأعلى، السطر الأول الذي أهتم به. 2084 01:38:05,960 --> 01:38:08,350 أنا حقًا لا أهتم بالأشياء الموجودة في الجزء العلوي. 2085 01:38:08,350 --> 01:38:12,630 الآن سأمضي قدمًا وأعيد تشغيل debug50 ./noswap، أليس كذلك؟ 2086 01:38:12,630 --> 01:38:15,980 أرى الآن هنا، أنه تم تمييز أول السطر 9. 2087 01:38:15,980 --> 01:38:17,940 لاحظوا في الجهة اليمنى، قد تكون هذه هي الإجابة بمثال 2088 01:38:17,940 --> 01:38:20,190 على سؤالك السابق. 2089 01:38:20,190 --> 01:38:23,790 x وy بشكل مناسب، لكن فقط لأننا انتقلنا إلى 0-- 2090 01:38:23,790 --> 01:38:26,800 لم أقم بذلك، أنا لا يجب بالضرورة أن أثق في هذا في جميع السياقات، 2091 01:38:26,800 --> 01:38:28,460 ولكن هذا هو سبب امتلاكهم قيم. 2092 01:38:28,460 --> 01:38:31,800 فهم بخلاف ذلك يتم تعريفهم بقيم ضئيلة، لكنني محظوظ مع الأصفار هنا. 2093 01:38:31,800 --> 01:38:34,800 دعوني أمضي قدمًا وأنتقل إلى هذا السطر، وإذا كنتم ترون ذلك، وإن كان صغيرًا، 2094 01:38:34,800 --> 01:38:39,370 في الجانب الأيمن، فيجب أن يأخذ x القيمة 1. 2095 01:38:39,370 --> 01:38:43,470 وإذا انتقلت إلى سطر واحد آخر، فيجب أن يأخذ y القيمة 2. 2096 01:38:43,470 --> 01:38:46,230 حسنًا، إذن أنا واثق تمامًا أن البرنامج حتى الآن صحيح. 2097 01:38:46,230 --> 01:38:48,690 سأمضي قدمًا وسأنتقل إلى printf. 2098 01:38:48,690 --> 01:38:51,760 ولاحظوا في النافذة الطرفية الزرقاء، أنا أرى خرجًا واحدًا. 2099 01:38:51,760 --> 01:38:53,310 الآن تصبح الأشياء مثيرة للاهتمام. 2100 01:38:53,310 --> 01:38:57,000 إذا تابعت في الانتقال عبر السطور، فسينهي ذلك التشغيل فقط 2101 01:38:57,000 --> 01:38:58,320 وهذا ليس كافيًا. 2102 01:38:58,320 --> 01:39:02,190 لذا لاحظوا هذه المرة سأقوم بالتمرير فوق الرمز الثالث هذا، Step Into. 2103 01:39:02,190 --> 01:39:03,970 الآن يمكنني نوعًا ما النزول في جحر الأرنب، 2104 01:39:03,970 --> 01:39:07,410 إذا جاز التعبير، والدخول إلى دالة المبادلة، ولاحظوا، 2105 01:39:07,410 --> 01:39:09,730 أن مصحح الأخطاء ينتقل إلى الدالة الأخرى تلك. 2106 01:39:09,730 --> 01:39:11,700 إذن هنا الآن، تغيّر السياق. 2107 01:39:11,700 --> 01:39:15,870 متغيراتي المحلية الآن هي a، وb، وtmp، وهذا حقًا أمر غريب. 2108 01:39:15,870 --> 01:39:21,300 A هو 1، b هو 2، كما هو متوقع، لأنني تجاوزت x، y. 2109 01:39:21,300 --> 01:39:25,680 وفي سياق هذه الدالة أطلق عليهما a، b فقط. 2110 01:39:25,680 --> 01:39:29,750 لكن لماذا tmp 32,767؟ 2111 01:39:29,750 --> 01:39:32,250 فقط لأنه لا يمكن الوثوق به، إنه قيمة ضئيلة. 2112 01:39:32,250 --> 01:39:36,060 إذا أعطيت نفسك قيمة مؤقتة، مَن يدري ما الذي يوجد هناك؟ 2113 01:39:36,060 --> 01:39:38,550 نحن محظوظون، وليس لدى تارا أي شيء في هذا الكوب، 2114 01:39:38,550 --> 01:39:41,670 ولكن قد يكون له قيمة ضئيلة، ربما يحتوي على بعض المياه الغازية، 2115 01:39:41,670 --> 01:39:44,400 ومن ثم كان يجب علينا استبدال تلك القيمة بطريقة ما. 2116 01:39:44,400 --> 01:39:47,430 حتى نكون واضحين، عندما تعلن عن متغيرات في برنامج، 2117 01:39:47,430 --> 01:39:50,730 كثيرًا ما تحتوي على قيم ضئيلة، مجرد قيم وهمية-- 2118 01:39:50,730 --> 01:39:53,920 فالأصفار والآحاد الموجودة هناك أسفل الغطاء في هذه الشريحة، 2119 01:39:53,920 --> 01:39:55,320 ولكن لم تقم بتعيينها بنفسك. 2120 01:39:55,320 --> 01:39:59,850 ولكن لا بأس، لأنني صراحةً في إعداد السطر التالي هذا حيث tmp يعادل a. 2121 01:39:59,850 --> 01:40:04,290 لذا لا يهم ما كانت قيمته الغريبة الأصلية، إذا قمت بالنقر على التالي، 2122 01:40:04,290 --> 01:40:06,460 tmp الآن يعادل 1، ويُعرف أيضًا بـ 2123 01:40:06,460 --> 01:40:07,800 a. 2124 01:40:07,800 --> 01:40:11,530 لاحظوا الآن أن a ستصبح b إذا نظرتم إلى الجانب الأيمن. 2125 01:40:11,530 --> 01:40:15,780 الآن يبدو أن لدي a يعادل 2، b يعادل 2، والذي يعد أمرًا مزعجًا قليلاً ولكنه ليس بهذا السوء، 2126 01:40:15,780 --> 01:40:18,870 لأن لدي المتغير المنفصل هذا tmp، لذا ما زال لدي متغير في الجوار. 2127 01:40:18,870 --> 01:40:23,070 حتى الآن b على وشك أن تصبح 1، وقمت بتنفيذ تبديل صف. 2128 01:40:23,070 --> 01:40:28,170 حسنًا، عند هذه النقطة في القصة، السطر 22، تبدو التعليمة البرمجية صحيحة. 2129 01:40:28,170 --> 01:40:31,050 b أصبحت a، وa أصبحت b، ويتم تبديل القيم-- 2130 01:40:31,050 --> 01:40:34,950 ويؤكد لي مصحح الأخطاء هذا ذلك بشكل مرئي. 2131 01:40:34,950 --> 01:40:40,200 إذن الآن، دعونا نقوم بخطوة و-- 2132 01:40:40,200 --> 01:40:42,860 اللعنة. 2133 01:40:42,860 --> 01:40:44,290 لقد فقدته. 2134 01:40:44,290 --> 01:40:46,120 ما الذي يجري؟ 2135 01:40:46,120 --> 01:40:46,900 بشكل حدسي؟ 2136 01:40:46,900 --> 01:40:53,310 حتى ولو لم تروه أو تقوموا به من قبل، من الواضح إنه خطأ. 2137 01:40:53,310 --> 01:40:55,470 ما هو هذا الخطأ؟ 2138 01:40:55,470 --> 01:40:56,430 ماذا يجب أن يحدث؟ 2139 01:40:56,430 --> 01:40:57,390 أجل؟ 2140 01:40:57,390 --> 01:41:02,130 الجمهور: [INAUDIBLE] [INAUDIBLE] قيمة جديدة 2141 01:41:02,130 --> 01:41:04,130 ليس لها نفس عنوان القيمة الأولى؟ 2142 01:41:04,130 --> 01:41:04,880 ديفيد مالان: أجل. 2143 01:41:04,880 --> 01:41:07,780 ما يبدو أنه سيحدث هنا هو أجل، أنك تمر في x وy 2144 01:41:07,780 --> 01:41:12,490 وتطلق على ذلك a وb، لكن يبدو أن a وb هي نسخ من x وy. 2145 01:41:12,490 --> 01:41:16,360 وأنني أقوم بتبديل a وb بشكل صحيح وناجح جدًا، 2146 01:41:16,360 --> 01:41:20,470 ولكن نظرًا لأنها نُسخ، فليس لها تأثير على x و y الأصليين. 2147 01:41:20,470 --> 01:41:23,110 لذا فإن استعارتنا هنا للعصير ليست ملائمة تمامًا 2148 01:41:23,110 --> 01:41:27,550 لأنني لم أمرر نُسخ كيلي من عصير البرتقال و الحليب، 2149 01:41:27,550 --> 01:41:31,930 لقد ناولتُها عصير البرتقال والحليب الفعليين وتمكنت هي من تغيير القيم. 2150 01:41:31,930 --> 01:41:35,590 ولكن في سياق لغة C والتعليمة البرمجية، عندما تقوم بتمرير الوسيطات إلى دالة، 2151 01:41:35,590 --> 01:41:38,600 فإنك تمرر نُسخًا من تلك الوسيطات إلى الدالة. 2152 01:41:38,600 --> 01:41:41,230 إذن بديهيًا، ما هو الحل؟ 2153 01:41:41,230 --> 01:41:45,280 لا يمكننا بالتأكيد المرور من دالة واحدة لنُسخ أخرى من القيم إذا كنا 2154 01:41:45,280 --> 01:41:48,220 نتوقع مبادلة الدالة، أو المعروفة أيضًا باسم 2155 01:41:48,220 --> 01:41:51,020 كيلي، لإجراء بعض التغييرات المفيدة لنا. 2156 01:41:51,020 --> 01:41:55,390 ما الذي يجب علينا تمريره إلى الدالة أو إلى كيلي بدلاً من ذلك؟ 2157 01:41:55,390 --> 01:41:57,670 عناوين تلك القيم، أليس كذلك؟ 2158 01:41:57,670 --> 01:42:00,250 أخبرتُها بمكان الحليب وعصير البرتقال. 2159 01:42:00,250 --> 01:42:03,010 لم أعطها نُسخًا منها، قلت لها، ها هو الحليب، 2160 01:42:03,010 --> 01:42:05,040 ها هو عصير البرتقال، استبدلي هذين. 2161 01:42:05,040 --> 01:42:06,880 في هذا الإصدار من التعليمة البرمجية، لقد قلتُ للتو، 2162 01:42:06,880 --> 01:42:10,870 ها هي نسخة من x، وها هي نسخة من y، يمكنك تسميتهما a وb-- نعم. 2163 01:42:10,870 --> 01:42:14,960 نحتاج الآن لاستخدام حرف العطف أو شيء من هذا القبيل للتمرير في خريطة، 2164 01:42:14,960 --> 01:42:15,460 إن شئت. 2165 01:42:15,460 --> 01:42:20,320 خريطة الكنز لتلك القيم وبالتالي المبادلة يمكنها تغيير القيم الأصلية. 2166 01:42:20,320 --> 01:42:22,960 والطريقة التي نفعل بها هذا تبدو غريبة قليلاً، 2167 01:42:22,960 --> 01:42:27,940 لكن كل ما سيتوجب علينا القيام به هو إجراء إضافة بسيطة هنا 2168 01:42:27,940 --> 01:42:30,130 والتي تبدو كما يلي. 2169 01:42:30,130 --> 01:42:33,620 يجب أن تبدو مثل هذا بدلاً من ذلك. 2170 01:42:33,620 --> 01:42:35,470 إذن هذا هو الإصدار المعطّل. 2171 01:42:35,470 --> 01:42:39,370 أو معطل بافتقاده للتأثير الذي نقصده حتى بالرغم من عمله. 2172 01:42:39,370 --> 01:42:41,830 هذا هو ما نحتاج للقيام به بدلاً من ذلك، وهو آخر جزء 2173 01:42:41,830 --> 01:42:43,290 من التعبير الجديد بالرموز في الوقت الحالي. 2174 01:42:43,290 --> 01:42:45,250 لقد رأينا نجمة في مكانين مختلفين 2175 01:42:45,250 --> 01:42:48,220 من قبل، ونحن الآن نستخدمها في سياق نهائي واحد. 2176 01:42:48,220 --> 01:42:53,380 عند تحديدك لنجمة هنا وهنا في الوسيطات إلى دالة، فتلك 2177 01:42:53,380 --> 01:42:55,420 تحديدًا هي الطريقة التي تقول بها للكمبيوتر، أنا 2178 01:42:55,420 --> 01:42:58,120 لا أتوقع عددًا صحيحًا int، بل عنوان عدد صحيح int. 2179 01:42:58,120 --> 01:43:00,620 أنا لا أتوقع عددًا صحيحًا int هنا، بل عنوان عدد صحيح int. 2180 01:43:00,620 --> 01:43:03,820 إذن مؤشران اثنان، وعنوانان اثنان لأعداد صحيحة. 2181 01:43:03,820 --> 01:43:06,160 بالأسفل هنا، tmp هي ما زالت مجرد عدد صحيح int. 2182 01:43:06,160 --> 01:43:08,930 لستُ بحاجة لإمعان التفكير في tmp، إنه مجرد كوب فارغ. 2183 01:43:08,930 --> 01:43:11,710 أعطني عددًا صحيحًا باسم tmp من الأسبوع الأول. 2184 01:43:11,710 --> 01:43:14,530 لكن، ما الذي أريد تخزينه في tmp؟ 2185 01:43:14,530 --> 01:43:17,440 كل من a وb في هذا الإصدار عبارة عن عنوانين. 2186 01:43:17,440 --> 01:43:22,670 هل أريد أن أتذكر العنوان a والعنوان b؟ 2187 01:43:22,670 --> 01:43:25,760 لا، بل أريد أن أتذكر حجم عصير البرتقال، حجم الحليب، 2188 01:43:25,760 --> 01:43:30,080 أريد أن أتذكر 1 و2، لا أهتم لمكان وجودهما في الذاكرة. 2189 01:43:30,080 --> 01:43:34,760 لذا فإن النجمة في هذا السياق، عندما لا يوجد ذكر لنوع البيانات، 2190 01:43:34,760 --> 01:43:37,410 فهناك فقط نجمة واسم متغير. 2191 01:43:37,410 --> 01:43:39,710 ذلك المتغير هو مؤشر وليس عملية ضرب، 2192 01:43:39,710 --> 01:43:41,260 فلا توجد هنا عمليات رياضية. 2193 01:43:41,260 --> 01:43:46,640 تلك النجمة هي عامل تشغيل الإسناد المؤشري الذي يقول، انتقل إلى هذا العنوان 2194 01:43:46,640 --> 01:43:48,330 واحصل على القيمة هناك. 2195 01:43:48,330 --> 01:43:52,370 لذلك فإذا كان هذا العنوان a في الموقع، فلا أعرف، 100 مثلما كان Brian، 2196 01:43:52,370 --> 01:43:55,700 وكان هذا العنوان b في الموقع 900 مثلما كانت Veronica، 2197 01:43:55,700 --> 01:44:01,460 فإن *a تعني الانتقال إلى وحدة البايت صاحبة الترتيب رقم 100 في الذاكرة وحصولي على تلك القيمة، وهي 1. 2198 01:44:01,460 --> 01:44:06,290 هذا يعني، بالأسفل هنا، الانتقال إلى العنوان b، وحصولي على تلك القيمة في العنوان 900، 2199 01:44:06,290 --> 01:44:07,880 وهي 2. 2200 01:44:07,880 --> 01:44:10,970 والمضي قدمًا وتخرين 1 في tmp. 2201 01:44:10,970 --> 01:44:13,790 امضِ قدمًا وانتقل إلى ذلك العنوان وضعه أيًا ما كان 2202 01:44:13,790 --> 01:44:17,600 في عنوان b-- إذن احصل على ذلك العنوان وضَعه هناك-- واحصل على ذلك العنوان، 2203 01:44:17,600 --> 01:44:21,140 واحصل على القيمة، وضَعها هناك في ذلك العنوان عن طريق الإسناد المؤشري. 2204 01:44:21,140 --> 01:44:26,610 وأخيرًا، انتقل إلى b في الذاكرة، كتلك الموجودة هناك، وضَع قيمة tmp هناك. 2205 01:44:26,610 --> 01:44:29,210 لذا في حين أن علامة العطف في المثال السابق لدينا تعني، 2206 01:44:29,210 --> 01:44:32,990 أخبرني ما هو عنوان متغير ما، والنجمة هي العكس. 2207 01:44:32,990 --> 01:44:35,660 عندما يكون لديك عنوان، فإنها تقول، انتقل إلى ذلك العنوان. 2208 01:44:35,660 --> 01:44:39,710 اتبع خريطة الكنز، حيث تحدد X المكان في ذلك الموقع في الذاكرة، 2209 01:44:39,710 --> 01:44:41,250 واحصل عليه عند قيمته. 2210 01:44:41,250 --> 01:44:43,150 إذن ما هو التأثير الصافي هنا؟ 2211 01:44:43,150 --> 01:44:47,150 إذا قمتُ الآن بالفعل بفتح ليس هذا المثال، بل swap.c-- 2212 01:44:47,150 --> 01:44:50,330 أداة التعطيل، فستعمل هذه الأداة بالفعل. 2213 01:44:50,330 --> 01:44:55,790 إذا قمتُ الآن بفتح swap.c، فسنرى الآن ما يلي بدلاً من ذلك. 2214 01:44:55,790 --> 01:44:58,900 التعليمة البرمجية هي نفسها تقريبًا، باستثناء أني قمتُ بلصقها 2215 01:44:58,900 --> 01:45:01,460 في هذا الإصدار الأخضر الجديد للدالة. 2216 01:45:01,460 --> 01:45:03,500 ولاحظوا هنا، أنه حدث تغيير لهذا. 2217 01:45:03,500 --> 01:45:12,160 لماذا أكتب الآن &x و$y بدلاً من x وy فقط؟ 2218 01:45:12,160 --> 01:45:17,500 الجمهور: [INAUDIBLE] عنوان [INAUDIBLE] دوال [INAUDIBLE].. 2219 01:45:17,500 --> 01:45:18,490 ديفيد مالان: بالضبط. 2220 01:45:18,490 --> 01:45:20,440 دالة المبادلة الآن، يُتوقّع للإصدار المحسن الجديد 2221 01:45:20,440 --> 01:45:23,140 عنوانان-- نجمتان. 2222 01:45:23,140 --> 01:45:26,140 كل نجمة، كما هي معروفة أيضًا باسم المؤشرات، ليست مجرد قيم. 2223 01:45:26,140 --> 01:45:30,100 لذا فهذا يعني أنني أعرف أن x وy هما بالفعل عددان صحيحان من الأسبوع الأول. 2224 01:45:30,100 --> 01:45:32,290 والآن أحتاج لعنوان x وعنوان y 2225 01:45:32,290 --> 01:45:35,570 بحيث يمكن لهذه المبادلة اتباع خرائط الكنز هذه، 2226 01:45:35,570 --> 01:45:37,880 إذا جاز التعبير، والانتقال إلى تلك العناوين. 2227 01:45:37,880 --> 01:45:42,550 لذا الآن، عندما أقوم بتشغيل هذا البرنامج، فهذا يشبه إلى حد كبير الاستعارة المستخدمة مع كيلي 2228 01:45:42,550 --> 01:45:44,590 عندما أخبرتها بمكان الحليب وعصير البرتقال. 2229 01:45:44,590 --> 01:45:49,060 الآن قم بالمبادلة وانتقل إلى تلك المواقع على النحو التالي. make swap. 2230 01:45:49,060 --> 01:45:52,250 دعوني أمضي قدمًا ثم أنفّذ ./swap، إدخال-- 2231 01:45:52,250 --> 01:45:52,930 آه! 2232 01:45:52,930 --> 01:45:54,760 يبدو أنها تعمل الآن. 2233 01:45:54,760 --> 01:45:56,680 يمكننا مشاهدة ذلك حتى باستخدام مصحح الأخطاء. 2234 01:45:56,680 --> 01:45:59,950 على الرغم من أنه لايبدو هناك خطأ، فلا يزال بإمكاني استخدام debug50 2235 01:45:59,950 --> 01:46:03,340 لرؤية برنامجي وفهمه، إذا لم يكن واضحًا - أوه، 2236 01:46:03,340 --> 01:46:04,480 ما زلت بحاجة إلى نقطة توقف. 2237 01:46:04,480 --> 01:46:06,190 دعونا نعين نقطة توقف مثلما سبق. 2238 01:46:06,190 --> 01:46:08,170 دعونا نعيد تشغيل debug50. 2239 01:46:08,170 --> 01:46:11,410 ستفتح لي اللوحة اليمنى بشكل تلقائي. 2240 01:46:11,410 --> 01:46:14,890 ودعونا نمضي قدمًا ونرى، ما إذا كنتُ بدأت الانتقال بالتدرج عبر هذا، 2241 01:46:14,890 --> 01:46:23,580 الآن أرى أن x تساوي 1، y تساوي 2، فتقوم الدالة printf بالطباعة بنفس القدر على الشاشة. 2242 01:46:23,580 --> 01:46:26,280 الآن سأمضي قدمًا وأنتقل بالتدرج إلى المبادلة، 2243 01:46:26,280 --> 01:46:29,060 لاحظوا الآن، إنها تبدو غريبة قليلاً، 2244 01:46:29,060 --> 01:46:32,720 لأن a الآن عبارة عن عنوان وb عبارة عن عنوان، 2245 01:46:32,720 --> 01:46:36,830 ولكن لا يزال tmp عددًا صحيحًا int بقيمة مهملة، ولكن يمكنني إصلاح ذلك. 2246 01:46:36,830 --> 01:46:42,000 الآن tmp يساوي 1، لكن لاحظوا، أن قيم a وb لا تتغير، 2247 01:46:42,000 --> 01:46:44,210 ولكن ما هو التغيير الواضح حسب التعليمة البرمجية؟ 2248 01:46:46,960 --> 01:46:49,060 لذا لاحظوا، أن هذا غريب ومشفر. 2249 01:46:49,060 --> 01:46:51,040 a هي قيمة 0x هذه. 2250 01:46:51,040 --> 01:46:54,850 هذا عنوان سداسي عشري كبير، مثل هذا الذي توجد فيه a في الذاكرة. 2251 01:46:54,850 --> 01:46:55,600 ولكن أتدرون ما الأمر؟ 2252 01:46:55,600 --> 01:46:58,920 إذا قمتُ بالنقر فوق المثلث الصغير، فيمكنني نوعًا ما متابعة ذلك المؤشر 2253 01:46:58,920 --> 01:46:59,650 والانتقال إليه. 2254 01:46:59,650 --> 01:47:01,420 يكون مصحح الأخطاء ذكيًا كذلك. 2255 01:47:01,420 --> 01:47:07,120 لذا *a، تنتقل إلى a تساوي 2؛ و*b في هذه اللحظة هي 2، لكن إذا تابعتُ، 2256 01:47:07,120 --> 01:47:11,540 فأنا الآن قمتُ بتبديل مفاجئ، ويمكنكم أن تروا أن هذه القيم قد تغيرت. 2257 01:47:11,540 --> 01:47:13,630 ومرة أخرى، نحن لا نهتم بماهية هذه العناوين، 2258 01:47:13,630 --> 01:47:15,310 لا يهمني ما هي العناوين الفعلية. 2259 01:47:15,310 --> 01:47:17,930 أنا أهتم بأن تمنحني الدوال هذه، لأنني الآن عندما 2260 01:47:17,930 --> 01:47:20,350 أرجع هنا في الطباعة، فإن القيم الآن بالفعل 2261 01:47:20,350 --> 01:47:23,650 قد تغيرت كما كنت أتوقع هذا طوال الوقت. 2262 01:47:23,650 --> 01:47:24,370 حسنًا. 2263 01:47:24,370 --> 01:47:30,820 كان ذلك معقدًا ، لكن نأمل أن يكون موضحًا لسبب عملها الآن حتى رغم أننا قمنا 2264 01:47:30,820 --> 01:47:33,450 بجعل هذه التعليمة البرمجية تبدو أكثر تشفيرًا. 2265 01:47:33,450 --> 01:47:35,290 إن لم يكن ذلك، فأي أسئلة مرحب بها. 2266 01:47:35,290 --> 01:47:35,940 أجل؟ 2267 01:47:35,940 --> 01:47:39,910 الجمهور: هل هذا من المكان الذي [INAUDIBLE] فيه 2268 01:47:39,910 --> 01:47:40,750 ديفيد مالان: آه. 2269 01:47:40,750 --> 01:47:45,180 الجمهور: [INAUDIBLE] النجمة [INAUDIBLE] مؤشرات؟ 2270 01:47:45,180 --> 01:47:46,310 ديفيد مالان: سؤال جيد. 2271 01:47:46,310 --> 01:47:50,260 هل نحن حقًا بحاجة لعلامات العطف هذه لأن لدينا بالفعل 2272 01:47:50,260 --> 01:47:51,220 هذه النجوم هنا؟ 2273 01:47:51,220 --> 01:47:52,930 إجابة مختصرة، نعم، لأجل التماثل. 2274 01:47:52,930 --> 01:47:55,960 هذا يخبر الدالة ما الذي يمكن توقعه خلال العملية؛ 2275 01:47:55,960 --> 01:48:00,900 وهذا ما يخبر جهاز الكمبيوتر ما الذي سيرسله بالفعل. 2276 01:48:00,900 --> 01:48:03,720 إذن ما هي المدخلات الفعلية لهذه الدالة؟ 2277 01:48:03,720 --> 01:48:05,670 يجب أن تكون متناسقة. 2278 01:48:05,670 --> 01:48:06,260 أجل؟ 2279 01:48:06,260 --> 01:48:11,830 الجمهور: تقوم قيمة [INAUDIBLE] بتبديل العناوين. 2280 01:48:11,830 --> 01:48:16,410 ديفيد مالان: نحن نقوم بتبديل ما هو موجود في العناوين. 2281 01:48:16,410 --> 01:48:25,170 الجمهور: إذن ماذا لو قمت بتغيير عنوان [INAUDIBLE] 2282 01:48:25,170 --> 01:48:25,830 ديفيد مالان: حسنًا. 2283 01:48:25,830 --> 01:48:29,300 الجمهور: هل سنقوم بتبديل العناوين بالقول أن 2 موجودة في 200 و1 2284 01:48:29,300 --> 01:48:32,130 موجود في [INAUDIBLE] والتي من الممكن أن تتغير. 2285 01:48:32,130 --> 01:48:36,270 ديفيد مالان: إجابة مختصرة، لا يمكنك للسبب التالي. 2286 01:48:36,270 --> 01:48:41,520 من الناحية الفنية: عندما نقوم بكتابة %x و%y، فسيتم تحويلهما إلى عنوان 2287 01:48:41,520 --> 01:48:42,840 x، وعنوان y. 2288 01:48:42,840 --> 01:48:47,070 فالتبديل من الناحية الفنية هو الحصول على نُسخ من شيء ما، ولم تتغير C. 2289 01:48:47,070 --> 01:48:50,040 لكن تحصل C الآن على نُسخ من عنوان 2290 01:48:50,040 --> 01:48:54,240 x، ونسخ من عنوان y ويطلق عليهما a وb. 2291 01:48:54,240 --> 01:48:57,330 بالتأكيد، يمكنك تبديل العناوين، ولكن للأسباب نفسها كما في السابق، 2292 01:48:57,330 --> 01:48:59,160 فلن يكون لها أي تأثير أساسي. 2293 01:48:59,160 --> 01:49:02,070 الاختلاف هنا هو لأنني أقوم بالتمرير في الخريطة، إذا جاز التعبير، 2294 01:49:02,070 --> 01:49:03,720 إلى x وy، عنوانيهما. 2295 01:49:03,720 --> 01:49:05,130 ومرة أخرى، فإن العنوان مثل-- 2296 01:49:05,130 --> 01:49:08,790 أعتقد أننا الآن في 45 Quincy Street-- 2297 01:49:08,790 --> 01:49:10,770 Cambridge، Massachusetts 02138، USA. 2298 01:49:10,770 --> 01:49:12,450 هذا يميز المبنى بشكل فريد. 2299 01:49:12,450 --> 01:49:16,120 تحدد هذه الأرقام السداسية العشرية الخاصة بـ 0x المواقع في الذاكرة بشكل فريد. 2300 01:49:16,120 --> 01:49:19,650 إذن هذا مثل القول الآن، أعطني عنوان x، أعطني عنوان y، 2301 01:49:19,650 --> 01:49:22,980 وأنا أقوم من الناحية الفنية بالتمرير في نُسخ هذه العناوين، ولكن لا يهم، 2302 01:49:22,980 --> 01:49:26,220 لأن القيام بتدوين النجمة الأن، فأنا أقول الانتقال إلى تلك العناوين 2303 01:49:26,220 --> 01:49:30,750 وتبديل الشخص الموجود بشكل مادي في هذا المبنى بشخص آخر. 2304 01:49:30,750 --> 01:49:31,470 حسنًا. 2305 01:49:31,470 --> 01:49:34,680 لذا دعونا فقط نضع هذا الآن في سياق ما الذي 2306 01:49:34,680 --> 01:49:36,480 يشتمل عليه أيضًا جهاز الكمبيوتر مجرد أنكم 2307 01:49:36,480 --> 01:49:39,640 شاهدتم بعض التسميات حول ذاكرة جهاز الكمبيوتر هذا. 2308 01:49:39,640 --> 01:49:42,000 إذن هذه هي الشريحة التي تحتوي على شبكة موضوع فوقها 2309 01:49:42,000 --> 01:49:45,000 فقط لتوصيل وجود وحدات بايت هنا، ويمكننا ترقيمها. 2310 01:49:45,000 --> 01:49:47,460 ولكن دعونا نفكر بشأن هذا الآن بطريقة تجريدية أكثر، 2311 01:49:47,460 --> 01:49:50,190 ودعوني أكشف أنه سيتضح أن جهاز الكمبيوتر يعامل 2312 01:49:50,190 --> 01:49:54,210 وحدات البايت المختلفة، المربعات المختلفة بطرق مختلفة فقط عن طريق التقليد. 2313 01:49:54,210 --> 01:49:56,340 من الواضح أنه في ذاكرة جهاز الكمبيوتر الخاص بك-- 2314 01:49:56,340 --> 01:49:58,890 وهذا كله مجرد تمثيل فني-- 2315 01:49:58,890 --> 01:50:01,690 في الجزء العلوي من شريحة الذاكرة تلك، إذا جاز التعبير، 2316 01:50:01,690 --> 01:50:03,430 وهو ما يسمى بنص برنامجك. 2317 01:50:03,430 --> 01:50:05,550 هذه طريقة رائعة وغير واضحة لقول 2318 01:50:05,550 --> 01:50:09,840 الأصفار والأحاد التي تم تحويلها برمجيًا إلى تعليماتك البرمجية. 2319 01:50:09,840 --> 01:50:12,830 نص البرنامج هو التعليمات البرمجية التي كتبتها في النظام الثنائي، 2320 01:50:12,830 --> 01:50:14,380 حيث تم تحميلها من الذاكرة. 2321 01:50:14,380 --> 01:50:16,590 لذا في macOS وWindows، تقوم بالنقر المزدوج على رمز، 2322 01:50:16,590 --> 01:50:18,840 فيتم تحميل هذا البرنامج في الذاكرة كما قلت الأسبوع الماضي. 2323 01:50:18,840 --> 01:50:23,220 يتم تحميله حرفيًا في الجزء العلوي من ذاكرة الكمبيوتر الخاص بك من الناحية النظرية. 2324 01:50:23,220 --> 01:50:23,910 ماذا أيضًا؟ 2325 01:50:23,910 --> 01:50:29,760 حسنًا، الكومة هي الاسم الوهمي الذي يتم منحه لجزء الذاكرة الذي تأتي 2326 01:50:29,760 --> 01:50:31,440 الذاكرة منه عندما تقوم باستدعاء malloc. 2327 01:50:31,440 --> 01:50:35,040 لذا عندما قمتُ باستدعاء malloc في وقت سابق للحصول على مساحة كبيرة لبعض الأحرف، 2328 01:50:35,040 --> 01:50:38,100 فإنها كانت تأتي فقط من هذه المنطقة المفتوحة الكبيرة التي تسمى الكومة. 2329 01:50:38,100 --> 01:50:41,520 وهذا ما يستخدمه get_string والوظائف الأخرى كذلك. 2330 01:50:41,520 --> 01:50:45,240 حسنًا، من الواضح أن سبب المشكلة التي واجهناها للتو 2331 01:50:45,240 --> 01:50:48,700 هو أن الجزء السفلي من الذاكرة والذي يسمى المكدس. 2332 01:50:48,700 --> 01:50:52,950 والمكدس هو مساحة الذاكرة التي تستخدمها الوظائف عندما يتم استدعاؤها. 2333 01:50:52,950 --> 01:50:57,940 وهذا بالفعل ذو صلة بمثال noswap البسيط جدًا على النحو التالي. 2334 01:50:57,940 --> 01:51:02,100 لو افترضنا الآن أن في أي وقت تقوم باستدعاء وظيفة، فإن الذاكرة التي تستخدمها 2335 01:51:02,100 --> 01:51:05,000 تأتي من أسفل تلك الكتلة الكبيرة من الذاكرة، 2336 01:51:05,000 --> 01:51:07,800 التي يمكنك فيها رسم تلك الدالة، على سبيل المثال، هنا على الشاشة، 2337 01:51:07,800 --> 01:51:10,860 لأنه يتضح أن في أي وقت تقوم فيه باستدعاء دالة، فإن تلك الوظيفة 2338 01:51:10,860 --> 01:51:12,360 تحصل على شريحة من ذاكرتها الخاصة. 2339 01:51:12,360 --> 01:51:15,960 إذن على سبيل المثال، main تكون دائمًا البرنامج الأول الذي تستدعيه وظيفة، 2340 01:51:15,960 --> 01:51:21,210 ولذلك تحصل على الشريحة الأولى من الذاكرة في أسفل الشاشة هنا. 2341 01:51:21,210 --> 01:51:25,330 وبالتالي إذا كان هناك متغيران في main وهما x وy، فهذا مثل قول، 2342 01:51:25,330 --> 01:51:30,070 حسنًا ، أعطني جزءًا من الذاكرة يسمّى x وضع القيمة 1 فيه؛ 2343 01:51:30,070 --> 01:51:33,990 أعطني جزءًا آخر من الذاكرة، وأطلق عليه y، وضَع قيمة فيه هنا. 2344 01:51:33,990 --> 01:51:39,150 ولكن تذكّروا، من المثال noswap الأول، أنه تم استدعاء وظيفة swap. 2345 01:51:39,150 --> 01:51:40,730 وهذا هو المكدس بالمعنى الحرفي. 2346 01:51:40,730 --> 01:51:44,440 أنتم تذهبون إلى قاعة طعام، مقهى، صينية واحدة للطعام، وفوقها واحدة أخرى، 2347 01:51:44,440 --> 01:51:47,070 وفوقها واحدة أخرى، وفوقها واحدة أخرى، بحيث يمكن للأشخاص أخذها 2348 01:51:47,070 --> 01:51:48,540 ووضع الطعام والأطباق عليها. 2349 01:51:48,540 --> 01:51:51,570 وبالمثل تمامًا في هذا النموذج، عندما تستدعي وظيفة، 2350 01:51:51,570 --> 01:51:55,500 فإنها تحصل على شريحة الذاكرة الخاصة بها، ولكن حرفيًا، من الناحية النظرية، أعلى 2351 01:51:55,500 --> 01:51:58,530 الإطار الموجود على المكدس. 2352 01:51:58,530 --> 01:52:01,920 إذن هذه هي قطعة الذاكرة الخاصة بدالة swap لديك، 2353 01:52:01,920 --> 01:52:03,950 وهي تحصل، أيضًا، على بعض المساحة. 2354 01:52:03,950 --> 01:52:06,330 تحصل على بعض المساحة لمتغير يسمّى a. 2355 01:52:06,330 --> 01:52:08,970 وتحصل على بعض المساحة لمتغير يسمّى b. 2356 01:52:08,970 --> 01:52:12,000 وخمّنوا ما الذي يدخل إلى هذين المتغيرين في المثال الأول هذا؟ 2357 01:52:12,000 --> 01:52:15,510 نسخة من x ونسخة من y. 2358 01:52:15,510 --> 01:52:16,260 أتعلمون ما الأمر؟ 2359 01:52:16,260 --> 01:52:19,440 كان بها متغير temp، لذلك تم الحصول عليه لامتلاك بعض المساحة هنا. 2360 01:52:19,440 --> 01:52:21,240 إذن سأسمّي هذا tmp. 2361 01:52:21,240 --> 01:52:25,020 وتذكّروا أنني قمت بتعيين tmp تساوي a، وبالتالي حصلت على 1. 2362 01:52:25,020 --> 01:52:26,050 وماذا حدث بعد؟ 2363 01:52:26,050 --> 01:52:28,270 حسنًا وماذا فعلت بعد ذلك-- 2364 01:52:28,270 --> 01:52:31,030 ماذا فعلت؟ 2365 01:52:31,030 --> 01:52:33,930 دعوني أصل إلى هذا مباشرة. 2366 01:52:33,930 --> 01:52:36,480 كان لدينا a تحصل على b. 2367 01:52:36,480 --> 01:52:39,220 إذن ما الذي حدث هناك؟ 2368 01:52:39,220 --> 01:52:43,740 إذن في هذا المثال هنا، تحصل a على القيمة 2، لذا فقد تغيرت. 2369 01:52:43,740 --> 01:52:47,070 ثم ماذا حدث هنا، حصلت b على القيمة 1، بالتالي فقد تغيرت. 2370 01:52:47,070 --> 01:52:50,190 لذا كانت swap تعمل بمعنى أنه قام بتبديل القيم، 2371 01:52:50,190 --> 01:52:53,580 ولكن المشكلة هي، عند تعيد وظيفة، فهذا الجزء من الذاكرة الذي 2372 01:52:53,580 --> 01:52:59,200 تم استخدامه سابقًا يتم استرداده حتى يمكن لشخص آخر الآن استخدامه، 2373 01:52:59,200 --> 01:53:00,010 كوظيفة أخرى. 2374 01:53:00,010 --> 01:53:03,300 إذن قمنا بكل ذلك العمل الشاق وبدون إجراء تبديل، وقمنا بذلك بشكل صحيح، 2375 01:53:03,300 --> 01:53:06,280 لقد قمنا بذلك في المكان الخطأ فقط. 2376 01:53:06,280 --> 01:53:11,510 لذا على النقيض من ذلك، هذا المثال التالي الذي قمنا به، والذي كان swap.c، 2377 01:53:11,510 --> 01:53:13,560 عامَل الذاكرة فقط بطريقة مختلفة قليلاً. 2378 01:53:13,560 --> 01:53:18,510 ما يزال لدى Main هذه المرة متغيرين يسمى x، وكان هذا a 1، 2379 01:53:18,510 --> 01:53:21,600 والآخر يسمّى y، وكان هذا a 2. 2380 01:53:21,600 --> 01:53:24,060 ثم تمت تسمية مبادلة واحدة هذه المرة، مجددًا 2381 01:53:24,060 --> 01:53:26,820 لديها متغير يسمّى a ومتغير يسمّى 2382 01:53:26,820 --> 01:53:30,090 b، ولكن ما الذي تم تخزينه في a وb؟ 2383 01:53:30,090 --> 01:53:31,220 حسنًا الآن هم عناوين. 2384 01:53:31,220 --> 01:53:34,690 وأنا لا أعرف ما هذا، ولكن دعوني أقول ذلك بشكل اعتباطي أن هذا 2385 01:53:34,690 --> 01:53:37,540 هو الموقع 100، هذا الموقع-- 2386 01:53:37,540 --> 01:53:39,580 دعونا نقول 104. 2387 01:53:39,580 --> 01:53:42,040 ولكن يمكنه أن يكون أي شيء، ونحن لا نكترث لهذه النقطة، 2388 01:53:42,040 --> 01:53:44,890 قد يشتمل على 0x من الناحية الفنية إذا كان الكمبيوتر يعرض لنا ذلك. 2389 01:53:44,890 --> 01:53:50,050 الذي يحدث في a هنا هو 100، والذي يحدث في b هنا هو 104. 2390 01:53:50,050 --> 01:53:54,340 وتلك هي عناوين x وy، وتقول التعليمات البرمجية حيث 2391 01:53:54,340 --> 01:53:56,710 كنا نستخدم جميع تلك النجوم الجديدة، 2392 01:53:56,710 --> 01:54:04,330 انتقل إلى عنوان 100 وخزِّن أي شيء في العنوان 100 في tmp. 2393 01:54:04,330 --> 01:54:07,750 ثم انتقل إلى العنوان الذي في b أو 104، 2394 01:54:07,750 --> 01:54:13,150 وخزِّن هذا في الموقع int *a، أيًا كان هناك. 2395 01:54:13,150 --> 01:54:15,730 بعد ذلك تقول، احصل على تلك القيمة 10، بالمناسبة، 2396 01:54:15,730 --> 01:54:20,800 وامضي قدمًا وضَع هذا هنا، إذن الآن قمنا 2397 01:54:20,800 --> 01:54:23,600 بعمل مختلف في مكان مختلف. 2398 01:54:23,600 --> 01:54:26,170 إذن الآن عندما يكون تنفيذ المبادلة قيد التشغيل، فلا يهم 2399 01:54:26,170 --> 01:54:31,820 إذا اختفت ذاكرتها لأنها تحولت أو تغيرت الآن 2400 01:54:31,820 --> 01:54:32,560 إلى الذاكرة الأخرى. 2401 01:54:32,560 --> 01:54:35,860 التي تم تمريرها للتو مثلما قامت كيلي بتغيير أو تحويل الأكواب 2402 01:54:35,860 --> 01:54:39,980 لقد أشرت إليها في الواقع بدلاً من نسخها. 2403 01:54:39,980 --> 01:54:43,600 وبعيدًا عن موضوعنا الآن، هناك أجزاء أخرى من الذاكرة التي يتم استخدامها بالفعل. 2404 01:54:43,600 --> 01:54:46,060 إذا كانت لديك متغيرات عالمية في أحد البرامج، 2405 01:54:46,060 --> 01:54:48,340 يتضح أنه يوجد بين ذاكرة النص وذاكرة 2406 01:54:48,340 --> 01:54:51,610 الكومة متغيراتك العالمية، إذا تمت تهيئتها باستخدام القيم 2407 01:54:51,610 --> 01:54:55,040 أو لم تتم تهيئتها بستخدام القيم، كما سيحدث مع علامة يساوي، 2408 01:54:55,040 --> 01:54:57,010 لكننا لا نهتم كثيرًا بذلك لأغراض اليوم. 2409 01:54:57,010 --> 01:54:58,810 وإذا كنت قد سمعت من قبل عن متغيرات البيئة، والتي 2410 01:54:58,810 --> 01:55:01,330 سنسمع عنها عندما نصل إلى برمجة الويب، التي يتم أيضًا 2411 01:55:01,330 --> 01:55:03,250 تخزينها في مكان آخر في الذاكرة. 2412 01:55:03,250 --> 01:55:05,080 ولكن الجزئين الأكثر إثارة للاهتمام من الذاكرة 2413 01:55:05,080 --> 01:55:08,210 هما المكدس والكومة، كما في هذه الحالة هنا. 2414 01:55:08,210 --> 01:55:10,860 ولكن لسوء الحظ إنه لمن السهل أن تنحرف الأشياء-- 2415 01:55:10,860 --> 01:55:13,360 أعني، بعضكم جرّب أخطاء التجزئة بالفعل، 2416 01:55:13,360 --> 01:55:15,500 ودعونا نفكر لماذا قد يحدث ذلك. 2417 01:55:15,500 --> 01:55:19,240 إذن، هنا مثال مُستنبط من التعليمات البرمجية بواسطة تصميم الخطأ، 2418 01:55:19,240 --> 01:55:22,120 ولكن دعونا نتحدث عنها فقط باللغة الإنجليزية ما الذي تقوم به هذه السطور. 2419 01:55:22,120 --> 01:55:25,690 هذا السطر هنا، يقول، int *x، مرحبًا، جهاز الكمبيوتر، 2420 01:55:25,690 --> 01:55:31,440 أعطني متغيرًا سيقوم بتخزين عنوان عدد صحيح. 2421 01:55:31,440 --> 01:55:34,870 إذن أعطني مؤشرًا إلى عدد صحيح وهي الطريقة الأكثر حداثة لقول ذلك. 2422 01:55:34,870 --> 01:55:38,240 مرحبًا جهاز الكمبيوتر، أعطني متغيرًا آخر يقوم 2423 01:55:38,240 --> 01:55:40,550 بتخزين عنوان عدد صحيح وأطلق عليه y. 2424 01:55:40,550 --> 01:55:42,470 إذن x وy، هذا كل شيء. 2425 01:55:42,470 --> 01:55:44,300 هذا السطر جديد. 2426 01:55:44,300 --> 01:55:48,810 مرحبًا جهاز الكمبيوتر، قم بتخصيص مساحة كافية تناسب عددًا صحيحًا. 2427 01:55:48,810 --> 01:55:51,860 إذن sizeof int هي الصياغة الجديدة التي رأيناها في وقت سابق لاكتشاف 2428 01:55:51,860 --> 01:55:52,940 عدد وحدات البايت في أي عدد صحيح فقط. 2429 01:55:52,940 --> 01:55:56,850 الاحتمالات هي أنه سيعود كعدد 4 أو 32 وحدة بايت في معظم أجهزة الكمبيوتر. 2430 01:55:56,850 --> 01:55:59,820 إذن فهذا سيقول فقط، مرحبًا أيها المتصفح، أعطني 4 وحدات بايت من الذاكرة 2431 01:55:59,820 --> 01:56:03,050 وقم بتخزينها في هذا الموقع. 2432 01:56:03,050 --> 01:56:06,440 أو بدلاً من ذلك، قم بتخزينها في هذا المتغير، قم بتخزين هذا المتغير. 2433 01:56:06,440 --> 01:56:09,950 إذن ربما سيقول، حسنًا، هنالك أربع وحدات بايت في الموقع 100، 2434 01:56:09,950 --> 01:56:11,690 أو توجد أربع وحدات بايت في الموقع 900. 2435 01:56:11,690 --> 01:56:15,970 أو في أي مكان، لا يهم، نحن فقط نتذكر ذلك العنوان في x. 2436 01:56:15,970 --> 01:56:18,760 وتقول *x، انتقل إلى ذلك العنوان-- 2437 01:56:18,760 --> 01:56:22,730 100 أو 900، أيًا كان، وضَع الرقم 42 هناك. 2438 01:56:22,730 --> 01:56:27,060 يقول هذا السطر التالي، انتقل إلى العنوان في y وضَع الرقم غير المحظوظ - المحوا، 2439 01:56:27,060 --> 01:56:27,620 المحوا-- 2440 01:56:27,620 --> 01:56:30,830 13 هناك. 2441 01:56:30,830 --> 01:56:32,520 حسنًا ما هو العنوان في y؟ 2442 01:56:36,120 --> 01:56:37,250 لم أقم بتخصيصه بعد. 2443 01:56:37,250 --> 01:56:38,840 ما هو العنوان في x؟ 2444 01:56:38,840 --> 01:56:41,720 إنه حيث تخبرني malloc باستخدام مساحة. 2445 01:56:41,720 --> 01:56:44,750 ذلك آمن، كان ذلك مثل 100، 900، أيًا كانت القيمة، 2446 01:56:44,750 --> 01:56:46,850 ولكن هل قمتُ بتخصيص مساحة لـ y؟ 2447 01:56:46,850 --> 01:56:49,870 إذن ما نوع القيمة الذي تحتوي عليه، إذا جاز التعبير؟ 2448 01:56:49,870 --> 01:56:50,960 قيمة ضئيلة. 2449 01:56:50,960 --> 01:56:53,940 ربما تكون 0، ربما تكون مثل 32000-- لا نعرف، 2450 01:56:53,940 --> 01:56:56,150 لأنك إذا لم تقم بتحديد القيمة، فليس 2451 01:56:56,150 --> 01:56:59,580 من الآمن الوثوق بها أو القيام بأي شيء باستخدامها. 2452 01:56:59,580 --> 01:57:02,810 سيعطيني هذا على الأرجح إحدى أخطاء التجزئة تلك. 2453 01:57:02,810 --> 01:57:04,850 وبالفعل، إذا قمتُ بتشغيل برنامج مثل هذا، 2454 01:57:04,850 --> 01:57:08,810 فمن المحتمل جدًا أن أرى بالضبط ذلك النوع من المشاكل. 2455 01:57:08,810 --> 01:57:11,110 ربما يكون من الأفضل، رغم ذلك، رؤية هذا بالطريقة التي 2456 01:57:11,110 --> 01:57:14,340 سترسم صورة أكثر رسوخًا في الذاكرة، ولهذا، أعتقد أننا سنتناول-- 2457 01:57:14,340 --> 01:57:16,640 في الدقائق العشر المتبقية لدينا، استخدام بعض من هذه الدقائق 2458 01:57:16,640 --> 01:57:18,760 لإلقاء نظرة على شيء قام أصدقاؤنا في جامعة ستانفورد 2459 01:57:18,760 --> 01:57:20,370 بإعداده سويًا باستخدام بعض من الرسوم المتحركة الطينية. 2460 01:57:20,370 --> 01:57:22,690 إنه يستغرق حوالي ثلاث دقائق، والأمر يستحق رسم 2461 01:57:22,690 --> 01:57:24,950 صورة للخطأ الذي يحدث بالضبط 2462 01:57:24,950 --> 01:57:27,550 عندما لا تستخدم الذاكرة بشكل صحيح. 2463 01:57:27,550 --> 01:57:29,430 إذا كنت تستطيع تخفيف الأضواء. 2464 01:57:29,430 --> 01:57:30,090 [VIDEO PLAYBACK] 2465 01:57:30,090 --> 01:57:32,940 [MUSIC PLAYING] 2466 01:57:32,940 --> 01:57:33,710 - مرحبًا، بينكي. 2467 01:57:33,710 --> 01:57:34,520 استيقظي! 2468 01:57:34,520 --> 01:57:36,950 حان الوقت لمتعة المؤشر! 2469 01:57:36,950 --> 01:57:38,230 - ما هذا؟ 2470 01:57:38,230 --> 01:57:39,380 التعرّف على المؤشرات؟ 2471 01:57:39,380 --> 01:57:41,600 أوه رائع! 2472 01:57:41,600 --> 01:57:44,620 - بداية جيدة، أعتقد أننا سنحتاج لمؤشرين اثنين. 2473 01:57:44,620 --> 01:57:45,440 - حسنًا. 2474 01:57:45,440 --> 01:57:48,960 تخصص التعليمات البرمجية تلك مؤشرين يمكن أن يشيرا إلى الأعداد الصحيحة. 2475 01:57:48,960 --> 01:57:49,460 - حسنًا. 2476 01:57:49,460 --> 01:57:53,180 حسنًا رأيت المؤشرين، لكن لا يبدو أنهما يشيران إلى أي شيء. 2477 01:57:53,180 --> 01:57:54,020 - هذا صحيح. 2478 01:57:54,020 --> 01:57:56,150 في البداية لا تشير المؤشرات إلى أي شيء. 2479 01:57:56,150 --> 01:57:58,400 تسمّى الأشياء التي تُشار إليها باسم pointees 2480 01:57:58,400 --> 01:58:00,350 وإعدادهم لخطوة منفصلة. 2481 01:58:00,350 --> 01:58:01,250 - أوه، صحيح، صحيح. 2482 01:58:01,250 --> 01:58:02,000 علمت ذلك. 2483 01:58:02,000 --> 01:58:03,770 pointees منفصلة. 2484 01:58:03,770 --> 01:58:06,280 إذن كيف تخصص pointee؟ 2485 01:58:06,280 --> 01:58:06,980 - حسنًا. 2486 01:58:06,980 --> 01:58:10,040 حسنًا تخصص تلك التعليمات البرمجية pointee لعدد صحيح جديد، 2487 01:58:10,040 --> 01:58:13,190 ويقوم هذا الجزء بتعيين x للإشارة إليه. 2488 01:58:13,190 --> 01:58:14,360 - مهلاً، هذا يبدو أفضل. 2489 01:58:14,360 --> 01:58:15,810 إذن اجعله يفعل شيئًا. 2490 01:58:15,810 --> 01:58:16,600 - حسنًا. 2491 01:58:16,600 --> 01:58:21,640 كيف يمكنك الإشارة إلى المؤشر x لتخزين الرقم 42 في pointee الخاص به؟ 2492 01:58:21,640 --> 01:58:25,180 بالنسبة إلى تلك الخدعة، أحتاج إلى عصاي السحرية الخاصة بالإسناد المؤشري. 2493 01:58:25,180 --> 01:58:28,230 - عصاك السحرية الخاصة بالإسناد المؤشري؟ 2494 01:58:28,230 --> 01:58:30,340 هذا-- أمر رائع. 2495 01:58:30,340 --> 01:58:32,140 - هكذا تبدو التعليمات البرمجية. 2496 01:58:32,140 --> 01:58:33,890 سأقوم فقط بإعداد الرقم و-- 2497 01:58:33,890 --> 01:58:35,070 [POP] 2498 01:58:35,070 --> 01:58:35,740 - انظر! 2499 01:58:35,740 --> 01:58:37,180 ها هو ينتقل. 2500 01:58:37,180 --> 01:58:42,040 إذن، يتبع القيام بالإسناد المؤشري على x السهم للوصول إلى pointee الخاص به. 2501 01:58:42,040 --> 01:58:44,200 في هذه الحالة، لتخزين 42 هناك. 2502 01:58:44,200 --> 01:58:48,820 مهلاً، حاول استخدامه لتخزين الرقم 13 عبر المؤشر الآخر، y. 2503 01:58:48,820 --> 01:58:49,810 - حسنًا. 2504 01:58:49,810 --> 01:58:54,310 سأنتقل من هنا فقط إلى y وأقوم بإعداد الرقم 13، 2505 01:58:54,310 --> 01:58:58,320 ثم آخذ عصا الإسناد المؤشري وفقط-- 2506 01:58:58,320 --> 01:58:59,860 [BUZZING] آه! 2507 01:58:59,860 --> 01:59:02,080 - أوه مهلاً، هذا لم ينجح. 2508 01:59:02,080 --> 01:59:05,720 أقول، يا بينكي، لا أعتقد أن الإسناد المؤشري فكرة جيدة، 2509 01:59:05,720 --> 01:59:08,990 لأن إعداد pointee هو خطوة منفصلة 2510 01:59:08,990 --> 01:59:10,790 ولا أعتقد أننا فعلنا ذلك من قبل. 2511 01:59:10,790 --> 01:59:12,530 - اممم، ملاحظة جيدة. 2512 01:59:12,530 --> 01:59:13,030 - أجل. 2513 01:59:13,030 --> 01:59:17,420 لقد قمنا بتخصيص مؤشر y، لكننا لم نقم بتعيينها أبدًا لتشير إلى pointee. 2514 01:59:17,420 --> 01:59:19,790 - اممم، شديد الملاحظة. 2515 01:59:19,790 --> 01:59:21,460 -مهلاً، تبدو جيد هناك، يا بينكي. 2516 01:59:21,460 --> 01:59:24,500 هل يمكنك إصلاح ذلك بحيث يشير y إلى pointee نفسه مثل x؟ 2517 01:59:24,500 --> 01:59:25,000 - بالتأكيد. 2518 01:59:25,000 --> 01:59:27,820 سأستخدم عصاي السحرية الخاصة بمهمة المؤشر. 2519 01:59:27,820 --> 01:59:30,110 - هل سيتسبب هذا في حدوث مشكلة كالسابق؟ 2520 01:59:30,110 --> 01:59:31,840 - لا، هذا لا يلمس pointees. 2521 01:59:31,840 --> 01:59:35,410 يقوم فقط بتغيير مؤشر واحد للإشارة إلى الشيء نفسه كشيء آخر. 2522 01:59:35,410 --> 01:59:36,490 - أوه، أرى ذلك. 2523 01:59:36,490 --> 01:59:39,070 الآن يشير y إلى المكان نفسه مثل x. 2524 01:59:39,070 --> 01:59:41,090 إذن انتظروا، الآن تم إصلاح y. 2525 01:59:41,090 --> 01:59:42,160 لديه pointee. 2526 01:59:42,160 --> 01:59:46,660 إذن يمكنك تجريب عصا الإسناد المؤشري مجددًا لإرسال 13 إلى هناك. 2527 01:59:46,660 --> 01:59:47,350 - حسنًا. 2528 01:59:47,350 --> 01:59:49,130 ها هو يذهب. 2529 01:59:49,130 --> 01:59:50,380 - مهلاً، انظر إلى هذا. 2530 01:59:50,380 --> 01:59:52,090 يعمل الآن الإسناد المؤشري على y. 2531 01:59:52,090 --> 01:59:56,220 ونظرًا لأن المؤشرات تتشارك في pointee واحد، فإن كليهما يرى 13. 2532 01:59:56,220 --> 01:59:57,910 - نعم، مشاركة، أيًا كان. 2533 01:59:57,910 --> 01:59:59,820 إذن سنقوم بتبديل الأماكن الآن؟ 2534 01:59:59,820 --> 02:00:01,790 - أوه لاحظ، الوقت ينفد. 2535 02:00:01,790 --> 02:00:02,360 - لكن-- 2536 02:00:02,360 --> 02:00:03,040 [END PLAYBACK] 2537 02:00:03,040 --> 02:00:04,000 ديفيد مالان: حسنًا. 2538 02:00:04,000 --> 02:00:08,080 إذن آمل أن يرسخ هذا رؤية بصرية أكثر حول بعض هذه الأفكار، 2539 02:00:08,080 --> 02:00:12,490 ولكن دعونا الآن نحدد سياقات هذا في مجال من المحتمل أن يكون 2540 02:00:12,490 --> 02:00:14,240 أكثر إلمامًا بالطريقتين. 2541 02:00:14,240 --> 02:00:16,330 إذن الأولى، البعض منكم قد يعرفه بالفعل، خصوصًا 2542 02:00:16,330 --> 02:00:18,670 إذا كانت لديكم خبرة سابقة في البرمجة، من موقع ويب شائع جدًا 2543 02:00:18,670 --> 02:00:20,620 باسم Stack Overflow حيث الكثير من المبرمجين 2544 02:00:20,620 --> 02:00:24,650 يقومون بنشر الأسئلة وأحيانًا الإجابات أيضًا حول المشاكل الفنية الشائعة. 2545 02:00:24,650 --> 02:00:26,950 إذا تساءلت لماذا يسمّى Stack Overflow، 2546 02:00:26,950 --> 02:00:29,590 يتضح أنه يختزل إلى هذه الصورة هنا. 2547 02:00:29,590 --> 02:00:33,450 ولم يكن هذا خاطئًا أنني رسمت سهمًا واحدًا من الكومة يشير إلى أسفل، 2548 02:00:33,450 --> 02:00:35,260 وسهمًا آخر من المكدس يشير للأعلى. 2549 02:00:35,260 --> 02:00:38,460 فكلما قمت بتنفيذ دالة malloc، مرة تلو أخرى، تبدأ مساحات أكبر وأكبر، 2550 02:00:38,460 --> 02:00:41,320 بالظهور هنا، إذا جاز التعبير، و ستحصل على المزيد والمزيد من المساحة 2551 02:00:41,320 --> 02:00:43,080 والتي تذهب إلى هذا الاتجاه. 2552 02:00:43,080 --> 02:00:45,460 لكن كلما زادت الدالات التي تطلق عليها اسم-- دالة بعد دالة 2553 02:00:45,460 --> 02:00:47,330 بعد دالة بعد دالة، كل واحدة منها 2554 02:00:47,330 --> 02:00:50,680 تحصل على شريحتها الخاصة أو إطار الذاكرة هذا، أيضًا، الذي يرتفع لأعلى. 2555 02:00:50,680 --> 02:00:54,580 إذن هذا يبدو وكأنه تصميم سيئ للغاية، ولكن بصراحة، ولا يمكن تجنبه حقًا 2556 02:00:54,580 --> 02:00:56,500 لأنه إذا كان لديك مساحة محدودة من الذاكرة، 2557 02:00:56,500 --> 02:00:58,810 لا يمكنك تجنب بعضها البعض إلى الأبد. 2558 02:00:58,810 --> 02:01:03,310 ولذا يوجد خطر أساسي متمثل في تجاوز المكدس، 2559 02:01:03,310 --> 02:01:06,410 أو حتى تجاوز الكومة في الاتجاه المعاكس. 2560 02:01:06,410 --> 02:01:09,820 إذن موقع Stack Overflow هو إشارة إلى، على سبيل المثال، تسمية 2561 02:01:09,820 --> 02:01:12,490 دالات-- كثيرة،كثيرة،كثيرة،كثيرة، كثيرة،كثيرة،كثيرة،كثيرة، 2562 02:01:12,490 --> 02:01:16,060 كثيرة للغاية بحيث تتداخل مع أجزاء أخرى أو أجزاء من الذاكرة، 2563 02:01:16,060 --> 02:01:20,100 وبالتالي بما في ذلك خطأ التجزئة، وتجاوز سعة التخرين المؤقت للكومة 2564 02:01:20,100 --> 02:01:22,060 يكون في الاتجاه المعاكس، ويعرف هذا كثيرًا 2565 02:01:22,060 --> 02:01:26,920 عمومًا باسم تجاوزات سعة التخزين المؤقت، وسنرى المزيد من هذه في الأسابيع 2566 02:01:26,920 --> 02:01:27,640 المقبلة. 2567 02:01:27,640 --> 02:01:30,010 لكن الآن يمكننا مناقشة أمر المؤشرات، 2568 02:01:30,010 --> 02:01:33,790 دعونا نقدم ميزة واحدة نهائية ثم وجه مألوف. 2569 02:01:33,790 --> 02:01:38,740 إذن يتضح أنه يمكنك في الواقع إنشاء متغيراتك المخصصة 2570 02:01:38,740 --> 02:01:42,670 مثلما فعلنا مع سلسلة، ولكن أكثر تطورًا من ذلك. 2571 02:01:42,670 --> 02:01:46,420 على سبيل المثال، إذا رغبت في تنفيذ برنامج 2572 02:01:46,420 --> 02:01:49,780 يحتوي على عدة طلاب، قد أقوم بفعل شيء من هذا القبيل. 2573 02:01:49,780 --> 02:01:53,110 اسأل المستخدم ما هو التسجيل في الصف، ثم امضِ قدمًا 2574 02:01:53,110 --> 02:01:55,430 وأعطني مصفوفة من السلاسل، والمعروفة أيضًا باسم 2575 02:01:55,430 --> 02:01:59,950 char*s حاليًا بذلك الحجم، وبعد ذلك يمكنني أيضًا الحصول على مصفوفة أخرى للمساكن. 2576 02:01:59,950 --> 02:02:03,540 ويمكنني الحصول على مصفوفتين تحتوي واحدة على أسماء الطلاب، 2577 02:02:03,540 --> 02:02:06,290 وأخرى على مساكن الطلاب، ويمكنني تتبع أشياء أخرى. 2578 02:02:06,290 --> 02:02:09,200 مصفوفة أخرى لعناوين البريد الإلكتروني، ومصفوفة أخرى لأرقام الهواتف-- 2579 02:02:09,200 --> 02:02:11,530 ولكن هذا يصير فوضويًا بسرعة، لأنه يمكنك أن تتخيل، 2580 02:02:11,530 --> 02:02:15,730 إذا كنتُ بحاجة إلى الأسماء والمساكن وعناوين البريد الإلكتروني والهواتف، 2581 02:02:15,730 --> 02:02:18,010 فسيصبح هناك الكثير من النسخ واللصق. 2582 02:02:18,010 --> 02:02:21,100 ولديّ فقط هذا التصميم الذي توجد لديّ فيه الكثير والكثير من المصفوفات 2583 02:02:21,100 --> 02:02:24,460 حيث يشير كل موقع قوس-- مثل قوس 0، قوس 1 2584 02:02:24,460 --> 02:02:28,720 افتراضيًا إلى الطالب نفسه عبر جميع تلك المصفوفات، مثل اممم! 2585 02:02:28,720 --> 02:02:30,670 تصميم فوضوي للغاية. 2586 02:02:30,670 --> 02:02:32,650 إذن، بتلويحة بيدي، دعوني أقوم بالفعل 2587 02:02:32,650 --> 02:02:36,340 بإصلاح هذه المشكلة الفورية من البداية بإدخال ميزة جديدة. 2588 02:02:36,340 --> 02:02:38,470 يمكنني اختراع أنواع البيانات الخاصة بي. 2589 02:02:38,470 --> 02:02:40,540 دعوني أمضي قدمًا وأعلن عن مصفوفة 2590 02:02:40,540 --> 02:02:46,780 تسمّى students "الطلاب" بهذا العدد الكبير من الطلاب، ولكن بطلاب بنوع البيانات. 2591 02:02:46,780 --> 02:02:51,700 تأتي لغة C بأنواع بيانات float، وbool، وchar، وint، وليس بنوع string، وبالتأكيد ولا بنوع student. 2592 02:02:51,700 --> 02:02:54,320 إذن يمكنك إنشاء أنواع بيانات مخصصة لك، 2593 02:02:54,320 --> 02:02:57,460 ويمكنك وضعها في ملفات الرؤوس الخاصة بك، والتي لم ننتهِ من أي منها. 2594 02:02:57,460 --> 02:03:01,170 ولكن يمكنني الاطلاع على، ويمكنكم مشاهدة المزيد من هذا في مجموعة المسائل التالية. 2595 02:03:01,170 --> 02:03:02,920 لذلك لا داعي للقلق إذا كان هذا يبدو مختصرًا إلى حد ما، 2596 02:03:02,920 --> 02:03:05,100 فإنه فقط مصمم لأن يكون إعلانًا تشويقيًا هنا. 2597 02:03:05,100 --> 02:03:09,880 ودالة struct.h هي الكيفية التي ستعلن أو تحدد بها النوع الخاص بك. 2598 02:03:09,880 --> 02:03:13,990 وتكون الكلمة الأساسية حرفيًا هي typedef struct لكي تكتمل البنية، أو بنية البيانات 2599 02:03:13,990 --> 02:03:15,040 على نحو أفضل. 2600 02:03:15,040 --> 02:03:18,730 ويأتي اسم بنية البيانات في النهاية بعد بعض الأقواس المتعرجة. 2601 02:03:18,730 --> 02:03:20,920 ثم بداخل الأقواس المتعرجة التي تقوم بتحديدها فقط، 2602 02:03:20,920 --> 02:03:22,580 حسنًا ماذا تريد أن يكون لدى الطالب؟ 2603 02:03:22,580 --> 02:03:25,990 أرغب أن يكون لديه اسم، ومسكن، وربما رقم هاتف، وربما 2604 02:03:25,990 --> 02:03:27,440 عنوان بريد إلكتروني، وأي شيء أريده. 2605 02:03:27,440 --> 02:03:28,810 يمكنني تحديدًا الإضافة هنا. 2606 02:03:28,810 --> 02:03:34,990 وبذلك الآن في التعليمة البرمجية الفعلية لديّ، يمكن أن تكون لديّ مصفوفة من الطلاب الفعليين، 2607 02:03:34,990 --> 02:03:38,260 ويمكنني تحديدًا الوصول إليها باستخدام تدوين العلامات الجديد هذا كهذا مثلاً. 2608 02:03:38,260 --> 02:03:41,290 تعرفون أنه يمكنكم الفهرسة بداخل مصفوفة باستخدام تدوين علامة قوس. 2609 02:03:41,290 --> 02:03:45,370 ما لم تعرفوه حتى الآن، ربما، أنه إذا كانت هناك في ذلك الموقع 2610 02:03:45,370 --> 02:03:47,200 بنية، والتي تعرف أيضًا باسم 2611 02:03:47,200 --> 02:03:51,400 struct، فيمكنكم الوصول إلى الاسم، أو المسكن، أو الهاتف، أو البريد الإلكتروني، 2612 02:03:51,400 --> 02:03:54,460 أو أي شيء آخر هناك فقط من خلال استخدام تدوين علامة نقطة، والتي تمثل 2613 02:03:54,460 --> 02:03:56,620 آخر جزء من بناء الجملة الجديد ليومنا هذا. 2614 02:03:56,620 --> 02:03:58,340 وأي شيء آخر على نفس الحال. 2615 02:03:58,340 --> 02:04:01,750 يمكنني كتابة برنامج يقول كذا وكذا في مسكن كذا وكذا 2616 02:04:01,750 --> 02:04:05,710 بأن أقول فقط احصل على اسم الطالب صاحب الترتيب رقم i ومسكن الطالب صاحب الترتيب رقم i. 2617 02:04:05,710 --> 02:04:09,490 ويمكنني أن أكون أكثر براعة، وإذا كنت لا أرغب في طباعة تلك القيم فقط، 2618 02:04:09,490 --> 02:04:13,360 فيمكنني تمامًا، الآن، وأنا لا أرى أي مؤشرات فهم-- 2619 02:04:13,360 --> 02:04:15,640 أو أني رأيتُ مؤشرات وسنفهمها عما قريب 2620 02:04:15,640 --> 02:04:19,390 عن طريق مجموعات المسائل والممارسة، يمكنني بالفعل القيام بذلك. 2621 02:04:19,390 --> 02:04:22,060 هذه مجرد معاينة خاطفة لسطر في التعليمة البرمجية 2622 02:04:22,060 --> 02:04:24,220 والذي يستخدم دالة جديدة تسمّى fopen. 2623 02:04:24,220 --> 02:04:27,430 fopen بمعنى فتح هذا الملف، وهي تشتمل على اسم الملف المطلوب فتحه. 2624 02:04:27,430 --> 02:04:30,100 ربما تعرفون عن ملفات CSV، إنها مثل جداول بيانات بسيطة، 2625 02:04:30,100 --> 02:04:31,960 قيم مفصولة بفاصلة. 2626 02:04:31,960 --> 02:04:33,910 و"w" بين علامة الاقتباس وإنهاء الاقتباس تعني كتابة. 2627 02:04:33,910 --> 02:04:37,450 لذلك فهذه الدالة تقول افتح الملف الذي يسمى students.csv في وضع الكتابة، 2628 02:04:37,450 --> 02:04:38,620 حتى أتمكن من الكتابة في هذا الملف. 2629 02:04:38,620 --> 02:04:41,140 لأنه في هذا المثال، كما سترون في الأيام القادمة، 2630 02:04:41,140 --> 02:04:43,100 أريد أن أكتب كل شيء في ملف. 2631 02:04:43,100 --> 02:04:46,240 لكن من الواضح أنه لاستخدام ملفات، نحتاج لمعرفة ما هو المؤشر، 2632 02:04:46,240 --> 02:04:48,040 ومن الغريب إلى حد ما أنها كلها بأحرف كبيرة، 2633 02:04:48,040 --> 02:04:52,070 ولكن هناك نوع بيانات في لغة C يسمى "file"، وهو مؤشر. 2634 02:04:52,070 --> 02:04:54,950 لاختصار القصة الطويلة، ما سترونه في مجموعة المسائل التالية 2635 02:04:54,950 --> 02:04:57,250 ونحن نستكشف عالم التحليلات الجنائية هو القدرة 2636 02:04:57,250 --> 02:05:00,560 على استخدام المؤشرات وعدد قليل من الدوال الجديدة لفتح الملفات واستعادة 2637 02:05:00,560 --> 02:05:04,790 عنوان ذلك الملف في الذاكرة حتى يمكنك الانتقال إلى ذلك العنوان، 2638 02:05:04,790 --> 02:05:07,730 وتغيير محتويات ملف، وإعادة حفظه. 2639 02:05:07,730 --> 02:05:10,940 كل منّا يُسَلِّم بأنك يمكنك الانتقال حاليًا إلى File "ملف"، Open "فتح" وFile "ملف"، 2640 02:05:10,940 --> 02:05:13,570 Save "حفظ"، لكن ما يحدث في الواقع، هو أن المؤشرات متضمنة، 2641 02:05:13,570 --> 02:05:15,740 وأنه يتم تحميل البرامج في الذاكرة، وأن الكمبيوتر 2642 02:05:15,740 --> 02:05:18,260 يقوم بالإسناد المؤشري أو ينتقل الى تلك العناوين 2643 02:05:18,260 --> 02:05:21,020 ويغيّر ما هو موجود في تلك المواقع في الذاكرة. 2644 02:05:21,020 --> 02:05:22,440 الآن لماذا قد ترغب في القيام بهذا؟ 2645 02:05:22,440 --> 02:05:23,900 حسنًا إليكم هنا، بالطبع، زاميلا-- ربما 2646 02:05:23,900 --> 02:05:26,360 تذكرونها من بعض مجموعات المسائل والتعليمات المساعدة. 2647 02:05:26,360 --> 02:05:30,620 من الواضح أنه يمكننا محاولة تحسين صورتها هذه من خلال التكبير، 2648 02:05:30,620 --> 02:05:33,960 ويوجد هنا تقريبًا نفس الدقة الموجودة في عينيها. 2649 02:05:33,960 --> 02:05:38,390 يبدو أني لا أرى بريق أي شعار جنائي 2650 02:05:38,390 --> 02:05:41,030 على سترته أو سترتها كبريق عيني زاميلا. 2651 02:05:41,030 --> 02:05:43,880 إذا قمتَ بتكبير صورة، والصورة، لو تذكرون، من الأسبوع 0 2652 02:05:43,880 --> 02:05:47,880 هي مجرد شبكة من وحدات البكسل أو النقاط، وهذا كل ما توصلتم إليه. 2653 02:05:47,880 --> 02:05:50,990 وربما يمكنكم جعلها متجانسة قليلاً أو منسقة الألوان، 2654 02:05:50,990 --> 02:05:53,690 لكن لا يمكنكم تحديدًا إجراء تحسين "enhance،" علامة اقتباس-علامة إنهاء الاقتباس، 2655 02:05:53,690 --> 02:05:56,060 ورؤية المزيد من البريق في عين زاميلا، 2656 02:05:56,060 --> 02:05:59,900 لأن الصورة في نهاية المطاف هي مجرد bitmap "صورة نقطية"، خريطة من وحدات البكسل-- 2657 02:05:59,900 --> 02:06:01,970 من أعلى لأسفل، من اليسار لليمين. 2658 02:06:01,970 --> 02:06:03,440 على سبيل المثال، إليكم وجه مبتسم. 2659 02:06:03,440 --> 02:06:06,950 إذا ألقيتم نوعًا ما نظرةً إلى الوراء، فيمكنكم نوعًا ما رؤية وجه مبتسم باللون الأسود 2660 02:06:06,950 --> 02:06:08,690 على خلفية بيضاء. 2661 02:06:08,690 --> 02:06:11,690 وإذا قررنا للتوّ كأشخاص، فدعونا نمثل النقاط البيضاء 2662 02:06:11,690 --> 02:06:15,650 بالواحدات والنقاط السوداء بالأصفار، فقد يكون هذا هو الموجود في الملف، 2663 02:06:15,650 --> 02:06:17,090 وهذا ما يراه الشخص. 2664 02:06:17,090 --> 02:06:21,440 لذا إذا كانت لدينا القدرة على فتح ذلك من ملف، فقم بتخزينه في الذاكرة، 2665 02:06:21,440 --> 02:06:24,720 ومن ثم انتقل باستخدام المؤشرات إلى تلك المواقع في الذاكرة، 2666 02:06:24,720 --> 02:06:28,100 فيمكننا حتى تغيير الوجه المبتسم إلى وجه غير سعيد، على سبيل المثال، أو تلوينه 2667 02:06:28,100 --> 02:06:30,290 أو القيام بأي عدد من الأشياء له. 2668 02:06:30,290 --> 02:06:32,960 الآن بنظرة سريعة، هناك الكثير الذي يحدث في الملفات، 2669 02:06:32,960 --> 02:06:37,310 لأن ماهية الملف عبارة عن مجموعة من القواعد التي قررها البشر 2670 02:06:37,310 --> 02:06:40,430 حيث إن البشر منذ سنوات أقروا في ملف bitmap "الصورة النقطية"، 2671 02:06:40,430 --> 02:06:45,260 ملف BMP-- بأن تنسيق ملفات أقدم كثيرًا لكنه ما يزال شائعًا للصور، أقر البشر 2672 02:06:45,260 --> 02:06:48,470 تحديدًا، بأننا كأننا سنضع مجموعة من القيم الخاصة 2673 02:06:48,470 --> 02:06:50,450 في وحدات البايت الأولى للملف، ثم بعض القيم الخاصة 2674 02:06:50,450 --> 02:06:56,290 أكثر من وحدات بكسل RGB الفعلية في بقية الملف. 2675 02:06:56,290 --> 02:06:58,340 إذن فهذا مصمم ليبدو مشفرًا للوهلة الأولى، 2676 02:06:58,340 --> 02:07:00,830 وواجبكم المنزلي التالي سيكون استكشاف هذا، 2677 02:07:00,830 --> 02:07:04,640 ولكن كل ماهيته عبارة عن قاعدة لما تعنيه الأصفار والواحدات 2678 02:07:04,640 --> 02:07:06,080 في هذه المواقع المختلفة. 2679 02:07:06,080 --> 02:07:08,760 وبالفعل، فإن التحدي الذي أمامنا سيكون القيام بعدد من الأشياء. 2680 02:07:08,760 --> 02:07:10,490 أولاً وقبل كل شيء توضيح-- 2681 02:07:10,490 --> 02:07:11,290 من فعلها؟ 2682 02:07:11,290 --> 02:07:14,660 إنه نوع من لغز جريمة قتل يوجد فيه دليل مخفي في صورة، 2683 02:07:14,660 --> 02:07:16,610 ولكنها صورة مشوشة قليلاً وسيتعين عليك 2684 02:07:16,610 --> 02:07:19,150 اكتشاف الرسائل السرية في الصورة 2685 02:07:19,150 --> 02:07:22,790 عن طريق تحميل تلك الصورة فيها، وتعديلها، ووضع نوع من عامل تصفية أحمر اللون 2686 02:07:22,790 --> 02:07:26,240 بأعلاها ورؤية الرسالة السرية، لكن سيتم كل ذلك رقميًا؛ ثانيًا، 2687 02:07:26,240 --> 02:07:30,100 في الواقع تغيير حجم الصور وأخذ هذا العدد الكبير من وحدات البكسل في هذا الوجه المبتسم 2688 02:07:30,100 --> 02:07:32,430 الكبير أو شيء آخر وجعله أكبر، 2689 02:07:32,430 --> 02:07:34,700 أو إذا كان واسعًا بدرجة أكبر، فبجعله أصغر 2690 02:07:34,700 --> 02:07:36,980 ومعرفة كيفية القيام بذلك التمرين؛ 2691 02:07:36,980 --> 02:07:40,280 وأخيرًا، لقد قمنا بالتقاط بعض الصور الفوتوغرافية لجميع طاقم العاملين في CS50 2692 02:07:40,280 --> 02:07:41,750 في كامبريدج ونيو هافن. 2693 02:07:41,750 --> 02:07:45,740 لسوء الحظ لقد أتلفنا بطاقة الذاكرة أو ضيّعناها دون قصد، 2694 02:07:45,740 --> 02:07:49,360 لكننا قمنا بصورة تحليلية كبحث جنائي لها، نسخة من جميع الأصفار والواحدات باستخدام جميع 2695 02:07:49,360 --> 02:07:51,200 صور طاقم العاملين، وسنحتاج 2696 02:07:51,200 --> 02:07:54,180 لكتابة التعليمة البرمجية التي تسترد في الواقع كل ملفات JPEG 2697 02:07:54,180 --> 02:07:57,940 أو الصور الفوتوغرافية من تلك البطاقة الرقمية بفتح ملف، 2698 02:07:57,940 --> 02:08:00,320 وقراءة ماهيتها ومكانها في تلك الأصفار والواحدات، 2699 02:08:00,320 --> 02:08:02,020 وفهمهما، وإعادة كتابتهما تحديدًا 2700 02:08:02,020 --> 02:08:05,510 للقرص باستخدام الدوالّ التي سنقدمها لكم في مجموعة 2701 02:08:05,510 --> 02:08:06,380 المسائل نفسها. 2702 02:08:06,380 --> 02:08:09,650 ولكن بالطبع، إمكانية قيامنا بهذا هو أمر مفروغ منه، 2703 02:08:09,650 --> 02:08:10,890 ويمكنكم فقط القيام بأكثر من ذلك بكثير. 2704 02:08:10,890 --> 02:08:13,760 وفي الحقيقة، هذا الأسبوع يتمحور حول حل تلك المسائل 2705 02:08:13,760 --> 02:08:16,500 لأنها تتعرف على قيود أجهزة الكمبيوتر، 2706 02:08:16,500 --> 02:08:19,640 لذلك فكرنا أننا سنختم في الثواني الأخيرة بهذا 2707 02:08:19,640 --> 02:08:22,240 المثال الواقعي جدًا من مسلسل فيوتشوراما. 2708 02:08:22,240 --> 02:08:23,020 [VIDEO PLAYBACK] 2709 02:08:23,020 --> 02:08:24,660 - قم بتكبير كرة الموت هذه. 2710 02:08:27,300 --> 02:08:28,750 لماذا ما تزال غير واضحة؟ 2711 02:08:28,750 --> 02:08:30,750 - هذا كل ما باستطاعتنا من دقة. 2712 02:08:30,750 --> 02:08:33,090 فجعلها أكبر لا يجعلها أوضح. 2713 02:08:33,090 --> 02:08:34,800 - يفعل ذلك على CSI Miami. 2714 02:08:34,800 --> 02:08:35,470 -أُف. 2715 02:08:35,470 --> 02:08:36,060 [END PLAYBACK] 2716 02:08:36,060 --> 02:08:38,700 ديفيد مالان: وهذا كل شيء بالنسبة إلى CS50، سأراكم المرة القادمة. 2717 02:08:38,700 --> 02:08:40,090 [APPLAUSE]