gtyoung2 Ответов: 1

Запись о нарушении доступа?


class Student {
public:
	//Accessor
	int fetchAge();
	int *fetchDaysInCourse();
	string fetchEmail();
	string fetchFirstName();
	string fetchLastName();
	string fetchStudentId();
	Degree fetchDegreeType();
	//Mutators
	void mutateAge(int);
	void mutateDaysInCourse(int[1]);
	void mutateEmail(string);
	void mutateFirstName(string);
	void mutateLastName(string);
	void mutateStudentId(string);
	void mutateDegreeType(Degree);
	
	//other handlers
	virtual void print();
	virtual Degree fetchDegreeProgram();
	//constructor
	Student(int age, int daysInCourse[3], string studentId, string email, string firstName, string lastName, Degree degreeType);
	~Student();

private:
	int Age, DaysInCourse[1];
	string Email, FirstName, LastName, StudentId;
	Degree DegreeType;

};

using namespace std;

int main() {

	//personal information for start screen
	cout << "Course Title: Scripting and Programming - Applications - C867 \n";
	cout << "Language used: C++ \n";
	cout << "Student ID: 467185 \n";
	cout << "Written by: Gregory Young \n\n";

	Roster classRoster;

	const string studentData[] =
	{
		"A1,John,Smith,John1989@gm ail.com,20,30,35,40,SECURITY",
 "A2,Suzan,Erickson,Erickson_1990@gmailcom,19,50,30,40,NETWORK",
 "A3,Jack,Napoli,The_lawyer99yahoo.com,19,20,40,33,SOFTWARE",
 "A4,Erin,Black,Erin.black@comcast.net,22,50,58,40,SECURITY",
 "A5,Gregory,young,gyoun15@wgu.edu,29,30,20,33,40,SOFTWARE"
	};

	//fill the class roster array
	for (int i = 0; i < sizeof(studentData) / sizeof(studentData[i]); i++) {
		cout << studentData[i] << endl;
		string input = studentData[i];
		istringstream ss(input);
		string token;
		string tempHolder[9];

		int x = 0;
		while (x < 9 && getline(ss, token, ',')) {
			tempHolder[x] = token;
			x += 1;
		}

		Degree studentDegree;
		if (tempHolder[8] == "NETWORK") {
			studentDegree = NETWORKING;
		}
		else if (tempHolder[8] == "SECURITY") {
			studentDegree = SECURITY;
		}
		else if (tempHolder[8] == "SOFTWARE") {
			studentDegree = SOFTWARE;
		}
		else {
			studentDegree = NODEGREE;
		}

		classRoster.add(tempHolder[0], tempHolder[1], tempHolder[2], tempHolder[3], std::stoi(tempHolder[4]), std::stoi(tempHolder[5]), std::stoi(tempHolder[6]), std::stoi(tempHolder[7]), studentDegree);
	}

	classRoster.printAll();
	cout << "\n";
	classRoster.printInvalidEmails();
	cout << "\n";
	for (int i = 0; i < sizeof(classRoster.classRosterArray) / sizeof(classRoster.classRosterArray[i]); i++) {
		classRoster.printDaysInCourse(classRoster.classRosterArray[i]->fetchStudentId());
	}
	cout << "\n";
	classRoster.printByDegreeProgram(SOFTWARE);
	cout << "\n";
	classRoster.remove("A3");
	classRoster.remove("A3");

	return 0;
}

void Roster::add(string studentID, string firstName, string lastName, string email, int age, int daysInCourse1, int daysInCourse2, int daysInCourse3, Degree degreeProgram)
{
	int courseDays[3] = { daysInCourse1, daysInCourse2, daysInCourse3 };

	for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
		if (classRosterArray[i] == nullptr) {
			if (degreeProgram == NETWORKING) {
				classRosterArray[i] = new NetworkStudent(age, courseDays, studentID, email, firstName, lastName, degreeProgram);
			}
			else if (degreeProgram == SECURITY) {
				classRosterArray[i] = new SecurityStudent(age, courseDays, studentID, email, firstName, lastName, degreeProgram);
			}
			else if (degreeProgram == SOFTWARE) {
				classRosterArray[i] = new SoftwareStudent(age, courseDays, studentID, email, firstName, lastName, degreeProgram);
			}
			else {
				classRosterArray[i] = new Student(age, courseDays, studentID, email, firstName, lastName, degreeProgram);
			}

			break;//stop 
		}
	}
}

void Roster::printAll()
{
	for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
		classRosterArray[i]->print();
	}
}

void Roster::printByDegreeProgram(int degreeProgram)
{
	for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
		if (classRosterArray[i]->fetchDegreeProgram() == degreeProgram) {
			classRosterArray[i]->print();
		}
	}
}

void Roster::printDaysInCourse(string studentID)
{
	float avg = 0;
	int max = 3;
	for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
		if (classRosterArray[i] != nullptr && classRosterArray[i]->fetchStudentId() == studentID) {
			int *daysInCourse = classRosterArray[i]->fetchDaysInCourse();
			for (int x = 0; x < max; x++) {
				avg += daysInCourse[x];
			}

			cout << "Student " << classRosterArray[i]->fetchStudentId() << "'s average number of days in each course is." << (avg / max) << "\n";
			break;
		}
	}
}

void Roster::printInvalidEmails()
{
	for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
		string email = classRosterArray[i]->fetchEmail();
		bool isValid = false;

		size_t found = email.find("@");
		if (found != string::npos) {
			found = email.find(".");
			if (found != string::npos) {
				found = email.find(" ");
				if (found == string::npos) {
					isValid = true;
				}
			}
		}

		if (!isValid) {
			cout << email << " is not a valid email address \n";
		}
	}
}

void Roster::remove(string studentID)
{
	bool studentRemoved = false;
	for (int i = 0; i < sizeof(classRosterArray) / sizeof(classRosterArray[i]); i++) {
		if (classRosterArray[i] != nullptr && classRosterArray[i]->fetchStudentId() == studentID) {
			classRosterArray[i] = nullptr;
			studentRemoved = true;
			break;
		}
	}

	if (studentRemoved == false) {
		cout << "ERROR: Student ID '" << studentID << "' was not found.";
	}
}

Roster::~Roster()
{
	delete * classRosterArray;
}
string Student::fetchEmail()
{
	return Email;
}


#include "Student.h"

//basic operation for return of requested information 

int Student::fetchAge()
{
	return Age;
}

int * Student::fetchDaysInCourse()
{
	return DaysInCourse;
}

void Student::mutateEmail(string email)
{
	Email = email;
}

string Student::fetchEmail()
{
	return Email;
}

string Student::fetchFirstName()
{
	return FirstName;
}

string Student::fetchLastName()
{
	return LastName;
}

string Student::fetchStudentId()
{
	return StudentId;
}

Degree Student::fetchDegreeType()
{
	return Degree();
}

void Student::mutateAge(int age)
{
	Age = age;
}


void Student::mutateDaysInCourse(int *daysInCourse)
{
	for (int i = 0; i < 3; i++) {
		DaysInCourse[i] = daysInCourse[i];
	}
}


void Student::mutateFirstName(string firstName)
{
	FirstName = firstName;
}

void Student::mutateLastName(string lastName)
{
	LastName = lastName;
}

void Student::mutateStudentId(string studentId)
{
	StudentId = studentId;
}

void Student::mutateDegreeType(Degree degreeType)
{
	DegreeType = degreeType;
}

Student::Student(int age, int daysInCourse[3], string studentId, string Email, string firstName, string lastName, Degree degreeType)
{
 mutateAge(age);
mutateStudentId(studentId);
mutateEmail(Email);
mutateFirstName(firstName);
mutateLastName(lastName);
mutateDegreeType(degreeType);
mutateDaysInCourse(daysInCourse);
mutateDegreeType(degreeType);
}

void Student::print()
{
	int *daysInCourse = fetchDaysInCourse();

	cout << fetchStudentId() << "\t";
	cout << "First Name: " << fetchFirstName() << "\t";
	cout << "Last Name: " << fetchLastName() << "\t";

	cout << "Age: " << fetchAge() << "\t";
	cout << "daysInCourse: " << daysInCourse[0] << "8" << daysInCourse[1] << "8" << daysInCourse[2] << "\t";

	cout << "Degree Program: ";
	switch (fetchDegreeProgram()) {
	case 0: cout << "Security";
		break;
	case 1: cout << "Networking";
		break;
	case 2: cout << "Software";
		break;
	case 4: cout << "Unknown or Unspecified";
		break;
	}
	
}

Degree Student::fetchDegreeProgram()
{
	return NODEGREE;
}

Student::~Student()
{
}


Что я уже пробовал:

Я получаю нарушение доступа на чтение в строке обратного письма; я также включил соответствующий код из класса студентов. Я действительно не уверен, почему он сталкивается с нарушением доступа к чтению, которое, по-видимому, не может прочитать символы из строки.

John R. Shaw

Попробовать "а (х &ЛТ; 9 и усилитель; & Гэтлину(СС, маркер, ','))" для начала.

gtyoung2

Это решило этот вопрос, спасибо! к сожалению, я столкнулся с другой ошибкой, которая теперь читается для моей функции fetch email. По-видимому, у него есть проблема с чтением строки, я добавил это к вопросу выше, если вы хотите взглянуть

Richard MacCutchan

Пожалуйста, отредактируйте свой вопрос с помощью обновленного кода и точно объясните, в чем заключается проблема и где она возникает.

gtyoung2

сделано.

Richard MacCutchan

Да, но вы ничего не объяснили. Мы не можем догадаться, что именно Email ссылаться.

gtyoung2

Электронная почта должна в конечном счете ссылаться на строку электронной почты, указанную в
//конструктор
Студент(инт возраста, daysInCourse инт[3], studentId строки, строки письма, строки "имя", строки "фамилия", степень degreeType);
который является адресом электронной почты, который присваивается массиву через
const string studentData[] =
{
"А1,Джон,Смит,John1989@ГМ ail.com,20,30,35,40,безопасности",
"А2,Сюзан,Эриксон,Erickson_1990@gmailcom,19,50,30,40,сеть",
"А3,Джек,Наполи,The_lawyer99yahoo.com,19,20,40,33,программное обеспечение",
-А4,Эрин,черный,Erin.black@comcast.net,22,50,58,40,безопасность",
"А5,Григорий,молодой,gyoun15@wgu.edu,29,30,20,33,40,программное обеспечение"
};
и массив списков классов

Richard MacCutchan

Но это не так. Если вы действительно проходите через приведенный выше код, вы ничего не назначаете электронной почте.

Richard MacCutchan

"Электронная почта должна в конечном счете ссылаться на"
Все это прекрасно, но к чему это на самом деле относится? Я не могу найти нигде в приведенном выше коде, где вы назначаете какое-либо значение этой переменной.

gtyoung2

Он должен быть назначен в void Student::mutateEmail(строка электронной почты). Извините, что я не включил этот раздел ранее. У меня это довольно плохо получается, спасибо, что уделили мне время.

Richard MacCutchan

Поговорка - так и должно быть ..." на самом деле это не помогает. Вам нужно использовать отладчик, чтобы точно отследить, что происходит, так как мы не можем запустить весь этот код или угадать, что происходит.

gtyoung2

Проблема в том, что отладка на самом деле не приводит меня туда, где происходит проблема.
'Project1.exe' (Win32): Загружено 'C:\Users\greg\source\repos\Project1\Debug\Project1.exe". Символы загружены.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\ntdll.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\kernel32.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\KernelBase.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): загружено 'C:\Program файлы\AVAST Software\Avast\aswhookx.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\msvcp140d.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\vcruntime140d.dll". Не удается найти или открыть файл PDB.
'Project1.exe' (Win32): Загружено 'C:\Windows\SysWOW64\ucrtbased.dll". Не удается найти или открыть файл PDB.
Исключение, вызванное в 0x56504BB7 (vcruntime140d.dll) в Project1.exe: 0xC0000005: нарушение доступа к местоположению чтения 0x00000028.

Затем выводит меня на строку string Student::fetchEmail()
{
возврат электронной почты; <-
}

Который говорит об ошибке чтения символов строки. Есть ли способ, которым я могу копнуть немного глубже в отладчик, чтобы проследить, что вам нужно?

Richard MacCutchan

Вам нужно посмотреть на трассировку стека, чтобы увидеть, как она достигла этой точки из вашей программы. Трассировка должна давать вам имена методов и/или номера исходных строк. Вы также можете добавить точки останова в тех местах, где осуществляется доступ к этой переменной. К сожалению, такого рода ошибки никогда не легко найти, вам просто нужно продолжать пробовать разные вещи.

1 Ответов

Рейтинг:
0

KarstenK

Для решения этой проблемы необходимо использовать отладчик. Типичным для вашей последней проблемы является то, что объект Student является недопустимым, как нулевой указатель или освобожденная память.

Установите точку останова за несколько звонков до этого сбоя.