Ch

ng 4

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

ươ

NG 4 : C++/CLI NÂNG CAO.

TÓM T T CH Ắ

ƯƠ

1) Th vi n (Library): ư ệ

ọ ậ ư ệ ể ỉ ữ

ầ ể

ộ ươ ế ượ

ẵ c vi ng trình con (sobroutine), các class, các bi n hay h ng s đã đ ươ c xây d ng s n. ự ng trình đã đ ượ ế ẵ ằ ạ ể ả ộ

ượ

ế ng trình. 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 ng trình (program). Các tài nguyên này có th là các đ phát tri n ph n m m (software) hay ch ể ể ề Nói m t cách ch ộ ươ ố ạ t s n. Trong đo n đ n gi n, chúng ta có th xem ch ng trình là m t đ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 ằ ươ ố ế ự i các bi n, h ng s , hàm hay class đã đ ch ự c xây d ng ng trình m i, chúng ta có th s d ng l ố ằ ạ ươ ể ử ụ 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 đuôi .lib hay .dll. Tr ể ướ hi u v quá trình d ch (compile) và th c thi (execute) m t ch ị ng g p các th vi n có d ng là cái t p tin có đuôi .h, t p tin 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 ề ự ươ ự ư ệ ữ ộ ể ề

Hình trên mô t quá trình d ch và th c thi m t ch ng trình trong C++/CLI. ả ự ộ ị ươ

ị ệ ượ là quá trình chuy n các câu l nh đ ể ộ

ữ ậ ữ ấ ữ ự ế ồ

ị ủ ẫ ở

Biên d ch (Compile) nào đó sang ngôn ng máy có th đ c g i là ch c chuy n đ i đ đ ượ ổ ượ ọ ể c g i là ch c t o ra đ đ ươ ượ ọ ượ ạ i dùng mu n ch y ch ng ạ ươ ố ườ và các ch th c a ch ươ ị ủ ỉ trình, CPU s truy xu t d li u và t o ra các k t qu . ấ ữ ệ ẽ file l p trình (file .cpp) sang file đ i t chuy n t t b ng m t ngôn ng l p trình c vi ế ằ ng trình ngôn ng c p cao Ch c thi hành tr c ti p trên máy tính. ươ ng trình ngôn ng máy ng trình ngu n (source program) và ch ươ ng (object program) ho c mã đ i t ng (object code). Khi ố ượ ặ c n p lên b nh chính c a CPU ng s đ ủ ớ ộ ẽ ượ ạ ố ượ ươ ng ng d n b i các ch th c a ch c h ỉ ướ ượ ả C th , trong C++/CLI, biên d ch là quá trình ụ ể ng (file .obj). ể ượ ươ ng trình đ i t ố ượ ng trình, ch ng trình đ i t ươ ng trình s đ c thi hành. Khi đ ẽ ượ ế ạ ố ượ ể ừ ậ

Sau khi biên d ch m t ch ng trình, s có r t nhi u các file .obj đ ộ ẽ ề ấ

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 ả ế ợ ấ ả ạ c t o ra. Ngoài ra, trong ự i thành m t file th c ộ ươ

ch thi duy nh t, quá trình này đ c g i là liên k t (linker). ấ ượ ọ ẵ ế

B môn C đi n t

ơ ệ ử

Trang 1

Ch

ng 4

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

ươ

Liên k t (Linker) c t o ra t ng đ ế là quá trình k t h p các file đ i 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). ế ộ

c d ch thành file .obj. Sau đó các file.obj đ Các file .h, .cpp đ ượ ượ ị

Liên k t tĩnh : ế ế ớ ư ệ ư

ạ ể c đi m là file .exe có kích th ế ớ 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 l n, n ng. ướ ớ ư ệ ượ ặ

ng t ế ộ ự ế ỉ

Liên k t đ ng : ả ứ ừ

ng trình s t ự Cũng t ư ươ . Các thông tin th t đ ẽ ự ộ hi liên k t, các file .lib ch là trung các file .dll trong quá trình th c thi. Đo đó, khi ự ự đ 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 nh liên k t tĩnh. Tuy nhiên k ế c l y ra t ậ ượ ấ ế ế ế ế

gian ch a thông tin gi th c thi, ch ươ i. thi s b l ẽ ị ỗ

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 :

ng tr ươ ướ ươ ề ậ ụ

ng trình nh ồ Trong các ví d đã đ c p trong các ch ỉ ứ ố ớ c, ch ỉ

ữ ứ ạ ớ

ỗ ứ ạ ệ ụ ấ ị ứ ụ ươ ệ

ể ượ ệ ằ ữ ữ ề

ấ ư ệ ỏ ỏ ỏ ự ấ ỗ ộ

ng riêng (file .obj), sau đó các file này s ộ ị ộ

ụ 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 ộ ấ ự không ph c t p. Đ i v i nh ng ch ố ớ ươ nh , m i thành ph n th c hi n m t nhi m v nh t đ nh. Vi c chia ch ầ ộ nh có th đ ự nh , m i nhóm này đ ượ khi biên d ch, m i file đ ị c liên k t l đ ượ ng trình ng d ng mà chúng ta xây ỏ ươ ợ ng trình ng d ng l n, ph c t p, nên chia thành nhi u thành ph n ầ ề ầ ng trình thành nh ng ph n ự 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 ụ ệ 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; ỗ ư ệ ọ c biên d ch thành m t file đ i t ẽ ố ượ ượ ự ỗ 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 ộ ư ữ ư ự ế ộ

ụ ữ ế

ể ử ụ ứ ượ ữ

ớ c xây d ng trong m t th vi n c a ch ươ ộ i b ng cách s d ng l ể ử ụ ướ i th vi n này. trình ng d ng khác và trong ch đã đ ự này mà không c n ph i xây d ng l ầ ươ ư ệ ủ ạ ằ ươ ng ng trình m i này có s d ng nh ng tài nguyên (hàm, bi n hay class) c, ta có th s d ng lai nh ng tài nguyên ư ệ ng trình tr ạ ử ụ ự ả

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 :

ng tr ươ ươ ướ

ng t t là header file th ng đ ậ ượ ư ể ớ

ể c. Đi m c l u v i đuôi .h thay vì .cpp. Chúng ta có th dùng notepad đ xây ể c đây (nh ng l u file v i đuôi .h), nh các file l p trình mà chúng ta đã làm quen trong các ch ự ư ườ ư ướ ự ư ư ớ

Header file cũng t khác bi ệ d ng header file gi ng nh cách chúng ta xây d ng các file .cpp tr ố ự ho c xây d ng tr c ti p trong 1 project. ự ế ặ ự

ộ ể ạ ủ ả ộ

ố ử ụ ườ ọ ợ ộ

Đ 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). ọ

B môn C đi n t

ơ ệ ử

Trang 2

Ch

ng 4

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

ươ

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. ử ổ ủ ể ậ ọ

ườ ư ệ ẽ ồ ộ

ủ ủ ứ ệ ế ầ

ộ ề ế c khai báo trong header file. ỉ ứ 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 đã đ ượ

Header file   + Source file = Complete source

VD : //Sinh_vien.h

using namespace System; int x,y,z; String^ A,B,C;

B môn C đi n t

ơ ệ ử

Trang 3

Ch

ng 4

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

ươ

Print(String^ A);

void 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

Ch

ng 4

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

ươ

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”;

Print(String^ A)

void {

Console::WriteLine(A);

}

UInt32 Fractorial (UInt16 a) {

if (a > 1) else

return (a*Factorial(a-1)); return 1;

}

Sinh_vien::Show()

void {

Console::WriteLine(Ho_ten); Console::WriteLine(MSSV); Console::WriteLine(Nganh_hoc);

}

B môn C đi n t

ơ ệ ử

Trang 5

Ch

ng 4

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

ươ

#include

ng trình có thêm dòng l nh ệ 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 ự ươ ớ ệ ướ ớ ụ ệ ự c. Hai đi m m i là ng tr ể ươ ị ề ử và khi t o ph c g i là ch th ti n x lí) ượ ọ ế đ u ch ở ầ ạ ươ ứ ủ ng th c ng th c Show() c a class Sinh_vien chúng ứ void Sinh_vien::Show() (khác so v i cách khai báo thông ớ ỉ ả ươ ả hi n qua các ch “Sinh_vien.h” (đ ta c n ph i khai báo class qu n lí ph th ng trong class là void Show()). ầ ườ

ế ể

ỉ ử ng trình ng d ng thì không nên khai báo hàm Trong header file và source file có th khai báo hàm main(). Tuy nhiên, n u chúng ta ch s ươ ư ệ ứ ụ

L u ý : ư d ng header file và source file làm th vi n cho ch ụ main().

ư ệ 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 ố ử ụ ư ệ ể ọ ụ ộ ế ươ

ứ ị ề ử ỉ

N u trong ch đó 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 ướ ề ầ

ề ị ệ ử ạ ằ

c khai báo ộ ị ị ề ươ ượ ử ỉ

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 đó, ể ử ị ố ở ầ đ u ng trình .v.v… Các ch th ti n x lí đ xác đ nh các th vi n liên k t v i ch ư ệ ị ng trình và b t đ u v i d u ch ắ ầ ươ ị ế ớ ớ ấ #. ươ

ấ ỉ ề ậ ử ế ề ạ ạ ỉ

ị ề include và using. ng dùng là 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 ử

a) Include Directive :

ị ụ ươ ườ ạ ộ

ng trình. Thông th ị ặ ỉ

ỉ ạ <> và “”. Hai cách khai báo này ch khác nhau v th t ế

ng là chèn các Ch th Include có tác d ng chèn m t đo n mã vào mã code ch đ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 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

// Có khai báo đ ườ // Không khai báo đ

ẫ ng d n.

ng d n. ườ

#include #include “Sinh_vien.h” #include

b) Using Directive :

nh Include. ng t ươ ụ ạ ộ

Ch th Using cũng có tác d ng chèn m t đo n mã vào mã code ch ị Đ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. ng trình t ớ ự ư ư ệ ươ ử ụ ỉ ể ệ ớ

VD : //Program.cpp

// Có khai báo đ ườ // Không khai báo đ

ẫ ng d n.

ng d n. ườ

#using #using “Sinh_vien.dll” #iusing

B môn C đi n t

ơ ệ ử

Trang 6

Ch

ng 4

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

ươ

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 ườ ả ặ ư

ng trình hay n m trong th m c include đã khai báo. L u ý : ư m c v i file ch ụ ớ Khi không báo đ ươ ẫ ụ ể ằ ư ụ

4) X lý ngo i l (Exception) : ạ ệ ử

ố ỗ ố

ữ ị ầ ữ ố ố ề

ng trình b thoát. Tuy nhiên, trong th c t ng trình luôn luôn g p ph i nh ng tình hu ng, nh ng l ữ ệ ượ ử ị

ặ ả c ng b đ y, truy n đ i s cho hàm không h p l … Nh ng l , ợ ệ ổ ứ c x lý s khi n ch ươ ẽ ộ ợ ệ có nh ng ch ữ ự ế ể ộ ; do đó c n có m t c ch đ có th kh c ph c đ ư : ng i không mong mu n nh ữ ỗ ươ ụ ượ ắ ọ

ộ ơ ỗ ử ố

i dùng ườ ế i này n u ng trình quan ỗ c nh ng l i ế ể ữ t code, ề ế i và sau m i l n g i hàm đ u ph i có ả ọ ỗ i truy n th ng là trong quá trình vi ề ỗ ầ ệ

ạ ế ả i khi n cho ch Ch ươ nh p d li u không h p l ậ không đ ế tr ng không cho phép d ng đ t ng t ừ phát sinh trong quá trình ch y ch ươ i l p trình luôn ph i vi ng ườ ậ l nh ki m tra l ỗ ể ệ ầ ng trình. Cách x lý l t thêm 1 l nh tr v đ thông báo l ả ề ể ng trình ph c t p và dài. ứ ạ ươ ế

i quy t đ ấ ộ ỗ ế ượ

ấ i trong đó tách riêng ph n x lý l i có th gi ể ả ử c các v n đ v a k trên thông qua ỏ i ra kh i ề ử ể ử ầ ỗ ỗ

: C++/CLI đã cung c p m t cách th c x lí l Exception. Exception là m t c ch thông báo và x lý l ộ ơ ph n thu t toán chính. Các thu t ng liên quan ậ ứ ử ế ữ ầ ậ

ng ch a thông tin v m t l i và đ là m t đ i t ề ộ ỗ ứ ượ c dùng đ truy n thông tin đó ề ể ộ ố ượ

t • M t ngo i l ộ ạ ệ i c p th c thi cao h n ơ ự ớ ấ

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 t ữ ả ự ệ ớ ứ ự ơ ọ ạ ệ ừ

ề (throw an exception) m t ngo i l • Quá trình truy n ngo i l ạ ệ ộ

, nó đ • Khi m t ng c nh th c thi ti p nh n và truy nh p m t ngo i l ế ữ ả ạ ệ ự ậ ậ ộ ộ ượ c coi là b t ngo i l ắ ạ ệ

(catch the exception)

B t và x lý ngo i l ử : ạ ệ ắ

i phát sinh trong quá trình ch y ch ng trình, chúng ta dùng c u trúc ể ắ ộ ỗ ử ạ ươ ấ

Đ b t và x lý m t l try{} … catch(){}

try

{

//Ch a đo n code có kh năng phát sinh ra l i. ứ ạ ả ỗ

}

catch ()

{

//Code x lý l i. ử ỗ

}

catch ()

{

//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. ự

B môn C đi n t

ơ ệ ử

Trang 7

Ch

ng 4

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

ươ

ỗ ỗ

i phát sinh tùy theo ki u l ể ỗ i s có m t cách khai báo khác nhau. Trong tr ứ ể ỗ ử ệ ử ể ỗ ẽ i khi có l ộ

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 ể

ể ề

ư i khác nhau. catch: ch a đo n mã l nh x lý l ạ i x lý, m i ki u l cho bi ỗ ki u l ộ ạ M t c u trúc b t và x lý l ử ch a m t đo n l nh x lý l ử i. Tham s c a catch ố ủ ế t ng h p không bi ợ ườ (Exception^ e) ho c (…). ặ ố try nh ng có th có nhi u kh i catch; m i kh i ố catch ỗ ố ạ ỗ i ch có m t kh i ỗ ộ ỉ i đ i v i t ng lo i l ỗ ố ớ ừ ế ể ỗ ộ ấ ứ ắ ạ ệ ộ

ủ ạ ệ ươ ử ầ

ự ỏ

ng h p có phát sinh l ườ ự ợ

ỗ ươ i, ch ố try và ti n hành th c thi các đo n l nh ch a trong kh i ng trình th c thi các đo n l nh ch a i: ban đ u ch ứ ự ạ ệ ng trình b qua kh i catch và th c hi n các đo n l nh ệ i dòng l nh phát ệ ạ ươ ố catch, sau đó s th c thi ẽ ự ẽ ừ ứ ự ế ỗ

ng trình x lý l Ho t đ ng c a ch ươ ạ ộ trong kh i ố try; n u không có l i phát sinh, ch ỗ ế ti p theo. Trong tr ế ỗ i trong kh i sinh l ti p các đo n l nh ti p theo n m ngoài kh i x lý l ạ ệ ế ố ng trình s d ng th c thi ngay t ạ ệ i. ỗ ố ử ế ằ

i ph ươ ố ủ ế

ậ ố ậ

ng trình gi ng h p ng ợ t) thì ch ươ ng trình trong đó các thông s c a ph ng i dùng nh p sai đ nh d ng (thay vì nh p s thì ạ i này và x lý b ng cách yêu ng trình s b t l ả ườ ươ ậ ị ẽ ắ ỗ ử ệ ằ ả ử ườ ộ ặ

i các thông s này. ươ ườ đ c bi ự ặ ố

Gi s chúng ta vi t 1 đo n ch ạ trình do ng i dùng nh p vào. Trong tr l i nh p m t kí t ch cái ho c kí t ậ ạ ự ữ c u ng i dùng nh p l ườ ậ ạ ầ //Exception.cpp VD : #include “stdafx.h” using namespace System;

void main() {

X:

float a,b,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);

}

ng trình s ch y l i, ch ư ẽ ạ ạ ạ ệ ườ ỗ ố try nhi u l n. Do đó ề ầ

L u ý : ta không đ ươ c đ a các đo n l nh khai báo bi n vào trong kh i Thông th ượ ư ng n u có l ế ạ ệ i đo n l nh trong kh i ố try. ế

Class Exception:

ự ng trình x lý l Đây là Class qu n lý các ki u l ể ỗ ả ị ươ ẽ ử ể ế

ươ i đây trình bày m t s ki u s ng trình s xác đ nh ki u l ấ ề i phát sinh trong quá trình ch ươ i và chuy n đ n đo n ch ạ i khác nhau, hình d ướ ng trình th c thi. M i khi có m t ộ ư ng ng ố ỗ i t ỗ ươ ộ ố ể ể ỗ

l ể ỗ ỗ nh Class Exception này. Có r t nhi u ki u l th i phát sinh, ch ờ ườ ng g p. ặ

B môn C đi n t

ơ ệ ử

Trang 8

Ch

ng 4

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

ươ

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. ỗ ươ ớ ữ ệ

ng h p chúng ta bi ườ ồ t t ế ừ khóa đ nh nghĩa ị

Trong tr ư ế i, chúng ta có th ki m tra thông qua 1 đo n l nh đ n gi n sau. t ngu n g c phát sinh l ố ạ ệ i nh ng không bi ỗ ả ợ ể ể ơ ể ỗ

ki u l VD :

X:

try {

…..// Code c n xác đ nh l ầ

i ỗ

} catch (Exception^ e) {

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

}

B môn C đi n t

ơ ệ ử

Trang 9