C程序中的“数组下标不是整数”

时间:2013-11-27 18:48:29

标签: 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;
}

4 个答案:

答案 0 :(得分:3)

p是指向浮点数的指针。这就是你收到错误的原因。

float *p, total;

...

total += (datos[p]-prom)*(datos[p+1]-prom);

您只能在C中使用ints作为数组索引。

答案 1 :(得分:1)

数组下标必须是整数,int类型。您不能将任何其他类型用作数组下标。 p被声明为float *p,即指向float的指针。您不能将指针用作数组索引。

答案 2 :(得分:0)

您可以使用int:

int p = 0;
...
while (p<n) {
    // rest is the same

或者,您可以直接使用p作为指针,我想这就是您想要的。

while(p<datos+n) {
    total += (*p-prom)*(*(p+1)-prom);

但请注意,您永远不会增加p,因此循环永远不会结束。此外,您永远不会初始化total,因此结果将是随机垃圾值。

答案 3 :(得分:0)

C11dr 6.5.2.1 数组下标 ...“其中一个表达式应具有指向完整对象类型'的类型'',另一个表达式应具有整数类型,结果类型为'' 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
}