Not sure if i should invoke a cast or do somethiing to the parameters

时间:2018-02-01 18:03:51

标签: c pointers parameters void

#include <stdio.h>
int main()
{ 
    double dMinimum;
    double dMaximum;
    char szName[] = "Armvad Ezikon";
    double dScoreM[] =  { 40, 0, 30, 55, 0, 25 };
    int iScoreCount = 6; 
    determineMinMax(dScoreM, iScoreCount , &dMinimum, &dMaximum);
    printf("For %s, minimum = %lf and maximum = %lf ", szName, dMinimum, dMaximum);
    return 0;
}
void determineMinMax( double  dScoreM[] ,  int  iScoreCount ,  double *pdMin, double *pdMax) 
{
    int i;
    *pdMin = 200.0;  // arbitrary high value
    *pdMax = 0.0;
    for(i = 0; i < iScoreCount; i++)
    {
        if(dScoreM[i] < *pdMin)
            *pdMin = dScoreM[i];
        if(dScoreM[i] > *pdMax)
            *pdMax = dScoreM[i];
    }
}

When I try to compile I get this error is it because I am not casting correctly?

exampleone.c:13:6: warning: conflicting types for ‘determineMinMax’ [enabled by default]

void determineMinMax( double dScoreM[] , int iScoreCount , double *pdMin, ^ exampleone.c:9:1: note: previous implicit declaration of ‘determineMinMax’ was here determineMinMax(dScoreM, iScoreCount , &dMinimum, &dMaximum);

3 个答案:

答案 0 :(得分:3)

You have to put the declaration before using it :

void determineMinMax( double  dScoreM[] ,  int  iScoreCount ,  double *pdMin, double *pdMax);
int main(void){
  ..
}

Or simply,

void determineMinMax( double  dScoreM[] ,  int  iScoreCount ,  double *pdMin, double *pdMax){

 ...

}

int main(void){
  ...
}

Otherwise it is conflicting with the implicit declaration assumed by the compiler which is int determineMinMax(). But in C99,C11 this is an error.

答案 1 :(得分:0)

#include <stdio.h>
#include <limits.h>

void determineMinMax (double dScoreM[], int, double*, double*);

int main(int argc, const char*argv[])
{ 
    double dMinimum,dMaximum;
    char szName[] = "Armvad Ezikon";
    double dScoreM[] =  { 40, 0, 30, 55, 0, 25 };
    int iScoreCount = 6; 
    determineMinMax(dScoreM, iScoreCount , &dMinimum, &dMaximum);
    printf("For %s, minimum = %lf and maximum = %lf ", szName, dMinimum, dMaximum);
    return 0;
}

void determineMinMax ( double  dScoreM[] ,  int  iScoreCount ,  double *pdMin, double *pdMax) 
{
    int i;
    //initialize *pdMin and *pdMax with the first element of the array, just an assumption.
    *pdMin = 40; 
    *pdMax = 40;
    //You can use the following way also for initialization.
    //*pdMin = (INT_MAX); 
    //*pdMax = -(INT_MAX);
    for(i = 0; i < iScoreCount; i++)
    {
        if(dScoreM[i] < *pdMin)
            *pdMin = dScoreM[i];
        if(dScoreM[i] > *pdMax)
            *pdMax = dScoreM[i];
    }
}

上面的代码将解决您的问题,根据C99和C11,您需要首先声明函数的签名/原型然后定义该函数,或者您需要在从{{{ 1}}功能。

在这种情况下,签名告诉编译器,我已经声明了函数名main(),它将四个参数作为输入,并且返回determineMinMax对于调用它的函数没有任何意义,在你的情况下是void

答案 2 :(得分:0)

您收到警告是因为您没有向前声明函数determineMinMax,而是在main中调用了它。编译器假定它的返回类型为int,并且它接受任意数量的参数,这使得它的原型看起来像:int determineMinMax();

这就是为什么编译器会警告你有关冲突类型的原因,因为编译器假定的函数的签名与函数的签名不同。

要解决此问题,只需在main之前添加该函数的原型:

void determineMinMax(double  dScoreM[], int  iScoreCount, double *pdMin, double *pdMax);

int main(void) {
...
}

void determineMinMax(double  dScoreM[], int  iScoreCount, double *pdMin, double *pdMax)
{
 ....
}