2016-03-06 91 views
1

我有這樣的功課:「使用具有可變數量參數的函數從字符串(隱式值或來自KB)確定10個精度雙數的最小值。前7個值將被考慮最初,接下來是最後3點,最後是這2點。「那麼我做到了這一切,但我不知道爲什麼它給了我一些奇怪的結果。下面的代碼:C變量參數

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdarg.h> 
#include <conio.h> 
double min(double,...); 

void main(){ 
    double a,b,c; 
    printf("Introduceti numerele: "); 
    scanf("%lf%lf%lf",&a,&b,&c); 
    printf("\nMinimul este %lf",min(10,1.34,4.34,7,5.23,6.23,2,8.232,a,b,c)); 
    _getch(); 
} 

double min(double x,...){ 
    int i; 
    double y; 
    va_list ap; 
    va_start(ap,x); 
    y=va_arg(ap,double); 
    for(i=0;i<x;i++){ 
     if(y>va_arg(ap,double)) 
      y=va_arg(ap,double); 
    } 
    va_end(ap); 
    return y; 
} 

此外,我不知道爲什麼編譯器知道什麼論據是下一個,因爲我沒有在使用的va_arg(AP,雙)。

for(i=0;i<x;i++){ 
    if(y>va_arg(ap,double)) 
     y=va_arg(ap,double); 
+6

什麼是奇怪的結果(除了唐納德特朗普離開理髮師時)? –

+0

'_getch'和'conio'不是標準的。 – Olaf

+0

嗯,我得到這樣的:-93453434343 –

回答

3

在調用你的函數min第一個參數是參數的個數,它具有類型int

#include <stdarg.h> 

double min(int numberOfArgs, ...) 
     // ^^^ 
{ 
    va_list argptr; 
    va_start(argptr, numberOfArgs);   // initialize argument pointer 

    double minData = va_arg(argptr, double); // initialize the minimum with the first argument 
               // and increment argument pointer 
    for (int i = 1; i < numberOfArgs; i ++) // for all of the following arguments 
    { 
     double data = va_arg(argptr, double); // get argument and increment argument pointer 
     if (data < minData)     // test if argument is less than mnimum 
      minData = data; 
    } 
    va_end(argptr); 

    return minData; 
} 

確保所有的參數列表你的論點是浮點double

int main() 
{ 
    double a, b, c; 
    printf("Introduceti numerele: "); 
    scanf_s("%lf%lf%lf", &a, &b, &c); 

    double minVal = min(10, 1.34, 4.34, 7.0, 5.23, 6.23, 2.0, 8.232, a, b, c) 
             // ^^    ^^  
    printf("\nMinimul este %lf", minVal); 
    return 0; 
} 
+0

你可以通過堅持一個'雙參數:'雙分鐘(int numargs,double v1,...)'。這可以防止你用0個實際的浮點參數調用它(但並不妨礙你用參數數目0調用它,甚至是否定的 - 但C不是用於白癡的語言)。這意味着你只能在循環體中使用'va_arg()'。 –