2011-12-15 24 views
2

我试图实现定义为in this answer的随机数生成器。至少从我的知识来看,至少应该如何实现第一行static unsigned long x=123456789, y=362436069, z=521288629;,因为它在功能之外被显示出来有一些含糊不清的地方。我以为这是打算作为一个类的成员,从而实现了它:在类成员上使用`^ =`和`<<`时出现C++总线错误`unsigned long`

class rng2{ 

public:  

    unsigned long x, y, z; 
    rng2() : x(123456789), y(362436069), z(521288629) {} 

    unsigned long xorshf96(void) {   //period 2^96-1 

     //static unsigned long x=123456789, y=362436069, z=521288629; 

     unsigned long t; 
     x ^= x << 16;   //BUS ERROR, debug mode 
     x ^= x >> 5; 
     x ^= x << 1; 

     t = x; 
     x = y;     //SEG FAULT, release mode 
     y = z; 
     z = t^x^y; 

     return z; 
    } 

}; 

int main() 
{ 
    rng2 rand2; 
    rng2 * prand; 

    for(long d =0; d < 10000; d++) 
     cout << "\n" << (*prand).xorshf96(); 
} 

出于某种原因,这给了我错误的注意位置,这取决于我和编译的模式。但是,如果我注释掉成员变量和构造函数并使用静态变量,则一切正常。如果这是正确的代码,我不明白为什么它在链接上显示的不同,并且无论哪种方式,我不知道错误发生的原因。

回答

4

您正在使用* prand,但未初始化prand。

2

这是因为prand指针从不分配,但仅用于使用。当使用static时,变量no datamember被访问,这就是为什么你没有得到总线错误。你应该明确地指定你的指针在你的主函数中有效的值。像这样

rng2 * prand = new rng2(); 
+0

这声明了一个指向rng2的指针,叫做prand并将它指定给一个指向rng2对象的新实例的指针。应该工作吧?我不明白你的评论。 – vidstige 2011-12-15 08:55:13

+0

哦,对,thansk! – vidstige 2011-12-15 09:08:32

2

prandwild pointer

变化:

int main() 
{ 
    rng2 rand2; 
    rng2 * prand; 

    for(long d =0; d < 10000; d++) 
     cout << "\n" << (*prand).xorshf96(); 
} 

到:

int main() 
{ 
    rng2 rand2; 
    rng2 * prand = &rand2; 

    for(long d =0; d < 10000; d++) 
     cout << "\n" << (*prand).xorshf96(); 
} 

或更好的只是:

int main() 
{ 
    rng2 rand2; 

    for(long d =0; d < 10000; d++) 
     cout << "\n" << rand2.xorshf96(); 
} 
2
rng2 * prand; 

你完全肯定这是真正的代码?考虑到你没有初始化这个指针并在以后解除引用,这个错误非常明显。

相关问题