>> [عزف الموسيقى]
DAVID J. مالان: هذا هو مثل ندوة طالبة اليوم.
حسنا.
حتى ممطر جدا بها.
هذا يميل إلى أن يحدث في يوم الأربعاء، ولكن كل فرصة أكبر
للأسئلة اليوم.
لذلك دعونا نبدأ من الواقع مع الفيلم في مجرد لحظة.
ولكن سنبدأ بشكل رائع كما هو الحال دائما.
>> هذا هو CS50، وهذا هي نهاية الأسبوع (4).
لذلك إذا كنت قد شاهدت من أي وقت مضى التلفزيون أو السينما حيث
هناك بعض خبراء الكمبيوتر و الشرطة أو FBI، أو بعض الوكالات
يحاول التقاط بعض خصم، حسنا، كنت قد
ربما سمع عبارة "تعزيز" حيث أن فني بطريقة أو بأخرى
الأزيز سحرية في بلا حدود الآن لنرى المجرمين
الهوية أو رقم لوحة ترخيص حتى في وميض المرآة
أو بريق العين لشخص ما.
لذلك الواقع، دعونا نلقي نظرة على عدد قليل من هذه مشاهد من هوليوود.
[تشغيل الفيديو]
-OK، الآن دعونا الحصول على نظرة فاحصة على لك.
>> -Hold ذلك.
تشغيل هذا مرة أخرى.
>> -إنتظر دقيقه.
اذهب يمينا.
>> -هناك، وتجميد ذلك.
-كامل الشاشة.
-OK، وتجميد ذلك.
-Tighten حتى على ذلك، سوف؟
-Vector على ذلك في الرجل من العجلة الخلفية.
-Zoom في الحق هنا على هذه البقعة.
، مع المعدات المناسبة، وصورة يمكن توسيع وشحذ.
-ما هذا؟
-من هو برنامج تعزيز.
هل يمكن كنت واضحا أن ما يصل أي؟
-لا اعرف.
دعونا تعزيزه.
>> -Enhance قسم A6.
>> -I تعزيز التفاصيل، and-- أعتقد أن هناك
بما فيه الكفاية لتعزيز، الافراج عنها لشاشتي.
-I تعزيز التفكير في عينها.
>> يتم تشغيله -Let ذلك من خلال تعزيز الفيديو.
-Edgar، يمكنك تعزيز هذا؟
>> -تشبث.
>> -I've تم العمل على هذا التفكير.
>> انعكاس -Someone ل.
-انعكاس.
-هناك من انعكاس لوجه الرجل.
انعكاس -THE.
-هناك من انعكاس.
-Zoom في على المرآة.
، يمكنك رؤية انعكاس.
هل يمكن أن تعزز صورة من هنا؟
هل يمكن أن تعزز به هنا؟
هل يمكن أن تعزز ذلك؟
يمكنك تعزيز ذلك؟
>> هل يمكن أن نعزز هذا؟
>> هل يمكن أن تعزز ذلك؟
-Hold على الثانية، وسوف تعزز.
-Zoom في الباب.
-Times 10.
-Zoom.
-امضي.
-أكثر.
-Wait، ووقف.
-توقف.
-Pause ذلك.
-Rotate لنا 75 درجة حول رأسي، من فضلك.
-توقف.
العودة إلى الجزء عن الباب، مرة أخرى.
>> -Got محسن الصورة التي يمكن النقطية؟
>> -Hey، وربما يمكننا استخدام براديب طريقة صن لنرى في ويندوز.
البرنامج هذا من حالة من الفن.
>> -THE القيمة الذاتية هو خارج.
>> ، مع الحق مزيج من algorithm--
>> -He مأخوذة القضاء خوارزميات إلى المستوى التالي،
ويمكنني استخدامها ل تعزيز هذه الصورة.
>> القفل على وتوسيع محور ض.
>> -تحسين.
-Freeze وتعزيز.
>> [END قراءة]
>> DAVID J. مالان: كل الحق، لذلك كل هذه هي في الواقع عبارة.
انهم مجرد مدمن معا في الطريقة التي ليس من المعقول فعلا.
و، في الواقع، CS50 والدورات مثل ذلك يميل الى الخراب الكثير من التلفزيون والأفلام
لاجلك.
لأنه عندما هؤلاء الخبراء الكمبيوتر ويجلجل من حيث وقوله
يتوهم أشياء مثل المتجهات الذاتية، ومحور ض،
وأي عدد من الآخر في الواقع حيث أكثر تقنية،
انهم في الحقيقة مجرد التوتير الكلمات معا في كثير من الأحيان.
غير أن واحدا من آمالنا هو أن، كأثر جانبي لأخذ دورات
مثل هذا، وأكثر الناس في العالم سيكون فعلا قادرة على تزن في
ومجرد من أي وقت مضى لذلك تأثير طفيف جودة ودقة تلك الأفلام؟
>> في الواقع، دعونا نلقي نظرة على الواقع.
حتى هنا هو الصورة موظفي مريم، واحد من زملاء التدريس لدينا.
ونفترض أنها يشتبه في شيء.
وحتى الآن، وهناك بصيص بعض قطعة من الأدلة في عينها،
أو في انعكاس لنظارتها.
حسنا، إذا لم نفعل تماما كما في الأفلام أقترح، التي نحن فيها التكبير و"تعزيز"
هذه هي الطريقة الكثير من المعلومات في وجه ماري
عند التقاط صورة مع أن القرار الأصلي.
>> و، في الواقع، يمكنك ان ترى هذه النقاط.
وهذه هي ما هي دعا بكسل، P-I-X-E-L-S،
الذي هو مجرد عادة مربع هذا هو نقطة أن يؤلف صورة.
ومرة في اليوم، وفعلا حتى اليوم مع بعض من تلفزيونات LED اليوم
أو تلفزيونات LCD، إذا كنت قد حصلت على واحد في غرفتك أو في المنزل،
إذا كنت اصعد فائقة على مقربة منه، و لا سيما إذا كان جهاز تلفزيون السن إلى حد ما،
ربما يمكنك حتى نرى هذه النقاط وهذا ما يؤلف صورة.
>> وليس هناك أكثر معلومات من هذا.
يمكننا أن "تعزيز"، بمعنى تمهيد الأمور ونوع من
استنتاج نوع، أو نوع ما يجب أن يكون لون بجوار العين مريم
بحيث انها ليست في الواقع منقطة ذلك.
ولكن إذا أظل التكبير، هناك هو شخص سيء في عينها.
مثل هذا هو كل المعلومات التي لدينا.
لا يمكنك إنشاء المعلومات من لا شيء.
لا يوجد سوى محدود عدد البتات هناك.
>> وذلك في مشكلة تعيين 4، حيث لديك فرصة
للعب مع هذا النوع من العالم.
في مشكلة تعيين 4، عليك استكشاف عالم الرسومات، والطب الشرعي،
وفعلا كتابة التعليمات البرمجية أن يسترد الصور المفقودة.
عليك كتابة التعليمات البرمجية التي تعالج الصور الموجودة
وفهم في نهاية المطاف ما هو يجري تحت غطاء محرك السيارة.
>> واتضح، انها فعلا ليس كل ما تعقيدا.
على سبيل المثال، إذا أردنا أن تمثل وجه مبتسم حيث
مع هذه بكسل سوداء، أو هذه النقاط السوداء،
كذلك، يمكن أن تمثل ببساطة بأنها حقا صورة نقطية.
وإذا كنت قد سمعت من أي وقت مضى أن نقطية التعبير، وربما
يبدأ الآن لجعل أكثر من ذلك بقليل الشعور اليوم.
>> ونحن نعلم بالفعل ما هو الشيء.
انها 0 أو 1.
والخريطة هي مجرد شيء مثل قطعة من الورق
والتي تمنحك الاتجاهات وله ربما شبكة من X- و y الإحداثيات.
حتى هنا هو صورة نقطية.
انها خريطة البتات حيث 1 هو على ما يبدو
الذهاب لتمثيل بكسل الأبيض، و 0 هو الذهاب لتمثيل بكسل الأسود.
لكننا يمكن بالتأكيد الوجه حولها.
فإنه لا يهم حقا ذلك طالما نحن ثابت.
وهنا هو كيف، في binary-- داخل من ذاكرة جهاز الكمبيوتر، أو حتى داخل
من ملف على القرص الصلب الخاص بك drive-- هل يمكن تخزين
أبسط صور الوجوه المبتسمة.
ولكن ما نحن، بالطبع، تفتقر إلى هذه الصورة؟
لون، أليس كذلك؟
انها الخطوة التالية واضحة أو تعزيز لتحسين هذه مع اللون.
ذلك لسوء الحظ مع مجرد واحد بت 0 أو 1، ونحن يمكن أن يمثل اللون.
يمكن أن يكون أحمر أو أزرق أو الأسود، أو الأبيض، أو الأخضر، أو الوردي،
أو أي من أزواج من الألوان.
ولكن من أجل التبسيط، وسوف نقوم مجرد افتراض الأبيض والأسود.
>> فماذا منطقيا نحتاج إذا كان لنا تريد تنفيذ اللون في الصورة؟
ماذا علينا أن نفعل؟
مثل إذا كان العامل المحدد هنا غير أنه مع بت واحد يمكنك فقط
تمثل دولتين، 0 أو 1 والأبيض أو أسود، ماذا تريد أن تفعل؟
الحضور: المزيد من البيانات.
DAVID J. مالان: عن بت، نعم المزيد من البيانات، أكثر من بت.
و، في الواقع، هذا هو بالضبط كيف يتم تمثيل الصور اللون.
بدلا من استخدام بت واحد، ل 0 أو 1 لكل بكسل، كل نقطة،
كنت مجرد استخدام متعددة.
ربما استخدام 8، ربما، وهو الأكثر شيوعا استخدام 24، وبالفعل، في مشكلة تعيين
4، وسوف تلعب مع ملف تنسيق يستخدم 24 بت عادة.
>> لكن الأهم من ذلك أنك ربما مألوفة مع ملفات JPEG.
إذا كنت قد اتخذت من أي وقت مضى صورة على الهاتف الخاص بك،
أو تحميلها أو ينظر إليها على شيء الفيسبوك أو فليكر، أي عدد
من المواقع على أساس الصورة، قمت ربما ينظر صورة JPEG من قبل.
واتضح، وهذا هو الملف تنسيق ونحن في طريقنا لاستخدامها في PSET 4،
حيث كنت تريد الذهاب ل يجب أن استعادة الصور
بعد أن كنت المحذوفة عن طريق الخطأ من بطاقة الذاكرة تالفة في الكاميرا،
اذا صح التعبير.
>> واتضح أنه على الرغم من JPEG هو sophisticated-- جدا
انها أكثر تعقيدا بكثير من النقط السوداء والبيضاء
شاهدنا قبل لحظة، لأنه لا يوجد خوارزميات يتوهم فعلا أن
تستخدم لضغط JPEG، لذلك أنه يمكن أن يكون لطيف حقا،
جودة الصورة ولكن باستخدام عدد قليل نسبيا من البتات.
وسوف نعود ل ضغط قبل فترة طويلة.
اتضح أن أول ثلاثة بايت في image-- JPEG
بغض النظر عن ما كنت قد اتخذت صورة of-- هي القيم 255، 216، 255.
>> وبعبارة أخرى، إذا كنت فقط نرى أن نمط البتات،
الممثلة هنا إلى ثلاثة بايت أو 24 بت الكلي،
مع احتمال كبير يمكنك نستنتج أن كنت تبحث في الامر بهذه الثلاثة الأولى
بايت من JPEG.
وهذا هو ما هو معروف كما بالتوقيع على JPEG.
وهناك الكثير من تنسيقات الملفات هناك تميل لبدء
مع أنماط معينة من 0S و1S، حتى أن ويندوز، وماك OS، ودائرة الرقابة الداخلية،
والروبوت أعرف أي نوع من الملفات التي هي، بالإضافة إلى ما يسمى ملف
تمديد ان الكثير من الملفات لديك.
إذا كان لديك .jpg و، وهذا دليل آخر على الكمبيوتر.
>> لذلك دعونا ننظر الآن في هذه أكثر من ذلك بقليل من الناحية الفنية.
نحن نعرف عشري النظام هو من 0 إلى 9.
نحن نعرف ثنائي هو 0 و 1.
وإذا كنت تعتقد العودة إلى PSET 0، كان لدينا كنت أتصارع مع،
للقليلا، شيء دعا عشري،
حيث لديك 16 رقما، بدلا من 10 أو بدلا من 2.
وهذه الأرقام، من خلال اتفاقية، هي من 0 إلى 9 وبعد ذلك
خلال f، حيث تمثل ما و رقم عشري، تماما كما التعقل سريعة
تحقق؟
لذا، 15.
ويجب أن تمثل 10، فقط عن طريق طبيعة ترتيب أنني قد أعطيت.
انها مجرد اتفاقية التعسفية، ولكنه أمر معتاد تماما.
>> لذلك إذا نظرنا إلى هذا النمط ثلاثة bytes-- دعونا
مجرد بداية لننظر إليها في على نحو يتفق مع كيفية
علماء الكمبيوتر بشكل عام ننظر ونفكر في الملفات.
يمكنك التفكير بالتأكيد حول الملفات في 0S، و1S، والعشرية،
ولكن في الواقع، فإننا نميل إلى استخدام ثنائي أو أكثر عادة hexadecimal--
العودة من PSET 0.
لذلك اسمحوا لي أن أقترح 255، 216، و 255 هي فقط هذه الأنماط من 0S و1S.
ويمكنك التحقق من ذلك إذا كنت تريد أن تفعل الرياضيات من أسبوع 0.
ولكن، حتى الآن، مجرد افتراض أن هذا هو الصحيح في الواقع.
لقد إعادة كتابة فقط ثلاثة عشري أرقام عن ثلاثة القيم الثنائية.
الآن ما انا ذاهب الى القيام به هو فقط إضافة بعض المساحة البيضاء،
فقط من أجل سهولة القراءة و.
والإشعار، أنا مجرد الذهاب لتحريك الأمور عن بعضها البعض.
لذلك من قبل، بعد، قبل، وبعد.
أنا لا تفعل شيئا أخرى مثيرة للاهتمام من مجرد نشر الأمور حتى
أن إشعار كل مجموعة من ثمانية بت الآن مجموعتين من أربعة أجزاء.
هذا مفيد لأن ست عشري هو المألوف بشكل خاص
لأن كل رقم عشري من 0 إلى و، أو بشكل أكثر تحديدا من 0 إلى 15،
يمكن تمثيل بالضبط مع أربعة بت.
وبعبارة أخرى، إذا كنت في ست عشري تريد أن تمثل 0، انها فقط 0000،
أربعة أصفار.
وإذا كنت ترغب في تمثيل 15، انها 1111، أي ما يعادل أربعة بت.
وإذا كنت تفعل الرياضيات، إذا كان هذا هو المكان المناسب منها،
هذا هو المكان 16S، هذا سوف يعطي you--
بدلا من أن يجري to-- آسف، في ثنائي،
هذا سوف تعطيك 15، الآحاد، ثنائي المكان، أربع وثمانى مكان.
لذلك اسمحوا لي أن أقترح أن مجموعة من أربعة بت على اليسار
ما نحن في طريقنا للدعوة و.
انها أكبر الرقم الذي يمكن أن تمثل مع أربعة بت.
ونحن نعرف بالفعل من عشري، و هو أكبر رقم في ست عشرية.
لدينا و آخر هناك، اثنين آخرين هناك.
وحتى الآن، تأخذ فقط على الإيمان الذي قمت به الحق الرياضيات
وأن النصف الأيسر من هذه البتات، 1101،
هو نفس الشيء د الست عشري.
واليد اليمنى، 1000، على بعد 8.
>> وهذا واحد من السهل أن نرى، أليس كذلك؟
وrepresents-- 8 هو الحق تحت هذا المكان الثمانيات.
لذلك لدينا واحدة في العمود الثمانيات ولا يوجد في أربع، ثنائي أو تلك.
وحتى الآن أكثر تقليديا، والبشر يميلون لكتابة أرقام ست عشرية مثل هذا،
كنت إسحق فقط منهم معا، ثم بادئة لهم 0X.
ذلك لا يعني شيئا آخر غير فكرة بصرية لhuman--
هنا يأتي value-- ست عشري ل قد لا يكون الأمر خلاف ذلك واضح.
>> وهو ما يعني، في نهاية المطاف، أن نمط الأصفار ومنها،
أو نمط الست عشري أرقام مكافئ أنك
الذهاب الى البدء في البحث عن في مشكلة تعيين 4 هو this--
والمواصفات مشكلة تعيين 4 سوف يدخلون يمكنك من خلال هذا في أكثر detail--
ولكن ندرك كنوع من حيث غامضة هذا قد تبدو للوهلة الأولى،
وأنت تسير لتبدأ في رؤية هذا كثيرا.
وفي الواقع، حتى في GDB، و المصحح قدمنا ​​يوم الاثنين
ودان يدخل في PSET 3، يجري لفي كثير من الأحيان تظهر لك القيم الست عشرية
فقط لأنها تميل إلى أن تكون أكثر التقليدية من عشري أو ثنائي
في العالم من أجهزة الكمبيوتر.
الآن دعونا نضع هذا في السياق.
الكثير منكم قد تذكر هذه صورة هنا، والتي جاءت من ماذا؟
ويندوز فيستا، وذلك حتى في وقت سابق من أنه فعل ويندوز XP هذا لاول مرة.
لذلك هذا هو المناظر الطبيعية الجميلة.
وفي الواقع، إذا كنت كزة حول online-- أعتقد أنه من مقال ويكيبيديا،
حيث ذهب شخص مذهل جدا من وجدت مجموعة هذا الموقع في العالم يصل
له أو لها الكاميرا في على وجه التحديد place-- الحق
وهذا اليوم يبدو like-- لكن انها بالضبط نفس الإعداد.
هذه الصورة، رغم ذلك، هو في ملف شكل يسمى نقطية، B-م-ص.
ونحن في طريقنا لاتخاذ السوبر نظرة سريعة على ما يعنيه ذلك.
>> ولكن النقطية هي مجرد طريقة مختلفة ل تمثل الصور لا تزال تستخدم بكسل
في 0S و1S، في نهاية المطاف.
ولكن في نظرة سريعة، لديها توقيع أكثر إثارة للاهتمام
في بداية الملف.
انها ليست مجرد ثلاث بايت، بدلا هناك
مجموعة كاملة من أنماط بايت التي سلفا معنى.
على سبيل المثال، في مكان ما في بايت القليلة الأولى من صورة نقطية
سيكون حجم صورة، وعرض الصورة،
ارتفاع الصورة، لذلك الفوقية مفيدة، اذا صح التعبير.
المعلومات المفيدة التي فوتوشوب أو أي برنامج الرسومات الذي تستخدمه
قد يعنون حقا.
>> أكثر من ذلك عن هذا الموضوع في تعيين المشكلة 4، ولكن هذا
هو فقط أن أقول في نهاية اليوم
جميع صيغ الملفات كنت أستعمل لملفات مايكروسوفت وورد years--،
أرقام الملفات، ملفات اكسل، أي عدد من تنسيقات الملفات
التي قد يكون لها بعض تمديد الملفات المعروفة
هي مجرد 0S و1S تحت غطاء محرك السيارة.
ولقد قرر البشر ما هي الاتفاقيات،
ما أنماط 0S و1S تمثل ملف وورد مقابل ملف إكسل،
مقابل أي عدد من تنسيقات الملفات الأخرى.
حتى في PSET 4، سيكون لديك فرصة للعب مع ذلك.
>> ولكنه ماذا يعني أن يكون لها بنية.
هذا هو في الواقع سغ] لطيفة الآن إلى C، والتي ليس لديها سوى بضع
ميزات إضافية نحن لم ينظر في بعد.
انها لغة صغيرة جدا واحدة من ملامح لطيفة حول C هي البنية.
على سبيل المثال، إذا كنت أراد أن represent-- دعونا
نقول لكم نريد أن يكون متغير يمثل الطالب في بعض البرامج.
ربما كنت تكتب دورة برنامج التسجيل، أو التسوق الأساسية
أداة، أو شيء من هذا القبيل.
ما هي قطعة من البيانات ذات الصلة للطالب التي تتبادر إلى الذهن؟
مثل الطالب ممثلة مع ما يقدر؟
نعم؟
لديك اسم كطالب.
ماذا لا يكون طالب نموذجي؟
>> الحضور: (غير مسموع)
>> DAVID J. مالان: لذا، آسف.
>> الحضور: العمر.
>> DAVID J. مالان: عصر أو عيد ميلاد مكافئ، موافق.
ماذا بعد؟
الحضور: رقم العدد؟
DAVID J. مالان: لذلك فإن رقم الهوية، وربما رقم هاتف، وربما النوم، أو المنزل،
أو الكلية، أو شيء من هذا القبيل.
أي عدد من قطع من البيانات التي قد يكون لديك في قائمة جهات الاتصال الخاصة بك
ما قد تعريف الطالب.
لذلك إذا أردنا القيام بذلك، في التعليمات البرمجية، قد نفعل شيء بسيط من هذا القبيل.
قد يكون لدينا برنامج بحيث له دعنا نقول، كثافة العمليات الرئيسي (الفراغ).
وإذا أريد لتمثيل طالب أنني قد يكون، على سبيل المثال،
سلسلة دعا اسم ذلك الطالب، سلسلة دعا النوم لهذا الطالب،
ربما عدد صحيح يسمى ID لهذا الطالب.
ولأن أنا باستخدام سلسلة، I بحاجة إلى العودة وطرح CS50.h.
ربما أنا بحاجة الى الذهاب stdio.h.
لذلك اسمحوا لي استباقي تفعل هذه وأنا الذهاب لهذه الكلمة student.c الآن
وحفظ هذا.
>> والآن أستطيع أن أفعل شيئا مع هذه المتغيرات.
ونحن فقط أريد أن أكتب كما أن تعليق في رمز زائف،
لأنها ليست مثيرة للاهتمام ما نقوم به في الوقت الراهن.
حسنا، هذا هو البرنامج الذي يخزن بطريقة أو بأخرى طالب.
ماذا أريد أن أفعل إذا تريد تخزين اثنين من الطلاب؟
حتى أول غريزة بلدي يسير أن تكون كل الحق، وانتظر لحظة،
إذا كان لدي طالب آخر لماذا لا استطيع فقط تفعل اسم سلسلة 2، سلسلة النوم 2،
الباحث ID2.
وفعلناه ذهب هذا الطريق من قبل
وما هو الحل لدينا ما يبدو أن يكون نوع من عجينة نسخة hackish
العمل هنا؟
الحضور: صفيف.
DAVID J. مالان: نعم، يمكننا استخدام صفيف.
حق هذا بسرعة جدا يصبح غير عملي.
لديك لفرز تعسفية بدء تسمية كل من هذه المتغيرات.
وكنت، والإنسان، لديها للحفاظ على المسار الذي يتوافق OK NAME2
مع dorm2 يتوافق مع ID2.
يصبح مجرد فوضى.
ذلك أنه من الأسهل كثيرا، أذكر من قبل بضعة أسابيع،
لمجرد وجود ليطلق أسماء سلسلة وربما تعطينا ثلاثة من هؤلاء.
وبعد ذلك ربما لدينا مساكن سلسلة ولها
ثلاثة من هؤلاء، أو مع ثابت، كثافة العمليات هويات ولها ثلاثة من هؤلاء.
ولكن حتى الآن هذا يشعر قليلا قذرة، والحق.
نحن نتحدث عن الطلاب وحتى الآن أنا حقا مسكن على مستوى منخفض
تفاصيل التنفيذ.
الطالب هو اسم والنوم وID.
>> لماذا لا يمكنني فقط بتعريف متغير ودعا الطلاب والذي يطلق عليه ق.
وإذا أريد طالب آخر، لماذا لا استطيع فقط نسميها ر.
أو إذا كنت ترغب في مجمله مجموعة من الطلاب، لماذا لا استطيع فقط
يقول لدي فئة كاملة من الطلاب، وانها ثلاثة منهم.
وبعبارة أخرى، لماذا لا يمكن أن آتي مع بلدي نوع البيانات الخاصة، ودعا
الطلاب، داخل منها اسم، هو الهوية، هو النوم،
أي عدد من المجالات الأخرى.
واتضح لك تستطيع أن تفعل ذلك بالضبط.
>> هكذا C ديه هذه الميزة تسمى البنية.
هذا هو ميزة اللغة التي يتيح لنا أن نفعل هذا بالضبط.
انا ذاهب الى المضي قدما وفتح structs.h
أين نحن ذاهبون لرؤية بعد تعريف الطلاب.
اتضح - وهذا واحد حتى أبسط من تلك التي تنطوي على ID
منذ لحظة.
إذا كنت ترغب في الخروج مع الخاص بك نوع بيانات محلية الصنع،
وبالإضافة إلى كثافة العمليات، وشار و تطفو وجميع أولئك الآخرين موجودة،
يمكنك القيام بذلك عن طريق حرفيا كتابة typedef والبنية،
ثم بعض الأقواس المعقوفة، داخل الذي
قائمة المتغيرات التي تريد اقترانه هذه البيانات مخصص جديد
اكتب مثل اسم والنوم، ثم بعد الأقواس المعقوفة
كنت تعطي اسما لنوع البيانات الجديدة.
لذلك، على سبيل المثال، طالب.
>> وما هو جميل عن هذا الآن هو أن إذا نظرنا إلى رمز المقابل،
الاتفاقية، لأول مرة قبل كل شيء، هو وضع هذا
في ملف يسمى شيء دوت ساعة، ملف رأس، والتي ليس لدينا
بدأت باستخدام أنفسنا كثيرا.
لكننا في طريقنا للبدء باستخدام قليلا جدا الآن.
وماذا يمكننا القيام به مع هذا، في نهاية المطاف، في هذه الأسطر القليلة من التعليمات البرمجية
وأعلن أن بالضبط نوع البيانات، وهو طالب.
والآن دعونا استخدامه.
>> انا ذاهب للذهاب إلى الآن دعا ملف structs1.c.
ودعونا نلقي نظرة على بعض الخصائص هنا.
وذلك من الاشياء هنا هو معظمها مألوفة، وسنقوم
أعود إلى ما هو غير مألوفة في مجرد لحظة.
هذا بالطبع هو بما في ذلك بلدي ملف الرأس الذي هو جديد أيضا،
باستثناء PSET 3 حيث، أذكر، لدينا helpers.h.
لذلك قد نذكر helpers.h تتضمن #.
>> لماذا على الرغم من أنا استخدام علامات الاقتباس بدلا من الأقواس الزاوية؟
عندما أقوم باختيار بينهما؟
تقريبا دائما يبدو لي لاستخدام الأقواس الزاوية.
ثم، فجأة على خط الستة أنا باستخدام علامات الاقتباس المزدوجة.
لماذا يمكن أن يكون؟
نعم؟
>> الحضور: (غير مسموع)
DAVID J. مالان: هذا هو فعلي، ما هي؟
الجمهور: هذا في IDE الخاص بك.
DAVID J. مالان: نعم، هذا في بلدي IDE الفعلي.
ودعونا لا أسهب في الحديث عن IDE، ل هذا مجرد أداة أنا باستخدام.
هذا في بلدي الحالي الدليل على وجه التحديد.
حتى structs.h هو ملف بلدي غير مثبتة في IDE،
في نظام التشغيل نفسه، بل هو في دليل بلدي الحالي.
وبالتالي فإن الاتفاقية هي إذا كنت تريد لتضمين ملف الرأس الخاص بك،
كنت مجرد استخدام علامات الاقتباس المزدوجة.
>> ماذا نسمي هذا الشيء في خط 8، بصفة عامة؟
هذا ما؟
شيء # تعريف.
وهذا يمثل الثوابت، أليس كذلك؟
إذا كنت تريد أن يكون لها القيمة في البرنامج
التي تستخدمها كلها حفنة من الأوقات، انها
اتفاقية جيدة لعامل بها، نعلن ذلك، مع رمز التجزئة
تحديد، ثم، من خلال اتفاقية، في كل أحرف كبيرة word-- على الرغم من انها ليست
الضرورة القصوى، ولكن انها اتفاقية الإنسان
للاستفادة الثوابت بحيث القفز
عليك visually-- الفضاء و ثم القيمة التي تريد أن تكون
أي ما يعادل الاسم الذي ثابتة ل.
لا منقوطة، ولكن يمكنك ببساطة اتبع هذا النمط هناك.
>> لذلك ماذا أفعل في هذا الرمز الفعلي.
لذلك دعونا نلقي نظرة على البرنامج الرئيسي هنا.
في السطر 12 لأنني وشملت structs.h،
لدي الآن سحرية في بلدي التخلص نوع بيانات جديدة.
ليس لدي مجرد الحصول على الباحث، وشار، وتعويم، وسلسلة،
والأزرق وغيرها.
لدي الآن الوصول إلى نوع بيانات الطالب.
وذلك في السطر 12، وأنا الجمع بين اثنين الأفكار- واحدة نوع البيانات المخصصة واثنين،
استخدام صفيف.
وحتى في هذا البرنامج إذا أريد لدعم الواقع
ثلاثة طلاب مختلف في برنامجي، وأنا
يمكن القول ببساطة أن تعطيني متغير ودعا الطلاب، كل واحدة منها
هو نوع من الطلاب، والتي هو نوع بي البيانات المخصصة.
وعلى وجه التحديد، أعطني ثلاثة من هؤلاء في مجموعة بي.
>> حتى الآن ماذا نفعل في هذا البرنامج؟
هنا فقط لحلقة بالتكرار 0-3، لأن هذا هو
ما قيمة الطلاب هو.
أنا مجرد مطالبة المستخدم تعطيني اسم الطالب.
ثم في خط 17، ونحن لدينا خط معظمها مألوفة.
لدينا صديقنا القديم GetString على اليمين.
وما قطعة من جملة على ما يبدو جديدا،
إذا كنت قد برمجت أبدا في C من قبل، واستخدمت أبدا البنيات؟
نعم؟
>> الحضور: و.name.
DAVID J. مالان: إن .name.
ولكن هذا ليس كثيرا من قفزة، لأنه الآن طلاب قوس ط
يعطيك الطالب ط عشر.
وإذا كنت تريد الغطس داخل هذا الهيكل،
كنت مجرد استخدام فترة واحدة و ثم اسم المتغير في الداخل،
أو الممتلكات داخل هذا كنت ترغب في الحصول على الوصول إليها.
ثم وبالمثل، إذا كنت ثم مطالبة المستخدم، أعطني النوم الطالب،
يمكنك تخزين أن بالمثل سلسلة في متغير النوم داخل
من هذا الهيكل طالب.
>> والآن الامور قليلا الهوى.
وهذا هو الذهاب للبحث ربما في الكثير قريبا جدا.
ولكن سترى هذا أكثر بكثير في PSET 4، لذلك دعونا وهلة فقط في ذلك الآن.
اتضح أنه في خط 23 عن طريق 38، ما رأيك أفعله ربما؟
لقد إزالة التعليقات لهذا اليوم، ولكن النسخة
من قانون الانترنت ل مرجع لديه كل تعليق.
ماذا يبدو لي أن تفعل؟
>> الحضور: حفظ الملف مع جميع المعلومات التي أدخلها المستخدم.
>> DAVID J. مالان: نعم، بالضبط، هذا هو وسيلة جديدة
أن نراه اثنين، ميزة أخرى من C،
حيث يمكنني إنشاء ملفات الخاصة.
حتى الآن، كل برنامج تقريبا كنت قد كتبت عديم الجنسية.
حالما يتم ذلك على التوالي، هذا كل شيء.
لا يوجد الذاكرة أو تذكر منه.
لا يوجد ملف محفوظ.
ولكن إذا كنت لا تريد أن حفظ المدخلات التي لديها
حدث في مثل لعبة أو برنامج مثل هذا، اتضح أننا نستطيع أن نفعل ذلك.
وسترى هذا أكثر في PSET 4 وفي القسم.
ولكن هذا الخط 23 أساسا بإنشاء ملف يسمى students.csv.
وكنت قد رأيت هذا من قبل.
حتى إذا كنت قد درست أبدا CS من قبل، CSV هي المتغيرات مفصولة بفواصل.
انها مثل الرجل سيئة للغاية نسخة من ملف إكسل،
مما يعني أنه يمكن فتح في Excel و في أرقام أبل،
وكان له الصفوف والأعمدة.
ولكنها ليست ملكية خاصة شكل مثل مايكروسوفت أو أبل.
انها مجرد الفواصل التي تفصل بين القيم التي سنرى في لحظة.
>> وتأخذ مجرد تخمين.
في خط 23، في غاية نهاية، حجتي الثانية
لهذه الوظيفة جديدة تسمى و مفتوحة لفتح الملف هو ث.
ما قد دلالة ث؟
نعم؟
>> الجمهور: وهو يتيح لك الكتابة إلى الملف؟
>> DAVID J. مالان: وهو يتيح الكتابة إلى الملف.
لذلك هناك زوجين من المتغيرات أننا يمكن سد العجز في هنا.
ولكن إذا كنت ترغب فقط في قراءة الملف، وهذا هو ننظر في الأمر
وقراءتها في الذاكرة، مجرد استخدام الإقتباس "ص".
إذا كنت تريد أن تكتب ل ملف، يمكنك استخدام الإقتباس "ث".
هناك أيضا وإلحاق بضعة أشياء أخرى
إذا كنت ترغب في تعديل الملفات الموجودة.
الآن ونحن في طريقنا للحفاظ على رؤية هذا شيء، ثم سنقوم يعود إلى خط 24.
NULL، كما تبين، هو قيمة خاصة
يمكن إرجاعها من قبل بعض وظائف إذا كان هناك شيء قد ذهب wrong--
إذا لم يكن الملف موجودا، إذا كنت قد نفد من الذاكرة،
أو حفنة من أخطاء أخرى.
لكنه الآن، دعونا نفترض فقط أن هذا هو التحقق من الخطأ فقط التقليدي.
هنا في السطر 26، وأنا بالتكرار 0-3 على جميع طلابي.
وهذا هو نوع من الفرز من وظيفة جديدة، fprintf،
ولكن مجرد إلقاء تخمين.
إذا printf هو مجرد طباعة سلسلة منسقة،
ماذا fprintf ربما يعني؟
الحضور: طباعة إلى ملف.
DAVID J. مالان: طباعة تنسيق سلسلة إلى ملف.
هذا ما الإضافي و الوسائل هي الملف.
والحجة الأولى الجديدة يجب أن تكون المتغير الذي يمثل الملف.
ثم لدينا مجرد شكل سلسلة تماما مثل printf.
وعلى الرغم من هذا بناء الجملة جديدة، وهذا فقط
يعني سد العجز في اسم الطالب، المكونات في النوم طالب، ثم
مع fclose، إغلاق الملف.
ثم lastly-- هذا هو الجديد وسوف نعود إلى هذا
قبل long-- أنا تحرير الطالب لأسباب
ما حدث حتى أعلاه هناك.
ولكننا سوف نعود لأنه قبل long--
هذا بسبب الطريقة غير GetString في الواقع يعمل تحت غطاء محرك السيارة.
>> لذلك دعونا نلقي نظرة سريعة هنا.
إذا كنت اكتب ليرة سورية في دليل بلدي، لاحظت أنني لا
وجود ملف يسمى students.csv، فقط لم يكن هناك، لا وجود لها.
حتى لو كنت الآن تجميع هذا البرنامج، جعل البنيات-1. / البنيات-1،
وانا ذاهب الى المضي قدما واكتب في اندى، الذي يعيش في بيركلي في جامعة ييل.
ونحن في طريقنا لروب الذين يعيش في ثاير هذه الأيام.
ودعونا نخرج فيها هو، كما أعتقد، ماريا في ماذر،
إذا كنت قد تذكرت بشكل صحيح.
>> لذلك لا شيء يبدو أن يحدث.
ولكن إذا كنت اكتب ليرة سورية الآن، هناك students.csv.
دعونا نمضي قدما وstudents.csv مفتوحة.
هذا هو مرة أخرى جدا تنسيق الملف خفيفة الوزن.
ولكني اعتمدت مجرد اتفاقية أن لدي اثنين من الصفوف والأعمدة هنا.
العمود الأول هو أسماء الناس الأولى.
العمود الثاني هو الطالب النوم، أو الكلية، أو المنزل، أو غيرها.
والآن لقد أنقذ هذا بشكل دائم في الملف.
>> لذلك ليس كل ما مثيرة للاهتمام.
ولكن هذا هو مجرد نقطة انطلاق الآن لتكون قادرة على الاستمرار المعلومات
بشكل دائم.
لذلك دعونا نرى الآن ما أكثر ما في وسعنا علاقة هذه وغيرها من الميزات.
ولكن أولا، أي سؤال؟
كان ذلك كثيرا، والتي كانت سريعة.
ولكن سترى الكثير أكثر في PSET 4، كذلك.
نعم؟
>> الحضور: هل هناك طريقة ل تستمر إضافة أسماء إلى هذا الملف؟
>> DAVID J. مالان: سؤال جيد.
هل هناك طريقة لمواصلة إضافة أسماء إلى هذا الملف؟
نعم.
و، في الواقع، إذا كنت في نهاية حتى إعادة فتح الملف،
ستستخدم الاقتباس نهاية الاقتباس "أ" للإلحاق،
التي من شأنها أن مجرد إضافة سطر جديد، خط جديد مرة أخرى، ومرة ​​أخرى، بالضبط.
سؤال جيد.
أسئلة أخرى؟
نعم؟
الحضور: إذا قمت بتشغيل البرنامج مرة أخرى في الوقت الراهن،
فإنه الحفاظ على إضافة أسماء إلى ملف أم أنه فتح ملف جديد؟
>> DAVID J. مالان: آه، سؤال جيد.
إذا قمت بتشغيل البرنامج مرة أخرى الحق الآن، ربما كتبته في أسماء جديدة،
فإنه إضافة إلى ملف أو الكتابة فوق الملف؟
هذا الأخير، لأنني لا تستخدم وضع إلحاق.
ولأن أنا مجرد عمياء فتح ملف للكتابة،
انها مجرد الذهاب إلى الكتابة فوق الملف.
لذلك أنا بحاجة فعلا القيام به هو إلحاق، إذا كنت تريد أن يكون الواقع على المدى الطويل
قاعدة البيانات.
>> الآن CSV مفيد، وبصراحة، حتى لمثل إذا كنت writing--
وسنرى في نهاية المطاف هذا في وقت لاحق في فصل دراسي وعندما
نستخدم ملفات CSV لأغراض أخرى.
إذا كنت ترغب في تخزين كل الناس الذين سجلوا لبعض الأحداث،
أو وقعت لتلميذك مجموعة، أو شيء من هذا القبيل،
تخزين البيانات في هذا النوع الشكل هو السوبر مريحة.
لأن حرفيا، وإذا كنت كانت لتحميل هذا الملف.
أنا يمكن أن double-- و دعونا نحاول فعلا هذا
إذا كان لدي إكسل أو أرقام هنا.
>> انا ذاهب الى بزر الماوس الأيمن فوق أو التحكم مزدوجا فوق الملف الخاص بي.
يصيح.
انقر بزر الماوس الأيمن أو التحكم مزدوجا فوق الملف الخاص بي.
هيا يا الماوس لا تتعاون.
Download-- انا ذاهب الى تحميل جميع الملفات هنا حتى
فقط حتى أستطيع أن الاستيلاء على هذه واحدة.
ودعونا نرى ما اذا كان هذا يعمل students.csv-- أول مرة
لقد تفعيلها.
الآن أنها تريد أن ترى اتصالاتي.
الآن، ولست بحاجة للتسجيل.
ترى كم هو سهل لاستخدام ملفات CSV؟
نعم، ويبقيه حتى الآن.
حسنا، الآن نحن على استعداد لفئة.
OK، أوه، ما هو الجديد؟
OK، على مقربة.
كان ذلك السحرية.
حسنا، الآن لدينا لتحديث.
والآن، ونسيت ما ملف فتحت أصلا،
ولكن ما a-- هناك نذهب.
حسنا، الآن لدينا ملف إكسل.
شكرا.
>> OK، كان الجزء السهل جدا ما فعلته.
بالطبع كان يمكن أن مثبتة مسبقا إكسل، أو أرقام، أو أي برنامج.
ولكن هذا هو لطيف، ل الآن أستطيع أن التلاعب
البيانات في شكل موحد.
>> حتى الآن دعونا السياق التبديل إلى حيث توقفنا
آخر مرة، والتي كان من المقرر بدء خلع عجلات التدريب.
ولكن أولا، أنت لم نرى هذا الغداء في وقت سابق
يحدث مرة أخرى هنا في النار و الجليد في كامبريدج، سيتار في نيو هافن.
التوقيع على CS50s الموقع في اسرع وقت ممكن للانضمام الطلاب CS50 والموظفين.
>> لذلك اتخذنا عجلات التدريب من يوم الاثنين حيث follows--
وقد أعلنت سلسلة في مكتبة CS50s لبعض الوقت.
وانها لطيفة، لأنه يسمح لنا أن نتحدث عن المتغيرات بأنها
الكلمات والجمل وأكثر اكتمالا.
ولكن اتضح سلسلة غير موجود.
هذا هو مجرد مرادف أو اسم مستعار، التي أنشأناها لشيء ما
في الواقع هو أكثر من ذلك بقليل ودعا التقنية شار *.
>> وبالفعل، رأينا مثالا برنامج يوم الاثنين
التي لم تتصرف تماما كما توقعنا.
وكان هذا الملف، مقارنة-0.
وأذكر أن مقارنة-0، إذا I إعادة ترجمة البرنامج يوم الاثنين
وتشغيل مقارنة-0 واكتب في أمي في صغيرة، وأمي في صغيرة مرة أخرى.
أصر برنامج I اكتب أشياء مختلفة،
على الرغم من أمي، كل ما في صغيرة، مطابق بصريا.
فما كان الجواب القصير لماذا يفكر الكمبيوتر
تلك السلاسل مختلفان؟
نعم؟
>> الحضور: (غير مسموع)
DAVID J. مالان: الحق.
لذلك، أمي، وهي المرة الأولى أنا اكتب في ذلك، يجري
تخزينها في مكان ما في جهاز الكمبيوتر الخاص بي ل الذاكرة ولكن في مكان مختلف
من المرة الثانية اكتب في أمي.
الآن بالتأكيد يمكن أن يكون الأمثل.
يمكن أن يكون الكمبيوتر الذكية و تحقيق هذه السلسلتين، مهلا،
انهم متطابقة.
اسمحوا لي أن لا تخزينه بوفرة.
ولكن أجهزة الكمبيوتر لا تفعل ذلك الأمثل إلا إذا كنت أقول لهم.
لذلك، افتراضيا، وانهم مجرد الذهاب الى نهاية المطاف
في مكانين مختلفين في الذاكرة.
وذلك لتكون أكثر وضوحا، عندما قارنا السلسلتين،
أول كان يسمى الصورة، كان يسمى الثانية
ر، ما كان على وجه التحديد I مقارنة هنا على خط 13؟
نعم.
>> الجمهور: انها المكان في الذاكرة أن المتغير سوف يشير إليها.
>> DAVID J. مالان: بالضبط، كنت مقارنة المكان في الذاكرة
ان هذه المتغيرات تشير الى.
لذلك على وجه التحديد، وكان إذا أمي في بايت رقم 1، و 2، و 3،
و4-- تذكر لأن مائل 0 يجب أن يكون على طول الطريق في نهاية المطاف.
والمثال الآخر من أمي، م، س، م، كان في عنوان 10، 11، 12، و 13.
كنت أقارن بين 1، ذلك العنوان، هذا الموقع في الذاكرة،
مقابل 10، وهو من الواضح يست هي نفسها.
1 ليس 10.
>> لذلك هذا هو لطيف في ذلك انها واضحة جدا.
لكنه إشكالية بقدر نحن لا يمكن أن يبدو للمقارنة السلاسل.
fundamentally-- ذلك وعند هذا المستوى المنخفض،
إذا أردت تنفيذ برنامج للمقارنة
كلمتين منفصلتين أن تمت كتابة المستخدم في للجودة،
أنها لا يصطف شار ل شار، فقط بعبارات عامة،
ماذا يتعين علينا القيام به، على ما يبدو؟
انها ليست كافية فقط ل ننظر إلى هذه العناوين اثنين.
ماذا علينا أن نفعل؟
نعم؟
>> الحضور: تكرار خلال سلسلة (غير مسموع).
>> DAVID J. مالان: نعم، دعونا تكرار خلال السلسلة.
دعونا استخدام للحلقة، حلقة while، أو مهما كنت أكثر ارتياحا.
وإذا كنا قد حصلت على سلسلتين مكان ما في الذاكرة، دعونا ننظر في كل ل
الحرف الأول، ثم كل ثاني حرف، ثم الثالث، والرابع،
والخامسة، حتى نضرب ما قيمة الحارس خاصة؟
الحضور: (غير مسموع)
DAVID J. مالان: نعم، مائل الصفر، وعند هذه النقطة في أي سلسلة
يمكننا أن نقرر هذا كل شيء.
ونحن يقابل كل حرف واحد؟
إن لم يكن، عودة كاذبة.
إذا كان الأمر كذلك، العودة الحقيقية.
وهكذا هذا هو بالضبط ما هذا الإصدار البرنامج مقارنة-1.C لا.
ومن مطابقا لما نحن نظرت إلى الاثنين إلا أن كنت
تخلصنا من string-- كلمة على الرغم من التي لا يوجد لديه impact-- ظيفية جميع
أفعله الآن هو إزالة بعض عجلات التدريب البصرية،
ولكن لنرى بوضوح أن الصورة ور هي عناوين.
وهذا ما نجم، النجمة، يمثل
هو عنوان، والمعروف أكثر من الناحية الفنية كمؤشر.
>> لذلك عندما أعلن عن الصورة خط 9 وأقول شار * ق،
هذا لا يعني أن تعطيني سلسلة.
وهذا يعني أن تعطيني متغير الذي هدف في الحياة هو لتخزين عنوان.
لأنني على وشك أن تضع عنوان السلسلة إلى ذلك.
وبالفعل، GetString، ليكون واضح، لا يرجع السلسلة.
فإنه لا يرجع أمي مائل الصفر، في حد ذاتها.
ماذا GetString على وجه التحديد والعودة على وجه التحديد؟
الحضور: (غير مسموع)
DAVID J. مالان: عنوان، و عنوان الحرف الأول
في بعض سلسلة حصلت عليه.
وحتى الآن نحن نشهد والكلمة الخاصة مرة أخرى.
وأشرت إلى هذا في وقت سابق.
هذه ستكون اتفاقية جيدة أننا سنرى مرة أخرى ومرة ​​أخرى الآن.
أنا فحص للتأكد من أن الصورة ليست لاغية وتي ليست فارغة.
لأن على أساس بلدي حقا ذكر سريعة في وقت سابق،
ما قد يعني لو يعود GetString لا عنوان ولكن N-U-L-L، وهو مرة أخرى،
بعض القيمة الخاصة؟
>> الحضور: خطأ.
>> DAVID J. مالان: انها خطأ.
حدث خطأ ما.
وعادة ما قد يحدث، وخاصة
مع strings-- التي قد تكون من طول مجهولين في advance--
ربما أجهزة الكمبيوتر ' من الذاكرة، ربما
كتبته في مثل هذا كلمة طويلة أو الجملة
أو لصق هذا المقال ضخمة هناك ذاكرة كافية ليس فقط.
وهكذا GetString لا يمكن العودة عنوان كل شيء،
لذلك فقط يعود أي شيء.
وتقول قد حدث خطأ عن طريق إرجاع قيمة NULL الخاصة.
انها عنوان الصفر، إذا جاز التعبير.
>> الآن اتضح C يأتي مع الوظيفة التي يفعل ذلك التكرار.
ليس لدينا لتنفيذ هذا مع لحلقة أو حلقة في حين أنفسنا.
يمكننا استخدام وظيفة، دعا بإيجاز،
يحرك شركات، أو سلسلة مقارنة، التي هدف في الحياة هو أن تفعل ذلك تماما.
كنت تعطيه اثنين من المؤشرات، عنوانين، وأنها سوف تذهب إلى تلك العناوين
ثم قارن إلكتروني ل رسالة للرسالة للجودة،
ووقف فقط عند ما هو صحيح؟
عندما حدسي أن يحرك شركات إيقاف بالتكرار، لمجرد أن يكون واضحا؟
عندما يضرب مائل 0 في أي سلسلة، وعند هذه النقطة يمكن أن تقرر
تمت مطابقة كل شيء، أو كان هناك تناقض؟
>> لذلك، إذا كان لنا أن تشغيل هذا الآن، ومحاولة لدينا لعبة رسملة صغيرة،
لذا يجب مقارنة-1، ./compare-1، و اكتب أمي في صغيرة في كل مرة.
الآن انها نفس الشيء.
وإذا كنت تفعل ذلك مرة أخرى مع صغيرة وربما بعد ذلك الأحرف الكبيرة.
الآن انه يميز الواقع بين الكبيرة والصغيرة.
لذلك ليس كل ما من الصعب أو السحرية، ولكن أنها لا تفسر الآن
ما يجري تحت غطاء محرك السيارة.
>> فما أكثر يمكننا استخراج من هذا النوع من الدرس؟
لذلك دعونا نلقي نظرة على هذا.
انا ذاهب الى المضي قدما وكتابة برنامج سريع يسمى هنا نسخة-0.
والآن دعونا نمضي قدما والواقع دعونا نفعل this-- مع النسخ 0،
نلقي نظرة على ما أنا عندي هنا.
أود أولا أن نقول للمستخدم، ويقول شيئا.
ثم أحصل على سلسلة وأنا تخزينها في الصورة.
بعد ذلك معرفة ما اذا كان يساوي الصورة يساوي NULL، والعودة فقط 1.
لذلك هذا هو الاختيار الخطأ المعياري فقط.
شيء للاهتمام حدث.
وفي الواقع، إذا كان لنا أن نتخلص من الخطأ فحص، وهذا يشبه الأسبوع (1) رمز
في اللحظة.
ولكن لقد بدأت للحصول على أفضل قليلا عن ذلك.
>> الآن في السطر 16، قبل أسبوع، ربما أيام حتى بضع دقائق أو قبل،
قد يقول السطر 16 هو إنشاء متغير يسمى ر
والنسخ ق فيه.
وهذا هو تماما الوجبات الجاهزة معقولة.
ولكن أن تكون أكثر دقة الآن.
ما يحدث في السطر 16؟
ما يتم الحصول على نسخ من اليمين إلى اليسار؟
نعم؟
الحضور: هل ر الحصول على عنوان الصورة؟
>> DAVID J. مالان: بالضبط، ر هو الحصول على عنوان الصورة.
لكي نكون واضحين الآن، إذا ذهبت العودة إلى أن المثال السابق
وأنا استخلاص شيء قمت بكتابته في.
وما قمت بكتابته in-- هنا الصورة، وهنا
هو ما كنت كتبته في مكان ما في الذاكرة، أمي ثم مائل
0 هذا ما أضاف بالنسبة لي.
ما المخزنة في هنا، أذكر، هذا هو في مكان 1، 2، 3، 4،
هذا هو ما هو حاليا في الصورة.
حتى لو كان على خط 16، وأنا أقول أن تعطيني آخر متغير يسمى ر وتخزين
في في قيمة الصورة، ما يحصل المخزنة هنا سوف لا أمي
بل مجرد رقم 1.
>> إذا نظرنا إلى الأمام في هذا البرنامج الآن، ما الذي سيحدث؟
لذلك تلاحظ أن هناك هذه الوظيفة التي قد
لقد استخدمت هذا منذ بعض الوقت لقيصر، أو Vigenere، أو ربما لا على الإطلاق.
أزعم مع بلدي printf، وأنا الذهاب للاستفادة النسخة ر.
في الخط الأول 19، التعقل سريعة تحقق، الشيكات strlen طول ر.
لأنني لا أريد محاولة للاستفادة شيء
اذا لم يكن هناك سلسلة هناك.
إذا كان المستخدم ضرب فقط أدخل، لا يوجد شيء للاستفادة.
لذلك أنا لا أريد أن تفعل خط 21.
حتى خط 21 وتستفيد التي إلكتروني، على ما يبدو، في ر؟
>> الحضور: م؟
DAVID J. مالان: يبدو كما انها نسخ أي واحد؟
الحضور: م.
DAVID J. مالان: اه، م.
OK، وبالتالي فإن اول م، لاحظ أن أنا
يمر لtoupper، التي إذا كنت لم أر ذلك انها
مجرد وظيفة ل الاستفادة كمدخل لها.
تي قوس الصفر يعني إعطاء لي حرف صفر ر.
وهكذا كيف هذا تغيير الصورة، لتكون واضحة؟
ما يحتاج إلى الحصول على إعادة كتابة أو تغييرها فيما يتعلق الصورة ور وأمي
صفر مائل.
>> الحضور: (غير مسموع)
>> DAVID J. مالان: نعم، لذلك هذا واحد هنا ببساطة
يحتاج إلى الحصول على تغيير to-- إصلاح this-- يحتاج إلى الحصول على تغيير لم رأس المال.
ولكن الآن، أن ننظر في وقت لاحق برنامج، إذا كنت طباعة
الصورة ور وأنا تنظيف هنا، ومشاهدة ما سيحدث طبع الصورة ور.
وهكذا جعل نسخة-0، ./copy-0.
اسمحوا لي أن المضي قدما واكتب في أمي في كل صغيرة.
لاحظ كل من الأصل و تم رسملة هذه النسخة.
لماذا؟
حسنا، ق و ر على حد سواء مشيرا إلى، اذا صح التعبير، نفس قطعة من الذاكرة.
وبصراحة، هذا هو الحصول على uninteresting-- حقا حقيقة
الذي نستخدمه عنوان صفر هنا.
أعني، لا يهمني حقا حيث الاشياء في الذاكرة.
آسف أنا محو القليل من الكثير.
ولكن لا يهمني حقا حيث الأمور في الذاكرة.
وهكذا، في الواقع ما المبرمجين تميل إلى التفكير
غير أنه عند الحديث عن عنوان، أو مؤشر،
من يهتم حيث هو في الذاكرة.
لا يهمني إذا كان في بايت واحد أو واحدة مليار دولار.
أنا فقط أهتم أن هذا المتغير على نحو فعال
مشيرا في الوقت ذاته أن جزءا من الذاكرة.
وهكذا، من الآن فصاعدا، بدلا من المماحكة أكثر من عناوين الذاكرة التعسفية، دعونا
مجرد بداية لرسم مؤشرات كما المؤشرات، والسهام.
فما S و T هي في الواقع، وفقا لهذا البرنامج،
بسبب الطريقة أنا خلقت ر، انها اثنين فقط من متغيرات مستقلة
لافتا في نفس قطعة من الذاكرة.
ونحن لا نهتم أين هم.
لذلك يمكننا مجردة بعيدا أن التفاصيل.
>> فكيف يمكنني تصحيح هذا؟
إذا كنت ترغب في إرسال نسخة من نسخة البرنامج الذي فعلا نسخ السلسلة
وتستفيد فقط نسخة، تماما بشكل حدسي،
ما يجب أن يكون ل عنصر لدينا الحل؟
الحضور: (غير مسموع)
DAVID J. مالان: نحن بحاجة إلى ماذا؟
الحضور: القطعة من الذاكرة.
DAVID J. مالان: نحن بحاجة قطعة أخرى من الذاكرة، أليس كذلك؟
نحن لا نعرف كيفية تفعل ذلك بعد، بالضرورة.
ولكن النوع الأول من حاجة لهذا أن يحدث ذلك أن أمي الأصلي في حالة انخفاض
ينتهي في أن قطعة إضافية من الذاكرة.
ثم عندما أقوم بتغيير نسخة، I لا تريد تغيير هذه النسخة هنا.
I بدلا من ذلك تريد فقط تغيير هذا نسخة بحيث الأصلي هو دون تغيير.
>> لذلك، دعونا نرى كيف يمكننا القيام بذلك.
في نسخة-1، التي لديها بالفعل تم تجريده من التعليق،
ولكن علق على الانترنت.
نحن بدلا من ذلك القيام following-- هذه خطوط متطابقة، تفهموني سلسلة
والذي يطلق عليه ق.
ولكن الآن دعونا ننظر في واحدة من أكثر لدينا مجمع ولكن الأخير من التعقيد
لحظة، خط 16 يفعل ذلك بالضبط.
حتى إذا مريح الخاص بك مع الصورة نحن drew-- فقط
أعطني قطعة جديدة من الذاكرة، نسخ كل شيء في ذلك،
دعونا نرى كيف نترجم ذلك إلى رمز.
>> حتى خط 16، وعلى الجانب الأيسر، شار ر * يعطيني هذا الإطار أكثر من هنا.
هذا هو كل ما يفعل.
على الجهة اليمنى، م الوك، أو malloc،
هو تخصيص الذاكرة، سوبر يتوهم، طريقة خفي من مجرد القول
أعطني قطعة من الذاكرة.
مقدار الذاكرة نحتاج؟
حسنا، هو نوع من التعبير كبيرة.
ولكن دعونا نرى ما تقوله هنا.
لذلك هذا، بالطبع، هو إعطاء لي طول سلسلة من الصورة.
لذلك، أمي ينبغي أن يكون ماذا؟
حتى ثلاث سنوات فقط، أليس كذلك؟ أمي هي ثلاثة أحرف.
كنت لا نحصي مائل الصفر عند
الحديث عن طول سلسلة انها في الواقع رسائل مرئية الإنسان.
حتى أمي، لذلك هذا يعطيني 3.
ولكن انتظر لحظة، وأنا الآن مضيفا 1.
لماذا أريد فعلا ل تخصيص 4 بايت وليس مجرد 3؟
نعم؟
>> الحضور: للحصول على قيمة الحارس؟
>> DAVID J. مالان: بالضبط، لذلك قيمة الحارس.
لمائل الصفر، أحتاج مجموعه 4 بايت.
لذلك أنا بحاجة طول السلسلة زائد 1.
وبعد ذلك فقط لmeasure-- جيدة على الرغم من على هذا النظام،
انها دائما ما يكون 1-- أقوله اضرب هذا عن طريق حجم شار.
تبين sizeof هو عامل في C التي
يروي فقط لك عدد البايتات التي ل
مطلوب لنوع بيانات معين.
أنها لا تعمل لالمصفوفات، عادة، وأحيانا لا.
ولكن في الحالة العامة، لا.
لكنه لن يقول لي كم بايت ل شار هو، والتي تبين دائما 1.
لذلك هذا هو مثل ضرب من قبل 1.
>> حتى السوبر خفي خط أبحث من التعليمات البرمجية.
ولكن كل ما يفعله هو يعطي لي قطعة من الذاكرة.
ولكن لا يبدو أن نسخ أي شيء إلى أن الذاكرة؟
ليس بعد.
وذلك ما أقوم على خط 22، و 23، 24، 25، حسنا، أنا ببساطة القيام بذلك.
وهذا النوع من الأشياء المدرسة القديمة الآن.
هذا هو مثل PSET 2، حيث كنت مجرد تحريك الأشياء
حول في الذاكرة، أو بالأحرى في السلاسل.
>> لذلك أنا بالتكرار من 0 إلى طول الصورة السلسلة.
وأنا نسخ حرف ط ال في الصورة في حرف ط ال تي في.
ولأنني، مبرمج، أدلى تأكد من تخصيص تماما كما العديد من بايت
وأنا في حاجة، انها مثالية واحد الى واحد العلاقة.
ويمكنني نسخ أمي في أحرف صغيرة إلى واحدة جديدة.
ثم أخيرا، أفعل هذا الخط.
وبالتالي فإن تأثير فقط للاستفادة هذه ر هنا.
لذلك الكثير لامتصاص، ولكن إذا كنت تنظر فقط
ما يحدث في الواقع تحت غطاء محرك السيارة
هو مجرد نقل هذه بايت حولها، كل ذلك
وهناك حاجة إلى حل هذه المشكلة فقط ليقدم لنا هذا جزء من الذاكرة.
الآن في خطر الساحقة، اسمحوا لي أن تظهر
المثال الآخر الذي يكاد متطابقة، فيما عدا هذا واحد
سطر من التعليمات البرمجية.
لذلك هذا هو النسخة القراصنة هذا البرنامج، اذا صح التعبير.
ولكن دعونا استخلاص فقط أنه في ما يجري.
خط 24 تستخدم ليكون هذا طن قوس ط يحصل ق قوس ط.
الآن، وأنا تغيير هذا ل نجم ر أكثر من ذلك بكثير خفي
زائد 1 يساوي نجم الصورة زائد 1.
>> ذلك ما يحدث ولماذا هل لدينا شخصية نجمة؟
لقد رأينا النجم من قبل، و يتم استخدامه بشكل مختلف هنا.
رأينا سابقا شار *، وأنا الآن اراه نجم في البداية، وهذا موافق.
لأنه اتضح نحن يمكن نوع من الاستدلال فقط
من هذه البداية مبادئ ما يجري.
حتى مجرد أن يكون واضحا، ما هي الصورة؟
في الأسبوع الماضي، وكانت السلسلة.
لا يكفي بعد الآن.
ما هو الصورة، على وجه التحديد؟
>> الحضور: (غير مسموع)
>> DAVID J. مالان: انها المؤشر.
انها عنوان الحرف الأول نحن كتبته.
حسنا، ما هو ر؟
>> الحضور: (غير مسموع)
>> DAVID J. مالان: إن عنوان البايت الأول
في ر، أن جزءا من الذاكرة إعادة تخصيصها.
هكذا اتضح أننا عندما تكرار من 0 على ما يصل إلى السلسلة
length-- في المقام الأول، ط يبدأ في 0، ل
هذه المدرسة القديمة لشيء حلقة.
حتى لمجرد البساطة، دعونا نفترض أن السطر الأول من التعليمات البرمجية
في الحقيقة هذا فقط، أليس كذلك.
اذا كنت صفرا، مضيفا الصفر إلى شيء يفترض
لا يذهب أن يكون لها تأثير.
>> فما هو هذا القول؟
اتضح أن النجم المشغل في هذا السياق
هو dereference المشغل، الذي هو مجرد
طريقة أخرى للقول ذهاب على العنوان التالي.
حتى إذا الصورة هو عنوان أول حرف في هذا قطعة من الذاكرة،
* الصورة سيلة الذهاب إلى هناك.
ولأننا قد رسمها الصورة بهذه الطريقة،
يمكنك اعتماد التالية نموذج عقلي.
إذا كانت هذه هي الصورة، وكنت أقول S *، * الصورة وكأنه نوع من المزالق وسلالم،
إذا كنت تتذكر اللعبة من مرحلة الطفولة، مثل اتباع هذا السهم وتذهب
إلى العنوان.
>> * تي هو نفس الشيء.
حتى يبدأ هنا، انتقل إلى قطعة لها.
لا أستطيع أن مجرد رسم على هذه الشاشة بهذه الطريقة.
* ر يعني أن يذهب هنا.
ومن ثم، فإن لحلقة فقط قائلا نقل هذه الشخصية هنا،
نقل هذه الشخصية هنا، نقل هذه الشخصية هنا.
ولكن كيف أفعل ذلك incrementation؟
ولست بحاجة إلى التراجع عن ما أنا حذفت فقط.
هذا هو ما يسمى عموما الحساب المؤشر، الذي
يعني الرياضيات مع العناوين.
>> إذا، في هذه لحلقة، وأظل تزايد ط،
والصورة هي عنوان وتي هو عنوان، إذا أنا فقط الحفاظ على إضافة 1،
هذا يعني فقط الحفاظ على التحرك إلى الأمام، وإلى الأمام، وإلى الأمام في الذاكرة.
انها مثل شارع أكسفورد، و الشارع أن المبنى CS على.
المباني CS هي في 33 شارع أكسفورد.
حتى لو كنت لتفعل 33 شارع أكسفورد زائد 1،
ان يجلب لك 34 أكسفورد الشارع، ثم 35 شارع أكسفورد،
ثم 36 شارع أكسفورد، مهما كانت تلك المباني هي في الواقع - إذا كانت موجودة.
وهكذا، هذا كل ما نقوم به هنا مع مؤشر الحساب.
>> حتى انها وسيلة عظمى غامضة للتعبير عن أنفسنا.
ولكن كل ذلك يحدث تحت غطاء محرك السيارة
هو مجرد اتباع هذه العناوين، مثل التالية خريطة، اذا صح التعبير،
أو بعد السهام مثل لقد رسمها على الشاشة.
OK، الكثير لهضم.
أي سؤال حول تركيب والمفاهيم، مؤشرات، malloc، أو ما شابه ذلك.
نعم، هنا أولا.
>> الحضور: فأين ذلك يقول ر * يساوي toupper * ر،
غير أن الذهاب للاستفادة جميع الرسائل أو just--
>> DAVID J. مالان: آه، سؤال جيد حقا.
حتى في هذا الخط هنا، 31، يتم هذا الانتقال للاستفادة
الحرف الأول أو كل الحروف.
لذلك دعونا الإجابة على هذا عن طريق الذهاب العودة إلى المبادئ الأولى.
والمبادئ الأولى أقصد هنا اذهبوا إلى التعريفات الأساسية
من ما تشارك.
حتى toupper هو وظيفة أن تستفيد شار.
هذا كل شيء.
* ر يعني الذهاب إلى first-- الانتقال إلى العنوان في تي.
لذلك، في الصورة، وإذا كان هذا هو قطعة من الذاكرة نحن المخصصة مع malloc،
وهذا هو ر، ر * يعني تذهب هنا.
>> وفي الوقت نفسه، كنت تمر تلك القيمة، صغيرة م
لtoupper، وكنت الحصول على العودة العاصمة M، أين أنت وضعه؟
كنت وضعه في هذا المكان نفسه.
وذلك أن منطق هؤلاء التعاريف الأساسية انها فقط
كتابة الحرف الأول إلا إذا كنت مع تكرار ط أو
لحلقة أو حلقة في حين، فإنه لن لفعل أي شيء أكثر من أن تسأل عليه.
سؤال جيد.
نعم؟
>> الحضور: لماذا استخدام dereference طريقة بدلا من
مجموعة؟
>> DAVID J. مالان: آه، سؤال جيد.
لماذا استخدام dereference طريقة بدلا من أسلوب مصفوفة؟
لا يوجد سبب معين، لنكون صادقين.
و، في الواقع، لهذا نوع من سبيل المثال، الحق،
أنا فقط بحجة جعل برنامج أكثر تعقيدا،
المزيد من عيون والزجاج أكثر، الناس التدقيق بها
لهذا يبدو السوبر غامضة، ولكن حتى على الرغم من أنه يفعل الشيء نفسه.
وهكذا، وبصراحة، وهذا هو حل دون داع معقدة بصريا
لهذه المشكلة.
>> انها لا تزال التصميم الجيد، خمسة من أصل خمسة لتصميم،
سواء كان ذلك في قوس تدوين أو التدوين المؤشر.
But-- خصوصا عندما نصل في وقت لاحق في الدورة في PSET 5
عندما كنا تنفيذ هذا القاموس الذي لقد ذكر بضعة times--
سنقوم يهمني في الواقع حول عناوين الذاكرة مستوى منخفض
أن نفهم حقا ماذا يحدث هنا.
>> ولكن، حتى الآن، اتضح أن هذا سطر من التعليمات البرمجية الأقواس هنا مربع
لا وجود لها في الواقع.
هم ما يسمى نحوي السكر، والتي
هو مجرد وسيلة باردة بغرابة للقول مترجم يحول بين قوسين معقوفين لتكون
هذا التعبير الرياضي.
لذلك فمن اتفاقية الإنسان لتكون قادرة على الكتابة فقط
هذه الأقواس جدا سهل الاستعمال.
ولكن ما المترجم، رنة، يفعل حقا أي وقت
تكتب ما سلط الضوء في خط 24، تحت غطاء انها حقا
تحويل إلى ذلك.
انها مجرد أكثر ممتعة كإنسان لقراءة وكتابة التعليمات البرمجية مثل خط 24.
ولكن في نهاية المطاف تلك عجلات التدريب يأتي أيضا قبالة
عندما يحصل على راحة المرء أقوى.
>> كل الحق، حتى يتذكر بعد ذلك أن هذا وكان هذا النوع من المشكلة الأكبر
التقينا.
وهذا ما أثار هذا كله المحادثة عنة حول المؤشرات،
وعناوين، وأشياء النسخ.
وذلك لأننا تعثرت أكثر هذا، مخرج غبي غبي، حيث
I نفذت logically-- مع لورين هنا على التجريبي وعصير البرتقال
في milk-- وتماما الدالة الصحيح حسابيا
لضخ متغيرين ' القيم، ولكن الشيء اللعين
لم يكن لديهم أي الثابتة، أو دائم، وتأثير على قانون بلدي.
>> ولماذا كان ذلك؟
باختصار، لماذا هذا تنفيذ المبادلة
صحيح منطقيا، ولكن ليس له أي تأثير على المتغيرات التي تم تمريرها إلى ذلك،
مثل x و y للرئيسية؟
ما هو جوهر القضية؟
نعم؟
الحضور: لأن متغير قدم نسخ من متغير في تمرير
من خلال وظيفة.
>> DAVID J. مالان: بالضبط، عند تمرير المتغيرات في وظيفة، أو الحجج
في وظيفة، وانهم الذي أقره نسخة، والتي
يعني تحصل متطابقة أبحث نمط البتات لكل من X و Y،
دعا هنا أ و ب.
ويمكنك أن تفعل أي شيء تريد مع تلك النسخ،
ولكن انهم ذاهبون لديها أي تأثير على وظيفة الدعوة.
و، في الواقع، تعادلنا أن صورة على الشاشة، استدعاء
آخر مرة، حيث إذا كنت حقا التفكير في ما هو
يجري تحت hood-- إذا هذا هو ذاكرة الكمبيوتر الخاص بك،
وإلى هنا هو جزء من الذاكرة المستخدمة للرئيسية،
هذا هو جزء من الذاكرة المستخدمة لمبادلة،
ويوجد لذلك حتى لو الرئيسية متغيرين، x و y،
مقايضة قد يكون النظر متطابقة القيم، وكلاهما 1 و 2،
ولكنهم تماما قطع مختلفة من الذاكرة.
>> لذلك نحن بحاجة الى حل لهذا.
وبصراحة، فإنه يبدو أننا الآن يكون هناك حل لهذه المشكلة، والحق.
اذا كان لدينا الآن القدرة على التعامل مع الأشياء عن طريق عناوين
و، نوعا من المزالق وسلالم أسلوب اتبع الأسهم
والذهاب إلى أي مكان نريد في الذاكرة، لا يمكن نحن
حل هذه المشكلة عن طريق يمر من الرئيسي لمبادلة
وليس القيم التي نريد أن مبادلة، ولكن فقط بشكل حدسي
ما يمكن أن نعبر لمبادلة بدلا من ذلك؟
>> [فاصلة VOICES]
>> DAVID J. مالان: لماذا لا يمكننا فقط تمريرها عناوين، أليس كذلك؟
لماذا لا نعطي تبادل ل خريطة الكنز، اذا صح التعبير،
أن يؤدي ذلك إلى القيم الفعلية x و y.
دعونا المبادلة تغيير الواقع هذه البتات الأصلي، بدلا من
مجرد مرور نسخ من البتات.
وهكذا، في الواقع، وهذا ما سيكون الحل.
هذا الإصدار هو هنا سيئة بشكل واضح ومعيبة.
والآن، للوهلة الأولى، يبدو تماما كما أضفنا مجموعة من النجوم عشوائيا
وعبرت اصابعنا أنه ترجمة.
ولكن، فإنه بتجميع الآن.
>> ولكن دعونا نرى ما تعنيه هذه الأشياء.
و، للأسف، والكتاب من C يمكن أن يكون اختيار رمز آخر
لجعل هذا قليلا أكثر وضوحا، ولكن المشغل نجمة
له معنى مختلف في سياقين مختلفين.
ورأيناه على حد سواء، ولكن دعونا تمييز.
>> حتى في أعلى هناك، عندما تغيرت أ و ب
من يجري في الباحث في سيئة نسخة إلى int النجوم، أ و ب،
في السابق، كانت صحيحة.
ما هي أ و ب الآن في حسن، الإصدار الأخضر؟
انهم العناوين.
عناوين ما، أن تكون واضحة؟
عناوين صحيحة.
ذلك أن أنا قائلا سائل نجمة الباحث
هذا هو عنوان صحيح، على وجه التحديد.
>> لذلك نلاحظ الآن في خطوط للقانون، شيء آخر قد تغيرت أيضا.
تمة يبقى على حاله، لأن انها مجرد صحيح مؤقتة،
لا سحر الذاكرة هناك.
ولكن يحتاج الآن نجما.
و، في الواقع، كل ذكر الآخر من أ و ب،
لاحظت أن كل ما هو تغيير من الأحمر إلى الأخضر
هو أنني التقديم هذه المتغيرات مع النجوم.
لأنني لا أريد أن نسخ أ و ب.
لأنه إذا كان مجرد نسخ أ و ب ومبادلة أ و ب، ما أنا في الواقع مقايضة؟
عناوين فقط، أريد أن مبادلة ما هو على هذه العناوين.
أريد أن أذهب إلى هناك.
وهكذا المشغل نجمة داخل عملي،
لا داخل قائمة المعلمات، يعني تذهب إلى تلك العناوين
وفعلا تغيير تلك القيم.
>> فماذا الصورة تبدو الآن وكأنها بدلا من ذلك.
حسنا، إذا كان بدلا من ذلك أنا المارة في لأ و ب 1 و لا 2--
أنا فعلا بحاجة إلى إضافة تعريف الآخر هنا.
لذلك نفترض أن هذا جزء من الذاكرة في المكان 10.
>> هذا هو في موقع 11، ولكن هذا قليلا من التبسيط،
لدي الآن خياران تفعل أمرر س و y أو لا أمرر عناوينهم؟
إذا كنت تمر عناوينهم مثل هذا، أنا فقط
الآن بحاجة إلى تنفيذ مبادلة في رمز الأخضر
ذلك أنه عندما يرى وعندما يرى ب، فإنه لا مجرد نسخ وب
ونقل الحليب وعصير البرتقال.
عصير الحليب والبرتقال استعارة يكسر الآن إلى أسفل،
لأن تلك هي أكواب خرائط السائلة وليس.
نحن بدلا من ذلك بحاجة للذهاب لمعالجة 10 ونحن
بحاجة للذهاب لمعالجة 11، و ثم نفذ هذا المنطق مبادلة.
>> وبالتالي فإن المنطق هو نفسه، ولكن نحن بحاجة إلى وسيلة مختلفة قليلا
من الوصول إلى تلك المتغيرات.
وذلك في نهاية المطاف، ما البرنامج لديه لتبدو وكأنها غير ذلك.
في swap.c نسخها حرفيا ولصق نسخة الأخضر.
ولكني في حاجة لجعل تغيير واحد.
انها ليست كافية فقط لتغيير المبادلة.
ما خط آخر من التعليمات البرمجية أحتاج إلى تغيير؟
نعم؟
>> الحضور: أين يأخذ الحجج.
>> DAVID J. مالان: أين فإنه يأخذ حجتها.
حتى لو كنت انتقل لأعلى لالرئيسي، I لا يمكن أن يمر في x و y،
و، وأعدكم، وكان آخر قطعة من جملة جديد اليوم.
ولست بحاجة لتمرير في عدم x و ذ لكن عنوان x و y.
واتضح، الرمز التي اختارت مؤلفي C
هو إذا كنت تستخدم العطف هنا، وليس ل يتم الخلط بينه وبين الضم أحادي المعامل،
إذا كنت تستخدم العطف هنا والعطف هنا،
هذه أرقام للكم، ما هو عنوان السينية،
ربما حان 10، ما هو عنوان ذ، ربما هو
11، ويمر في تلك بدلا من ذلك.
>> لذلك الكثير لامتصاص في كل مرة.
ولكن دعونا نرى الآن بسرعة في لدينا أربع دقائق المتبقية
حيث يمكن أن تسير الأمور منحرف.
وبوصفها جانبا، في الواقع أخذت هذه الصورة،
تولى TF هذه الصورة سنة أو سنتين مضت.
لذلك هذا هو الركن الخلفي إليوت قاعة الطعام.
مؤشرات هي ربما الأصعب الموضوع الذي نحن نغطي في CS50.
لذلك إذا كنت تقلق النوع من منحدر يشبه ربما حان
أكثر من عصا الهوكي مثل هذا، وتحقيق
نحن نوع من يقترب من ذروته في حيث التعقيد المفاهيمي.
>> وأود طرح هذا الصورة، لأنني أقسم
الى الله، في خريف عام 1996، عندما أخذت CS50 مع زملائي التدريس،
نيشات ميهتا، جلس لي باستمرار في ركن من أركان D. قاعة إليوت على الغداء،
أو العشاء، أو شيء من هذا في محاولة لمساعدتي في فهم المؤشرات.
وهذا هو المكان الذي كنت بعد أسابيع تم عرضه في محاضرة عندما
فهمت أخيرا المؤشرات.
وأنا متفائل بأن هذا سوف انقر عاجلا بكثير بالنسبة لك.
ولكن ندرك هذا تماما بين المواضيع الأكثر تطورا
لقد بحثت في.
ولكن من بين أقوى.
وعندما تحصل عليه، انها حقا كل فقط سوف يأتي في النهاية معا.
حتى تطمئن إلى أنه لا تحتاج إلى جميع المصارف في اليوم.
>> حتى هنا في برنامج آخر ونحن في طريقنا للنظر في.
ونحن في طريقنا لينتهي سريعة ثلاث دقائق من claymation
التي أدلى بها صديقنا، نيك Parlante.
وهنا البرنامج، على أن اثنين من كبار خطوط يعلن متغير x و y.
وكلاهما عناوين من الأعداد الصحيحة، مؤشرات AKA.
نحن ثم تخصيص ما يكفي من ذاكرة لتخزين عدد صحيح
وتخزين عنوان من تلك الذاكرة في العاشر.
لذلك، فمن أبسط من المثال السابق.
أعطني أربعة بايت من الذاكرة، هذا هو حجم وكثافة العمليات،
ووضع هذا العنوان في العاشر.
هذا الخط يعني هنا الانتقال إلى العنوان في العاشر
ووضع معنى الحياة، وعدد 42 هناك.
ولكن هذا الخط يقلقني.
نجم ذ يعني الانتقال إلى العنوان في ذ، ووضع عدد غير محظوظ 13 هناك.
لماذا هو خطير، في هذه المرحلة في story-- ولو قال بسرعة
في غضون دقائق لدينا تراجع here-- لماذا هي سيئة
بالنسبة لي أن أقول، انتقل إلى عنوان في ذ؟
>> الجمهور: ليس لديك (غير مسموع).
DAVID J. مالان: ليس لدي تضع أي شيء في ذ.
فما هي قيمة y، في هذه المرحلة من القصة؟
ليس لدينا أي فكرة.
انها بعض القيمة القمامة وكما لا بينكي أعرف.
إذا استطعنا أن ينتهي في هذه المذكرة.
>> [تشغيل الفيديو]
>> -Hey، بينكي، يستيقظون.
حان الوقت لمؤشر المرح.
>> -ما هذا؟
تعرف على مؤشرات؟
أوه، جودي.
>> -Well، لتبدأ، وأعتقد أننا سوف تحتاج إلى مؤشرات الزوجين.
>> -حسنا.
هذا الرمز يخصص اثنين من المؤشرات والتي يمكن أن نشير إلى أعداد صحيحة.
>> -OK، كذلك أرى اثنين من مؤشرات، لكنها
لا يبدو أن لافتا إلى أي شيء.
>> -هذا صحيح.
مؤشرات البداية لا تشير إلى أي شيء.
الأشياء التي نشير إليها هي دعا pointees وإقامتها
خطوة منفصلة.
>> أوه، والحق، والحق.
علمت ذلك.
وpointees منفصلة.
إذا كيف يمكنك تخصيص pointee؟
>> -OK، حسنا هذا الرمز يخصص وpointee صحيح الجديدة،
وهذه مجموعات الجزء العاشر للإشارة إلى ذلك.
>> -Hey، التي تبدو أفضل.
حتى جعله يفعل شيئا.
>> -OK، وسوف أكون dereference المؤشر العاشر ل تخزين رقم 42 في pointee لها.
لهذه الخدعة، أنا بحاجة بلدي عصا سحرية لdereferencing.
>> -Your عصا سحرية من dereferencing؟
اه، وهذا، وهذا عظيم.
>> ، هذا هو ما يبدو رمز مثل.
أنا فقط إعداد عدد and--
>> [POP SOUND]
>> -Hey، تبدو هناك تذهب.
لذلك، القيام dereference في العاشر يلي السهم للوصول إلى pointee لها.
في هذه الحالة، لتخزين 42 في هناك.
مهلا، حاول استخدامه لتخزين الرقم 13 من خلال مؤشر آخر، ذ.
>> -حسنا.
سأذهب فقط أكثر من هنا إلى ص، والحصول على عدد 13 الإعداد.
ثم أخذ عصا ل dereferencing وjust--
>> [صوت الجرس]
>> أوه، يا التي لا تعمل.
أقول، اه، بينكي، وأنا لا أعتقد dereferencing
ذ هو فكرة جيدة، لأن وضع حتى pointee خطوة منفصلة.
وأنا لا أعتقد أننا أي وقت مضى فعل ذلك.
>> -Hmm، نقطة جيدة.
>> -Yeah، ونحن تخصيص المؤشر، ص، ولكن نحن أبدا تعيينها للإشارة إلى pointee.
>> -Hmm، ملاحظ جدا.
-Hey، كنت تبحث جيدة هناك، بينكي.
يمكنك إصلاحه بحيث نقطة ص لنفس pointee كما السينية.
>> -Sure، يمكنني استخدام عصا سحرية الإحالة المؤشر.
>> -هل التي ستكون المشكلة، كما كان من قبل؟
>> لا، هذا لا تلمس pointees.
يتغير فقط مؤشر واحد للإشارة إلى نفس thing--
>> [ظهرت SOUND]
--as آخر.
>> أوه، وأرى.
الآن نقطة Y لنفس المكان السينية.
لذلك، الانتظار، والآن هو ثابت ذ.
أنه يحتوي على pointee.
لذلك يمكنك محاولة عصا من dereferencing مرة أخرى لارسال اكثر من 13.
>> أوه، حسنا، هنا يذهب.
>> -Hey، أن ننظر في ذلك.
dereferencing الآن يعمل على ذ.
ولأن مؤشرات تتقاسم أن pointee واحد، وكلاهما يرى 13.
>> -Yeah، وتقاسم، اه، أيا كان.
لذلك، نحن ذاهبون للتبديل الأماكن الآن؟
>> أوه، ننظر نحن من الوقت.
>> -لكن--
>> ، فقط تذكر القواعد رمية ثلاثية.
عدد 1، والبنية الأساسية هو أن لديك مؤشر،
ويشير أكثر إلى pointee.
لكن المؤشر و pointee منفصلة.
والخطأ الشائع هو وضع مؤشر
ولكن أن ننسى أن تعطيه pointee.
>> عدد 2، المؤشر dereferencing يبدأ في مؤشر
ويلي السهم على مدى للوصول pointee لها.
كما نعلم جميعا، وهذا يعمل فقط إذا كان هناك هو pointee، أي نوع من يحصل على العودة
للحكم رقم 1.
>> عدد 3، مؤشر احالة يأخذ مؤشر واحد
ويغير ذلك للإشارة إلى نفس pointee كما مؤشر آخر.
حتى بعد الاحالة، مؤشرات اثنين
سوف نشير إلى نفس pointee، في بعض الأحيان أن يسمى تبادل.
وهذا كل ما في الامر، حقا.
وداعا الآن.
>> [END قراءة]
>> DAVID J. مالان: هذا كل شيء لCS50.
بفضل البروفيسور نيك Parlante.
سنرى في الأسبوع القادم.
>> [عزف الموسيقى الإلكترونية]