2011-10-25 3 views
1

사용자 입력에 따라 프로그램을 여러 번 실행하려면 실행 함수로 보내지는 arglist 배열을 변경해야합니다. 대부분의 경우, 나는 정보 함수, 첫 번째 인덱스 및 지니 계수에서 사용할 분할 함수를 나타내는 최종 플래그를 설정하는 것 외에는 작동합니다.유닉스 프로그램을위한 arglist 빌드하기

이 프로그램에는 다음을 기반으로 의사 결정 트리를 만드는 세 가지 다른 분할 함수가 있습니다. 교육 및 테스트 데이터 세트. - 파일

./decision -train voting-train-1 -test voting-test-1 -out voting.out -[i, s, g]

은 무엇 첫 번째 명령이하는 것은

./decision voting 5

모든 voting- 에 세 개의 분할 기능을 실행 : 그래서 이러한 유효 입력은 기존의 CLI 입력을 모방하기 위해 아글리스트를 설정 1에서 5 사이의 값을 갖는 반면, 두 번째 매개 변수는 단일 데이터 집합으로 수행합니다.

나는 반복에 따라 내장 된 임시 인수의 배열을하고 최종 플래그를 추가 할 수있는 시간이 올 때, 이것은 내가 무슨 짓을했는지입니다 : 여기

//flag pointers 
char *igFlag= "-i"; 
char *faFlag= "-s"; 
char *giFlag= "-g"; 

//copy temp array to specific arglist 
igInput= cli; 
faInput= cli; 
giInput= cli; 

//set information gain flag and null 
igInput[7]= igFlag; 
igInput[8]= '\0'; 

//set first attribute flag and null 
faInput[7]= faFlag; 
faInput[8]= '\0'; 

//set gini coefficient and null 
giInput[7]= giFlag; 
giInput[8]= '\0'; 

문제는 때 faInput[7]= faFlag입니다 실행하면 igInput[7]이 일치하도록 변경되고 giInput[7]= giFlag이 실행될 때 세 배열 모두 일치하는 [7] 포인터가 있습니다.

정수 배열에 대해 동일한 임시 포인터를 사용할 때 비슷한 문제가 발생했지만이 문제는 다른 이름의 변수를 사용하여 수정되었습니다. 이 문제는 서로 관련이없는 별개의 변수가 있더라도 발생합니다.

내가이 문제를 해결하는 방법을 알고 AusCBloke의 요청에 대한 응답으로

해결, 여기에 표시됩니다.

우선, 마지막 입력란을 수정할 필요가없는 것으로 결정했습니다. 마지막 입력란은 수정해야합니다. 그래서 xxInput 문자열 중 두 개를 잘라 버리고 하나만 사용했습니다.

마지막에 더 많은 플래그가 필요하며 결국 중복 코드로 끝나기보다는 사용할 플래그가 포함 된 char flag[5]을 만들었습니다. 그런 다음 for 루프 내부에서 호출되었으며, 여기에서 사용 된 플래그는 현재 인덱스 값이었습니다.

이 모든 접근 방식은 불필요한 코드 약 30 줄을 제거하는 결과를 가져 왔습니다.

+6

getopt 및 getopt_long을 사용 해본 적이 있습니까? 이것은 명령 행 옵션을 처리하는 표준 방법입니다. – meagar

+2

^^ 대답해야합니다. 왜냐하면 그것은 * 답입니다. –

+1

당신은 질문의 요점을 놓쳤습니다. 저는 명령 행 입력을 구문 분석하는 것에 대해 묻지 않고 오히려 그것을 구축하는 것에 대해 질문했습니다. getopt는 CLI를 분석하고 여기에 어울리는 것을 보지 못합니다. – Jason

답변

2

. 제 생각에 반복에 따라 -i, -s 또는 -g과 같이 명령을 세 번 실행하려고합니다. 이렇게 :

char opt[] = "-i", *cmd[] = { 
    "decision", "-train", "voting-train-1", "-test", "voting-test-1", 
    "-out", "voting.out", opt, 0 
}; 
/* use first command line */ 
opt[1] = 's'; 
/* use second command line */ 
ops[1] = 'g'; 
/* use third command line */ 
+0

당신이 나의 최종 해결책에 가장 가까이 왔기 때문에 대답으로 당신을 골랐습니다. 설명을 보려면 편집을 참조하십시오. – Jason

2

코드는 cli 배열을 다양한 입력 변수에 복사하지 않습니다. 세 개의 입력 포인터를 모두 cli 배열을 가리 키도록 설정합니다. igInput 이후 faInputgiInput은 모두 같은 위치를 가리키며, faInput[7]을 변경하면 모두 동일한 기본 데이터를 가리 키기 때문에 giInput[7]을 수정하는 것처럼 보입니다. 어레이 데이터를 복사하려면 memcpy을 사용해야합니다. 그러나 당신은 arg를 처리하기 위해 실제로는 getopt을 사용해야한다. @meagar가 제안한다. faInput[7]= faFlag 실행하는, 그것은 giInput[7]= giFlag 실행시 igInput[7]가 세 배열 [7]에 대한 포인터를 매칭 한 후 일치하도록 변경되면 여기

//copy temp array to specific arglist 
igInput= cli; 
faInput= cli; 
giInput= cli; 
3

문제이다.

//copy temp array to specific arglist 
igInput= cli; 
faInput= cli; 
giInput= cli; 

당신은 당신이 cli를 가리 키도록 그 char *의 각 설정, cli을 복사하지 않고 있습니다. 당신이 getopt의 meagar의 제안을 사용하지 않는 경우에 따라서 igInput[7] == faInput[7] == giInput[7] == cli[7]

그들에 ig/fa/gaInputmemcpycli 메모리를 할당합니다.

편집 : 오, 이런 인수를 다른 것으로 전달하려고 할 때 기다려야합니까? 그리고 cli 같은 종류의 argv 같은가요? 그 사실의 경우와 clichar ** 의 경우, 당신은 당신이 그것을 가지고있는 방법, 즉에 그 비슷한 유지할 수 : 당신은 악몽에 사소한 무언가를 만들고있어

cli[8] = NULL; 

cli[7] = igFlag; 
execv(cli[0], cli); 

cli[7] = faFlag; 
execv(cli[0], cli); 

cli[7] = giFlag; 
execv(cli[0], cli); 
+1

또는 유닉스이므로 malloc() ating 및 memcpy() ing 대신 strdup() 만 사용하십시오. – ninjalj

+0

오, 그래, 좋은 strdup' 만약 그가'cli' 전체를 복사하고 싶다면 그는 그렇게 할 수 있습니다. 잘 했어. – AusCBloke