Đố vui[C++]

Thảo luận trong 'ACM/Programming' bắt đầu bởi HustReMw, 05/10/17, 04:10 PM.

  1. HustReMw

    HustReMw Moderator Thành viên BQT

    Tham gia: 20/12/16, 05:12 PM
    Bài viết: 196
    Đã được thích: 126
    Điểm thành tích:
    43
    Câu hỏi: Tìm lỗi, giải thích rõ bản chất lỗi và đưa ra hướng giải pháp?

    int _tmain(int argc, _TCHAR* argv[])
    {
    LPCTSTR pszDisk = L"C:\\";
    ULARGE_INTEGER lpFreeBytesAvailable;
    ULARGE_INTEGER lpTotalNumberOfBytes;
    ULARGE_INTEGER lpTotalNumberOfFreeBytes;

    GetDiskFreeSpaceEx(pszDisk,&lpFreeBytesAvailable,&lpTotalNumberOfBytes,&lpTotalNumberOfFreeBytes);
    printf("Available: %u, Free: %u\n", (lpFreeBytesAvailable.QuadPart / (1024 * 1024 * 1024)), (lpTotalNumberOfFreeBytes.QuadPart / (1024 * 1024 * 1024)));
    system("pause");
    return 0;
    }
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    whf thích bài này.
  2. scila1996

    scila1996 W-------

    Tham gia: 29/06/13, 11:06 PM
    Bài viết: 21
    Đã được thích: 3
    Điểm thành tích:
    18
    Code khó nhìn quá mode ơi :(
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  3. HustReMw

    HustReMw Moderator Thành viên BQT

    Tham gia: 20/12/16, 05:12 PM
    Bài viết: 196
    Đã được thích: 126
    Điểm thành tích:
    43
    Bạn copy ra notepad ++ nhé. hay để mình đính kèm file. Nó cũng chỉ có vài dòng thôi :D
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  4. scila1996

    scila1996 W-------

    Tham gia: 29/06/13, 11:06 PM
    Bài viết: 21
    Đã được thích: 3
    Điểm thành tích:
    18
    QUADPART là kiểu ulonglong nên chỗ printf phải chỉ định in ra ULONGLONG tương ứng chứ không in ra %u được vì có 4 byte thôi, còn ULONGLONG = 8 byte. Sửa lại như này chắc ok rồi.

    Mã:
    printf("Available: %llu, Free: %llu\n", (lpFreeBytesAvailable.QuadPart / (1024 * 1024 * 1024)), (lpTotalNumberOfFreeBytes.QuadPart / (1024 * 1024 * 1024)));
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  5. HustReMw

    HustReMw Moderator Thành viên BQT

    Tham gia: 20/12/16, 05:12 PM
    Bài viết: 196
    Đã được thích: 126
    Điểm thành tích:
    43
    Chuẩn rồi bạn :D. Free: %u\n nó bằng bao nhiêu và tại sao bạn?
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
  6. scila1996

    scila1996 W-------

    Tham gia: 29/06/13, 11:06 PM
    Bài viết: 21
    Đã được thích: 3
    Điểm thành tích:
    18
    nó bằng 0 hoặc ra một giá trị sai, thực ra thì giá trị nó vẫn tính đúng chỉ khác mỗi phần in thì nó chỉ tính 4 byte thay vì 8 byte thôi. Mà như code trên thì nó nhảy địa chỉ kiểu, cái tham số đầu tiên là 8 byte rồi, nhưng 2 cái %u nên là nó in ra một nửa của 8 byte đấy 2 lần chứ không đụng đến cái tham số cuối cùng
     
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    HustReMw thích bài này.