2014-12-24 1 views
4

함수 포인터를 사용하여 간단한 스왑 함수를 구현하려고하지만 함수 포인터를 함수 포인터에 할당 할 때 pointersTofunctionB.c:14:6:warning: assignment from incompatible pointer type [enabled by default]이 발생합니다. 아래는 내 코드입니다경고 : 함수 포인터를 함수 포인터에 할당 할 때 호환되지 않는 포인터 유형에서 할당 됨 [기본으로 활성화 됨]

#include <stdio.h> 
void intSwap(int *a,int *b); 
void charSwap(char *a,char *b); 
void (*swap)(void*,void*); 
int main(int argc, char const *argv[]) 
{ 
    int a=20,b=15; 
    char c='j',d='H'; 
    swap=&intSwap;// warning here 
    swap(&a,&b); 
    printf("%d %d\n",a,b); 
    swap=&charSwap;// warning here also 
    swap(&c,&d); 
    printf("%c %c\n",c,d); 
    return 0; 
} 


void intSwap(int *a,int *b) 
{ 
    *a=*a+*b; 
    *b=*a-*b; 
    *a=*a-*b; 
} 
void charSwap(char *a,char *b) 
{ 
    char temp; 
    temp=*a; 
    *a=*b; 
    *b=temp; 
} 

이 경고는 어떻게 제거합니까? 누군가 나를 도와주세요.

답변

8

경고는 의 함수에 대한 포인터로 변환 될 수있는 C 표준

6.3.2.3 포인터

8 가지 유형의 기능에 대한 포인터의 다음 인용 인해 나타나는 또 다른 유형 및 다시; 결과는 과 원래 포인터를 비교해야합니다. 변환 된 포인터를 사용하여 유형이 참조 된 유형과 호환되지 않는 함수를 호출하는 경우 동작은 정의되지 않습니다.

두 함수들의 파라미터 호환되도록 두 함수 타입 호환 타입

(원형 포함)

6.7.6.3 함수 선언자를

15 가진다 호환 될 것이라고 모두 지정한다 호환 가능한 반환 유형 .145) 또한 매개 변수 유형 목록은 이 있으면 매개 변수 개수와 줄임표 종료자인 에서 일치해야합니다. 해당 매개 변수는 호환 유형이어야합니다.

매개 변수에서 매개 변수는 포인터로 선언됩니다.그들은 (포인터)가 호환 될 수 있도록 그들은

6.7.6.1 포인터는 모두 동일하게 자격을 갖춘해야한다 호환 될 수 있도록 두 개의 포인터 유형의

2를 선언시 호환 유형에 대한 포인터이어야하며 모두 는 포인터한다 호환 유형.

그러나 int 유형 또는 char 유형과 void 유형은 호환 유형이 아닙니다.

당신은 경고, 코드이 과부하 제거하려면 당신의 기능을 다음과 같은 방법으로

void intSwap(void *a, void *b) 
{ 
    int *x = a; 
    int *y = b; 

    *x = *x + *y; 
    *y = *x - *y; 
    *x = *x - *y; 
} 

void charSwap(void *a, void *b) 
{ 
    char *c1 = a; 
    char *c2 = b; 
    char temp = *c1; 

    *c1 = *c2; 
    *c2 = temp; 
} 
3

당신은

swap=intSwap; 

같은도 swap=&charSwap; 간다

swap=&intSwap; 

에 변경해야합니다.

다시, 함수 서명이 함수 포인터 서명과 일치하지 않습니다.

함수는 함수 포인터 서명이 개 void *의 소요

void (*swap)(void*,void*); 

반면, 무효 반환 형식, int *의 두 개의 입력 매개 변수입니다

void intSwap(int *a,int *b); 

입니다. void charSwap와 동일합니다.

기능 서명을 변경해야하거나 다른 기능 포인터 프로토 타입을 사용해야합니다. 그렇지 않으면 동작이 정의되지 않습니다. [블라드의 대답에서 언급 한 바와 같이].

+4

은'& intSwap'는 intSwap''과 같은 일에 의해로 평가 그 자체. 앰퍼샌드가 존재하는지 여부는 아무런 차이가 없습니다. –

+0

@MichaelBurr 당신이 옳습니다, 그들은 둘 다 똑같은 것으로 평가합니다. 그러나 나는'swap = intSwap;'이라고 써야한다고 생각했다. 제 잘못을 시정 해주세요. –

+0

저는 개인적으로 강한 감정을 가지지 않습니다. 다른 사람들이 앰퍼샌드를 사용하지 말 것을 권유하는지 확실하지 않습니다. –

-5

을 정의 할 수 있습니다 :

void (*swap)(int *,int*); 

void (*swap)(char *,char*); 
+1

이것은 무엇입니까? 제발 좀 더 자세히 설명해 주실 수 있습니까? –

+1

과부하? C에서? 당신이 C와 C++을 혼동스럽게 생각한다고 생각합니다. ... – glglgl

-3
#include<stdio.h> 
using namespace std; 

void intSwap(int *a,int *b); 
void charSwap(char *a,char *b); 
void (*swap)(int*,int*); 
void (*swap1)(char*,char*); 
int main() 
{ 
    int a=20,b=15; 
    char c='j',d='H'; 
    swap=&intSwap;// warning here 
    swap(&a,&b); 
    printf("%d %d\n",a,b); 
    swap1=&charSwap;// warning here also 
    swap1(&c,&d); 
    printf("%c %c\n",c,d); 
    return 0; 
} 


void intSwap(int *a,int *b) 
{ 
    *a=*a+*b; 
    *b=*a-*b; 
    *a=*a-*b; 
} 
void charSwap(char *a,char *b) 
{ 
    char temp; 
    temp=*a; 
    *a=*b; 
    *b=temp; 
} 

**If you want you can use like it......** 
+0

대신에 어떻게 함수 이름을 사용했는지 언급 한 것처럼 말입니다. 나는 함수 포인터의 사용을 보여주고 싶지만 당신이 언급 한 수정은 충분하지 않을 것이다. – sAm

+0

'using namespace std;'? 질문은 C++가 아니라 C에 관한 것입니다. – glglgl