2013-06-09 2 views
2

저는 C와 프로그래밍 전반의 초보자입니다. (저는 2 년 동안 C/C++로 프로그래밍을 해왔습니다.) 그리고 제가 작성한 프로그램의 유일한 유형은 인수를 취하고 연산을 수행하는 명령 행 수학 프로세서뿐입니다 . 입력 내용에 근거하여 수행해야 할 작업을 포크하는 일은 없습니다. 나는 그런 일을하는 방법을 모른다, 그래서 제가 최근에하고 있었던 것은 같이있는 방법으로 내 프로그램을 설계하고있다 :"If"문 이외의 입력을 처리하는 다른 방법이 있습니까?

printf("What feature to use?"); 
int response; 
scanf("%d", response); 
if (response == 1) 
{ 
    feature01(); 
} 
if (response == 2) 
{ 
    feature02(); 
} 

을 ... 그리고 나는 이런 식으로 계속. 일반적으로 10 개 미만의 고유 기능을 가진 프로그램의 경우 이는 당분간 만 가능합니다. 50-100 개의 고유 지사 기능을 가진 프로그램을 작성한 경우 문제가있을 수 있습니다. 위의 방식으로 if 문을 사용하지 않고 어떻게 입력과 다른 기능으로 분기 할 수 있습니까?

당신은 많은 상황에서 switch와 상호 배타적 값에 대한 if 일련의 문을 대체 할 수
+1

http://msdn.microsoft.com/en-us/library/66k51h7a(v=vs.110).aspx? –

+0

필요한 것은 다중 발송입니다. – Steven

답변

2

함수 테이블을 만들 수 있습니다. 첫째, typedef

typedef void (*feature)(); 

feature 이제 인수를 취하지 않고 void을 반환하는 함수에 대한 포인터를 의미합니다. (오류가 왼쪽으로 확인)

feature[] actions = {&feature0, &feature1, ..., &feature9}; 

그리고 코드가됩니다 :

이제 쓰기 (통지 인덱스 변경)

void feature0() {...} 
void feature1() {...} 
// ... 
void feature9() {...} 

그리고 배열에 다음을 넣어

printf("What feature to use?"); 
int response; 
scanf("%d", &response); 
actions[response](); 

함수 포인터는 호출 될 때 실제 함수로 처리됩니다.

+0

이 문제를 해결해 주셔서 감사 드리며 훌륭한 기술입니다. –

+0

'scanf '에 대한 호출을 편집해야합니다. 나는 잘라내어 붙여 넣기 만하면 코드 나 코드가 작동하지 않습니다. 함수에 대한 포인터를 전달해야합니다. 위의 수정 된 버전을 참조하십시오. –

3

:

에 대략 상당의
switch (response) 
{ 
    case 1: 
     feature01(); 
     break; 
    case 2: 
     feature02(); 
     break; 
    default: 
     featureXX(); 
     break; 
} 

: 컴파일러가 할 수있는 것을 제외하고

if (response == 1) 
{ 
    feature01(); 
} 
else if (response == 2) 
{ 
    feature02(); 
} 
else 
{ 
    featureXX(); 
} 

... switch을 조금 더 최적화하십시오.

+0

"사례"도구를 사용하는 방법을 알지 못했습니다. 제 질문에 답변 해 주셔서 감사합니다. –

관련 문제