2012-09-29 25 views
6

tôi có sự kết hợp sau đây:Làm cách nào để truy cập thành viên cấu trúc bên trong một liên minh trong C?

union employee 
{ 
    char key; 

    struct manager 
    { 
     short int age; 
     float shares; 
     short int level; 
    }; 

    struct worker 
    { 
     short int age; 
     short int skill; 
     short int department; 
    }; 

} company[10]; 

Làm thế nào tôi có thể truy cập vào một thành viên của một cấu trúc mà là bên trong đoàn employee? tôi đã cố gắng để truy cập age thành viên của cấu trúc manager theo cách này:

company[i].manager.age

Nhưng tôi nhận được error C2039: 'manager' : is not a member of 'employee'.

Trả lời

8

Thêm nội dung nào đó sau khi khai báo thẻ. Có lẽ:

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
} manager; 

Side lưu ý: bạn không sử dụng sự kết hợp đúng đắn. Chìa khóa, tức là trường cho bạn biết liệu bạn đang giao dịch với người quản lý hay chỉ với một công nhân đơn thuần phải ở trong một đối tượng kèm theo, bên ngoài công đoàn. Có lẽ:

struct employee { 
    char key; 

    union { 
     struct manager ...; 
     struct worker ...; 
    } u; 
}; 

Ghi chú dasblinkenlight, bạn có thể khai báo thẻ quản lý/nhân viên bên ngoài công đoàn.

+0

+1 Quan sát về việc sử dụng khóa 'union' là tuyệt vời! Bạn có thể muốn đề cập rằng không cần phải cung cấp các thẻ 'struct' cho' worker' và 'manager' bên trong' union'. – dasblinkenlight

+0

Ah, bây giờ tôi nhận ra những gì tôi đã làm ở đó ... Tôi hoàn toàn bỏ lỡ quan điểm của việc sử dụng một công đoàn. – amiregelz

2

Cấu trúc ẩn danh/công đoàn không phải là một phần của tiêu chuẩn C, mà là một phần mở rộng GNU không phổ biến rộng rãi.

Trong ví dụ cụ thể của bạn, một số trình biên dịch (chủ yếu là GCC) sẽ cho phép bạn truy cập vào các biến duy nhất của người quản lý và nhân viên thông qua ví dụ: company[i].shares hoặc company[i].department, nhưng company[i].age không rõ ràng và trình biên dịch sẽ không biết cái nào có nghĩa là gì. Cách tiếp cận của bạn cũng giống như cố gắng để xác định

union { 
     int num; 
     float num; 
} union_number; 

mà thậm chí không hợp lệ C.

có hai cách để giải quyết này.

a) di chuyển các thuộc tính chia sẻ ngoài struct (GNU cách ác, xin đừng làm điều đó, tôi biết một thực tế rằng icc thậm chí không biên dịch này)

union employee 
{ 
    char key; 

    struct person { 
     short int age; 

     union { 
      struct manager 
      { 
       float shares; 
       short int level; 
      }; 

      struct worker 
      { 
       short int skill; 
       short int department; 
      }; 
     } 
    }; 

} company[10]; 

b) hoặc cách chuẩn sạch hơn để đặt tên struct của bạn:

union employee 
{ 
    char key; 

    struct manager 
    { 
     short int age; 
     float shares; 
     short int level; 
    } manager; 

    struct worker 
    { 
     short int age; 
     short int skill; 
     short int department; 
    } worker; 

} company[10]; 

trong trường hợp này bạn sẽ có thể truy cập vào các yếu tố cấu trúc qua company[i].manager.age, company[i].worker.skill và vân vân.

Hãy chú ý rằng tại thời gian chạy không có cách nào để kiểm tra xem công đoàn của bạn có chứa khóa, người quản lý hoặc nhân viên hay không. Điều đó phải được biết trước.

Một điều nữa: Tôi không chắc chắn nếu dự định này, nhưng trong tuyên bố của bạn, bạn không thể lưu khóa cùng với người quản lý hoặc nhân viên. Công đoàn của bạn chỉ chứa một khóa, người quản lý hoặc nhân viên

+0

Vâng, tôi nhận ra rằng sau khi cnicutar chỉ ra điều đó.Sau đó tôi đã đổi thành: 'struct company { \t phím char; \t đoàn lao động \t { \t \t quản lý struct \t \t { \t \t \t ngắn int tuổi; \t \t \t cổ phiếu thả nổi; \t \t \t mức int ngắn; \t \t} người quản lý; \t \t nhân struct \t \t { \t \t \t ngắn int tuổi; \t \t \t kỹ năng ngắn int; \t \t \t bộ phận nội bộ ngắn; \t \t} công nhân; \t} nhân viên; } comp [10]; ' – amiregelz

+0

Cấu trúc ẩn danh và thành viên công đoàn hoàn toàn là tiêu chuẩn C11, trên thực tế. – 00dani

0

lỗi này là do bạn đang cố gắng truy cập vào các yếu tố cấu trúc theo tên của cấu trúc, không hợp lệ. Để truy cập vào các phần tử của một cấu trúc, trước hết bạn phải tạo một đối tượng cho nó.

trong mã sau đây quản lý và làm việc là các đối tượng của người quản lý cấu trúc và người lao động tương ứng.

nhân viên công đoàn { phím char;

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
}manage; 

struct worker 
{ 
    short int age; 
    short int skill; 
    short int department; 
}work; 

} company [10];

nay để truy cập thành viên u có thể sử dụng "công ty [i] .manage.age"

0

Bạn có thể truy cập vào các thành viên, theo cách mà bạn đang cố gắng (nhưng các cấu trúc mà là bên trong đoàn nên có các thành viên độc đáo) nhưng bạn nên chắc chắn rằng khi biên dịch mã gcc nên biết rằng bạn đang cố gắng như vậy,

lệnh: gcc -fms-extensions file_name.c mà hỗ trợ từ C11.

thích:

union employee 
{ 
char key; 

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
}; 

struct worker 
{ 
    short int age; 
    short int skill; 
    short int department; 
}; 
} company[10]; 

này về cơ bản cho lỗi biên soạn vì nó tìm thấy sự nhập nhằng giữa các thành viên của người quản lý và người lao động.

Vì vậy, nếu bạn thay đổi mã của bạn để:

union employee 
{ 
char key; 

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
}; 

struct worker 
{ 
    short int age1; 
    short int skill; 
    short int department; 
}; 

} company[10]; 

hoặc nếu không bạn có thể giữ trực thuộc công đoàn.

trừ khi bạn không chỉ định -fms-extensions trong khi biên dịch nó sẽ cung cấp lỗi thời gian biên dịch.

Các vấn đề liên quan