2013-10-11 25 views
0

我有一個分段錯誤,我一直試圖找到過去4個小時。這裏是代碼和valgrind可能使用的一些信息。類定義中的分段錯誤不能找出哪裏

Course::Course() 
{ 
    courseid = "None"; 
    courseName = "None"; 
    enrolled[2] = {0}; 

} 

Course::Course(string courseNum, string coursename, string filename) 
{ 
    courseid = courseNum; 
    courseName = coursename; 
    enrolled[2] = {0}; 
    readStudentData(filename); 
    sortRow(0); 
    sortRow(1); 
    sortRow(2); 

} 


void Course::readStudentData(string filename) 
{ 
    std::ifstream inFile; //declare file input stream object 
    string first, last, zid; 
    int section; 

    inFile.open(filename.c_str()); //open file 
    if (!inFile) 
    { 
     cout << "File did not open successfully!"; //error checking 
     exit(EXIT_FAILURE); 
    } 

    inFile >> first; //read first 
    while (inFile) 
    { 
     inFile >> last; 
     inFile >> zid; 
     inFile >> section; 
     section--; //match section with array subscript 

     Student newStudent(last, first, zid); //fill contents read to new student object 



     Students[section][enrolled[section]] = newStudent; //fill Students array with new student 

     enrolled[section]++; //add the student to the enrolled counter 

     inFile >> first; 
    } 

    inFile.close(); 
} 


void Course::sortRow(int RowtoSort) 
{ 
    int i, j; 
    Student bucket; 

    for(i = 1; i < enrolled[RowtoSort];i++) 
    { 
     bucket = Students[RowtoSort][i]; //assign bucket with temp value for swap 


      for(j = i; (j > 0) && (Students[RowtoSort][j-1].getLastName().compare(bucket.getLastName())) < 0; j--) 
     { 
      Students[RowtoSort][j] = Students[RowtoSort][j-1]; //assign j to element j-1 so now both j and j-1 are the same in the array 
     } 
     Students[RowtoSort][j] = bucket; //now j-1 value is at j and since j-- assign it to bucket to place the proper value at j-1 

    } // end outer loop 

} 


void Course::print() 
{ 
    cout << courseid << " " << courseName << endl; //header 

    cout << "Section 1" << endl; //print section 1 
    cout << left << "Name" << setw(40) << "Z-id" << endl; 

    for(int i=0;i<enrolled[0];i++) 
    { 
     Students[0][i].print();   
    } 

    cout << "Section 2" << endl; //print section 2 
    cout << left << "Name" << setw(40) << "Z-id" << endl; 
    for(int i=0;i<enrolled[0];i++) 
    { 
     Students[1][i].print(); 
    } 

    cout << "Section 3" << endl; //print section 3 
    cout << left << "Name" << setw(40) << "Z-id" << endl; 
    for(int i=0;i<enrolled[0];i++) 
    { 
     Students[2][i].print(); 
    } 


} 

這裏是信息的valgrind了當

==4223== Use of uninitialised value of size 8 
==4223== at 0x4EF15F1: std::string::assign(std::string const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17) 
==4223== by 0x4023E6: Student::operator=(Student const&) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401B9F: Course::readStudentData(std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401836: Course::Course(std::string, std::string, std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x4012F9: main (assign3.cpp:27) 
==4223== 
==4223== Use of uninitialised value of size 8 
==4223== at 0x4EF15F1: std::string::assign(std::string const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17) 
==4223== by 0x402401: Student::operator=(Student const&) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401B9F: Course::readStudentData(std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401836: Course::Course(std::string, std::string, std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x4012F9: main (assign3.cpp:27) 
==4223== 
==4223== Use of uninitialised value of size 8 
==4223== at 0x4EF15F1: std::string::assign(std::string const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17) 
==4223== by 0x40241C: Student::operator=(Student const&) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401B9F: Course::readStudentData(std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401836: Course::Course(std::string, std::string, std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x4012F9: main (assign3.cpp:27) 
==4223== 
==4223== Invalid read of size 8 
==4223== at 0x4EF15F1: std::string::assign(std::string const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17) 
==4223== by 0x4023E6: Student::operator=(Student const&) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401B9F: Course::readStudentData(std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401836: Course::Course(std::string, std::string, std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x4012F9: main (assign3.cpp:27) 
==4223== Address 0x8050190f0 is not stack'd, malloc'd or (recently) free'd 
==4223== 
==4223== 
==4223== Process terminating with default action of signal 11 (SIGSEGV) 
==4223== Access not within mapped region at address 0x8050190F0 
==4223== at 0x4EF15F1: std::string::assign(std::string const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17) 
==4223== by 0x4023E6: Student::operator=(Student const&) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401B9F: Course::readStudentData(std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x401836: Course::Course(std::string, std::string, std::string) (in /home/ruslan/241Assign3/assign3) 
==4223== by 0x4012F9: main (assign3.cpp:27) 

我已遵守並經過測試才能正常工作,因此誤差必須在使用過程中另一名學生類。

場頭文件

#ifndef COURSE_H 
#define COURSE_H 

#include "student.h" 

using std::string; 

    class Course 
    { 
     private: 
     string courseid; 
     string courseName; 
     Student Students[3][45]; 
     int enrolled[2]; 

     public: 
     Course(); //default constructor 
     Course(string, string, string); //alternate constructor 
     void readStudentData(string); 
     void sortRow(int); 
     void print();   

    }; 

#endif //COURSE.H 

學生類定義:

Student::Student() 
{ 
    firstName = "None"; 
    lastName = "None"; 
    zid = "None"; 
} 


Student::Student(string assignFirst, string assignLast, string assignZID) 
{ 
    firstName = assignFirst; 
    lastName = assignLast; 
    zid = assignZID; 
} 



string Student::getLastName() 
{ 
    return lastName; 
} 


void Student::print() 
{ 
    cout << lastName << ", " << firstName << std::setw(15) << zid << endl; 
} 
+0

學生是如何定義的? –

+0

在調試器中運行您的程序。它會在發生崩潰時停止,並允許您看到(並行走)調用堆棧。如果崩潰不在你的代碼中,那麼直接調用堆棧直到你的代碼,然後你可以檢查變量的值。或者看一下Valgrind給你的信息,它告訴你發生了崩潰,發生在'Student :: operator =(Student const&)',所以你可以先發布該函數。 –

+0

可能會向我們展示'Course'聲明類(頭文件) – lolando

回答

3

你有幾個地方未定義行爲。第一種是在Course構造函數中,在那裏你寫信給enrolled出界。第二種是使用未初始化的值作爲另一個數組的索引。

如果要在構造函數中初始化整個數組,可以逐個初始化每個索引,也可以使用初始化程序列表將整個數組初始化爲相同的值。