【问题标题】:how to populate va_list如何填充 va_list
【发布时间】:2013-06-01 12:41:44
【问题描述】:

我无法找到“问题”的答案。

我创建了一个函数,它接受不同数量的整数 ('findMinVal(int x, ...)') 并返回所有调用中的最小数字。现在我的程序直接通过代码获取参数:

int main(){

printf("\nThe minimal number in each call for \"findMin\" is : \n");


findMinVal(90,78,5,20,-1);
findMinVal(70,40,2,-1);
findMinVal(40,30,-1);

return 0;

}/* main */

我希望它接受来自文件的变量,但我不知道如何做到这一点..? 任何帮助将不胜感激。

【问题讨论】:

  • 您不能手动填充va_list
  • 重复问题:stackoverflow.com/questions/988290/populating-a-va-list。简而言之,这是一个坏主意,您应该使用动态构建的带计数器的整数数组(即在 readFile 中:构建数组,计算项目并将计数和数组指针传递给您的 findMinVal() 函数。跨度>
  • 看起来最小值是-1,不是吗? ;v)
  • 不幸的是,这是一项任务,我必须使用 va_list..谢谢

标签: c io variadic


【解决方案1】:

制作可变参数列表的唯一标准方法是调用函数,接受它一次传递所有参数。

findMinValInArray(int n, int a[]) {
    switch(n) {
        case 1: return findMinVal(a[0], -1);
        case 2: return findMinVal(a[0], a[1], -1);
        case 3: return findMinVal(a[0], a[1], a[2], -1);
        case 4: return findMinVal(a[0], a[1], a[2], a[3], -1);
        case 5: return findMinVal(a[0], a[1], a[2], a[3], a[4], -1);
        case 6: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], -1);
        case 7: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], -1);
        case 8: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], -1);
        case 9: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 
            a[8], -1);
        case 0xA: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
            a[8], a[9], -1);
        case 0xB: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
            a[8], a[9], a[0xA], -1);
        case 0xC: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
            a[8], a[9], a[0xA], a[0xB], -1);
        case 0xD: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
            a[8], a[9], a[0xA], a[0xB], a[0xC], -1);
        case 0xE: return findMinVal(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
            a[8], a[9], a[0xA], a[0xB], a[0xC], a[0xD], -1);
    }
}

尽可能避免使用可变参数。

【讨论】:

    【解决方案2】:

    虽然您可以使用 Vovanium 所述的 varargs,但最好将您的 findMinVal 函数改为接受数组。例如:

    int findMinVal(size_t length, int * values){
        /* Find minimum value... 
           (Hint: start with min = values[0] and the loop iterator with 1) */
    }
    

    然后这样称呼它:

    /* allocate values and fill it */
    int min = findMinVal(length, values);
    

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 2015-05-02
      • 2013-11-30
      • 2012-02-15
      • 2013-04-16
      • 1970-01-01
      • 2012-06-26
      • 2020-01-30
      相关资源
      最近更新 更多