/

1 tháng 7, 2013

Chuyển đổi các dạng chuỗi ký tự trong ObjectARX và VS2005

Một vấn đề làm nhức nhối dân lập trình nghiệp dư như mình là chuyển đổi giữa các dạng ký tự (char, TCHAR, ACHAR, wtchar, string, CString, UNICODE, ANSI...). Nhiều lúc mình không phân biệt nổi, dẫn đến những lỗi rất ngớ ngẩn khi chạy ứng dụng ObjectARX. Những lỗi này có thể làm cho AutoCAD ngừng hoạt động theo kiểu "đột quỵ", ra đi không một lời từ biệt.
Nhưng con giun xéo lắm cũng phải oằn, hôm nay mình sẽ quyết tâm tìm hiểu đến nơi đến chốn vấn đề này.

Dưới đây là một số hàm chuyển đổi mình đã sưu tập được:

1. Sử dụng kiểu string phải thêm tệp tin tiêu đề string.h
# Include "string"
using namespace std;

2. Tương tự, khi sử dụng kiểu CString cũng phải thêm tệp tin tiêu đề (trong dự án không có MFC)
# Include "afx.h"
Chú ý Nếu gặp thông báo lỗi:
 # error: Building MFC application with / MD [d] (CRT dll version) requires MFC shared dll version. Please # define _AFXDLL Or do not use / MD [d] error.
Lúc này, bạn cần thay đổi cài đặt cho dự án:

Project | Properties | Configuration Properties | General | Use of MFC:
Use MFC in a Shared DLL (Project -> Properties -> Lựa chọn Use MFC in as share dll)

Sử dụng MFC cho dự án
3. wchar_t
wchar_t là một kiểu dữ liệu của C++, char is 8 character type, có thể chứa tới 256 loại Character, nhiều nhóm ký tự nước ngoài đặt số ký tự còn lớn hơn 256,  many foreign-language character sets the number of characters contained more than 256, character can not be represented

wchar_t data type is 16, the number of characters that can be represented far more than the char type.

4. Kiểu ACHAR (đây là kiểu dữ liệu được định nghĩa bởi AUTODESK trong tệp tin adachar.h:
typedef wchar_t ACHAR ;)
# include "adachar.h"

5. USES_CONVERSION được định nghĩa trong tệp tin atlconv.h
#include "atlconv.h"

6. Chuyển đổi từ string sang ACHAR *

string str = "string";
ACHAR * ach;
USES_CONVERSION;
ach = (ACHAR *) A2CT (str.c_str ());
7. Chuyển đổi từ ACHAR * sang string
ACHAR * ach;
USES_CONVERSION;
string temp = W2A (ach);

8. Chuyển đổi từ (Wchar_t) ACHAR * sang char *
char * ch;
ACHAR * ach;
USES_CONVERSION;
ch = T2A (ach);

9. Chuyển đổi từ char * sang ACHAR *
ACHAR * ach1;
char * ch;
Cách 1:
USES_CONVERSION;
ach1 = A2W (ch);
Cách 2:
size_t convertedChars = 0 ;
/ / record returns the actual length of the string conversion
mbstowcs_s (& convertedChars, ach1, 10, ch, _TRUNCATE) ;
/ / 10 is the maximum length of ch

Degrees, as needs change

10. Chuyển đổi từu int sang string
string str;
int nNumber = 10001;
char cT [10] ;/ / put int into a string
_itoa_s (nNumber, cT, 10);
str = cT; or string str (cT);

11. Chuyển đổi từ string sang int

12.Chuyển đổi từ CString sang char *
Cách 1:
char * ch;
CString temp;
ch = T2A (temp.GetBuffer (0));
Cách 2:
Using casts
CString theString ("This is a test");
LPTSTR lpsz = (LPTSTR) (LPCTSTR) theString;

13. Chuyển đổi từ char * sang CString
Cách 1:
Can directly assign
CString cstr;
char * ch;
cstr = ch;
Cách 2: Bằng cách sử dụng hàm format

char chArray [] = "This is a test";
CString cstr;
MBCS lower (ie not defined UNICODE time):
cstr.Format (_T ("% s"), chArray);
UNICODE is defined:
USES_CONVERSION;
cstr.Format (_T ("% s"), A2W (chArray));

14. Chuyển đổi từ char * sang int
char * ch;
int n = atoi (ch);

15. Chuyển đổi int sang char *
int n = 45;
char nCh [10];
char * ch;
itoa (n, nCh, 16) ;/ / 16 is hexadecimal, 2,8,10,16, also may take the following forms may be used: ch = itoa (n, nCh, 16);
VS2005 atmospheres: _itoa_s (n, nCh, 2);

16. Chuyển CString sang string
string str;
CString temp;
USES_CONVERSION;
str = T2A (temp.GetBuffer (0));

17. Chuyển string sang CString
CString cstr;
string str;
cstr = str.c_str ();

18. Chuyển char * sang string
Phương pháp xây dựng trực tiếp:
char cT1 [20];
string ste (cT1) ;/ / re-construct a string - Xây dựng lại chuỗi

19. Chuyển string sang char *
string ste;
ch = (char *) ste.c_str ();
By removing const char * conversion properties can only pay attention to ch

char *, not to char []

20. Chuyển từ float (hoặc double) sang string
char cT1 [20];
_gcvt_s  (cT1, 20,110.58485678,6) ;/ / 6  số sau dấu thập phân
string ste (cT1);

21. Chuyển string sang double
string num = "15.12054";
double d = atof (num.c_str ());

Không có nhận xét nào:

Đăng nhận xét