2014-11-29 7 views
1

다양한 PRNG의 견고성을 테스트하는 몇 가지 코드가 있으며 옵션을 사용하여 테스트중인 PRNG를 선택하고 싶습니다. typedef double (*voidPRNG_ptr)(void);함수 getopt에서 작동하지 않는 포인터

내가 테스트 기능을 가지고 :

나는 함수 포인터 유형이 test_results는 형식 정의 구조체이다 test_results* investigator_alloc(int N, voidPRNG_ptr RNGp) .

나는 PRNG 기능이 있습니다 ... double box_muller(void), double rejection(void), double RNG(void) 등 주요 작품 FINE에

다음 코드 : box_muller 기능은 RNG로 사용되며, 데이터는

int main(int argc, char** argv){ 
    int N = atoi(argv[1]); 
    voidPRNG_ptr PRNGp = &box_muller; 

    test_results* results = investigator_alloc(N, PRNGp); 

    return 0; 
    } 

예상대로

이 또한 잘 작동 예상대로

int main(int argc, char** argv){ 
    int N = atoi(argv[1]); 
    voidPRNG_ptr PRNGp = &box_muller; 

    PRNGp = &rejection; 

    test_results* results = investigator_alloc(N, PRNGp); 

    return 0; 
    } 

거부에있어서, 상기 RNG로서 사용된다.

그러나이 작동하지 않습니다 :

int main(int argc, char **argv){ 
    int opt; 
    int atest = 0; 
    voidPRNG_ptr PRNGp = &RNG; //set default 

    while((opt = getopt(argc, argv, "abur")) != -1){ 
     if(opt == 'a') { 
      PRNGp = &normal_approx; 
      atest = 1; 
     }   
     else if(opt == 'b') PRNGp = &box_muller; 
     else if(opt == 'u') PRNGp = &RNG; 
     else if(opt == 'r') PRNGp = &rejection; 
    } 

    printf("\n %d\n",atest); 


    int N = atoi(argv[1]); 
    //PRNGp = &rejection; 
    //PRNGp = &normal_approx; 
    //PRNGp = &box_muller; 

    test_results *results = investigator_alloc(N,PRNGp); 
    return 0; 
} 

나는 atest가 선택한 옵션에 따라 적절한 값으로 설정되어 getopt 작동하는지 알고있다. 그러나 데이터가 비어 있기 때문에 함수 포인터에 잘못된 것이 있어야합니다.

아이디어가 있으십니까? 감사합니다.

+0

이 프로그램을'-a -b'라고 부르면 처음에는'a'를 얻고,'atest = 1'을 설정하면'b'가되어'box_muller'가' PRNGp '이지만'atest'는'1'로 설정됩니다. 그게 네가 필요한거야? – glglgl

+0

그리고 당신의 질문에 답을해도 : 당신의 묘사가 "효과가 없다"는 것은 솔직히 조금 비천합니다. – glglgl

+0

'atest'는 플래그가 설정되고있는 날씨를 확인하기 위해 방금 만났습니다. 실제로 어떤 작동 코드의 일부가 될 의도는 아니 었습니다. 충분히 공정하게, 어떻게 작동하지 않았는지 상세히 설명해야합니다. – Rohan

답변

1

첫 번째 명령 줄 인수에 atoi()을 적용하는 것이 문제입니다.이 옵션은 사용할 RNG를 프로그램에 알리는 옵션입니다. argv[1]은 숫자가 아니기 때문에 N=0으로 끝나고 데이터가 없습니다.

argv[1]에서 으로 변경하십시오 (Using the getopt function 참조).

+0

와우, 나는 바보 같다고 생각했다. 감사 – Rohan