views:

466

answers:

1

Hi, I've singled out a runtime error on this line of my code:

for (synsAuxCopyIndex=1; synsAuxCopyIndex<synsAux.size(); synsAuxCopyIndex++)

Which is runnhing inside the pushSynonyms(string synline, vector<WordInfo> &wordInfoVector) function. I don't get why is this particular line generating the error, as I don't think I'm indexing anything out of range.

The debugger is saying:

Uncontrolled Exception 0x00411cbf in program.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x00000000.

I guess "Infracción de acceso" will translate as Unauthorized access on an English debugger.

The input file is

dictionary.txt

1 cute
2 hello
3 ugly
4 easy
5 difficult
6 tired
7 beautiful
synonyms
1 7
7 1
antonyms
1 3
3 1 7
4 5
5 4
7 3


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

using namespace std;

class WordInfo{
 public:                
  WordInfo() {}

  ~WordInfo() {}

  int id() const { return myId; }

  void readWords(istream &in) {
    in >> myId >> word;     
  }

  vector<int>& getSynonyms () {
    return mySynonyms;
  }

  vector<int>& getAntonyms() {
     return myAntonyms;
  }

  string getWord() {
    return word;
  }

  void pushSynonyms (string synline, vector<WordInfo>& wordInfoVector) {
    stringstream synstream(synline);
    vector<int> synsAux;
    int num;
    while (synstream >> num)
      synsAux.push_back(num);
    int wordInfoVectorIndex;
    int synsAuxCopyIndex;
    for (wordInfoVectorIndex=0;
         wordInfoVectorIndex < wordInfoVector.size();
         wordInfoVectorIndex++) {
      if (synsAux[0] == wordInfoVector[wordInfoVectorIndex].id()) {
        // this is the line that's generating a Runtime Error, Why?                                                       
        for (synsAuxCopyIndex = 1;
             synsAuxCopyIndex < synsAux.size();
             synsAuxCopyIndex++) {
//        wordInfoVector[wordInfoVectorIndex].mySynonyms.push_back(
//            synsAux[synsAuxCopyIndex]);
        }                                                          
      }     
    }
  }

  void pushAntonyms (string antline, vector<WordInfo> wordInfoVector) {
    stringstream antstream(antline);
    vector<int> antsAux;
    int num;
    while (antstream >> num)
      antsAux.push_back(num);
//    for (int i=0; i<antsAux.size(); i++){
//      cout<<antsAux[i]<<endl;  
//    }
  }

  //--dictionary output function
  void printWords (ostream &out) {
    out<<myId<< " "<<word;     
  }

  //--equals operator for String
  bool operator == (const string &aString) const {
    return word ==aString; 
  }

  //--less than operator
  bool operator < (const WordInfo &otherWordInfo) const {
    return word<otherWordInfo.word;
  }

  //--more than operator
  bool operator > (const WordInfo &otherWordInfo) const {
    return word>otherWordInfo.word;
  }

 public: 
  vector<int> mySynonyms;
  vector <int> myAntonyms;

 private:
//vector <int> mySynonyms;
//vector <int> myAntonyms;
  string word;
  int myId;
};

//--Definition of input operator for WordInfo
istream & operator >> (istream &in, WordInfo &word) {
  word.readWords(in); 
}

//--Definition of output operator
ostream & operator << (ostream &out, WordInfo &word) {
  word.printWords(out);  
}

int main() {
  string wordFile;
  cout << "enter name of dictionary file: ";
  getline (cin, wordFile);
  ifstream inStream(wordFile.data());
  if (!inStream.is_open()) {
    cerr << "cannot open " << wordFile << endl; 
    exit(1);                      
  }

  vector <WordInfo> wordInfoVector; 
  WordInfo aword;

  while (inStream >> aword && (!(aword == "synonyms")))
    wordInfoVector.push_back(aword);

  inStream.clear();

  int i=0;          
  while (i < wordInfoVector.size()) {
    cout << wordInfoVector[i] << endl;
    i++;
  }

  vector <int> intVector;
  string synLine; 

  while (getline(inStream, synLine) && (synLine != ("antonyms")))
    aword.pushSynonyms(synLine, wordInfoVector);

  int theIndex;
  for (theIndex=0;
       theIndex < wordInfoVector[0].mySynonyms.size();
       theIndex++)
    cout << "the synonyms of 1 are " <<
        wordInfoVector[0].mySynonyms[theIndex] << endl;
  cout << "the size of mySynonyms of 1 is " <<
      wordInfoVector[0].mySynonyms.size() << endl;

  for (theIndex=0;
       theIndex < wordInfoVector[0].mySynonyms.size();
       theIndex++)  
    cout << "the synonyms of 7 are " <<
        wordInfoVector[6].mySynonyms[theIndex] << endl;
  cout << " the size of mySynonyms of 7 is " <<
      wordInfoVector[6].mySynonyms.size() << endl;

  string antLine;
  while (getline(inStream, antLine))
    aword.pushAntonyms(antLine, wordInfoVector);    

  wordInfoVector[0].mySynonyms.push_back(1);
  system("PAUSE");
  return 0;          
}
+5  A: 

If you add some debugging output to your program, you'd notice you never enter or even reach the "culprit" for-loop.

The problem is actually the test against "synsAux[0]" right above it - synxAux.size() is zero, so accessing the zeroth element is an index out-of-bounds error.

HUAGHAGUAH