2013-03-03 57 views
0

当我调试这个程序时,我看到max是一个垃圾数字,而不是我传给它的值。将该值传递给函数时值发生变化吗?

#include <iostream> 
#include <cmath> 

float findPrimes(int max) { 

    float* primes = new float[max]; 

    bool* boolarray = new bool[max]; 
    for(int i=0; i<=max; i++) { 
     boolarray[i] = true; 
    } 

    int x = 1; 

    for(int i=2; i<=sqrt(max); i++) { 
     if(boolarray[i]) { 
      for(int j=pow(i, 2)+x*i; j<=max; x++) 
      { 
       boolarray[j] = false; 
      } 
     } 
    } 

    int n = 0; 

    while(n<=max) { 
     if(boolarray[n]) 
      primes[n] = boolarray[n]; 
     n++; 
    } 

    return primes[max]; 

} 

int main() { 

    float answer = findPrimes(6); 

    printf("%f\n", answer); 

    _sleep(10000); 

    return 0; 
} 

这是告诉我,最多是一个垃圾号码,当我调试它,所以这就是为什么程序不执行(它运行,但没有任何反应)。我很确定我正在做所有的数学(使用Eratosthenes的筛子),所以给了什么?


编辑:

#include <iostream> 
#include <cmath> 

float findPrimes(int max) { 

    std::cout << max << "\n"; 

    float* primes = new float[max-1]; 

    bool* boolarray = new bool[max-1]; 
    for(int i=0; i<=max-1; i++) { 
     boolarray[i] = true; 
    } 

    int x = 1; 

    for(int i=2; i<=sqrt(max); i++) { 
     if(boolarray[i]) { 
      for(int j=pow(i, 2)+x*i; j<=max-1; x++) 
      { 
       boolarray[j] = false; 
      } 
     } 
    } 

    int n = 0; 

    while(n<=max-1) { 
     if(boolarray[n]) 
      primes[n] = boolarray[n]; 
     n++; 
    } 

    return primes[max-2]; 

} 

int main() { 

    printf("%f\n", findPrimes(6)); 

    _sleep(10000); 

    return 0; 
} 
+2

你确定吗?如果你把cout << max <<“\ n”'作为函数的第一行,那它是垃圾吗? – 2013-03-03 00:51:09

+2

'我<= max'意味着'booleanray [i]'在'i == max'超出界限且UB时运行。 'while(n <= max)'同样的东西' – 2013-03-03 00:51:08

+0

您是否在发布模式下编译? – 2013-03-03 00:52:04

回答

1

您访问超出范围。

bool* boolarray = new bool[max-1]; 
for(int i=0; i<=max-1; i++) { 
    boolarray[i] = true; 
} 

比方说,最大为5的第一行分配4级的bool,编号为0至3循环从0循环到4,但没有进入4.只有4项,0,1, 2,和3

你或许应该这样做:

bool* boolarray = new bool[max]; 
for(int i=0; i<max; i++) { 
    boolarray[i] = true; 
} 

现在,如果max是5,您分配5级的bool,编号为0至4.您现在循环从0到4,这是你想要什么。

+0

好吧,我修正了这个问题,现在它只是返回1 = \这太令人沮丧了!我不知道我做错了什么,这一切在我的脑海中都是有道理的。 – Tetramputechture 2013-03-03 01:19:54

+0

添加大量的日志记录,以便您可以看到它与预期的不同之处。你为什么使用'浮动'?你为什么使用'pow'?此外,for循环for(int j = pow(i,2)+ x * i; j <= max-1; x ++)'是没有意义的。循环变量是'j',但你不会改变循环中的'j'! – 2013-03-03 01:33:11

+0

@DavidScwartz我通过增加x来改变循环中的j。或者我需要把(j = pow(i,2)+(++ x * i)而不是x ++吗? 这是Eratosthenes的筛子,顺便说一下,我忘记了,如果我已经提到过了 – Tetramputechture 2013-03-03 16:17:50