2011-02-02 15 views
2

作爲標題暗示......我需要使用浮點作爲數組索引,但GCC編譯器吐出一個錯誤抱怨。C中的數組索引,是否必須是整數?它可以是一個浮點嗎?

基本上我有一個數學函數,說F(x,t)函數有變量x和t。我遇到的問題是我試圖在float類型中增加x和t,以便我可以爲不同的x和t函數計算不同的值。所以,我自然會有兩個for循環:

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); 

所以是的,這就是爲什麼我想知道是否有可能得到浮點作爲數組索引。用C

+3

你能給出更多關於你想要做什麼的細節嗎? – 2011-02-02 00:48:48

回答

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

數組下標必須是整體

5

如果您只是將整數存儲在浮點變量中,則將值轉換或以其他方式轉換爲整數類型應該可以正常工作。例如:

array[(int)x] = y; 

如果你真的想用指數非整數索引的數組,你將不得不自己設計更高級別的數據結構,它可能不會是一個「陣列」就其時間效率特性而言。

4

是的。從C99標準§6.5.2.1(數組下標):

其中一個詞語具有類型的「」指針到對象類型「」,另一表達應具有整數類型,並且將結果的類型是''類型''。

如果要將浮點數用作數組索引,則需要將其轉換爲整數。這通常是一個壞主意,因爲在計算過程中發生輕微舍入錯誤很容易導致數組索引在截斷後被關閉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

正如你已經發現,在數組索引必須是整型。爲了達到你想要的效果,你可以通過浮點數delta來縮放和補償整數索引:

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; 
    } 
} 
相關問題