c - 函数指针在 getopt 中不起作用

标签 c function-pointers getopt

我有一些代码可以测试各种 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/

相关文章:

c - Linux 下的 Getopt

perl - 从 Getopt::Long 操作 GetOptions 中的标志类型

C 编程 getchar()

c++ - C 和 C++ 的数组大小声明差异

c - 为什么不输入数字会死循环?

c - 返回指向函数错误的指针

ios - iOS 应用程序中的 SQLite C 函数导致 EXC_BAD_ACCESS

c++ - 在 C++ 中调用作为结构数组成员的成员函数指针的语法是什么

python - 在两个Python模块之间传递C函数指针

c - 为什么Getopt只执行到if语句中?