预期的'float *'但是参数是'float'类型,而'find_m'的参数2是不兼容的类型

时间:2015-07-19 07:10:56

标签: c

我试图在C中编写最小二乘法。

cc least_square.c -lm -o least_square

使用gcc编译后出现此错误。

least_square.c: In function ‘main’:
least_square.c:37:32: error: incompatible type for argument 1 of ‘find_m’
           printf("m = %.3f\n", find_m(x[i], x[i], k)) ; 
                                ^
least_square.c:8:11: note: expected ‘float *’ but argument is of type ‘float’
     float find_m(float [], float [], int data_number) ;
           ^
least_square.c:37:32: error: incompatible type for argument 2 of ‘find_m’
           printf("m = %.3f\n", find_m(x[i], x[i], k)) ; 
                                ^
least_square.c:8:11: note: expected ‘float *’ but argument is of type ‘float’
     float find_m(float [], float [], int data_number) ;
           ^
least_square.c:38:32: error: incompatible type for argument 1 of ‘find_n’
           printf("n = %.3f\n", find_n(x[i], y[i], k)) ; 
                                ^
least_square.c:10:11: note: expected ‘float *’ but argument is of type ‘float’
     float find_n(float [], float [], int data_number) ;
           ^
least_square.c:38:32: error: incompatible type for argument 2 of ‘find_n’
           printf("n = %.3f\n", find_n(x[i], y[i], k)) ; 
                                ^
least_square.c:10:11: note: expected ‘float *’ but argument is of type ‘float’
     float find_n(float [], float [], int data_number) ;

我的代码:     / * y = mx + n ---使用最小二乘法* /

#include<stdio.h>
#include<math.h>


    float find_m(float [], float [], int data_number) ;

    float find_n(float [], float [], int data_number) ;


    int main(){


       int k, i ;    

       printf("Number of data(k)\n? ") ;
       scanf("%d", &k) ;

       float x[k] ;    
       float y[k] ;

       for (i = 0 ; i <= (k - 1) ; i++){    
          x[i] = 0 ;
          y[i] = 0 ; 
       } 

       for (i = 0 ; i <= (k - 1) ; i++){

          printf("%d. point x coordinate(xi)\n? ", i+1) ;  /* get data */
          scanf("%f", &x[i]) ;

          printf("%d. point y coordinate(yi)\n? ", i+1) ;
          scanf("%f", &y[i]) ;

          printf("m = %.3f\n", find_m(x[i], x[i], k)) ; 
          printf("n = %.3f\n", find_n(x[i], y[i], k)) ; 
       }


       return 0 ;       


    }


    float find_m(float x[], float y[], int data_number){   /* Find constant m */


       int i,
           a = 0, 
           b = 0, 
           c = 0,
           d = 0,
           e = 0 ; 

       for (i = 0 ; i <= (data_number - 1) ; i++){

          a += x[i] * y[i] ;

          b += x[i] ;

          c += y[i] ;

          d += pow(x[i], 2) ;

          e += x[i] ; 
       }   


       return ((data_number * a) - (b * c)) / ((data_number * d) - pow(e, 2)) ;


    }


    float find_n(float x[], float y[], int data_number){        /*Find constant n*/


       int i,
           a = 0, 
           b = 0, 
           c = 0,
           d = 0,
           e = 0,
           f = 0;
       float n ; 

       for (i = 0 ; i <= (data_number - 1) ; i++){

          a += pow(x[i], 2) ;

          b += y[i] ;

          c += x[i] * y[i] ;

          d += x[i] ;

          e += pow(x[i], 2) ;

          f += x[i] ; 
       }   


       return (((a * b) - (c * d)) / ((data_number * e) - pow(f, 2))) ;


    }

我无法弄清楚我的错误是什么。我认为一切都是对的。

错误说&#34;预期浮动*&#34;但我已经将参数类型设为float。

3 个答案:

答案 0 :(得分:2)

find_mfind_n都指向float作为前两个参数。他们的签名等同于:

float find_m(float*, float*, int data_number) ;

float find_n(float*, float*, int data_number) ;

您正在传递float作为参数。你需要传递指针。如果不完全理解代码的目的,就很难提供真正有效的解决方案。可能是您希望在每次迭代中扫描部分数组,在这种情况下,您可以使用数组名称作为参数。这些将衰减到指向数组的第一个元素的指针。

printf("m = %.3f\n", find_m(x, x, k)) ; 
printf("n = %.3f\n", find_n(x, y, k)) ; 

答案 1 :(得分:1)

find_m(x[i], x[i], k)

这是错误的,因为x[i]floatfind_mfloat *作为第一和第二参数。试试这个:

find_m(x, x, k)

find_m(x, y, k)

printf

printf("m = %.3f\n", find_m(x, x, k)) ; 
printf("n = %.3f\n", find_n(x, y, k)) ; 

看一下,在函数调用find_m中,数组的名称xy作为参数,是一个表达式,用于计算指向数组的指针。换句话说,表达式xy是指向数组{(1}}和x[](的第一个元素)的指针。因此,它的类型是float *,而被调用的函数使用这个指针(作为参数传递)来间接访问数组的元素。

答案 2 :(得分:-2)

除此之外,乍看之下代码存在一些问题:

int k, i;

printf("Number of data(k)\n? ");
scanf("%d", &k);

float x[k];
float y[k];

您无法以这种方式创建数组,也不会在用户给出的可变大小上创建数组。如果您想要用户输入的变量大小,则需要使用动态分配 - 有关详细信息,请查看此处:http://www.programiz.com/c-programming/c-dynamic-memory-allocation

接下来 - 由于传入了两个假设保存数据值x和y的数组,因此find_m(x[i], x[i], k)收到错误。但是,您正在向数组传递两个float *指针,如果您需要有关此信息的更多材料,请查看此处:http://www.tutorialspoint.com/cprogramming/c_passing_pointers_to_functions.htm

函数应声明为float find_m(float*, float*, int data_number);而不是后者。请调试您的程序并逐步执行每个函数以查看数据的传递方式,最终会有所帮助。