2009-11-23 28 views
15

struct của tôi là một số như thế nàyCó cách nào để lặp qua một cấu trúc với các phần tử của các kiểu khác nhau trong C?

typedef struct { 
    type1 thing; 
    type2 thing2; 
    ... 
    typeN thingN; 
} my_struct

làm thế nào để liệt kê các trẻ em struct trong một vòng lặp như thời gian, hay cho?

+0

những gì hoạt động nào bạn muốn làm cho mỗi người? –

+0

Tôi không thể thấy lý do tại sao bạn muốn lặp qua các loại khác nhau. Không phải mỗi loại yêu cầu một hoạt động khác nhau? Vui lòng giải thích. –

+0

tò mò, tôi có một hàm chấp nhận một giá trị với thứ tự childrens của một sctruct, ví dụ, chức năng ("string1", "string2", 1 // đây là chỉ số của trẻ em struct) trong phần thân hàm, tôi biết, nơi tôi sẽ giữ các thông số dây, tôi biết rằng tôi có thể vượt qua con trỏ đến trẻ em mà tôi muốn, nhưng, tôi nghĩ rằng đó là một cách khác. cảm ơn cho tất cả các câu trả lời – drigoSkalWalker

Trả lời

34

Tôi không chắc chắn những gì bạn muốn đạt được, nhưng bạn có thể sử dụng X-Macros và có tiền xử lý làm lặp trên tất cả các lĩnh vực của một cấu trúc:

//--- first describe the structure, the fields, their types and how to print them 
#define X_FIELDS \ 
    X(int, field1, "%d") \ 
    X(int, field2, "%d") \ 
    X(char, field3, "%c") \ 
    X(char *, field4, "%s") 

//--- define the structure, the X macro will be expanded once per field 
typedef struct { 
#define X(type, name, format) type name; 
    X_FIELDS 
#undef X 
} mystruct; 

void iterate(mystruct *aStruct) 
{ 
//--- "iterate" over all the fields of the structure 
#define X(type, name, format) \ 
     printf("mystruct.%s is "format"\n", #name, aStruct->name); 
X_FIELDS 
#undef X 
} 

//--- demonstrate 
int main(int ac, char**av) 
{ 
    mystruct a = { 0, 1, 'a', "hello"}; 
    iterate(&a); 
    return 0; 
} 

này sẽ in:

mystruct.field1 is 0 
mystruct.field2 is 1 
mystruct.field3 is a 
mystruct.field4 is hello 

bạn cũng có thể thêm tên của hàm được gọi trong X_FIELDS ...

+3

cảm ơn bạn đã giới thiệu cho tôi X-Macro, câu trả lời tuyệt vời! – drigoSkalWalker

+3

X-Macro là một điều mặc khải đối với tôi. Nó cảm thấy kinda bẩn, nhưng kinda đúng. Cảm ơn! – KarateSnowMachine

3

Không có cách nào an toàn để liệt kê các thành viên của cấu trúc, trừ khi nội dung chính xác của cấu trúc được biết, và ngay cả trong trường hợp đó, bạn phải cẩn thận với những thứ như cấu trúc liên kết/padding.

Tùy thuộc vào vấn đề của bạn, có thể an toàn hơn khi có một mảng cấu trúc của bạn.

0

Vì bạn có kế hoạch xử lý chúng trong vòng lặp, tôi cho rằng các loại khác nhau có thể ít nhất được xử lý giống nhau hoặc có kích thước tương tự.

Nếu trường hợp này xảy ra, lựa chọn của bạn sẽ phụ thuộc vào kích thước của các phần tử. Nếu tất cả chúng đều giống nhau, bạn có thể lấy một con trỏ tới cấu trúc, đưa con trỏ đến một trong các loại của bạn và tăng nó cho đến khi bạn 'sử dụng hết' toàn bộ cấu trúc.

PS: Thật vậy, không phải là một thực hành rất an toàn. Đây là một tình huống xử lý tốt hơn nhiều với cách tiếp cận OO, lợi dụng tính đa hình. Nếu không, không có đảm bảo về sự liên kết như đã đề cập trước đó.

0

Không có cách nào để lặp qua cấu trúc thành viên bằng ngôn ngữ C, bất kể có cùng kích thước/loại hoặc kích thước/loại khác nhau hay không.

+0

Hmm, nếu chúng là tất cả cùng một loại, bạn sẽ không thể sử dụng một chút số học 'sizeof' và lặp qua các giá trị? Tôi đồng ý rằng không có thực sự nói một bản đồ có ý nghĩa của những giá trị mà không biết thứ tự khai báo trước khi bàn tay, nhưng tôi nghĩ rằng bạn có thể lặp qua các giá trị như một tập hợp. –

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