Những lỗi lập trình trong eVC

Chào tất cả mọi người. Sau một thời gian làm việc với eVC, em đã gặp rất nhiều lỗi củ chuối và rất mất công trong việc tìm cách khắc phục. Làm đúng hướng dẫn như trong help hoặc ví dụ nhưng chương trình ko chạy theo mong muốn, và rất vất vả để tìm cách “đi vòng”.Vậy nên em xin phép mod mở topic này để anh em dùng eVC có thể đóng góp ý kiến, giúp đỡ nhau:
Lỗi 1:

  • Sử dụng hàm memcpy():
    Giả sử chúng ta có một char pbuf* là một buffer đọc từ một file. Ta muốn cắt ra xâu n kí tự kể từ vị trí thứ i. Ta thường làm:
    char * strtempt=new char[n];
    memcpy(strtempt,(char*)pbuf + i, n);
    CString str=(CString)strtempt;
    Tuy nhiên, kết quả nhiều lúc ra không như mong muốn, xâu str ra kết quả đúng n kí tự đầu, tuy nhiên tự dưng chèn thêm những kí tự lạ đằng sau.
    Em bó tay ko thể hiểu nổi. Mặc dù bug độ dài của strtempt vẫn là n, kí tự cuối của strtempt vẫn đúng, nhưng khi hiện ra vẫn sai. Cuối cùng em phải làm như sau :
    char * strtempt=new char[n+1];
    memcpy(strtempt,(char*)pbuf + i, n);
    CString str=((CString)strtempt).Left(n);

Lỗi 2:Convert xâu thành số
Giả sử ta có xâu str=“123”; ta muốn gán int a có giá trị bằng str. trong VC ta thường làm
a=atoi(str);
eVC thì bố khỉ, lỗi thường xuyên xảy ra. Em đi vòng như sau:
char *temptString=new char[2];
wcstombs( temptString, (LPCTSTR)str, 2 );
int a=atoi(temptString);

Còn rất rất nhiều điều bức xúc nữa. Em post lên đây, ko giấu dốt, mọi người chê khen thỏai mái. Cốt là anh em code eVC ngày càng ngon
Happy new year!

Hihi, khai trương box Lập trình đầu năm đã có lỗi, gay go, gay go :smiley:

  1. Quên không đánh dấu kết thúc chuỗi kết quả bởi ‘\0’.

  2. Chắc cũng tương tự lỗi trên.

Thử lại xem nhé, còn gì bức xúc ta chiến típ :slight_smile:

Em biết về cái này một chút, xin đóng góp chút ý kiến:

  1. Lỗi 1: Lỗi như bác mô tả là bởi chuỗi strtempt sau khi được copy n ký tự, không được kết thúc bằng 0x00. Do vậy, khi đến dòng code màu đỏ, operator của CString nhận diện sai độ dài chuỗi, gây ra lỗi trên.
char * strtempt=new char[n];
memcpy(strtempt,(char*)pbuf + i, n);
CString str=(CString)strtempt;

Khắc phục:

char * strtempt=new char[n+1]; //Bác chú ý là cần n+1 nhé, do vị trí cuối cùng dành cho ký tự null (\0)
memcpy(strtempt,(char*)pbuf + i, n);
strtempt[n] = 0;
CString str=(CString)strtempt;
  1. Lỗi 2: trong VC, mặc định TCHAR tương tự như char, do macro UNICODE không định nghĩa. Cho nên khi bác gọi atoi(str) với str có kiểu CString, operator LPCTSTR của CString convert sang kiểu const char *, đúng kiểu đối số với hàm atoi (const char *).
    Trong eVC, TCHAR trở thành wchar_t (2 bytes), nhưng hàm atoi vẫn có đối số là const char *. Do vậy bác đã làm thêm một giai đoạn là convert từ unicode (wchar_t) sang multibyte (char).
    Khắc phục: bác thử dùng hàm _wtoi(const wchar_t *).

Lỗi 1 đúng như bác Knoppix và bác ppc-admin nói, có lẽ nó thiếu kí tự kết xâu. Mà tổ mẹ nó chứ, trong 8000 chuỗi lamg như thế, nó sai mỗi một hai chỗ mới điên, làm em mất toi đêm giao thừa. hihi.
:slight_smile:

đúng là xử lý xâu trong C++ nói chung hơi chặt chẽ ( không thể gọi là lỗi của compiler :D) thông thường khi xử lý đầu tiên là fải memset sau đó gán giá trị =0 ở fần tử canh ( n+1) thì sẽ ra kết quả đúng…Hơn nữa nếu không xử lý các bước trên thì có thể chạy debug không sao nhưng khi chạy release mà conflict bộ nhớ là kernel error ngay.

@Tư Triều: Khi code cho PDA bác nên dùng mã unicode, như vậy sẽ có lợi rất nhiều trong việc coding.

:smiley:

Tôi hay dùng các function wsprintf() với các tham số của mình… thay vì gán trực tiếp. Hàm này tương đương với function Format của CString.

Tốt hơn hết, không nên dùng CString của MFC, tôi toàn dùng API để tiết kiệm tối đa.

Em đang tìm cách kết nối với tệp *.mdb bằng eVC mà mãi vẫn ko được (bằng MFC), mong các sư huynh chỉ giáo giùm em.

@bac Quynh : bây giờ em cũng biết là như thế, nhưng … hu hu… lúc em bắt đầu làm thì tất cả là con số 0.
Suy cho cùng, nếu lởm quá là tại bác không bày dạy cho em từ trước. :smiley:

Mong các sư huynh chỉ giáo cho em cách bắt sự kiện của bút chỉ (ấn xuống, di chuyển, thả ra) trong MFC với, em đang thắc mắc phần này, cám ơn các huynh trước.

Cái này tương ứng với sự kiện của Mouse trong Windows 32 đó bạn…

thanks bác, nhân tiện hỏi luôn các bác xem bác nào kết nối database thành công với eVC nhỉ (connect được MS Access thì tốt, ko thì SQLCE cũng được) thì post lên đây chỉ giáo giùm em.

Bạn có thể tham khảo ở đây này: http://www.codeproject.com/ce/#Database

Good morning HHVN, cái này em thử rồi, toàn báo lỗi thôi. Có bác nào kết nối thành công rồi thì post lên đây chỉ giáo giùm em với :).

Bạn xem thêm ở đây nhé:
pocketpcdn.com - Judi Online

Ui, cái này em đọc chán rồi, viết không hay lắm, em mới tạo được CSDL trong chương trình và truy xuất trực tiếp trong chương trình thôi (kết nối SQLCE nhưng bằng eVB), ở đây em muốn kết nối CSDL (ít ra là SQLCE, còn ko thì MS Access thì càng tốt) cho Windows Mobile 2003 mà, nhưng nghe nói là từ Windows Mobile 2003SE trở lên thì ko hỗ trợ MS Access nữa, vậy thì mong các đại ca chỉ giáo, em đang làm đề tài tốt nghiệp với PPC.