2015-04-16 18 views
5

Tôi tự hỏi liệu có thể sử dụng 1 hàm như swap() trong hai cấu trúc khác nhau để hoán đổi chúng không? Vì vậy, ví dụ,Một chức năng hoán đổi sẽ được sử dụng bởi 2 cấu trúc khác nhau

typedef struct{ 
char a; 
}one; 

typedef struct{ 
int c; 
}two; 

swap(??,??){ 
// code to swap 2 elements 
} 

one arr[8]; 
arr[1].a='a'; 
arr[2].a='b'; 

two brr[8]; 
brr[1].c = 11; 
brr[2].c = 12; 

Vì vậy, trên cơ sở đó, là nó có thể cho chức năng trao đổi để có thể trao đổi các yếu tố trong cấu trúc? Ví dụ: có thể sử dụng: 1. hoán đổi (arr [1], arr [2]); 2. trao đổi (brr [1], brr [2]);

Từ sự hiểu biết của tôi, điều đó không thể được thực hiện vì kiểu dữ liệu cho cả cấu trúc (và cả phần tử của nó) khác nhau. Tôi đã tự hỏi làm cho một chức năng mô-đun cho một dự án của tôi để giúp đỡ sẽ được thực sự đánh giá cao.

Cảm ơn.

+0

bạn có thể xác định vĩ mô cho –

+1

này Sử dụng C và như bạn đã viết nó, không có. Nó là không thể mà không cần viết một số mã thực sự xấu xí. Tuy nhiên, bạn có thể muốn điều tra các công đoàn. –

+0

macro hoặc thay đổi thành 'swap (foo, bar, size)' – user3528438

Trả lời

4

Bạn sẽ cần một chức năng chung mà mất trí nhớ địa chỉ để trao đổi thay vì:

void swap(void *a, void *b, size_t size) 
{ 
    void *tmp = malloc(size); 
    // you should make sure the memory allocation was successful 

    memcpy(tmp, a, size); 
    memcpy(a, b, size); 
    memcpy(b, tmp, size); 

    free(tmp); 
} 

Thay vì các yếu tố, bạn vượt qua trong địa chỉ của họ:

swap(&arr[1], &arr[2], sizeof(one)); 
0

Đây là một vĩ mô, không phải là một chức năng. Tôi đã thử nghiệm nó trên GCC và Clang trên Linux x86-64 với tối ưu hóa -O1. Dường như các trình biên dịch đủ thông minh để loại bỏ malloc, memcpy và miễn phí cho các cấu trúc nhỏ. Mã này nên biên dịch thành một cái gì đó nhỏ hơn một cuộc gọi thích hợp đến một hàm.

#define swap(a, i1, i2)\ 
{\ 
    size_t size = sizeof(a[i1]);\ 
    void *tmp_elm = malloc(size);\ 
    memcpy(tmp_elm, &a[i1], size);\ 
    memcpy(&a[i1], &a[i2], size);\ 
    memcpy(&a[i2], tmp_elm, size);\ 
    free(tmp_elm);\ 
} 

Ví dụ sử dụng:

one arr[8]; 
two brr[8]; 
/* Set these two arrays. */ 
swap(arr, 1, 2); 
swap(brr, 1, 2); 
Các vấn đề liên quan