2013-05-29 40 views
0

第一次在這裏發佈奇怪的浮動?指向結構中的浮點數

我目前正在爲嵌入式設備移植一些代碼。基本上所有的東西都使用一個來自過時的現有專有編譯器的新編譯器(AVR-GCC)

我在結構中遇到了這個奇怪的東西(對我來說!)。我無法弄清楚括號裏是什麼。這是其中用於原始值的結構:

float (*tc)(float value); 

我的IDE亮點「值」作爲一個編譯器關鍵字,就像「浮動」,所以我不知道這是AVR-GCC具體點嗎?

這然後在具有所謂的「閱讀」的浮子參數的函數使用,並且它試圖返回以下:

return (raw[rCN3].tc)(reading); 

上述實際的線導致程序嘗試訪問出界存儲器的。

我以前沒見過這樣的代碼,所以想知道是否有人可以幫我解密它?它與舊的編譯器一起工作,但造成AVR-GCC的問題

在此先感謝。 Alex

+2

這是一個函數指針。請參閱http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work –

+0

「我的IDE強調」值「作爲編譯器關鍵字」< - 它不是C中的一個。也許它使用多種語言的相同熒光筆。 –

+0

BTW:聲明中有多餘的括號,'return raw [rCN3] .tc(reading);'就足夠了。 – wildplasser

回答

0

這是一個函數指針變量。

tc是一個指向函數的指針,該函數只需要一個float作爲參數並返回一個「float」。

訪問超出界限內存的原因是可能是,因爲rCN3超出了數組raw的範圍。

+0

謝謝!我真的應該發現這一點....在很長一段時間內沒有使用函數指針。感謝您的及時回覆 –

0

這是一個函數指針。

這意味着tc保存接受單個參數的函數的地址,並返回值float

舉例來說,你可以將其設置爲標準庫的sinf功能,像這樣:

somestruct.tc = sinf; 

somestruct.tc(3.14159265f/2); /* This will return roughly 1.0f. */ 

此外,不斷有用cdecl說:

聲明TC的函數指針( float)返回浮點數

+0

偉大的鏈接。非常感謝您的幫助 我一定會在將來使用cdecl :) –

1

這是一個函數指針。它指向一個函數,該函數返回一個浮點值並且具有一個浮點參數。

1

兩件事情:

1)float (*tc)(float value)function pointer服用浮子作爲參數的函數,返回一個浮子

2)「值」是C#中的關鍵字,也可以是在其它語言;因此它的突出。檢查你的編輯語言設置。

+0

謝謝,是的,我使用基於Visual Studio的AVR Studio,因此可能會啓用C#突出顯示。 –