我有一些代码可以测试各种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
设置为正确的值,具体取决于所选的选项。但是由于数据是空白的,因此函数指针必定存在问题。
有什么想法吗? 谢谢!
答案 0 :(得分:1)
问题在于您将atoi()
应用于第一个命令行参数,该参数告诉您的程序使用哪个RNG。由于argv[1]
不是数字,因此您最终会得到N=0
而且没有数据。
将argv[1]
更改为argv[optind]
(请参阅Using the getopt
function)。