函数指针在getopt中不起作用

时间:2014-11-29 17:16:33

标签: c function-pointers getopt

我有一些代码可以测试各种PRNG的稳健性,我想选择使用选项测试哪个PRNG。

我有一个函数指针类型:typedef double (*voidPRNG_ptr)(void);

我有一个测试功能:test_results* investigator_alloc(int N, voidPRNG_ptr RNGp) 其中test_results是一个typedef结构。

我有PRNG功能:double box_muller(void)double rejection(void)double RNG(void)等......

主要作品中的以下代码为FINE:

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;
    }

box_muller函数用作RNG,数据符合预期。

这也很精细:

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; 
}

我知道getopt正在运行,atest设置为正确的值,具体取决于所选的选项。但是由于数据是空白的,因此函数指针必定存在问题。

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

问题在于您将atoi()应用于第一个命令行参数,该参数告诉您的程序使用哪个RNG。由于argv[1]不是数字,因此您最终会得到N=0而且没有数据。

argv[1]更改为argv[optind](请参阅Using the getopt function)。