Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 9 của 9
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Xin hỏi lỗi này là của VC hay là do đâu

    Em có viết thử 1 chương trình rất đơn giản
    Chương trình chỉ đọc từ file input.txt
    8 số nguyên 8 bit dạng hexa và cho hiển thị trên màn hình
    Với code như sau
    Mã:
    #include <stdio.h>
    #include <conio.h>
    
    int main(void) {
    	FILE *f;
    	unsigned char i, ucG[8];
    
    	f=fopen("input.txt", "rt");
    	for(i=0; i<8; ++i) {
    		fscanf(f, "%02X", &ucG[i]);
    		printf("%02X ", ucG[i]);
    	}
    	fclose(f);
    	getch();
    	return 0;
    }
    Chương trình chạy đúng và hiển thị đủ 8 số lên màn hình
    nhưng khi kết thúc chương trình thì chương trình bị crash

    Tuy nhiên cùng chương trình đó khi build dùng chế độ debug thì chương trình chạy sai và không bị crash

    mấy số 0 cuối cùng kia ở đâu ra.
    Cũng với chương trình đó
    Khi mình sửa tên biến ucG[8] thành uc[8] thì khi build ở chế độ release và dubug kết quả như nhau
    Mã:
    #include <stdio.h>
    #include <conio.h>
    
    int main(void) {
    	FILE *f;
    	unsigned char i, uc[8];
    
    	f=fopen("input.txt", "rt");
    	for(i=0; i<8; ++i) {
    		fscanf(f, "%02X", &uc[i]);
    		printf("%02X ", uc[i]);
    	}
    	fclose(f);
    	getch();
    	return 0;
    }
    chương trình chạy không bị crash nhưng bị đẩy thêm 4 số 00 00 00 00 vào giống như khi đặt tên biến là ucG[8] build ở chế độ debug

    Mình đính kèm cả 2 project mình thử với VC 6
    Mọi người xem giúp mình xem lỗi ở đâu
    Thanks.
    TestVC6.rarTestVC6_2.rar
    ============================
    Nội dung của file input.txt như sau
    Mã:
    11 22 33 44 55 66 77 88

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Lỗi do người viết đó, ko phải do trình dịch đâu, tên biến chả có gì liên quan ở đây hết :|
    ucG[i] có kiểu unsigned char mà lại scanf %02X cho kiểu unsigned int.
    thế là chết luôn cái stack

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi greigaz
    Lỗi do người viết đó, ko phải do trình dịch đâu, tên biến chả có gì liên quan ở đây hết :|
    ucG[i] có kiểu unsigned char mà lại scanf %02X cho kiểu unsigned int.
    thế là chết luôn cái stack
    Vậy theo bác sửa %02X thành cái gì cho hợp lý?
    Tại sao khi đổi tên biến nó lại ra kết quả khác so với không đổi tên?

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    tốt nhất là đổi uc về kiểu unsigned int, ko thì scanf vào 1 biến tạm rồi gán lại sau.
    còn cái crash hay k chắc là do ăn may [IMG]images/smilies/laughing.gif[/IMG]

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi greigaz
    tốt nhất là đổi uc về kiểu unsigned int, ko thì scanf vào 1 biến tạm rồi gán lại sau.
    còn cái crash hay k chắc là do ăn may [IMG]images/smilies/laughing.gif[/IMG]
    Vậy không có cách nào nhập trực tiếp mà không phải nhập qua trung gian 1 biến unsigned int sao bác?
    Lý do ăn may nghe có vẻ không hợp lý cho lắm.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ^
    với scanf thì không.
    mà dùng unsigned char làm gì? nếu là vấn đề bộ nhớ thì bỏ đi.
    vừa thử lại xong, VC6 xuất ra 2 file exe giống hệt nhau cho cả 2 đoạn và đều crash như nhau.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi greigaz
    ^
    với scanf thì không.
    mà dùng unsigned char làm gì? nếu là vấn đề bộ nhớ thì bỏ đi.
    vừa thử lại xong, VC6 xuất ra 2 file exe giống hệt nhau cho cả 2 đoạn và đều crash như nhau.
    Giống hệt nhau là sao bác?
    So sánh CRC32 hay MD5 chăng?
    Chắc là giải quyết bằng cách nhập qua unsigned int rồi chuyển qua là dễ nhất.
    Cảm ơn bác.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi greigaz
    tốt nhất là đổi uc về kiểu unsigned int, ko thì scanf vào 1 biến tạm rồi gán lại sau.
    còn cái crash hay k chắc là do ăn may [IMG]images/smilies/laughing.gif[/IMG]
    Chính xác [IMG]images/smilies/biggrin.png[/IMG] http://stackoverflow.com/questions/12830052/wrong-format-specifiers-in-scanf-or-printf
    Vấn đề là thớt viết 4 bytes vào chỗ chỉ có 1 byte.

    (đọc thêm về kiểu dữ liệu của input http://www.cplusplus.com/reference/cstdio/scanf/ )

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    1 char chỉ có 1 kí tự làm sao mà bạn chép 2 kí tự 1 vào 1char được thế.
    bạn chép hết 1 dòng của file vào 1 string rồi dùng split() nó sẽ chia ra cho bạn 8 mảng char[2] chứ char[8] làm sao chép hết.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •