2014-03-24 70 views
0

我有矩陣聲明實現如下:錯誤地址

int var_porcenComun; 
int var_porceninv; 

uint32_t pointers[] = { 
    (uint32_t)&var_porcenComun, 9999999, 
    (uint32_t)&var_porceninv, 999999 
}; 

這些都是全局變量。這段代碼編譯得很好。

基本上,「指針」保存一個變量的地址和它應該保持的最大值。

我的問題是,我必須添加到這個矩陣一個新的變量,定義爲uint64_t。雖然我的平臺中指針的大小是32位,但由於變量的大小,我必須將「指針」更改爲uint64_t。但是,當我做的:

uint64_t pointers[] = { 
    (uint64_t)&var_porcenComun, 9999999, 
    (uint64_t)&var_porceninv, 999999 
}; 

我得到以下錯誤:

: Error! E1054: Expression must be constant 

爲什麼這個錯誤發生時,我只需要改變「指針」型?

我使用watcom 1.3作爲編譯器。 海灣合作委員會Visual Studio已經編好了這段代碼。

+0

可能watcom希望這種轉換在運行時完成。這實際上不是可移植的,即使這個平臺碰巧有32位寬的指針,不同的編譯器以不同的方式處理這些代碼。我們可以嘗試找到解決這個問題的方法,但是另一個編譯器會遇到另一個問題,或者下一個版本的GCC或Visual Studio的下一個版本...... –

+0

它是全局的還是本地的(以及非靜態的)變量?你有沒有嘗試過兩次轉換值(到uint32_t,然後到uint64_t)? – keltar

+0

這些都是全局變量(我剛剛編輯了問題以添加此信息)。我曾嘗試轉換兩次,但我得到了同樣的錯誤。 –

回答

2

全局必須用常量值初始化。我想watcom不相信你的值實際上是常量(也許這是編譯時計算不好的)。你可以嘗試破解你的編譯器(比如將其轉換爲uint32_t,然後可能會發生自動轉換;或者有些技巧,其中沒有一個是保證的),或者將數組初始化向外移動(例如將它移動到init函數你在main的最開始呼叫)。