2011-02-02 5 views
2

как название предлагает ... Мне нужно использовать плавающие точки в качестве индексов массива, но компилятор GCC выплеснул ошибку.Индекс массива в C, он должен быть целым числом? Может ли это быть плавающей точкой?

В принципе, у меня есть математическая функция F (x, t), где функция имеет переменные x и t. Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь прирастить x и t в типе float, чтобы я мог вычислять разные значения для функции в разных x и t. Поэтому, естественно, я бы два для петель:

for (x = x_min; x < x_max; x += dx) { 
    for (t = t_min; t < t_min; t += dt) { 
     f[x][t] = 10*x + 10*t; // Over simplified.. but you get the idea 
    } 
} 

// And then perform some fourier transform 
fft(f[x][t], 256, 1); 

Так да, именно поэтому мне было интересно, если это возможно, чтобы получить плавающей точки в качестве индекса массива.

+3

Можете ли вы дать более подробную информацию о том, что вы хотите сделать? –

+1

Может быть, вы ищете словарь вместо массива? Даже в этом случае число с плавающей запятой является плохой идеей для ключа. – 6502

ответ

4

Да, это должно быть целым числом, потому что, по существу, выполняет арифметические операции над указателями, где &array[0] является указателем на начало массива (ну, технически это должен быть целое число, потому что это то, о чем говорит спецификация, но вот почему).

В этом контексте нет смысла перемещаться от базового указателя до некоторой части размера объекта. Вы в значительной степени гарантируете, что не будете указывать на начало элемента.

Посмотрите на это следующим образом:

int array[10] = { 0 }; 

// analagous to *(array + 5), where '5' is 
// offsetting the pointer by sizeof(int) * 5 bytes 
// If you were able to add 5.5 to the base address 
// the value assigned to 'i' below would be interpreted as 
// the four bytes following *(array + 5.5), i.e., garbage data. 
int i = array[5]; 

Так как это кажется мне странным вопрос, чтобы начать с, возможно, вы могли бы дать нам больше информации относительно того, что вы на самом деле пытаетесь достичь, а не предложенным решением? Вероятно, мы можем дать вам более полезные ответы.

0

массив индексов в C должны быть неотъемлемой частью

5

Если вы просто храните целые числа в переменных с плавающей запятой, то отличное или отличное преобразование значений в целочисленный тип должно работать нормально. Например:

array[(int)x] = y; 

Если вы действительно хотите, чтобы индексировать массив с нецелых индексов, вы будете иметь, чтобы спроектировать себе структуру данных более высокого уровня, и это, вероятно, не быть «массив» в смысле его эффективности по времени.

4

Да. От стандарта C99 §6.5.2.1 (Array индексации):

Одно из выражений должны иметь тип «» указатель на объект типа «», другое выражение должно иметь целочисленный тип, и результат имеет типа '' тип ''.

Если вы хотите использовать число с плавающей запятой в качестве индекса массива, вам нужно отдать его целому числу. Это часто бывает плохой идеей, потому что любые небольшие ошибки округления во время ваших вычислений могут легко привести к тому, что индекс массива отключится на 1 после усечения.

0

В зависимости от того, что вы действительно хотите сделать, вы может быть в состоянии использовать уменьшенную версию смещения вашего поплавка как «индекс»:

#define arraySize 100 
Entry array[arraySize]; 
float scaleFactor = 10; 
float base = 0.1; 
float value = 0.3; 
// This truncation is where we have a many to one mapping. 
index = (int)((value - base) * scaleFactor); 
if (index >=0 && index < arraySize) 
    Entry* entry = array + index; 
2

Как вы обнаружили, то индексы массива должны быть целыми.Для достижения желаемого эффекта вы можете масштабировать и смещать целочисленный индекс по дельтам с плавающей запятой:

double x, t; 
int x_i, t_i; 

for (x_i = 0; x_i < NX; x_i ++) { 
    x = x_min + x_i * dx; 
    for (t_i = 0; t_i < NT, t_i++) { 
     t = t_min + t_i * dt; 
     f[x_i][t_i] = 10*x + 10*t; 
    } 
} 
Смежные вопросы