사용자 입력에 따라 프로그램을 여러 번 실행하려면 실행 함수로 보내지는 arglist 배열을 변경해야합니다. 대부분의 경우, 나는 정보 함수, 첫 번째 인덱스 및 지니 계수에서 사용할 분할 함수를 나타내는 최종 플래그를 설정하는 것 외에는 작동합니다.유닉스 프로그램을위한 arglist 빌드하기
이 프로그램에는 다음을 기반으로 의사 결정 트리를 만드는 세 가지 다른 분할 함수가 있습니다. 교육 및 테스트 데이터 세트. - 파일
./decision -train voting-train-1 -test voting-test-1 -out voting.out -[i, s, g]
은 무엇 첫 번째 명령이하는 것은
./decision voting 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 줄을 제거하는 결과를 가져 왔습니다.
getopt 및 getopt_long을 사용 해본 적이 있습니까? 이것은 명령 행 옵션을 처리하는 표준 방법입니다. – meagar
^^ 대답해야합니다. 왜냐하면 그것은 * 답입니다. –
당신은 질문의 요점을 놓쳤습니다. 저는 명령 행 입력을 구문 분석하는 것에 대해 묻지 않고 오히려 그것을 구축하는 것에 대해 질문했습니다. getopt는 CLI를 분석하고 여기에 어울리는 것을 보지 못합니다. – Jason