Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数指针在getopt中不起作用_C_Function Pointers_Getopt - Fatal编程技术网

C 函数指针在getopt中不起作用

C 函数指针在getopt中不起作用,c,function-pointers,getopt,C,Function Pointers,Getopt,我有一些测试各种PRNG健壮性的代码,我想使用选项选择要测试的PRNG 我有一个函数指针类型:typedef double(*voidPRNG_ptr)(void) 我有一个测试功能:test\u results*investor\u alloc(int N,voidPRNG\u ptr RNGp) 其中,test\u results是一个类型定义的结构 我有PRNG功能:double-box\u-muller(void),双重拒绝(void),双重RNG(void),等等 以下代码在主体工程中

我有一些测试各种PRNG健壮性的代码,我想使用选项选择要测试的PRNG

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

我有一个测试功能:
test\u results*investor\u alloc(int N,voidPRNG\u ptr RNGp)
其中,
test\u results
是一个类型定义的结构

我有PRNG功能:
double-box\u-muller(void)
双重拒绝(void)
双重RNG(void)
,等等

以下代码在主体工程中适用:

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
根据所选选项设置为正确的值。但是函数指针肯定有问题,因为数据是空的

有什么想法吗?
谢谢

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


argv[1]
更改为
argv[optind]
(请参阅)。

哇,我觉得自己很笨,我本该拿起它的。感谢完全无关的,但是如果你用
-a-b
调用这个程序,你首先得到
a
,设置为
atest=1
,然后得到
b
,给你留下
box\u muller
作为
PRNGp
,但是
atest
仍然设置为
1
。这就是你需要的吗?而且,即使你的问题得到了回答:老实说,你的描述“不起作用”有点糟糕。
atest
只是在那里检查旗帜是否被设置。它并不是任何工作代码的一部分。公平地说,我应该详细说明它是如何工作的。