"Array subscript is not an integer" in C 程序



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的使用不是这里的问题,而是指针的使用。

整数类型包括类型intunsignedsize_tlong等。


我认为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
}

相关内容

最新更新