Showing posts with label Lập trình. Show all posts
Showing posts with label Lập trình. Show all posts

Apr 14, 2013

Macro nho nhỏ hiện các thông báo.


Trong lúc viết đồ án về Chat Reference, mình gặp chút vấn đề về việc xuất các thông báo cho người dùng. Đồ án được thực hiện trên MFC và dùng hàm MessageBox , trong khi đó, lúc lập trình, mình lại thiết kế các module, tức phần bussiness lại thực hiện trên console, dùng hàm printf. Lúc chuyển qua MFC phải chuyển hết các hàm đó ... Vả lại mỗi lần viết hàm lại 1 lần viết chuỗi xuất ra, thành thử nhiều khi không nhất quán.

Macro này giúp giải quyết vấn đề nho nhỏ đó. Đúng ra thì 1 con trỏ hàm, cũng có thể làm được điều này. Nhưng mình lại thích làm trên macro hơn :)) =)). Một vấn đề trong con trỏ hàm là đôi khi các hàm mình cần dùng không cùng chung kiểu khai báo, và như vậy dùng con trỏ hàm sẽ không ổn. Đồng thời việc biến tấu cũng không được gọn.

#define MAX_BUFERROR 255
#define COMMAND_ERROR printf
#define NEWEXCEPTION(mess, code) { \
                        char err[MAX_BUFERROR]; \
                        sprintf(err,mess". CODE: %d.\n", code);\
                        COMMAND_ERROR (err);\
                        fflush(NULL);\
                        }

Chút chú thích cho cái này xíu:

  • MAX_BUFERROR: Độ dài chuỗi tối đã của thông báo
  • COMMAND_ERROR: Tên hàm thực hiện xuất ra chuỗi
  • Yêu cầu phải có thư viện stdio.h cho macro này

Dec 19, 2012

Sự khác biệt về hàm main của C và C++

Thoạt đầu tưởng chừng như không có sự khác biệt giữa 2 ngôn ngữ với hàm 'main': hàm đặc biệt quan trọng trong chương trình. Nhưng thưc tế lại khác xíu.
Cho 2 đoạn mã sau.
Đoạn 1: Viết bằng c:
#include <stdio.h>
float main(int a, int b, int c)
{
    printf("Chao cac ban\n");
}
Đoạn 2: Viết bằng cpp:
#include <iostream>
using namespace std;
int main( int n, char x, float t) 
{
    cout << "Chao cac ban" <<endl;
    return 0;
}
Cả 2 đoạn mã điều chạy được, tuy nhiên nếu compile đoạn mã cpp sẽ dính 2 cái Warning. Còn đối với c thì không có gì. Điều thú vị hơn là nếu trong đoạn mã cpp ta thay đổi kiểu trả về của 'main' từ 'int' sang 'float' thì lại dính error.
Đây là lí do:
  • Trong C, nó chỉ yêu cầu tồn tại một hàm tên 'main', vậy là đủ, nó không quan tâm đến chuyện tham số đầu vào hay kết quả trả về.
  • Trong C++, nó khuyến cáo sử dụng 2 mẫu:
    int main(int argc, char** argv); // hoặc
    int main() //
Nếu không rơi vào 2 trường hợp này: thay đổi số lượng tham số sẽ gây warning, còn thay đổi kiểu trả về gây ra error.

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