2013-03-24 75 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