Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: 1 lỗi union khó hiểu trong lập trình C++??

  1. #1
    Ngày gia nhập
    10 2009
    Bài viết
    12

    Mặc định 1 lỗi union khó hiểu trong lập trình C++??

    Code:
    #include <iostream>
    #include <fstream>
    #include <windows.h>
    using namespace std;
    union store
    {
        char chr[10];
        struct
        {
            int pst;
            short wlength;
            int mlength;
        }data;
    }store;
    
    int main(int argc, char *argv[])
    {
        ifstream ifile("./hung.idx");
        char * chra;
        chra = &(store.chr[0]);
        ifile.read(chra,10);
    
        cout << store.data.pst << endl; //  0 //ok
        cout << store.data.wlength << endl; // 1 //ok
        cout << store.data.mlength << endl; // 0 // error ????????????????????
    
    
        cout << *(int *)(&store.chr[0])<< endl; // 0 //ok
        cout << *(short *)(&store.chr[4])<< endl; // 1 //ok
        cout << *(int *)(&store.chr[6])<< endl; // 2 //ok
        system("pause");
        return 0;
    }
    đây là file cpp và file binary cần read mong cách bạn giúp đở:
    http://www.mediafire.com/?fcdp490wwmxkb64

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Không có gì đáng ngạc nhiên, mặc định các compiler đều align các dữ liệu để đạt hiệu quả cao hơn (Cái này là do cơ chế hoạt động của chip - CPU).
    Ví dụ kiểu dữ liệu int của bạn là 4 bytes thì compiler sẽ align để mỗi int đều được đặt ở địa chỉ chia hết cho 4.
    Tương tự short sẽ được align ở địa chỉ chẵn.
    Vì vậy trong struct của bạn, sẽ có 2 byte trống ở cạnh short wlength, và int mlength sẽ được align trùng với chr[ 8 ]

    Để được như bạn mong muốn, bạn google "packed struct <tên compiler>" để biết compiler của bạn hỗ trợ packed struct như thế nào. Ví dụ với gcc/g++ thì bạn viết như sau:

    C Code:
    1.     struct
    2.     {
    3.         int pst;
    4.         short wlength;
    5.         int mlength;
    6.     } __attribute__((__packed__)) data;

    Với VC++ thì có #pragma packed ..v..v bạn tự tìm hiểu cho compiler của bạn nhá

  3. #3
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    #pragma pack không phải packed,
    trong VS cũng có thể dùng __declspec(align()) để đạt align cho một kiểu dữ liệu nào đó (do người dùng định nghĩa).

Các đề tài tương tự

  1. Kiểu Union và Kiểu liệt kê Enum trong lập trình C/C++
    Gửi bởi kidkid trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 08-08-2014, 04:19 PM
  2. Bài tập C++ Tổng giá trị của các trường trong một union
    Gửi bởi kissl0ve13 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 23-10-2011, 07:06 PM
  3. Việc chiếm dụng bộ nhớ của Union trong C++. Xin giúp đỡ?
    Gửi bởi tatung trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 26-02-2010, 02:00 PM
  4. Sử dụng Order by khi có Union trong SQL
    Gửi bởi iamonlining trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 6
    Bài viết cuối: 16-12-2009, 05:32 PM
  5. Cho mình hỏi về Union sử dụng trong bài này
    Gửi bởi genius2080 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 21-05-2007, 12:30 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn