2013-03-24 126 views
-2

這裏我的代碼和我不知道這個錯誤是什麼原因。For循環中的堆棧溢出和分段錯誤

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
#include <vector> 

using namespace std; 

vector<vector<int>> readFile(char* fileName) 
{ 
    vector < vector <int> > info; 
    ifstream file(fileName); 
    string line; 
    while (getline(file, line)) 
    { 
     vector <int> data; 
     double value; 
     istringstream iss(line); 
     while (iss >> value) 
     { 
      data.push_back(value); 
     } 
     info.push_back(data); 
    } 
    return info; 
} 

void print2DVector(vector <vector <int> > input) 
{ 
    for (vector < vector <int> > :: size_type i = 0, size = input.size(); i < size; ++i) 
    { 
     for (vector <int> :: size_type j = 0, length = input[i].size(); j < length; ++j) 
     { 
      cout << input[i][j] << " "; 
     } 
     cout << endl; 
    } 
} 

vector <vector <int> > inverseVector(vector <vector <int> > input) 
{ 
    int* arr; 
    arr = new int[input[0].size()]; 
    vector <int> data; 
    vector <vector <int> > output; 
    for (vector < vector <int> > :: size_type i = 0, size = input.size(); i < size; ++i) 
    { 
     for (vector <int> :: size_type j = 0, length = input[i].size(); j < length; ++j) 
     { 
      arr[input[i][j]] = j; 
     } 
     for (vector <int> :: size_type j = 0, length = input[i].size(); j < length; ++j) 
     { 
      data.push_back(arr[j]); 
     } 

     output.push_back(data); 
     data.clear(); 
    } 

    return output; 
} 

vector<vector <int>> initializeEmptyHospitals(int quota, int count) 
{ 
    vector<vector <int>> output; 
    vector<int> data; 
    for(int j=0; j<quota;j++) 
     data.push_back(-1); 
    for(int i=0; i<count; i++) 
     output.push_back(data); 

    data.clear(); 
    return output; 
} 

bool isEmpty(vector <int> hospital) 
{ 
    for(int i=0;i<hospital.size();i++) 
     if(hospital[i]==-1) 
      return true; 

    return false; 
} 

void reArrangeVector(vector <int> &hospital) 
{ 
    int temp; 
    for (int i = 1; i < hospital.size(); i++) 
    { 
     for (int j = 0; j < hospital.size()- i; j++) 
     { 
      if(hospital[j]>=0 && hospital[j+1]>=0) 
      if(hospital[j] > hospital[j+1]) 
      { 
       temp = hospital[j+1]; 
       hospital[j+1] = hospital[j]; 
       hospital[j] = temp; 
      } 
     } 
    } 
} 

void assignResident(vector <int> residentChoices ,vector < vector <int> > &hospitalsWithQuotas, int residentNumber, vector < vector <int> > inverseHospitals) 
{ 
    for(int i=0;i<residentChoices.size();i++) 
    { 
     if(isEmpty(hospitalsWithQuotas[residentChoices[i]])) 
     { 
      for(int j=0; j<hospitalsWithQuotas[residentChoices[i]].size(); j++) 
       if(hospitalsWithQuotas[residentChoices[i]][j] == -1) 
       { 
        hospitalsWithQuotas[residentChoices[i]][j]=residentNumber; 
        reArrangeVector(hospitalsWithQuotas[residentChoices[i]]); 
        return; 
       } 
     } 
     else 
     { 
      for(int k=0; k<hospitalsWithQuotas[residentChoices[i]].size(); k++) 
      { 
       if(inverseHospitals[residentChoices[i]][residentNumber] < hospitalsWithQuotas[residentChoices[i]][0]) 
       { 
        int temp = hospitalsWithQuotas[residentChoices[i]][0]; 
        hospitalsWithQuotas[residentChoices[i]][0] = residentNumber; 
        assignResident(residentChoices, hospitalsWithQuotas, temp, inverseHospitals); 
        reArrangeVector(hospitalsWithQuotas[residentChoices[i]]); 
        return; 
       } 
       //if(k==hospitalsWithQuotas[residentChoices[i]].size()-1) 
      } 
     } 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    vector < vector <int> > hospitalChoices,residentChoices,inverseHospitals,hospitalsWithQuotas; 
    int quota = 3; 
    hospitalChoices = readFile("data1_h1.txt"); 
    residentChoices = readFile("data1_r1.txt"); 
    hospitalsWithQuotas = initializeEmptyHospitals(quota, hospitalChoices.size()); 
    inverseHospitals = inverseVector(hospitalChoices); 

    for(int i=0; i<15; i++) 
     assignResident(residentChoices[i],hospitalsWithQuotas,i,inverseHospitals); 

    print2DVector(hospitalsWithQuotas); 

    system("pause"); 
    return 0; 
} 

在以下for循環,當我寫我< 12它的工作原理但我< 15,它拋出一個堆棧溢出異常。

for(int i=0; i<15; i++) 
    assignResident(residentChoices[i],hospitalsWithQuotas,i,inverseHospitals); 

所有錯誤文本是在VS2012:

Unhandled exception at 0x00CB33D9 in BLG372E HW1.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x00E72F50). 
+0

我確實修復了它,tnx。 – 2013-03-24 11:43:47

+0

你能否只粘貼你的代碼的相關部分? – 2013-03-24 11:50:10

+0

@Hasan:不,你沒有。你知道縮進的含義嗎?另外,您應該學習如何在Stack Overflow上格式化代碼。我爲你修好了。下一次,自己動手。 – Synxis 2013-03-24 11:52:01

回答

2

在一些程序中的錯誤:

  1. 在READFILE功能,價值未初始化和你比較它。在比較之前初始化它。
  2. 在readFile函數中,您使用的是矢量,並且正在推送字符,這是錯誤的。

你越來越Stackoverflow的錯誤可能是因爲一些無盡的遞歸。

建議:請在將代碼發佈到任何論壇之前對其進行格式化,其他人可以輕鬆地進行調試。

+0

非常感謝,你是對的,它有一個無盡的遞歸,我正試圖修復它! – 2013-03-24 12:17:28