2012-12-11 53 views
-1

我對C++相當陌生,我不確定我是否正確地解釋它。C++ if語句不會結束

我有一段代碼(一個函數),在運行整個程序時不會結束。

該函數的用途是首先生成一個從0到1的隨機數。接下來,如果該隨機數大於0.6,它將進入另一個函數。該功能virus_death完美運行。如果隨機數小於0.6,那麼它將使病毒點推回到一個名爲達到的向量中。它還會將該點寫入文件。但是,這個說法永遠不會停止。

void replication(vector<Virus>& virus, int a, int b, double& times, int& iv, 
       ofstream& data_file, int p, vector<Direction>& direction_v, 
       vector<Virus>&replicate, int step) 
{ 
    point R,P; 

    double replicates = ((double) rand()/(RAND_MAX)); 
    //how long the virus takes to reach the necleus 

    if(replicates>0.6) 
    { 
     cout<<"No Replication "<<endl; 
     virus_death(times, iv, virus,a,b,data_file,p,direction_v, step); 
    } 
    else if(replicates<=0.6) 
    { 
     cout<<"Replication"<<endl; 

     ofstream tom; 
     tom.open("Timing_nuc.dat"); 

     cout<<"Points"<<endl; 
     R.x = virus[p].getx(); 
     R.y = virus[p].gety(); 
     R.t = virus[p].gett(); 

     cout<<"Write to File"<<endl; 
     tom<<p+1<<"\t"<<R.x<<"\t"<<R.y<<"\t"<<R.t<<"\n"; 

     cout<<"New Points"<<endl; 
     P.x = a; 
     P.y = b; 
     P.t = 0; 
     cout<<P.x<<"\t"<<P.y<<"\t"<<P.t<<"\n"; 


     replicate.push_back(P); 
     int aspa = replicate.size(); 
     cout<<"Replication Size:"<<aspa<<endl; 
    }   
} 

有人可以幫我確定爲什麼一旦點被推入矢量,它不會離開函數。

調用此函數的代碼是:

void location_of_virus(vector<Virus>&virus,double& times, int& iv, 
         ofstream& data_file, vector<Direction>& direction_v, 
         vector<Virus>&virus_engulf, circle&cell_c, 
         circle&nuclei_c, vector<Virus>&replicate, int step) 
{ 
    int a; 
    int b; 

    //int nc,cc,cmc,nci; 
    float dis_c, dis_n; 

    int virus_size= virus.size(); 
    //type = "virus"; 
    for(int i =0; i<virus_size; i++) 
    { 
     a = virus[i].getx(); 
     b = virus[i].gety(); 

     //to check where the virus is in location to the environment 
     dis_c = cell_c.distance(a,b); 
     dis_n = nuclei_c.distance(a,b); 

     if(dis_n < 5) 
     { 
      location =" Inside Nucleus"; 
      cout<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<endl; 
      data_file<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<"\n"; 
      replication(virus,a,b,times,iv,data_file,i,direction_v,replicate,step); 
     } 
     else if(dis_n ==5) 
     { 
      location = "Nucleus"; 
      cout<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<endl; 
      data_file<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<"\n"; 
      nucleus(virus,a,b,times,iv,data_file,i,direction_v,step); 

     } 
     else if(dis_c <25 && dis_n>5) 
     { 
      location = "Cytoplasm"; 
      cout<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<endl; 
      data_file<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<"\n"; 
      cytoplasm(virus,a,b,times,iv,data_file,p,direction_v,step); 
     } 
     else if(dis_c ==25) 
     { 
      location = "Cell Membrane"; 
      cout<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<endl; 
      data_file<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<"\n"; 
      endocytosis(virus,a,b,times,iv, data_file,i,direction_v,virus_engulf,cell_c,nuclei_c); 
     } 
     else if (((a ==0 || a == 50 || a>0 || a<50)&& (b ==0 || b == 50 || b>0 || b<50)) && dis_c>15) 
     { 
      location ="Extracellular Matrix"; 
      cout<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<endl; 
      data_file<<i+1<<"\t"<<virus[i]<<"\t"<<direction_v[i]<<"\t"<<location<<"\n"; 
     } 
     else 
     { 
      location ="Left the System"; 
      cout<<i+1<<"\t"<<virus[i]<<"\t"<<location<<endl; 
      data_file<<i+1<<"\t"<<virus[i]<<"\t"<<location<<"\n"; 

     } 
    } 
} 
+9

這裏沒有循環。 – chris

+5

循環?我沒有看到任何循環。 「 –

+2

」不要試圖彎曲循環 - 這是不可能的......「 – Boann

回答

1

你確定你沒有一個無限遞歸的地方?例如。也許virus_death再次調用location_of_virus

此外,您並不真正檢查virus[p]是否有效。如果p在其範圍內,可以添加一個小的安全檢查。

如果因某種原因某處出於某種原因搞亂了你的棧,各種奇怪的事情都會發生 - 也有一些無休止的循環。

+0

只是檢查有沒有無限遞歸和病毒[p]是有效的。 – user1572147

+0

你能否詳細說明你的意思是把我的堆棧搞亂了嗎? – user1572147

+0

你是如何檢查沒有無限遞歸的?順便說一句,當你在調試器中一步一步地去看什麼時,你會看到什麼?當你寫錯誤的存儲器地址時,會發生堆棧錯誤。像valgrind這樣的工具可能會檢測到這一點。 – Albert