deviation
函数会抛出以下错误:"Array subscript is not an integer"
。如果你能帮我找出错误的原因,我将不胜感激
float average(float data[], int n) {
float total = 0;
float *p = data;
while (p < (data + n)) {
total = total + *p;
p++;
}
return total / n;
}
float deviation(float data[], int n) {
float data_average = average(data, n);
float total;
float *p = data;
while (p < (data + n)) {
total += (data[p] - data_average) * (data[p + 1] - data_average);
}
return total / 2;
}
p
是一个指向浮点值的指针。这就是你出错的原因。
float *p, total;
...
total += (datos[p]-prom)*(datos[p+1]-prom);
在C.中只能使用ints
作为数组索引
数组下标必须是整数、int
类型。不能使用任何其他类型作为数组下标。p
被声明为float *p
,即指向float
的指针。不能将指针用作数组索引。
您可以使用int:
int p = 0;
...
while (p<n) {
// rest is the same
或者,您可以直接使用p
作为指针,我想这就是您想要的。
while(p<datos+n) {
total += (*p-prom)*(*(p+1)-prom);
但是,请注意,您永远不会递增p
,因此循环永远不会结束。此外,您从未初始化total
,因此结果将是一个随机垃圾值。
C11dr 6.5.2.1数组下标。。。"其中一个表达式的类型应为"pointer to complete objecttype",另一个表达式应为integer类型,结果的类型为"type'"。"…
使用[]
,您可以执行以下操作:
// pointer_type[integer_type]
float data[];
int n;
float total;
total = data[n];
// or the unconventional equivalent
// integer_type[pointer_type]
total = n[data]; // But let's leave that for another post
// Instead the OP did
// pointer_type[pointer_type]
// and received error: "Array subscript is not an integer"
float *p;
total = data[p];
float
的使用不是这里的问题,而是指针的使用。
整数类型包括类型int
、unsigned
、size_t
、long
等。
我认为OP想要以下(或类似的)
float deviation(float data[], int n) {
if (i <= 0) return 0;
float data_average = average(data, n);
float total = 0.0; // don't forget to set to 0.0
float *p = data;
while (p < (data + n)) {
total += (*p - data_average) * (*p - data_average);
p++;
}
return sqrt(total / n); // div by 0 averted
}