[Chơi nhạc] DAVID J. Malan: Được rồi. [Cười] Chào mừng trở lại. Đây là CS50. Và điều này cuối tuần năm. Và cho đến bây giờ, chúng tôi đã khá nhiều được dùng cho các cấp có tồn tại trình biên dịch này, kêu vang, mà bạn đã được gọi bằng cách này công cụ khác được gọi là làm cách nào đó kỳ diệu chuyển đổi mã nguồn của bạn vào mã đối tượng, các số không và những người thân rằng các máy tính CPU của bạn, trung tâm đơn vị chế biến, thực sự hiểu được. Nhưng hóa ra đó là một con số đó là đang diễn ra bên dưới mui xe trong giữa đầu vào và đầu ra. Và tôi muốn đề nghị chúng ta thịt mà trong một ít chi tiết hơn vào bốn bước, có một cái gì đó gọi là tiền xử lý, một cái gì đó được gọi là biên dịch, mà chúng ta đã thấy, một cái gì đó gọi là lắp ráp, và một cái gì đó gọi là liên kết. Vì vậy, cho đến bây giờ, trong một số của chúng tôi các chương trình, chúng tôi đã mạnh bao gồm. Gần đây chúng tôi đã có một số sắc nét định nghĩa cho các hằng số. Vì vậy, nó chỉ ra rằng những điều mà được bắt đầu với biểu tượng băm hoặc biểu tượng bảng là tiền xử lý chỉ thị. Đó chỉ là một cách nói đó là một dòng mã thực sự chuyển đổi thành một cái gì đó khác trước khi máy tính thậm chí cố gắng để chuyển đổi của bạn chương trình thành số không và những người thân. Ví dụ, sắc nét bao gồm các tiêu chuẩn I / O. H, khá nhiều chỉ có nghĩa là đi phía trước, lấy nội dung của các tập tin stdio.h và dán chúng ngay tại đó. Vì vậy, không có số không và những người thân tại thời điểm đó được nêu ra. Nó thực sự chỉ là một thay thế. Và đó là thực hiện trong cái gọi là giai đoạn tiền xử lý, khi bạn thực sự chạy kêu vang hoặc cụ thể Thực hiện trong hầu hết các trường hợp. Vì vậy, tất cả điều này đã xảy ra đầu tiên tự động cho đến nay. Sau đó đến các bước biên dịch. Nhưng chúng tôi đã được đơn giản hóa quá biên dịch. Biên soạn một chương trình thực sự có nghĩa là mang nó từ một cái gì đó như C, mã nguồn, chúng tôi đã viết, giảm một cái gì đó gọi là lắp ráp. Ngôn ngữ lắp ráp là một mức độ thấp hơn ngôn ngữ đó, may mắn thay, chúng tôi sẽ không có nhiều cơ hội để viết trong học kỳ này. Nhưng nó ở mức thấp nhất trong nghĩa là bạn có nghĩa là bắt đầu viết thêm và trừ và nhân và tải từ bộ nhớ và lưu vào bộ nhớ, hướng dẫn rất cơ bản mà một máy tính, bên dưới mui xe, thực sự hiểu được. Cuối cùng, lắp ráp mất ngôn ngữ đến số không và những người mà chúng tôi đã được mô tả cho đến nay. Và thực sự cuối cùng, có cái gọi là liên kết giai đoạn, trong đó chúng tôi sẽ thấy chỉ trong một thời điểm, trong đó kết hợp số không và những người thân với số không và bạn những người khác trước khi bạn đã tạo ra. Vì vậy, xem xét chương trình này rất dễ. Đó là từ Tuần 1. Nó chỉ nói, Xin chào thế giới, trên màn hình. Chúng tôi chạy này thông qua kêu vang. Hoặc chúng ta chạy nó thông qua Hãy mà chạy kêu vang. Và xuất ra vào thời điểm mà một số không và những người thân. Nhưng hóa ra có một bước trung gian. Nếu tôi đi qua đây - tiếc, đã không muốn nhìn thấy anh ấy chưa. Nếu tôi đi qua đây vào thiết bị của tôi và tôi mở ra hello.c, đây là cùng một chương trình. Và những gì tôi sẽ làm trong thiết bị đầu cuối của tôi cửa sổ ở đây là tôi sẽ chạy kêu vang hơn là làm, mà tự động hóa tất cả bốn những bước cho chúng tôi. Và tôi sẽ làm kêu vang-S và sau đó hello.c và sau đó nhập. Và tôi nhận được một dấu nhắc nhấp nháy một lần nữa, đó là tốt. Và bây giờ trong một cửa sổ lớn hơn một chút, Tôi sẽ mở gedit ở đây. Và tôi sẽ mở ra một tập tin đó, Hóa ra, được gọi là hello.s này chứa ngôn ngữ lắp ráp Tôi đề cập trước đó. Và đây là những gì được gọi là lắp ráp ngôn ngữ, mức khá thấp hướng dẫn CPU Intel của bạn hoặc bất cứ điều gì đó là bên trong hiểu được. Và mov là cho di chuyển. gọi là cho gọi điện thoại, một chức năng rất thấp. phụ là trừ. Vì vậy, khi bạn có một CPU cụ thể bên trong máy tính của bạn, những gì làm cho nó khác biệt, so với các CPU trên thị trường, được hướng dẫn mà nó hiểu và thường xuyên như thế nào hiệu quả nó là, nhanh như thế nào là thực hiện một số của những người hướng dẫn. Bây giờ để biết thêm về điều này, bạn có thể CS61 mùa thu tiếp theo tại các trường đại học. Nhưng ở đây chúng tôi có, ví dụ, một vài định danh có thể trông quen thuộc. hello.c là tên của chương trình. Văn bản -. không có nhiều quan tâm có chỉ bây giờ, nhớ lại rằng các văn bản phân khúc, như của Thứ hai, là nơi mà trong bộ nhớ chương trình của bạn thực sự kết thúc. Vì vậy, đó là ít nhất một cách mơ hồ quen thuộc đó. Ở đây, tất nhiên, là một đề cập đến chức năng chính của chúng tôi. Di chuyển xuống, những tham khảo điều gọi là đăng ký, khối rất nhỏ của bộ nhớ bên trong CPU thực tế của bạn. Và nếu tôi di chuyển xuống thậm chí hơn nữa, tôi thấy một số loại đề cập gián tiếp của ASCII. Và ở đó, thực sự, là chuỗi, xin chào, dấu phẩy, thế giới. Vì vậy, câu chuyện dài ngắn, điều này đã được xảy ra cho bạn, tự động, bên dưới mui xe của tất cả các thời gian này. Và những gì đã xảy ra thực sự là một lần bạn đã chạy kêu vang, hoặc bằng cách Thực hiện, bạn đang nhận được đầu tiên, từ mã nguồn, cái gọi là ngôn ngữ lắp ráp. Sau đó kêu vang là chuyển đổi lắp ráp này ngôn ngữ xuống đến số không và những người thân. Và đây là hoạt động mà chúng tôi bắt đầu thảo luận của chúng tôi trong tuần 0 trên - và sau đó 1 tuần trên. Và cuối cùng, những số không và những người thân được kết hợp với các số không và những người thân từ các thư viện chúng tôi đã được tham gia cho các cấp như tiêu chuẩn I / O hoặc Chuỗi Thư viện hoặc thậm chí thư viện CS50. Vì vậy, để vẽ hình ảnh này hơn trực quan, chúng ta có hello.c. Và, tất nhiên, sử dụng printf chức năng để nói, xin chào thế giới. Các bước biên dịch mất nó xuống tập tin đó, chúng tôi chỉ thấy hello.s, thậm chí mặc dù đó là thường bị xóa tự động cho bạn. Nhưng đó là mã lắp ráp trong các bước trung gian. Và sau đó khi chúng tôi lắp ráp lắp ráp ngôn ngữ, có thể nói, đó là khi bạn có được những số không và những người thân. Vì vậy, chúng tôi đã thu nhỏ trong hiệu quả ngày hôm nay trên những gì chúng ta đã được dùng cho các cấp, có nghĩa là đi mã nguồn phản đối mã. Nhưng cuối cùng, bây giờ mà cùng một hình ảnh - chúng ta hãy đẩy nó qua phía bên tay trái. Và lưu ý rằng trong đầu có Tôi đã đề cập stdio.h. Đó là một tập tin mà chúng tôi đã bao gồm trong gần như tất cả các chương trình chúng tôi đã viết. Và đó là tập tin có nội dung được sao chép dán, hiệu quả trên mã của bạn. Nhưng nó chỉ ra rằng, trên một máy tính hệ thống nơi nào đó, có lẽ là một tập tin stdio.c rằng ai đó đã viết năm trước mà thực hiện tất cả các chức năng đã được tuyên bố trong stdio.h. Bây giờ trong thực tế nó có thể là không trên Mac của bạn hoặc máy tính của bạn hoặc thậm chí trong CS50 thiết bị là một mã C thô. Ai đó đã biên dịch nó và bao gồm O. Tập tin cho mã đối tượng hay. Một tập tin, trong đó đề cập đến một thư viện chia sẻ đó là được cài đặt sẵn và biên dịch trước cho bạn. Nhưng giả sử rằng có thực sự tồn tại stdio.c trên máy tính của chúng tôi song song với Clang. Mã của bạn đang được biên soạn và lắp ráp. đang stdio.c 's đang được biên soạn và lắp ráp, để điều này cuối cùng bước, xuống đây, chúng ta phải bằng cách nào đó liên kết, có thể nói, số không và những người thân của bạn với số không và những người thân của mình vào một trong chương trình đơn giản mà cuối cùng là được gọi là chỉ Xin chào. Vì vậy, đó là tất cả sự kỳ diệu đó là đã xảy ra cho đến nay. Và sẽ tiếp tục sử dụng quá trình cho các cấp, nhưng nhận ra có rất nhiều chi tiết ngon ngọt đang diễn ra bên dưới đó. Và đây là những gì làm cho bạn máy tính với Intel bên trong đặc biệt là khác biệt. Vì vậy, trên lưu ý rằng, nếu bạn muốn tham gia với chúng tôi để ăn trưa thứ sáu này, làm đi đến nơi cs50.net/rsvp bình thường, 13:15 thứ sáu này. Và bây giờ là một vài thông báo. Vì vậy, chúng tôi có một số tin tốt. Và chúng tôi có một số tin xấu. Bắt đầu với một số tin tốt đây. [Rên rỉ] Được rồi. Vâng, đó là kỹ thuật một kỳ nghỉ, vì vậy nó không phải là quá nhiều một món quà từ chúng tôi. Nhưng sau đó những tin tức xấu của khóa học. [Rên rỉ] Tôi đã dành rất nhiều thời gian trên những hình ảnh động. [Cười] Sẽ có một phiên xét này đến thứ hai. Nó sẽ là lúc 5:30 AM. Chúng tôi sẽ nhắc nhở bạn về tất cả những chi tiết này qua email trên của khóa học trang web chỉ trong một vài ngày thời gian. Nó sẽ được quay và làm sẵn có ngay sau đó. Vì vậy, nếu bạn không thể làm cho rằng thứ hai khe cắm đêm, đừng lo lắng. Phần tuần này cũng sẽ tập trung vào việc xem xét cho các bài kiểm tra. Nếu phần của bạn là vào thứ hai, đó là trường đại học thực sự kỳ nghỉ, chúng tôi sẽ vẫn đáp ứng trong phần. Nếu bạn chỉ đơn giản là không thể làm cho rằng phần bởi vì bạn sẽ xa, đó là tốt. Tham dự một ngày chủ nhật hoặc phần thứ ba hay điều chỉnh trong mục Jason, đó là có sẵn trực tuyến. Vì vậy, thông tin xấu. Vì vậy, theo các giáo trình, chúng tôi có bài giảng vào thứ sáu tới. Nhưng những tin tức tốt - rõ ràng, tôi đã dành quá nhiều thời gian về điều này. [Cười] Chúng tôi sẽ hủy bỏ sau bài giảng hôm thứ Sáu. Vì vậy, đó sẽ là một món quà cho chúng tôi, vì vậy bạn thực sự có thể có một thời gian nghỉ ngơi ngơi thoải mái tại giữa tuần này và do đó hai tuần. Vì vậy, không có bài giảng vào tuần tới, chỉ là một nhỏ ít bài kiểm tra, trong đó bạn sẽ có việc ngày càng phấn khích. Vì vậy, bây giờ chúng ta chuyển sự chú ý của chúng tôi để một cái gì đó thực sự là trực quan hơn và thú vị hơn và thiết lập các giai đoạn cho những gì sẽ là trên đường chân trời chỉ trong một vài tuần thời gian. Sau khi các bài kiểm tra đầu tiên, chúng tôi sẽ biến tập trung của bộ vấn đề của chúng tôi khác vấn đề tên miền cụ thể, đó là pháp y, an ninh nói chung. Trong thực tế, truyền thống với vấn đề này thiết lập là cho tôi một trong những giảng dạy đồng hoặc CA để đi bộ qua khuôn viên trường tham gia một số hình ảnh của mang tính chất nhưng không người rõ ràng, địa điểm, hoặc điều gì đó, sau đó mỗi năm tôi bằng cách nào đó quản lý để vô tình xóa hoặc làm hỏng thẻ phương tiện truyền thông kỹ thuật số đó là bên trong của máy ảnh của chúng tôi. Nhưng không có việc lớn. Tôi có thể đi trước và cắm đó vào máy tính của tôi. Tôi có thể làm cho một hình ảnh pháp y của nó, vì vậy để nói chuyện, bằng cách sao chép các số không và những người ra điều đó thẻ nhớ, cho dù một thẻ SD hoặc thẻ flash nhỏ gọn hoặc bất cứ điều gì bạn đang quen thuộc với. Và sau đó chúng ta có thể đưa ra ngoài. Và do đó, thách thức phía trước, trong số khác việc cho bạn, sẽ được để viết C mã phục hồi một bó toàn bộ JPEG cho tôi và tiết lộ sẽ những người, địa điểm, hoặc những thứ. Và chúng tôi cũng sẽ nói, trong vấn đề này thiết lập và trong những ngày tới, về đồ họa nói chung. Chúng tôi đã sử dụng chúng, một khóa học, cho thoát ra khỏi. Nhưng bạn đã loại dùng cho các cấp có tồn tại những khái niệm cao cấp của hình chữ nhật và hình bầu dục. Nhưng bên dưới mui xe có pixel. Và bạn đã có để bắt đầu suy nghĩ về những người. Hoặc bạn sẽ cho p-bộ 4 phải suy nghĩ về khoảng cách giữa các viên gạch của bạn, làm thế nào nhanh chóng, bạn đang bóng di chuyển trên màn hình để thoát ra khỏi. Do đó, khái niệm này của chấm trên màn hình của bạn đó là đi vào chơi đã. Bây giờ những gì bạn thấy, mặc dù, là những gì bạn nhận được trên một màn hình máy tính. Nếu bạn đã từng xem một số tốt hay TV xấu, tỷ lệ cược là họ khá nhiều xử lý các đối tượng như technophobes người không thực sự biết nhiều về máy tính. Và vì vậy nó rất dễ dàng cho cảnh sát thám tử nói, có thể bạn làm sạch mà lên cho tôi? Hoặc nâng cao, phải không? Nâng cao giống như từ dư luận trong hầu hết bất kỳ chương trình liên quan đến tội phạm. Và thực tế là nếu bạn có một rất hình mờ của một nghi can làm một cái gì đó xấu, bạn có thể không chỉ nâng cao nó. Bạn không thể phóng to vô hạn. Bạn không thể nhìn thấy trong ánh mắt của một ai đó mắt người cam kết tội phạm đặc biệt, mặc dù Tỷ lệ này trên truyền hình. Và như vậy với chúng ta hãy động viên rằng vấn đề sắp tới thiết lập với một cái nhìn một số chương trình mà bạn có thể là quen thuộc. [VIDEO xem lại] -OK. Bây giờ, chúng ta có được một cái nhìn tốt ở bạn. -Giữ nó. Chạy trở lại đó. -Đợi một chút. Đi ngay. -Có. Đóng băng đó. -Toàn màn hình. -OK. Đóng băng đó. -Thắt chặt trên đó, sẽ ya? -Vector trong trên anh chàng đó bởi các bánh xe lại. -Phóng to ngay tại chỗ này. -Với các thiết bị bên phải, chụp ảnh có thể được mở rộng và sắc nét. -Cái gì thế? -Đây là một chương trình nâng cao. -Anh có thể rõ ràng rằng bất kỳ? -Tôi không biết. Chúng ta hãy nâng cao nó. -Tăng cường phần A-6. -Tôi tăng cường chi tiết và - -Tôi nghĩ rằng có đủ để nâng cao. Phát hành nó để màn hình của tôi. -Tăng cường sự phản chiếu trong mắt cô. -Hãy chạy qua này Video nâng cao. -Edgar, bạn có thể nâng cao này? -Chờ một chút. -Tôi đã làm việc trên phản ánh điều này. -Có người phản ánh của. Phản chiếu. -Có một sự phản ánh khuôn mặt của người đàn ông. -Những phản ánh. -Có một sự phản ánh. -Phóng to trên gương. -Bạn có thể thấy một sự phản ánh. -Anh có thể nâng cao hình ảnh từ đây? -Anh có thể nâng cao anh phải ở đây? -Anh có thể nâng cao nó? -Anh có thể nâng cao nó? -Chúng ta có thể nâng cao này? -Anh có thể nâng cao nó? -Giữ trên một giây, tôi sẽ nâng cao. -Phóng to cửa. -X10. -Zoom. [Cười] -Di chuyển in -Khoan đã, dừng lại. -Stop. -Tạm dừng nó. Xoay 75 độ xung quanh dọc xin. [Cười] -Stop, và trở lại một phần về cửa. -Có một tăng cường hình ảnh mà có thể bitmap? -Có lẽ chúng ta có thể sử dụng Pradeep Sen phương pháp để xem vào cửa sổ. -Phần mềm này là nhà nước của nghệ thuật. -Giá trị biểu tượng tắt. -Với sự kết hợp các thuật toán. -Ông ta đưa các thuật toán chiếu sáng để cấp độ tiếp theo và tôi có thể sử dụng chúng để nâng cao bức ảnh này. -Lock và mở rộng các trục z. -Tăng cường. -Tăng cường. -Tăng cường. -Freeze và nâng cao. [END xem video] DAVID J. Malan: Vì vậy, vấn đề Set 5 là những gì ở phía trước đó. Vì vậy, chúng tôi sẽ sớm có được một sự hiểu biết tốt hơn khi nào và tại sao bạn có thể và chúng tôi không thể nâng cao theo cách đó. Nhưng trước tiên, chúng ta hãy trở lại sự chú ý của chúng tôi với một số các khối xây dựng, chúng tôi sẽ cần để có thể kể câu chuyện đó. Vì vậy, nhớ lại rằng chúng tôi đã thu hút hình ảnh này trên Thứ hai và một chút vào tuần trước. Và điều này mô tả cách bố trí của điều trong bộ nhớ máy tính của bạn khi chạy một số chương trình. Phân khúc công nghệ lên hàng đầu, thu hồi, đề cập đến số không và những người thực tế mà soạn chương trình của bạn. Có, dưới đây, một số khởi tạo hoặc dữ liệu chưa được khởi tạo, mà thường quan tới nhiều thứ như các hằng số hoặc dây hoặc các biến toàn cầu có được khai báo trước. Có đống, nhưng chúng tôi sẽ trở lại cho rằng trong một chút. Và sau đó có các ngăn xếp. Giống như một chồng khay trong quán cà phê, đây là nơi mà bộ nhớ được lớp và lớp bất cứ khi nào bạn làm những gì trong một chương trình? Việc sử dụng ngăn xếp là gì? Yeah? Gọi chức năng. Bất cứ lúc nào bạn gọi một chức năng, đó là cho mảnh bộ nhớ cho nó biến địa phương hoặc tham số của nó. Và những bức tranh, chúng ta thấy rằng với mỗi chức năng liên tiếp được gọi là, khi A cuộc gọi B gọi C gọi D, họ được xếp lớp vào ngăn xếp. Và trong mỗi của những lát bộ nhớ cơ bản là một phạm vi độc đáo cho chức năng đó, trong đó, tất nhiên, là vấn đề nếu bạn muốn bàn tay từ một chức năng khác Một mảnh dữ liệu mà bạn muốn nó để biến đổi hoặc thay đổi. Vì vậy, những gì đã được giải pháp của chúng tôi để cho phép Một chức năng đại diện bởi một chồng khung để thay đổi bộ nhớ trong của một khung stack? Làm thế nào để hai nói chuyện với nhau? Vì vậy, bằng cách của con trỏ hoặc địa chỉ, trong đó, một lần nữa, chỉ cần mô tả nơi trong bộ nhớ, bằng cách của một cụ thể số cắn, đặc biệt là các giá trị có thể được tìm thấy. Vì vậy, nhớ lại lần cuối cùng chúng ta cũng tiếp tục những câu chuyện và nhìn vào một khá lỗi chương trình. Và chương trình này là lỗi cho một vài lý do, nhưng một trong những điều đáng lo ngại nhất là bởi vì nó không kiểm tra những gì? Vâng, nó không kiểm tra đầu vào. Xin lỗi? Nếu đó là hơn 12 ký tự. Vì vậy, rất thông minh, khi gọi memcopy, trong đó, như tên cho thấy, chỉ bản sao bộ nhớ từ số thứ hai của mình vào số đầu tiên của nó. Đối số thứ ba, rất thông minh, là kiểm tra để chắc chắn rằng bạn làm không sao chép nhiều hơn, trong trường hợp này, độ dài của thanh, số ký tự, vào các điểm đến, đó chính là mảng C. Nhưng vấn đề là những gì nếu C tự nó không đủ lớn để xử lý đó? Bạn sẽ sao chép các số byte mà bạn đã được đưa ra. Nhưng những gì bạn thực sự có nhiều byte hơn bạn có chỗ cho? Vâng, chương trình này rất ngu ngốc chỉ một cách mù quáng tiến hành để có bất cứ điều gì nó cho, xin chào dấu chéo ngược là 0 tuyệt vời nếu chuỗi ngắn đủ, như năm ký tự. Nhưng nếu nó thực sự là 12 ký tự hoặc 1.200 ký tự, chúng ta đã thấy lần cuối cùng mà bạn chỉ cần đi để hoàn toàn ghi đè lên bộ nhớ không thuộc về bạn. Và trường hợp xấu nhất, nếu bạn ghi đè lên phần màu đỏ có mà chúng ta gọi là địa chỉ trở lại - đây chỉ là nơi mà máy tính tự động, cho bạn, đằng sau hậu trường, thâu nhỏ đi một giá trị 32-bit nhắc nhở nó những gì nó cần địa chỉ trở lại khi foo, chức năng này khác, được thực hiện thực hiện. Đó là một bánh cốm của các loại mà nó trả về. Nếu bạn ghi đè lên, có khả năng, nếu bạn là người xấu, có thể có thể có khả năng đảm nhận máy tính của ai đó. Và bạn sẽ chắc chắn nhất sụp đổ nó trong nhiều trường hợp. Bây giờ vấn đề này chỉ làm trầm trọng thêm như chúng tôi bắt đầu nói về bộ nhớ quản lý nói chung. Và malloc, cấp phát bộ nhớ, là một chức năng mà chúng ta có thể sử dụng để phân bổ bộ nhớ khi chúng ta không biết trước chúng ta có thể cần một số. Vì vậy, ví dụ, nếu tôi quay trở lại để thiết bị ở đây. Và tôi mở ra từ lần cuối cùng hello2.c, nhớ lại chương trình này ở đây, mà nhìn một chút gì đó như thế này, chỉ ba đường - nêu tên của bạn, sau đó tên chuỗi, bên trái, bằng getString. Và sau đó chúng tôi in ra, tên của người dùng. Vì vậy, đây là một chương trình rất dễ. Để được rõ ràng, hãy để tôi đi trước và làm cho hello-2. Tôi sẽ làm chấm dấu gạch chéo hello-2. Xưng danh của mình - David. Nhập. Xin chào David. Có vẻ như làm việc OK. Nhưng những gì đang thực sự xảy ra bên dưới mui xe đây? Đầu tiên, hãy bóc một số lớp. Chuỗi chỉ là một từ đồng nghĩa chúng tôi đã nhận ra để làm gì? Sao char. Vì vậy, hãy làm cho nó nhiều hơn một chút phức tạp nhưng hơn về mặt kỹ thuật chính xác mà này là một ngôi sao char, có nghĩa là tên, có, là một biến. Nhưng những gì các cửa hàng tên là địa chỉ của một char, mà cảm thấy một chút lạ bởi vì tôi nhận được trở lại một chuỗi. Tôi nhận được trở lại nhiều ký tự không phải là một char. Nhưng tất nhiên, bạn chỉ cần là người đầu tiên địa chỉ của char để nhớ nơi toàn bộ chuỗi là vì lý do tại sao? Làm thế nào để bạn tìm ra nơi kết thúc chuỗi là biết ngay từ đầu? Các dấu gạch chéo ngược không. Vì vậy, với hai đầu mối bạn tìm ra trước khi bắt đầu và kết thúc bất kỳ chuỗi là, miễn là họ hình thành đúng với null mà terminator, mà dấu gạch chéo ngược không. Nhưng điều này được gọi getString. Và nó quay ra rằng getString tất cả các thời gian này đã được loại gian lận đối với chúng tôi. Nó được làm công việc này, để đảm bảo, nhận được một chuỗi từ người sử dụng. Nhưng mà là bộ nhớ được đến từ đâu? Nếu chúng ta quay trở lại với hình ảnh ở đây và áp dụng định nghĩa từ một thời điểm trước đây, rằng ngăn xếp là nơi bộ nhớ đi khi chức năng này được gọi là, theo logic đó, khi bạn gọi getString, và sau đó tôi gõ D-A-V-I-D Nhập, mà là D-A-V-I-D dấu gạch chéo ngược không được lưu trữ trên cơ sở câu chuyện chúng tôi đã nói với chúng tôi cho đến nay? Nó có vẻ như là trong ngăn xếp, phải không? Khi bạn gọi nhận được chuỗi bạn nhận được một phần nhỏ của bộ nhớ trên stack. Vì vậy, nó đứng vào lý do mà D-A-V-I-D dấu gạch chéo ngược không được lưu trữ có trong stack. Nhưng chờ một phút, GetString lợi nhuận chuỗi, có thể nói, có nghĩa là đó là khay từ quán cà phê được lấy ra khỏi ngăn xếp. Và chúng tôi đã nói lần cuối cùng ngay sau khi một trở về chức năng, và bạn mất rằng khay, có thể nói, ra khỏi ngăn xếp, những gì bạn có thể giả định về những tàn tích của bộ nhớ? Tôi loại redrew họ như dấu hỏi bởi vì họ có hiệu quả trở thành giá trị không rõ. Họ có thể được tái sử dụng khi một số chức năng tiếp theo được gọi là. Nói cách khác, nếu chúng ta xảy ra được lưu trữ - Tôi sẽ vẽ một hình ảnh nhanh chóng đây của ngăn xếp. Nếu chúng ta tình cờ được vẽ phía dưới của phân đoạn bộ nhớ của tôi, và chúng tôi sẽ nói rằng đây là nơi bộ nhớ chiếm đóng bởi chính và có thể arg c và arg v và bất cứ điều gì khác trong chương trình, khi getString được gọi là, có lẽ getString được một đoạn bộ nhớ ở đây. Và sau đó D-A-V-I-D bằng cách nào đó kết thúc trong chức năng này. Và tôi sẽ đơn giản hóa. Nhưng hãy giả định rằng nó D-A-V-I-D dấu gạch chéo ngược không. Vì vậy, số byte này được sử dụng trong khung cho getString. Nhưng ngay sau khi trở về getString, chúng tôi cho biết lần cuối cùng mà bộ nhớ này trên đây tất cả sẽ trở thành - woops - tất cả trở nên bị xóa một cách hiệu quả. Và chúng ta có thể nghĩ về điều này bây giờ là câu hỏi đánh dấu bởi vì những người biết những gì sẽ trở thành bộ nhớ. Thật vậy, tôi rất thường xuyên gọi chức năng khác hơn getString. Và ngay sau khi tôi gọi một số khác chức năng hơn getString, có thể không trong chương trình đặc biệt này, chúng tôi chỉ nhìn tại nhưng một số khác, chắc chắn một số khác chức năng có thể sẽ được đưa ra vị trí tiếp theo trong stack. Vì vậy, nó không thể là các cửa hàng getString D-A-V-I-D trên ngăn xếp bởi vì tôi sẽ ngay lập tức mất quyền truy cập vào nó. Nhưng chúng tôi biết họ GetString chỉ trả về những gì? Nó không trở lại tôi sáu ký tự. Những gì là nó thực sự trở về không chúng tôi kết luận thời gian qua không? Địa chỉ của người đầu tiên. Vì vậy, bằng cách nào đó, khi bạn gọi là getString, nó phân bổ một đoạn bộ nhớ cho chuỗi rằng các loại và người sử dụng sau đó trở về địa chỉ của nó. Và nó chỉ ra rằng khi bạn muốn hoạt động cấp phát bộ nhớ trong này cách, hoàn trả cho người được gọi là có chức năng, địa chỉ của rằng đoạn bộ nhớ, bạn hoàn toàn không thể đặt nó trong ngăn xếp ở phía dưới, bởi vì chức năng nó chỉ sẽ không trở thành của bạn rất một cách nhanh chóng, vì vậy bạn có thể đoán nơi có lẽ chúng ta sẽ quăng nó thay vào đó, cái gọi là đống. Vì vậy, giữa dưới cùng của bộ nhớ của bạn bố trí và trên bộ nhớ của bạn bố trí là một bó toàn bộ các phân đoạn. Là một trong những ngăn xếp, và ngay ở trên nó là đống. Và đống chỉ là một đoạn khác nhau bộ nhớ đó là không được sử dụng cho các chức năng khi chúng được gọi. Nó được sử dụng cho bộ nhớ lâu dài, khi bạn muốn một chức năng để lấy một số bộ nhớ và có thể treo trên để nó mà không bị mất kiểm soát nó. Bây giờ bạn có thể có ngay lập tức thấy rằng đây không phải là nhất thiết phải là một thiết kế hoàn hảo. Như chương trình của bạn cấp phát bộ nhớ trên ngăn xếp, hoặc khi bạn gọi hơn và nhiều chức năng hơn, hoặc khi bạn phân bổ bộ nhớ trên heap với malloc ra như getString đang làm, những gì rõ ràng có vẻ là vấn đề không thể tránh khỏi? Đúng. Như thực tế là các mũi tên chỉ vào nhau không phải là điềm tốt. Và thực sự, chúng tôi rất nhanh chóng có thể sụp đổ một chương trình trong nhiều cách. Trong thực tế, tôi nghĩ rằng chúng tôi có thể có thực hiện điều này vô tình một lần. Hoặc nếu không, chúng ta hãy làm điều đó cố ý bây giờ. Hãy để tôi đi về phía trước và ghi siêu nhanh một chương trình gọi là dontdothis.c. Và bây giờ tôi sẽ đi vào đây và làm sắc nét bao gồm stdio.h. Hãy khai báo hàm foo có không có đối số, đó là ký hiệu là tốt bởi khoảng trống. Và điều duy nhất foo sẽ làm là cuộc gọi foo, mà có lẽ không phải là ý tưởng thông minh nhất, nhưng như vậy đi. Ent void main. Bây giờ điều duy nhất chính là có làm là gọi foo là tốt. Và chỉ cần cho đá, tôi sẽ đi trước đây và nói printf "Xin chào từ foo. " OK. Vì vậy, nếu tôi đã không thực hiện bất kỳ sai lầm, Làm dontdothis chấm dấu gạch chéo. Và chúng ta hãy làm điều đó trong một cửa sổ lớn hơn - dấu chấm dấu gạch chéo, dontdothis. Thôi nào. Uh oh. Rõ ràng, bạn có thể làm điều này. Chết tiệt. OK. Chờ đợi. Đứng. Đã làm chúng tôi - Chúng tôi đã sử dụng nó với làm. [SIGHS] Tôi biết nhưng tôi nghĩ chúng tôi chỉ cần xóa đó. Uh, yeah. Chết tiệt. Giải quyết Rob này. Những gì? Nó rất đơn giản. Vâng, chúng tôi quay tối ưu hóa off. OK, đứng chào tạm biệt. Bây giờ tôi cảm thấy tốt hơn. OK. Được rồi. Vì vậy, hãy biên dịch lại này - Làm cho bạn dontdothis. Bạn có thể phải đổi tên này để dothis.c chỉ trong một thời điểm. Có chúng tôi đi. Cảm ơn bạn. OK. Vì vậy, thực tế là tôi đã được in một cái gì đó thực sự chỉ làm chậm lại quá trình mà chúng tôi sẽ đạt đến điểm đó. OK. Chao ôi! Vì vậy, những gì đang thực sự xảy ra? Lý do đó, chỉ cần như một sang một bên, là làm bất cứ điều gì về đầu vào và sản lượng có xu hướng chậm bởi vì bạn phải viết ký tự đến màn hình, nó phải di chuyển. Vì vậy, câu chuyện dài ngắn, có tôi thực sự xảy ra quá thiếu kiên nhẫn, chúng ta sẽ có nhìn thấy kết quả cuối cùng này là tốt. Bây giờ tôi đã đi xe của in-up, chúng ta thấy nó ngay lập tức. Vì vậy, tại sao điều này lại xảy ra. Vâng, lời giải thích đơn giản, tất nhiên, là foo có lẽ không nên được gọi chính nó. Bây giờ một cách chung chung, đây là đệ quy. Và chúng tôi nghĩ một vài tuần trước đệ quy là tốt. Đệ quy là cách này huyền diệu của thể hiện bản thân siêu ngắn gọn. Và nó chỉ hoạt động. Nhưng có một tính năng quan trọng của tất cả các các chương trình đệ quy, chúng tôi đã nói chuyện về và nhìn vậy, đến nay, trong đó là họ đã có những gì? Một trường hợp cơ bản, đó là một số khó khăn mã trường hợp đó cho biết trong một số trường hợp không gọi foo, mà rõ ràng là không phải là trường hợp ở đây. Vì vậy, những gì đang thực sự xảy ra về hình ảnh này? Vâng, khi chính gọi foo, nó được một phần của bộ nhớ. Khi gọi foo foo, nó được một phần của bộ nhớ. Khi gọi foo foo, nó được một lát. Nó được một lát. Nó được một lát. Vì foo là không bao giờ quay trở lại. Chúng tôi sẽ không bao giờ xóa bỏ một trong những khung hình từ ngăn xếp. Vì vậy, chúng tôi đang thổi qua đống, không đề cập đến nhiều thứ khác nữa, và chúng tôi đang overstepping giới hạn của chúng tôi cái gọi là phân đoạn của bộ nhớ. Lỗi đi sai phân khúc. Vì vậy, các giải pháp có rõ ràng không làm điều này. Nhưng ý nghĩa lớn hơn là, có, có hoàn toàn là một số giới hạn, ngay cả khi nó không được xác định rõ, như thế nào nhiều chức năng mà bạn có thể gọi trong một chương trình, bao nhiêu lần một chức năng có thể gọi chính nó. Vì vậy, mặc dù chúng tôi đã rao giảng đệ quy như điều này có khả năng kỳ diệu một vài tuần trước đây cho sigma chức năng, và khi chúng tôi nhận được dữ liệu cấu trúc và CS50, bạn sẽ thấy khác ứng dụng cho nó, nó không nhất thiết phải là điều tốt nhất. Bởi vì nếu một hàm gọi chính nó, tự gọi mình, ngay cả khi có một cơ sở trường hợp, nếu bạn không đánh mà trường hợp cơ sở 1.000 cuộc gọi hoặc 10.000 cuộc gọi, bởi thời gian đó bạn có thể chạy ra khỏi phòng trên cái gọi là ngăn xếp và nhấn một số bộ phận khác của bộ nhớ. Vì vậy, nó cũng là một thiết kế thương mại-off giữa sang trọng và giữa vững mạnh của riêng của bạn thực hiện. Do đó, có một nhược điểm hay Ghi chú khác với những gì chúng tôi đã được thực hiện cho đến nay. Khi tôi gọi là getString - hãy để tôi quay trở lại vào hello-2. Nhận thấy rằng tôi gọi getString, mà là trả lại một địa chỉ. Và chúng ta nói ngày hôm nay rằng địa chỉ là từ đống. Và bây giờ tôi in ra chuỗi tại địa chỉ đó. Nhưng chúng tôi đã không bao giờ được gọi là đối diện của getString. Chúng tôi chưa bao giờ phải calll một chức năng như ungetstring, nơi bạn có tay trở lại bộ nhớ. Nhưng thẳng thắn mà nói, chúng tôi có thể cần phải có được. Bởi vì nếu chúng ta tiếp tục yêu cầu máy tính cho bộ nhớ, bằng cách của một người nào đó như getString nhưng không bao giờ cho nó trở lại, chắc chắn đó cũng là ràng buộc để dẫn đến vấn đề đó chúng tôi chạy ra khỏi bộ nhớ. Và trong thực tế, chúng ta có thể tìm kiếm những vấn đề với các công cụ mới mà sử dụng là một chút khó hiểu để loại. Nhưng hãy để tôi đi trước và nó giật gân lên trên màn hình chỉ trong một thời điểm. Tôi sẽ đi trước và chạy Valgrind với tham số có lệnh đầu tiên đối số dòng là tên của chương trình hello-2. Và thật không may nó đầu ra là atrociously phức tạp không có lý do tốt. Vì vậy, chúng ta thấy tất cả những mớ hỗn độn. David là nêu tên của tôi. Vì vậy, đó là chương trình thực sự chạy. Và bây giờ chúng tôi nhận được kết quả này. Vì vậy, Valgrind là tương tự trong tinh thần GDB. Nó không phải là một chương trình gỡ rối cho mỗi gia nhập. Nhưng đó là một kiểm tra bộ nhớ. Đó là một chương trình mà sẽ chạy của bạn chương trình và cho bạn biết nếu bạn hỏi một máy tính cho bộ nhớ và không bao giờ đưa nó trở lại, do đó có nghĩa là bạn có một rò rỉ bộ nhớ. Và rò rỉ bộ nhớ có xu hướng xấu. Và bạn là người dùng máy tính có có thể cảm thấy điều này, cho dù bạn có một Máy Mac hoặc PC. Bạn đã bao giờ sử dụng máy tính của bạn trong khi và không khởi động lại trong một vài ngày, hoặc bạn đã chỉ cần có rất nhiều chương trình đang chạy, và điều chết tiệt chậm ngừng hẳn lại, hoặc ít nhất là đó là siêu gây phiền nhiễu để sử dụng, bởi vì tất cả mọi thứ chỉ có siêu chậm. Bây giờ mà có thể là bất kỳ số lý do. Nó có thể là một vòng lặp vô hạn, một lỗi trong Mở một ai đó, hay đơn giản hơn, nó có nghĩa là bạn đang sử dụng hơn bộ nhớ, hoặc cố gắng, hơn bạn máy tính thực sự có. Và có thể có một lỗi trong một số chương trình mà tiếp tục yêu cầu cho bộ nhớ. Trình duyệt trong nhiều năm qua đã nổi tiếng với này, yêu cầu bộ nhớ nhiều hơn và nhiều hơn nữa nhưng không bao giờ đưa nó trở lại. Chắc chắn, nếu bạn chỉ có một hữu hạn số lượng bộ nhớ, bạn không thể yêu cầu vô hạn nhiều lần cho một số bộ nhớ. Và vì vậy những gì bạn thấy ở đây, mặc dù một lần nữa sản lượng Valgrind là không cần thiết phức tạp nhìn lướt qua đầu tiên, đây là một phần thú vị. Heap - trong sử dụng ở lối ra. Vì vậy, đây là bao nhiêu bộ nhớ là được sử dụng trong các đống tại Hiện chương trình của tôi đã thoát - rõ ràng sáu byte trong một khối. Vì vậy, tôi sẽ vẫy tay của tôi vào những gì là một khối. Hãy suy nghĩ của nó chỉ là một đoạn, một hơn từ kỹ thuật cho đoạn. Nhưng sáu byte - sáu byte là gì vẫn còn sử dụng không? Chính xác. D-A-V-I-D không dấu chéo ngược, năm thư tên cộng với các terminator null. Vì vậy, chương trình này valgrind nhận thấy rằng tôi yêu cầu sáu byte, rõ ràng, bởi cách getString, nhưng không bao giờ đưa chúng trở lại. Và trong thực tế, điều này không thể được như vậy rõ ràng nếu chương trình của tôi không phải là ba dòng, nhưng nó là 300 dòng. Vì vậy, chúng tôi thực sự có thể cung cấp cho một lệnh khác đối số dòng để Valgrind để làm cho nó chi tiết hơn. Đó là một chút khó chịu để nhớ. Nhưng nếu tôi làm - chúng ta hãy xem. Bị rò rỉ - Được nó bị rò rỉ - thậm chí tôi không nhớ được ra tay. - Bị rò rỉ-kiểm tra bằng đầy đủ. Vâng, cảm ơn bạn. - Bị rò rỉ-kiểm tra bằng đầy đủ. Nhập. Cùng một chương trình đang chạy. Gõ David một lần nữa. Bây giờ tôi thấy chi tiết hơn một chút. Nhưng dưới đây tóm tắt đống, mà là giống hệt nhau đến bốn - ah, đây là loại tốt đẹp. Bây giờ Valgrind được thực sự tìm kiếm một chút khó khăn hơn trong mã của tôi. Và nó nói rằng, rõ ràng, malloc tại dòng - chúng tôi thu nhỏ. Tại dòng - chúng tôi không nhìn thấy nó là những gì dòng. Nhưng malloc là thủ phạm đầu tiên. Có một blog trong malloc. Tất cả phải không? OK, không. Phải không? Tôi gọi GetString. getString rõ ràng gọi malloc. Vì vậy, những gì dòng mã là rõ ràng có lỗi vì đã cấp phát bộ nhớ này? Giả sử rằng bất cứ ai đã viết malloc đã được khoảng đủ lâu rằng nó là không phải là lỗi của họ. Vì vậy, nó có thể là tôi. GetString trong cs50.c - vì vậy đó là một nộp ở đâu đó trên máy tính - trong dòng 286 có vẻ là thủ phạm. Bây giờ chúng ta hãy giả sử rằng CS50 đã được xung quanh cho số tiền khá thời gian, vì vậy chúng ta cũng không thể sai lầm. Và do đó, nó có lẽ không phải trong GetString rằng lỗi nằm, mà là trong dòng hello-2.c 18. Vì vậy, chúng ta hãy nhìn vào những gì mà dòng 18 là. Oh. Bằng cách nào đó dòng này không nhất thiết phải lỗi, cho mỗi gia nhập, nhưng đó là lý do sau đó rò rỉ bộ nhớ. Vì vậy, siêu đơn giản, những gì sẽ trực giác là giải pháp ở đây? Nếu chúng tôi đang yêu cầu cho bộ nhớ, không bao giờ cho nó trở lại, và đó có vẻ là một vấn đề bởi vì theo thời gian máy tính của tôi có thể chạy ra khỏi bộ nhớ, có thể làm chậm xuống, những điều xấu có thể xảy ra, tốt, các giải pháp trực quan đơn giản là những gì? Chỉ cần cho nó trở lại. Làm thế nào để bạn giải phóng bộ nhớ? Vâng, may mắn nó khá đơn giản chỉ cần nói tên miễn phí. Và chúng tôi đã không bao giờ làm điều này trước. Nhưng về cơ bản bạn có thể nghĩ miễn phí như trái ngược với malloc. miễn phí là đối diện của cấp phát bộ nhớ. Vì vậy, bây giờ hãy để tôi biên dịch lại này. Làm hello-2. Cho phép tôi chạy nó một lần nữa. hello-2 David. Vì vậy, nó dường như làm việc trong chính xác theo cùng một cách. Nhưng nếu tôi quay trở lại Valgrind và chạy lại cùng lệnh trên của tôi mới biên soạn chương trình, đánh máy trong tên của tôi như trước đây - tốt đẹp. Tóm tắt đống - trong sử dụng ở lối ra - byte trong khối không. Và điều này là siêu đẹp, tất cả khối đống được trả tự do. Không có rò rỉ là có thể. Vì vậy, sắp tới, không có vấn đề Set 4, nhưng với vấn đề Set 5, pháp y trở đi, điều này cũng sẽ trở thành một biện pháp đúng đắn của bạn chương trình, cho dù bạn có hay không hoặc không có rò rỉ bộ nhớ. Nhưng may mắn thay, không chỉ bạn có thể lý do qua chúng bằng trực giác, mà là, cho là, dễ dàng cho các chương trình nhỏ nhưng khó khăn hơn cho các chương trình lớn hơn, Valgrind, đối với những chương trình lớn hơn, có thể giúp bạn xác định các vấn đề cụ thể. Nhưng có một vấn đề khác có thể phát sinh. Hãy để tôi mở file này ở đây, đó là, một lần nữa, một ví dụ khá đơn giản. Nhưng chúng ta hãy tập trung vào những gì chương trình này không. Điều này được gọi là memory.c. Chúng tôi sẽ đăng này sau hôm nay zip mã nguồn của ngày hôm nay. Và nhận thấy rằng tôi có một chức năng được gọi là e không có đối số và trả về không có gì. Trong dòng 20, tôi dường như tuyên bố một con trỏ đến một int và gọi đó là x. Tôi đang giao là sự trở lại giá trị của malloc. Và chỉ để được rõ ràng, có bao nhiêu byte am Tôi có thể nhận được từ malloc trong tình huống này? Có lẽ 40. Nơi nào bạn nhận được điều đó từ đâu? Vâng, nếu bạn nhớ lại rằng một int thường 4 byte, ít nhất là trong thiết bị, 10 lần 4 rõ ràng là 40. Vì vậy, malloc là trả lại một địa chỉ một đoạn bộ nhớ và lưu trữ đó giải quyết cuối cùng trong x. Vì vậy, để được rõ ràng, những gì sau đó đang xảy ra? Vâng, hãy để tôi chuyển về để hình ảnh của chúng tôi ở đây. Hãy để tôi không chỉ vẽ dưới cùng của tôi bộ nhớ của máy tính, hãy để tôi đi trước và vẽ cả hình chữ nhật đại diện cho tất cả các bộ nhớ RAM của tôi. Chúng tôi sẽ nói rằng ngăn xếp là ở phía dưới. Và có một đoạn văn bản trong các dữ liệu chưa được khởi tạo. Nhưng tôi chỉ cần đi đến những trừu tượng những thứ khác đi như dấu chấm, dấu chấm dấu chấm. Tôi chỉ cần đi để tham khảo này như đống ở đầu trang. Và sau đó ở dưới cùng của hình ảnh này, để đại diện cho chính, tôi sẽ để cho nó một bộ nhớ lát trên stack. Cho e, tôi sẽ cung cấp cho nó một lát bộ nhớ trên stack. Bây giờ, tôi đã tham khảo ý kiến ​​của tôi mã nguồn một lần nữa. Các biến địa phương chính là gì? Dường như không có gì, vì vậy slice đó là hiệu quả sản phẩm nào hoặc thậm chí không lớn như tôi đã vẽ nó. Nhưng trong e, tôi có một biến địa phương, được gọi là x. Vì vậy, tôi sẽ đi trước và cho f một đoạn bộ nhớ, gọi đó là x. Và bây giờ malloc 10 lần 4, Vì vậy, malloc 40, đâu đó nhớ đến từ đâu? Chúng tôi đã không rút ra một bức tranh như thế này trước đây. Nhưng chúng ta hãy giả sử rằng nó có hiệu quả từ đây, vì vậy một, hai, ba, bốn, năm. Và bây giờ tôi cần 40 trong số này. Vì vậy, tôi sẽ chỉ làm dấu chấm, dấu chấm, dấu chấm để đề nghị rằng có bộ nhớ nhiều hơn trở lại từ đống. Tại địa chỉ là những gì? Hãy chọn tùy ý của chúng tôi giải quyết như mọi khi - Ox123, mặc dù nó có lẽ sẽ là một cái gì đó hoàn toàn khác nhau. Đó là địa chỉ của byte đầu tiên trong bộ nhớ mà tôi yêu cầu malloc cho. Vì vậy, trong ngắn hạn, một khi dòng 20 thực hiện, những gì là nghĩa đen được lưu trữ bên trong của x ở đây? Ox123. Ox123. Và Ox là nhàm chán. Nó chỉ có nghĩa đây là một số thập lục phân. Nhưng điều quan trọng là những gì tôi đã lưu trữ trong x, mà là một biến địa phương. Nhưng kiểu dữ liệu của nó, một lần nữa, là một địa chỉ của một int. Vâng, tôi sẽ lưu trữ Ox123. Nhưng một lần nữa, nếu đó là một chút quá phức tạp không cần thiết, nếu tôi di chuyển trở lại, chúng ta có thể trừu tượng này đi khá hợp lý và chỉ nói rằng x là một con trỏ vào đó đoạn bộ nhớ. OK. Bây giờ câu hỏi ở bàn tay như sau - dòng 21, nó quay ra, là lỗi. Tại sao? Xin lỗi? Nó không có - nói rằng một lần nữa. Vâng, nó không miễn phí. Vì vậy, đó là lần thứ hai nhưng. Do đó, có một khác nhưng đặc biệt tại dòng 21. Chính xác. Này dòng mã đơn giản chỉ là một là lỗi tràn bộ đệm, một tràn bộ đệm. Một bộ đệm chỉ có nghĩa là một đoạn bộ nhớ. Nhưng mà đoạn bộ nhớ có kích thước 10, 10 số nguyên, có nghĩa là nếu chúng ta chỉ số vào nó bằng cách sử dụng cú pháp đường của mảng ký hiệu, hình vuông ngoặc đơn, bạn có thể truy cập x khung 0 x 1 x khung, khung dấu chấm, dấu chấm, dấu chấm. x khung 9 là một trong những lớn nhất. Vì vậy, nếu tôi làm x khung 10, nơi Tôi đang thực sự xảy ra trong bộ nhớ? Vâng, nếu tôi có 10 int - chúng ta hãy thực sự rút ra tất cả trong số này ra đây. Vì vậy, đó là năm đầu tiên. Đây là năm số nguyên khác. Vì vậy, khung x 0 là đây. x khung 1 là đây. x khung 9 là đây. x khung 10 là ở đây, có nghĩa là tôi nói, ở dòng 21, các máy tính đặt số ở đâu? Số 0 ở đâu? Vâng, đó là 0, có. Nhưng chỉ thực tế là 0 của nó là loại một trùng hợp ngẫu nhiên. Nó có thể là số 50, cho tất cả chúng ta quan tâm. Nhưng chúng tôi đang cố gắng để đặt nó tại x khung 10, đó là nơi này dấu hỏi được rút ra, trong đó không phải là một điều tốt. Chương trình điều này có thể rất tốt sụp đổ như một kết quả. Bây giờ, chúng ta hãy đi trước và xem nếu điều này là, thực sự, những gì xảy ra. Làm cho bộ nhớ, vì các tập tin được gọi là memory.c. Chúng ta hãy đi trước và chạy bộ nhớ chương trình. Vì vậy, chúng tôi đã may mắn, thực sự, có vẻ như. Chúng tôi đã gặp may. Nhưng chúng ta hãy xem nếu bây giờ chúng tôi chạy Valgrind. Ở cái nhìn đầu tiên, chương trình của tôi có thể dường như là hoàn toàn chính xác. Nhưng cho phép tôi chạy Valgrind với - Bị rò rỉ-kiểm tra bằng đầy đủ về bộ nhớ. Và bây giờ khi tôi chạy - thú vị. Không hợp lệ viết của kích thước 4 tại dòng 21 của memory.c. Dòng 21 của memory.c là cái nào? Oh, thú vị. Nhưng chờ đợi. Kích thước 4, những gì là đề cập đến? Tôi chỉ làm một viết, nhưng nó có kích thước 4. Tại sao nó 4? Đó là bởi vì nó là một int, mà là, một lần nữa, bốn byte. Vì vậy, Valgrind tìm thấy một lỗi mà tôi, liếc nhìn mã của tôi, đã làm không. Và có thể TF của bạn sẽ hoặc sẽ không được. Nhưng những gì Valgrind chắc chắn thấy rằng chúng tôi đã thực hiện một sai lầm có, thậm chí mặc dù chúng tôi đã may mắn, và máy tính quyết định, phải không, tôi sẽ không sụp đổ chỉ vì bạn chạm vào một byte, một int giá trị của bộ nhớ mà bạn không thực sự của riêng. Vâng, những gì khác là lỗi ở đây. Địa chỉ - đây là một địa chỉ tìm kiếm điên trong hệ thập lục phân. Điều đó chỉ có nghĩa là ở đâu đó trong đống là byte sau khi một khối kích thước 40 được phân bổ. Hãy để tôi thu nhỏ ở đây và xem đây là một ít hữu ích hơn. Thú vị. 40 byte có chắc chắn bị mất trong lỗ kỷ lục 1 của 1. Một lần nữa, lời nói hơn là hữu ích ở đây. Nhưng dựa trên các đường đánh dấu, nơi nên tôi có thể tập trung của tôi sự chú ý cho lỗi khác? Trông giống như một dòng 20 của memory.c. Vì vậy, nếu chúng ta quay lại dòng 20, đó là một mà bạn xác định trước đó. Và nó không nhất thiết phải là lỗi. Nhưng chúng tôi đã này đảo ngược tác dụng của nó. Vì vậy, làm thế nào để tôi sửa chữa ít nhất một trong những sai lầm? Tôi có thể làm gì sau khi dòng 21? Tôi có thể làm miễn phí của x, như vậy là để cung cấp cho trở lại bộ nhớ. Và làm thế nào để khắc phục lỗi này? Tôi chắc chắn nên đi không xa hơn 0. Vì vậy, hãy để tôi thử và chạy lại này. Xin lỗi, chắc chắn đi không xa hơn 9. Làm cho bộ nhớ. Hãy để tôi chạy lại Valgrind trong một cửa sổ lớn hơn. Và bây giờ nhìn. Tốt đẹp. Tất cả các khối đống được trả tự do. Không có rò rỉ là có thể. Và lên trên đây, không có đề cập đến nữa quyền không hợp lệ. Chỉ để có được tham lam, và hãy xem trình diễn khác không đi như dự định - Tôi đã nhận được may mắn vừa mới đây. Và thực tế rằng đây là 0 có lẽ không cần thiết gây hiểu nhầm. Hãy làm 50, một phần nào tùy ý số lượng, làm cho bộ nhớ dot bộ nhớ dấu gạch chéo - vẫn nhận được may mắn. Không bị rơi. Giả sử tôi chỉ cần làm một cái gì đó thực sự ngu ngốc, và tôi làm 100. Hãy để tôi làm lại bộ nhớ, dot cắt giảm bộ nhớ - đã may mắn một lần nữa. Làm thế nào về 1000? ints ngoài, gần, nơi tôi nên được? Làm cho bộ nhớ - chết tiệt. [Cười] OK. Chúng ta không lộn xộn xung quanh nữa. Chạy bộ nhớ. Có chúng tôi đi. Được rồi. Vì vậy, rõ ràng bạn chỉ số 100.000 ints ngoài nơi bạn cần phải có được trong bộ nhớ, điều xấu xảy ra. Vì vậy, điều này rõ ràng không một khó khăn, nhanh chóng quy tắc. Tôi là loại sử dụng thử nghiệm và sai để đạt được điều đó. Nhưng điều này là bởi vì, câu chuyện dài ngắn, bộ nhớ máy tính của bạn cũng được chia vào những thứ được gọi là phân đoạn. Và đôi khi, máy tính thực sự đưa cho bạn bộ nhớ nhiều hơn một chút hơn bạn yêu cầu. Nhưng cho hiệu quả, nó chỉ là dễ dàng hơn để có được nhiều bộ nhớ hơn nhưng chỉ cho bạn biết rằng bạn đang nhận được một phần của nó. Và nếu bạn nhận được may mắn đôi khi, do đó, bạn có thể có thể chạm vào bộ nhớ mà không thuộc về bạn. Bạn không có gì đảm bảo rằng những gì giá trị bạn đã chèn sẽ ở lại đó, bởi vì máy tính vẫn còn nghĩ rằng nó không của bạn, nhưng nó không nhất thiết sẽ để đạt một đoạn bộ nhớ trong máy tính và gây ra một sai lầm như này đây. Được rồi. Bất kỳ câu hỏi sau đó trên bộ nhớ? Được rồi. Chúng ta hãy có một cái nhìn ở đây, sau đó, tại một cái gì đó chúng tôi đã được tham gia cho cấp trong một thời gian, mà là trong tập tin này được gọi là cs50.h. Vì vậy, đây là một tập tin. Đây chỉ là một bó toàn bộ ý kiến ​​lên hàng đầu. Và bạn có thể nhìn vào điều này nếu bạn chọc xung quanh may. Nhưng nó chỉ ra rằng tất cả các thời gian, khi chúng tôi sử dụng để sử dụng chuỗi như một từ đồng nghĩa, các phương tiện mà chúng tôi tuyên bố đó đồng nghĩa là với điều này từ khoá typedef, để định nghĩa kiểu. Và chúng ta đang chủ yếu nói, làm chuỗi một từ đồng nghĩa với char sao. Đó là phương tiện mà chồng tạo ra những bánh xe đào tạo được gọi là chuỗi. Giờ đây chỉ là một nguyên mẫu cho getchar. Chúng tôi có thể nhìn thấy nó trước, nhưng đó là thực sự những gì nó làm. getchar không có đối số, trả về một char. getdouble không có đối số, trả về một đôi. GetFloat không có đối số, lợi nhuận một phao, vv. getInt là ở đây. getlonglong là ở đây. Và getString là ở đây. Và đó là nó. Đường màu tím này là tiền xử lý khác chỉ vì hashtag vào đầu nó. Được rồi. Vì vậy, bây giờ hãy để tôi đi vào cs50.c. Và chúng tôi sẽ không nói chuyện quá lâu về điều này. Nhưng để cung cấp cho bạn một cái nhìn thoáng qua về những gì được đi trên tất cả điều này thời gian, hãy để tôi đi đến - chúng ta hãy làm getchar. Vì vậy, getchar chủ yếu là ý kiến. Nhưng có vẻ như thế này. Vì vậy, đây là chức năng thực tế getchar mà chúng tôi đã được dùng cho các cấp tồn tại. Và mặc dù chúng tôi đã không sử dụng này thường xuyên, nếu bao giờ hết, nó ít nhất tương đối đơn giản. Vì vậy, nó có giá trị tham gia một xem nhanh tại đây. Vì vậy, getchar có một vòng lặp vô hạn, cố ý như vậy rõ ràng. Sau đó nó gọi - và đây là loại một tái sử dụng tốt đẹp của bản thân chúng ta đang viết. Nó gọi getString. Bởi vì những gì nó có nghĩa là để có được một char? Vâng, bạn cũng có thể cố gắng để có được một toàn bộ dòng văn bản từ người sử dụng và sau đó chỉ cần nhìn vào một của những nhân vật. Trong dòng 60, đây là một chút bit của một kiểm tra sự tỉnh táo. Nếu getString trở null, chúng ta không tiến hành. Một cái gì đó đã đi sai. Bây giờ điều này là hơi khó chịu nhưng thông thường trong C. char tối đa có thể đại diện cho những gì chỉ dựa trên tên của nó? Đó là một hằng số. Nó giống như các giá trị số của char lớn nhất bạn có thể đại diện với Cắn một miếng, mà có lẽ là số 255, đó là số lượng lớn nhất mà bạn đại diện cho tám bit, bắt đầu từ số không. Vì vậy, tôi đã sử dụng điều này, trong chức năng này, khi viết mã này, chỉ vì nếu có điều gì sai trong getchar nhưng mục đích của nó trong cuộc sống là để trả lại một char, bạn cần phải bằng cách nào đó có thể để báo hiệu cho người dùng biết một cái gì đó đã đi sai. Chúng ta không thể trở về null. Nó chỉ ra rằng null là một con trỏ. Và một lần nữa, có getchar để trả về một char. Vì vậy, các quy ước, nếu có điều gì sai, là bạn, các lập trình viên, hoặc trong trường hợp này, tôi có thư viện, tôi đã có chỉ là một quyết định tùy tiện, nếu điều gì sai, tôi sẽ trả lại số 255, mà thực sự là có nghĩa là chúng ta có thể không, người dùng có thể không nhập nhân vật đại diện bởi các số 255 bởi vì chúng tôi đã có một ăn cắp nó như một cái gọi là giá trị trọng điểm để đại diện cho một vấn đề. Bây giờ nó chỉ ra rằng nhân vật 255 không phải là một cái gì đó bạn có thể gõ trên bàn phím của bạn, vì vậy không có vấn đề lớn. Người dùng không nhận thấy rằng Tôi đã bị đánh cắp nhân vật này. Nhưng nếu bạn đã bao giờ nhìn thấy trong trang người đàn ông trên một hệ thống máy tính của một số tham chiếu đến một tất cả các mũ liên tục như thế này mà nói, trong trường hợp lỗi sức mạnh liên tục này được trả lại, đó là tất cả những con người đã làm năm trước đây đã được tự ý quyết định trả lại giá trị đặc biệt này và gọi nó là một hằng số trong trường hợp gặp khó khăn. Bây giờ sự kỳ diệu sẽ xảy ra ở đây. Đầu tiên, tôi tuyên bố trong dòng 67 hai nhân vật, C1 và C2. Và sau đó trong dòng 68, có thực sự một dòng mã đó là gợi nhớ của người bạn của chúng tôi printf, cho rằng nó không có phần trăm Cs trong dấu ngoặc kép. Nhưng nhận thấy những gì đang xảy ra ở đây. sscanf có nghĩa là chuỗi quét - có nghĩa là quét một định dạng chuỗi, ergo sscanf. Điều đó có nghĩa gì? Nó có nghĩa là bạn vượt qua sscanf một chuỗi. Và dòng là bất cứ điều gì các loại người sử dụng vào Bạn vượt qua sscanf một chuỗi định dạng như này mà nói với scanf là gì bạn hy vọng người sử dụng đã đánh máy in Sau đó bạn vượt qua trong các địa chỉ của hai khối của bộ nhớ, trong trường hợp này, bởi vì tôi có hai giữ chỗ. Vì vậy, tôi sẽ cung cấp cho nó địa chỉ của C1 và địa chỉ của C2. Và nhớ rằng bạn cung cấp cho một chức năng địa chỉ của một số biến, những gì ngụ ý? Những chức năng mà có thể làm như vậy đem lại cho nó địa chỉ của một biến, như trái ngược với biến đó? Nó có thể thay đổi nó, phải không? Nếu bạn có một người nào đó một bản đồ cho một thể chất địa chỉ, họ có thể đến đó và làm bất cứ điều gì họ muốn tại địa chỉ đó. Cùng một ý tưởng ở đây. Nếu chúng tôi vượt qua để sscanf, địa chỉ của hai khối của bộ nhớ, ngay cả những nhỏ khối ít bộ nhớ, C1 và C2, nhưng chúng tôi nói cho nó địa chỉ của họ, sscanf có thể thay đổi nó. Vì vậy, mục đích sscanf trong cuộc sống, nếu chúng ta đọc trang người đàn ông, là để đọc những gì các người sử dụng gõ vào, hy vọng cho người sử dụng có gõ vào một nhân vật và có thể một nhân vật khác, và bất cứ điều gì người dùng đánh máy, ký tự đầu tiên đi ở đây, nhân vật thứ hai tại đây. Bây giờ, khi một sang một bên, điều này, và bạn sẽ chỉ biết điều này từ các tài liệu, thực tế là tôi đặt một không gian trống có chỉ có nghĩa là tôi không quan tâm người dùng chạm vào thanh không gian một vài lần trước khi người đó có một nhân vật, tôi sẽ bỏ qua bất kỳ không gian trắng. Do đó, tôi biết từ các tài liệu hướng dẫn. Thực tế là có một% thứ hai c tiếp theo không gian màu trắng thực sự là có chủ ý. Tôi muốn để có thể phát hiện nếu người sử dụng hơi say lên hoặc không hợp tác. Vì vậy, tôi hy vọng rằng người dùng chỉ đánh máy trong một ký tự, do đó tôi hy vọng đó sscanf chỉ sẽ trả lại giá trị 1 bởi vì, một lần nữa, nếu tôi đọc các tài liệu, mục đích sscanf trong cuộc sống là để trở về số lượng biến đã được lấp đầy với người sử dụng đầu vào. Tôi đã thông qua trong hai biến địa chỉ, C1 và C2. Tôi hy vọng, tuy nhiên, đó chỉ là một trong họ bị giết bởi vì nếu sscanf trả về 2, những gì có lẽ ngụ ý một cách hợp lý? Mà người sử dụng không chỉ cho tôi một nhân vật như tôi đã nói với người đó. Họ có thể đánh máy ở ít nhất hai ký tự. Vì vậy, nếu tôi thay vì không có thứ hai % C, tôi chỉ có một, mà thẳng thắn sẽ được trực quan hơn phương pháp tiếp cận, tôi nghĩ rằng một cái nhìn đầu tiên, bạn sẽ không thể phát hiện nếu người dùng đã được cung cấp cho bạn hơn đầu vào hơn bạn thực sự muốn. Vì vậy, đây là một hình thức tiềm ẩn kiểm tra lỗi. Nhưng nhận thấy những gì tôi làm ở đây. Một khi tôi chắc chắn rằng người sử dụng đã cho tôi một nhân vật, tôi giải phóng đường, làm trái ngược với getString, do đó sử dụng malloc, và sau đó tôi trở lại C1, nhân vật mà tôi hy vọng người sử dụng cung cấp và chỉ được cung cấp. Vì vậy, một cách nhanh chóng chỉ thoáng nhìn thấy, nhưng bất kỳ câu hỏi về getchar? Chúng tôi sẽ trở lại với một số người khác. Vâng, hãy để tôi đi trước và làm điều này - giả sử bây giờ, chỉ để động viên của chúng tôi thảo luận trong một tuần cộng với thời gian, điều này là một tập tin gọi là structs.h. Và một lần nữa, đây chỉ là một hương vị của một cái gì đó ở phía trước. Nhưng thông báo rằng rất nhiều của việc này là ý kiến. Vì vậy, hãy để tôi làm nổi bật chỉ Phần thú vị cho bây giờ. typedef - có cùng một từ khóa một lần nữa. typedef chúng tôi sử dụng để khai báo chuỗi như là một loại dữ liệu đặc biệt. Bạn có thể sử dụng typedef để tạo ra thương hiệu mới các kiểu dữ liệu không tồn tại khi C được phát minh. Ví dụ, int đi kèm với C. char đi kèm với C. đôi đi kèm với C. Nhưng không có khái niệm về một sinh viên. Nhưng nó sẽ là khá hữu ích để có có thể viết một chương trình mà các cửa hàng trong một biến, số ID của học sinh, tên của họ, và nhà của họ. Nói cách khác, ba miếng dữ liệu, giống như một int và một chuỗi và chuỗi khác. Với typedef, những gì là khá mạnh mẽ về việc này và sturct từ khóa cho cấu trúc, bạn, các lập trình viên vào năm 2013, thực sự có thể định nghĩa của riêng bạn các kiểu dữ liệu không tồn tại năm trước nhưng phù hợp với mục đích của bạn. Và vì vậy ở đây, trong dòng 13 đến 19, chúng ta đang khai báo một kiểu dữ liệu mới, như một int, nhưng gọi đó là sinh viên. Và bên trong của biến này sẽ có ba điều - một int, một chuỗi, và một chuỗi. Vì vậy, bạn có thể nghĩ đến những gì thực sự xảy ra ở đây, mặc dù đây là một chút đơn giản cho ngày hôm nay, một sinh viên chủ yếu là đi trông như thế này. Đi của nó sẽ được một đoạn bộ nhớ với một ID, một tên lĩnh vực, và lĩnh vực nhà ở. Và chúng tôi sẽ có thể sử dụng những khối bộ nhớ và truy cập chúng như sau. Nếu tôi đi vào struct0.c, đây là một tương đối dài, nhưng sau một mô hình, các mã sử dụng thủ thuật mới này. Vì vậy, đầu tiên, hãy để tôi hút sự chú ý của bạn để những phần thú vị lên hàng đầu. Sharp xác định sinh viên 3, tuyên bố một được gọi là sinh viên và người được chỉ định không đổi nó tùy tiện số 3, chỉ vì vậy tôi có ba học sinh sử dụng chương trình này cho bây giờ. Ở đây có chính. Và thông báo, làm thế nào để khai báo một mảng của học sinh? Vâng, tôi chỉ cần sử dụng cú pháp tương tự. Học sinh từ rõ ràng là mới. Nhưng sinh viên, lớp, học sinh khung. Vì vậy, không may có rất nhiều tái sử dụng từ ngữ ở đây. Đây chỉ là một số. Vì vậy, đây là giống như nói rằng ba. Lớp học chỉ là những gì tôi muốn gọi biến. Tôi có thể gọi nó là sinh viên. Nhưng lớp học, điều này không phải là một lớp học trong một hướng đối tượng Java kiểu cách. Nó chỉ là một lớp học của học sinh. Và kiểu dữ liệu của mọi phần tử trong mảng đó là sinh viên. Vì vậy, đây là một chút khác nhau và từ nói điều gì đó như thế này, nó chỉ là - Tôi nói cho tôi ba sinh viên và gọi đó là lớp mảng. Được rồi. Bây giờ đây là bốn vòng. Này của chàng trai quen thuộc - iterate từ con số không trên lên đến ba. Và đây là đoạn mới của cú pháp. Chương trình sẽ nhắc nhở tôi, con người, để cho nó một sinh viên ID, đó là một int. Và đây là cú pháp mà bạn có thể lưu trữ một cái gì đó trong lĩnh vực ID tại đẳng cấp vị trí khung I. Vì vậy, cú pháp này không phải là mới. Điều này chỉ có nghĩa là cung cấp cho tôi thứ tám học sinh trong lớp. Nhưng biểu tượng này là mới. Cho đến bây giờ, chúng tôi đã không thể sử dụng dấu chấm, ít nhất là trong mã như thế này. Điều này có nghĩa là đi đến các cấu trúc được gọi là một sinh viên và đặt một cái gì đó. Tương tự như vậy, trong dòng tiếp theo này, 31 tuổi, đi trước và đặt bất cứ điều gì loại người sử dụng cho một tên ở đây và những gì họ làm cho một nhà, điều tương tự, đi trước và đặt nó trong nhà.. Vì vậy, những gì hiện chương trình này cuối cùng là làm gì? Bạn có thể thấy một chút trêu ghẹo đó. Hãy để tôi đi trước và làm cho cấu trúc 0 dấu chấm dấu gạch chéo cấu trúc 0, thẻ sinh viên của 1, David nói Mather, thẻ sinh viên 2. Rob Kirkland, thẻ sinh viên 3. Lauren Leverit - và điều duy nhất chương trình này đã làm, mà chỉ là hoàn toàn tùy ý, được Tôi muốn làm một cái gì đó với dữ liệu này, bây giờ mà tôi đã dạy chúng ta cách sử dụng cấu trúc, là tôi chỉ có vòng này thêm ở đây. Tôi lặp qua các mảng của các học sinh. Tôi đã sử dụng, bạn có lẽ bây giờ quen thuộc của chúng tôi, chuỗi so sánh, để stircomp kiểm tra là căn nhà thứ 8 của học sinh bằng Mather? Và nếu như vậy, chỉ cần in một cái gì đó tùy ý thích, có, nó là. Nhưng một lần nữa, chỉ đem lại cho tôi cơ hội sử dụng và tái sử dụng và tái sử dụng dấu chấm mới này ký hiệu. Vì vậy, những người quan tâm, phải không? Đến với một chương trình học sinh phần nào tùy ý, nhưng nó quay ra chúng tôi có thể làm những việc hữu ích với này, ví dụ như sau. Đây là một cấu trúc phức tạp hơn nhiều trong C. Nó có một tá hoặc nhiều lĩnh vực, hơi khó hiểu tên. Nhưng nếu bạn đã từng nghe nói về một đồ họa định dạng tập tin gọi là bitmap, BMP, nó chỉ ra rằng các định dạng tập tin bitmap khá nhiều trông như thế này. Đó là một ngu ngốc ít phải đối mặt cười. Đó là một hình ảnh nhỏ mà tôi đã phóng to trên khá lớn để tôi có thể nhìn thấy nhau của các dấu chấm cá nhân hoặc điểm ảnh. Bây giờ, hóa ra chúng ta có thể đại diện cho một chấm đen với, nói rằng, các số 0. Và một dấu chấm màu trắng với số 1. Vì vậy, nói cách khác, nếu bạn muốn vẽ một Khuôn mặt cười và lưu hình ảnh đó trong một máy tính, nó cũng đủ để lưu trữ số không và những người giống như thế này, ở đâu, một lần nữa, những người có màu trắng và số màu đen. Và cùng nhau, nếu bạn có hiệu quả có một bao vây của những người thân và số không, bạn có một mạng lưới các điểm ảnh, và nếu bạn đặt chúng ra, bạn có dễ thương ít cười khuôn mặt. Bây giờ, định dạng tập tin bitmap, BMP, là hiệu quả mà bên dưới mui xe, nhưng với nhiều điểm ảnh sot bạn thực sự có thể đại diện cho màu sắc. Nhưng khi bạn có phức tạp hơn định dạng file như BMP, JPEG và GIF mà bạn có thể quen thuộc, những các tập tin trên đĩa thường không chỉ có số không và những người thân cho các điểm ảnh, nhưng họ có một số siêu dữ liệu cũng - meta trong ý nghĩa đó không phải là thực sự dữ liệu nhưng nó là hữu ích để có. Vì vậy, các lĩnh vực này ở đây ngụ ý, và chúng ta sẽ thấy điều này một cách chi tiết hơn trong P-bộ 5, trước khi các số không và những người đại diện cho các điểm ảnh trong một hình ảnh, có một loạt các siêu dữ liệu như kích thước của hình ảnh và các chiều rộng của hình ảnh. Và thông báo tôi tuốt ra một số điều tùy ý ở đây - chiều rộng và chiều cao. Số bit và một số thứ khác. Do đó, có một số dữ liệu trong một tập tin. Nhưng bằng sự hiểu biết như thế nào các tập tin được đặt ra theo cách này, bạn có thể thực sự sau đó thao tác hình ảnh, khôi phục hình ảnh từ đĩa, thay đổi kích thước hình ảnh. Nhưng bạn có thể không nhất thiết phải nâng cao chúng. Tôi cần một bức ảnh. Vì vậy, tôi đã đi lại để RJ đây, những người bạn nhìn thấy trên màn hình khá nhiều thời gian trước đây. Và nếu tôi mở Keynote đây, đây là những gì sẽ xảy ra nếu bạn cố gắng để phóng to và thu nâng cao RJ. Anh ta không nhận được bất kỳ tốt hơn thực sự. Bây giờ Keynote là loại làm mờ nó một chút, chỉ để che đậy sự thực tế là RJ không nhận được đặc biệt tăng cường khi bạn zoom in Và nếu làm theo cách này, nhìn thấy các hình vuông? Vâng, bạn chắc chắn có thể nhìn thấy các hình vuông trên một máy chiếu. Đó là những gì bạn nhận được khi bạn nâng cao. Nhưng trong việc tìm hiểu RJ của chúng tôi hoặc Khuôn mặt cười được thực hiện sẽ cho chúng tôi thực sự viết mã điều khiền những điều này. Và tôi nghĩ rằng tôi muốn kết thúc vào ghi chú này, với 55 giây của một nâng cao đó là, Tôi dám, nói chứ không phải gây hiểu nhầm. [VIDEO xem lại] -Hắn nói dối. Về những gì, tôi không biết. -Vì vậy, chúng ta biết gì? -Đó at 9:15 Ray Santoya là tại máy ATM. -Vì vậy, câu hỏi là những gì Anh ta làm at 9:16? -Bắn súng chín milimet tại một cái gì đó. Có lẽ ông đã nhìn thấy các tay bắn tỉa. -Hoặc đã được làm việc với ông. -Đợi. Đi trở lại một. -Những gì bạn thấy? -Mang khuôn mặt của mình lên, toàn màn hình. -Ông kính. -Có một sự phản ánh. -Đó là đội bóng chày Neuvitas. Đó là logo của họ. -Và anh ấy nói chuyện với bất cứ ai là mặc áo khoác đó. [END xem video] DAVID J. Malan: Điều này sẽ có vấn đề Set 5. Chúng ta sẽ thấy bạn vào tuần tới. SPEAKER MALE: Tại CS50 tiếp theo. [Dế hót líu lo] [Chơi nhạc]