我试图在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。
答案 0 :(得分:2)
find_m
和find_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]
是float
而find_m
将float *
作为第一和第二参数。试试这个:
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
中,数组的名称x
和y
作为参数,是一个表达式,用于计算指向数组的指针。换句话说,表达式x
和y
是指向数组{(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);
而不是后者。请调试您的程序并逐步执行每个函数以查看数据的传递方式,最终会有所帮助。