Trang 4 / 10 FirstFirst 12345679 ... LastLast
Hiển thị kết quả từ 31 đến 40 / 100

Chủ đề: Con trỏ C++

  1. #31
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    Tôi xin gác lại một số vấn đề mà các bạn đang bàn luận làm đi sai TOPIC ở đây.
    Nếu muốn chúng ta có thể lập riêng 1 TOPIC và bạn luận. Vì đây là TOPIC "point of C++".
    ------------------------------------------
    Như đã hứa là tôi sẽ viết PART 2.
    Lý ra tôi chưa post liền ngay bây giờ nhưng do một số vấn đề nên buộc tôi phải nóng vội. Mình xin lỗi vì lý do này.
    Sau đây là PART 2 của mình:

  2. #32
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    Năm 2002 là một cái nắm dấu ấn trong nền công nghệ phần mềm bởi vì nó đánh dấu sự ra đời của một công nghệ mới là .NET.
    MS đã đưa ra một môi trường phát triển phần mềm mới, cùng với nó là sự ra đời của một số ngôn ngữ như C#.NET, VB.NET,…
    Nhưng .NET là gì thì mình sẽ bàn luận trong vấn đề này.

    PHẦN I. WHAT IS THE .NET FRAMEWORK?
    Chỉ mất vài phút google bạn sẽ dễ dàng nhanh chóng tìm ra một câu trả lời bằng những trang viết Việt Nam cũng rất rõ ràng.

    Và tất cả những gì mình biết về .NET chỉ nhỏ gọn trong 20 trang của cuốn sách “Visual C++ CLI and the.NET 2.0 Platform - S. Fraser - Apress – 2005”, do đó chắn chắn mình sẽ không thể nào đưa ra đầy đủ được.

    .NET theo tôi là một nền tảng, nó cung cấp cho người lập trình một khung ứng dụng (frameworks) và mục tiêu của nó là những phần mềm chạy trên môi trường dot NET.

    Kiến trúc của .NET gồm 3 layer như sau:



    LAYER 1: NỀN TẢNG .NET

    1. Web Services (Dịch vụ WEB):
    Web Services nói cho dễ hiểu thì là những chương trình hoạt động theo dạng Client – Server và sử dụng 2 giao thức (protocol):
    - HTTP (Hypertext Transfer Protocol)
    - SOAP (Simple Object Access Protocol).
    Web Services thì có rất nhiều chức năng. Trong đó với .NET thì thì mục tiêu của Web Services là XML Web Services hỗ trợ cho ASP.NET hoặc Windows Foms (để viết các APP dạng Client – Server). Nó giống như là một thư viện, tức là khi cần, chúng ta có thể gọi nó như gọi một function.
    Chúng ta có thể sử dụng các ngôn ngữ trên .NET để viết những hàm. Kết quả trả về của những hàm này có thể là 1 Database hoặc 1 giá trị nào đó. Web Services sẽ được biên dịch ra dạng file *.asmx. Và khi cần thì ASP.NET sẽ tham chiếu (references) đến nó cho các forms trong trang Web của mình. File *.asmx được hiểu như là 1 object và trong object đó là các member function do mình viết ra…

    2. Web Forms:
    Chính xác hơn thì đây chính là ASP.NET. Một ngôn ngữ lập trình WEB theo công nghệ của MS. Hiện nay thì 2 ngôn ngữ lập trình chính là VB.NET và C# đản nhiệm việc này. Chúng ta có thể nhìn rõ ràng hơn về kiến trúc của .NET với WEB Forms bào gồm Services và ASP.NET dưới cái hình này.



    Nhưng nói chung thì kiến thức về Web của mình cũng không nhiều nên mình cũng không thể đi sâu vào vấn đề này được. Và theo mình thì mình thấy PHP có phần thiện cảm hơn ASP.NET rất nhiều bởi những yếu tố như Free và không phục thuộc vào hệ điều hành mặc dù mình công nhận ASP.NET rất mạnh. Vả lại trong TOPIC này mình đang nói về “pointer of C++”

    3. Windows Forms:
    Đây là nơi để các ngôn ngữ chính của .NET như C#, VB.NET, C++.NET, J#,… xây dựng các ứng dụng chạy trên windows.
    Khi ra đời người ta đã thấy được những ưu điểm của Forms so với kiến trúc 3 ứng dụng Dialog, SDI, MDI của C++/MFC trước đây bởi tính năng dễ thiết kế, có giao diện đẹp…
    Do đó nên ngày nay các ứng dụng đang dần chuyển qua Forms. Chúng ta có thể thấy được sự khác biệt rất nhiều như giữa MS Word 98 về trước và MS Word XP trở về sau (đặc biệt là MS Word 2007).

    LAYER 2: CÁC LỚP HỢP NHẤT (Unified Programming Classes)
    Layer thứ 2 này nói cho dễ hiểu là các thư viện để giúp 3 nền tảng trên có thể phát triển được.
    Thư mục Windows\Assembly chứa các thư viện này.



    Vấn đề tôi muốn nói ở đây là các thư viên này được MS viết bằng ngôn ngữ nào? Không phải C++ mà chính là các ngôn ngữ .NET như C# và VB.NET… Tại sao khi tôi phân tích Layer 3 sẽ có lời giải đáp.

    Ở C++ khi người ta muốn sử dụng các hàm thì chắc chắn phải biết hàm đó ở thư viện nào. Ví dụ như String.h có strcat,strcpy… hay Math.h,… để tính sin, cos.
    Tuy nhiên với .Net ta chỉ cần 1 khai báo chính
    Code:
    #using <mscorlib.dll>
    Là hoàn toàn sử dụng các đối tượng hay namespace cơ bản của .NET
    Ngoài khi cần thiết ta có thể khai báo thêm một số thư viện nếu mình cần.
    Code:
    #using	<system.data.dll>		
    #using	<system.xml.dll>
    Ví dụ như một số Object cơ bản sau.
    Namespace Convert như sau.



    Bên trong nó chứa các hàm để chuyển đổi kiểu dữ liệu. Ví dụ như từ string -> int, hoặc ngược lại…
    .NET hỗ trợ nhiều lớp đối tượng Int32,Single, String, Double … Người lập trình .Net vẫn thích sử dụng nó để thay thế cho int,char… của C++. Bởi lẽ nó là đối tượng nên sẽ có các function rất hữu ích.



    <String.h> và <Math.h> có thể xem như 2 namespace của .Net chuyên dụng này.


    Rõ ràng .NET rất dễ lập trình và autocomplie thì tuyệt vời nữa. Đó là ưu thế của các ngôn ngữ như C#, VB.NET
    Tôi sẽ đi nhanh qua các class và namespace của .Net và có lẽ nó cũng giúp chúng ta hiểu thêm về .NET

    Code:
    System::Collections
    Đây là hàng loạt các đối tượng cho chúng ta tổ chức cấu trúc dữ liệu như danh sách liên kết, hasttable,… rất nhanh chóng mà không cần phải dày công cài đặt như ở C++.
    - System::Collections 			“mscorlib.dll”
    - System::Collections::Specialized	“system.dll”
    - System::Collections::Generic	“system.dll”
    
    System::Data
    Là namespace gốc của ADO.NET. Nó cung cấp cho ta các đối tượng làm việc với hệ quản trị cơ sở dữ liệu. 
    
    Khai báo sử dụng:
    #using	<system.data.dll>		
    #using	<system.xml.dll>
    Một số đối tượng ADO.NET:
    - System::Data::SqlClient	: Microsoft SQL Server 
    - System::Data::SqlClientCe	: Microsoft SQL Server CE Edition 
    - System::Data::Odbc		: ODBC database (Access, Foxpro)
    - System::Data::OleDb		: OLE DB database
    - System::Data::OracleClient	: Oracle database
    
    System::Drawing
    Hay là thư viện GDI+. Chủ yếu là xử lý đồ hoạ trên Windows Forms.
    System::Drawing::Drawing2D	: Các hàm vẽ cơ bản
    System::Drawing::Imaging		: Xử lý hình ảnh.
    System::Drawing::Printing	: Thao tác với máy in
    System::Drawing::Text		: Xử lý đồ họa text
    Khai báo sử dụng:
    #using <System.Drawing.dll>
    
    System::Globalization
    Giúp chúng ta xử lý các thông tin liên quan tới ngày, tháng, thời gian,…
    - Calendar: Làm việc với ngày, tuần,…
    - DateTimeFormatInfo: Định dạng ngày, giờ,…
    - NumberFormatInfo: Định dạng cấu trúc số như ‘.’ ‘,’ …
    - RegionInfo: Chứ thông tin về ngày giờ các quốc gia..
    
    System::IO
    Làm việc với file như ghi, đọc, di chuyển, copy, xoá file hay thư mục,…
    #using <system.dll>
    - BinaryReader: Đọc file dưới hệ nhị phân.
    - BinaryWriter: Ghi file dưới hệ nhị phân.
    - Directory, DirectoryInfo: Di chuyển, xoá thư mục,…
    - File, FileInfo: Tạo xoá file, copy…
    - FileStream: Sử dụng để đọc và ghi file,…
    - MemoryStream: Sử dụng để đua file lên bộ nhớ
    - Path: Làm việc với các đường dẫn file.
    - StreamReader: Đọc hỗ trợ UTF-8.
    - StreamWriter: Ghi hỗ trợ UTF-8.
    - TextReader: Đọc file dươi dạng Text.
    - TextWriter: Ghi gile dưới dạng Text.
    
    System::IO::Port:  Đọc và ghi dữ liệu ra SerialPort,..
    
    System::Management
    Là namespace cho chúng ta truy vấn, lấy các thông tin liên quan tới hệ thống, thiết bị và các ứng dụng,… như dung lượng đĩa cứng, CPU, tên thiết bị chia sẽ,…
    		#using <system.Management.dll>
    
    System::Net
    Cung cấp cho chúng ta các đối tượng để làm việc trên các protocols. Như Mail, HTML, FTP, DNS,… và Sockets để viết các ứng dụng có liên quan tới mạng.
    
    System::Security
    Với Security chúng ta có thể viết các chương trình thực hiện thao tác cấp quyền, sửa đổi với dữ liệu hay làm việc trên Active Directory,…
    
    System::Threading
    Giúp chúng ta giải quyết các vấn đề xử lý song song…
    
    System::Web
    Chủ yếu dùng trong công nghệ WEB như xử lý request, response của HTTP… 
    
    System::Windows:Forms
    Là đối tượng giúp chúng ta xây dựng nên các cửa sổ, textbox,… để giao tiếp với người sử dụng.
    
    System::Xml
    Dùng để làm việc với XML. XML như là một công nghệ mới của .NET, có thể hiểu nó như là một loại cơ sở dữ liệu đơn giản.
    		#using <System.Xml.Dll>
    
    Microsoft::Win32
    Cung cấp cho ta 2 đối tượng là Registry và RegistryKey để chúng ta có thể làm việc với Windows Registry.
    LAYER 3: NGÔN NGỮ THỰC THI CHUNG (Common Language Runtime)

    Với kiến trúc COM trước đây của C++. Người lập trình luôn phải quan tâm đến vấn đề bộ nhớ và cấp phát thread cho ứng dụng. Xong việc thì phải giải phóng… Mạnh với con trỏ nhưng dường như với pointer làm người lập trình chịu quá nhiều gánh nặng.

    -> Ý tưởng bắt đầu từ Java. Sun đã hủy hủy bỏ chức năng pointer của C/C++ và thay bằng references. Nhưng như vậy ai chịu trách nhiệm quản lý bộ nhớ cho Java -> Trả lời luôn thì đó là Java Virtual Machine.
    .NET ngày nay cũng giống như JVM của Java vậy. Trong đó Common Language Runtime chịu trách nhiệm quản lý bộ nhớ cho các ngôn ngữ như C#,VB.NET,C++.NET…

    -> Tại sao Java có thể chạy trên nhiều HDH? Bởi vì chương trình Java được biên dịch ra thành các *.class chứ không phải là các *.exe và *.dll như C++. Và khi chạy thì JVM sẽ dịch tiếp *.class này thành các file thi hành ứng với từng hệ điều hành.
    .NET cũng có cơ chế tương tự. Tất cả các ứng dụng .NET khi chạy mặc dù được biên dịch thành các *.dll và *.exe nhưng nó không chứa code ASM mà chứa code của một ngôn ngữ trung gian là MSIL ().
    Ví dụ một đoạn code như sau:

    Code:
    // C#
    using System;
    class MainApp
    {
           public static void Main()
         {
              Console.WriteLine( "Hello World!" );
           }
    }
    
    Sẽ dịch ra như sau: phần trong /* */ chính là nội dung khi biên dịch như 0x72 0x28 0x2A ...
    // MSIL
    .method public hidebysig static void  Main() cil managed
    {
      /* 72 | (70)000001*/ ldstr "Hello World!"
      /* 28 | (0A)000002*/ call  void System.Console::WriteLine(string)
      /* 2A |           */ ret
    }
    Và khi chương trình chạy thì CLR biên dịch lần cuối ra chương trình ASM thật.
    Như vậy chắc chắn 1 điều là chương trình chạy trên .NET sẽ thi hành chậm hơn chương trình viết trên C++.

    Một điều lưu ý là code viết trên .NET người ta gọi là “Managed Code” bởi vì nó bị quản lý hoàn toàn bởi CLR còn C++ code trước đây thì gọi là “Native Code”.
    Được sửa bởi eXecutive lúc 11:08 ngày 28-09-2007

  3. #33
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    PHẦN II. WHAT IS C++/CLI?
    I. Nguyên nhân ra đời:
    - Giai đoạn từ năm 2002 – 2005 là một giai đoạn mà C++ bị trầm lắng đi rất nhiều so với sự ra đời của C# và VB.NET
    - Mặc dù cũng có thể hoạt động được trên .NET nhưng C++ chỉ là một con bù nhìn bởi vì tính năng con trỏ đã bị quản lý bởi CLR. Ngôn ngữ C++.NET lúc này gọi là Managed C++ bởi lẽ nó có 1 số từ khóa mới.
    - Chúng ta biết trái tim của C++ là pointer nhưng pointer chỉ còn tác dụng là để tham chiếu thì chẳng còn ý nghĩa C++ nữa. Tại sao pointer lúc này chỉ để tham chiếu, đơn giản là vì các class của .NET được viết từ C#, VB.NET,… vốn là các ngôn ngữ không có con trỏ và nó cũng chẳng thể tiếp cận được với Memory một cách trực tiếp mà phải thông qua 1 ứng dụng là CLR.
    - Vì vậy Khi nói đến .NET người ta vẫn nói tới C# và VB.Net nhiều hơn bởi nó mới mẻ, không phải mắc công học thêm từ khóa của Managed C++,… Trong khi với C# và VB.NET người ta có thể lập trình Web được.
    - Visual Studio 2005. Là giai đoạn Managed C++ chuyển thành C++/CLI, một language mới, mạnh, có tính năng mà mọi người vẫn nói ở C#, VB.NET là “mì ăn liền” nhưng vẫn đậm bản chất C++ vì pointer.

    II. Con trỏ Handle:
    a. Tạo Project C++/CLI như thế nào
    Rất đơn giản! chỉ cần chọn New Project:

    Chúng ta có thể chọn 1 trong 2 ứng dụng là Console hoặc Windows Forms.

    b. Con trỏ Handle có ý nghĩa gì?
    - Vấn đề được giải quyết khi chỉ cần thêm 1 handle pointer ^. Handle pointer là một con trỏ ảo. Nó không phản ánh được địa chỉ thật của đối tượng nằm ở đâu trên Memory mà nó phản ánh được 1 giá trị 32bit do CLR quản lý. Và người ta dùng handle pointer để cấp phát hay sử dụng các đối tượng .NET.
    - gcnew -> cấp phát này có ý nghĩa Là quăng object lên CLI HEAP. Khác hoàn toàn với new trước đây của C++.
    Tôi ví dụ như sau:
    Giải thích 1 xíu vì có thể còn lạ với những ai chưa biết .NET:

    Console::Write chính có tác dụng giống printf.
    ArrayList là đối tượng quản lý mảng hơi giống CptrArray của C++/MFC vậy. Nó hay hơn nhiều so với khai báo mảng [ ] trước đây.

    Code:
    #using <mscorlib.dll>
    
    using namespace System;
    using namespace System::Collections;
    
    int main(array<System::String ^> ^args)
    {
    	ArrayList^ aList = gcnew ArrayList;
    // Add -> Thêm phần tử
    	aList->Add("KHONG ");
    	aList->Add("MOT ");
    	aList->Add("HAI ");
    	aList->Add("BA ");
    	aList->Add("NAM ");
    	aList->Add("SAU ");
    // Insert thêm phần tử vào vị trí 4
    	aList->Insert(4,"BON ");
    
    // In danh sách mảng
    	for (int i=0;i<aList->Count;i++)
    		Console::Write(aList[i]);
    // Reverse đảo ngược mảng
    	aList->Reverse();
    	Console::WriteLine();
    	for (int i=0;i<aList->Count;i++)
    		Console::Write(aList[i]);
    // Sort sắp xếp tăng dần
    	aList->Sort();
    	Console::WriteLine();
    	for (int i=0;i<aList->Count;i++)
    		Console::Write(aList[i]);
    		
    	String^ Find = "KHONG ";
    // Contains kiểm tra Array có chứa giá trị đưa vào
    	bool b = aList->Contains(Find);
    	if (b) {
    // Tìm kiếm nhị phân
    		int index = aList->BinarySearch(Find);
    		Console::WriteLine();
    		Console::WriteLine("Gia tri 
    {0} nam o phan tu thu {1}",Find,index);
    // Remove và RemoveAt xoá phần tử 
    		aList->Remove("KHONG ");
    		aList->RemoveAt(1);
    		for (int i=0;i<aList->Count;i++)
    			Console::Write(aList[i]);
    		}
    	else{
    		Console::WriteLine("Khong tim thay gia tri {0}");
    	}
    
    	return 0;
    }
    Như vậy ta có thể hiểu cơ chế quản lý Memory thông qua một hình đơn giản như sau của một số ngôn ngữ qua hình đơn giản sau:

    Có thể hình ảnh trên sẽ đưa cho ta một số nhận thức về con trỏ.

    III. Tính năng Object:
    C++/CLI có các Object mang đậm phong cách của .NET vì nó có thêm nhiều tính năng mới.
    4 loại đối tượng mà C++/CLI có là:
    Code:
    class			// C++ chuẩn trước đây.
    enum class 		// C++ chuẩn cũng có
    
    value class		
    // giống value class của C#. Sử dụng để tạo những đối tượng không quá phức tạp tức là không có chức năng quản lý bộ nhớ. Và đặc điểm của nó là có operator= mặc định (tự động chép các biến thành viên). C# phải mất operator= vì nó mặc định là phép tham chiếu nên value bổ sung khiếm khuyết này.
    
    ref class			
    // Chính là class của C#.
    
    interface class	
    // Gần giống như abstract class của C++. Là nơi chứa các virtual function để các con của nó có thể thừa kế.
    Tính năng của nó như sau:

    Trong đó có thêm 3 tính năng mới là Events, Finalizer và Properties.
    Sẽ đi nhanh qua 3 tính năng này 1 cách nhanh chóng.

    Properties
    Thực ra tính năng này đã hoàn thiện từ rất lâu rồi, tôi đã biết tới nó khi sử dụng nó trong Visual Basic 6 nhưng khi sử dụng C++/CLI thì mới biết Object C++ không có chức năng này.

    C++/MFC có 2 hàm như: SetWindowsText và GetWindowsText.
    Với Properties thì người ta gói gọn nó lại là 1 Properties.
    Ví dụ như:
    Code:
    Form.Title = “HELLO”;    // Gọi hàm Set
    String str = Form.Title; // Gọi hàm Get
    Code đơn giản như sau:
    Code:
    ref class Point {
        int Xor;
        int Yor;
    public:
        property int X {
            int get() { return Xor; }
            void set(int value) { Xor = value; }
    }
    property int Y {
            int get() { return Yor; }
            void set(int value) { Yor = value; }
    }
    };
    
    Point p;
    p.X = 10;		// Toạ độ hiện tại là (10,0)
    p.Y = 10;		// Toạ độ hiện tại là (10,10)
    
    Console::WriteLine(“Toa do p la ({0},{1})”,p.X,p.Y);
    Finalizer
    Cái này rất hay và phản ánh đúng những gì chúng ta hiểu về Object.

    - Constructor: Phương thức thiết lập.
    - Destructor: Phương thức phá hủy.
    - Finalizer lại là cái gì ???
    Một đoạn code tiếp nha:
    Code:
    ref class Test{
    	String^ m_pName;
    public:
    	Test(String^ Name){
    		m_pName = Name;
    	}
    	~Test(){	// Destructor
    		Console::WriteLine("Destructor " + m_pName + " dang thuc hien!");
    	}
    	!Test(){	// Finalizer
    		Console::WriteLine("Finalize " + m_pName + " dang thuc hien!");
    	}
    };
    void f(){
    	Test A("<doi tuong A>");			   
    // Đối tượng trên CLI STACK
    	Test^ B = gcnew Test("<doi tuong B>");
    // Đối tượng trên CLI HEAP
    }
    
    int main(array<System::String ^> ^args){
        f();	
        Console::WriteLine("\nSau khi goi xong ham f() \n");
        return 0;
    }
    Kết quả in ra như sau:


    Một điều tôi xin nói thêm là khi Object được cấp phát bằng gcnew thì không cần phải [delete bởi vì nó đã bị Managed (CLR sẽ delete dùm mà). Và Finalize sẽ thi hành khi CLR hủy đối tượng đó.
    Ở chương trình trên:
    Ví A nằm trên STACK nên nó sẽ bị hủy khi kết thúc hàm -> Destructor thực hiện.
    Còn B nằm trên HEAP. Khi kết thúc chương trình thì CLR hủy nó -> Finalize thực hiện…

    Events
    Nó hơi giống như chức năng “đa hình” của Object C++ tức là người lập trình sẽ đưa 1 hàm vào cho nó và nó sẽ tự động gọi hàm đó theo từng sự kiện. Vấn đề là tại sao lại có Event??

    Đơn giản là vì các ngôn ngữ cấp cao không có con trỏ, do đó nó không thể truyền hàm bằng con trỏ giống C/C++ được. Ví dụ

    Code:
    delegate void MyFunc(int nValue);	// Khai báo uỷ quyền
    // Giống khai báo con trỏ hàm: void (*MyFunc)(int);
    
    void eXPrint(int nValue){
    	Console::WriteLine(nValue);
    }
    
    void main(){
    	MyFunc^ ham = gcnew MyFunc(&eXPrint);	
    // Giống Myfunc p = &eXPrint;
    	ham(2);		// Gọi hàm eXPrint(2);
    	// Giống p(2); như ở C/C++.
    }
    Lợi dụng điều này thì Object sẽ có thêm 1 tính năng khá thuận tiện là events.
    Code:
    delegate void SayHandler(String^ name);
    
    ref class EventSource{
    public:
    	event SayHandler^ OnSay;
    	
    	void Say(String ^Name){
    		OnSay(Name);			
    // Gọi EVENT OnSay mặc dù chưa có hàm OnSay(String^)
    	}
    };

    Code:
    ref class EventReceive{	
    	EventSource^ src;
    public:
    	EventReceive(EventSource^ pSrc){
    		src = pSrc;
    			// Gán hàm SayHello cho Event OnSay
    
    		src->OnSay 
    += gcnew SayHandler(this,&EventReceive::SayHello);
    
    			// Gán hàm SayBye cho Event OnSay
    		src->OnSay 
    += gcnew SayHandler(this,&EventReceive::SayBye);
    	}
    
    	void SayHello(String^ name){
    		Console::WriteLine("Xin chao " + name);
    		Console::WriteLine("Chuc vui ve");
    	}
    
    	void SayBye(String^ name){
    		Console::WriteLine("Tam biet nhe! " + name);
    	}
    };
    
    int main(array<System::String ^> ^args){
    EventSource  EventS;
    EventReceive Event(%EventS);	// Gán 2 hàm cho Events OnSay
    	
    EventS.Say("Hi U");
    // Thực hiện 2 hàm SayHello và SayBye
    return 0;
    }
    Và từ đây Windows Forms cho ta các sự kiện chuẩn như OnClick (Nhắp chuột), OnKeyDown,… để chúng ta gán các hàm do mình viết vào. Chức năng này phần nào thuận tiện hơn nhiều so với DECLARE MESSAGE MAP của C++/MFC.


    Boxing và Unboxing
    Đây là cơ chế để Object chuyển từ CLI STACK -> CLI HEAP hoặc ngược lại.
    Ví dụ như ta khai báo.
    MyObject Obj;

    Thì Obj hiện đang nằm trên CLI STACK. Làm thế nào để đưa nó lên HEAP.
    Object^ pheap = Obj;
    Như vậy là Obj sẽ nằm trên CLI HEAP. Và nó tồn tại suốt chương trình.
    Object là một lớp có sẵn của .NET và nó chỉ chịu nằm trên CLI HEAP.
    -> Đây là cơ chế Boxing!

    Như vậy muốn đem Obj xuống CLI STACK.
    MyObject^ pstack = Obj;
    -> Unnoxing

    Như vậy ta có thể giải thích tại sao khai báo như vậy lại không lỗi:
    String^ a = “eXecutive”;

    String là 1 đối tượng. ^a là 1 con trỏ handle chưa được cấp phát bộ nhớ nhưng lại gán bằng chuỗi “…” -> .NET sẽ hiểu đây là cơ chế Boxing tức nó sẽ đưa (*a) lên CLI HEAP. Nhờ vậy mà các chương trình viết trên .Net dường như ít khi nào lỗi về bộ nhớ giống C++.

    Tóm lại:
    Như vậy hướng đối tượng của C++ có phải là mạnh hay không???
    Chưa mạnh! nhưng nó phản ánh đúng thật tế và sự tồn tại của Object như thế nào.

    -> Tại sao một lớp cha có thể nắm địa chỉ của các lớp con thừ kế nó?
    Đơn giản chỉ vì tất cả mọi con trỏ đê có thể biểu diễn là (void*).
    Con thừa kế cha thì cha quản lý con chỉ là một ràng buộc của Object mà thôi.
    -> Tại sao lại có đa hình (đa xạ). Nó chỉ là cách truyền con trỏ hàm.


    Giữa C và C++ thì theo tôi C++ là sự trưởng thành của C.
    Object của C++ khi biên dịch sẽ tách thành struct và các function. Và cuối cùng sẽ biên dịch ra mã máy ASM.

    Trình biên dịch mới cảm nhận được sự khác nhau giữa 2 điều này. Còn về ứng dụng khi biên dịch *.exe dù cho viết bằng C hay C++ đều hoàn toàn như nhau bởi vì nó đã chuyển thành mã máy... Nhưng Java và C#,.. vì nó chưa phải là mã máy.
    Tôi không hiểu tại sao mọi người cố công nhận sức mạnh của C mà lại phủ nhận C++.

    Việc HDH viết từ C++ hay C chỉ là một phần. Nó còn có thể tham gia thêm ASM vì cho dù gọi hàm tới đâu thì vẫn phải dùng ngắt để điều khiển phần cứng.


    Và đối tượng của C++ khác biệt hoàn toàn với đối tượng của C#,VB.NET hay C++/CLI bởi vì nó được giả lập bởi CLR!
    Khi lập trình HĐT bằng Java hay C#,… Nó có những tính năng nâng cao hơn, chúng ta chỉ có thể hiểu nhưng không có được câu hỏi tại sao??? Đó là lý do mà “tại sao nên chọn C++ để học lập trình hướng đối tượng”
    Được sửa bởi eXecutive lúc 11:37 ngày 28-09-2007

  4. #34
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    III. Mixing .NET và API
    Vì một số lý do tôi phải post part 2 hơi sớm nên không thể hoàn thành phần này được.
    Tôi sẽ cố gáng bổ sung nó sau vài ngày nữa.
    Được sửa bởi eXecutive lúc 10:44 ngày 28-09-2007

  5. #35
    Tham gia
    14-12-2004
    Bài viết
    216
    Like
    0
    Thanked 4 Times in 4 Posts
    Đọc xong ko hiểu gì cả, túm lại giùm được ko ?

  6. #36
    Tham gia
    18-05-2006
    Bài viết
    52
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi eXecutive View Post
    Tôi xin gác lại một số vấn đề mà các bạn đang bàn luận làm đi sai TOPIC ở đây.
    Tôi góp ý để chất lượng bài của bạn tăng lên. Việc bạn nghĩ chúng "sai topic" là do bản chất rất chuối của forum. Có lẽ tôi sẽ liên hệ bàn bạc với anh Vi Khoa để cải tiến.

    Nếu muốn chúng ta có thể lập riêng 1 TOPIC và bạn luận. Vì đây là TOPIC "point of C++".
    Góp ý ngay tại chỗ, rất visual thế này mà còn k ăn thua nữa là. Ngoài ra, con trỏ = pointer chứ k phải là point.

    ---------------------

    Xin k bình luận về những nhầm lẫn về C++, MFC, file .h v.v. (bạn nào quan tâm C/C++ xin đọc thêm về .h, .lib, .dll), mà xin đi thẳng vào trọng tâm.

    Post vừa rồi của bạn cho thấy bạn ngày càng đi lan man sai topic (bạn ohyesssvn k hiểu là phải). Việc bạn không hiểu hoặc phớt lờ ý kiến của jiSh@n về máy ảo (mà jiSh@n chỉ tận tay day tận mặt đấy nhé!) dẫn đến việc bạn mất rất nhiều thời gian để kể lể về .NET, chẳng liên quan gì đến con trỏ C++ thuần túy, cái C++ do Bjarne Stroustrup sáng tạo ra và được chuẩn hóa vào năm 1998.

    Vì sao? Vì .NET là layer nằm phía trên Windows API (viết bằng C đấy nhé, nên những framework C++ như MFC chỉ là wrapper thôi). Và vì là layer này nằm trên, nên nó đâu liên quan gì đến C++ thuần túy?!

    Code:
    +--------------------------------+
    | .NET (managed C++, C++/CLI...) |
    +--------------------------------+
    |           Windows API          |
    +--------------------------------+
    Chắc chắn chữ C++ trong "managed C++" và "C++/CLI" (2 cái này khác nhau đấy nhé), tạm gọi là "giả C++" đã đánh lừa bạn. Bạn đừng nói là vì có dính chữ C++ nên nó cũng là C++ thuần túy nhé. Lí do:
    * Giả C++ chạy trên layer .NET, cho dù mấy cái giả C++ này được thiết kế trên trời dưới đất đi nữa, thì muốn làm ăn gì thì đều phải thông qua .NET, rồi qua Windows API. Do đó cái làm người ta liên tưởng đến C++ thuần túy chỉ là cái tên và cú pháp được làm nhái.
    * Topic này chỉ nên bàn về C++ thuần túy. Nếu bạn coi bất kì cái gì có dính chữ C++ đều phải dc bàn luận ở topic này, thì chẳng may nếu khám phá ra con bác Bill có nickname là C++, chắc bạn cũng gộp cả con ông ta vào đây?! K nên mất nhiều thời gian nói về thứ C++ k chạy dc trên DOS16, các hệ thống nhúng như điện thoại di động, Linux, MacOS, Solaris...

    Tôi không hiểu tại sao mọi người cố công nhận sức mạnh của C mà lại phủ nhận C++.
    Có lẽ đây là xuất phát điểm cho các bài viết của bạn. Nhưng xuất phát điểm lại sai bét. Có ai phủ nhận C++ yêu quí của bạn (và ít ra là của tôi và jiSh@n nữa) đâu nhỉ?! Những gì C làm được thì C++ làm được và làm tốt hơn. Còn việc có người dùng C mà k dùng C++ thì có vài lí do:
    * Những cái đã cũ như Linux kernel, Windows API, compiler của Perl, PHP, Ruby... viết bằng C là vì lí do lịch sử. Lúc đấy C++ chưa chuẩn và khó dùng. Xin đọc lại bài học của Symbian.
    * Những cái mới, nhưng lại viết bằng C là vì người ta bị ép buộc (sếp, kĩ thuật k cho phép, trình độ chuyên môn của bản thân có hạn k học dc C++, project quá gấp k có thời gian học...).

    Cuối cùng, việc bạn thú nhận là k rành về web là dấu hiệu gì đó đấy. Theo lí thuyết con bướm như đã đề cập, việc k biết viết web về lâu dài có thể trở thành sai lầm của đời bạn đấy. Tại sao? Xin đọc Microsft đã thua trận chiến API như thế nào.
    Được sửa bởi ngocdaothanh lúc 19:34 ngày 28-09-2007

  7. #37
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    Dường như khi post topic tôi đã đoán trước kết cục nó sẽ đi như thế này. Đó là nguyên nhân mà tôi đã để color=green để viết những dòng đầu tiên trên bài viết.
    Và rõ ràng tôi thấy những người phản biện ý kiến của tôi đều là những người không phải lập trình C/C++. Dường như họ luôn bị quá kích khi đọc những bài viết về C++ của tôi! Tôi hoàn toàn đọc những nhận xét và luôn rut kinh nghiệm trong những bài viết để tránh những hiểu lầm.

    Khi tôi đăng ký nick name eXecutive trên forum này. Điều mà tôi muốn là trình bày những gì tôi biết về C/C++ đến mọi người. C/C++ là một tri thức lớn. Lớn hơn hẳn so với lịch sử các ngôn ngữ khác! đó là lý do mà tôi yêu C++ cũng như C.

    Ở topic này đang đặt câu hỏi về pointer.
    Người ta hỏi con trỏ handle^ là gì? Tôi có thể trả lời nó ngắn gọn nhưng chắc gì bạn có hiểu được nó là gì hay không??? Muốn hiểu nó phải hiểu cấu trúc .NET đó là lý do mà tôi phải kể lễ... Tại sao không sử dụng pointer* mà lại dùng handle^.

    Bạn chưa đọc kỹ mà cho rằng tôi đi sai TOPIC là một sai lầm. Nếu bạn cho tôi đi sai topic thì tại sao bạn không viết như tôi và trình bày cho người khác đọc theo cách nghĩ của bạn đi!

    Dẫu sao mục tiêu khi tôi lên diễn đàn này là viết về C/C++. Gần như 90% số bài viết của tôi đều nằm trong BOX này. Tôi cũng được một số lời động viên của các bạn. Tôi xin cảm ơn. Và tôi xin hứa sẽ có những bài viết chất lượng hơn trong những TOPIC sau.

  8. #38
    Tham gia
    18-05-2006
    Bài viết
    52
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi eXecutive View Post
    Dường như khi post topic tôi đã đoán trước kết cục nó sẽ đi như thế này. Đó là nguyên nhân mà tôi đã để color=green để viết những dòng đầu tiên trên bài viết.
    Và rõ ràng tôi thấy những người phản biện ý kiến của tôi đều là những người không phải lập trình C/C++.
    Về C/C++ thì tôi đã viết nhiều bài từ 3, 4 năm trước. Thí dụ những bài như thế này có được coi là viết bởi người lập trình C/C++?

    http://vcsj.net/modules.php?name=News&new_topic=8

    Dường như họ luôn bị quá kích khi đọc những bài viết về C++ của tôi! Tôi hoàn toàn đọc những nhận xét và luôn rut kinh nghiệm trong những bài viết để tránh những hiểu lầm.
    Quá khích chỗ nào vậy nhỉ? Để tránh hiểu lầm thì bạn hãy trích dẫn từ những nguồn tin cậy như tôi đã đề xuất, chứ k nên (1) nói khơi khơi và (2) nói rất dài để làm loạn trí những bạn chưa có nhiều kinh nghiệm. Mọi người ở đây đều open mind cả, xin bạn đừng act like a looser.

    Người ta hỏi con trỏ handle^ là gì? Tôi có thể trả lời nó ngắn gọn nhưng chắc gì bạn có hiểu được nó là gì hay không??? Muốn hiểu nó phải hiểu cấu trúc .NET đó là lý do mà tôi phải kể lễ... Tại sao không sử dụng pointer* mà lại dùng handle^.
    * hay ^ chỉ là cú pháp. Bản chất của handle là để hệ điều hành dễ dàng quản lí tài nguyên + k làm programmer phải rối trí.

    Hóa ra bạn dẫn dẵn .NET ra vì nghĩ khái niệm handle phải đến .NET mới có?! :P Ngay cả những người mới chập chững học lập trình còn biết truy xuất file thì phải dùng file handle.

    Muốn biết tại sao handle cho phép "hệ điều hành dễ dàng quản lí tài nguyên + k làm programmer phải rối trí", xin đọc quyển này:

    Windows Graphics Programming: Win32 GDI and DirectDraw

    Nó có đoạn trình bày rất rõ lí do.

  9. #39
    Tham gia
    23-02-2003
    Location
    Melbourne
    Bài viết
    5,201
    Like
    0
    Thanked 24 Times in 18 Posts
    Quote Được gửi bởi eXecutive View Post
    Dường như khi post topic tôi đã đoán trước kết cục nó sẽ đi như thế này. Đó là nguyên nhân mà tôi đã để color=green để viết những dòng đầu tiên trên bài viết.
    Và rõ ràng tôi thấy những người phản biện ý kiến của tôi đều là những người không phải lập trình C/C++. Dường như họ luôn bị quá kích khi đọc những bài viết về C++ của tôi! Tôi hoàn toàn đọc những nhận xét và luôn rut kinh nghiệm trong những bài viết để tránh những hiểu lầm.

    Khi tôi đăng ký nick name eXecutive trên forum này. Điều mà tôi muốn là trình bày những gì tôi biết về C/C++ đến mọi người. C/C++ là một tri thức lớn. Lớn hơn hẳn so với lịch sử các ngôn ngữ khác! đó là lý do mà tôi yêu C++ cũng như C.

    Ở topic này đang đặt câu hỏi về pointer.
    Người ta hỏi con trỏ handle^ là gì? Tôi có thể trả lời nó ngắn gọn nhưng chắc gì bạn có hiểu được nó là gì hay không??? Muốn hiểu nó phải hiểu cấu trúc .NET đó là lý do mà tôi phải kể lễ... Tại sao không sử dụng pointer* mà lại dùng handle^.

    Bạn chưa đọc kỹ mà cho rằng tôi đi sai TOPIC là một sai lầm. Nếu bạn cho tôi đi sai topic thì tại sao bạn không viết như tôi và trình bày cho người khác đọc theo cách nghĩ của bạn đi!

    Dẫu sao mục tiêu khi tôi lên diễn đàn này là viết về C/C++. Gần như 90% số bài viết của tôi đều nằm trong BOX này. Tôi cũng được một số lời động viên của các bạn. Tôi xin cảm ơn. Và tôi xin hứa sẽ có những bài viết chất lượng hơn trong những TOPIC sau.
    Bạn phớt lờ các ý kiến phản biện thì tôi cũng ko nhắc đến những vấn đề đó nữa. Bây giờ quay lại vấn đề con trỏ, bạn đang làm nó phức tạp thêm với những lê thê về .Net.
    Đây là định nghĩa về con trỏ: http://en.wikipedia.org/wiki/Pointer
    pointer is a programming language data type whose value refers directly to (or “points to”) another value stored elsewhere in the computer memory using its address.
    Con trỏ là 1 kiểu dữ liệu của ngôn ngữ lập trình, ko phải của riêng C hay C++. Nếu bạn có học môn Lý thuyết về Ngôn ngữ Lập trình thì bạn sẽ càng hiểu rõ hơn về con trỏ. Trong C++ có thể có nhiều loại "được gọi" là con trỏ nhưng tựu chung vẫn chỉ có duy nhất 1 lọai con trỏ đúng nghĩa: 1 biến có giá trị là địa chỉ của 1 vùng nhớ nào đó. Trên tất cả các ngôn ngữ lập trình hỗ trợ con trỏ thì khái niệm này luôn luôn đúng, và cách tổ chức con trỏ cũng như nhau. Bạn chia pointer và far pointer ra làm hai loại khác nhau. far là 1 modifier cho phép con trỏ bình thường có thể trỏ vào vùng nhớ heap thay vì stack. Có thể do bạn phân biệt stack và heap nên bạn chia nó ra làm 2 loại, tôi cũng ko có ý kiến về việc chia chác này.

    Tôi ko nghiên cứu về .Net nên ko rõ cái Handle có ý nghĩa như thế nào, nó có thực sự là con trỏ hay ko. Nhưng qua mô tả của bạn :
    Tuy vậy, MS lại nhẹ nhàng đưa vào một biến đại diện an toàn để thay thế con trỏ là HANLDE. Do đó chúng ta muốn gửi thông tin 1 chương trình khác, đơn giản chúng ta chỉ cần tìm HANDLE của nó và SendMessage với tham số thứ nhất là HANDLE cần đưa vào.
    Rõ ràng Handle ở đây là 1 phần của cơ chế message trong Windows, là cách mà Windows dùng để quản lý các đối tượng trong bộ nhớ. Từ khi Windows ra đời đã có Handle chứ ko đợi đến .Net. Khi tôi bắt đầu lập trình trên nền Win95, đọc trong Windows 95 SDK đã có đề cập đến Handle (đa số API đều dùng Handle), và chưa bao giờ tôi thấy SDK gọi handle là "pointer", và bản chất thực sự của handle cũng chỉ là 1 số nguyên 32bit ko hơn ko kém (gọi là HWND), mục đích để "index" các đối tượng trong bộ nhớ hơn là "point" đến các đối tượng đó. Trong SDK có 1 kiểu dữ liệu tên là HANDLE (mà bạn gọi là con trỏ Handle trong ví dụ sử dụng API GetProcessHeap), nhưng thực tế nó chỉ là 1 số Integer 32bit ko hơn ko kém, chả khác gì kiểu HWND, và nhiệm vụ thực tế của nó cũng là "index" hơn là "point". Nếu bạn lấy giá trị 32bit của biến HANDLE làm địa chỉ của 1 con trỏ thì bạn sẽ được 1 pointer chỉ vào 1 vùng nhớ "trời ơi" nào đó trong không gian địa chỉ của ứng dụng.

    Bạn có đi sai topic ko? Xin thưa rằng có. Chủ đề của topic là con trỏ trong C++. Ngay từ đầu bạn đã đưa cách phân chia bộ nhớ của DOS, cách đánh địa chỉ segment:offset (vốn ko tồn tại trên nền Windows), kể tên các thanh ghi của CPU, rồi khẳng định DOS vẫn tồn tại trên nền WindowsXP/Vista, bàn về cách xây dựng hệ điều hành, sau đó là cấu trúc của .Net framework rồi lại C++/CLI.... Đọc qua hàng loạt post rõ ràng là "lịch sử" của lập trình hệ thống trên DOS rồi tới sức mạnh của C++/CLI thì đúng hơn là con trỏ trong C++.
    Được sửa bởi jiSh@n lúc 23:16 ngày 28-09-2007

  10. #40
    Tham gia
    12-04-2007
    Location
    Việt Nam Quê Hương tui
    Bài viết
    241
    Like
    0
    Thanked 0 Times in 0 Posts
    Đồng ý với bác jiSh@n là nhiệm vụ của pointer là trỏ tới một vùng nhớ nào đó trên bộ nhớ. Nhưng bài viết của bác eXecutive cũng có giải thích rõ là con trỏ đó đang được biểu diễn trong DOS mà (sử dụng BORLAND C++ để lập trình) sau đó mới nói tới C++/CLI. UHM, nói chung thì em ko thể nhận xét được ai là đúng ai là sai (chưa đủ công lực do mới học lập trình có 1 năm à, đúng ra học lập trình C++ thì có 1/2 năm à, nửa năm trước em mới chập chửng với thằng Pascal thui) nhưng mỗi ý kiến của mọi người lại giúp em có thêm kinh nghiệm trong việc xem các tài liệu cao hơn. Còn giả sử bác eXecutive sai trong việc nói về cách tổ chức dữ liệu của RAM hay cách mà RAM biểu diễn pointer đi thì bác jiSh@n có thể cho biết quan điềm (hay nhận định) của bác về cái này để mọi người có thể học hỏi được ko ạ.

Trang 4 / 10 FirstFirst 12345679 ... LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •