1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

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

9 456 2

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 293,77 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.. 2 Header file

Trang 1

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

Trang 2

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

Trang 3

Để 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

Trang 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

Trang 5

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

Trang 6

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> // Có khai báo đường dẫn.

#include “Sinh_vien.h” // Không khai báo đường dẫn.

#include <window.h>

b) 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

Trang 7

#using <C:\MyDocument\Thu_vien.dll> // Có khai báo đường dẫn.

#using “Sinh_vien.dll” // Không khai báo đường dẫn.

#iusing <mscorlib.dll>

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

Trang 8

//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);

}

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.

Trang 9

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) {

Ngày đăng: 06/12/2015, 04:27

HÌNH ẢNH LIÊN QUAN

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ập trình ứng dụng trong kỹ thuật   cơ điện tử   chương 4  c CLI NÂNG CAO
Hình tr ên mô tả quá trình dịch và thực thi một chương trình trong C++/CLI (Trang 1)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w