2013-10-02 107 views
-2

我一直賽格斷層。我不知道爲什麼。試圖打印出一個「OK」的聲明每隔幾行給我看的錯誤鋪設,但它打印出來,甚至在第一行前賽格故障。我認爲這是越來越在操作符重載可能卡住,或者是一些函數調用之間,但這無法解釋爲什麼它甚至不打印出一個「OK」的聲明賽格故障:原因不明

#include <iostream> 
#include <cstdlib> 
#include <vector> 
using namespace std; 

class isprime{ 
    public: 
     isprime(); 
     void start(int thing); 
     bool test(int target); 
     void check(int x); 
     void checktwo(int xtwo); 

     int operator()(int p); 

    private: 
     void path(int targ); 
     vector<int> testing; 
     int b; 
}; 

int main() 
{ 
    int given; 

    while(cin>>given) 
    { 
     isprime Begin; 
     Begin.start(given);//check input as long as there is input 
    } 
    return 0; 
} 

void isprime::start(int thing) 
{ 
    if(test(thing) == 1) 
    { 
     cout<<thing<<" is a prime number."; 
    } 
    else 
    { 
     check(thing); 
    } 
} 

isprime::isprime() 
{ 
    testing[0] = {2}; 
    b = 0; 
} 

void isprime::check(int x)//checks if input is prime, and sets up next step if so 
{ 
    int s; 
    if(x == 0 || x == 1 || x == -1 || x == 2 || x == -2) 
    { 
     cout<<x<<" is a prime number."; 
    } 
    else 
    { 
     for(int i = 2; i < x; i++) 
     { 
      s = x % i; 
      if(s == 0) 
      { 
       b = 1; 
       break; 
      } 
     } 
     if(s != 0) 
     { 
      cout<<x<<" is a prime number."; 
     } 
     path(x); 
    } 
} 

bool isprime::test (int target)//see if input is already in list 
{ 
    for(int i = 0; i < testing.size(); i++) 
    { 
     if(target == testing[i]) 
     { 
      return 1; 
     } 
    } 
    if(int i = testing.size() && target != testing[i]) 
    { 
     return 0;//if not in list, must test whether it is prime 
    } 
} 

void isprime::path(int targ) 
{ 
    int y = testing.back() + 1; 
    while(y != targ)//find all primes between list end and input 
    { 
     checktwo(y); 
     y++; 
    } 

    testing.push_back(targ);//add prime input to vector 

    int storage = testing.size();//remember size 
    int z = targ + 1; 

    while(b = 1)//find the next prime while the target isn't prime 
    { 
     checktwo(z); 
     if(testing.size() != storage)//if the size changed, the next prime has been found 
     { 
      break; 
     } 
     z++; 
    } 
} 
void isprime::checktwo(int xtwo)//modified check function to add prime numbers between the vector end and the input to the vector 
{ 
    int s; 
    if(xtwo == -2 || xtwo == -1 || xtwo == 0 || xtwo == 1 || xtwo == 2) 
    { 
     testing.push_back(xtwo); 
    } 
    else 
    { 
     for(int i = 2; i < xtwo; i++) 
     { 
      s = xtwo % i; 
      if(s == 0) 
      { 
       break; 
      } 
     } 
     if(s != 0) 
     { 
      testing.push_back(xtwo); 
     } 
    } 
} 

int operator()(int p) 
{ 
    test(p);//calls a private member function to expand list of prime numbers (test) 
} 
+1

您是否嘗試過在調試器中運行呢? –

+1

這甚至不爲我編譯。調試器是你的朋友。 –

+0

1是**不是**素數,雖然它不是你的問題的答案。 – taskinoor

回答

5

這裏的問題:

isprime::isprime() 
{ 
    testing[0] = {2}; //<<---------- here 
    b = 0; 
} 

此時「測試」的大小爲零。測試是std::vector,你還沒有初始化它的構造尺寸,所以任何試圖訪問的testing任何索引會使程序崩潰。 (好吧,這是「未定義的行爲」,但它會在你的情況下崩潰)。因爲這發生在構造函數中,程序在進入「main()」時會崩潰。