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.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

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