2014-05-12 6 views
3

모든 데이터 형식의 변수를 사용하고 동일한 데이터 형식의 변수를 반환하는 함수를 사용해야합니다. 내가 아는이 모두 작동하지 않습니다 IS 분명히 내가 그래서 내 모든 매개 변수의 데이터 유형으로 무효를 사용하는이되어 가지고이며 어떻게 수행하는 아무 생각이 :void 인수가있는 함수

void better (void a, void b) 
{ 
    if (a > b) 
     return a; 
    else if (b > a) 
     return b; 
} 

그래서 제 질문은 것 이 일을 올바르게하는 방법은 무엇입니까? 이것은 정확한 정의가 아니며 작동 방식을 이해하고 싶습니다.

+3

Void는 타입이 아닙니다 ... 그래서 매크로 또는 C++ 템플릿 ... 독약을 선택하십시오 ... – Macmade

+1

어떤 데이터 유형의 변수를 사용하고 분명히, 당신은 뭔가를 오해하고있는 것입니다. 또는 문제의 진술에 약간의 다소 난해한 해석이 필요할 수도 있습니다. – AnT

+1

@Macmade :'void'는 타입입니다. C 언어에서 'void'는 값이없는 불완전한 유형입니다 (완료 할 수 없음). – AnT

답변

1

아마도 먼저 비교 방법을 식별하는 데 도움이 될 것이다 어떤 타입의 인자를 취하고 더 큰 값을 반환하는 일종의 일반화 된 함수.

문제는 당신이 실제로는 여러 가지 C 기본 유형 > 논리의 동일한 종류를 사용하여 비교 될 수 있다는 것을 사실이지만 C.에서이 작업을 수행 할 수 없다, 아니 그들 모두는 의미 같은 비교 될 수 있으며, 심지어 컴파일러는 그렇게 할 수는 없지만 "알 수없는 유형의 인수"와 "인수 유형이 무엇이든 반환하십시오"라고 말할 방법이 없습니다.

C는 형식을 명시 적으로 정의해야합니다. 이는 일반적으로 지원하려는 모든 유형에 대해이 함수의 다른 버전을 만드는 것을 의미합니다. 즉, better_int 함수와 better_float 함수 등을 만든 다음 해당 함수를 호출하십시오.

이 경우

, 그것은 바로 코드를 컴파일하기 전에 기본적으로 당신이 비교 코드를 자동 생성하는 매크로라는 다른 컴파일러 기능을 사용하는 것도 가능합니다. 이것은 목표를 달성 할 수 있지만 순수한 C 구조에서는 수행하지 않습니다. 이런 식으로이 문제를 해결하고 싶다면이 방법에 대해 더 많이 물어보십시오.

+0

나는 이것을 사용했다. 그러나 오류가 발생한다 : void 값은 반드시 있어야하고 경고가된다 : 경고 : dereferencing 'void *'포인터. 각 변수 앞에 데이터 유형을 쓰려고했습니다. 예를 들면 다음과 같습니다. (int) * a> (int) * b. 그러나 그때 그것은 소리 치게된다 : void 표현의 무효의 사용. – Skaiste

+0

@Skaiste, 죄송합니다. (내 잘못이야). 어떤 경우에는 값을 비교하기 위해 값을 적절한 유형으로 변환해야합니다. ('void *'를 'int *'에 캐스팅하여 정수 값으로 비교할 수 있도록 편집 된 답변. –

0

C로만 제한되는 경우 void*을 매개 변수 유형 및 반환 유형으로 사용할 수 있습니다. 이 작동하지만 잘못된 형식 (들)을 전달할 경우 컴파일러에서 보호가 없습니다. 변수를 관리하고 예를 들어 char*을 전달하면 함수가이를 처리하고 다른 것으로 처리하지 않도록주의해야합니다.

이제 기본 유형보다는 포인터와 주소를 다루고 있음에 유의하십시오. 이로 인해 특히 나중에 해제해야하는 반환 값에 메모리 (예 : malloc)를 할당하는 경우 로직에 새로운 수준의 복잡성이 발생합니다.

typedef enum CMPTYPE_E 
    { 
    CMPTYPE_STRCMP, 
    CMPTYPE_INT 
// ..etc 
    } CMPTYPE_T; 

그런 다음, 메소드가 정의 된 각 유형을 비교하기 위해 제공 할 수 있습니다 :

void *better (void *a, void *b, CMPTYPE_T cmpType) 
    { 
    switch(cmpType) 
     { 
     case CMPTYPE_STRCMP: 
     return(strcmp(a,b) > 1 ? a : b); 

     case CMPTYPE_INT: 
     return((*((int *)a) > *((int *)b)) ? a : b);   

// ...etc 
     } 
    }   
1

은 당신이 할하려는 것은 만드는 것입니다