我有一些代码可以测试各种 PRNG 的稳健性,我想使用选项选择要测试的 PRNG。
我有一个函数指针类型:typedef double (*voidPRNG_ptr)(void);
我有一个测试函数:test_results* investigator_alloc(int N, voidPRNG_ptr RNGp)
其中 test_results
是类型定义的结构。
我有 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
根据所选选项设置为正确的值。但是函数指针一定有问题,因为数据是空白的。
有什么想法吗? 谢谢!
最佳答案
问题是您将 atoi()
应用于第一个命令行参数,这是告诉您的程序要使用哪个 RNG 的选项。由于 argv[1]
不是数字,您最终得到 N=0
并且没有数据。
将 argv[1]
更改为 argv[optind]
(参见 Using the getopt
function)。
关于c - 函数指针在 getopt 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27204844/