TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN CÔNG NGHỆ PHẦN MỀM
BÙI TẤN LỘC - 0112013
CAO THÁI PHƯƠNG THANH - 0112031
NGHIÊN CỨU VÀ XÂY DỰNG
ỨNG DỤNG TỪ ĐIỂN
TRÊN ĐIỆN THOẠI DI ĐỘNG
KHÓA LUẬN CỬ NHÂN TIN HỌC
GIÁO VIÊN HƯỚNG DẪN
Th.S NGUYỄN TẤN TRẦN MINH KHANG
Th.S TRẦN MINH TRIẾT
NIÊN KHÓA 2001 - 2005
LỜI CÁM ƠN
Chúng em xin chân thành cảm ơn Khoa Công nghệ Thông tin, trường Đại học
Khoa học Tự nhiên, Đại học Quốc gia Tp. Hồ Chí Minh đã tạo điều
145 trang |
Chia sẻ: huong20 | Ngày: 08/01/2022 | Lượt xem: 453 | Lượt tải: 0
Tóm tắt tài liệu Luận văn Nghiên cứu và xây dựng ứng dụng từ điển trên điện thoại di động, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
kiện thuận lợi
cho chúng em học tập và thực hiện đề tài tốt nghiệp này.
Chúng em xin bày tỏ lòng biết ơn sâu sắc đến thầy Nguyễn Tấn Trần Minh
Khang, thầy Trần Minh Triết đã tận tình hướng dẫn, chỉ bảo chúng em trong quá
trình thực hiện đề tài.
Chúng em xin chân thành cám ơn quý Thầy Cô trong Khoa Công nghệ Thông
tin đã tận tình giảng dạy, trang bị cho em những kiến thức quý báu trong những
năm học vừa qua.
Chúng con xin chân thành cảm ơn Ông Bà, Cha Mẹ đã luôn động viên, ủng hộ
vật chất lẫn tinh thần trong suốt thời gian qua.
Chúng em xin cảm ơn sự quan tâm, giúp đỡ và ủng hộ của anh chị, bạn bè trong
quá trình thực hiện khóa luận.
Mặc dù đã cố gắng hoàn thành khóa luận trong phạm vi và khả năng cho phép
nhưng chắc chắn sẽ không tránh khỏi những thiếu sót. Chúng em rất mong nhận
được sự thông cảm, góp ý và tận tình chỉ bảo của quý Thầy Cô và các bạn.
Tp. Hồ Chí Minh, tháng 07 năm 2005
Nhóm sinh viên thực hiện
Bùi Tấn Lộc – Cao Thái Phương Thanh
Lời nói đầu
Công nghệ thông tin đang trở thành một phần quan trọng của cuộc sống. Các
thiết bị kĩ thuật cao ngày càng gần gũi với mọi hoạt động của con người. Đặc biệt
những năm gần đây, các thiết bị không dây - với ưu thế nhỏ gọn, dễ mang chuyển –
đã chứng tỏ được lợi ích to lớn cho người sử dụng. Trong đó điện thoại di động,
với các chức năng liên lạc, nổi bật lên như một thiết bị “không thể thiếu” trong cuộc
sống của nhiều người. Với sự phát triển nhanh chóng của công nghệ sản xuất thiết
bị không dây, điện thoại di động đã trở thành phương tiện đa chức năng (nghe nhạc,
chơi trò chơi, nhắc lịch làm việc) phục vụ cho nhu cầu của người sử dụng mọi
lúc, mọi nơi.
Hệ điều hành Symbian là một hệ điều hành được thiết kế riêng để hoạt động tối
ưu trên các thiết bị di động vốn hạn chế về tài nguyên. Trên môi trường Symbian có
thể xây dựng hàng loạt ứng dụng tương tự máy tính cá nhân như: trình nghe nhạc
MP3, trình xem phim .AVI, ứng dụng văn phòng (hỗ trợ tập tin MS Word, MS
Excel), các trò chơi 3D Vì vậy sự ra đời của dòng điện thoại thông minh sử
dụng hệ điều hành Symbian với kiểu dáng tương đối nhỏ gọn, thiết kế đẹp mắt và
những ứng dụng hữu ích đã tạo ra một bước ngoặt mới trong thị trường điện thoại di
động. Đồng thời mở ra một hướng phát triển mới đầy hứa hẹn cho các công ty phần
mềm.
Bên cạnh đó, trong cuộc sống hiện nay, nhu cầu học tập, trao đổi kiến thức,
cũng như làm việc bằng ngoại ngữ là hết sức cần thiết. Sẽ rất tiện lợi nếu có một bộ
từ điển đa ngôn ngữ với đầy đủ chức năng, ngữ nghĩa nhưng nhỏ gọn, dễ mang
chuyển.
Vì những lý do trên, nhóm chúng em quyết tâm thực hiện đề tài “Nghiên cứu
và xây dựng ứng dụng từ điển trên điện thoại di động”
1
MỤC LỤC
Chương 1 Mở đầu ..................................................................................................... 9
1.1 Nhu cầu thực tế và lý do thực hiện đề tài ......................................................... 9
1.2 Mục tiêu của đề tài ......................................................................................... 10
1.3 Nội dung khóa luận ........................................................................................ 11
Chương 2 Tổng quan về hệ điều hành Symbian và điện thoại thông minh
Series 60.................................................................................................................... 12
2.1 Giới thiệu hệ điều hành Symbian ................................................................... 12
2.1.1 Công ty Symbian và hệ điều hành Symbian .......................................................12
2.1.2 Các mô hình thiết bị sử dụng hệ điều hành Symbian .........................................14
2.1.3 Các thành phần phần cứng chính trong điện thoại Symbian ..............................15
2.2 Điện thoại thông minh Symbian Series 60..................................................... 17
2.2.1 Giới thiệu ............................................................................................................17
2.2.2 Các tiêu chuẩn phần cứng của sản phẩm Series 60 ............................................18
Chương 3 Môi trường lập trình và vấn đề chính khi xây dựng ứng dụng từ
điển trên Series 60 ................................................................................................... 19
3.1 Phát triển ứng dụng trên điện thoại Series 60 ................................................ 19
3.1.1 Series 60 Developer Platform.............................................................................19
3.1.2 Các ngôn ngữ lập trình trên Series 60 Developer Platform................................21
3.2 Series 60 Application Framework.................................................................. 23
3.2.1 Series 60 Application Structure ..........................................................................23
3.2.2 Các loại ứng dụng trên điện thoại Series 60 .......................................................24
3.3 Vấn đề chính khi xây dựng ứng dụng từ điển trên Series 60 ......................... 25
3.3.1 Một số hạn chế phần cứng của điện thoại di động Series 60..............................26
3.3.2 Các yêu cầu cơ bản của một ứng dụng từ điển ...................................................26
3.3.3 Kết luận...............................................................................................................27
Chương 4 Kĩ thuật lập trình C++ trên Symbian.................................................. 28
4.1 Quản lý lỗi ...................................................................................................... 28
4.1.1 Lỗi lập trình ........................................................................................................28
4.1.2 Lỗi thiếu tài nguyên ............................................................................................29
4.2 Chuỗi .............................................................................................................. 37
4.2.1 Khái niệm............................................................................................................37
4.2.2 Phân loại .............................................................................................................38
4.3 Mảng............................................................................................................... 42
4.3.1 Mảng tĩnh............................................................................................................42
4.3.2 Mảng động ..........................................................................................................42
4.4 Mảng chuỗi ..................................................................................................... 47
4.4.1 Khái niệm............................................................................................................47
Chương 5 Các giải pháp chính cho việc xây dựng từ điển trên điện thoại di
động Series 60 .......................................................................................................... 49
5.1 Tổ chức cấu trúc dữ liệu lưu trữ ..................................................................... 49
2
5.1.1 Tổ chức các mục từ có kích thước bằng nhau ....................................................50
5.1.2 Tổ chức các mục từ có kích thước biến động .....................................................51
5.2 Tổ chức nén dữ liệu........................................................................................ 52
5.2.1 Nén toàn bộ dữ liệu.............................................................................................52
5.2.2 Nén từng khối dữ liệu .........................................................................................52
5.2.3 Chuẩn nén Dictzip ..............................................................................................53
5.2.4 Những khó khăn khi áp dụng Dictzip trên điện thọai di động............................54
5.2.5 Chuẩn nén Dictzip# ............................................................................................55
5.3 Tổ chức cấu trúc dữ liệu hỗ trợ cho việc tìm kiếm nhanh.............................. 57
5.3.1 Tổ chức tập tin nghĩa ..........................................................................................58
5.3.2 Tổ chức tập tin chỉ mục ......................................................................................59
5.3.3 Tổ chức băm tập tin chỉ mục ..............................................................................60
Chương 6 Các kỹ thuật xử lý ứng dụng................................................................ 64
6.1 Font chữ tiếng Việt ......................................................................................... 64
6.2 Bàn phím máy điện thoại................................................................................ 66
6.3 Các control của hệ điều hành Symbian .......................................................... 68
6.3.1 Mô hình MVC.....................................................................................................68
6.3.2 Phân loại controls trong Symbian.......................................................................69
6.3.3 Sử dụng control...................................................................................................70
6.3.4 Control observers................................................................................................73
6.4 Kỹ thuật tra cứu tự nhiên................................................................................ 73
6.4.1 Sắp xếp các mục từ tăng dần theo thứ tự bảng chữ cái Việt Nam......................73
6.4.2 Tối ưu số lượng các mục từ được nạp ................................................................76
6.4.3 Tùy biến cách thức tra cứu của người sử dụng...................................................76
6.5 Kỹ thuật phát âm ............................................................................................ 77
6.5.1 Những giới hạn khi xây dựng thư viện phát âm .................................................77
6.5.2 Text To Speech Offline.......................................................................................79
6.5.3 Text To Speech Online .......................................................................................79
Chương 7 Phân tích thiết kế ứng dụng từ điển .................................................... 81
7.1 Giới thiệu........................................................................................................ 81
7.2 Mô hình Use-Case .......................................................................................... 81
7.2.1 Mô hình Use-Case ..............................................................................................81
7.2.2 Đặc tả các Use-Case chính..................................................................................82
7.3 Thiết kế lớp đối tượng .................................................................................... 87
7.4 Thiết kế xử lý.................................................................................................. 89
7.4.1 Danh sách các xử lý chính ..................................................................................89
7.4.2 Mô tả các xử lý chính .........................................................................................90
7.5 Thiết kế giao diện ........................................................................................... 97
7.5.1 Màn hình tra từ ...................................................................................................98
7.5.2 Màn hình hiển thị nghĩa ......................................................................................98
7.5.3 Menu chính .........................................................................................................99
7.5.4 Màn hình cài đặt .................................................................................................99
Chương 8 Ứng dụng hỗ trợ quản lý dữ liệu trên Desktop ................................ 100
8.1 Giới thiệu...................................................................................................... 100
3
8.2 Mô hình Use-Case ........................................................................................ 100
8.2.1 Mô hình Use-Case ............................................................................................100
8.2.2 Đặc tả một số Use-Case chính ..........................................................................101
8.3 Thiết kế lớp................................................................................................... 106
8.3.1 Sơ đồ lớp...........................................................................................................106
8.3.2 Mô tả các lớp chính...........................................................................................106
8.4 Thiết kế xử lý................................................................................................ 107
8.4.1 Danh sách các xử lý chính ................................................................................107
8.4.2 Mô tả một số xử lý chính ..................................................................................107
8.5 Các màn hình giao diện ................................................................................ 109
8.5.1 Danh sách các màn hình giao diện....................................................................109
8.5.2 Mô tả các màn hình giao diện...........................................................................110
Chương 9 Cài đặt và thử nghiệm......................................................................... 112
9.1 Môi trường phát triển ................................................................................... 112
9.2 Mô hình cài đặt ............................................................................................. 113
9.3 Hướng dẫn sử dụng ...................................................................................... 114
9.3.1 Yêu cầu phần cứng ...........................................................................................114
9.3.2 Cài đặt ...............................................................................................................114
9.3.3 Hướng dẫn sử dụng chương trình Mobile Dictionary ......................................115
9.3.4 Hướng dẫn sử dụng chương trình Dictionary Manager....................................117
9.4 Thử nghiệm .................................................................................................. 121
9.4.1 Kết quả thử nghiệm hoạt động của ứng dụng ...................................................121
9.4.2 So sánh với các từ điển hiện có trên thị trường ................................................121
Chương 10 Tổng kết.............................................................................................. 123
10.1 Một số kết quả đạt được ............................................................................. 123
10.2 Hướng phát triển......................................................................................... 124
Phụ lục A SDKs và ứng dụng HelloWorld ..................................................... 125
A.1 SDKs (Software Development Kits) ....................................................... 125
A.2 Hướng dẫn cài đặt SDKs cho Series 60. (Một và nhiều SDK) ............... 126
A.3 Biên dịch và cài đặt ví dụ HelloWorld.................................................... 127
Phụ lục B Khái niệm cơ bản khi lập trình C++ trên hệ điều hành Symbian132
B.1 Các qui ước đặt tên.................................................................................. 132
B.2 Kiểu dữ liệu cơ bản ................................................................................. 135
Phụ lục C Chuẩn nén Dictzip#......................................................................... 137
Phụ lục D Các bộ dữ liệu của từ điển.............................................................. 139
Tài liệu tham khảo ................................................................................................ 141
4
DANH MỤC CÁC HÌNH
Hình 1.1 Nhu cầu từ điển di động........................................................................................10
Hình 2.1 Các cổ đông của công ty Symbian........................................................................12
Hình 2.2 Các nhà sản xuất có giấy phép sử dụng hệ điều hành Symbian ...........................13
Hình 2.3 Communicator áp dụng mô hình Crystal ..............................................................14
Hình 2.4Communicator áp dụng mô hình Quartz................................................................15
Hình 2.5 Smartphone áp dụng mô hình Pearl ......................................................................15
Hình 2.6 Điện thoại thông minh Symbian Series 60 ...........................................................17
Hình 2.7 Màn hình điện thoại Series 60 ..............................................................................18
Hình 2.8 Bàn phím điện thoại Series 60 ..............................................................................18
Hình 3.1 Application Structure............................................................................................23
Hình 3.2 Một ứng dụng dialog base ....................................................................................24
Hình 3.3 Một ứng dụng controls..........................................................................................25
Hình 3.4 Một ứng dụng Application / View architecture ....................................................25
Hình 4.1 Chuỗi không thể thay đổi......................................................................................39
Hình 4.2 Chuỗi có thể thay dổi ............................................................................................39
Hình 4.3Chuỗi cấp phát trên heap .......................................................................................40
Hình 4.4 Con trỏ chuỗi không thể thay đổi..........................................................................40
Hình 4.5 Con trỏ chuỗi có thể thay đổi................................................................................40
Hình 4.6 Cây kế thừa các lớp descriptor..............................................................................41
Hình 4.7 Sức chứa và độ phân hạt của mảng.......................................................................43
Hình 4.8 Mảng cùng kích thước, liên tục ............................................................................44
Hình 4.9 Mảng cùng kích thước, phân đoạn........................................................................44
Hình 4.10 Mảng khác kích thước, liên tục...........................................................................45
Hình 4.11 Mảng khác kích thước, phân đoạn......................................................................45
Hình 4.12 Mảng packed, liên tục.........................................................................................45
Hình 4.13 Mảng chuỗi không thể thay đổi ..........................................................................47
Hình 4.14 Mảng con trỏ chuỗi .............................................................................................48
Hình 5.1 Ý tưởng cấu trúc lưu trữ chuẩn Dictzip ................................................................54
Hình 5.2 Ý tưởng cấu trúc lưu trữ chuẩn Dictzip# ..............................................................55
Hình 5.3 Tổ chức tập tin nghĩa ............................................................................................58
5
Hình 5.4 Cấu trúc mẫu tin chỉ mục......................................................................................59
Hình 5.5 Các giá trị cần thiết để phân tích mục từ ..............................................................60
Hình 6.1 Tiếng Việt không hiển thị tốt ................................................................................64
Hình 6.2 Bàn phím điện thoại Series 60 ..............................................................................66
Hình 6.3 Mẫu thiết kế MVC ................................................................................................68
Hình 6.4 Control ..................................................................................................................69
Hình 6.5 Minh họa cách sử dụng biên dưới.........................................................................75
Hình 6.6 Minh họa sử dụng biên trên ..................................................................................76
Hình 6.7 Nạp từ vào listbox.................................................................................................77
Hình 7.1 Use-Case diagram.................................................................................................81
Hình 7.2 Class diagram........................................................................................................87
Hình 7.3 Sơ đồ tuần tự Khởi động ứng dụng 1....................................................................90
Hình 7.4 Sơ đồ tuần tự Khởi động ứng dụng 2....................................................................91
Hình 7.5 Sơ đồ tuần tự Chọn từ điển mới............................................................................92
Hình 7.6 Sơ đồ tuần tự Tìm kiếm từ 1 .................................................................................93
Hình 7.7 Sơ đồ tuần tự Tìm kiếm từ 2 .................................................................................93
Hình 7.8 Sơ đồ tuần tự Hiển thị nghĩa từ.............................................................................94
Hình 7.9 Sequence diagram Xem nghĩa từ khác trong màn hình nghĩa 1 ...........................95
Hình 7.10 Sequence diagram Xem nghĩa từ khác trong màn hình nghĩa 2 .........................95
Hình 7.11 Sequence diagram Nghe phát âm từ 1 ................................................................96
Hình 7.12 Sơ đồ tuần tự Nghe phát âm từ 2 ........................................................................97
Hình 7.13 Màn hình tra từ ...................................................................................................98
Hình 7.14 Màn hình hiển thị nghĩa ......................................................................................98
Hình 7.15 Submenu Dictionaries.........................................................................................99
Hình 7.16 Submenu About ..................................................................................................99
Hình 7.17 Màn hình cài đặt .................................................................................................99
Hình 8.1 Mô hình Use-Case Dictionary Manager .............................................................100
Hình 8.2 Sơ đồ các lớp đối tượng ......................................................................................106
Hình 8.3 Sơ đồ tuần tự cho xư lý Import ...........................................................................107
Hình 8.4 Sơ đồ tuần tự cho xử lý Export ...........................................................................108
Hình 8.5 Sơ đồ tuần tự cho xử lý LoadDictionary.............................................................108
Hình 8.6 Sơ đồ tuần tự cho xử lý UpdateWord .................................................................109
6
Hình 8.7 Màn hình chính của ứng dụng Dictionary Manager ...........................................110
Hình 8.8 Màn hình biên sọan từ ........................................................................................111
Hình 9.1 Mô hình cài đặt đề tài .........................................................................................113
Hình 9.2 Cài đặt thành công Mobile_Dict .........................................................................115
Hình 9.3 Cài đặt thành công Dữ liệu .................................................................................115
Hình 9.4 Tra từ và gõ tiếng Việt ........................................................................................115
Hình 9.5 Chọn từ điển cần dùng ........................................................................................116
Hình 9.6 Setting list ...........................................................................................................116
Hình 9.7 Phát âm từ ...........................................................................................................116
Hình 9.8 Màn hình chính của ứng dụng Dictionary Manager ...........................................117
Hình 9.9 Chọn chức năng Import ......................................................................................118
Hình 9.10 Chọn chức năng mở một từ điển có sẵn............................................................118
Hình 9.11 Màn hình biên soạn từ ......................................................................................119
Hình 9.12 Chọn chức năng thêm từ ...................................................................................119
Hình A. 1 Cửa sổ HelloWorldBasic project ......................................................................127
Hình A. 2 Build Solution HelloworldBasic .......................................................................128
Hình A. 3 Trình giả lập SDK 2nd Edition, FP2 ..................................................................128
Hình A. 4 HelloWorld trên máy giả lập.............................................................................129
Hình A. 5 Release build.....................................................................................................130
7
DANH MỤC CÁC BẢNG
Bảng 5.1 Bảng mô tả các trường dữ liệu .............................................................................49
Bảng 5.2 Tổ chức từ điển với cáctừ gốc có kích thước bằng nhau......................................50
Bảng 5.3 Tổ chức từ điển với cáctừ gốc có kích thước không bằng nhau...........................51
Bảng 5.4 So sánh tỉ lệ nén giữa DictZip và Dictzip#...........................................................56
Bảng 5.5 Kích thước tập tin sau khi dùng Dictzip# nén......................................................56
Bảng 5.6 Tốc độ truy xuất từ điển Anh-Việt khi sử dụng Dictzip#.....................................56
Bảng 5.7 Tốc độ truy xuất từ điển Anh-Việt khi sử dụng Dictzip#.....................................57
Bảng 5.8 Các trường dữ liệu trong mẫu tin chỉ mục............................................................59
Bảng 5.9 Bảng thống kê sự phân bố các cụm trong bảng băm cấp 1 ..................................61
Bảng 5.10 Bảng thống kê sự phân bố các cụm trong bảng băm cấp 2 ................................62
Bảng 5.11 Bảng thống kê sự phân bố các cụm trong bảng băm cấp 3 ................................62
Bảng 5.12 Bảng thống kê sự phân bố các cụm trong bảng băm cấp 4 ................................63
Bảng 6.1 Tập các ký tự có dấu tiếng Việt............................................................................74
Bảng 6.2 Biên trên và biên dưới của ký tự có dấu tiếng Việt ..............................................75
Bảng 6.3 Kích thước của bộ thư viện Offline......................................................................79
Bảng 7.1 Danh sách Actor ...................................................................................................82
Bảng 7.2 Danh sách Use-case..............................................................................................82
Bảng 7.3 Danh sách các lớp chính.......................................................................................89
Bảng 7.4 Danh sách các xử lý chính....................................................................................89
Bảng 7.5 Danh sách màn hình giao diện .............................................................................97
Bảng 7.6 Các thành phần của màn hình tra từ .....................................................................98
Bảng 7.7 Các thành phần của màn hình hiển thị nghĩa.......................................................98
Bảng 7.8 Các thành phần của menu chính...........................................................................99
Bảng 7.9Các thành phần của màn hình cài đặt ....................................................................99
Bảng 8.1 Danh sách các Actor...........................................................................................101
Bảng 8.2 Danh sách các Use-Case chính..........................................................................101
Bảng 8.3 Các lớp chính......................................................................................................106
Bảng 8.4 Các xử lý chính...................................................................................................107
Bảng 8.5 Các màn hình giao diện ......................................................................................109
Bảng 9.1 Implement Model ...............................................................................................113
8
Bảng 9.2 Danh sách điện thoại tương thích.......................................................................114
Bảng 9.3 Kết quả thử nghiệm trên máy ảo ........................................................................121
Bảng 9.4 Kết quả thử nghiệm trên máy thật .........................................................hi phát triển ứng
dụng. Tuy nhiên nội dung này đã được nhiều bài viết, luận văn khóa trước trình bày.
Vì vậy chúng em không trình bày lại phần này trong nội dung khóa luận mà đưa
vào phụ lục để phục vụ như cầu tham khảo.
4.1 Quản lý lỗi
4.1.1 Lỗi lập trình
Lỗi lập trình là lỗi phát sinh trong quá trình phát triển ứng dụng do truyền sai
tham số, sai đường dẫn Loại lỗi này thường gặp trong quá trình lập trình và có
thể được lập trình viên khắc phục hoặc tránh bằng mã nguồn.
Phần lớn các hàm API mà Symbian cung cấp đều trả về kết quả thực thi của
hàm đó dưới dạng một mã lỗi hệ thống (System wide error codes). Dựa vào các mã
này, lập trình viên có thể biết hàm được thực hiện thành công hay không và nguyên
nhân gây lỗi. Cụ thế các mã lỗi thông dụng: KErrNone (không có lỗi, hàm thưc
hiện thành công), KErrCancel (giá trị trả về khi hàm bị hủy khi đang thực hiện),
KErrNotSupported (nền hệ thống không hỗ trợ hàm được gọi), KErrBadName
(tên tập tin không đúng cú pháp).
Ngoài ra, hệ điều hành Symbian còn cung cấp một cơ chế dừng tiến trình ứng
dụng ngay khi xảy ra lỗi và trả về các giá trị cần thiết để tìm và sửa lỗi gọi là panic.
Khi một panic xảy ra, có hai thành phần xác định nguyên nhân là loại lỗi
(catagories) và mã lỗi của loại đó (reason codes). Ví dụ liên quan đến việc sử dụng
font chữ và ảnh bitmap, có loại lỗi FBSERV (font & bitmap server) với 15 mã lỗi
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
29
khác nhau như 1: không kết nối được với dịch vụ quản lý font, 6: thông tin sử dụng
font sai. Trong quá trình thực thi ứng dụng trên máy ảo cũng như máy thực, khi xảy
ra panic sẽ có một thông báo App Close! cung cấp thông tin về các thành phần trên
trước khi đóng ứng dụng.
Ngoài ra, lập trình viên có thể qui định thêm các panic cho ứng dụng bằng cách
sử dụng tiện ích User::Panic(aCategory, aReason)để ngừng chương trình
và thông báo lỗi.
4.1.2 Lỗi thiếu tài nguyên
Lỗi thiếu tài nguyên là lỗi phát sinh trong quá trình thực thi ứng dụng khi ứng
dụng đòi hỏi hệ thống cung cấp một tài nguyên nào đó mà hệ thống không đáp ứng
được. Một ứng dụng khi thực thi lần đầu hoạt động tốt, nhưng lần thứ hai có thể gặp
lỗi thiếu tài nguyên. Loại lỗi này thường chỉ gặp khi thực thi ứng dụng trên thiết bị
thực, vì máy ảo chia sẻ tài nguyên với máy tính nên rất ít khi thiếu.
Trong môi trường điện thoại thông minh Symbian Series 60, các nguồn tài
nguyên như bộ nhớ, không gian lưu trữ rất hạn chế. Trong khi các ứng dụng được
viết cho điện thoại di động phải đảm bảo chạy trong thời gian dài mà không khởi
động hay nạp lại bộ nhớ.
Vì vậy vấn đề quản lý tài nguyên khi lập trình, nhất là quản lý, thu hồi bộ nhớ
khi lỗi xảy ra được Symbian cung cấp hỗ trợ rất kĩ, rất tốt; đây chính là một trong
những điểm làm nên thành công của hệ điều hành Symbian.
Cơ chế quản lý lỗi trong Symbian được chia làm nhiều cấp khác nhau như sau:
4.1.2.1 Bẫy lỗi, ngừng 1 hàm nếu xảy ra lỗi bộ nhớ
Cơ chế bắt lỗi cơ bản mà Symbian hỗ trợ gồm:
Hàm User::Leave() có tác dụng ngừng hàm đang thực hiện và trả về mã
lỗi.
Macro TRAP và biến thể của nó TRAPD, cho phép đoạn mã chương
trình hoạt động dưới dạng bẫy lỗi
Cơ chế này hoạt động như thao tác bẫy lỗi khá quen thuộc try/catch và thrown
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
30
Tất cả các hàm có thể khả năng phát sinh lỗi tài nguyên trong ứng dụng (như
cấp phát vùng nhớ cho một đối tượng nhưng đã hết bộ nhớ, truyền dữ liệu trong khi
dịch vụ chưa sẵn sàng) gọi là “Leave function”, và có ký tự L cuối tên hàm (hàm
L). Lưu ý một hàm có thể ngừng (leave) 1 cách trực tiếp do đoạn mã phát sinh lỗi
(leave directly) hoặc do 1 hàm này gọi 1 hàm L khác và hàm L được gọi này có thể
gây ra lỗi (leave indirectly).
Ta có thể sử dụng tiện ích User::Leave() để ngừng ngay hàm đang thực
hiện và trả về mã lỗi tương ứng (một dạng biệt lệ (exception) trong Symbian). Ví dụ
dưới đây cho thấy hàm sẽ ngừng và trả về mã lỗi thiếu bộ nhớ nếu việc cấp phát
thông qua toán tử new không thành công:
void doExampleL()
{
CExample* myExample = new CExample;
if (!myExample) User::Leave(KErrNoMemory);
// leave used in place of return to indicate an error
// if leave, below code isn’t executed
// do something
myExample->iInt = 5;
testConsole.Printf(_LIT("Value of iInt is %d.\n"), myExample->iInt);
// delete
delete myExample;
}
Tất cả những hàm leave, gồm cả những hàm gọi hàm leave khác đều hoạt động
dưới cơ chế bẫy lỗi. Nếu hàm User::Leave() được gọi thì dòng điều khiển
chương trình được trả về cho macro TRAP gần nhất. Một biến được dùng đề nhận
giá trị lỗi trả về của User::Leave() và nếu không có lỗi gì xảy ra thì biến này sẽ
có giá trị KErrNone. (Lưu ý biến trả về của macro TRAP không phải là giá trị hàm
trả về).
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
31
Xét ví dụ cụ thể sau:
TInt E32Main()
{
TInt r; // The leave variable
// Perform example function. If it leaves,
// the leave code is put in r
TRAP(r,doExampleL());
if (r) // Test the leave variable
testConsole.Printf(_LIT("Failed: leave code=%d"), r);
}
Macro TRAP có 1 biến thể khác cho phép rút gọn code chương trình đó là
TRAPD, khi sử dụng TRAPD ta không cần khai báo biến lỗi một cách tường minh:
TRAPD(leaveCode,value=GetSomethingL()); // get a value
Ngoài ra Symbian còn cung cấp 1 dạng toán tử new mới, sử dụng cơ chế leave
trong 1 dòng lệnh, đó là: new (ELeave) Khi sử dụng new (ELeave) nghĩa là nếu
việc cấp phát vùng nhớ cho 1 đối tượng không thành công thì hàm thực thi toán tử
new này sẽ ngừng ngay lập tức:
void doExampleL()
{
// attempt to allocate, leave if could not
CExample* myExample = new (ELeave) CExample;
// new (ELeave) replaces new followed by check
// do something
myExample->iInt = 5;
// delete
delete myExample;
}
Trong ví dụ trên, nếu việc cấp phát myExample không thành công hàm
doExampleL() sẽ ngừng ngay và trả về giá trị lỗi cho macro TRAP hay TRAPD gọi
hàm này (nếu có).
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
32
4.1.2.2 Cleanup stack
Khi một hàm leave, dòng diều khiển được chuyển cho macro TRAP và dòng
lệnh dưới TRAP được thực thi. Điều này nghĩa là những đối tượng được tạo ra hoặc
truyền vào trước khi hàm ngừng sẽ trở nên “mồ côi’, việc hủy chúng không được
thực hiện và tài nguyên (bộ nhớ) mà chúng chiếm giữ sẽ không được giải phóng.
Hệ điều hành Symbian cung cấp một cơ chế quản lý những đối tượng này gọi là
Cleanup stack. Như đã trình bày ở phần qui ước đặt tên, chỉ có các lớp bắt đầu bằng
ký tự C là cần và bắt buộc phải hủy khi sử dụng xong.
Như vậy nguy cơ đối tượng mồ côi xuất phát từ lớp C, xét ví dụ cụ thể sau:
void doExampleL()
{
// An T-type object: can be declared on the stack
TBuf buf;
// A C-type object: must be allocated on the heap
// Allocate and leave if can not
CExample* myExample = new (ELeave) CExample;
// do something that cannot leave: no protection needed
myExample->iInt = 5;
// PROBLEM: do something that can leave !!!
myExample->DoSomethingL();
// delete
delete myExample;
}
Nếu lúc này hàm myExample->DoSomethingL(); bị lỗi và ngừng lại thì
dòng lệnh delete myExample sẽ không được thực thi, nghĩa là vùng nhớ cấp cho
nó không được giải phóng. Ta giải quyết vần đề này bằng kĩ thuật Cleanup stack mà
Symbian hỗ trợ như sau: dùng hàm CleanupStack::PushL()để đưa con trỏ đối
tượng vào Cleanup stack trước khi gọi bất kì hàm leave nào; sau đó nếu những hàm
leave đã hoàn thành mà không có lỗi xảy ra, ta gọi hàm CleanupStack::Pop()
để lấy con trỏ đối tượng ra khỏi Cleanup stack.
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
33
Minh họa lại ví dụ trên:
void doExampleL()
{
// allocate with checking
CExample* myExample = new (ELeave) CExample;
// do something that cannot leave
myExample->iInt = 5; // cannot leave: no protection needed
// do something that can leave: use cleanup stack
CleanupStack::PushL(myExample); // pointer on cleanup stack
myExample->DoSomethingL(); // something that might leave
CleanupStack::Pop(); // it didn't leave: pop the pointer
// delete
delete myExample;
}
Lưu ý: hàm CleanupStack::PushL() có thể leave, tuy nhiên nếu hàm này leave
thì đối tượng đưa vào stack bởi hàm này cũng sẽ bị hủy.
Cần lưu ý hàm CleanupStack::Pop() tự nó không có ý nghĩa gì, nó chỉ đẩy
1 đối tượng ra khỏi Cleanupstack và ta có thể hủy hoặc sử dụng đối tượng nhận
được từ stack này sau khi hàm bị ngừng (leave) đảm bảo không có đối tượng mồ côi
Trong nhiều trường hợp ta có thể gọi hàm
CleanupStack::PopAndDestroy() để hủy đối tượng sau khi hoàn thành hàm
leave:
void doExampleL()
{
. . .
// pop from cleanup stack, and destroy, in one operation
CleanupStack::PopAndDestroy(); //don’t need call delete
}
Để rút gọn mã nguồn chương trình, việc cấp phát và đưa đối tượng vào Cleanp
stack thường được thực hiện trong 1 hàm kết thúc bằng ký tự C. Ví dụ hàm TAny*
User::AllocLC() gồm việc gọi hàm User::Alloc() để cấp phát vùng nhớ sau
đó leave nếu cấp phát không thành công, ngược lại tự động đưa đối tượng vào
Cleanup stack. Nếu gọi hàm ___C để cấp phát đối tượng vẫn phải lấy đối tượng ra
khỏi Cleanup stack sau khi sử dụng xong.
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
34
4.1.2.3 Hàm dựng 2 pha
Trong khi khởi tạo các đối tượng phức tạp (đối tượng lớp C chứa một hoặc
nhiều đối tượng lớp C khác cần được khởi tạo) có thể dẫn tới tình trạng leave mà
việc quản lý bằng Cleanup stack một cách tường minh gặp khó khăn do ta không
biết đối tượng nào đã được khởi tạo và đối tượng nào chưa. Lúc này Symbian tiếp
tục cung cấp cơ chế quản lý lỗi khi khởi tạo đối tượng gọi là hàm dựng 2 pha (2
phase constructor) hoạt động với cơ chế như sau:
Cấp phát vùng nhớ cho đối tượng (và leave nếu không đủ bộ nhớ)
Khởi tạo các thành phần an toàn (không thể leave)
Đưa con trỏ đối tượng vào Cleanup stack
Dùng hàm dựng thứ 2 (2nd phase constructor) để khởi tạo các thành phần
có thể leave.
Lưu ý:
Toàn bộ quá trình trên được thực hiện thông qua 2 hàm tĩnh: NewL(), and
NewLC()(tự đưa đối tượng được cấp phát vào Cleanup stack)
Hàm dựng thứ 2 có tên là ConstructL().
Ví dụ ta có lớp CSimple là một lớp đơn giản không chứa các đối tượng khác:
class CSimple : public CBase
{
public:
CSimple(TInt); //hàm dựng
void Display();
private:
TInt iVal;
};
Lớp CCompound chứa đối tượng CSimple như là biến thành viên
class CCompound : public CBase
{
public:
void Display();
~CCompound();
static CCompound* NewL(TInt aVal);
static CCompound* NewLC(TInt aVal);
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
35
protected:
CCompound(TInt aVal);
void ConstructL();
private:
TInt iVal;
CSimple* iChild;
};
Minh họa nguy cơ từ việc khởi tạo đối tượng CCompound theo cách thông
thường:
CCompound::CCompound(TInt aVal)
{
iVal=aVal;
iChild = new (ELeave) CSimple(aVal);
}
Lúc này, khi khởi tạo 1 đối tượng CCompound , nếu vì lý do nào đó mà việc
cấp phát đối tương iChild (CSimple) không thành công. Hàm khởi tạo
CCompound(TInt aVal) bị ngừng (leave). Lúc này đối tượng CCompound đã
được cấp phát, tuy nhiên không thể truy cập đến vùng nhớ này vì hàm dựng không
thành công. Như vậy đã có một đối tượng mồ côi được tạo ra trong vùng nhớ mà ta
không thể quản lý được.
Để khắc phục CCompound sử dụng hàm dựng 2 pha, có thể tạo ra một đối
tượng CCompound một cách an toàn thông qua hai hàm tĩnh NewL() và NewLC()
như sau:
// NewLC with two stage construction
CCompound* CCompound::NewLC(TInt aVal)
{
// get new, leave if can't
CCompound* self=new (ELeave) CCompound(aVal);
// push onto cleanup stack in case self->ConstructL leaves
CleanupStack::PushL(self);
// complete construction with second phase constructor
self->ConstructL();
return self;
}
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
36
void CCompound::ConstructL()
{
// function may leave, as creating a new CSimple object
// may leave.
iChild = new (ELeave) CSimple (iVal);
}
CCompound* CCompound::NewL(TInt aVal)
{
CCompound* self=NewLC(aVal);
CleanupStack::Pop();
return self;
}
Ta sử dụng hàm NewL(), NewLC() để khởi tạo đối tượng CCompound an toàn
như sau:
void doExampleL()
{
// allocate and push to cleanup stack - leave if failed
CCompound* myExample = CExample::NewLC(5);
// do something that might leave
myExample->DoSomethingL();
// pop from cleanup stack and destroy
CleanupStack::PopAndDestroy();
}
Lúc này nếu hàm doExampleL() không thành công do không cấp phát được
đối tượng CSimple ( biết được bằng bẫy lỗi TRAPD(errcode, doExampleL())
với errcode != KErrNone), ta chỉ cần gọi CleanupStack::PopAndDestroy()
để “làm sạch” vùng nhớ.
Ngoài ra, đối với các lớp T, R Cleanup stack cũng hỗ trợ thao tác push và pop
thông qua các hàm overload:
static void PushL(TAny* aPtr);
static void PushL(TCleanupItem anItem);
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
37
4.2 Chuỗi
4.2.1 Khái niệm
Hệ điều hành Symbian biểu diễn chuỗi và dữ liệu nhị phân bằng đặc ngữ
(idiom) “descriptor”. Descriptor cung cấp một cơ chế an toàn, chặt chẽ để truy cập
và quản lý chuỗi cũng như vùng nhớ chứa dữ liệu nhị phân.
Một đối tượng descriptor chứa kích thước và con trỏ tới vùng dữ liệu(chuỗi
hoặc dữ liệu nhị phân). Tất cả thao tác trên dữ liệu thực hiện thông qua đối tượng
descriptor này.
Descriptor không phân biệt kiểu dữ liệu mà nó đang quản lý, nghĩa là chuỗi và
dữ liệu nhị phân được hiểu như nhau. Vì vậy vài phương thức dùng để xử lý chuỗi
có thể hoạt động tốt trên dữ liệu nhị phân.
Descriptor có các dạng:
Dạng 16 bit dùng cho chuỗi Unicode và các dữ liệu 2 bytes. Chiều
dài (length) của 16 bit descriptor là số ký tự trong chuỗi Unicode
(hoặc là số dữ liệu 2 bytes) Æ kích thước của 16 bit descriptor =
length * 2.
Dạng 8 bit dùng cho chuỗi non-Unicode và dữ liệu 1 byte (dữ liệu
nhị phân). Chiều dài của 8 bit descriptor cũng là kích thước và chính
là số byte được cấp trong vùng nhớ mà descriptor trỏ tới.
Lưu ý: chiều dài 1 descriptor không thể vượt quá 228.
Descriptor còn hỗ trợ build independent type (có thể gọi là descriptor dạng độc
lập). Khi sử dụng build independent type để biểu diễn chuỗi, tùy macro
_UNICODE được xác định hay không mà trình biên dịch sẽ chọn kiểu descriptor 8
bit hay 16 bit cho phù hợp.
Có thể hiểu rõ vấn đề thông qua đoạn code sau:
#if defined(_UNICODE)
typedef TPtr16 TPtr;
#else
typedef TPtr8 TPtr;
#endif
Trong đó, TPtr là một lớp descriptor và macro _UNICODE sẽ được định nghĩa mặc
định cho ứng dụng.
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
38
4.2.2 Phân loại
Symbian cung cấp nhiều loại lớp descriptor khác nhau. Và mọi lớp descriptor
đều có các dạng:
16 bit (ví dụ TDes16, TBuf16): dùng cho 16 bit descriptor
8 bit (ví dụ TDes8, TBuf8): dùng cho 8 bit descriptor
Build independent type: chính là kiểu descriptor trừu tượng sẽ được
xác định là 16 bit hay 8 bit khi biên dịch(TDes, TBufC)
Sau đây chỉ trình bày với loại descriptor build independent type.
Tất cả lớp descriptor kế thừa từ hai lớp trừu tượng:
TDesC(the abstract non-modifiable descriptor class): sử dụng để truy
xuất chuỗi nhưng không thể chỉnh sửa trực tiếp chuỗi đã khởi tạo.
TDes(the abstract modifiable descriptor class): truy xuất và quản lý
chuỗi.
Hai lớp trừu tượng trên được cụ thể hóa thành ba loại lớp descriptor, sử dụng tùy vào
mục đích khác nhau.
4.2.2.1 Hằng chuỗi
Khi lập trình trên Symbian, nếu muốn sử dụng một giá trị chuỗi biết trước, ta
không thể khai báo trực tiếp theo kiểu: String s= “Some text value” mà
phải sử dụng hằng chuỗi (literal descriptors) khai báo thông qua các macro:
_LIT16: tạo hằng chuỗi 16 bit
_LIT8: tạo hằng chuỗi 8 bit
_LIT: tạo hằng chuỗi kiểu độc lập (build independent type)
_L: sử dụng trực tiếp hằng chuỗi
Hằng chuỗi được khai báo và sử dụng đơn giản như sau:
_LIT(KFormat1,"Length is %d");
TBuf x;
x.Format(KFormat1,8);//x= “Length is 8”
Có thể sử dụng macro _L để gọi trực tiếp hằng chuỗi
x.Format(_L("Length is %d");,8);//x= “Length is 8”
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
39
4.2.2.2 Buffer descriptor
Dữ liệu là một phần của đối tượng descriptor và đối tượng descriptor được cấp
phát trên stack chương trình.
Một đối tượng buffer descriptor là 1 thể hiện của lớp khuôn mẫu trong đó tham
số mẫu truyền vào là một số nguyên xác định kích thước vùng dữ liệu được cấp
phát.
Hình 4.1 Chuỗi không thể thay đổi
Hình 4.2 Chuỗi có thể thay dổi
Khác với đối tượng TBufC, sau khi khởi động đối tượng TBuf có thể thay đổi
giá trị (thêm, chèn, xóa các ký tự, đổi thành chuỗi thường, hoa)
Lưu ý: nếu truy xuất vượt quá kích thước được khai báo sẽ phát sinh lỗi panic:
_LIT(KText,"Hello World!");
TBufC buf1(KText);
buf1.Delete(99,1);//panic
4.2.2.3 Heap descriptor
Dữ liệu là một phần của đối tượng descriptor và được cấp phát trên vùng heap.
Đây là kiểu descriptor duy nhất cho phép cấp phát động nên thường được sử dụng
để lưu các giá trị phát sinh trong quá trình thực thi ứng dụng.
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
40
Hình 4.3Chuỗi cấp phát trên heap
Vì được cấp phát trên heap nên ta có thể cấp phát lại cũng như dùng toán tử gán
để thay đổi nội dung một heap descriptor:
4.2.2.4 Pointer descriptor
Đối tượng descriptor và dữ liệu được lưu trên những vùng khác nhau.
Hình 4.4 Con trỏ chuỗi không thể thay đổi
Hình 4.5 Con trỏ chuỗi có thể thay đổi
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
41
Sau khi khởi tạo, một đối tượng pointer descriptor chính là 1 con trỏ đến vùng
dữ liệu descriptor khác. Ta có thể thay đổi giá trị một descriptor non-modifiable
thông qua con trỏ này. Điều này đặc biệt hữu ích để thay đổi giá trị của heap
descriptor (HBufC không thể thay đổi trực tiếp) sau khi được cấp phá
HBufC* buf;
buf = HBufC::NewL(variable_len);
TPtr ptr = buf->Des();
ptr.Delete((ptr.Length()-9),9);//Hello World
ptr.Append(_LIT(" & Hi"));//Hello World & Hi
Lưu ý: đối tượng pointer descriptor là một con trỏ tới vùng dữ liệu. Khi khởi
tạo pointer descriptor từ một đối tượng descriptor khác. Nếu vì lý do nào đó đối
tượng này bị hủy hoặc cấp phát lại (trường hợp heap descriptor) thì pointer
descriptor sẽ không trỏ đến giá trị đúng nữa.
Ta có sơ đồ quan hệ giữa các lớp descriptor mà Symbian cung cấp như sau:
Hình 4.6 Cây kế thừa các lớp descriptor
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
42
4.3 Mảng
4.3.1 Mảng tĩnh
Mảng tĩnh được cung cấp như 1 phương pháp sử dụng thay thế cho mảng chuẩn
của C++. Mảng tĩnh được sử dụng thông qua lớp khuôn mẫu (templated class)
TFixedArray.
Việc sử dụng mảng tĩnh rất đơn giản (tương tự cách dùng mảng “truyền thống”
mà ta đã quen thuộc trong C++)
int aMang[100]; Æ TFixedArray aMang;
CCoeControl* iControls[ENumControls]; Æ
TFixedArray iControls;
Lưu ý:
Nếu truy xuất phần tử vượt quá kích thước mảng chắc chắn sẽ phát sinh lỗi.
Lớp TFixedArray chỉ là lớp bọc bên ngoài cấu trúc mảng của C++ (wrapper
class) đồng thời cung cấp một số hàm giúp việc thao tác trên mảng trong Symbian
được dễ dàng hơn.
4.3.2 Mảng động
4.3.2.1 Khái niệm
4.3.2.1.1 Giới thiệu
Symbian cung cấp một số lớp hỗ trợ việc xây dựng các mảng đối tượng động
(có thể mở rộng) trong đó các phần tử của mảng được cấp phát vùng nhớ trên heap.
Phần tử của mảng động có thể là một đối tượng bất kì. Các lớp mảng này đều là
những lớp khuôn mẫu, cho phép xác định kiểu của phần tử trong mảng. Mảng động
có thể chứa các đối tượng có kích thước bằng hoặc khác nhau tùy theo lớp mảng
được sử dụng.
Tất cả các mảng đều có một vùng nhớ (buffer) được cấp phát trên heap. Tuy
nhiên việc cấp phát và sử dụng vùng nhớ này phụ thuộc vào loại mảng:
Đối với mảng các phần tử có kích thước bằng nhau, các phần tử được lưu
trong chính vùng nhớ của mảng
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
43
Đối với mảng các phần tử có kích thước khác nhau: mỗi phần tử được lưu
ở một vùng nhớ trên heap và vùng nhớ của mảng (array buffer) chứa con
trỏ đến từng phần tử.
Đối với mảng packed (packed array): các phần tử được lưu trong vùng
nhớ của mảng. (Mảng packed là mảng các phần tử có kích thước khác
nhau, và kích thước của mỗi phần tử được lưu trước phần tử đó trong
vùng nhớ)
Về mặt logic, vùng nhớ của mảng là liên tục. Tuy nhiên ở mức vật lý, vùng nhớ
của mảng có thể được cấp phát liên tục (flat buffer) hay phân đoạn (segmented
buffer).
Lựa chọn dùng mảng cấp phát liên tục hay phân đoạn phụ thuộc vào ứng dụng
cần xây dựng cũng như nhiều yếu tố khác. Ở đây chỉ trình bày tất cả những dạng
mảng động mà Symbian hỗ trợ.
4.3.2.1.2 Sức chứa và độ phân hạt của mảng
Sức chứa (capacity) của mảng là số phần tử mà mảng có thể lưu được với vùng
nhớ được cấp phát hiện tại.
Đối với mảng dùng vùng nhớ liên tục (flat array buffer), khi thêm một phần tử
vào mảng mà không còn vùng nhớ trống; lúc này vùng nhớ của mảng được mở rộng
bằng cách cấp phát lại, số vùng nhớ tăng thêm này chính là độ phân hạt
(granularity) của mảng.
Ví dụ với với mảng 3 phần tử kích thước cố định được khởi tạo với độ phân hạt
là 4; vùng nhớ cấp phát ban đầu cho mảng chứa được 4 phần tử; khi thêm phần tử
thứ 5 vào mảng thì vùng nhớ được cấp phát lại với sức chứa 8 phần tử
Hình 4.7 Sức chứa và độ phân hạt của mảng
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
44
Đối với mảng dùng vùng nhớ phân đoạn, độ phân hạt là sức chứa của một đoạn
vùng nhớ. Khi mảng mở rộng, bao giờ cũng được cấp thêm một hoặc nhiều đoạn
nữa. Độ phân hạt của mảng được qui định khi xây dựng mảng. Có thể thấy việc lựa
chọn giá trị này ảnh hưởng nhiều đến hiệu năng hoạt động của mảng cũng như của
ứng dụng. Giá trị quá nhỏ làm việc cấp phát bộ nhớ xảy ra thường xuyên, giá trị quá
lớn gây lãng phí bộ nhớ.
4.3.2.2 Phân loại mảng động
4.3.2.2.1 Mảng các phần tử có kích thước bằng nhau, vùng nhớ liên tục
Là đối tượng của lớp CArrayFixFlat, các phần tử có kích thước
bằng nhau và được lưu liên tục trong vùng nhớ. Việc mở rộng được thực hiện bằng
cách cấp phát lại vùng nhớ.
Hình 4.8 Mảng cùng kích thước, liên tục
4.3.2.2.2 Mảng các phần tử có kích thước bằng nhau, vùng nhớ phân đoạn
Là đối tượng của lớp CArrayFixSeg
Hình 4.9 Mảng cùng kích thước, phân đoạn
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
45
4.3.2.2.3 Mảng các phần tử có kích thước khác nhau, vùng nhớ liên tục
Là đối tượng của lớp CArrayVarFlat
Hình 4.10 Mảng khác kích thước, liên tục
4.3.2.2.4 Mảng các phần tử có kích thước khác nhau, vùng nhớ phân đoạn
Là đối tượng của lớp CArrayVarFlat
Hình 4.11 Mảng khác kích thước, phân đoạn
4.3.2.2.5 Mảng packed, vùng nhớ liên tục (array of packed elements, flat buffer)
Là đối tượng của lớp CArrayPakFlat
Hình 4.12 Mảng packed, liên tục
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
46
Ngoài ra còn 2 lớp CArrayPtrFlat và CArrayPtrSeg dùng
chứa mảng con trỏ đến các đối tượng. Tuy nhiên người ta ít dùng 2 lớp này mà thay
vào đó là một lớp đơn giản, hiệu quả hơn: RPointerArray
4.3.2.3 Các lớp mảng động đặc biệt
Các lớp CArray được thiết kế hỗ trợ dạng mảng động cho tất cả các loại đối
tượng. Các lớp này kế thừa từ những lớp trừu tượng khác, cũng như thực thi một số
lớp interface. Vì vậy dù rất mạnh mẽ, nhưng nếu ta sử dụng lớp CArray để quản
lý mảng các số nguyên TInt thì có thể có sự lãng phí không cần thiết.
Vì vậy Symbian còn hỗ trợ một khuôn mẫu đặc biệt giúp việc sử dụng mảng
động cho các đối tượng đơn giản được nhanh và hiệu quả hơn. Cụ thể đối với mảng
các số nguyên và mảng con trỏ (là hai loại mảng vốn được sử dụng rất nhiều trong
C++), ta sẽ dùng lớp RArray, RArray và RPointerArray để việc
quản lý, sử dụng mảng động đơn giản và hiệu quả hơn nhiều lần.
Ngoài ra ta còn có thể dùng lớp RArray để tạo mảng động các đối
tượng có kích thước bằng nhau với điều kiện:
Kích thước mỗi phần tử không vượt quá 640 bytes
Không thường xuyên thêm phần tử mới vào mảng (gây cấp phát lại vùng
nhớ).
Như đã trình bày ở trên, tất cả các lớp mảng động đều là lớp khuôn mẫu và giá
trị mẫu truyền vào khi khởi tạo chính là kiểu phần tử của mảng. Tuy có phân biệt về
cách thức lưu trữ nhưng khi lập trình (mặt logic) các mảng động đều sử dụng như
nhau. Cách thức sử dụng mảng động tương tự như các ngôn ngữ lập trình khác như
cấp phát, thêm, xóa các phần tử, cấp phát lại cũng như giải phóng vùng nhớ. Lưu ý:
nếu các phần tử mảng động là đối tượng lớp C thì phải hủy từng phần tử trước khi
giái phóng vùng nhớ cấp phát cho mảng.
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
47
4.4 Mảng chuỗi
4.4.1 Khái niệm
Lập trình viên có thể dùng mảng động để lưu một mảng chuỗi, tuy nhiên
Symbian cung cấp những lớp dùng riêng để lưu trữ mảng chuỗi, trong đó ta có thể
dễ dàng thêm, cập nhật xóa và truy xuất các phần tử chuỗi trong mảng.
Mảng chuỗi cũng có các dạng: 16 bit, 8 bit và build independent type. Bao gồm
mảng chuỗi không thể chỉnh sửa (non-modifiable) và có thể chỉnh sửa (modifiable).
4.4.1.1 Mảng chuỗi không thể thay đổi
Dạng mảng này gồm các TPtrC (non-modifiable pointer descriptor). Mỗi
pointer descriptor này trỏ đến dữ liệu (chuỗi) của từng phần tử trong mảng.
Hình 4.13 Mảng chuỗi không thể thay đổi
Khi dùng mảng non-modifiable pointer descriptor array, dữ liệu được trỏ đến
nhờ các pointer descriptor TPtrC. Như vậy mảng chỉ cần số vùng nhớ rất nhỏ đủ
chứa các thành phần TPtrC (không có vùng nhớ cấp cho phần dữ liệu). Mặt khác,
khi sử dụng dạng mảng này, phải đảm bảo dữ liệu các thành phần (chuỗi) trong
mảng không được hủy hoặc thay đổi ngoài ý muốn.
Bao gồm các lớp: CPtrC16Array, CPtrC8Array và CPtrCArray
4.4.1.2 Modifiable descriptor array
Thành phần của mảng là con trỏ đến heap descriptor (HBuC*). Khi đưa một
descriptor vào mảng, một heap descriptor khác được cấp phát lấy dữ liệu từ
descriptor muốn đưa vào mảng; và phần tử mới của mảng chính là con trỏ đến heap
descriptor vừa được cấp.
Chương 4 . Kĩ thuật lập trình C++ trên Symbian
48
Hình 4.14 Mảng con trỏ chuỗi
Khi sử dụng dạng mảng chuỗi này, một heap descriptor được cấp cho mỗi phần
tử đưa vào mảng. Điều này làm tăng tổng số vùng nhớ yêu cầu cho mảng. Mặt khác
chuỗi sau khi đưa vào có thể bị hủy hoặc chỉnh sửa mà không ảnh hưởng đến các
phần tử trong mảng.
Cũng như mảng động bình thường, lập trình viên có thể sử dụng mảng chuỗi
với 2 loại vùng nhớ: vùng nhớ cấp phát liên tục (flat array buffer) và vùng nhớ cấp
phát phân đoạn (segmented array buffer)
Bao gồm các lớp cụ thể: CDesC16ArrayFlat, CDesC16ArrayFlat và
CDesCArrayFlat; CDesC16ArraySeg, CDesC16ArraySeg và CDesCArraySeg.
Chương 5 . Các giải pháp chính cho việc xây dựng từ điển trên điện thoại di động Series 60
49
Chương 5 Các giải pháp chính cho việc xây dựng từ
điển trên điện thoại di động Series 60
Trong chương 3 ta đã đề cập đến hai mâu thuẫn là:
Mâu thuẫn giữa khả năng lưu trữ của điện thoại di động và yêu cầu về dữ
liệu của từ điển.
Mâu thuẫn giữa tốc độ xử lý của điện thoại di động và tốc độ xử lý của
ứng dụng.
Đối với mâu thuẫn thứ nhất ta có thể giải quyết bằng cách: hoặc là gia tăng khả
năng lưu trữ của điện thoại di động bằng cách nâng cấp thẻ nhớ hoặc là tổ chức nén
dữ liệu (đồng thời phải cung cấp một cơ chế để có thể giải nén và truy xuất dữ liệu
nhanh). Tuy nhiên việc nâng cấp thẻ nhớ không nằm trong nội dung xây dựng từ
điển cho điện thoại di động.
Đối với mâu thuẫn thứ hai, bộ vi xử lý của điện thoại di động khó có thể nâng
cấp giống như máy tính cá nhân được do đó ta chỉ có thể tìm cách xây dựng cấu
trúc dữ liệu hỗ trợ tìm kiếm nhanh.
Như vậy ứng dụng không những cần tổ chức cấu trúc dữ liệu lưu trữ thích hợp
mà còn phải giải quyết các mâu thuẫn trên thông qua tổ chức nén dữ liệu và tổ chức
cấu trúc dữ liệu hỗ trợ cho việc tìm kiếm nhanh.
5.1 Tổ chức cấu trúc dữ liệu lưu trữ
Mỗi một mục từ trong từ điển cần lưu trữ các trường dữ liệu sau: từ gốc, từ loại,
ý nghĩa của từ. Bảng sau mô tả vắn tắt về các trường dữ liệu này.
STT Trường dữ liệu Ghi chú
1. Từ gốc Có kích thước biến động.
2. Từ loại Mỗi từ có thể thuộc về nhiều từ loại khác nhau:
9 Danh từ
9 Động từ
9 Tính từ
9 Trạng từ
9 Giới từ
9 Các từ loại khác
3. Ý nghĩa (các nghĩa
con của từ)
Có kích thước biến động, bao gồm:
9 Phiên âm quốc tế (nếu có)
9 Các nghĩa khác của từ.
Bảng 5.1 Bảng mô tả các trường dữ liệu
Chương 5 . Các giải pháp chính cho việc xây dựng từ điển trên điện thoại di động Series 60
50
Với các trường dữ liệu như vậy, ta có một số giải pháp tổ chức mục từ như sau:
Tổ chức các mục từ có kích thước bằng nhau.
Tổ chức các mục từ có kích thước biến động.
Ta sẽ đi vào xem xét kỹ hơn những ưu điểm và khuyết điểm của từng giải pháp
và chọn ra một giải pháp thích hợp.
5.1.1 Tổ chức các mục từ có kích thước bằng nhau
Ưu điểm:
Dễ dàng truy xuất ngẫu nhiên đến một mục từ khi biết vị trí của nó.
Khuyết điểm:
Gây lãng phí không gian lưu trữ vì các mục từ có kích thước biến động
nhiều. Nếu chúng ta tổ chức các mục từ cùng một kích thước thì sẽ có rất
nhiều mục từ không dùng hết kích thước đó, điều này dẫn đến bộ nhớ bị
lãng phí. Khuyết điểm này rất nghiêm trọng vì bộ nhớ lưu trữ của điện
thoại di động là rất hạn chế.
Kích thước tập tin dữ liệu khi chỉ có từ gốc của 3 loại từ điển thông dụng: Anh
– Việt (68998 từ), Việt – Anh (91146 từ) và Anh – Anh (121962 từ) được liệt kê
trong bảng sau:
Từ điển Ví dụ về từ có kích thước lớn nhất Kích
thước
Tổng
kích
thước
(KB)
Anh – Việt “ extra-sensory pe...u New từ menu Word.
Hình 9.12 Chọn chức năng thêm từ
Ở màn hình biên soạn từ, soạn từ cần thêm. Sau đó bấm nút Lưu.
Chương 9 . Cài đặt và thử nghiệm
120
9.3.4.3.2 Sửa một từ có sẵn trong từ điển
Ở màn hình chính chọn từ cần sửa từ danh sách các từ, sau đó chọn chức năng
sửa Edit Word từ thanh công cụ hoặc chọn menu Edit từ menu Word.
Ở màn hình biên soạn từ, chính sửa từ. Sau đó bấm nút Lưu.
9.3.4.3.3 Xoá một từ trong từ điển
Ở màn hình chính chọn từ cần xoá trong danh sách các từ, sau đó chọn chức
năng xoá Delete Word từ thanh công cụ hoặc menu Delete từ menu Word.
9.3.4.3.4 Compact từ điển trên Dictionary Manager
Thao tác xoá từ không xoá hẳn từ mà chỉ đánh dấu xoá. Khi thực hiện xoá
nhiều lần, sẽ có nhiều từ bị đánh dấu xoá. Tập tin dữ liệu phải lưu những thông tin
không cần thiết hay còn gọi là thông tin rác (thông tin bị đánh dấu xoá). Để bỏ
những thông tin rác này ta phải thực hiện compact dữ liệu.
Ở màn hình chính chọn chức năng Compact từ thanh công cụ hoặc từ menu
Compact của menu Dictionary.
9.3.4.3.5 Export ra dữ liệu Mobile Dictionary
Trước hết phải mở một từ điển có sẵn (*.ini).
Chọn chức năng Export từ thanh công cụ hoặc từ menu Export của menu
Dictionary.
Ở hộp thoại Open gõ vào tên file, chọn OK.
Chương 9 . Cài đặt và thử nghiệm
121
9.4 Thử nghiệm
9.4.1 Kết quả thử nghiệm hoạt động của ứng dụng
Máy ảo:
STT Tính năng thử nghiệm Đánh giá
1 Khởi động ứng dụng Khởi động nhanh, từ khi bắt đầu đến khi hiển thị danh sách từ < 1s
2 Hiển thị danh sách từ và nghĩa tiếng Việt
Sau khi cài đặt thư viện nhận dạng freetype.dll và
font verdref.ttf ; hiển thị đầy đủ tiếng Việt Unicode.
Tuy nhiên một số ít ký tự phiên âm của các từ điển
trích từ freedict không hiển thị đúng.
3 Tốc độ tra từ và hiển thị nghĩa Tra từ rất nhanh, hiển thị nghĩa gần như ngay lập tức. Tìm kiếm chính xác tiếng Việt
4 Phát âm Sử dụng loa của máy tính. Chất lượng âm thanh tốt.
Bảng 9.3 Kết quả thử nghiệm trên máy ảo
Máy điện thoại Nokia N-gage QD:
STT Tính năng thử nghiệm Đánh giá
1 Khởi động ứng dụng Từ khi bắt đầu đến khi hiển thị danh sách từ 2s đến 3s
2 Hiển thị danh sách từ và nghĩa tiếng Việt
Sau khi cài đặt thư viện nhận dạng freetype.dll
và font verdref.ttf ; hiển thị đầy đủ tiếng Việt
Unicode. Tuy nhiên một số ít ký tự phiên âm
của các từ điển trích từ freedict không hiển thị
đúng.
3 Tốc độ tra từ và hiển thị nghĩa
Tra từ rất nhanh, hiển thị nghĩa gần như ngay
lập tức. Tìm kiếm chính xác tiếng Việt. Nội
dung nghĩa dài được hiển thị trong thời gian
chấp nhận được < 3s
4 Phát âm Sử dụng loa điện thoại. Chất lượng âm thanh trung bình. Một số từ tiếng Việt nghe không rõ.
Bảng 9.4 Kết quả thử nghiệm trên máy thật
9.4.2 So sánh với các từ điển hiện có trên thị trường
Hiện nay trên thị trường Việt Nam có hai ứng dụng từ điển với chức năng
tương tự được biết đến rộng rãi là TMADict của công ty TMA Solution và
MTDEVA của công ty Lạc Việt.
Tuy nhiên, qua tìm hiểu ý kiến của người sử dụng và chạy thử chương trình,
phiên bản MTDEVA miễn phí của Lạc Việt (download từ www.mobifuns.net ) có
nhiều khuyết điểm như: bản miễn phí chỉ có từ điển V-E, dung lượng khá lớn 5MB;
giao diện khó sử dụng; đặc biệt thường xuyên xảy ra lỗi làm ngừng chương trình.
Chương 9 . Cài đặt và thử nghiệm
122
Vì vậy TMADict là lựa chọn hàng đầu. Trên cơ sở này, chúng em mạnh dạn chỉ
thực hiện so sánh cụ thể đối với ứng dụng TMADict.
Tiêu chí so
sánh Mobile_Dict TMADict
Tập tin cài đặt
Một tập tin Mobile_Dict.sis
duy nhất cho mọi loại điện
thoại thông minh Series 60
Có tập tin cài đặt font tiếng
Việt riêng.
Hai tập tin cài đặt khác nhau cho
Symbian 6.1 và 7.x.
Trong đó bản dành cho Symbian
6.1 không có phần cài đặt font
tiếng Việt (phải thực hiện bằng
cách copy vào bộ nhớ)
Bộ nhớ máy
(drive C:) dùng
lưu trữ font
tiếng Việt
285 KB (hai tập tin) Symbian 6.1: 285 KB (hai tập tin)
Symbian 7.x: 919 KB (bốn tập tin)
Bộ nhớ sử dụng
khi chạy
chương trình
248 KB 180 KB
Khởi động ứng
dụng
Hiển thị từ điển mặc định
sau 2–3s
Không hiển thị danh sách từ cho
đến khi người dùng chọn từ điển.
Quá trình khởi động ứng dụng và
hiển thị từ điển được chọn > 5s
Số lượng từ
điển
31 loại từ điển 9 loại từ điển
Dung lượng tập
tin dữ liệu từ
điển
E-V: 68998 từ: 4.3 MB
V-E: 91000 từ: 1.9 MB
E-V: 68000 từ: 4.8 MB
V-E: 24000 từ: 1.2 MB
Tốc độ tra từ < 1s < 1s
Thời gian hiển
thị nghĩa
Từ điển E-V: tra từ “love”:
màn hình hiển thị nghĩa có
58 dòng : 2s
Từ điển E-V: tra từ “love”: màn
hình hiển thị nghĩa có 53 dòng : 3s
Phát âm Tiếng Việt, tiếng Anh. Không có
Bảng 9.5 So sánh với TMADict
Từ ngày 18/06, phiên bản đầu tiên của đề tài (chưa có phát âm) đã được cung
cấp miễn phí cho người dùng tại địa chỉ:
Trang web hiện nay:
Chương 10 . Tổng kết
123
Chương 10 Tổng kết
10.1 Một số kết quả đạt được
Trong quá trình thực hiện đề tài “Xây dựng ứng dụng từ điển trên điện thoại
di động”, chúng em đã thu được những kết quả sau:
Tìm hiểu được các loại điện thoại di động trên thị trường và kĩ thuật lập trình
ứng dụng trên những thiết bị này. Với số lượng người sử dụng rất lớn, việc
phát triển và kinh doanh phần mềm trên điện thoại di động hứa hẹn sẽ phát
triển mạnh mẽ trong thời gian tới.
Tìm hiểu được hệ điều hành Symbian và các thiết bị di động sử dụng hệ điều
hành này – vốn đang “làm mưa làm gió” trên thị trường. Đi sâu nghiên cứu
cách thức lập trình C++ trên Symbian Series 60 – dòng điện thoại thông
minh được ưa chuộng nhất hiện nay.
Tìm hiểu được cách thức tổ chức và nén dữ liệu từ điển hiệu quả trên môi
trường điện thoại di động có nhiều hạn chế về tài nguyên.
Xây dựng được ứng dụng từ điển Mobile_Dict trên điện thoại thông minh
Symbian Series 60. Với dữ liệu phong phú, tra từ nhanh và chính xác, hoạt
động ổn định, và đặc biệt là được tích hợp vào điện thoại di động,
Mobile_Dict đã phần nào đáp ứng được nhu cầu của người sử dụng. Ứng
dụng còn hỗ trợ phát âm cho một số ngôn ngữ (Việt, Anh) ở mức tốt nhất mà
chúng em có thể thực hiện.
Ngoài ra, chúng em đã xây dựng chương trình DictionaryManager, hoạt
động trên máy tính, cho phép người dùng thêm, sửa, xóa nội dung các bộ từ
điển.
Chương 10 . Tổng kết
124
10.2 Hướng phát triển
Bổ sung các bộ từ điển nhất là từ điển chuyên môn; hoàn thiện, thống nhất
định dạng dữ liệu.
Bổ sung chức năng tra từ trong những ứng dụng khác của điện thoại (như
Tin nhắn, trình duyệt WAP)
Hoàn thiện chức năng phát âm, đặc biệt là phát âm tiếng Anh. Trên cơ sở đó,
xây dựng ứng dụng “sách nói” trên điện thoại di động.
Phát triển ứng dụng trên các dòng điện thoại Symbian khác (như Series 90,
Quartz). Do kiến trúc nên tảng giống nhau, chỉ khác giao diện hiển thị, nên
khi phát triển cho dòng điện thoại Symbian khác chỉ cần thay đổi phần giao
diện.
Xây dựng ứng dụng Web cho phép người sử dụng điện thoại di động kết nối
Internet (qua GPRS) và tra từ trực tuyến hoặc tra nghĩa các từ không tim
thấy trên máy cục bộ.
Phụ lục A. SDKs và ứng dụng HelloWorld
125
Phụ lục A SDKs và ứng dụng HelloWorld
A.1 SDKs (Software Development Kits)
SDK là gói sản phẩm hỗ trợ việc phát triển ứng dụng gồm công cụ biên dịch, tài
liệu hướng dẫn, ví dụ mẫu, phương tiện kiểm lỗi Để phát triển ứng dụng C++ cho
Symbian, lập trình viên phải sử dụng bộ SDK hỗ trợ lập trình cho điện thoại thông
minh. Hiện nay, các SDK C++ cho Symbian được cung cấp miễn phí trên diễn đàn
chính thức của Nokia forum.nokia.com. Chỉ cần đăng kí thành viên (miễn phí) ,
chọn series 60 Development Tool & SDKs là có thể download rất nhiếu bộ SDK
cho các IDE khác nhau (kích thước hơn 100MB).
Ở đây chỉ đề cập đến SDKs dành cho IDE Ms VC++ bản tiếng Anh. Hiện nay
trên thị trường có hai loại điện thoại thông minh với hai phiên bản hệ điều hành
Symbian 6.1 và 7.0. Vì vậy cũng có hai loại SDKs chính:
SDK for Symbian OS, for C++, 1st Edition (Symbian 6.1)
SDK for Symbian OS, for C++, 2nd Edition (Symbian 7.x), hiện đã có
bản Feature Pack 2.
Ứng dụng phát triển bằng SDK, 1st Edition có thể chạy tốt trên các điện thoại di
động Symbian 7.x. Ngược lại, ứng dụng phát triển bằng SDK, 2nd Edition, nếu giữ
nguyên các thông số mặc định thì không thể cài đặt trên thiết bị sử dụng Symbian
6.1. Tuy nhiên ngày nay phần lớn các điện thoại thông minh mới sản xuất đều sử
dụng hệ điều hành Symbian 7.x nên Nokia đã ngưng phát triển SDK cho Symbian
6.1 và tập trung hoàn thiện các bộ SDK cho Symbian 7.x. Ngoài ra, SDK Help của
hai bộ SDK 1st Edition và 2nd Edition có khác nhau ở phần các control giao diện,
trong đó SDK Help 1st Edition liệt kê các lớp control do hệ điều hành Symbian cung
cấp với đầy đủ hàm thành viên rất hữu ích khi lập trình giao diện. Vì vậy, phần lớn
các lập trình viên muốn phát triển ứng dụng trên tất cả các máy điện thoại thông
minh đều sử dụng cả hai bộ SDK, tùy theo trường hợp mà có sự thay đổi linh hoạt.
Phụ lục A. SDKs và ứng dụng HelloWorld
126
A.2 Hướng dẫn cài đặt SDKs cho Series 60. (Một và nhiều SDK)
Hướng dẫn cài đặt bộ SDK for Symbian OS, for C++, 2nd Edition, FP2 và SDK
for Symbian OS, for C++, 1st Edition.
Những phần mềm cần thiết:
MS Windows 2000 (SP3), hoặc MS Windows SP
MS Visual Studio 6, hoặc MS Visual Studio .NET (cần Visual C++)
ActivePerl 5.6.1 (download miễn phí tại
Series 60 2nd Edition SDK for Symbian C++ Supporting Feature Pack 2 và Series
60 1st Edition SDK for Symbian C++ (download miễn phí tại
(yêu cầu đăng kí thành viên))
JDK 1.4.2_05 trở lên (cần cho các công cụ hỗ trợ của bộ SDKs, download miễn phí
tại
Lưu ý:
Không có chương trình Active Perl sẽ không biên dịch cũng như xây dựng ứng
dụng được.
Đường dẫn chứa các bộ SDK nên để mặc định như sau: Drive Letter:\ Symbian
Qui ước gọi %EPOCROOT% chính là đường dẫn chứa thư mục Epoc32 (Symbian\
8.0a\ S60_2nd_FP2\ hay Symbian\6.1\Series60\ (không có tên ổ đĩa (drive letter))).
Đường dẫn này rất quan trọng giúp biên dịch và xây dựng (compile & build) các
ứng dụng của chúng ta. Đối với bộ SDK 2nd Edition 2.x %EPOCROOT% được xác
định tự động, tuy nhiên đối với SDK 1st Edition %EPOCROOT% phải được lập
trình viên xác định trước khi compile & build ứng dụng.
Việc chuyển đổi giữa các SDK được thực hiện bằng công cụ “EnvironmentSwitch”
của SDK 2nd Ed, FP2. Có thể tìm hướng dẫn chi tiết trong SDK Help và sử dụng
công cụ này tại đường dẫn Symbian\ 8.0a\ S60_2nd_FP2\ Series60Tools\
Environmentswitch\
Quá trình biên dịch và xây dựng ứng dụng của SDK yêu cầu có các đường dẫn
trong biến PATH của hệ điều hành Windows như sau: %ActivePerl%\ bin;
%JDK%\ bin; %MS Visual Studio .NET 2003%\vc7\bin và %MS Visual Studio
.NET 2003% \common7\IDE (hoặc %MS Visual Studio%\vc98\bin và %MS Visual
Studio%\common\ IDE). Trong đó %XXX% là đường dẫn cài đặt chương trình XXX
Phụ lục A. SDKs và ứng dụng HelloWorld
127
trên máy tính. Biến PATH của Windows có thể được điều khiển bằng một trong hai
cách sau:
o Command line: sử dụng lệnh path (path /? để biết cách sử dụng)
o Windows: nhấp phải vào biểu tượng My Computer, chọn Properties Æ Tab
Advanced Æ Button Environment Variables.
A.3 Biên dịch và cài đặt ví dụ HelloWorld
A.3.1 Đối với máy ảo
Khi sử dụng SDK cho IDE MS VC++, việc biên dịch, kiểm lỗi trên máy ảo
được thực hiện thuận lợi như khi phát triển ứng dụng cho máy tính.
Hướng dẫn cách biên dịch chương trình HelloWorld cho máy ảo bằng SDK 2nd
Edition FP 2:
Đầu tiên chép thư mục %EPOCROOT% \Series60Ex\HelloworldBasic\ vào
thư mục gốc ổ đĩa C: để tiện sử dụng.
Vào thư mục \HelloWorldBasic\Group\, dùng công cụ makmake tạo tập tin
dự án cho VC7 (C:\HelloWorldBasic\group\makmake helloworld.mmp vc7).
Lúc này thư mục Group\ chứa đầy đủ các tập tin dự án của VC++7.0.
Khởi động .NET và mở dự án vừa tạo:
Hình A. 1 Cửa sổ HelloWorldBasic project
Phụ lục A. SDKs và ứng dụng HelloWorld
128
Chọn BuildÆRebuild Solution để xây dựng chương trình. Nếu thành công ta
có kết quả sau (bỏ qua các warning):
Hình A. 2 Build Solution HelloworldBasic
Lưu ý: Nếu quá trình biên dịch không thành nên xem lại biến PATH của Windows đã đề
cập trong phần cài đặt.
Sau khi biên dịch thành công ta chọn Debug > Start để thực thi ứng dụng.
Khi VC .NET hỏi chương trình thực thi ta chọn %EPOCROOT% \epoc32\
release\wins\udeb\epoc.exe (shortcut nằm trong StartÆ All ProgramÆ
Series 60 Developer ToolsÆ 2nd Edition SDK Feature Pack 2\1.0 Æ
Emulator (Debug)). Lúc này trình giả lập được khởi động:
Hình A. 3 Trình giả lập SDK 2nd Edition, FP2
Phụ lục A. SDKs và ứng dụng HelloWorld
129
Ta dùng chuột nhấn các phím định vị (lên, xuống, trái, phải) hoặc nhấn trực
tiếp trên bàn phím để chọn ứng dụng cần thực thi (trường hợp này là
HelloworldBasic (HW nằm ở cuối màn hình))
Hình A. 4 HelloWorld trên máy giả lập
Trong quá trình chạy thử ứng dụng trên, ta có thể đặt breakpoint ở bất kì đâu
trong mã nguồn và khi chạy tới đó, IDE sẽ tự động chuyển sang môi trường
debug cho phép ta chạy từng bước, xem giá trị các biến như một ứng dụng
phát triển trên máy tính bình thường.
Lưu ý:
Các tập tin thực thi (trên máy ảo) được phát sinh tại đường dẫn
%EPOCROOT%\epoc32\release\wins\udeb\z\system\APPS\HelloWorldBasi
c\. Nếu không muốn một ứng dụng tồn tại trên máy ảo (vì đã có quá nhiều
ứng dụng hay lý do nào khác) chỉ cần vào đường dẫn trên và xóa thư mục
của ứng dụng đó đi.
Phụ lục A. SDKs và ứng dụng HelloWorld
130
Ổ đĩa C:\ của máy ảo có đường dẫn: %EPOCROOT%\epoc32\wins\c\. Nếu
ứng dụng có liên quan tới tập tin, lập trình viên muốn chạy được trên máy ảo
phải chép các tập tin đó vào đường dẫn trên. Lúc này trong ứng dụng, đường
dẫn của tập tin cần sử dụng sẽ là: “C:\\...”. (Đương nhiên không thể sử dụng
đường dẫn của máy tính trong máy giá lập)
A.3.2 Đối với máy thực
Việc biên dịch ứng dụng cho máy thực độc lập với việc tạo tập tin dự án, phát
triển, chạy thử và kiểm lỗi trên máy ảo. Chỉ cần hai tập tin .mmp và bld.inf là có thể
tiến hành biên dịch ứng dụng cho máy thật.
Công cụ biên dịch chính mà SDK cung cấp là abld.bat, tuy nhiên mỗi ứng
dụng cần một tập tin abld.bat cho riêng nó. Nghĩa là đối với mỗi ứng dụng khi biên
dịch trên máy thật, trước tiên cần phát sinh tập tin abld.bat. Việc này được thực
hiện bằng công cụ bldmake. Tại cửa sổ dòng lệnh nhập:
C:\HelloWorldBasic\group\bldmake bldfiles.
Lúc này dựa vào tập tin bld.inf, tập tin biên dịch ứng dụng abld.bat
được tạo ra trong thư mục Group.
Sau khi đã có tập tin abld.bat, có thể biên dịch ứng dụng cho máy
thực theo một trong hai cách:
Biên dich bằng IDE Ms VC++ 7.0 (MS VC++ 6.0 không thực hiện được):
Hình A. 5 Release build
Chọn Build > Build Solution hoặc Build > Rebuild Solution
Biên dịch bằng dòng lệnh
C:\HelloWorldBasic\group\abld build thumb urel
Dù thực hiện bằng cách nào, nếu biên dịch thành công, các tập tin thực thi mà
quan trọng nhất là tập tin .app sẽ được tạo ra tại đường dẫn:
Phụ lục A. SDKs và ứng dụng HelloWorld
131
%EPOCROOT%\Epoc32\Release\thumb\urel\. Lúc này, mọi thứ đã sẵn sàng, chỉ
cần dùng makesis để tạo tập tin cài đặt và tiến hành cài đặt trên máy thực.
Lưu ý:
Tập tin .pkg sử dụng đường dẫn tương đối để chỉ đến các tập tin thực thi
đã phát sinh. Nếu thư mục HelloworldBasic bị di chuyển sang vị trí khác
thì đường dẫn này không còn chính xác và máy sẽ báo lỗi khi bạn thực thi
lệnh makesis. Có thể sửa lại đường dẫn cho phú hợp trước khi tạo tập tin
.sis. Cụ thể với ứng dụng HelloWorldBasic ở trên, tập tin
Helloworldbasic.pkg có phần các tập tin cần cài đặt như sau:
;original sis file
"..\..\..\epoc32\release\thumb\urel\HelloWorldBasic.APP" -
"!:\system\apps\HelloWorldBasic\HelloWorldBasic.app"
"..\..\..\epoc32\data\z\system\apps\HelloWorldBasic\HelloWorldBasic.rsc" -
"!:\system\apps\HelloWorldBasic\HelloWorldBasic.rsc"
"..\..\..\epoc32\data\z\system\apps\HelloWorldBasic\HelloWorldBasic_caption.rsc" -
"!:\system\apps\HelloWorldBasic\HelloWorldBasic_caption.rsc"
"..\..\..\epoc32\data\z\system\apps\HelloWorldBasic\HelloWorldBasic.aif" -
"!:\system\apps\HelloWorldBasic\HelloWorldBasic.aif"
Do đã di chuyển thư mục HelloWorldBasic nên việc sử dụng đường dẫn tương
đối (..\..\..\) không đúng. Ta cần sửa lại đường dẫn tuyệt đối như sau trước khi gọi
lệnh makesis:
;updated sis file
"%EPOCROOT%\epoc32\release\thumb\urel\HelloWorldBasic.APP"
-"!:\system\apps\HelloWorldBasic\HelloWorldBasic.app"
"%EPOCROOT%\epoc32\data\z\system\apps\HelloWorldBasic\HelloWorldBasic.rsc"
-"!:\system\apps\HelloWorldBasic\HelloWorldBasic.rsc"
"%EPOCROOT%\epoc32\data\z\system\apps\HelloWorldBasic\HelloWorldBasic_capt
ion.rsc" -"!:\system\apps\HelloWorldBasic\HelloWorldBasic_caption.rsc"
"%EPOCROOT%\epoc32\data\z\system\apps\HelloWorldBasic\HelloWorldBasic.aif"
-"!:\system\apps\HelloWorldBasic\HelloWorldBasic.aif"
Bộ SDK 1st Ed phát sinh toàn bộ các tập tin thực thi của một ứng dụng vào
đường dẫn đã nêu trên. Trong khi đó SDK 2nd Ed, FP 2 chỉ phát sinh tập tin
.app vào đường dẫn này; các tập tin còn lại được phát sinh theo đường dẫn:
"%EPOCROOT%\epoc32\data\z\system\apps\Ten_ung_dung\ (*)
* %EPOCROOT% là đường dẫn chứa thư mục Epoc32 của bộ SDK
Phụ lục B. Khái niệm cơ bản khi lập trình C++ trên hệ điều hành Symbian
132
Phụ lục B Khái niệm cơ bản khi lập trình C++ trên hệ
điều hành Symbian
B.1 Các qui ước đặt tên
Môi trường lập trình trên Symbian dùng các qui ước đặt tên để thể hiện ý nghĩa,
vai trò và tầm quan trọng của các lớp, biến, hàm trong mã nguồn. Các qui ước này
liên quan mật thiết đến việc quản lý tài nguyên (bộ nhớ, tập tin) vốn rất hạn chế
trên điện thoại di động. Cụ thể:
B.1.1 Qui ước đặt tên lớp
Loại Ví dụ Mô tả
Lớp bắt đầu
bằng chữ T
TDesC, TPoint, TFileName Các lớp bắt đầu bằng chữ T không có
hàm hủy. Nó giống như các kiểu dữ
liệu xây dựng sẵn (built-in). Các lớp
này cũng thường dùng thay cho struct.
Lớp bắt đầu
bằng chữ C
CConsoleBase, CActive,
CBase
Bất cứ lớp nào dẫn xuất từ lớp CBase
đều bắt đầu bằng chữ C. Các lớp này
luôn được cấp phát vùng nhớ trên heap.
Lớp bắt đầu
bằng chữ R
RFile, RTimer, RWriteStream,
RWindow
Bất cứ lớp nào thao tác với các tài
nguyên (file, time, v.v) đều bắt đầu
bằng chữ R (viết tắt của từ Resource).
Hầu hết các lớp này đều dùng hàm
Close() để giải phóng nguồn tài nguyên
mà nó sở hữu.
Lớp giao diện
bắt đầu bằng
chữ M
MGraphicsDeviceMap,
MEikMenuObserver
Một giao diện (interface) gồm nhiều
hàm ảo và không có dữ liệu. Các lớp
bắt đầu bằng chữ M dùng trong đa kế
thừa.
Các lớp static User, Math, Mem, ConeUtils Một lớp chỉ chứa toàn hàm static. Các
lớp này thích hợp dùng chứa các hàm
thư viện
Struct SEikControlInfo Kiểu dữ liệu struct thường bắt đầu bằng
chữ S. Tuy nhiên, sau này trong
Symbian người ta không dùng kiểu
struct nữa mà thay vào đó là dùng các
lớp bắt đầu bằng chữ T.
Bảng B. 1 Qui ước đặt tên lớp
Phụ lục B. Khái niệm cơ bản khi lập trình C++ trên hệ điều hành Symbian
133
Khi lập trình, các lớp T, R, và C được sử dụng nhiều nhất trong đó việc giải
phóng vùng nhớ cho các đối tượng lớp C khi sử dụng xong là rất quan trọng. Khi
tạo ra một lớp mới, lập trình viên nên tuân thủ nguyên tắc đặt tên này giúp mã
nguồn có sự thống nhất, trong sáng và dễ quản lý. Cụ thể lớp mới chỉ có biến thành
viên T thì bắt đầu bằng T, chứa một biến thành viên là đối tượng lớp C thì là lớp C.
B.1.2 Qui ước đặt tên dữ liệu
Loại Ví dụ Mô tả
Kiểu enum EMonday,
ESolidBrush
Các hằng trong kiểu enum thường bắt đầu bằng chữ
E và tên của enum thì bắt đầu bằng chữ T, chẳng hạn
EMonday là thành phần của enum TDayOfWeek
Hằng số KRgbWhite,
KMaxFileName
Các hằng số thường bắt đầu bằng chữ K
Biến thành
viên
iDevice, iSize Biến thành viên của một lớp bắt đầu bằng chữ “i” .
Chữ “i” là viết tắt của từ “instance”
Tham số aDevice, aSize Các tham số bắt đầu bằng chữ “a”. Chữ “a” là viết
tắt của từ “argument”
Các biến
“automatic”
device, size, x, y Các biến automatic là các biến mà việc quản lý vùng
nhớ do Symbian thực hiện tự động. Người dùng
không cần cấp phát vùng nhớ khi khai báo và không
hủy khi sử dụng xong.
Bảng B. 2 Qui ước đặt tên biến
Phụ lục B. Khái niệm cơ bản khi lập trình C++ trên hệ điều hành Symbian
134
B.1.3 Qui ước đặt tên hàm
Loại Ví dụ Mô tả
Hàm “none-
leaving”
Foo(), Draw() Hàm “none-leaving” là những hàm trong quá trình thực
thi chắc chắn không gặp những lỗi có thể làm sụp
chương trình mà không phải do lập trình như thiếu bộ
nhớ, người dùng xóa tập tinNói cách khác, hàm
“none-leaving” bao giờ cũng thực hiện thành công và trả
về giá trị lập trình viên đã dự tính.
Hàm “leaving” CreateL(),
NewL(),
AllocL()
Các hàm “leaving” kết thúc bằng ký tự L. Ngược lại với
hàm“none-leaving” một hàm “leaving” là một hàm có
cấp phát bộ nhớ, mở file, v.v, nói chung là thực hiện
những thao tác liên quan đến tài nguyên mà có thể
không thành công do thiếu tài nguyên hoặc do những
điều kiện về môi trường (không phải lỗi do lập trình).
Lúc này lập trình viên phải “bẫy” được lỗi xảy ra để
không sụp chương trình. Chi tiết về hàm “leaving” sẽ
được trình bày trong phần quản lý lỗi.
Hàm LC AllocLC(),
CreateLC(),
OpenLC()
Cấp phát vùng nhớ cho một đối tượng và đưa đối tượng
vào cleanup stack. Sẽ trình bày chi tiết trong phần quản
lý lỗi
Hàm lấy dữ
liệu
Size(),
Device(),
GetTextL()
Các hàm này thường là danh từ và dùng để truy cập đến
các biến private trong một lớp. Các hàm truy cập dữ liệu
có liên quan đến tài nguyên (bộ nhớ, file, v.v) thường
kết thúc bằng chữ L và bắt đầu bằng chữ Get.
Các hàm thiết
lập
SetSize(),
SetDevice(),
SetTextL()
Các hàm này thường bắt đầu bằng chữ Set và dùng để
gán giá trị cho một thuộc tính, thông thường là thuộc
tính private trong một lớp. Các hàm có liên quan đến tài
nguyên thường kết thúc bằng chữ L.
Bảng B. 3 Qui ước đặt tên hàm
Lưu ý: lập trình viên không bắt buộc phải tuân theo các qui ước đặt tên trên. Tuy
nhiên tất cả các lớp, biến, hằng số, tên hàm của Symbian đều được đặt theo qui
ước này. Nên muốn phát triển ứng dụng cho hệ điều hành Symbian, lập trình viên
bắt buộc phải biết các qui tắc này. Đồng thời khi xây dựng các lớp mới hay kế thừa
cho ứng dụng của mình, lập trình viên rất nên tuân theo qui ước này nhằm giúp mã
nguồn trong sáng, dễ hiểu, dễ bảo trì và chuẩn hóa.
Phụ lục B. Khái niệm cơ bản khi lập trình C++ trên hệ điều hành Symbian
135
B.2 Kiểu dữ liệu cơ bản
Môi trường lập trình trên Symbian cung cấp các kiểu dữ liệu cơ bản tương
đương với các kiểu xây dựng sẵn của C++. Đó là các lớp dữ liệu cơ bản mà khi sử
dụng không cần cấp phát hay hủy 1 cách tường minh; các lớp này bắt đầu bằng ký
tự T. Lưu ý, khi lập trình trên Symbian không nên dùng các kiểu dữ liệu xây dựng
sẵn của C++ mà hãy dùng các (lớp) kiểu cơ bản mà Symbian cung cấp. Lý do đơn
giản vì thiết bị thực (chạy hệ điều hành Symbian) có thể không làm việc tốt với các
kiểu dữ liệu xây dựng sẵn của C++.
B.2.1 Kiểu số nguyên:
Kiểu dữ liệu
có dấu
Kiểu dữ
liệu không
dấu
Kiểu dữ liệu C++ tương đương Mô tả
TInt8 TUint8 signed char & unsigned
char
Số nguyên 8 bit có dấu và
không dấu
TInt16 TUint16 short int & unsigned short int
Số nguyên 16 bit có dấu và
không dấu
TInt32 TUint32 long int & unsigned long int
Số nguyên 32 bit có dấu và
không dấu
TInt64 Số nguyên 64 bit
TInt TUint int & unsigned int
Số nguyên ít nhất 32 bit có dấu
và không dấu
Bảng B. 4 Kiểu số nguyên
B.2.2 Kiểu số thực:
Kiểu dữ liệu
Kiểu dữ liệu C++
tương đương
Mô tả
TReal32 float Số thực 32 bit
TReal64 double Số thực 64 bit
TReal Tương đương với TReal64
Bảng B. 5 Kiểu số thực
Lưu ý: Hều hết các HĐH Symbian hiện nay không hỗ trợ phần cứng xử lý số chấm
động. Vì vậy các phép toán trên số thực sẽ chậm hơn rất nhiều lần so với số nguyên.
Vì vậy bạn nên hạn chế tối đa việc sử dụng số thực.
Phụ lục B. Khái niệm cơ bản khi lập trình C++ trên hệ điều hành Symbian
136
B.2.3 Các kiểu cơ bản khác:
Kiểu dữ liệu
Kiểu dữ liệu C++
tương đương
Mô tả
TChar 32-bit unsigned integer
Kiểu ký tự của Symbian, dài 32 bit,
cung cấp nhiều hàm xử lý trên ký tự
TText8 char Kiểu ký tự 1 byte
TText16 wchar_t Kiểu ký tự Unicode (2 bytes)
TText Tương đương với TText16
TBool int Kiểu logic, nhận 2 giá trị ETrue/ EFalse
TAny void
Bảng B. 6 Các kiểu cơ bản khác
Lưu ý:
[1] Kiểu TText16 có cùng kích thước với TUint, ở đây chỉ có ý nghĩa giúp
chương trình tường minh hơn (TText16 chứa ký tự, TUint chứa số nguyên
không dấu)
[2] Lớp TChar là lớp ký tự đặc biệt của Symbian, biểu diển được các ký tự
Unicode trong khoảng 0x10000 to 0xFFFFF (trong khi TText16 chỉ biểu
diễn ký tự 16 bit). Đồng thời lớp TChar cũng cung cấp 1 loạt các hàm xử lý
ký tự (viết thường, viết hoa, phân loại kiểu Unicode...)
Phụ lục C. Chuẩn nén Dictzip#
137
Phụ lục C Chuẩn nén Dictzip#
Chuẩn nén Dictzip# được chúng em đề nghị để giải quyết nén dữ liệu và truy
xuất ngẫu nhiên trên tập tin nén cho riêng ứng dụng của mình.
Cách thức nén
Tùy chọn bộ thư viện nén và giải nén. Trong chương trình ứng dụng của mình,
chúng em sử dụng bộ thư viện mã nguồn mở zlib version 1.1.4.
Cấu trúc lưu trữ
Định dạng của tập tin nén theo chuẩn Dictzip#
Các qui ước chung:
o Ký hiệu cho 1 byte:
o Ký hiệu cho một số lượng byte có thể thay đổi :
Định dạng tập tin: một tập tin Dictzip# gồm một chuỗi các thành phần
(các tập dữ liệu nén). Định dạng của từng phần sẽ được trình bày trong
phần dưới đây. Các thành phần chỉ đơn giản sắp xếp liên tiếp nhau trong
tập tin, mà không có các thông tin thêm gì ở phía trước, giữa, hay sau
chúng.
Định dạng các thành phần:
o Thành phần đầu tập tin:
Phụ lục C. Chuẩn nén Dictzip#
138
o Thành phần dữ liệu:
Ý nghĩa các thành phần:
o L: là chiều dài tối đa của khối dữ liệu sau khi giải nén không vượt
quá 64 KB.
o XLEN: là chiều dài của khối dữ liệu liền sau đó.
o uncompr length words: cho biết kích thước từng khối dữ liệu (2
byte) sau khi giải nén.
Phụ lục D. Các bộ dữ liệu của từ điển
139
Phụ lục D Các bộ dữ liệu của từ điển
Dữ liệu nghĩa từ điển
Từ điển Số từ Kích thước Nguồn dữ liệu
Vietnamese - English 91146 1.9 MB [1]
Vietnamese - France 39071 1.7 MB [2]
Vietnamese - German 11922 0.4 MB [2]
Vietnamese - Vietnamese 30158 2.0 MB [2]
English - English 121962 8.1 MB [3]
English - Vietnamese 68998 4.3 MB [1]
English - German 93279 1.4 MB [3]
English - France 8799 0.2 MB [3]
English - Spanish 5907 0.1 MB [3]
English - Netherlandish 7714 0.2 MB [3]
English - Italian 4519 < 0.1 MB [3]
English - Russian 3385 < 0.1 MB [3]
English - Afrikaans 6397 < 0.1 MB [3]
German - Vietnamese 45070 4.7 MB [2]
German - English 81674 1.3 MB [3]
German - Netherlandish 12812 0.3 MB [3]
German - Portuguese 8742 0.2 MB [3]
German - France 8168 0.1 MB [3]
German - Italian 4454 < 0.1 MB [3]
France - Vietnamese 47951 2.9 MB [2]
France - English 7831 0.2 MB [3]
France - Netherlandish 9604 0.2 MB [3]
France - German 6114 0.2 MB [3]
Portuguese - English 10398 0.2 MB [3]
Spanish - English 4502 0.1 MB [3]
Afrikaans - English 5129 < 0.1 MB [3]
Swedish - English 5220 < 0.1 MB [3]
Danish - English 3997 < 0.1 MB [3]
Turkish - English 1026 < 0.1 MB [3]
Czech - English 489 < 0.1 MB [3]
Afrikaans - German 3800 < 0.1 MB [3]
Computing 13798 2.2 MB [3]
Phụ lục D. Các bộ dữ liệu của từ điển
140
Với nguồn dữ liệu nghĩa từ điển được lấy từ :
[1] English Study 4.0
[2]
[3]
Dữ liệu âm thanh
Âm thanh tiếng Việt: Đồ án “Đọc văn bản tiếng Việt” của môn học “Xử lý
ngôn ngữ tự nhiên” do T.S Đinh Điền hướng dẫn.
Âm thanh tiếng Anh: Được phát sinh từ các từng tiếng Anh thông dụng trên
trang web
Tài liệu tham khảo
141
Tài liệu tham khảo
Tài liệu viết
[1] Martin Tasker, Jonathan Allin, Jonathan Dixon, John Forrest, Mark Heath,
Tim Richardson, Mark Shackman, Professional Symbian Programming,
Wrox Press Ltd., 2000
[2] T.S. Dương Anh Đức, Th.S. Trần Hạnh Nhi, “Nhập môn Cấu trúc dữ liệu và
thuật toán”
[3] Trương Hải Bằng, “Giáo trình Cấu trúc dữ liệu 2”, 2001
[4] Tino Pyssysalo, Terje Bergstrom, Jurgen Bocklage, Pawel Defee, Patrik
Granholm, Juuso Huttunen, Ville Karkkainen, Matti Kilponen, Matti
Kilponen, Tomi Koskinen, Mika Matela, Ilkka Otsala, Antti Partanen, Timo
Puronen, Jere Seppal, Juha Siivola, Saiki Tanabe, Jukka Tarhonen, Tommi
Terasvirta, Tuukka Turunen, Tommi Valimaki , “Programming for the
Series 60 Platform and Symbian OS”, John Wiley & Sons Ltd, 2003
[5] Nguyễn Thiện Chương, Phạm Tuấn Sơn, “Xây dựng ứng dụng từ điển trên
Pocket PC”, Luận văn cử nhân tin học, Đại học Khoa học Tự nhiên Tp.Hồ
Chí Minh, 2004
[6] Đặng Minh Thắng, Chu Nguyên Tú, “Xây dựng hệ thống máy tính điều
khiển từ xa sử dụng công nghệ Bluetooth”, Luận văn cử nhân tin học, Đại
học Khoa học Tự nhiên Tp.Hồ Chí Minh, 2004
[7] Phạm Khắc Hưng, Võ Hồng Duyên, “Tìm hiểu và nghiên cứu kỹ thuật phát
triển ứng dụng trên môi trường Symbian OS”, Luận văn cử nhân tin học, Đại
học Khoa học Tự nhiên Tp.Hồ Chí Minh, 2004
[8] Huỳnh Tấn Kiệt, Trần Thị Thùy Trang, “Nghiên cứu hệ điều hành Symbian
6.0 và Xây dựng ứng dụng minh họa trên điện thoại di động Nokia 9210”,
Luận văn cử nhân tin học, Đại học Khoa học Tự nhiên Tp.Hồ Chí Minh,
2004
[9] T.S Đinh Điền, “Giáo trình xử lý ngôn ngữ tự nhiên”, 2004
[10] Series 60 SDK Help – Nokia Series 60
Tài liệu tham khảo
142
Website
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9] (Dictzip – Linux Man Page)
Dữ liệu từ điển
[1] English Study 4.0
[2]
[3]
[4]
Các file đính kèm theo tài liệu này:
- luan_van_nghien_cuu_va_xay_dung_ung_dung_tu_dien_tren_dien_t.pdf