2013-11-27 2 views
0

Функция deviation вызывает у меня ошибку: "Array subscript is not an integer". Если вы поможете мне найти причину ошибки, я буду признателен.«Индекс массива не является целым числом» в программе C

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; 
} 
+2

Сообщение об ошибке представляется очевидным достаточно. Индекс массива должен быть целым числом. В 'datos [p]', 'p' есть указатель, а не целое число. Вы не можете этого сделать. (Ну, вы можете делать глупые вещи, такие как '5 [array]', но вы этого не делаете, 'datos' также является указателем.) –

+0

@KeithThompson, я никогда не видел синтаксис 5 [array]. Я попробовал это, и это похоже на массив [5], но где/зачем использовать что-то подобное? Благодарю. –

+0

@CharlieBurns; 'array [5]' эквивалентен '* (array + 5)' и тот же для '5 [array', который равен' * (5 + array) '. Вот почему 'array [5] = 5 [array]'. * где/зачем использовать что-то подобное? *: Я думаю, что он используется только для ** obfuscation ** :) – haccks

ответ

0

p - указатель на поплавок. Вот почему вы получаете ошибку.

float *p, total; 

... 

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

Вы можете использовать только ints в качестве индексов массивов в С.

+0

aded 'int * q = datos' и изменено' total + = (datos [p] -prom) * (datos [p + 1] -prom); 'for' total + = (datos [q] -prom) * (datos [q + 1] -prom); но ошибка все же появляется и, в частности, на строке «total + = (datos [q] -prom) * (datos [q + 1] -prom);' – user3042068

+0

'q 'не является' int' - это 'int *'. Еще раз, вы можете иметь значения 'int' как индексы массива. Если вы хотите использовать 'q' в качестве своего индекса, вам сначала нужно разыменовать его с помощью' * q'. – yamafontes

1

массива индексов должен быть целым числом, int типа. Вы не можете использовать какой-либо другой тип в качестве индекса массива. p объявлен как float *p, то есть указатель на float. Вы не можете использовать указатель как индексы массива.

+0

aded 'int * q = datos' и изменено' total + = (datos [p] -prom) * (datos [p + 1] -prom); 'for' total + = (datos [q] -prom) * (datos [q + 1] -prom); но ошибка все еще появляется и, в частности, на строке 'total + = (datos [q] -prom) * (datos [q + 1] -prom);' – user3042068

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, поэтому результат будет случайным значением мусора.

0

C11dr 6.5.2.1 индексация массивы ... «Одно из выражений должны иметь тип„“указатель для завершения объекта типа„“, другое выражение должно иметь целочисленный тип, и результат имеет типа„“ тип ''. " ...

С [], вы получите сделать:

// 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 и т.д.


Я думаю, что ОП хотел следующее (или что-то подобное)

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 
} 
Смежные вопросы