Tải bản đầy đủ (.docx) (10 trang)

Lập trình ứng dụng trong kỹ thuật cơ điện tử chương 4 c CLI NÂNG CAO

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (327.29 KB, 10 trang )

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



Lập trình ứng dụng trong kỹ thuật

Chương 4

Sau khi biên dịch một chương trình, sẽ có rất nhiều các file .obj được tạo ra. Ngoài ra,
trong chương trình còn sử dụng các thư viện có sẵn. Do đó, cần phải kết hợp tất cả lại thành một
file thực thi duy nhất, quá trình này được gọi là liên kết (linker).
Liên kết (Linker) là quá trình kết hợp các file đối tượng được tạo ra từ quá trình biên dịch
và các thư viện có sẵn thành một file thực thi duy nhất (file. Exe). Có hai kiểu liên kết là liên kết
tĩnh (static linker) và liên kết động (dynamic linker).
Liên kết tĩnh : Các file .h, .cpp được dịch thành file .obj. Sau đó các file.obj được liên kết
với nhau và liên kết với các file thư viện .lib. Cách này có ưu điểm là khi chạy chỉ cần file .exe mà
không cần thêm thư viện nào khác. Tuy nhiên có nhược điểm là file .exe có kích thước lớn, nặng.
Liên kết động : Cũng tương tự như liên kết tĩnh. Tuy nhiên khi liên kết, các file .lib chỉ là
trung gian chứa thông tin giả. Các thông tin thật được lấy ra từ các file .dll trong quá trình thực
thi. Đo đó, khi thực thi, chương trình sẽ tự động liên kết đến các file .dll. Nếu thiếu các file .dll
này thì quá trình thực thi sẽ bị lỗi.
Các file .lib và .dll là hai loại thư viện thường gặp nhất trong C++/CLI : thư viện liên kết
động (dynamic linking library), thư viện liên kết tĩnh (static library).
2) Header file và source file :
Trong các ví dụ đã đề cập trong các chương trước, chương trình ứng dụng mà chúng ta xây
dựng chỉ bao gồm một file duy nhất. Tuy nhiên, cách này chỉ thích hợp đối với các chương trình
nhỏ không phức tạp. Đối với những chương trình ứng dụng lớn, phức tạp, nên chia thành nhiều
thành phần nhỏ, mỗi thành phần thực hiện một nhiệm vụ nhất định. Việc chia chương trình thành
những phần nhỏ có thể được thực hiện bằng nhiều cách; cách thông dụng nhất là chia mã code
thành những nhóm nhỏ, mỗi nhóm này được gọi là một thư viện (library). Mỗi thư viện này thực
chất là một file riêng; khi biên dịch, mỗi file được biên dịch thành một file đối tượng riêng (file
.obj), sau đó các file này sẽ được liên kết lại trong quá trình liên kết thành một file thực thi duy
nhất (file .exe).
Việc khai báo các thư viện này còn có một ưu điểm nữa là nếu như ta xây dựng một

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

biến, hàm và class đã được khai báo trong header file.
Header file

+

Source file

VD : //Sinh_vien.h
Bộ môn Cơ điện tử

Trang 3

=

Complete source


Lập trình ứng dụng trong kỹ thuật

Chương 4

using namespace System;
int x,y,z;
String^ A,B,C;
void
Print(String^ A);
UInt32 Fractorial (UInt16 a);
ref class Sinh_vien
{
public:

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.

VD : //Sinh_vien.cpp
#include “Sinh_vien.h”
using namespace System;
x = 10;
y = 20;
z = 8111;
A = “Nguyen Van A”;
B = “Co dien tu”;
C = “SPKT”;
void
{

Print(String^ A)
Console::WriteLine(A);

}
UInt32 Fractorial (UInt16 a)
{
if (a > 1)

return

(a*Factorial(a-1));

else

return

1;


}
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

#include “Sinh_vien.h”
#include “window.h”

3) Chỉ thi tiền xử lí (Preprocessor Directive) :
Trước khi biên dịch chương trình sang mã đối tượng, cần có một quá trình tiền xử lí. Quá
trình tiền xử lí có thể là các lệnh định nghĩa các hằng số, ngăn trình biên dịch biên dịch 1 đoạn mã
nào đó, xác định các thư viện liên kết với chương trình .v.v… Các chỉ thị tiền xử lí được khai báo
ở đầu chương trình và bắt đầu với dấu #.
Có rất nhiều các loại chỉ thị tiền xử lí, tuy nhiên chúng ta chỉ đề cập đến hai loại khai báo
tiền xử lí thường dùng là include và using.
a)

Include Directive :

Chỉ thị Include có tác dụng chèn một đoạn mã vào mã code chương trình. Thông thường là
chèn các đoạn mã khai báo trong header file và source file. Có hai cách khai báo chỉ thị Include :
sử dụng cặp kí tự <> và “”. Hai cách khai báo này chỉ khác nhau về thứ tự tìm kiếm các header
file khi chúng ta không khai báo đường dẫn cụ thể về vị trí lưu trữ của header file.
VD : //Program.cpp
#include <C:\MyDocument\Thu_vien.h>
#include “Sinh_vien.h”
#include <window.h>

b)

// Có khai báo đường dẫn.
// Không khai báo đường dẫn.

Using Directive :


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.

C++/CLI đã cung cấp một cách thức xử lí lỗi có thể giải quyết được các vấn đề vửa kể trên
thông qua Exception. Exception là một cơ chế thông báo và xử lý lỗi trong đó tách riêng phần xử
lý lỗi ra khỏi phần thuật toán chính. Các thuật ngữ liên quan :


Một ngoại lệ là một đối tượng chứa thông tin về một lỗi và được dùng để truyền thông tin
đó tới cấp thực thi cao hơn



Quá trình truyền ngoại lệ từ ngữ cảnh thực thi hiện hành tới mức thực thi cao hơn gọi là
ném một ngoại lệ (throw an exception)



Khi một ngữ cảnh thực thi tiếp nhận và truy nhập một ngoại lệ, nó được coi là bắt ngoại lệ
(catch the exception)
Bắt và xử lý ngoại lệ:
Để bắt và xử lý một lỗi phát sinh trong quá trình chạy chương trình, chúng ta dùng cấu trúc
try{} … catch(){}
try
{
//Chứa đoạn code có khả năng phát sinh ra lỗi.
}
catch (<type of exception 1>)
{
//Code xử lý lỗi.
}

Bộ môn Cơ điện tử


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”

using namespace System;
void main()
{
float a,b,x;
X: try
{
Console::Write (“Nhap thong so a = ”);
a = Convert::ToSingle(Console::ReadLine());
Console::Write (“Nhap thong so b = ”);
b = Convert::ToSingle(Console::ReadLine());
x = -b/a;
}
catch (Exception^ e) // Khong biet loi la loai gi, cung co the dung cach khai bao catch(…)
{
Console::WriteLine (“Ban da nhap sai dinh dang, xin vui lòng nhap lai ”);
goto X;
}
Console::WriteLine(“Nghiem cua phuong trinh la ” + x);
}

Bộ môn Cơ điện tử

Trang 8


Lập trình ứng dụng trong kỹ thuật

Chương 4

Lưu ý : Thông thường nếu có lỗi, chương trình sẽ chạy lại đoạn lệnh trong khối try nhiều lần. Do

đó 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


{
Console::WriteLine (“Kieu loi ban gap la ” + Convert::ToString(e->GetType());
goto X;
}

Bộ môn Cơ điện tử

Trang 10



×