Lập trình ứng dụng trong kỹ thuật
Chương 4
TÓM TẮT CHƯƠNG 4 : C++/CLI NÂNG CAO.
1) Thư viện (Library):
Theo khoa học máy tính, thư viện là một thuật ngữ dùng để chỉ các tài nguyên (resources)
dùng để phát triển phần mềm (software) hay chương trình (program). Các tài nguyên này có thể là
các chương trình con (sobroutine), các class, các biến hay hằng số đã được xây dựng sẵn. Nói một
cách đơn giản, chúng ta có thể xem chương trình là một đoạn chương trình đã được viết sẵn.
Trong đoạn chương trình đó đã khai báo và xây dựng các biến, hằng số, các hàm và các class. Khi
xây dựng một chương trình mới, chúng ta có thể sử dụng lại các biến, hằng số, hàm hay class đã
được xây dựng trong thư viện bằng cách gọi thư viện trong chương trình.
Trong C++/CLI, chúng ta thường gặp các thư viện có dạng là cái tập tin có đuôi .h, tập tin
đuôi .lib hay .dll. Trước khi tìm hiểu về sự khác nhau giữa các thư viện .h, .lib và .dll, chúng ta
hãy tìm hiểu về quá trình dịch (compile) và thực thi (execute) một chương trình.
Hình trên mô tả quá trình dịch và thực thi một chương trình trong C++/CLI.
Biên dịch (Compile) là quá trình chuyển các câu lệnh được viết bằng một ngôn ngữ lập
trình nào đó sang ngôn ngữ máy có thể được thi hành trực tiếp trên máy tính. Chương trình ngôn
ngữ cấp cao được chuyển đổi được gọi là chương trình nguồn (source program) và chương trình
ngôn ngữ máy được tạo ra được gọi là chương trình đối tượng (object program) hoặc mã đối
tượng (object code). Khi người dùng muốn chạy chương trình, chương trình đối tượng sẽ được
nạp lên bộ nhớ chính của CPU và các chỉ thị của chương trình sẽ được thi hành. Khi được hướng
dẫn bởi các chỉ thị của chương trình, CPU sẽ truy xuất dữ liệu và tạo ra các kết quả. Cụ thể, trong
C++/CLI, biên dịch là quá trình chuyển từ file lập trình (file .cpp) sang file đối tượng (file .obj).
Bộ môn Cơ điện tử
Trang 1
chương trình ứng dụng khác và trong chương trình mới này có sử dụng những tài nguyên (hàm,
biến hay class) đã được xây dựng trong một thư viện của chương trình trước, ta có thể sử dụng lai
những tài nguyên này mà không cần phải xây dựng lại bằng cách sử dụng lại thư viện này.
Hầu hết các thư viện thường được tách thành hai dạng file : header file và source file.
a)
Header file :
Header file cũng tương tự như các file lập trình mà chúng ta đã làm quen trong các chương
trước. Điểm khác biệt là header file thường được lưu với đuôi .h thay vì .cpp. Chúng ta có thể
dùng notepad để xây dựng header file giống như cách chúng ta xây dựng các file .cpp trước đây
(nhưng lưu file với đuôi .h), hoặc xây dựng trực tiếp trong 1 project.
Bộ môn Cơ điện tử
Trang 2
Lập trình ứng dụng trong kỹ thuật
Chương 4
Để tạo một header file trong 1 project, trong cửa sổ Solution Explorer của project, click
chuột phải vào dòng Header Files và chọn Add ->New Item (trong trường hợp muốn sử dụng một
header file đã có sẵn thì chọn Existing Item).
Trong cửa sổ Add New Item, chọn kiểu file là header và nhập tên của file vào ô Name.
Thông thường, một thư viện sẽ bao gồm một header file và source file. Trong đó, header
file chỉ chứa các khai báo về biến, hàm hay class còn source file chứa mã lệnh đầy đủ của các
String^ Ho_ten;
UInt32
MSSV;
String^ Nganh_hoc;
void Show();
};
Trong ví dụ trên, trong header file đã khai báo các biến x,y,z và A,B,C cùng các hàm
Print() , Fractorial() và class Sinh_vien. Chú ý là đây chỉ là các khai báo về biến, hàm và class.
b)
Source file :
Nếu như header file chứa các khai báo thì source file sẽ chứa mã lệnh thực thi các khai báo.
Source file có đuôi .cpp.
Để tạo một source file trong 1 project, trong cửa sổ Solution Explorer của project, click
chuột phải vào dòng Source Files và chọn Add ->New Item (trong trường hợp muốn sử dụng một
source file đã có sẵn thì chọn Existing Item).
Trong cửa sổ Add New Item, chọn kiểu file là C++ File và nhập tên của file vào ô Name.
Bộ môn Cơ điện tử
Trang 4
Lập trình ứng dụng trong kỹ thuật
Chương 4
Trong source file ta sẽ xây dựng các hàm đã khai báo trong header file.
}
void
{
Sinh_vien::Show()
Console::WriteLine(Ho_ten);
Console::WriteLine(MSSV);
Console::WriteLine(Nganh_hoc);
}
Bộ môn Cơ điện tử
Trang 5
Lập trình ứng dụng trong kỹ thuật
Chương 4
Trong ví dụ trên, việc xây dựng các biến và hàm cũng không khác so với cách chúng ta đã
thực hiện qua các chương trước. Hai điểm mới là ở đầu chương trình có thêm dòng lệnh #include
“Sinh_vien.h” (được gọi là chỉ thị tiền xử lí) và khi tạo phương thức Show() của class Sinh_vien
chúng ta cần phải khai báo class quản lí phương thức void Sinh_vien::Show() (khác so với cách khai
báo thông thường trong class là void Show()).
Lưu ý : Trong header file và source file có thể khai báo hàm main(). Tuy nhiên, nếu chúng ta chỉ
sử dụng header file và source file làm thư viện cho chương trình ứng dụng thì không nên khai báo
hàm main().
Nếu trong chương trình ứng dụng, chúng ta muốn sử dụng một thư viện nào đó, ta có thể
gọi thư viện đó ra thông qua các chỉ thị tiền xử lí.
VD : //Program.cpp
Chỉ thị Using cũng có tác dụng chèn một đoạn mã vào mã code chương trình tương tự như
Include. Điểm khác biệt là Include thì dùng với các file header .h còn using sử dụng với các file
thư viện .dll.
VD : //Program.cpp
Bộ môn Cơ điện tử
Trang 6
Lập trình ứng dụng trong kỹ thuật
Chương 4
#using <C:\MyDocument\Thu_vien.dll>
#using “Sinh_vien.dll”
#iusing <mscorlib.dll>
// Có khai báo đường dẫn.
// Không khai báo đường dẫn.
Lưu ý : Khi không báo đường dẫn cụ thể cho các file .h và .dll, ta phải đặt các file này trong cùng
thư mục với file chương trình hay nằm trong thư mục include đã khai báo.
4) Xử lý ngoại lệ (Exception) :
Chương trình luôn luôn gặp phải những tình huống, những lỗi không mong muốn như :
người dùng nhập dữ liệu không hợp lệ, ổ cứng bị đầy, truyền đối số cho hàm không hợp lệ…
Những lỗi này nếu không được xử lý sẽ khiến chương trình bị thoát. Tuy nhiên, trong thực tế có
những chương trình quan trọng không cho phép dừng đột ngột ; do đó cần có một cơ chế để có thể
khắc phục được những lỗi phát sinh trong quá trình chạy chương trình. Cách xử lý lỗi truyền
thống là trong quá trình viết code, người lập trình luôn phải viết thêm 1 lệnh trả về để thông báo
lỗi và sau mỗi lần gọi hàm đều phải có lệnh kiểm tra lỗi khiến cho chương trình phức tạp và dài.
Trang 7
Lập trình ứng dụng trong kỹ thuật
Chương 4
catch (<type of exception 2>)
{
//Code xử lý lỗi.
}
try : chứa đoạn lệnh mà người lập trình cho rằng có thể phát sinh lỗi trong qua trình
chương trình thực thi.
catch: chứa đoạn mã lệnh xử lý lỗi khi có lỗi phát sinh tùy theo kiểu lỗi. Tham số của
catch cho biết kiểu lỗi xử lý, mỗi kiểu lỗi sẽ có một cách khai báo khác nhau. Trong trường hợp
không biết kiểu lỗi phát sinh thuộc dạng nào, chúng ta có thể dùng cách khai báo chung
(Exception^ e) hoặc (…). Một cấu trúc bắt và xử lý lỗi chỉ có một khối try nhưng có thể có nhiều
khối catch; mỗi khối catch chứa một đoạn lệnh xử lý lỗi đối với từng loại lỗi khác nhau.
Hoạt động của chương trình xử lý lỗi: ban đầu chương trình thực thi các đoạn lệnh chứa
trong khối try; nếu không có lỗi phát sinh, chương trình bỏ qua khối catch và thực hiện các đoạn
lệnh tiếp theo. Trong trường hợp có phát sinh lỗi, chương trình sẽ dừng thực thi ngay tại dòng
lệnh phát sinh lỗi trong khối try và tiến hành thực thi các đoạn lệnh chứa trong khối catch, sau đó
sẽ thực thi tiếp các đoạn lệnh tiếp theo nằm ngoài khối xử lý lỗi.
Giả sử chúng ta viết 1 đoạn chương trình giải phương trình trong đó các thông số của
phương trình do người dùng nhập vào. Trong trường hợp người dùng nhập sai định dạng (thay vì
nhập số thì lại nhập một kí tự chữ cái hoặc kí tự đặc biệt) thì chương trình sẽ bắt lỗi này và xử lý
bằng cách yêu cầu người dùng nhập lại các thông số này.
VD : //Exception.cpp
#include “stdafx.h”
đó ta không được đưa các đoạn lệnh khai báo biến vào trong khối try.
Class Exception:
Đây là Class quản lý các kiểu lỗi phát sinh trong quá trình chương trình thực thi. Mỗi khi có
một lỗi phát sinh, chương trình sẽ xác định kiểu lỗi và chuyển đến đoạn chương trình xử lý lỗi
tương ưng nhờ Class Exception này. Có rất nhiều kiểu lỗi khác nhau, hình dưới đây trình bày một
số kiểu số thường gặp.
Các kiểu lỗi thường gặp:
- Argument Exception: lỗi do truyền tham số không đúng cho hàm.
- ArithmeticException: lỗi khi tính toán (chia cho 0, tràn số).
- DataExceptions: lỗi khi tương tác với dữ liệu.
Trong trường hợp chúng ta biết nguồn gốc phát sinh lỗi nhưng không biết từ khóa định
nghĩa kiểu lỗi, chúng ta có thể kiểm tra thông qua 1 đoạn lệnh đơn giản sau.
VD :
X:
try
{
…..// Code cần xác định lỗi
}
catch (Exception^ e)
Bộ môn Cơ điện tử
Trang 9
Lập trình ứng dụng trong kỹ thuật
Chương 4