2014-03-24 72 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的最开始呼叫)。