2012-10-07 4 views
1

그래서, 저는 유닉스 미니 쉘을 만들고 있습니다. 그리고로드 블록에 왔습니다. I는 기본 기능을 수행 할 수 있어야하므로 I는 함수했다 : 그것은 문자열 배열 (제 인 명령 및 나머지 인수이다) 얻어C Map String to Function

int exec_if_built_in(char **args) 

한다. 기본 제공되지 않는 명령의 경우 간단히 execvp와 같은 것을 사용하지만 첫 번째 문자열을 함수에 매핑하는 방법을 찾아야합니다. 두 배열, 문자열 중 하나 및 해당 함수 포인터를 다른 생각하고 있었다. 그러나 이러한 기능 중 많은 부분이 다르기 때문에 (반환 및 다른 사안을 수락)이 방법은 작동하지 않습니다. 또한 이름 속성과 함수 포인터 속성을 가진 구조체 배열을 만들려고 생각했지만 사용하려는 함수의 다양한 특성으로 인해 다시는 작동하지 않습니다.

그래서 문자열의 입력을 기반으로 함수를 실행하는 가장 좋은 방법은 무엇입니까? 문자열을 특정 함수에 매핑하는 방법은 무엇입니까? 함수 포인터에 익숙하지 않아 뭔가 빠져있을 수 있습니다.

는 경우가 테이블 중심의 접근 방식은 부적절 너무 다양하면 아마 다음 도움말 :

+1

그 ptr-ptr에 대한 경계는 어떤 종류입니까? 나는. 거기에 argc가 있습니까? 나는 명령이 매개 변수를 취하고 당신이 그것들을 유효화하기를 원한다면 조만간에 esp가 필요할 것이라고 생각한다. – WhozCraig

+0

나는 당신이 묻고있는 것에 약간 혼란 스럽다. 쉘에 전달할 수있는 문자 수는 1024 자로 제한됩니다. 사용자가 입력 한 문자열을 문자열 배열로 분해합니다. 함수를 잘 만들 수 있습니다. 함수를 호출하는 방법을 찾아야합니다. – robins35

답변

3

내가 두 배열, 해당 함수 포인터와 문자열 중 하나, 또 다른를 만드는 생각했다.

이것이 올바른 접근 방법입니다. 동일한 유형의 인수를 취하는 랩퍼 함수를 ​​작성한 다음 랩퍼 내부에서 "실제"함수를 호출하십시오.

"스타일에 대한 추가 점수를 얻으려면"알파벳 순으로 문자열 배열을 정렬하고 문자열 배열에 대해 이진 검색을 사용하십시오. 이렇게하면 두 배열이 커질 때 CPU주기를 절약 할 수 있습니다. 즉 당신의 exec_if_built_in가 무엇이 있기 때문에


* 아마 당신은, char **을 사용할 수 있습니다.

+1

+1 : 아주 좋은 착용감. – WhozCraig

+0

오, 그 반환 값은 어떨까요? 아무것도 전달하는 방법을 알아내는 것에 좋은 직업. 동일한 유형 *이 무엇인지 또는 실제 기능이 무엇인지 이해하지 못합니다. – robins35

+1

@Scriptonaut 별표는'char **'에 대한 각주로 안내합니다. 반환 유형이가는 한, 모두 똑같은 것을 반환해야합니다. int는 좋은 후보자처럼 들린다. 기본적으로 exec_if_built_in은 첫 번째 수준의 디스패치가 될 것입니다. 이름으로 명령을 선택하고이를 구현하는 래퍼로 컨트롤을 전달합니다. 그러면 래퍼는 필요한만큼 실제 함수를 사용할 수 있으며 exec_if_built_in이 호출자에게 반환하는 int를 반환합니다. 각 명령에는 명령을 실행할 수있는 고유 한 랩퍼가 있습니다. – dasblinkenlight

1

위해 너희들을 감사 AN/경우 다른-경우 캐스케이드 최적의 솔루션입니다.

if(!strcmp(args[0], "cat")) { 
    /* cat a file */ 
} else if(!strcmp(args[0], "dog")) { 
    /* dog a file */ 
} else if(!strcmp(args[0], "echo")) { 
    /* create an echo chamber */ 
} ... 
+0

문제는 문자열과 일치하는 항목을 찾지 못하는 것입니다. 일치하는 항목을 찾으면 함수를 실행하는 방법입니다. 내가 놓친 게 있니? – robins35

+1

여기에 함수 호출 만 넣으면됩니다. 여기서'/ * cat a file * /'... – nneonneo

+0

이것은 완전히 달성 할 수있는 일이지만 내 임무 (CS 전공)는 계단식을 피하기 위해 말했다. 나는 조금 더 우아하게 생각할 수 없다면 나는 여전히 이것을 할 것이다. (나는 아주 많이 공제되지 않을 것이다). 진심으로 도움을 주셔서 감사합니다. 지난 11 시간 동안 내 머리를 벽에 치고 있었다. – robins35