May 1, 2012

Struct, Enum, union.

 

Thực tế enum và struct, union không có sự liên quan mật thiết cho lắm.

enum dùng để khai báo danh sách  các hằng nguyên.

Giả sử ta muốn thiết lập cá giá trị màu, ví dụ: RED = 0; BLACK = 1; WHITE = 2; BLUE =4;

Thông thường ta dùng #define:

#define RED 0
#define BLACK 1
#define WHITE 2
#define BLUE 3
Tuy nhiên, ta có thể rút gọn bằng cách viết sau:



enum color {RED,BLACK,WHITE,BLUE};

Một số điều lưu ý:



  • Giá trị đầu tiên, nếu không khởi tạo giá trị thì mặc định là bằng 0.

  • Nếu không thiết lập giá trị thì hằng đó được tính bằng giá trị đứng trước cộng 1, đến khi nào gặp được hằng có giá trị khởi tạo hoặc giá trị đầu tiên.

Ví dụ:



enum Color{
RED; // = 0
BLACK; // = 1
WHITE; // =2
BLUE; // 3
GREEN = 100; 
YELLOW; // = 101
CYAN; // = 102
};
 

Khai báo và sử dụng:


enum Color cl;


Chỉ sử dụng các hằng đã khai báo trong enum để tính toán và sử dụng.Nếu tính toán với các số nguyên khác thì nên ép kiểu.


Ví dụ chung:


 



#include <iostream>
using namespace std;
enum Shape{
    circle = 0, // first element = 0 default;
    triangle =5,
    ellipse ,
};
int main() {
    enum Shape s1;
    s1 = circle;
    cout << "Circle " << dec << s1 << endl;
    s1 = triangle;
    cout << "Triangle = " << dec << s1 << endl;
    s1 = ellipse;
    //s1 = 0; // error
    s1 = (enum Shape) (triangle + 100);
    cout << "Ellipse = " << dec << s1 << endl;
    cout << "Size of shape:" << sizeof(Shape) << endl;
    return 0;
}

Union và Struct:


Đều mang ý nghĩa là khai báo và thiết lập dữ liệu có cấu trúc. (struct cũng giống class trong C++ để khai báo đối tượng, điểm khác nhau là class mặc định access control là private, còn struct là public). 


Về chức năng của struct và union hoàn toàn giống nhau, chỉ khác một điều union tận dụng tối đa vùng nhớ trống để lưu trữ kiểu dữ liệu. Còn struct thì không. 


Code sau đây mô tả phần nào sự khác biệt của struct và union:



#include <iostream>
using namespace std;
typedef union Struct1{
    char a;
    char b;
    int c;
};
// *************************
typedef struct Struct2{
    char a;
    char b;
    int c;
};
typedef Struct1 STRUCT1;
typedef Struct2 STRUCT2;
int main() {
    STRUCT1 a1;
    STRUCT2 a2;
    cout <<"Size of struct 1" << sizeof(a1) << endl;
    cout << "Size of struct 2" << sizeof(a2) << endl;
    a2.a = 10;
    a2.b = 20;
    int t = a1.a + a1.b;
    int tt = *(&a2.a) + *(&a2.b); 
    cout << "SUM = " << tt << endl;
    return 0;
}

Thông qua đoạn code, ta thấy:



  • Truy cập thành phần bằng dấu ".".

  • Tính toán và sử dụng như các biến bình thường, truy xuất địa chỉ cũng tương tự.

Kiểu dữ liệu có cấu trúc rất mạnh và cần một bài khác để viết. Tạm thời bài này chỉ giới thiệu sơ khởi và cơ bản về các khái niệm này.


 


 


 

Hằng, các vấn đề xung quanh.


Một hôm rảnh rỗi tìm hiểu về cái này. Một khái niệm quá phổ biến, nhưng trong một số ngôn ngữ lập trình, C/C++ chẳng hạn, thì cần phải tìm hiểu một cách rõ ràng.

Định nghĩa: Constant là một giá trị xác định không thể bị thay đổi trong suốt quá trình chạy của chương trình. (Nguồn).
Khai báo: Có 3 cách thông dụng:
  • Trực tiếp.
  • Dùng macro: #define.
  • Dùng từ khóa const.
Sự khác biệt đáng chú ý là macroconst. Ví dụ #define A 200const int A = 200; Macro đơn giản chỉ là trước khi dịch chương trình, trình compile sẽ thay thế (replace) tất cả các ký tự 'A' thành '200' cho hợp ngữ. Còn const thì khác, nó sẽ cấp phát 1 vùng nhớ có kích thước của int và gán giá trị của nó là 200, đồng thời vùng nhớ đó không thể bị thay đổi trong lúc chương trình chạy.

Tọa đàm đôi chút về hằng trong C++:
Cú pháp:
Const int x = 5 hay int const x = 5 là tương đương nhau, tuy nhiên, sẽ là rất khác với kiểu con trỏ (pointer).
Const pointer:
Cho đoạn code ví dụ sau:
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
    const int x = 5; 
    int y = 5;
 
    const int *px = &x; //(1) similar: int const *px = &x;
//    int* ppx = &x;
    int *py = &y; // (2)
    const int* ppy = &y;
    const int* const cpx = &x;
    int * const cpy = &y;
    //++x;
    ++y;
    ++px;
    ++py;
    //++cpx;
    //++cpy;
    //++(*ppy);
    //++y;
    return 0;    
}

Có một số điều cần nói ở code:


  • x  là một hằng, không thể thay đổi giá trị của nó được.

  • y là một biến.

  • px là biến con trỏ, nó trỏ đến hằng x và hằng này có kiểu là int nên kiểu dữ liệu của nó là const int* (int const* tương đương).

  • py : biến con trỏ, trỏ đến kiểu int.

  • cpx: hằng con trỏ, trỏ đến đến kiểu "const int".

  • cpy: hằng con trỏ, trỏ đến kiểu "int".

Vậy nên khi viết "int* px = &x" sẽ bị báo lỗi không thể chuyển (converion) được.

Còn nếu viết const int* ppy=&y thì sao?

Ở đây y vẫn là biến, tuy nhiên, ppy sẽ là biến con trỏ, nhưng (*ppy) lại là hằng. Thành ra ++ppy thì ok nhưng ++(*ppy) bị báo lỗi.

Điều cần lưu ý ở đây là xác định rõ, đâu là con trỏ hằng, và đâu là hằng con trỏ.

Chuỗi ký tự: Đâu là sự khác nhau giữa 2 dòng code sau:

char* ch = "Hello"; //(1)

char chs[] = "Hello"; //(2)

Ở (1), ch là một biến con trỏ kiểu cha, và nó có giá trị là địa chỉ đầu tiên của "Hello" (tức là 'H') và "Hello" là một chuỗi hằng, không thể thay đổi được.

chs[] lại khác, nó là một biến chuỗi kí tự và có thể thay đổi giá trị các thành phần trong đó được.

Hàm hằng:

Công thức:

<return-value> <class>::<member-function>(<args>) const

{

        // ...

}



Một số lưu ý:
  • Hàm này phải là một method trong class.
  • Không sử dụng với các phương thức tạo lập (constructor) và phương thức hủy (destructor)
  • Hàm này chỉ đọc (read-only): hàm không thể thay đổi giá trị mà đối tượng nó gọi đến.
  • Mọi đối tượng (non-const hay const) đều có thể gọi hàm này.
  • Đối tượng hằng (const obj) chỉ có thể gọi được các hàm hằng.

Ví dụ:

#include <iostream>
class Num{
private:
    int a;
 
public: 
    Num(int X){
        a = X;
    };
    int GetNum() const { return a;}
    void SetNum(int A) {this->a = A;}
};
int main() {
    Num num1(1);
    const Num num2(1);
    num1.SetNum(2);
    std::cout<< num1.GetNum()<< std::endl;    
    std::cout << num2.GetNum() << std::endl;
    num2.SetNum(4);
 
    return 0;
}






Apr 30, 2012

Khái niệm về đối tượng trong OOP

Đây là những kiến thức mình lượm lặt được, lượt dịch trong sách “Thinking in C++”, Wiki … Và đây là những kiến thức cơ bản nhất về đối tượng trong OOP

Apr 29, 2012

Hướng dẫn thiết lập file host để vào FB

Đầu tiên, tải file sau đây về:

Link download.

Sau đó dùng notepad mở nó ra, Crtl + A rồi Ctrl + C để chọn toàn bộ rồi copy.

Tiếp tục, dùng notepad, mở file sau: [Ổ cứng cài Win]:\Window\System32\drivers\etc. Mở file host, lưu ý phần extension chọn All Files.

image

Trước khi mở để chỉnh sửa file host phải kiểm tra xem nó đã hủy thuộc tính read-only chưa bằng cách click chuột phải vào file đó và chọn Properties. Tick bỏ chọn mục Read-only đi.

image

Apply > OK

Sau đó, click chuột vào vị trí cuối cùng của nội dung file, hoặc nhấn enter tạo dòng mới rồi Crtl+V để dán nội dung mới vào.

#Powered by Blue Space Solutions - Find us at: www.bluespace.vn
127.0.0.1 localhost
?115.78.130.224 courses.fit.hcmus.edu.vn
115.78.130.224 www.fit.hcmus.edu.vn
96.17.180.162 www.facebook.com
96.17.180.162 www.login.facebook.com
96.17.180.162 facebook.com
96.17.180.162 graph.facebook.com
96.17.180.162 register.facebook.com
96.17.180.162 vi-vn.connect.facebook.com
96.17.180.162 vi-vn.facebook.com
96.17.180.162 static.ak.connect.facebook.com
96.17.180.162 developers.facebook.com
96.17.180.162 error.facebook.com
96.17.180.162 channel.facebook.com
96.17.180.162 register.facebook.com
96.17.180.162 bigzipfiles.facebook.com
96.17.180.162 pixel.facebook.com
96.17.180.162 register.facebook.com
96.17.180.162 bigzipfiles.facebook.com
96.17.180.162 pixel.facebook.com
31.13.79.7 apps.facebook.com
31.13.79.7 upload.facebook.com
127.0.0.1 activate.adobe.com
(Nếu muốn cẩn thận chút thì chọn lại thuộc tính Read-only để tránh một số phần mềm tự ý đổi file host)

Ctrl+S để lưu lại, sau đó có thể vô fb ầm ầm và up hình thoải mái.

Vừa chơi game vừa vọc office với Ribbon hero

image

Được thiết kế như một add on của office, Ribbon Hero 2 sẽ dẫn dắt người chơi xuyên suốt cuộc hành trình lịch sử và tương lai của con người thông qua nhân vật Clippy – nhân vật Help and Support của các bản Office 2003 về trước. Thông qua cốt truyện như vậy – Microsoft Office Lab muốn mang đến người dùng các tiện ích của giao diện Ribbon bắt mắt (đó cũng chính là lý do tựa đề của game này).

Mỗi màn chơi là các cấp độ khác nhau của người chơi với các điểm số tương ứng. Hoạt hình vui nhộn và âm thanh tươi tắn, game sẽ giúp người dùng văn phòng thích thú và khám phá các tips của Office, qua đó nâng cao tay nghề Smile.

Link ở đây: http://www.ribbonhero.com/

Apr 7, 2012

Hướng dẫn cài đặt OpenGL.

Sau đây là hướng dẫn cài đặt OpenGL (Open Graphic Library) trên các phiên bản Visual Studio. Mặc dù OpenGL đã được cài đặt sẵn trên các driver đồ họa, tuy nhiên nếu không thiết lập và cài đặt thư viện Glut mới sử dụng các hàm này được.
0. Sự khác nhau về OpenGL và Glut:
  • OpenGL là thư viện đồ họa gồm các API về thuật toán vẽ hình, các phép biến đổi, phép chiếu của thực thể.
  • GLUT là thư viện quản lí cửa sổ, các thao tác nhập xuất như bàn phím, chuột, menu đơn. Cũng như các API liên quan tới việc giao tiếp của người dùng với OpenGL.
Và như vậy GLUT như 1 trung gian giữa end-user và thư viện OpenGL. Thông qua các sự kiện của người dùng, GLUT sẽ "catch" - tức bắt các sự kiện đó, phân tích rồi thực hiện theo cài đặt. Và OpenGL sẽ thực thi các lệnh vẽ, thông qua GLUT sẽ trả về kết quả trên màn hình.
1. Tải GLUT tại đây.
2. Giải nén. Trong đó có 3 file cần lưu tâm:
“glut32.dll” Chép vào thư mục C:\Windows\System32. (Nếu cẩn thận thì nên copy sang thư mục khác nữa là :C:\Windows\SysWOW64 )
“glut.h” Chép vào thư mục include của Visual C++.
  • Với phiên bản 2012: Chép vào: C:\Program Files\Microsoft Visual Studio 11.0\VC\include. Đối với bản 2012: thư mục gl không còn tồn tại nữa, thực tế các header file liên quan đến OpenGL đã được đưa đến nơi khác. Thư mục đó vẫn có tên là gl. Vì vậy đối với bản 2012. Khi lập trình ta cần include như sau:

    #include <glut.h>
    #include <gl/gl.h>
    #include <gl/glu.h>
    
  • Với phiên bản 2010: Chép vào: C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\gl.
  • Với phiên bản 2008: Chép vào: C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl.
  • Với phiên bản 2005: Chép vào: C:\Program Files\Microsoft Visual Studio.NET\Vc7\PlatformSDK\Include\gl
“glut32.lib” Chép vào thư mục library:
  • Với phiên bản 2012: C:\Program Files\Microsoft Visual Studio 11.0\VC\lib
  • Với phiên bản Visual Studio 2010: C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib
  • Với phiên bản Visual Studio 2008: C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib
  • Với phiên bản Visual Studio 2005: C:\Program Files\Microsoft Visual Studio.NET\Vc7\PlatformSDK\lib.
3. Thiết lập cho project Visual Studio.

  • Tạo một empty project Win32 console application.
  • Click chuột phải vào dự án ở Solution Explorer, chọn Properties. Phần Linker, mục Additional Dependence nhập các file sau:
    glut32.lib 
    glu32.lib 
    opengl32.lib
    
  • Phần VC++ Directories, chọn mục Include Directories click edit vào trỏ đến đường dẫn tương ứng cho thư mục include ở phần trên. Làm tương tự với Library Directories.
4. Thứ tự include vào file cpp theo thứ tự sau:

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

5.Lưu ý: Khi include các thư viện stdio.h, stdlib.h thì phải include các file này trước, sau đó mới include các header file của GLUT

Mar 28, 2012

Lấy bookmark của Chrome

Nếu lỡ tay cài lại win, hay làm gì đó mà quên export Bookmark của Chrome. Bạn có thể lấy lại tất cả dữ liệu bằng cách lấy file bookmark ở địa chỉ:

“[Old OS driver]:\User\[Username]\AppData\Local\Google\Chrome\User Data\Default”

Chép bookmark và bookmark.bak đè lên thư mục mới của nó

“[New OS driver]:\User\[Username]\AppData\Local\Google\Chrome\User Data\Default”