1 00:00:00,000 --> 00:00:10,970 >> [השמעת מוסיקה] 2 00:00:10,970 --> 00:00:12,536 >> דוד י Malan: בסדר. 3 00:00:12,536 --> 00:00:13,392 >> [שחוק] 4 00:00:13,392 --> 00:00:14,240 >> ברוך שובך. 5 00:00:14,240 --> 00:00:14,990 זה CS50. 6 00:00:14,990 --> 00:00:16,890 וזה סוף השבוע חמש. 7 00:00:16,890 --> 00:00:20,020 ועד עכשיו, יש לנו פחות או יותר כבר לוקח כמובן מאליו שיש 8 00:00:20,020 --> 00:00:23,480 קיים מהדר זה, קלאנג, שיש לך כבר בדרך של פנייה זו 9 00:00:23,480 --> 00:00:27,100 כלי אחר שנקרא הפוך שאיכשהו באורח פלא ממיר את קוד המקור שלך 10 00:00:27,100 --> 00:00:31,350 לקוד יעד, את האפסים והאחדים כי המעבד שלך במחשבים, המרכזי 11 00:00:31,350 --> 00:00:33,410 יחידת עיבוד, מבינה באמת. 12 00:00:33,410 --> 00:00:36,770 אבל מתברר שיש מספר זה קורה מתחת למכסת המנוע ב 13 00:00:36,770 --> 00:00:38,690 בין הקלט ופלט. 14 00:00:38,690 --> 00:00:41,800 >> ואני רוצה להציע שאנחנו בשר את זה בפירוט קצת יותר לתוך 15 00:00:41,800 --> 00:00:45,130 ארבעת השלבים הללו, יש משהו שנקרא טרום עיבוד, משהו 16 00:00:45,130 --> 00:00:48,300 נקרא קומפילציה, אשר שראינו, משהו שנקרא הרכבה, ו 17 00:00:48,300 --> 00:00:49,420 משהו שנקרא קישור. 18 00:00:49,420 --> 00:00:53,270 אז עד עכשיו, בחלק משלנו תוכניות, שהיו לנו חד כולל. 19 00:00:53,270 --> 00:00:56,650 לאחרונה היו לנו קצת חד מגדיר לקבועים. 20 00:00:56,650 --> 00:01:00,660 אז מתברר שאת הדברים האלה, כי קידומת של הסמל או החשיש 21 00:01:00,660 --> 00:01:04,150 סמל ק"ג הוא מראש מעבד הנחיות. 22 00:01:04,150 --> 00:01:07,960 זה רק דרך מפוארת של להגיד זה שורת קוד שבעצם 23 00:01:07,960 --> 00:01:12,280 הוסב למשהו אחר לפני מחשב גם מנסה להמיר שלך 24 00:01:12,280 --> 00:01:13,800 תכנית לאפסים ואחדים. 25 00:01:13,800 --> 00:01:19,000 >> לדוגמה, כולל חד סטנדרטי קלט / פלט. שעות, פחות או יותר רק אומרת ללכת 26 00:01:19,000 --> 00:01:24,010 קדימה, לתפוס את התוכן של הקבצים stdio.h ולהדביק אותם שם. 27 00:01:24,010 --> 00:01:25,880 אז אין אפסים ואחדים בשלב זה עדיין. 28 00:01:25,880 --> 00:01:27,470 זה באמת רק חילוף. 29 00:01:27,470 --> 00:01:30,790 ושזה נעשה במהלך מה שנקרא שלב עיבוד מראש, כאשר אתה 30 00:01:30,790 --> 00:01:34,230 למעשה להפעיל קלאנג או באופן ספציפי הפוך ברוב המקרים. 31 00:01:34,230 --> 00:01:36,950 אז כל זה כבר קורה ראשון באופן אוטומטי עד כה. 32 00:01:36,950 --> 00:01:38,800 >> ואז מגיע שלב ההידור. 33 00:01:38,800 --> 00:01:40,920 אבל אנחנו כבר פשטניות הידור. 34 00:01:40,920 --> 00:01:45,060 להרכיב תכנית מתכוון באמת לקחת אותו ממשהו כמו C, 35 00:01:45,060 --> 00:01:48,430 קוד מקור אנחנו כבר כותבים, למטה למשהו שנקרא הרכבה. 36 00:01:48,430 --> 00:01:52,900 שפת הרכבה היא ברמה נמוכה יותר שפה זו, תודה לאל, אנחנו לא 37 00:01:52,900 --> 00:01:55,480 יש הרבה הזדמנות לכתוב בסמסטר הזה. 38 00:01:55,480 --> 00:01:59,100 אבל זה ברמה הנמוכה ביותר ב תחושה שאתה ממש מתחיל לכתוב 39 00:01:59,100 --> 00:02:04,270 להוסיף ולהחסיר ורבתי ולטעון מזיכרון ולשמור בזיכרון, 40 00:02:04,270 --> 00:02:08,259 הוראות בסיסיות מאוד שמחשב, מתחת למכסת המנוע, 41 00:02:08,259 --> 00:02:09,639 מבין באמת. 42 00:02:09,639 --> 00:02:14,930 >> לבסוף, ההרכבה לוקחת שפה ש לאפסים והאחדים שאנחנו כבר 43 00:02:14,930 --> 00:02:16,190 תאר עד כה. 44 00:02:16,190 --> 00:02:19,270 ובאמת לבסוף, יש את מה שנקרא קישור שלב, שבו אנו יהיו 45 00:02:19,270 --> 00:02:22,360 לראות ברגע, המשלב האפסים ואחדים עם אפסים ושלך 46 00:02:22,360 --> 00:02:24,870 אלה אנשים אחרים לפני שיצרת. 47 00:02:24,870 --> 00:02:26,660 >> אז לשקול תכנית הפשוטה הזה סופר. 48 00:02:26,660 --> 00:02:27,560 זה היה משבוע 1. 49 00:02:27,560 --> 00:02:29,610 זה רק אמר, שלום העולם, על המסך. 50 00:02:29,610 --> 00:02:30,920 רצנו את זה דרך קלאנג. 51 00:02:30,920 --> 00:02:33,200 או שאנחנו ניהל אותו דרך להרוויח אשר רץ קלאנג. 52 00:02:33,200 --> 00:02:36,170 וoutputted בזמן שבו כמה אפסים ואחדים. 53 00:02:36,170 --> 00:02:38,100 אבל מתברר שיש שלב ביניים. 54 00:02:38,100 --> 00:02:40,460 אם אני הולך לכאן - אופס, לא רוצה לראות אותו עדיין. 55 00:02:40,460 --> 00:02:44,800 אם אני הולך לכאן למכשיר שלי ואני פותח את hello.c, כאן 56 00:02:44,800 --> 00:02:46,160 היא כי אותה תכנית. 57 00:02:46,160 --> 00:02:48,600 ומה שאני הולך לעשות במסוף שלי חלון כאן אני הולך 58 00:02:48,600 --> 00:02:51,430 לרוץ קלאנג ולא הפוך, אשר אוטומציה של כל ארבעת 59 00:02:51,430 --> 00:02:52,870 צעדים אלה עבורנו. 60 00:02:52,870 --> 00:02:58,620 ואני הולך לעשות את הצלצול-S ו אז hello.c ואז להיכנס. 61 00:02:58,620 --> 00:03:00,590 >> ואני מקבל את הפקודה מהבהבת שוב, וזה טוב. 62 00:03:00,590 --> 00:03:05,280 ועכשיו בחלון מעט יותר גדול, אני הולך לפתוח את gedit בכאן. 63 00:03:05,280 --> 00:03:09,610 ואני הולך לפתוח את קובץ, מתברר, נקרא hello.s זה 64 00:03:09,610 --> 00:03:11,870 מכיל שפת הרכבה ש אני התייחסתי קודם לכן. 65 00:03:11,870 --> 00:03:15,060 וזה מה שנקרא הרכבה שפת רמה, נמוכה למדי 66 00:03:15,060 --> 00:03:18,470 הוראות שמעבד אינטל או מה שזה לא שיש בפנים 67 00:03:18,470 --> 00:03:19,350 מבין. 68 00:03:19,350 --> 00:03:24,480 וmov הוא למהלך. שיחה היא עבור קורא, תפקוד ברמה נמוך מאוד. 69 00:03:24,480 --> 00:03:26,380 משנה להוא לחסר. 70 00:03:26,380 --> 00:03:30,370 >> לכן, כאשר יש לך מעבד מסוים בתוך של המחשב שלך, מה שהופך אותו 71 00:03:30,370 --> 00:03:34,300 ברורים, לעומת מעבדים אחרים על שוק, שהוראותיו 72 00:03:34,300 --> 00:03:39,460 מבין ולעתים קרובות כמה יעיל זה הוא, כמה מהר זה הוא בביצוע חלק 73 00:03:39,460 --> 00:03:40,380 מהוראות אלה. 74 00:03:40,380 --> 00:03:45,150 ועכשיו למידע נוסף על זה, אתה יכול לקחת CS61 הסתיו הבא במכללה. 75 00:03:45,150 --> 00:03:48,170 אבל כאן יש לנו, למשל, כמה מזהים שאולי נראים מוכר. 76 00:03:48,170 --> 00:03:50,150 hello.c הוא שמה של התכנית. 77 00:03:50,150 --> 00:03:51,070 >> . טקסט - 78 00:03:51,070 --> 00:03:54,190 אין הרבה של עניין יש רק עכשיו, זוכר שהטקסט 79 00:03:54,190 --> 00:03:59,190 קטע, כמו של יום שני, שבו הוא ב זכרון התכנית שלך מסתיימת למעשה עד. 80 00:03:59,190 --> 00:04:01,330 כך זה לפחות במעורפל מכיר שם. 81 00:04:01,330 --> 00:04:03,730 כאן, כמובן, הוא לאזכור הפונקציה העיקרית שלנו. 82 00:04:03,730 --> 00:04:07,220 גלילה כלפי מטה, אלה מתייחסים לדברים אוגרים שנקראו, גושים קטנים מאוד של 83 00:04:07,220 --> 00:04:09,190 בתוך זיכרון של המעבד שלך בפועל. 84 00:04:09,190 --> 00:04:12,930 ואם אני לגלול למטה אפילו עוד יותר, אני רואה איזה 85 00:04:12,930 --> 00:04:14,240 אזכור עקיף של ASCII. 86 00:04:14,240 --> 00:04:17,120 ושם, אכן, היא מחרוזת ש, הלו, פסיק, עולם. 87 00:04:17,120 --> 00:04:20,079 >> אז סיפור ארוך קצר, זה כבר קורה לך, באופן אוטומטי, 88 00:04:20,079 --> 00:04:22,140 מתחת למכסת המנוע כל הזמן הזה. 89 00:04:22,140 --> 00:04:26,450 ומה שקורה באמת פעם אחת אתה כבר לרוץ קלאנג, או בדרך של 90 00:04:26,450 --> 00:04:29,150 הפוך, אתה מקבל ראשון, מקוד המקור, 91 00:04:29,150 --> 00:04:30,700 מה שנקרא בשפה הרכבה. 92 00:04:30,700 --> 00:04:35,210 אז קלאנג הוא המרת אסיפה זו שפה למטה לאפסים ואחדים. 93 00:04:35,210 --> 00:04:38,340 וזה השקופית שהתחלנו הדיון שלנו בשבוע 0 על - 94 00:04:38,340 --> 00:04:39,840 ולאחר מכן שבוע 1 ב. 95 00:04:39,840 --> 00:04:44,030 ולבסוף, אותם האפסים ואחדים בשילוב עם אפסים והאחדים 96 00:04:44,030 --> 00:04:47,190 מהספריות האלה אנחנו כבר לוקחים כמובן מאליו כמו קלט / פלט סטנדרטי או 97 00:04:47,190 --> 00:04:50,010 ספריית מחרוזת או אפילו CS50 הספרייה. 98 00:04:50,010 --> 00:04:54,200 >> אז כדי לצייר את התמונה הזאת יותר מבחינה ויזואלית, יש לנו hello.c. 99 00:04:54,200 --> 00:04:57,220 וזה, כמובן, משתמש בprintf לתפקד לומר, שלום עולם. 100 00:04:57,220 --> 00:05:01,810 צעד האוסף לוקח אותו עד קובץ שאנחנו רק ראינו hello.s, אפילו 101 00:05:01,810 --> 00:05:04,290 למרות שבדרך כלל הוא נמחק באופן אוטומטי עבורך. 102 00:05:04,290 --> 00:05:06,050 אבל זה קוד ההרכבה בשלב ביניים. 103 00:05:06,050 --> 00:05:09,750 ולאחר מכן כאשר אנו להרכיב את המכלול שפה, כמו שאומרים, זה כשאתה 104 00:05:09,750 --> 00:05:10,830 לקבל את אותם אפסים ואחדים. 105 00:05:10,830 --> 00:05:13,920 אז יש לנו הגדלה ביעילות היום על מה שאנחנו כבר לוקחים כמובן מאליו, 106 00:05:13,920 --> 00:05:16,430 הפירוש הולך קוד מקור להתנגד קוד. 107 00:05:16,430 --> 00:05:18,850 >> אבל לבסוף, החברה שאותה תמונה - בואו לדחוף אליו 108 00:05:18,850 --> 00:05:20,020 בצד השמאל. 109 00:05:20,020 --> 00:05:22,880 ושים לב כי בחלקו העליון יש הזכרתי stdio.h. 110 00:05:22,880 --> 00:05:25,030 זה קובץ שצרפנו כמעט בכל 111 00:05:25,030 --> 00:05:26,250 תוכניות שכתבנו. 112 00:05:26,250 --> 00:05:28,830 וזה קובץ שאת התוכנה לקבל עותק מודבק, 113 00:05:28,830 --> 00:05:30,350 ביעילות על גבי הקוד שלך. 114 00:05:30,350 --> 00:05:34,170 אבל מתברר כי, במחשב מערכת איפשהו, יש להניח 115 00:05:34,170 --> 00:05:39,150 קובץ stdio.c שמישהו כתב שנים לפני שמיישם את כל 116 00:05:39,150 --> 00:05:41,870 פונקציות שהוכרזו ב stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> עכשיו במציאות זה כנראה לא על Mac שלך או במחשב האישי שלך או אפילו ב 118 00:05:45,465 --> 00:05:47,660 CS50 מכשיר הוא קוד C גלם. 119 00:05:47,660 --> 00:05:52,710 מישהו כבר ערך אותו וכלל . קובץ לקוד אובייקט או o. 120 00:05:52,710 --> 00:05:56,020 קובץ, המתייחס לספרייה משותפת זה כבר מותקן מראש ו 121 00:05:56,020 --> 00:05:57,240 מראש נערך עבורך. 122 00:05:57,240 --> 00:06:01,950 אבל נניח שאכן קיים על stdio.c המחשב שלנו במקביל 123 00:06:01,950 --> 00:06:02,650 עם קלאנג. 124 00:06:02,650 --> 00:06:04,960 זה שחבר את הקוד שלך ומורכב. 125 00:06:04,960 --> 00:06:09,200 קוד של stdio.c הוא להיות לוקטו ו התאסף, כדי שזה האחרון 126 00:06:09,200 --> 00:06:13,730 צעד, כאן למטה, יש לנו איכשהו קישור, אם אפשר לומר כך, האפסים והאחדים 127 00:06:13,730 --> 00:06:18,430 עימו או שלה אפסים ואחדים לאחד תכנית פשוטה שסופו של דבר היא 128 00:06:18,430 --> 00:06:20,540 קרא רק שלום. 129 00:06:20,540 --> 00:06:23,340 >> אז זה כל הקסם של זה קרה עד כה. 130 00:06:23,340 --> 00:06:26,430 וימשיך לקחת את אלה תהליכים למובן מאליו, אבל מבינים 131 00:06:26,430 --> 00:06:28,750 יש הרבה פרטים עסיסיים קורה מתחת לשם. 132 00:06:28,750 --> 00:06:31,920 וזה מה שעושה אותך מחשב עם Intel Inside 133 00:06:31,920 --> 00:06:33,940 בעיקר ברור. 134 00:06:33,940 --> 00:06:37,020 >> אז בנימה זאת, אם ברצונך הצטרף אלינו לארוחת צהריים ביום שישי הקרובה, לעשות ללכת 135 00:06:37,020 --> 00:06:41,570 לcs50.net/rsvp המקום הרגיל, 13:15 יום שישי הקרוב. 136 00:06:41,570 --> 00:06:43,400 ועכשיו כמה הודעות. 137 00:06:43,400 --> 00:06:44,670 אז יש לנו חדשות טובות. 138 00:06:44,670 --> 00:06:45,970 ויש לנו חדשות רעות. 139 00:06:45,970 --> 00:06:47,260 תתחיל עם קצת חדשות טובות כאן. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [נאנק] 142 00:06:54,510 --> 00:06:54,710 >> בסדר. 143 00:06:54,710 --> 00:06:56,670 ובכן, מבחינה טכנית זה חג, ולכן זה לא כל כך הרבה במתנה מאתנו. 144 00:06:56,670 --> 00:06:58,030 אבל אז חדשות הרעות כמובן. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [נאנק] 147 00:07:01,880 --> 00:07:03,530 >> אני ביליתי הרבה זמן באנימציות אלה. 148 00:07:03,530 --> 00:07:04,690 >> [שחוק] 149 00:07:04,690 --> 00:07:07,000 >> תהיה פגישת ביקורת ביום שני הקרוב. 150 00:07:07,000 --> 00:07:08,340 זה הולך להיות בשעה 5:30. 151 00:07:08,340 --> 00:07:11,210 אנו להזכיר לך את כל הפרטים האלה באמצעות דואר אלקטרוני על המהלך של 152 00:07:11,210 --> 00:07:13,470 אתר רק כמה ימים של זמן. 153 00:07:13,470 --> 00:07:16,610 היא תצולם ונעשתה זמינה זמן קצר לאחר מכן. 154 00:07:16,610 --> 00:07:19,200 אז אם אתה לא יכול לעשות כי ביום שני לילה חריץ, אל תדאג. 155 00:07:19,200 --> 00:07:22,270 סעיפים בשבוע הקרוב יהיו גם להתמקד בביקורת לחידון. 156 00:07:22,270 --> 00:07:25,670 אם הסעיף שלך הוא ביום שני, שהוא אכן אוניברסיטת חג, אנו 157 00:07:25,670 --> 00:07:26,920 עדיין לפגוש בסעיף. 158 00:07:26,920 --> 00:07:28,890 אם אתה פשוט לא יכול לעשות את זה סעיף בגלל שאתה הולך 159 00:07:28,890 --> 00:07:29,860 משם, זה בסדר. 160 00:07:29,860 --> 00:07:33,710 להשתתף ביום ראשון או סעיף או שלישי מנגינה-בסעיף של ג'ייסון, שהוא 161 00:07:33,710 --> 00:07:35,110 זמין באינטרנט. 162 00:07:35,110 --> 00:07:37,490 >> אז, עוד חדשות רעות. 163 00:07:37,490 --> 00:07:41,960 אז לפי תכנית הלימודים, יש לנו הרצאה ביום שישי הבא. 164 00:07:41,960 --> 00:07:43,690 אבל חדשות טובות - 165 00:07:43,690 --> 00:07:44,860 באופן ברור, שביליתי יותר מדי זמן על זה. 166 00:07:44,860 --> 00:07:45,280 >> [שחוק] 167 00:07:45,280 --> 00:07:47,140 >> אנו נבטל הבאים ההרצאות של יום שישי. 168 00:07:47,140 --> 00:07:50,590 אז זה יהיה מתנה עבורנו, כך שאתה באמת יכול להיות הפוגה נחמדה ב 169 00:07:50,590 --> 00:07:52,990 בין השבוע לשבועיים, ומכאן. 170 00:07:52,990 --> 00:07:57,460 אז לא בשבוע הבא הרצאות, רק זעיר חידון קטן, שעבורו אתה צריך להיות 171 00:07:57,460 --> 00:07:59,030 התרגש יותר ויותר. 172 00:07:59,030 --> 00:08:03,870 >> אז בואו עכשיו להפנות את תשומת הלב ל משהו שהוא אכן ויזואלית יותר 173 00:08:03,870 --> 00:08:06,990 ויותר מרגש וכדי להגדיר את הבמה על מה הולך להיות באופק 174 00:08:06,990 --> 00:08:08,420 תוך כמה שבועות של זמן. 175 00:08:08,420 --> 00:08:12,160 לאחר החידון הראשון, נפנינו להתמקד בסטי הבעיה שלנו למקום אחר 176 00:08:12,160 --> 00:08:16,710 בעיה ספציפית תחום, זה של זיהוי פלילי או בטחוניים באופן כללי. 177 00:08:16,710 --> 00:08:19,550 >> למעשה, מסורת עם בעיה זו קבוצה היא בשבילי אחד 178 00:08:19,550 --> 00:08:24,850 עמית הוראה או רשויות אישורים לחצות קמפוס לקחת כמה תמונות של 179 00:08:24,850 --> 00:08:29,450 אנשים ברורים הניתנים לזיהוי, אך לא, מקומות או דברים, אז בכל שנה אני 180 00:08:29,450 --> 00:08:34,520 איכשהו הצליח למחוק בטעות או ניזק לכרטיס המדיה הדיגיטלי 181 00:08:34,520 --> 00:08:35,720 זה חלק פנימי של המצלמה שלנו. 182 00:08:35,720 --> 00:08:36,860 אבל לא עניין גדול. 183 00:08:36,860 --> 00:08:39,200 אני יכול להמשיך ולחבר כי למחשב שלי. 184 00:08:39,200 --> 00:08:43,010 אני יכול להפוך את תמונת זיהוי פלילי שלו, ולכן לדבר, על ידי העתקה ואת האפסים 185 00:08:43,010 --> 00:08:46,830 אלה הנחה של כרטיס זיכרון זה, בין אם שלו כרטיס SD או כרטיס קומפקט פלאש או 186 00:08:46,830 --> 00:08:48,100 כל מה שאתה מכיר. 187 00:08:48,100 --> 00:08:49,300 ואז אנו יכולים לחלק את זה. 188 00:08:49,300 --> 00:08:53,190 >> ואז האתגר קדימה, בין השאר דברים בשבילך, יהיו לכתוב 189 00:08:53,190 --> 00:08:58,630 קוד C שמשחזר חבורה שלמה של JPEGs עבורי וגילו יהיה 190 00:08:58,630 --> 00:09:00,190 אותם אנשים, מקומות, או דברים. 191 00:09:00,190 --> 00:09:03,340 ואנחנו גם נדבר, בבעיה זו להגדיר ובימים הקרובים, על 192 00:09:03,340 --> 00:09:04,440 גרפיקה יותר בדרך כלל. 193 00:09:04,440 --> 00:09:06,140 אנחנו כבר השתמשנו בהם, כמובן, ללפרוץ החוצה. 194 00:09:06,140 --> 00:09:09,080 אבל שיש לך סוג של מובן מאליו קיימים מושגים אלה ברמה גבוהה 195 00:09:09,080 --> 00:09:10,680 של מלבנים ואליפסות. 196 00:09:10,680 --> 00:09:12,450 אבל מתחת למכסת המנוע יש פיקסלים. 197 00:09:12,450 --> 00:09:14,370 ויש לך כבר להתחיל חשבתי על אלה. 198 00:09:14,370 --> 00:09:18,800 או שאתה יהיה לP-4 סט צריך לחשוב על הפער בין הלבנים שלך, איך 199 00:09:18,800 --> 00:09:21,990 במהירות שאתה נע על פני כדור המסך ללפרוץ החוצה. 200 00:09:21,990 --> 00:09:24,830 אז יש את הרעיון הזה של נקודות שעל המסך זה 201 00:09:24,830 --> 00:09:26,290 נכנסים לשחק כבר. 202 00:09:26,290 --> 00:09:29,430 >> עכשיו מה שאתה רואה, אם כי, הוא מה אתה מקבל על מסך מחשב. 203 00:09:29,430 --> 00:09:33,680 אם אי פעם צפו בכמה טוב או טלוויזיה רעה, רוב הסיכויים הם שהם פחות או יותר 204 00:09:33,680 --> 00:09:36,280 טיפול בקהל כמו technophobes שלא ממש 205 00:09:36,280 --> 00:09:37,630 יודע הרבה על מחשוב. 206 00:09:37,630 --> 00:09:40,840 ואז זה קל מאוד למשטרה בלש לומר, שאתה יכול 207 00:09:40,840 --> 00:09:41,710 לנקות את זה בשבילי? 208 00:09:41,710 --> 00:09:42,710 או לשפר, נכון? 209 00:09:42,710 --> 00:09:45,550 שפר הוא כמו מילה באז ב ביותר בכל תכנית בנושא פשע. 210 00:09:45,550 --> 00:09:49,240 והמציאות היא שאם אתה לוקח מאוד תמונה מטושטשת של חשוד עושה 211 00:09:49,240 --> 00:09:51,620 משהו רע, אתה לא יכול רק לשפר אותו. 212 00:09:51,620 --> 00:09:53,080 אתה לא יכול להתקרב לאין שיעור. 213 00:09:53,080 --> 00:09:56,350 אתה לא יכול לראות בנצנוץ של מישהו עין שהתחייבה כי 214 00:09:56,350 --> 00:09:59,860 פשע מסוים, למרות שכיחות של זה בטלוויזיה. 215 00:09:59,860 --> 00:10:04,110 >> וכך, עם שבואו להניע כי בעיה להגדיר הקרובה עם הצצה 216 00:10:04,110 --> 00:10:05,765 כמה הופעות שבה אתה יכול להיות מוכר. 217 00:10:05,765 --> 00:10:06,500 >> [השמעת וידאו] 218 00:10:06,500 --> 00:10:07,835 >> -אישור. 219 00:10:07,835 --> 00:10:09,956 עכשיו, בואו לקבל מבט טוב עליך. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -תחזיק את זה. 222 00:10:17,766 --> 00:10:18,658 הפעל את זה בחזרה. 223 00:10:18,658 --> 00:10:19,550 >> -חכה רגע. 224 00:10:19,550 --> 00:10:21,580 ללכת ימינה. 225 00:10:21,580 --> 00:10:21,800 >> לשם. 226 00:10:21,800 --> 00:10:22,690 להקפיא את זה. 227 00:10:22,690 --> 00:10:23,692 >> מסך מלא. 228 00:10:23,692 --> 00:10:23,846 >> -אישור. 229 00:10:23,846 --> 00:10:24,154 להקפיא את זה. 230 00:10:24,154 --> 00:10:25,140 >> תהיה להדק על זה, יה? 231 00:10:25,140 --> 00:10:27,090 >> וקטור על הבחור ש על ידי הגלגל אחורה. 232 00:10:27,090 --> 00:10:29,730 >> -קרב ממש כאן במקום הזה. 233 00:10:29,730 --> 00:10:33,700 >> -עם הציוד הנכון, הדמיה יכול להיות מוגדל ומחודד. 234 00:10:33,700 --> 00:10:34,490 >> , מה זה? 235 00:10:34,490 --> 00:10:35,870 >> -It של תכנית שיפור. 236 00:10:35,870 --> 00:10:36,793 >> האם אתה יכול לנקות-עד שכל? 237 00:10:36,793 --> 00:10:38,560 >> , אני לא יודע. 238 00:10:38,560 --> 00:10:39,090 בואו לשפר אותו. 239 00:10:39,090 --> 00:10:41,690 >> סעיף-6-שפר. 240 00:10:41,690 --> 00:10:43,510 >> אני-משופר והפירוט - 241 00:10:43,510 --> 00:10:44,456 >> -אני חושב שיש מספיק כדי לשפר. 242 00:10:44,456 --> 00:10:45,402 לשחרר אותו למסך שלי. 243 00:10:45,402 --> 00:10:47,300 >> , שפר את ההשתקפות בעיניה. 244 00:10:47,300 --> 00:10:49,330 >> -בואו נריץ את זה דרך שיפור וידאו. 245 00:10:49,330 --> 00:10:50,340 >> -אדגר, אתה יכול לשפר את זה? 246 00:10:50,340 --> 00:10:52,320 >> -תחזיק מעמד. 247 00:10:52,320 --> 00:10:54,290 >> -הייתי כבר עובד על השתקפות זו. 248 00:10:54,290 --> 00:10:55,560 >> ההשתקפות של-מישהו. 249 00:10:55,560 --> 00:10:56,440 >> השתקפות. 250 00:10:56,440 --> 00:10:57,940 >> -יש השתקפות פניו של האיש. 251 00:10:57,940 --> 00:10:58,860 >> -ההשתקפות. 252 00:10:58,860 --> 00:10:59,710 >> -יש השתקפות. 253 00:10:59,710 --> 00:11:00,900 >> זום על המראה. 254 00:11:00,900 --> 00:11:03,500 >> , אתה יכול לראות את השתקפות. 255 00:11:03,500 --> 00:11:04,700 >> -האם אתה יכול לשפר את התמונה מכאן? 256 00:11:04,700 --> 00:11:05,700 >> האם אתה יכול לשפר-ממש כאן? 257 00:11:05,700 --> 00:11:06,500 >> האם אתה יכול לשפר-? 258 00:11:06,500 --> 00:11:07,380 >> האם אתה יכול לשפר-? 259 00:11:07,380 --> 00:11:08,190 >> האם אנחנו יכולים לשפר-הזה? 260 00:11:08,190 --> 00:11:08,940 >> האם אתה יכול לשפר-? 261 00:11:08,940 --> 00:11:10,280 >> -חכה שני, אני תשפר. 262 00:11:10,280 --> 00:11:11,570 >> זום על הדלת. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> זום. 265 00:11:13,052 --> 00:11:13,197 >> [שחוק] 266 00:11:13,197 --> 00:11:14,360 >> -לנוע פנימה 267 00:11:14,360 --> 00:11:15,100 >> -המתן, תפסיק. 268 00:11:15,100 --> 00:11:15,740 >> הפסקה. 269 00:11:15,740 --> 00:11:16,290 >> -השהה אותה. 270 00:11:16,290 --> 00:11:19,390 >> -לסובב סביב 75 מעלות בבקשה אנכי. 271 00:11:19,390 --> 00:11:19,886 >> [שחוק] 272 00:11:19,886 --> 00:11:24,350 >> הפסקה, וחזרתי לחלק על הדלת שוב. 273 00:11:24,350 --> 00:11:26,330 >> Got-משפר תמונה מפת סיביות שיכול? 274 00:11:26,330 --> 00:11:28,990 >> -אולי נוכל להשתמש בסן Pradeep שיטה כדי לראות לחלונות. 275 00:11:28,990 --> 00:11:30,680 >> -זה תוכנה היא המדינה של האמנות. 276 00:11:30,680 --> 00:11:31,676 >> -ערך הסמל כבוי. 277 00:11:31,676 --> 00:11:34,166 >> -עם שילוב הנכון של אלגוריתמים. 278 00:11:34,166 --> 00:11:38,399 >> הוא נלקח-אלגוריתמים לתאורה השלב הבא, ואני יכול להשתמש בם כדי 279 00:11:38,399 --> 00:11:38,648 לשפר את התצלום הזה. 280 00:11:38,648 --> 00:11:42,050 >> נעילה על ולהגדיל את Z-הציר. 281 00:11:42,050 --> 00:11:42,760 >> , שפר. 282 00:11:42,760 --> 00:11:43,060 >> , שפר. 283 00:11:43,060 --> 00:11:43,760 >> , שפר. 284 00:11:43,760 --> 00:11:45,010 >> בהקפאה ולשפר. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [השמעת וידאו הסוף] 287 00:11:47,910 --> 00:11:51,470 >> דוד י Malan: סט בעיה אז 5 הוא מה שלפנינו שם. 288 00:11:51,470 --> 00:11:55,260 אז בקרוב תוכל לקבל הבנה טובה יותר מתי ומדוע אתה יכול 289 00:11:55,260 --> 00:11:57,300 ושלנו לא יכול לשפר בדרך זו. 290 00:11:57,300 --> 00:12:00,090 אבל קודם כל, בואו נחזיר את תשומת לבנו לחלק מאבני הבניין אנחנו 291 00:12:00,090 --> 00:12:02,250 צריך להיות מסוגל לספר את הסיפור הזה. 292 00:12:02,250 --> 00:12:05,580 >> אז זוכר שציירנו את התמונה הזאת על יום שני וקצת בשבוע שעבר. 293 00:12:05,580 --> 00:12:09,970 וזה מתאר את הפריסה של דברים בזכרון המחשב שלך כאשר 294 00:12:09,970 --> 00:12:11,000 הפעלת תכנית כלשהי. 295 00:12:11,000 --> 00:12:14,310 קטע טק למעלה, כזכור, מתייחס לאפסים והאחדים בפועל 296 00:12:14,310 --> 00:12:16,000 המרכיב את התכנית שלך. 297 00:12:16,000 --> 00:12:19,340 יש, מתחת לזה, חלק או אותחל נתונים מאותחלים, אשר בדרך כלל 298 00:12:19,340 --> 00:12:22,910 מתייחס לדברים כמו קבועים או מחרוזות או משתנה הגלובלית שיש לי 299 00:12:22,910 --> 00:12:24,200 הוכרז מראש. 300 00:12:24,200 --> 00:12:26,500 יש ערימה, אבל אנחנו נבוא אחזור לזה עוד מעט. 301 00:12:26,500 --> 00:12:27,410 >> ואז יש את המחסנית. 302 00:12:27,410 --> 00:12:30,660 הרבה כמו ערימה של מגשים ב קפיטריה, זה מקום שבו מקבל את הזיכרון 303 00:12:30,660 --> 00:12:33,610 שכבות שכבות וכל פעם אתה עושה את מה בתכנית? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 מהו השימוש לערימה? 306 00:12:37,730 --> 00:12:39,320 >> כן? 307 00:12:39,320 --> 00:12:40,000 >> Call of לתפקד. 308 00:12:40,000 --> 00:12:42,890 בכל פעם שאתה קורא לפונקציה, זה נתנו לרסיס של זיכרון עבורו 309 00:12:42,890 --> 00:12:45,020 משתנים מקומיים או הפרמטרים שלו. 310 00:12:45,020 --> 00:12:48,810 וציורי, אנו רואים שעם כל פונקציה הנקראת ברציפות, כאשר 311 00:12:48,810 --> 00:12:52,520 שיחות שיחות B C D שיחות, הם מקבל שכבות על גבי ערימה. 312 00:12:52,520 --> 00:12:55,630 ובתוך כל אחד מאותם פרוסות זיכרון הוא למעשה היקף ייחודי 313 00:12:55,630 --> 00:12:58,590 לתפקוד זה, אשר, כמובן, הוא בעייתי, אם ברצונך למסור 314 00:12:58,590 --> 00:13:01,850 מתפקיד אחד למשנהו חתיכה מנתונים שברצונו 315 00:13:01,850 --> 00:13:03,500 להשתנות או לשנות. 316 00:13:03,500 --> 00:13:08,060 >> אז מה היה הפתרון שלנו מאפשרים ל פונקציה מיוצגת על ידי ערימה אחת 317 00:13:08,060 --> 00:13:11,390 מסגרת כדי לשנות את הזיכרון פנימי ערימה של מסגרת אחרת? 318 00:13:11,390 --> 00:13:14,590 איך לעשות את שני אלה דיבורים לעוד אחד? 319 00:13:14,590 --> 00:13:18,510 אז בדרך של מצביעים או כתובות, אשר, שוב, רק לתאר בו ב 320 00:13:18,510 --> 00:13:22,280 זיכרון, על ידי דרך של ספציפי מספר ביס, בפרט 321 00:13:22,280 --> 00:13:23,830 ניתן למצוא ערך. 322 00:13:23,830 --> 00:13:26,860 אז זוכר פעם האחרונה גם המשכנו הסיפור והביט בי 323 00:13:26,860 --> 00:13:28,280 די תכנית מרכבה. 324 00:13:28,280 --> 00:13:32,900 ותכנית זו היא מרכבה למעטים סיבות, אבל המדאיג ביותר הוא 325 00:13:32,900 --> 00:13:34,620 משום שהוא לא מצליח לבדוק מה? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> כן, היא לא מצליחה לבדוק את הקלט. 328 00:13:40,450 --> 00:13:41,870 סליחה? 329 00:13:41,870 --> 00:13:43,880 >> אם זה יותר מ -12 תווים. 330 00:13:43,880 --> 00:13:47,260 אז מאוד בזריזות, כאשר קוראים memcopy, אשר, כפי שהשם מרמז, פשוט 331 00:13:47,260 --> 00:13:50,630 זכרון עותקים מהטיעון השני שלה לטענה הראשונה שלה. 332 00:13:50,630 --> 00:13:54,730 הטענה השלישית, מאוד בזריזות, היא בדק כדי לוודא שאתה לא יודע 333 00:13:54,730 --> 00:13:59,400 יותר מעותק, במקרה זה, האורך של בר, מספר התווים, 334 00:13:59,400 --> 00:14:03,810 ליעד, שהוא זה המערך C. אבל הבעיה היא שמה 335 00:14:03,810 --> 00:14:07,230 אם C עצמו הוא לא גדול מספיק כדי להתמודד עם זה? 336 00:14:07,230 --> 00:14:09,900 אתה הולך להעתיק את מספר בתים שאתה כבר נתון. 337 00:14:09,900 --> 00:14:13,040 אבל מה בעצם יש לך יותר בתים מאשר שיש לך מקום ל? 338 00:14:13,040 --> 00:14:16,770 >> ובכן, תכנית זו טיפשות מאוד פשוט עיוורון ממשיך לקחת את כל מה שזה 339 00:14:16,770 --> 00:14:20,650 נתנו, הלו הוא קו נטוי 0 מחרוזת נהדרת אם הוא קצר 340 00:14:20,650 --> 00:14:22,040 מספיק, כמו חמישה תווים. 341 00:14:22,040 --> 00:14:26,470 אבל אם זה בעצם 12 תווים או 1,200 תווים, שראינו בפעם האחרונה 342 00:14:26,470 --> 00:14:29,380 שאתה רק הולך לחלוטין לדרוס זיכרון ש 343 00:14:29,380 --> 00:14:30,470 לא שייך לך. 344 00:14:30,470 --> 00:14:34,390 והמקרה הגרוע ביותר, אם כי לדרוס חלק אדום יש שקראנו לי 345 00:14:34,390 --> 00:14:35,380 לחזור כתובת - 346 00:14:35,380 --> 00:14:38,370 זה רק בו המחשב באופן אוטומטי, עבורך, מאחורי 347 00:14:38,370 --> 00:14:43,130 סצנות, שאיבת שומן משם ערך של 32 סיביות ש מזכיר אותו למה שהוא צריך את הכתובת 348 00:14:43,130 --> 00:14:47,080 תחזור כאשר foo, תפקיד אחר זה, נעשה ביצוע. 349 00:14:47,080 --> 00:14:49,320 זה פירור לחם מכל סוגים שאליו הוא חוזר. 350 00:14:49,320 --> 00:14:52,490 אם תחליף את זה, באופן פוטנציאלי, אם אתה האיש הרע, יכול יכול 351 00:14:52,490 --> 00:14:54,750 פוטנציאל להשתלט על המחשב של מישהו. 352 00:14:54,750 --> 00:14:58,020 ואתה בהחלט תתרסק זה ברוב המקרים. 353 00:14:58,020 --> 00:15:01,690 >> עכשיו הבעיה הזאת רק החמירה כשהתחלנו לדבר על זיכרון 354 00:15:01,690 --> 00:15:03,010 ניהול באופן כללי יותר. 355 00:15:03,010 --> 00:15:07,150 וmalloc, להקצאת זיכרון, הוא פונקציה שאנחנו יכולים להשתמש בו כדי להקצות 356 00:15:07,150 --> 00:15:11,260 זיכרון כאשר אנו לא יודעים מראש שאולי צריכים קצת. 357 00:15:11,260 --> 00:15:13,960 כך, למשל, אם אני חוזר למכשיר כאן. 358 00:15:13,960 --> 00:15:21,010 ואני פותח את מhello2.c הפעם האחרונה, זוכר את התכנית כאן, שנראה 359 00:15:21,010 --> 00:15:23,500 משהו קטן כזה, רק שלושה קווים - 360 00:15:23,500 --> 00:15:27,940 תציין את השם שלך, ולאחר מכן שם המחרוזת בצד השמאל, שווה getstring. 361 00:15:27,940 --> 00:15:29,690 ואז להדפיס אותו, שמו של המשתמש. 362 00:15:29,690 --> 00:15:31,170 >> אז זו הייתה תכנית סופר פשוטה. 363 00:15:31,170 --> 00:15:34,870 כדי להיות ברור, תן לי ללכת קדימה ולעשות שלום-2. 364 00:15:34,870 --> 00:15:36,680 אני הולך לעשות את נקודת לוכסן שלום-2. 365 00:15:36,680 --> 00:15:37,750 תציין את השם שלך - 366 00:15:37,750 --> 00:15:38,140 דוד. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 שלום דוד. 369 00:15:39,540 --> 00:15:41,060 נראה שזה עובד בסדר. 370 00:15:41,060 --> 00:15:43,140 אבל מה שבאמת קורה מתחת מכסה המנוע כאן? 371 00:15:43,140 --> 00:15:44,670 ראשית בואו לקלף כמה שכבות. 372 00:15:44,670 --> 00:15:48,380 מחרוזת היא רק מילה נרדפת שיש לנו הבין בשביל מה? 373 00:15:48,380 --> 00:15:49,110 כוכב צ'אר. 374 00:15:49,110 --> 00:15:52,740 אז בואו לעשות את זה קצת יותר מסתורי אבל יותר נכון מבחינה טכנית שזה 375 00:15:52,740 --> 00:15:55,570 הוא כוכב char, כלומר שם, כן, הוא משתנה. 376 00:15:55,570 --> 00:15:59,920 אבל מה שחנויות שם היא הכתובת של char, שמרגיש קצת מוזר 377 00:15:59,920 --> 00:16:01,050 בגלל שאני מקבל בחזרה מחרוזת. 378 00:16:01,050 --> 00:16:03,580 אני מקבל בחזרה מרובה תווים לא להשחיר. 379 00:16:03,580 --> 00:16:07,400 >> אבל כמובן, אתה צריך רק את הראשון הכתובת של char לזכור היכן 380 00:16:07,400 --> 00:16:08,870 כל המחרוזת היא כי למה? 381 00:16:08,870 --> 00:16:12,700 איך אתה להבין איפה סוף המחרוזת היא לדעת ההתחלה? 382 00:16:12,700 --> 00:16:13,630 אפס הקו הנטוי. 383 00:16:13,630 --> 00:16:17,260 אז עם שני הרמזים האלה לך להבין לפני התחילה ובסופו של 384 00:16:17,260 --> 00:16:20,280 כל מחרוזת הן, כל עוד הם נוצר כראוי עם אפס ש 385 00:16:20,280 --> 00:16:22,110 שליחות קטלנית, אפס קו נטוי ש. 386 00:16:22,110 --> 00:16:24,520 >> אבל זה קורא getstring. 387 00:16:24,520 --> 00:16:28,020 ומתברר שgetstring כל הזמן הזה היה סוג של 388 00:16:28,020 --> 00:16:28,820 מרמה אותנו. 389 00:16:28,820 --> 00:16:32,460 זה כבר עושה את העבודה הזאת, כדי להיות בטוח, מקבל מחרוזת מהמשתמש. 390 00:16:32,460 --> 00:16:34,580 אבל איפה שהזיכרון כבר מגיע? 391 00:16:34,580 --> 00:16:38,440 אם נחזור לתמונה כאן ו להחיל את ההגדרה מרק 392 00:16:38,440 --> 00:16:42,610 לפני רגע, שהערימה היא מקום שבי זיכרון הולך כאשר פונקציות נקראות, 393 00:16:42,610 --> 00:16:45,370 לפי ההיגיון הזה, כאשר אתה קורא getstring, ואז אני מקליד ב 394 00:16:45,370 --> 00:16:50,900 D--V-I-D הזן, שבו הוא D-A-V-I-D מאוחסן קו נטוי אפס, המבוסס על 395 00:16:50,900 --> 00:16:53,480 סיפור שספרנו לנו עד עכשיו? 396 00:16:53,480 --> 00:16:55,190 >> זה היה נראה ב הערימה, נכון? 397 00:16:55,190 --> 00:16:58,120 כשאתה מתקשר לקבל מחרוזת שאתה מקבל פרוסה קטנה של זיכרון במחסנית. 398 00:16:58,120 --> 00:17:01,630 אז זה מתקבל על דעת כי D--V-I-D קו נטוי אפס מאוחסן 399 00:17:01,630 --> 00:17:02,770 יש בערימה. 400 00:17:02,770 --> 00:17:07,680 אבל חכה רגע, getstring חוזר מחרוזת ש, כביכול, שפירושו 401 00:17:07,680 --> 00:17:11,700 זה מגש מקפיטריה הוא נלקח מהערימה. 402 00:17:11,700 --> 00:17:14,560 ואנחנו אמרו בפעם האחרונה שברגע ש פונקציה מחזירה, ואתה לוקח את זה 403 00:17:14,560 --> 00:17:20,109 מגש, אם אפשר לומר כך, את הערימה, מה אתה יכול להניח על שרידי 404 00:17:20,109 --> 00:17:21,819 זיכרון זה? 405 00:17:21,819 --> 00:17:25,160 אני די לשרטט מחדש אותם כסימני שאלה משום שהן הופכות 406 00:17:25,160 --> 00:17:26,250 ערכיו לא ידועים. 407 00:17:26,250 --> 00:17:29,500 הם יכולים לעשות בה שימוש כאשר חלק הפונקציה הבאה נקראת. 408 00:17:29,500 --> 00:17:31,870 >> במילים אחרות, אם אנחנו יקרו כדי להיות לאחסון - 409 00:17:31,870 --> 00:17:34,350 אני לצייר תמונה מהירה כאן הערימה. 410 00:17:34,350 --> 00:17:38,690 אם יקרו לך להיות ציור תחתון הקטע של הזיכרון שלי, ואנחנו נגיד 411 00:17:38,690 --> 00:17:42,230 כי זה המקום של זיכרון שנכבש על ידי ראשי ואולי ARG ג ו 412 00:17:42,230 --> 00:17:46,790 ARG V וכל דבר אחר בתכנית, כאשר getstring נקרא, 413 00:17:46,790 --> 00:17:51,120 ככל הנראה getstring מקבל נתח של זיכרון כאן. 414 00:17:51,120 --> 00:17:53,940 ולאחר מכן D--V-I-D איכשהו בסופו של פונקציה זו. 415 00:17:53,940 --> 00:17:55,320 ואני הולך בפשטנות יתרה. 416 00:17:55,320 --> 00:18:00,050 אבל בואו נניח ש D--V-I-D קו נטוי אפס. 417 00:18:00,050 --> 00:18:03,500 אז בתים רבים זה משמשים המסגרת לgetstring. 418 00:18:03,500 --> 00:18:08,270 >> אבל ברגע שחוזר getstring, אנחנו אמרה הפעם האחרונה שהזיכרון הזה על 419 00:18:08,270 --> 00:18:11,340 כאן הכל הופך להיות - woops! - 420 00:18:11,340 --> 00:18:14,270 הכל הופך להיות נמחק בצורה יעילה. 421 00:18:14,270 --> 00:18:17,220 ואנחנו יכולים לחשוב על זה עכשיו כמו שאלה סימנים כי מי יודע 422 00:18:17,220 --> 00:18:18,720 מה הולך להיות של זיכרון זה. 423 00:18:18,720 --> 00:18:22,130 ואכן, אני לעתים קרובות מאוד לקרוא לפונקציות מלבד getstring. 424 00:18:22,130 --> 00:18:24,750 וברגע שאני קורא קצת אחר פונקציה מgetstring, אולי לא ב 425 00:18:24,750 --> 00:18:28,860 תכנית מסוימת הזאת אנחנו פשוט נראים באבל חלק אחר, אין ספק שחלק אחר 426 00:18:28,860 --> 00:18:34,180 פונקציה עלולה בסופו שניתנה הנקודה הבאה זה בערימה. 427 00:18:34,180 --> 00:18:39,410 >> אז זה לא יכול להיות שמאחסן getstring D--V-I-D על הערימה כי אני היית 428 00:18:39,410 --> 00:18:41,040 תאבד את הגישה אליו באופן מיידי. 429 00:18:41,040 --> 00:18:43,720 אבל אנחנו יודעים שהם getstring מחזיר רק מה? 430 00:18:43,720 --> 00:18:47,220 זה לא חוזר ל לי שישה תווים. 431 00:18:47,220 --> 00:18:51,090 מה זה באמת לא חוזר אנו מגיעים למסקנה בפעם האחרונה? 432 00:18:51,090 --> 00:18:52,480 כתובתו של הראשון. 433 00:18:52,480 --> 00:18:56,650 אז איכשהו, כשאתה נקרא getstring, זה הקצאת נתח של זיכרון עבור 434 00:18:56,650 --> 00:18:59,620 מחרוזת שהסוג והמשתמשים כתובת אז חוזר על זה. 435 00:18:59,620 --> 00:19:02,930 ומתברר שכאשר אתה רוצה תפעל להקצאת זיכרון בזה 436 00:19:02,930 --> 00:19:08,390 דרך ולחזור לאדם שהתקשר פונקציה ש, את הכתובת של 437 00:19:08,390 --> 00:19:11,870 נתח זה של זיכרון, אתה בהחלט לא יכול לשים אותו בערימה ב 438 00:19:11,870 --> 00:19:14,750 תחתון, כי זה רק פונקציונלי הולך לא להיות שלך מאוד 439 00:19:14,750 --> 00:19:17,800 במהירות, כך שאתה יכול כנראה לנחש לאן אנחנו כנראה הולכים לזרוק אותו 440 00:19:17,800 --> 00:19:20,130 במקום זאת, הערימה מה שנקרא. 441 00:19:20,130 --> 00:19:25,290 >> אז בין החלק התחתון של הזיכרון שלך פריסה והחלק העליון של הזיכרון שלך 442 00:19:25,290 --> 00:19:26,820 פריסה הן חבורה שלמה של מגזרים. 443 00:19:26,820 --> 00:19:29,270 האחת היא הערימה, וזכות מעליו היא הערימה. 444 00:19:29,270 --> 00:19:33,680 וגל הוא רק נתח של שונה זיכרון שלא רגיל לפונקציות 445 00:19:33,680 --> 00:19:34,770 כשהם התקשרו. 446 00:19:34,770 --> 00:19:38,100 הוא משמש לזיכרון לטווח ארוך יותר, כאשר אתה רוצה פונקציה אחת כדי לתפוס קצת 447 00:19:38,100 --> 00:19:42,700 זיכרון ולהיות מסוגל להיאחז בו מבלי לאבד שליטה על זה. 448 00:19:42,700 --> 00:19:45,550 >> עכשיו אתה יכול אולי באופן מיידי רואה שזה לא 449 00:19:45,550 --> 00:19:48,060 דווקא עיצוב מושלם. 450 00:19:48,060 --> 00:19:51,350 כמו התכנית שלך שהוקצתה בזיכרון המחסנית, או כמו שאתה קורא יותר ו 451 00:19:51,350 --> 00:19:55,540 פונקציות נוספות, או כמו שאתה להקצות זיכרון בערמה עם malloc בתור 452 00:19:55,540 --> 00:20:00,690 getstring הוא עושה, מה שבבירור נראה שיש בעיה בלתי נמנעת? 453 00:20:00,690 --> 00:20:00,860 >> נכון. 454 00:20:00,860 --> 00:20:03,150 כמו העובדה שחיצים אלו הם מצביעים אחד על השני 455 00:20:03,150 --> 00:20:04,380 אינו מבשר טוב. 456 00:20:04,380 --> 00:20:08,630 ואכן, אנו יכולים לקרוס מהר מאוד תכנית בכל מספר הדרכים. 457 00:20:08,630 --> 00:20:12,050 למעשה, אני חושב שאולי יש לי עשה את זה בטעות פעם אחת. 458 00:20:12,050 --> 00:20:14,020 ואם לא, בואו נעשה את זה בכוונה עכשיו. 459 00:20:14,020 --> 00:20:21,330 תן לי להמשיך ולכתוב במהירות סופר תכנית בשם dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 ועכשיו אני אלך לכאן ו אין להכליל את stdio.h חד. 461 00:20:26,730 --> 00:20:32,620 בואו נכריז הפונקציה foo לוקח אין טענות, שהוא 462 00:20:32,620 --> 00:20:34,040 מצוין, כמו גם על ידי חלל ריק. 463 00:20:34,040 --> 00:20:37,830 >> וזה הדבר היחיד foo הוא הולך לעשות שיחת foo, שכנראה לא 464 00:20:37,830 --> 00:20:39,100 הרעיון החכם ביותר, אבל ניחא. 465 00:20:39,100 --> 00:20:40,490 החלל מרכזי ent. 466 00:20:40,490 --> 00:20:45,270 עכשיו הדבר היחיד שהראשי הולך לעשות הוא להתקשר foo גם כן. 467 00:20:45,270 --> 00:20:51,050 וסתם בשביל כיף, אני הולך ללכת קדימה לכאן ולומר printf "שלום מ 468 00:20:51,050 --> 00:20:52,340 foo ". 469 00:20:52,340 --> 00:20:52,890 >> אישור. 470 00:20:52,890 --> 00:21:00,160 אז אם אני לא עושה טעויות, הפוך dontdothis נקודת קו נטוי. 471 00:21:00,160 --> 00:21:01,960 ובואו נעשינו את זה בחלון גדול יותר - 472 00:21:01,960 --> 00:21:03,210 נקודת לוכסן, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 נו באמת. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 אה אה. 477 00:21:11,890 --> 00:21:13,100 ככל הנראה, אתה יכול לעשות את זה. 478 00:21:13,100 --> 00:21:15,190 לעזאזל. 479 00:21:15,190 --> 00:21:16,190 אישור. 480 00:21:16,190 --> 00:21:16,580 חכה. 481 00:21:16,580 --> 00:21:17,370 לעמוד. 482 00:21:17,370 --> 00:21:18,270 עשינו לנו - 483 00:21:18,270 --> 00:21:20,110 אנחנו לא משתמשים בו עם הפוך. 484 00:21:20,110 --> 00:21:22,050 >> [נאנח] 485 00:21:22,050 --> 00:21:25,110 >> אני יודע, אבל אני חושב שאנחנו פשוט יימחק את זה. 486 00:21:25,110 --> 00:21:28,410 אה, כן. 487 00:21:28,410 --> 00:21:30,660 לעזאזל. 488 00:21:30,660 --> 00:21:32,640 לפתור את רוב זה. 489 00:21:32,640 --> 00:21:34,678 מה? 490 00:21:34,678 --> 00:21:35,928 זה פשוט מאוד. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 כן, פנינו אופטימיזציה מחוץ. 493 00:21:47,360 --> 00:21:48,970 מניח את הדעת, עומד שלום. 494 00:21:48,970 --> 00:21:49,950 עכשיו אני מרגיש טוב יותר. 495 00:21:49,950 --> 00:21:51,390 אישור. 496 00:21:51,390 --> 00:21:51,780 בסדר. 497 00:21:51,780 --> 00:21:53,430 >> אז בואו הידור מחדש זה - 498 00:21:53,430 --> 00:21:55,880 לגרום לך dontdothis. 499 00:21:55,880 --> 00:22:00,090 ייתכן שתצטרך לשנות את השם הזה כדי dothis.c ברגע. 500 00:22:00,090 --> 00:22:00,710 שם אנחנו הולכים. 501 00:22:00,710 --> 00:22:01,240 תודה. 502 00:22:01,240 --> 00:22:02,050 אישור. 503 00:22:02,050 --> 00:22:05,480 אז העובדה שאני מדפיס משהו בעצם היה רק 504 00:22:05,480 --> 00:22:08,150 להאט את התהליך שבאמצעותו אנו היה מגיע לשלב הזה. 505 00:22:08,150 --> 00:22:08,510 אישור. 506 00:22:08,510 --> 00:22:08,870 אוף! 507 00:22:08,870 --> 00:22:11,180 >> אז מה בעצם קורה פה? 508 00:22:11,180 --> 00:22:14,440 הסיבה לשם, בדיוק כמו בצד, היא עושה שום דבר במונחים של תשומות ו 509 00:22:14,440 --> 00:22:17,270 פלט נוטה להיות איטיים יותר בגלל שאתה צריך לכתוב תווים 510 00:22:17,270 --> 00:22:18,600 מסך, יש לו לגלילה. 511 00:22:18,600 --> 00:22:21,720 אז סיפור ארוך קצר, היה לי ממש קרה כל כך חסר סבלנות, היינו צריך 512 00:22:21,720 --> 00:22:23,260 וכן ראה תוצאה סופית זה. 513 00:22:23,260 --> 00:22:26,220 עכשיו שיש לי נסיעה של עליות הדפסה, אנחנו רואים את זה מייד. 514 00:22:26,220 --> 00:22:28,410 אז למה זה קורה. 515 00:22:28,410 --> 00:22:31,300 ובכן, הסבר פשוט, כמובן, הוא שכנראה לא צריך foo 516 00:22:31,300 --> 00:22:32,500 להיות קורא עצמו. 517 00:22:32,500 --> 00:22:34,470 >> עכשיו באופן כללי, זו היא רקורסיה. 518 00:22:34,470 --> 00:22:36,970 וחשבנו כמה שבועות לפני רקורסיבית הוא טוב. 519 00:22:36,970 --> 00:22:40,330 רקורסיה היא הדרך הקסומה הזה של לבטא את עצמך סופר באופן תמציתי. 520 00:22:40,330 --> 00:22:41,400 וזה פשוט עובד. 521 00:22:41,400 --> 00:22:45,060 אבל יש תכונה מרכזית של כל התוכניות רקורסיבית שדברנו 522 00:22:45,060 --> 00:22:48,260 על והביט עד כה, אשר היה שלא היה להם מה? 523 00:22:48,260 --> 00:22:52,610 מקרה בסיס, אשר היה חלק מקודד קשה מקרה שאמר במצבים מסוימים 524 00:22:52,610 --> 00:22:56,210 לא קורא foo, שהוא בבירור לא המקרה כאן. 525 00:22:56,210 --> 00:22:58,920 >> אז מה באמת קורה במונחים של תמונה זו? 526 00:22:58,920 --> 00:23:01,790 ובכן, כאשר עיקרי קורא foo, זה מקבל פרוסת הזיכרון. 527 00:23:01,790 --> 00:23:04,150 כשקורא foo foo, זה נהיה פרוסה של זיכרון. 528 00:23:04,150 --> 00:23:06,430 כשקורא foo foo, הוא מקבל פרוסה. 529 00:23:06,430 --> 00:23:07,080 זה נהיה פרוסה. 530 00:23:07,080 --> 00:23:08,120 זה נהיה פרוסה. 531 00:23:08,120 --> 00:23:09,460 בגלל foo לא חוזר. 532 00:23:09,460 --> 00:23:12,160 אנחנו לעולם לא מוחקים את אחד מאלה מסגרות מהערימה. 533 00:23:12,160 --> 00:23:15,930 אז אנחנו נושבת בערימה, ולא להזכיר מי יודע מה עוד, ו 534 00:23:15,930 --> 00:23:19,600 אנחנו חורגים מגבולות שלנו מה שנקרא קטע של זיכרון. 535 00:23:19,600 --> 00:23:21,790 שגיאה ללכת פילוח שווא. 536 00:23:21,790 --> 00:23:24,110 >> אז יש פתרון באופן ברור לא עושה את זה. 537 00:23:24,110 --> 00:23:28,830 אבל המשמעות הגדולה יותר היא שכן, בהחלט יש איזה גבול, 538 00:23:28,830 --> 00:23:32,470 גם אם הוא אינו מוגדר היטב, באשר לאופן פונקציות רבות שאתה יכול להתקשר 539 00:23:32,470 --> 00:23:34,970 תכנית, כמה פעמים פונקציה אפשר לקרוא לעצמו. 540 00:23:34,970 --> 00:23:38,430 אז למרות שאנחנו עשינו להטיף רקורסיה כדבר שעלול להיות הקסום הזה 541 00:23:38,430 --> 00:23:41,870 לפני כמה שבועות לסיגמא פונקציה, וכאשר אנחנו מקבלים את הנתונים 542 00:23:41,870 --> 00:23:45,270 מבנים וCS50, תראה אחרים בקשות לזה, זה לא 543 00:23:45,270 --> 00:23:46,500 בהכרח הדבר הטוב ביותר. 544 00:23:46,500 --> 00:23:50,070 כי אם פונקציה קורא לעוצמה, קורא לעצמו, גם אם יש בסיס 545 00:23:50,070 --> 00:23:54,860 מקרה, אם אתה לא פגע במקרה שהבסיס עבור 1,000 שיחות או 10,000 שיחות, על ידי 546 00:23:54,860 --> 00:23:58,800 כי זמן שאולי יש לי נגמרים של חדר על הערימה ופגע כביכול שלך 547 00:23:58,800 --> 00:24:00,400 כמה מגזרים אחרים של זיכרון. 548 00:24:00,400 --> 00:24:03,950 אז גם הוא תחלופה עיצוב בין אלגנטיות ובין 549 00:24:03,950 --> 00:24:06,920 חוסנו של הספציפי שלך יישום. 550 00:24:06,920 --> 00:24:10,780 >> אז יש החסרון או אחר תפסתי אותך אחרת למה שיש לנו 551 00:24:10,780 --> 00:24:11,720 עשה עד כה. 552 00:24:11,720 --> 00:24:12,980 כשהתקשרתי getstring - 553 00:24:12,980 --> 00:24:15,120 תן לי לחזור לשלום-2. 554 00:24:15,120 --> 00:24:18,170 שימו לב שאני מתקשר getstring, שחוזר כתובת. 555 00:24:18,170 --> 00:24:20,730 ואנחנו טוענים היום כי כתובת הוא מהערימה. 556 00:24:20,730 --> 00:24:24,480 ועכשיו אני מדפיס את מחרוזת בכתובת זו. 557 00:24:24,480 --> 00:24:27,000 אבל אנחנו אף פעם לא קראנו ההפך מgetstring. 558 00:24:27,000 --> 00:24:30,850 אף פעם לא היו לנו לCALLL לתפקד כמו ungetstring, שבו אתה יד אחורית 559 00:24:30,850 --> 00:24:31,610 זיכרון זה. 560 00:24:31,610 --> 00:24:33,250 אבל בכנות, אנחנו כנראה היה צריך להיות. 561 00:24:33,250 --> 00:24:37,390 כי אם אנחנו כל זמן שואלים את המחשב לזכרו, על ידי דרך של מישהו כמו 562 00:24:37,390 --> 00:24:40,830 getstring אבל אף פעם לא ייתן לו בחזרה, ללא ספק גם זה חייב להוביל ל 563 00:24:40,830 --> 00:24:42,970 בעיות לפיה אנו פועלים מתוך זיכרון. 564 00:24:42,970 --> 00:24:46,140 >> ולמעשה, אנחנו יכולים להסתכל על אלה בעיות עם הכלי החדש שהשימוש 565 00:24:46,140 --> 00:24:47,640 הוא קצת סתום להקליד. 566 00:24:47,640 --> 00:24:50,960 אבל תן לי להמשיך ולהתיז אותו על המסך ברגע. 567 00:24:50,960 --> 00:24:56,940 אני הולך קדימה ולהפעיל Valgrind עם הפרמטר ראשון שפקודה 568 00:24:56,940 --> 00:25:00,260 ויכוח הוא קו השם של תכנית שלום ש- 2. 569 00:25:00,260 --> 00:25:02,650 ולרוע מזל זה פלט הוא אכזרי 570 00:25:02,650 --> 00:25:04,290 מורכב בלי שום סיבה טובה. 571 00:25:04,290 --> 00:25:06,280 כך אנו רואים את כל הבלגן הזה. 572 00:25:06,280 --> 00:25:07,530 דוד הוא לומר את השם שלי. 573 00:25:07,530 --> 00:25:09,760 אז זה התכנית למעשה פועל. 574 00:25:09,760 --> 00:25:11,180 ועכשיו אנחנו מקבלים את הפלט הזה. 575 00:25:11,180 --> 00:25:13,400 >> אז Valgrind דומה ברוחו לGDB. 576 00:25:13,400 --> 00:25:14,950 זה לא הבאגים כשלעצמה. 577 00:25:14,950 --> 00:25:16,270 אבל זה בודק זיכרון. 578 00:25:16,270 --> 00:25:20,140 זוהי תכנית שתפעל תכנית ולהגיד לך אם היית שואל 579 00:25:20,140 --> 00:25:23,860 מחשב לזיכרון ולא מסר אותו בחזרה, ובכך משמעות שיש לך 580 00:25:23,860 --> 00:25:24,570 דליפת זיכרון. 581 00:25:24,570 --> 00:25:26,240 ודליפות זיכרון נוטות להיות רעה. 582 00:25:26,240 --> 00:25:29,120 ואתה הוא משתמשים של מחשבים יש לי כנראה הרגיש את זה, בין אם יש לך 583 00:25:29,120 --> 00:25:30,300 מק או PC. 584 00:25:30,300 --> 00:25:33,730 האם אי פעם השתמש במחשב שלך עבור בזמן ולא אתחלתי בכמה 585 00:25:33,730 --> 00:25:36,820 ימים, או שפשוט יש לך הרבה תוכניות פועלות, והדבר הארור 586 00:25:36,820 --> 00:25:42,360 מאט לעצירה שחיקה, או לפחות זה סופר מעצבן לשימוש, משום 587 00:25:42,360 --> 00:25:44,350 כל מה שיש רק סופר איטי. 588 00:25:44,350 --> 00:25:46,260 >> עכשיו זה יכול להיות כל מספר סיבות. 589 00:25:46,260 --> 00:25:49,600 זה יכול להיות לולאה אינסופית, בבאג הקוד של מישהו, או, יותר פשוט, זה 590 00:25:49,600 --> 00:25:53,250 יכולים להיות שאתה משתמש יותר זיכרון, או מנסה, יותר משלך 591 00:25:53,250 --> 00:25:54,920 יש במחשב של ממש. 592 00:25:54,920 --> 00:25:57,770 ואולי יש באג בתכנית מסוימת שכל זמן שואל לזיכרון. 593 00:25:57,770 --> 00:26:02,480 דפדפנים במשך שנים היו ידועים לשמצה זו, מבקש יותר ויותר זיכרון 594 00:26:02,480 --> 00:26:03,870 אך מעולם לא מסר אותו בחזרה. 595 00:26:03,870 --> 00:26:07,220 אין ספק, אם יש לך רק סופי כמות הזיכרון, אתה לא יכול לשאול 596 00:26:07,220 --> 00:26:09,990 פעמים רבות לאין שיעור עבור חלק מהזיכרון הזה. 597 00:26:09,990 --> 00:26:13,070 >> וכך, מה שאתה רואה כאן, למרות שוב הפלט של Valgrind הוא 598 00:26:13,070 --> 00:26:17,490 מורכב שלא לצורך להציץ ראשון, זה החלק המעניין. 599 00:26:17,490 --> 00:26:18,890 ערימה - 600 00:26:18,890 --> 00:26:20,060 בשימוש ביציאה. 601 00:26:20,060 --> 00:26:22,810 אז הנה כמה זיכרון היה בשימוש בערימה ב 602 00:26:22,810 --> 00:26:24,300 זמן התכנית שלי יצאה - 603 00:26:24,300 --> 00:26:27,280 כנראה שישה בתים ברחוב אחד. 604 00:26:27,280 --> 00:26:28,710 אז אני הולכת לנופף ידי שלי באיזה בלוק הוא. 605 00:26:28,710 --> 00:26:31,270 תחשוב על זה הוא רק נתח, יותר מילה טכנית לגוש. 606 00:26:31,270 --> 00:26:33,140 אבל שישה בתים - 607 00:26:33,140 --> 00:26:36,870 מה הם שישה הבתים ש היו עדיין בשימוש? 608 00:26:36,870 --> 00:26:37,390 >> בדיוק. 609 00:26:37,390 --> 00:26:41,520 D--V-I-D, חמש מכתב קו נטוי אפס שם תוספת שליחות קטלנית null. 610 00:26:41,520 --> 00:26:46,350 אז התכנית הזאת Valgrind לב שאני ביקש שישה בתים, ככל הנראה, על ידי 611 00:26:46,350 --> 00:26:48,950 דרך של getstring, אבל אף פעם לא נתן להם בחזרה. 612 00:26:48,950 --> 00:26:52,030 ולמעשה, זה לא יכול להיות כל כך מובן מאליו, אם התכנית שלי היא לא שלוש 613 00:26:52,030 --> 00:26:53,590 קווים, אבל זה 300 קווים. 614 00:26:53,590 --> 00:26:56,920 אז אנחנו באמת יכולים לתת פקודה אחרת טענת קו לValgrind ל 615 00:26:56,920 --> 00:26:58,290 לעשות את זה יותר מפורט. 616 00:26:58,290 --> 00:26:59,760 זה קצת מעצבן שיש לזכור. 617 00:26:59,760 --> 00:27:01,580 אבל אם אני עושה - 618 00:27:01,580 --> 00:27:01,930 בואו נראה. 619 00:27:01,930 --> 00:27:03,540 דליפה - 620 00:27:03,540 --> 00:27:05,030 היה זה ידלוף - 621 00:27:05,030 --> 00:27:07,580 אפילו אני לא זוכר מה הוא את היד. 622 00:27:07,580 --> 00:27:08,550 >> - בדיקת דליפה שווה מלאה. 623 00:27:08,550 --> 00:27:10,180 כן, תודה לך. 624 00:27:10,180 --> 00:27:12,520 - בדיקת דליפה שווה מלאה. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 אותה תכנית פועלת. 627 00:27:14,940 --> 00:27:16,180 הקלד בדוד שוב. 628 00:27:16,180 --> 00:27:17,660 עכשיו אני רואה קצת יותר פירוט. 629 00:27:17,660 --> 00:27:20,890 אבל מתחת לערימת הסיכום, אשר זהה לארבעה - אה, 630 00:27:20,890 --> 00:27:22,120 זה די נחמד. 631 00:27:22,120 --> 00:27:25,460 עכשיו הוא מחפש בעצם Valgrind קצת יותר קשה בקוד שלי. 632 00:27:25,460 --> 00:27:29,580 וזה אומר כי, ככל הנראה, malloc בקו - 633 00:27:29,580 --> 00:27:30,580 אנו להקטין את התצוגה. 634 00:27:30,580 --> 00:27:31,980 בקו - 635 00:27:31,980 --> 00:27:32,930 אנחנו לא רואים מה קו זה. 636 00:27:32,930 --> 00:27:35,110 אבל malloc היא האשם הראשון. 637 00:27:35,110 --> 00:27:38,630 יש בלוג בmalloc. 638 00:27:38,630 --> 00:27:39,810 >> בסדר? 639 00:27:39,810 --> 00:27:40,450 אוקיי, לא. 640 00:27:40,450 --> 00:27:40,940 נכון? 641 00:27:40,940 --> 00:27:42,520 התקשרתי getstring. 642 00:27:42,520 --> 00:27:44,460 getstring כנראה קורא malloc. 643 00:27:44,460 --> 00:27:47,800 אז מה שורת קוד היא ככל הנראה באשמה על כך 644 00:27:47,800 --> 00:27:49,050 הוקצה הזיכרון הזה? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 בואו נניח שכל מי שכתב malloc כבר בסביבה מספיק זמן, כי זה 647 00:27:55,540 --> 00:27:56,390 לא באשמתם. 648 00:27:56,390 --> 00:27:57,520 אז כנראה שזה שלי. 649 00:27:57,520 --> 00:28:02,000 getstring בcs50.c - אז זה קובץ איפשהו במחשב - 650 00:28:02,000 --> 00:28:05,210 בקו 286 נראה להיות אשם. 651 00:28:05,210 --> 00:28:08,140 עכשיו בואו נניח שכבר cs50 מסביב לכמות הגונה של זמן, ולכן 652 00:28:08,140 --> 00:28:09,720 גם אנחנו עושים את זה תמיד. 653 00:28:09,720 --> 00:28:14,080 ואז זה כנראה לא בgetstring כי באג שקרים, אלא ב 654 00:28:14,080 --> 00:28:17,810 קו שלום-ג .2 18. 655 00:28:17,810 --> 00:28:20,670 >> אז בואו נסתכל מה היה הקו ש18. 656 00:28:20,670 --> 00:28:21,130 אה. 657 00:28:21,130 --> 00:28:27,130 איכשהו הקו הזה הוא לא בהכרח כרכרה, כשלעצמה, אבל זה הסיבה 658 00:28:27,130 --> 00:28:28,630 מאחורי דליפת זיכרון זה. 659 00:28:28,630 --> 00:28:32,140 כך סופר בפשטות, מה שהיית עושה באופן אינטואיטיבי להיות הפתרון כאן? 660 00:28:32,140 --> 00:28:34,710 אם אנחנו מבקשים לזיכרון, אף פעם לא היו נותן אותו בחזרה, וכי נראה שיש 661 00:28:34,710 --> 00:28:37,940 בעיה, כי לאורך זמן המחשב שלי אולי נגמרים של זיכרון, עשוי להאט 662 00:28:37,940 --> 00:28:42,110 למטה, דברים רעים עלולים לקרות, טוב, מה הפתרון אינטואיטיבי ופשוט? 663 00:28:42,110 --> 00:28:43,140 רק תן לו בחזרה. 664 00:28:43,140 --> 00:28:44,770 >> איך לשחרר את הזיכרון הזה? 665 00:28:44,770 --> 00:28:49,970 ובכן, תודה לאל שזה די פשוט רק כדי להגיד שם ללא תשלום. 666 00:28:49,970 --> 00:28:51,260 ואנחנו אף פעם לא עשינו את זה קודם. 667 00:28:51,260 --> 00:28:55,890 אבל אתה בעצם יכול לחשוב עליו ללא כהיפוכה של malloc. 668 00:28:55,890 --> 00:28:58,030 החופשי הוא ההפך הקצאת זיכרון. 669 00:28:58,030 --> 00:28:59,540 אז עכשיו תן לי הידור מחדש את זה. 670 00:28:59,540 --> 00:29:02,050 הפוך שלום-2. 671 00:29:02,050 --> 00:29:04,620 תן לי להפעיל אותו שוב. שלום דוד-2. 672 00:29:04,620 --> 00:29:07,290 אז נראה שזה יעבוד ב בדיוק באותו אופן. 673 00:29:07,290 --> 00:29:11,180 אבל אם אני חוזר לValgrind ולהפעיל מחדש אותה פקודה בחדשה שלי 674 00:29:11,180 --> 00:29:14,720 הידור תכנית, הקלדה בשם שלי כמו בעבר - 675 00:29:14,720 --> 00:29:15,370 נחמד. 676 00:29:15,370 --> 00:29:16,760 סיכום ערימה - 677 00:29:16,760 --> 00:29:17,740 בשימוש ביציאה - 678 00:29:17,740 --> 00:29:19,370 אפס בתים בלוקים אפס. 679 00:29:19,370 --> 00:29:21,840 וזה סופר נחמד, כל ערמה ששוחררה. 680 00:29:21,840 --> 00:29:23,480 אין דליפות אפשריות. 681 00:29:23,480 --> 00:29:27,200 >> אז מתקרב, לא עם סט בעיה 4, אבל עם סט 5 בעיה, את זיהוי פלילי 682 00:29:27,200 --> 00:29:30,740 והלאה, זה גם יהפוך מידה של נכונות שלך 683 00:29:30,740 --> 00:29:33,630 תכנית, או אם אין לך או שאין לי דליפות זיכרון. 684 00:29:33,630 --> 00:29:36,900 אבל לשמחתי, לא רק יכולה לך הסיבה דרך אותם באופן אינטואיטיבי, אשר 685 00:29:36,900 --> 00:29:40,430 הוא, ללא ספק, קל לתוכניות קטנות אבל קשה יותר לתוכניות גדולות יותר, 686 00:29:40,430 --> 00:29:43,860 Valgrind, לתוכניות גדולות אלה, יכול לעזור לך לזהות 687 00:29:43,860 --> 00:29:45,360 בעיה מסוימת. 688 00:29:45,360 --> 00:29:47,500 >> אבל יש בעיה אחרת אחד שעלול להתעורר. 689 00:29:47,500 --> 00:29:51,245 תן לי לפתוח את הקובץ הזה לכאן, שהוא, שוב, דוגמה פשוטה למדי. 690 00:29:51,245 --> 00:29:53,760 אבל בואו נתמקד במה התכנית הזו עושה. 691 00:29:53,760 --> 00:29:55,190 זה נקרא memory.c. 692 00:29:55,190 --> 00:29:58,380 אנחנו מתכוונים לכתוב את זה מאוחר יותר היום ב zip של קוד המקור של ימינו. 693 00:29:58,380 --> 00:30:01,610 ושים לב שיש לי פונקציה שנקראת F שלא לוקח ארגומנטים ו 694 00:30:01,610 --> 00:30:02,800 מחזיר שום דבר. 695 00:30:02,800 --> 00:30:07,240 בקו 20, שככל הנראה, אני מכריז מצביע int וקורא לזה x. 696 00:30:07,240 --> 00:30:09,570 אני הקצאה היא התמורה ערך של malloc. 697 00:30:09,570 --> 00:30:14,590 ורק שיהיה ברור, כמה בתיי אני כנראה מקבל בחזרה מmalloc 698 00:30:14,590 --> 00:30:17,080 במצב כזה? 699 00:30:17,080 --> 00:30:18,040 >> כנראה 40. 700 00:30:18,040 --> 00:30:18,840 לאן אתה לוקח את זה? 701 00:30:18,840 --> 00:30:22,410 ובכן, אם אתה זוכר שint הוא לעתים קרובות 4 בתים, לפחות את זה הוא ב 702 00:30:22,410 --> 00:30:25,110 מכשיר, 10 פעמים 4 הוא כמובן 40. 703 00:30:25,110 --> 00:30:28,920 אז malloc חוזר כתובת של נתח של זיכרון ואחסון ה 704 00:30:28,920 --> 00:30:30,800 לטפל בסופו של דבר בx. 705 00:30:30,800 --> 00:30:32,570 אז כדי שיהיו ברור, מה אז קורה? 706 00:30:32,570 --> 00:30:34,990 ובכן, הרשה לי לחזור לתמונה שלנו כאן. 707 00:30:34,990 --> 00:30:38,150 תן לי לא רק לצייר את החלק התחתון שלי הזיכרון של המחשב, תן לי ללכת קדימה 708 00:30:38,150 --> 00:30:42,990 לצייר את כל המלבן ש מייצג את כל זיכרון RAM שלי. 709 00:30:42,990 --> 00:30:44,790 >> אנחנו נגיד שהערימה נמצא בתחתית. 710 00:30:44,790 --> 00:30:47,010 ויש קטע טקסט ב הנתונים לא אותחל. 711 00:30:47,010 --> 00:30:49,880 אבל אני פשוט הולך לאלה מופשטים דברים אחרים משם כנקודה, נקודת נקודה. 712 00:30:49,880 --> 00:30:53,470 אני רק הולך להתייחס לזה כערימה בראש. 713 00:30:53,470 --> 00:30:57,070 ולאחר מכן בחלק התחתון של התמונה הזאת, לייצג ראשי, אני הולך 714 00:30:57,070 --> 00:30:59,880 כדי לתת לו זכרון פרוסות במחסנית. 715 00:30:59,880 --> 00:31:03,150 עבור F, אני הולך לתת לו פרוסת בזיכרון על המחסנית. 716 00:31:03,150 --> 00:31:05,140 עכשיו, יש לי להתייעץ קוד מקור שוב. 717 00:31:05,140 --> 00:31:07,170 מה הם המשתנים המקומיים לראשי? 718 00:31:07,170 --> 00:31:10,710 כנראה שום דבר, כך שהפרוסה היא יעילות ריק או אפילו לא גדול 719 00:31:10,710 --> 00:31:11,600 כפי שציירתי אותו. 720 00:31:11,600 --> 00:31:15,730 אבל בF, יש לי משתנה מקומי, אשר נקרא X. 721 00:31:15,730 --> 00:31:20,410 אז אני הולך קדימה, לתת F נתח של זיכרון, קורא לזה x. 722 00:31:20,410 --> 00:31:24,680 >> ועכשיו malloc של 10 פעמים 4, אז 40 malloc, איפה ש 723 00:31:24,680 --> 00:31:25,430 זיכרון מגיע? 724 00:31:25,430 --> 00:31:27,530 לא אנחנו שציירנו תמונה אוהב את זה בעבר. 725 00:31:27,530 --> 00:31:31,140 אבל בואו נניח שזה יעיל מגיע מכאן, כך שאף אחד, 726 00:31:31,140 --> 00:31:33,170 שתיים, שלוש, ארבע, חמש. 727 00:31:33,170 --> 00:31:34,680 ועכשיו אני צריך 40 מהם. 728 00:31:34,680 --> 00:31:37,540 אז אני פשוט אעשה את נקודה, נקודה, נקודה להציע שיש אפילו יותר זיכרון 729 00:31:37,540 --> 00:31:39,350 חוזר מהערימה. 730 00:31:39,350 --> 00:31:40,710 עכשיו, מה הכתובת? 731 00:31:40,710 --> 00:31:42,620 בואו לבחור שרירותי שלנו לטפל כמו תמיד - 732 00:31:42,620 --> 00:31:46,310 Ox123, למרות שזה כנראה הולך להיות משהו אחר לגמרי. 733 00:31:46,310 --> 00:31:50,420 זה את הכתובת של הבית הראשון ב הזיכרון שאני מבקש לmalloc. 734 00:31:50,420 --> 00:31:53,630 >> אז בשורה קצרה, ברגע שמבצע 20, מה היא, פשוטו כמשמעו, 735 00:31:53,630 --> 00:31:57,170 מאוחסן בתוך של x כאן? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 והשור הוא לא מעניין. 739 00:32:01,550 --> 00:32:03,200 זה רק אומר שהנה מספר הקסדצימלי. 740 00:32:03,200 --> 00:32:06,490 אבל מה שמפתח הוא כי מה שיש לי חנות בX, שהוא משתנה מקומי. 741 00:32:06,490 --> 00:32:10,260 אבל זה סוג הנתונים שלה, שוב, היא כתובת של int. 742 00:32:10,260 --> 00:32:12,710 ובכן, אני הולך לאחסון Ox123. 743 00:32:12,710 --> 00:32:16,610 אבל שוב, אם זה מעט מדי מסובך שלא לצורך, אם אני לגלול 744 00:32:16,610 --> 00:32:21,490 בחזרה, אנחנו יכולים מופשטים זה משם די סביר ופשוט לומר שהוא X 745 00:32:21,490 --> 00:32:23,910 מצביע לנתח זה של זיכרון. 746 00:32:23,910 --> 00:32:24,070 >> אישור. 747 00:32:24,070 --> 00:32:26,230 עכשיו השאלה שעל הפרק הוא הבא - 748 00:32:26,230 --> 00:32:29,910 קו 21, כך מתברר, הוא מרכבה. 749 00:32:29,910 --> 00:32:31,160 למה? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> סליחה? 752 00:32:36,930 --> 00:32:38,640 זה לא חייב - 753 00:32:38,640 --> 00:32:40,390 אומר שפעם נוספת. 754 00:32:40,390 --> 00:32:41,240 ובכן, זה לא בחינם. 755 00:32:41,240 --> 00:32:42,350 אז זה שני אבל. 756 00:32:42,350 --> 00:32:45,000 אז יש אחד אחרת, אבל באופן ספציפי בקו 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> בדיוק. 759 00:32:50,040 --> 00:32:54,980 שורה פשוטה זו של קוד היא פשוט גלישת מאגר, הצפת מאגר. 760 00:32:54,980 --> 00:32:57,050 חיץ רק אומר שנתח של זיכרון. 761 00:32:57,050 --> 00:33:01,520 אבל נתח זה של זיכרון הוא בגודל 10, 10 מספרים שלמים, מה שאומר שאם אנחנו 762 00:33:01,520 --> 00:33:05,350 מדד לתוכו באמצעות הסוכר התחבירי סימון של מערך, הכיכר 763 00:33:05,350 --> 00:33:09,220 בסוגריים, יש לך גישה x סוגר 0 x סוגר x 1, 764 00:33:09,220 --> 00:33:10,390 סוגר נקודה, נקודה, נקודה. 765 00:33:10,390 --> 00:33:13,270 x 9 סוגר הוא אחד הגדול. 766 00:33:13,270 --> 00:33:17,680 אז אם אני עושה x 10 סוגר, שבו אני באמת הולך בזיכרון? 767 00:33:17,680 --> 00:33:19,120 >> ובכן, אם יש לי 10 int - 768 00:33:19,120 --> 00:33:21,070 בואו ממש לצייר את כל מכאן את אלה. 769 00:33:21,070 --> 00:33:22,700 אז זה היה חמישה הראשונים. 770 00:33:22,700 --> 00:33:24,660 הנה חמישה ints האחרים. 771 00:33:24,660 --> 00:33:29,580 אז x סוגר 0 הוא כאן. x 1 סוגר הוא כאן. x 9 סוגר הוא כאן. x סוגר 772 00:33:29,580 --> 00:33:37,960 10 היא כאן, מה שאומר שאני מספר, בקו 21, לשים את המחשב 773 00:33:37,960 --> 00:33:39,400 מספר שבו? 774 00:33:39,400 --> 00:33:42,010 המספר 0 שבו? 775 00:33:42,010 --> 00:33:43,380 ובכן, זה 0, כן. 776 00:33:43,380 --> 00:33:45,460 אבל רק העובדה ש0 הוא סוג של צירוף מקרים. 777 00:33:45,460 --> 00:33:47,140 זה יכול להיות המספר 50, לכל מה שאכפת לנו. 778 00:33:47,140 --> 00:33:50,480 אבל אנחנו מנסים לשים אותו בסוגר X 10, שבה זה 779 00:33:50,480 --> 00:33:53,700 סימן השאלה נמשך, אשר זה לא דבר טוב. 780 00:33:53,700 --> 00:33:57,070 תכנית זו עשויה היטב לקרוס כתוצאה מכך. 781 00:33:57,070 --> 00:33:59,400 >> עכשיו, בואו נלך קדימה ולראות אם זה הוא, אכן, מה שקורה. 782 00:33:59,400 --> 00:34:02,600 הפוך את הזיכרון, שכן הקובץ נקרא memory.c. 783 00:34:02,600 --> 00:34:05,950 בואו נלך קדימה ולרוץ זכרון התכנית. 784 00:34:05,950 --> 00:34:08,239 אז יש לנו מזל, באמת, זה נראה. 785 00:34:08,239 --> 00:34:09,340 יש לנו מזל. 786 00:34:09,340 --> 00:34:11,060 אבל בואו נראה אם ​​אנחנו עכשיו לרוץ Valgrind. 787 00:34:11,060 --> 00:34:14,170 במבט הראשון, התכנית שלי אולי נראה שיש נכון בצורה מושלמת. 788 00:34:14,170 --> 00:34:18,010 אבל תן לי לרוץ עם Valgrind - בדיקת דליפה שווה מלאה על זיכרון. 789 00:34:18,010 --> 00:34:20,110 >> ועכשיו כשאני מפעיל את זה - 790 00:34:20,110 --> 00:34:21,030 מעניין. 791 00:34:21,030 --> 00:34:26,800 לא חוקי לכתוב בגודל 4 ב קו 21 של memory.c. 792 00:34:26,800 --> 00:34:29,284 קו 21 של memory.c הוא איזה מהם? 793 00:34:29,284 --> 00:34:30,340 אה, מעניין. 794 00:34:30,340 --> 00:34:31,080 אבל הרגע. 795 00:34:31,080 --> 00:34:32,389 גודל 4, מה שמתכוון? 796 00:34:32,389 --> 00:34:34,969 אני רק אחד שכותב, אבל זה בגודל 4. 797 00:34:34,969 --> 00:34:36,889 למה זה 4? 798 00:34:36,889 --> 00:34:39,280 זה בגלל שזה int, אשר הוא, שוב, ארבעה בתים. 799 00:34:39,280 --> 00:34:42,510 אז Valgrind מצא באג שאני, מעיף מבט בקוד שלי, לא עשה זאת. 800 00:34:42,510 --> 00:34:45,040 ואולי TF שלך היה או לא. 801 00:34:45,040 --> 00:34:48,469 מה Valgrind אבל בטוח מצא כי אנחנו עשינו טעות שם, אפילו 802 00:34:48,469 --> 00:34:52,719 למרות שיש לנו מזל, והמחשב החלטתי, אה, אני לא הולך לקרוס 803 00:34:52,719 --> 00:34:57,470 רק בגלל שאתה נגעת בבית אחד, אחד שווה של int של זיכרון שלא עשה את זה 804 00:34:57,470 --> 00:34:58,550 למעשה עצמו. 805 00:34:58,550 --> 00:35:00,380 >> ובכן, מה עוד כרכרה כאן. 806 00:35:00,380 --> 00:35:01,180 כתובת - 807 00:35:01,180 --> 00:35:03,190 זו היא כתובת מחפשת מטורפת בהקסדצימלי. 808 00:35:03,190 --> 00:35:06,890 זה רק אומר שאי שם בערימה היא אפס בתים אחרי בלוק בגודל 40 809 00:35:06,890 --> 00:35:07,620 מוקצה. 810 00:35:07,620 --> 00:35:10,610 תן לי להתקרב לכאן ולראות אם זה קצת יותר מועיל. 811 00:35:10,610 --> 00:35:11,410 מעניין. 812 00:35:11,410 --> 00:35:15,600 40 בתים הם בהחלט הפסידו ברשומת הפסד של 1 1. 813 00:35:15,600 --> 00:35:17,840 שוב, יותר מאשר מילים שימושית כאן. 814 00:35:17,840 --> 00:35:21,350 אלא מבוסס על הקווים המודגשים, שבו אני צריך כנראה להתמקד 815 00:35:21,350 --> 00:35:24,070 תשומת לב לבאג נוסף? 816 00:35:24,070 --> 00:35:26,570 נראה כמו קו 20 של memory.c. 817 00:35:26,570 --> 00:35:30,990 >> אז אם אנחנו חוזרים לקו 20, זה אחד שזיהה קודם לכן. 818 00:35:30,990 --> 00:35:33,030 וזה לא בהכרח עגלה. 819 00:35:33,030 --> 00:35:35,160 אבל יש לנו זה הפוך השפעותיו. 820 00:35:35,160 --> 00:35:38,790 אז איך אני יכול לתקן לפחות אחת מהטעויות האלה? 821 00:35:38,790 --> 00:35:42,240 מה אני יכול לעשות אחרי קו 21? 822 00:35:42,240 --> 00:35:47,110 אני יכול לעשות ללא X, ולכן הוא לתת בחזרה זיכרון זה. 823 00:35:47,110 --> 00:35:49,230 ואיך אני יכול לתקן את הבאג הזה? 824 00:35:49,230 --> 00:35:52,120 אני בהחלט צריכה ללכת לא רחוק מ -0. 825 00:35:52,120 --> 00:35:53,670 אז תן לי לנסות ולהפעיל מחדש את זה. 826 00:35:53,670 --> 00:35:56,080 סליחה, בהחלט ללכת רחוק יותר מאשר 9. 827 00:35:56,080 --> 00:35:57,510 הפוך את הזיכרון. 828 00:35:57,510 --> 00:36:00,650 תן לי שידור חוזר Valgrind בחלון גדול יותר. 829 00:36:00,650 --> 00:36:01,580 ועכשיו נראה. 830 00:36:01,580 --> 00:36:02,250 נחמד. 831 00:36:02,250 --> 00:36:03,270 כל הערמה ששוחררה. 832 00:36:03,270 --> 00:36:04,270 אין דליפות אפשריות. 833 00:36:04,270 --> 00:36:07,520 ומעל לכאן, אין שום אזכור יותר של הזכות חוקית. 834 00:36:07,520 --> 00:36:09,820 >> רק כדי לקבל חמדן, ובואו לראות אם הפגנה נוספת 835 00:36:09,820 --> 00:36:11,050 לא הולך כמתוכנן - 836 00:36:11,050 --> 00:36:12,560 אני לא מקבל מזל לפני רגע. 837 00:36:12,560 --> 00:36:15,530 ועובדה שזו היא אולי 0 שלא לצורך מטעה. 838 00:36:15,530 --> 00:36:20,650 בואו פשוט נעשה 50, שרירותי למדי מספר, להפוך את זכרון לוכסן נקודת זיכרון - 839 00:36:20,650 --> 00:36:21,410 עדיין לקבל מזל. 840 00:36:21,410 --> 00:36:22,510 שום דבר לא מתרסק. 841 00:36:22,510 --> 00:36:26,150 נניח שאני פשוט אעשה משהו באמת טיפש, ואני עושה את 100. 842 00:36:26,150 --> 00:36:30,360 תן לי לסדר זיכרון, זכרון נקודת לוכסן - 843 00:36:30,360 --> 00:36:31,075 לי מזל שוב. 844 00:36:31,075 --> 00:36:32,800 מה דעתך על 1000? 845 00:36:32,800 --> 00:36:35,370 ints מעבר, בערך, שבו אני צריך להיות? 846 00:36:35,370 --> 00:36:37,410 הפוך זיכרון - 847 00:36:37,410 --> 00:36:38,570 לעזאזל. 848 00:36:38,570 --> 00:36:39,920 >> [שחוק] 849 00:36:39,920 --> 00:36:41,270 >> אישור. 850 00:36:41,270 --> 00:36:43,920 בואו לא יתעסק יותר. 851 00:36:43,920 --> 00:36:45,120 שידור חוזר זיכרון. 852 00:36:45,120 --> 00:36:45,840 שם אנחנו הולכים. 853 00:36:45,840 --> 00:36:46,410 בסדר. 854 00:36:46,410 --> 00:36:52,500 אז כנראה שאתה מדד 100,000 ints מעבר שבו אתה צריך להיות ב 855 00:36:52,500 --> 00:36:54,410 זיכרון, דברים רעים קורים. 856 00:36:54,410 --> 00:36:56,430 אז זה כמובן לא קשה, שלטון מהר. 857 00:36:56,430 --> 00:36:58,190 הייתי סוג של שימוש במשפט וטעייה כדי להגיע לשם. 858 00:36:58,190 --> 00:37:02,230 אבל זה בגלל, סיפור ארוך קצר, הזיכרון של המחשב מחולק גם 859 00:37:02,230 --> 00:37:03,580 לדברים האלה נקראים מגזרים. 860 00:37:03,580 --> 00:37:07,260 ולפעמים, דווקא המחשב נתן לך קצת יותר זיכרון 861 00:37:07,260 --> 00:37:08,400 ממה שאתה מבקש. 862 00:37:08,400 --> 00:37:12,170 אבל ליעילות, זה פשוט קל יותר לקבל יותר זיכרון, אלא רק לספר לך 863 00:37:12,170 --> 00:37:13,780 שאתה מקבל חלק ממנו. 864 00:37:13,780 --> 00:37:16,370 >> ואם אתה מקבל מזל לפעמים, לכן, ייתכן שתוכל לגעת 865 00:37:16,370 --> 00:37:17,795 זיכרון שלא שייך לך. 866 00:37:17,795 --> 00:37:21,860 אין לך שום ערובה לכך שמה ערך אתה מכניס לשם תישאר שם, כי 867 00:37:21,860 --> 00:37:25,080 מחשב עדיין חושב שזה לא שלך, אבל זה לא בהכרח הולך 868 00:37:25,080 --> 00:37:29,910 לרמה של תחום פעילות אחרת של זיכרון ב מחשב ולגרום טעות כמו 869 00:37:29,910 --> 00:37:31,710 זה כאן. 870 00:37:31,710 --> 00:37:32,060 בסדר. 871 00:37:32,060 --> 00:37:37,240 כל שאלות אז על זיכרון? 872 00:37:37,240 --> 00:37:37,590 >> בסדר. 873 00:37:37,590 --> 00:37:40,610 בואו נסתכל כאן, ולאחר מכן, בשעה משהו שאנחנו כבר לוקחים על 874 00:37:40,610 --> 00:37:48,361 מובן מאליו די הרבה זמן, אשר הוא בקובץ הזה שנקרא cs50.h. 875 00:37:48,361 --> 00:37:49,420 אז זה קובץ. 876 00:37:49,420 --> 00:37:51,130 אלה הם רק כל חבורה מהערות למעלה. 877 00:37:51,130 --> 00:37:53,900 ושאולי יש לי הסתכל על זה, אם אתה חטטת במכשיר. 878 00:37:53,900 --> 00:37:57,000 אבל מתברר שכל הזמן, כאשר אנו נהגנו להשתמש כמחרוזת 879 00:37:57,000 --> 00:38:01,130 מילה נרדפת, האמצעי שבעזרתו אנו הכריזו שנרדפו היה עם זה 880 00:38:01,130 --> 00:38:03,990 מילת המפתח typedef, להגדרת סוג. 881 00:38:03,990 --> 00:38:07,500 ואנחנו בעצם אומרים, לעשות מחרוזת שם נרדף לכוכב char. 882 00:38:07,500 --> 00:38:11,190 שבאמצעותו המחסנית יצר גלגלי עזר אלה המכונים 883 00:38:11,190 --> 00:38:12,040 המחרוזת. 884 00:38:12,040 --> 00:38:14,830 >> עכשיו הנה רק אב טיפוס לgetchar. 885 00:38:14,830 --> 00:38:17,350 אנחנו יכולים לראות את זה בעבר, אבל זה אכן מה שהיא עושה. getchar 886 00:38:17,350 --> 00:38:19,070 לא לוקח ארגומנטים, מחזיר char. 887 00:38:19,070 --> 00:38:21,340 getdouble לא לוקח ארגומנטים, מחזיר כפול. 888 00:38:21,340 --> 00:38:24,440 getfloat לא לוקח ארגומנטים, חוזר לצוף, וכן הלאה. 889 00:38:24,440 --> 00:38:27,270 getint הוא כאן. getlonglong הוא כאן. 890 00:38:27,270 --> 00:38:28,820 וgetstring הוא כאן. 891 00:38:28,820 --> 00:38:29,420 וזהו זה. 892 00:38:29,420 --> 00:38:33,080 קו סגול זה preprocessor אחר הוראה בגלל 893 00:38:33,080 --> 00:38:35,550 hashtag בתחילתו. 894 00:38:35,550 --> 00:38:35,870 >> בסדר. 895 00:38:35,870 --> 00:38:38,380 אז עכשיו תן לי ללכת לcs50.c. 896 00:38:38,380 --> 00:38:40,400 ואנחנו לא מדברים יותר מדי זמן על זה. 897 00:38:40,400 --> 00:38:43,280 אבל כדי לתת לכם הצצה של מה היה הולך על כל זה 898 00:38:43,280 --> 00:38:46,434 זמן, תן לי ללכת ל-- 899 00:38:46,434 --> 00:38:48,250 בואו נעשה getchar. 900 00:38:48,250 --> 00:38:51,050 אז getchar הוא בעיקר הערות. 901 00:38:51,050 --> 00:38:52,060 אבל זה נראה כך. 902 00:38:52,060 --> 00:38:54,800 אז זו הפונקציה הממשית getchar שאנחנו כבר 903 00:38:54,800 --> 00:38:56,055 לוקח כמובן מאליו קיים. 904 00:38:56,055 --> 00:38:59,370 ולמרות שאנחנו לא משתמשים בזה כי לעתים קרובות, אם בכלל, זה לפחות 905 00:38:59,370 --> 00:39:00,470 פשוט יחסית. 906 00:39:00,470 --> 00:39:02,580 אז זה שווה לקחת מבט מהיר על כאן. 907 00:39:02,580 --> 00:39:06,540 >> אז יש getchar לולאה אינסופית, בכוונה כך ככל הנראה. 908 00:39:06,540 --> 00:39:10,050 לאחר מכן הוא קורא - וזה סוג של שימוש חוזר בקוד נחמד שלנו את עצמנו כתבנו. 909 00:39:10,050 --> 00:39:11,220 היא מכנה getstring. 910 00:39:11,220 --> 00:39:12,460 כי מה שעושה את זה מתכוון להגיע char? 911 00:39:12,460 --> 00:39:14,730 ובכן, אתה יכול גם לנסות להשיג שורה שלמה של טקסט מהמשתמש ו 912 00:39:14,730 --> 00:39:16,940 אז פשוט מסתכל אחד של דמויות אלה. 913 00:39:16,940 --> 00:39:19,170 בקו 60, הנה קצת קצת בדיקת שפיות. 914 00:39:19,170 --> 00:39:21,610 אם getstring חזר ריק, בואו לא להמשיך. 915 00:39:21,610 --> 00:39:22,820 משהו השתבש. 916 00:39:22,820 --> 00:39:28,120 >> עכשיו זה מעצבן קצת אבל קונבנציונלי בג char מקסימום כנראה 917 00:39:28,120 --> 00:39:29,960 מייצג את מה בדיוק המבוסס על שמו? 918 00:39:29,960 --> 00:39:31,670 זה קבוע. 919 00:39:31,670 --> 00:39:36,040 זה כמו הערך המספרי של הגדול ביותר char אתה יכול לייצג עם 920 00:39:36,040 --> 00:39:40,370 ביס אחד, שהוא כנראה המספר 255, המהווה את המספר הגדול ביותר שלך 921 00:39:40,370 --> 00:39:42,720 מייצג שמונה סיביות, מתחיל מאפס. 922 00:39:42,720 --> 00:39:47,460 אז אני כבר משתמש בזה, בפונקציה זו, כאשר כתיבת קוד זה, רק משום 923 00:39:47,460 --> 00:39:51,753 אם משהו משתבש בgetchar אבל מטרתו בחיים היא לחזור 924 00:39:51,753 --> 00:39:54,830 char, אתה צריך להיות מסוגל איכשהו כדי לאותת למשתמש כי 925 00:39:54,830 --> 00:39:55,840 משהו השתבש. 926 00:39:55,840 --> 00:39:56,970 אנחנו לא יכולים להחזיר null. 927 00:39:56,970 --> 00:39:58,480 מתברר כי האפס הוא מצביע. 928 00:39:58,480 --> 00:40:01,030 ושוב, יש getchar כדי לחזור לדמות. 929 00:40:01,030 --> 00:40:04,760 >> אז האמנה, אם משהו לא לא נכון, הוא שאתה, המתכנת, או ב 930 00:40:04,760 --> 00:40:08,160 מקרה זה, אותי עם הספרייה, היה לי פשוט להחליט באופן שרירותי, אם 931 00:40:08,160 --> 00:40:12,230 משהו משתבש, אני הולך להחזיר את המספר 255, שהוא באמת 932 00:40:12,230 --> 00:40:17,240 אומר שאנחנו לא יכולים, המשתמש לא יכול להקליד התו מיוצג על ידי 933 00:40:17,240 --> 00:40:21,410 מספר 255, כי היו לנו לגנוב אותו כערך זקיף שנקרא ל 934 00:40:21,410 --> 00:40:23,410 לייצג את בעיה. 935 00:40:23,410 --> 00:40:27,010 עכשיו מתברר שדמות 255 זה לא משהו שאתה יכול להקליד על 936 00:40:27,010 --> 00:40:28,380 המקלדת שלך, כך שזה לא עניין גדול. 937 00:40:28,380 --> 00:40:30,910 המשתמש לא יבחין כי אני כבר נגנב הדמות הזאת. 938 00:40:30,910 --> 00:40:34,620 אבל אם אי פעם תראו בדפי איש על מערכת מחשב התייחסות מסוימת ל 939 00:40:34,620 --> 00:40:38,560 כל כמוסות מתמדת כמו זה שאומר, במקרים של טעות כוח מתמיד 940 00:40:38,560 --> 00:40:42,720 יוחזר, זה כל מה שאדם מסוים עשה לפני שנים היה באופן שרירותי החליט 941 00:40:42,720 --> 00:40:45,680 להחזיר ערך והמיוחד הזה קוראים לזה קבוע במקרה 942 00:40:45,680 --> 00:40:46,840 משהו משתבש. 943 00:40:46,840 --> 00:40:48,580 >> עכשיו הקסם קורה כאן למטה. 944 00:40:48,580 --> 00:40:52,600 ראשית, אני מצהיר בקו 67 שתי דמויות, C1 ו-C2. 945 00:40:52,600 --> 00:40:57,080 ולאחר מכן בקו 68, אין למעשה שורת קוד זה מזכיר 946 00:40:57,080 --> 00:41:01,140 ידידנו printf, בהתחשב בכך שאותו אין לי אחוזים CS במרכאות. 947 00:41:01,140 --> 00:41:06,490 אבל שים לב למה שקורה כאן. sscanf אומר סריקת מחרוזת - 948 00:41:06,490 --> 00:41:11,690 משמעות הדבר היא לסרוק מעוצב מחרוזת, sscanf ergo. 949 00:41:11,690 --> 00:41:12,590 מה זה אומר? 950 00:41:12,590 --> 00:41:16,310 זה אומר שאתה עובר לsscanf מחרוזת. 951 00:41:16,310 --> 00:41:18,420 וקו הוא כל מה המשתמש מקליד פנימה 952 00:41:18,420 --> 00:41:23,520 אתה עובר לsscanf מחרוזת פורמט כמו זה שאומר לי scanf מה הם 953 00:41:23,520 --> 00:41:25,870 אתה מקווה שהמשתמש הקליד פנימה 954 00:41:25,870 --> 00:41:29,730 לאחר מכן אתה עובר-בכתובות של שני נתחי הזיכרון, במקרה זה, 955 00:41:29,730 --> 00:41:31,150 כי יש לי שני מצייני מיקום. 956 00:41:31,150 --> 00:41:34,610 אז אני הולך לתת לו את הכתובת של C1 ואת הכתובת של C2. 957 00:41:34,610 --> 00:41:37,700 >> וזוכר שאתה נותן פונקציה כתובת של כמה משתנה, מה זה 958 00:41:37,700 --> 00:41:38,950 המשמעות? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 מה פונקציה שיכולה לעשות כתוצאה לתת לו את הכתובת של 961 00:41:45,050 --> 00:41:48,170 משתנה, בניגוד ל את המשתנה עצמו? 962 00:41:48,170 --> 00:41:49,450 זה יכול לשנות את זה, נכון? 963 00:41:49,450 --> 00:41:53,250 אם היה לך מישהו למפה פיזית כתובת, הם יכולים ללכת לשם ולעשות 964 00:41:53,250 --> 00:41:54,750 מה שהם רוצים באותה כתובת. 965 00:41:54,750 --> 00:41:55,800 אותו הרעיון כאן. 966 00:41:55,800 --> 00:41:59,950 אם אנו עוברים לsscanf, הכתובת של שתיים נתחי הזיכרון, אפילו זעירים אלה 967 00:41:59,950 --> 00:42:03,585 נתחים קטנים של זיכרון, C1 ו-C2, אבל אנחנו אומרים לו את הכתובת שלהם, 968 00:42:03,585 --> 00:42:05,170 sscanf יכול לשנות את זה. 969 00:42:05,170 --> 00:42:08,530 >> אז המטרה של sscanf בחיים, אם אנו קוראים דף האדם, הוא לקרוא את מה 970 00:42:08,530 --> 00:42:13,420 משתמש קליד ב, מקווה שלמשתמש יצטרך הקליד בתו ואולי 971 00:42:13,420 --> 00:42:16,470 דמות אחרת, וכל מה שהמשתמש הקליד, התו הראשון הולך 972 00:42:16,470 --> 00:42:19,310 כאן, התו השני הולך כאן. 973 00:42:19,310 --> 00:42:22,470 עכשיו, במאמר מוסגר, זה, ושהיית רק יודע שזה מהתיעוד, 974 00:42:22,470 --> 00:42:25,570 העובדה ששמתי את שטח ריק שיש רק אומר שלא אכפת לי אם 975 00:42:25,570 --> 00:42:28,440 המשתמש לוחץ על מקש הרווח כמה פעמים לפני שהוא או היא לוקחת 976 00:42:28,440 --> 00:42:30,400 אופי, אני הולך להתעלם כל חלל לבן. 977 00:42:30,400 --> 00:42:32,510 כך שאני יודע מ התיעוד. 978 00:42:32,510 --> 00:42:36,570 >> העובדה שיש% ג שני אחריו החלל לבן הוא למעשה 979 00:42:36,570 --> 00:42:37,410 מכוון. 980 00:42:37,410 --> 00:42:41,190 אני רוצה להיות מסוגל לזהות אם המשתמש דפוק או לא שתף ​​פעולה. 981 00:42:41,190 --> 00:42:45,630 אז אני מקווה שמשתמש הקליד בלבד בתו אחד, ולכן אני מקווה 982 00:42:45,630 --> 00:42:50,640 שsscanf הולך רק כדי לחזור ערך 1 כי, שוב, אם אני קורא 983 00:42:50,640 --> 00:42:55,400 התיעוד, המטרה של sscanf ב חיים הוא לחזור למספר 984 00:42:55,400 --> 00:42:59,170 משתנים שמולאו עם קלט משתמש. 985 00:42:59,170 --> 00:43:02,270 >> אני עברתי בשני משתנים כתובות, C1 ו-C2. 986 00:43:02,270 --> 00:43:06,420 אם כי אני מקווה,, שרק אחד שלהם מקבל נהרג כי אם sscanf 987 00:43:06,420 --> 00:43:11,130 2 חוזר, מה יש להניח המשמעות הגיונית? 988 00:43:11,130 --> 00:43:14,600 שהמשתמש לא רק תן לי אחד אופי כמו שאמרתי לו או לה. 989 00:43:14,600 --> 00:43:17,860 הם כנראה הקלידו ב שני תווים לפחות. 990 00:43:17,860 --> 00:43:22,430 אז אם אני במקום שלא הייתי לי שני % ג, פשוט היה לי אחד, אשר 991 00:43:22,430 --> 00:43:25,370 כנות יהיה אינטואיטיבי יותר גישה, אני חושב שמבט ראשון, 992 00:43:25,370 --> 00:43:30,220 אתה לא הולך להיות מסוגל לזהות אם המשתמש כבר נותן לך יותר 993 00:43:30,220 --> 00:43:31,780 קלט ממה שאתה באמת רוצה. 994 00:43:31,780 --> 00:43:34,100 אז זו צורה מרומזת מבדיקת שגיאות. 995 00:43:34,100 --> 00:43:35,640 >> אבל שים לב למה שאני עושה כאן. 996 00:43:35,640 --> 00:43:39,970 ברגע שאני בטוח שהמשתמש נתן לי אחד אופי, אני משחרר את הקו, עושה 997 00:43:39,970 --> 00:43:44,450 ההפך מgetstring, אשר בתורו משתמש malloc, ולאחר מכן אני חוזר 998 00:43:44,450 --> 00:43:51,030 C1, הדמות שקיוויתי סיפק למשתמש, ורק בתנאי. 999 00:43:51,030 --> 00:43:54,680 אז הבחין מהיר בלבד, אבל שאלות על getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 אנחנו נחזור לכמה מהאחרים. 1002 00:43:59,590 --> 00:44:03,770 >> ובכן, תן לי ללכת ולעשות את זה - נניח עכשיו, רק כדי להניע אותנו 1003 00:44:03,770 --> 00:44:08,910 דיון בשבוע בתוספת זמן, זה הוא קובץ שנקרא structs.h. 1004 00:44:08,910 --> 00:44:11,440 ושוב, זה רק טעם של משהו שנמצאת קדימה. 1005 00:44:11,440 --> 00:44:13,090 אבל שים לב שהרבה לכך היא תגובות. 1006 00:44:13,090 --> 00:44:17,440 אז הרשה לי להדגיש רק את חלק מעניין לעכשיו. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 יש שאותה מילת מפתח שוב. 1009 00:44:19,700 --> 00:44:23,100 typedef אנו משתמשים כדי להכריז על מחרוזת כסוג נתונים מיוחד. 1010 00:44:23,100 --> 00:44:27,490 אתה יכול להשתמש בtypedef כדי ליצור מותג חדש סוגי נתונים שלא היו קיימות בעת 1011 00:44:27,490 --> 00:44:28,570 C הומצא. 1012 00:44:28,570 --> 00:44:32,520 לדוגמה, int מגיע עם ג char מגיע עם ג הכפול מגיע עם C. אבל 1013 00:44:32,520 --> 00:44:34,000 אין שום רעיון של תלמיד. 1014 00:44:34,000 --> 00:44:37,230 ובכל זאת, זה יהיה די שימושי כדי להיות תוכל לכתוב תכנית שמאחסנת 1015 00:44:37,230 --> 00:44:40,440 במשתנה, מספר תעודת הזהות של תלמיד, השם שלהם, וביתם. 1016 00:44:40,440 --> 00:44:42,890 במילים אחרות, שלוש חתיכות של נתונים, כמו int ו 1017 00:44:42,890 --> 00:44:44,420 מחרוזת ומחרוזת אחרת. 1018 00:44:44,420 --> 00:44:48,220 >> עם typedef, מה זה די חזק על זה וsturct מילת המפתח 1019 00:44:48,220 --> 00:44:53,660 מבנה, שאתה, המתכנת בשנת 2013, בעצם יכול להגדיר את עצמך 1020 00:44:53,660 --> 00:44:57,530 סוגי נתונים שלא היו קיימים שנים לפני אבל שתתאימו למטרות שלך. 1021 00:44:57,530 --> 00:45:01,910 וכן כאן, בשורות 13 עד 19, אנחנו מכריזים סוג הנתונים חדש, כמו 1022 00:45:01,910 --> 00:45:04,320 int, אבל קוראים לזה תלמיד. 1023 00:45:04,320 --> 00:45:09,310 ובתוכו של משתנה זה הולך להיות שלושה דברים - int, מחרוזת, 1024 00:45:09,310 --> 00:45:09,930 ומחרוזת. 1025 00:45:09,930 --> 00:45:13,040 אז אתה יכול לחשוב על מה שבאמת קרה כאן, למרות שזה 1026 00:45:13,040 --> 00:45:17,160 קצת פישוט להיום, תלמיד הוא בעצם הולך 1027 00:45:17,160 --> 00:45:19,450 כדי להיראות כך. 1028 00:45:19,450 --> 00:45:22,580 שלה הולך להיות חתיכה זיכרון עם תעודת זהות, שם 1029 00:45:22,580 --> 00:45:25,580 שדה, ושדה בית. 1030 00:45:25,580 --> 00:45:30,670 ושנוכל להשתמש באותם גושים זיכרון ולגשת אליהם באופן הבא. 1031 00:45:30,670 --> 00:45:38,870 >> אם אני נכנסתי לstruct0.c, כאן הוא יחסית ארוך, אך בעקבות 1032 00:45:38,870 --> 00:45:42,630 דפוס, קוד ש משתמש בטריק החדש הזה. 1033 00:45:42,630 --> 00:45:45,790 אז קודם כל, הרשה לי להסב את תשומת לבך לחלקים המעניינים למעלה. 1034 00:45:45,790 --> 00:45:49,670 שארפ מגדיר סטודנטים 3, מצהיר תלמידים קבועים הנקראים ובאי 1035 00:45:49,670 --> 00:45:53,450 זה באופן שרירותי את המספר 3, רק אז יש לי שלושה סטודנטים המשתמשים 1036 00:45:53,450 --> 00:45:54,830 תכנית זו לעת עתה. 1037 00:45:54,830 --> 00:45:55,960 הנה בא ראשי. 1038 00:45:55,960 --> 00:45:58,860 ושים לב, איך אני מצהיר מערך של סטודנטים? 1039 00:45:58,860 --> 00:46:00,480 ובכן, אני פשוט להשתמש באותו התחביר. 1040 00:46:00,480 --> 00:46:02,110 המילה הוא כמובן התלמיד חדש. 1041 00:46:02,110 --> 00:46:04,790 אבל סטודנטים, תלמידים בכיתה, סוגר. 1042 00:46:04,790 --> 00:46:06,720 >> אז לצערי יש הרבה של שימוש חוזר של מונחים כאן. 1043 00:46:06,720 --> 00:46:07,660 זה רק מספר. 1044 00:46:07,660 --> 00:46:09,040 אז זה כמו לומר שלוש. 1045 00:46:09,040 --> 00:46:11,430 כיתה היא בדיוק מה שאני רוצה לקרוא למשתנה. 1046 00:46:11,430 --> 00:46:12,840 אני יכול לקרוא לזה סטודנטים. 1047 00:46:12,840 --> 00:46:15,880 אבל בכיתה, זה לא בכיתה מונחה עצמים מסוג ג'אווה של דרך. 1048 00:46:15,880 --> 00:46:17,220 זה רק בכיתה של תלמידים. 1049 00:46:17,220 --> 00:46:20,590 ואת סוג הנתונים של כל אלמנט במערך שהוא תלמיד. 1050 00:46:20,590 --> 00:46:23,040 אז זה קצת שונה ומלומר משהו 1051 00:46:23,040 --> 00:46:25,250 ככה, זה פשוט - 1052 00:46:25,250 --> 00:46:29,500 אני אומר תן לי שלושה סטודנטים וקורא בכיתה מערך זה. 1053 00:46:29,500 --> 00:46:29,800 >> בסדר. 1054 00:46:29,800 --> 00:46:30,680 עכשיו הנה לולאה ארבע. 1055 00:46:30,680 --> 00:46:33,480 מכיר את הבחור הזה - לחזר מאפס בעד שלוש. 1056 00:46:33,480 --> 00:46:35,160 והנה הקטע של תחביר החדש. 1057 00:46:35,160 --> 00:46:37,710 התכנית הולכת להנחות אותי, האנושי, כדי לתת לו תלמיד 1058 00:46:37,710 --> 00:46:39,200 מזהה, שהוא int. 1059 00:46:39,200 --> 00:46:44,650 והנה התחביר שבה אתה יכול לאחסן משהו בשדה מזהה ב 1060 00:46:44,650 --> 00:46:48,630 מיקום כיתת א אז סוגר תחביר זה אינו חדש. 1061 00:46:48,630 --> 00:46:51,450 זה רק אומר שייתן לי את השמיני תלמיד בכיתה. 1062 00:46:51,450 --> 00:46:52,940 אבל הסמל הזה הוא חדש. 1063 00:46:52,940 --> 00:46:56,320 עד עכשיו, אנחנו כבר לא יכולים לשמש נקודה, לפחות בקוד כזה. 1064 00:46:56,320 --> 00:47:01,490 משמעות דבר הוא ללכת לstruct המכונה תלמיד ולשים שם משהו. 1065 00:47:01,490 --> 00:47:05,670 באופן דומה, בשורה הבאה, 31, ללכת קדימה ולשים את מה שהמשתמש מקליד 1066 00:47:05,670 --> 00:47:10,530 לשם כאן, ומה שהם עושים עבור הבית, אותו הדבר, קדימה, 1067 00:47:10,530 --> 00:47:13,230 לשים אותו ב. בית. 1068 00:47:13,230 --> 00:47:15,955 >> אז מה עושה תכנית זו סופו של דבר לעשות? 1069 00:47:15,955 --> 00:47:17,220 אתה יכול לראות טיזר קטן שם. 1070 00:47:17,220 --> 00:47:24,780 תן לי ללכת קדימה ולעשות structs 0 נקודת לוכסן struct 0, תעודת הסטודנט של 1, 1071 00:47:24,780 --> 00:47:28,250 אומרים דוד מאת'ר, תעודת סטודנט 2. 1072 00:47:28,250 --> 00:47:32,070 רוב קירקלנד, תעודת סטודנט 3. 1073 00:47:32,070 --> 00:47:35,010 לורן Leverit - 1074 00:47:35,010 --> 00:47:38,380 והדבר היחיד שעשתה את התכנית הזאת, וזה רק שרירותי לחלוטין, הוא 1075 00:47:38,380 --> 00:47:40,980 אני רוצה לעשות משהו עם המידע הזה, עכשיו שאני כבר לימד אותנו איך 1076 00:47:40,980 --> 00:47:43,450 להשתמש structs, הוא פשוט היה לי זה לולאה נוספת כאן. 1077 00:47:43,450 --> 00:47:45,260 אני לחזר על המערך של תלמידים. 1078 00:47:45,260 --> 00:47:49,170 הייתי חבר שלנו, אולי עכשיו המוכר, מחרוזת להשוות, stircomp ל 1079 00:47:49,170 --> 00:47:53,780 סימון הוא ביתו של תלמיד ה -8 שווה מאת'ר? 1080 00:47:53,780 --> 00:47:56,760 ואם כן, פשוט להדפיס משהו באופן שרירותי כמו, כן, זה הוא. 1081 00:47:56,760 --> 00:47:59,430 אבל שוב, רק נותן לי הזדמנויות להשתמש ולעשות שימוש חוזר ו 1082 00:47:59,430 --> 00:48:02,270 שימוש חוזר בסימון הנקודה חדש זו. 1083 00:48:02,270 --> 00:48:03,250 >> אז למי אכפת, נכון? 1084 00:48:03,250 --> 00:48:06,270 לבוא עם תכנית סטודנט הוא במידה מסוימת שרירותי, אבל מסתבר 1085 00:48:06,270 --> 00:48:09,800 שאנחנו יכולים לעשות דברים מועילים עם זו, למשל באופן הבא. 1086 00:48:09,800 --> 00:48:14,600 זה הרבה יותר מסובך struct בג יש לו תריסר או יותר שדות, 1087 00:48:14,600 --> 00:48:15,880 במידה מסוימת בשם ולא פרשתי. 1088 00:48:15,880 --> 00:48:20,110 אבל אם אי פעם שמע על גרפיקה פורמט קובץ שנקרא מפת סיביות, BMP, זה 1089 00:48:20,110 --> 00:48:22,830 מתברר שקובץ בפורמט מפת הסיביות פחות או יותר נראה כמו שזה. 1090 00:48:22,830 --> 00:48:24,200 זה פרצוף סמיילי קטן טיפש. 1091 00:48:24,200 --> 00:48:27,840 זה תמונה קטנה שאני כבר זנקתי ב על די גדול, כך שאני יכול לראות זה את 1092 00:48:27,840 --> 00:48:30,410 של נקודות או פיקסלים הבודדים. 1093 00:48:30,410 --> 00:48:33,800 כעת, מתברר שאנחנו יכולים לייצג נקודה שחורה עם, יניח, את המספר 0. 1094 00:48:33,800 --> 00:48:35,520 ונקודה לבנה עם מספר 1. 1095 00:48:35,520 --> 00:48:39,140 >> אז במילים אחרות, אם אתה רוצה לצייר פרצוף מחייך ולשמור את התמונה שב 1096 00:48:39,140 --> 00:48:42,680 מחשב, זה מספיק כדי לאחסן ואפסים אלה שנראים כמו זה, שבו, 1097 00:48:42,680 --> 00:48:45,250 שוב, אלה הם לבנים ואפסים הם שחורים. 1098 00:48:45,250 --> 00:48:48,290 וביחד, אם יש לך ביעילות לשנס של אלה ואפסים, יש לך 1099 00:48:48,290 --> 00:48:51,030 רשת של פיקסלים, ואם אתה שכב אותם, יש לך חמוד 1100 00:48:51,030 --> 00:48:52,560 פרצוף סמיילי קטן. 1101 00:48:52,560 --> 00:48:58,150 עכשיו, פורמט קובץ מפת סיביות, BMP, הוא יעילות שמתחת למכסת המנוע, 1102 00:48:58,150 --> 00:49:00,970 אבל עם יותר פיקסלים SOT שאתה למעשה יכול לייצג את הצבעים. 1103 00:49:00,970 --> 00:49:05,170 >> אבל כאשר יש לך יותר מתוחכם פורמטים של קבצים כמו BMP ו-JPEG ו-GIF 1104 00:49:05,170 --> 00:49:09,360 שבה אתה יכול להיות מוכר, אלה קבצים בדיסק בדרך כלל לא רק 1105 00:49:09,360 --> 00:49:13,760 יש אפסים ואחדים לפיקסלים, אבל יש להם קצת מטה וכן - 1106 00:49:13,760 --> 00:49:16,960 מטה במובן זה שהוא לא ממש נתונים אבל זה שימושי. 1107 00:49:16,960 --> 00:49:21,370 אז השדות האלה כאן הם רומזים, ו אנחנו תראו את זה בפירוט רב יותר בP-סט 1108 00:49:21,370 --> 00:49:25,810 5, שלפני האפסים והאחדים ש מייצג את הפיקסלים בתמונה, 1109 00:49:25,810 --> 00:49:29,110 יש חבורה של מטה כמו גודל התמונה ו 1110 00:49:29,110 --> 00:49:30,250 רוחב של התמונה. 1111 00:49:30,250 --> 00:49:32,910 ושים לב שאני תולש את חלק דברים שרירותיים כאן - 1112 00:49:32,910 --> 00:49:34,260 רוחב וגובה. 1113 00:49:34,260 --> 00:49:36,160 ספירה קצת ועוד כמה דברים אחרים. 1114 00:49:36,160 --> 00:49:37,840 אז יש איזה מטה בקובץ. 1115 00:49:37,840 --> 00:49:41,470 >> אלא על ידי הבנת אופן שהקבצים ערוכים בדרך זו, אתה יכול למעשה 1116 00:49:41,470 --> 00:49:45,890 לאחר מכן לתפעל את התמונות, לשחזר תמונות מדיסק, לשנות את גודל תמונות. 1117 00:49:45,890 --> 00:49:47,560 אבל אתה לא יכול בהכרח לשפר אותם. 1118 00:49:47,560 --> 00:49:48,480 הייתי צריך לצלם. 1119 00:49:48,480 --> 00:49:52,840 אז חזרתי לRJ כאן, שאתה ראית על המסך לפני די הרבה זמן. 1120 00:49:52,840 --> 00:49:57,160 ואם אני פותח את Keynote כאן, זה הוא מה קורה אם אתה מנסה להתקרב ו 1121 00:49:57,160 --> 00:49:59,380 לשפר RJ. 1122 00:49:59,380 --> 00:50:01,480 הוא לא משתפר באמת. 1123 00:50:01,480 --> 00:50:06,240 עכשיו מרכזי הוא סוג של טשטושו קצת, רק כדי לחפות על 1124 00:50:06,240 --> 00:50:11,040 עובדה שאינו מקבל RJ במיוחד משופר בעת להתמקד פנימה 1125 00:50:11,040 --> 00:50:13,310 ואם עושה את זה ככה, לראות את הריבועים? 1126 00:50:13,310 --> 00:50:15,490 כן, אתה בהחלט יכול לראות הריבועים על מקרן. 1127 00:50:15,490 --> 00:50:17,690 >> זה מה שאתה מקבל כשאתה לשפר. 1128 00:50:17,690 --> 00:50:22,570 אבל בהבנה כיצד RJ או הסמיילי מיושם יאפשר לנו 1129 00:50:22,570 --> 00:50:24,950 בעצם לכתוב קוד שמתפעל את הדברים האלה. 1130 00:50:24,950 --> 00:50:29,970 ואני חשבתי שאני רוצה לסיים בנקודה הזאת, עם 55 שניות של לשפר את זה, 1131 00:50:29,970 --> 00:50:31,230 אני מעז, אומר ולא מטעה. 1132 00:50:31,230 --> 00:50:32,990 >> [השמעת וידאו] 1133 00:50:32,990 --> 00:50:34,790 >> -הוא משקר. 1134 00:50:34,790 --> 00:50:38,310 על מה, אני לא יודע. 1135 00:50:38,310 --> 00:50:41,200 >> -אז מה אנחנו יודעים? 1136 00:50:41,200 --> 00:50:45,280 >> זה בשעה 9:15-ריי Santoya היה בכספומט. 1137 00:50:45,280 --> 00:50:47,830 >> -אז השאלה היא מה הוא עושה בשעה 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> ירי תשעה המילימטר במשהו. 1139 00:50:50,750 --> 00:50:52,615 אולי הוא ראה את הצלף. 1140 00:50:52,615 --> 00:50:54,760 >> האור היה לעבוד איתו. 1141 00:50:54,760 --> 00:50:56,120 >> -המתן. 1142 00:50:56,120 --> 00:50:57,450 חזור אחד. 1143 00:50:57,450 --> 00:50:58,700 >> , מה אתה רואה? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> , להביא את פניו, מסך מלא. 1146 00:51:09,490 --> 00:51:09,790 >> -משקפיים. 1147 00:51:09,790 --> 00:51:11,040 >> -יש השתקפות. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -זה קבוצת בייסבול Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 זה הלוגו שלהם. 1151 00:51:24,530 --> 00:51:27,040 >> , והוא מדבר לכל מי שהוא לובש מעיל ש. 1152 00:51:27,040 --> 00:51:27,530 >> [השמעת וידאו הסוף] 1153 00:51:27,530 --> 00:51:29,180 >> דוד י Malan: זה להגדיר בעיה 5. 1154 00:51:29,180 --> 00:51:30,720 אנחנו אראה אותך בשבוע הבא. 1155 00:51:30,720 --> 00:51:32,330 >> רמקול גברי: בCS50 הבא. 1156 00:51:32,330 --> 00:51:39,240 >> [צרצרים מצייץ] 1157 00:51:39,240 --> 00:51:41,270 >> [השמעת מוסיקה]