Pereiti prie turinio

Access violation reading location probelma C++


Rekomenduojami pranešimai

Sveiki, neusitvarkau su problema. Ivykdzius programa gaunu toki errora

Unhandled exception at 0x569521F8 (msvcp110d.dll) in ConsoleApplication1.exe: 0xC0000005: Access violation reading location 0x0000000D.
Nesuprantu kodel. Lyg masyvo dydi ir didinu, bet kazkokios nesamones su tuo fd >> Paz[kiek++]; vyksta

class Student{
public:
static const int M = 5;
private:
string school, name, group;
int *Marks; // dynamic array of student marks
int nmax; // max size of array
int n; // current size of array
void IncreaseCapasity(int kiek);
public:
Student(int nmax = 0);
~Student();

void SetMarks(int mark);
void SetSchool(string school);
void SetName(string name);
void SetGroup(string group);

int GetMark(int i){return Marks[i];}
string GetSchool(){return school;}
string GetName(){return name;}
string GetGroup(){return group;}
int GetN(){return n;}
};

Student::Student(int nmax):Marks(NULL), n(n), nmax(nmax){
if(nmax > 0){
	Marks = new int[nmax];
}
}

Student::~Student(){
if(Marks){
	delete [] Marks;
	Marks = NULL;
}
}

void Student::IncreaseCapasity(int kiek){
if(kiek > nmax){ // if array increasing
	int *SNew = new int [kiek];
	for(int i=0; i<n; i++)
		SNew[i] = Marks[i];
	delete [] Marks;
	Marks = SNew;
	nmax = kiek;
}if(kiek < nmax){ // if array decreasing
	int *SNew = new int [kiek];
	for(int i=0; i<kiek; i++)
		SNew[i] = Marks[i];
	delete [] Marks;
	Marks = SNew;
	n = nmax = kiek;
}
}

void Student::SetMarks(int mark){
if(n == nmax) IncreaseCapasity(n + M);
Marks[n] = mark;
n++;
}

void Student::SetSchool(string school){
this->school = school;
}

void Student::SetName(string name){
this->name = name;
}

void Student::SetGroup(string group){
this->group = group;
}

Nujauciu kad metodas IncreaseCapasity gali buti klaidingas, bet tiksliai nezinau

mano skaitymo funkcija

void Read(School & snew){
string school, name, group;
Student S;
ifstream fd(CD);
getline(fd, school, ';');
fd >> ws;
S.SetSchool(school);
cout << S.GetSchool() << endl;
while(!fd.eof()){
	getline(fd, name, ',');
	fd >> ws;
	getline(fd, group, ' ');
	int Paz[student::M];
	int kiek = 0;
	while(fd.peek() != '\n' && !fd.eof()){
		fd >> Paz[kiek++]; // sitoje vietoje uzkomentavus erroras nyksta
	}
	fd.ignore();
}
fd.close();
}

Greiciausiai cia nera dididinama masyvo dydis kiek suprantu, bet kodel?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tu skaitai į paprastą statinį masyvą kurio dydis yra 5 (Student::M = 5). Tau reikėtų skaityti ir reikšmes įrašinėti į savo konteinerinę klasę Student.

 

void Read(School & snew){
string school, name, group;
Student S;
[...]
while(!fd.eof()){
	[...]
	while(fd.peek() != '\n' && !fd.eof()){
                       int d;
		fd >> d; 
                       S.SetMarks(d);
	}
	fd.ignore();
}
fd.close();
}

 

Ir dar vienas patarimas: kintamųjų vardus pradėk iš mažosios raidės, nes pasvyzdžiui Student S atrodo kaip kažkokia konstanta, o int *Marks atrodo kad Marks būtų klasės pavadinimas.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tu skaitai į paprastą statinį masyvą kurio dydis yra 5 (Student::M = 5). Tau reikėtų skaityti ir reikšmes įrašinėti į savo konteinerinę klasę Student.

 

void Read(School & snew){
string school, name, group;
Student S;
[...]
while(!fd.eof()){
	[...]
	while(fd.peek() != '\n' && !fd.eof()){
                       int d;
		fd >> d; 
                       S.SetMarks(d);
	}
	fd.ignore();
}
fd.close();
}

 

Ir dar vienas patarimas: kintamųjų vardus pradėk iš mažosios raidės, nes pasvyzdžiui Student S atrodo kaip kažkokia konstanta, o int *Marks atrodo kad Marks būtų klasės pavadinimas.

Viliau, eilini karta dekoju. Padariau kaip liepiai gaunu kita errora ir debuginus issiaiskinau kas ne taip. Susitvarkiau berods. Buvau nepriskyres n(0) konstruktoriuje.

post-90967-0-47990000-1393685003_thumb.jpg

Redagavo saltis77
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ar yra kam nors buves toks erroras? Del kokiu priezasciu tai vyskat ir kodel? Kai bandau nuskaitytus pazymius deti i kita knteinerine klase sitas eroras pasirode.

               while(fd.peek() != '\n' && !fd.eof()){
		int d;
		fd >> d;
		S.SetMarks(d);
		cout << S.GetMark(i) << endl;
		i++;
		snew.SetStud(d); // klaida kai dedu cia

	}

visos klases koda deti nezinau ar yra prasme nes tenai praktiskai tas pats tik kad masyvas yra objekto ar kaip cia pasakyti (Student *Stu;)

post-90967-0-11806500-1393689501_thumb.jpg

Redagavo saltis77
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...