Acces Violation 0xCCCCCCCC
Can anyone help, as I just can't figure out where I'm making a mistake. The problem occurs whenever I start debugging and program can't start. This is what the debugger sends me as an answer:
Unhandled exception at 0x010667DC in PR2 Testiranje-Pokusaj2.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.
The problem seems to be the "Unos" member function as VS points at line num 15 as the next one to be executed.
Thank you all in advance.
#include<iostream>
#include<cstring>
using namespace std;
char* crt = "\n--------------------------------------\n";
enum VrstaObaveze{ Seminarski, Parcijalni1, Parcijalni2, Integralni };
char* ImenaObaveza[] = { "Seminarski", "Parcijalni1", "Parcijalni2", "Integralni" };
struct Datum{
int * _dan, *_mjesec, *_godina;
void Unos(int d, int m, int g){
_dan = new int;
*_dan = d;
_mjesec = new int;
*_mjesec = m;
_godina = new int;
*_godina = g;
}
void Ispis(){
cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl;
}
void Dealociraj(){
delete _dan;
delete _mjesec;
delete _godina;
_dan = NULL;
_mjesec = nullptr;
_godina = NULL;
}
bool DaLiJeIsti(Datum d){//Implementirano kako bi funkcija DodajKOmentarIzvrsenojObavezi bila implementirana u potpunosi (provjera obaveze, datuma i da li je predmet polozen)
if (*_godina == *d._godina)
if (*_mjesec == *d._mjesec)
if (*_dan == *d._dan)
return true;
return false;
}//Ova provjera nije nuzna, ali pomocu nje smo sigurni da se radi o trazenoj obavezi, jer moguce je imati dvije razlicite obaveze istog imena
};
struct ObavezeNaPredmetu{
VrstaObaveze _vrstaObaveze;
Datum * _datumIzvrsenja;
int _ocjena; // 5 - 10
char * _komentar;
void Unos(VrstaObaveze vrsta, Datum * datum, int ocjena){
_vrstaObaveze = vrsta;
_datumIzvrsenja = new Datum;
_datumIzvrsenja->Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
_ocjena = ocjena;
_komentar = NULL;
}
void Ispis(){
cout << ImenaObaveza[_vrstaObaveze] << " " << _ocjena;
_datumIzvrsenja->Ispis();
cout << endl;
}
void Dealociraj(){
_datumIzvrsenja->Dealociraj();
delete _datumIzvrsenja;
_datumIzvrsenja = nullptr;
delete[] _komentar;
_komentar = nullptr;
}
bool DaLiJeObavezaIsta(VrstaObaveze o){
if (_vrstaObaveze = o)
return true;
return false;
}
bool DaLiJeVarao_La(char* kom){
if (_komentar = NULL)
return false;
char* pok = strstr(_komentar, kom);
int size = strlen(pok);
for (int i = 0; i < size; i++)
if (_komentar[i] != kom[i])
return false;
return true;
}
};
struct PolozeniPredmet{
Datum * _datumPolaganja;
//u okviru jednog predmeta studenti mogu imati najviše 10 obaveza
ObavezeNaPredmetu _listaIzvrsenihObaveza[10];
int _trenutnoIzvrsenihObaveza;
int * _konacnaOcjena;
void Unos(Datum * d){
_datumPolaganja->Unos(*d->_dan, *d->_mjesec, *d->_godina);
_trenutnoIzvrsenihObaveza = 0;
*_konacnaOcjena = 5;
}
void DodajIzvrsenuObavezu(ObavezeNaPredmetu o){
_listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza].Unos(o._vrstaObaveze, o._datumIzvrsenja, o._ocjena);
_trenutnoIzvrsenihObaveza++;
}//Nisu se vodile posebne provjere jer zadatak to nije trazio. Ako bi simulirali stvarnu akademsku godinu, morali bi paziti na datumo ovisno o rokovima i vrsti obaveze te
//na ocjenu, tj. da ona ne bude manja od 6 ili veca od 10
bool DodajKomentarIzvrsenojObavezi(ObavezeNaPredmetu * obaveza, char * komentar){
for (int i = 0; i < _trenutnoIzvrsenihObaveza;i++)
if (_listaIzvrsenihObaveza[i]._datumIzvrsenja->DaLiJeIsti(*obaveza->_datumIzvrsenja) && _listaIzvrsenihObaveza[i].DaLiJeObavezaIsta(obaveza->_vrstaObaveze)){
if (_listaIzvrsenihObaveza[i]._komentar == NULL)
strcpy_s(_listaIzvrsenihObaveza[i]._komentar, strlen(komentar) + 1, komentar);
else{
strcat_s(_listaIzvrsenihObaveza[i]._komentar, 1, " ");
strcat_s(_listaIzvrsenihObaveza[i]._komentar, strlen(komentar) + 1, komentar);
}
return true;
}//Ostaje nejasno da li student mora imati polozen predmet za unos komentara, pretpostavljam da to nije uslov
return false;
/*Funkcija ima zadatak da na osnovu primljenog parametra obaveza pronađe izvršenu obavezu,
te joj doda komentar koji je također proslijeđen kao parametar.
Voditi računa o tome da jedna obaveza može imati veći broj komentara.
U slučaju da tražena obaveza ne postoji, funkcija vraća false. */
}
int FormirajKonacnuOcjenu(){
if (_trenutnoIzvrsenihObaveza < 3 || _trenutnoIzvrsenihObaveza>10)
*_konacnaOcjena = 5;
return *_konacnaOcjena;
for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
if (_listaIzvrsenihObaveza[i].DaLiJeObavezaIsta(Integralni))
{
for (int j = 0; j < _trenutnoIzvrsenihObaveza; j++)
if (_listaIzvrsenihObaveza[j].DaLiJeObavezaIsta(Seminarski)){
*_konacnaOcjena = _listaIzvrsenihObaveza[i]._ocjena;
if (_listaIzvrsenihObaveza[i].DaLiJeVarao_La("varao"))//Pretpostavka je da se ne moze varati na seminarskom, tj. da se takvo varanje ne moze uzeti u obzir
*_konacnaOcjena--;
return *_konacnaOcjena;
}
}//Pri prvoj provjeri smo se rijesili dileme koliko je obaveza izvrseno no, pri integralnom polaganju jedini faktor kod formiranja konacne ocjena je ona koju je student dobio na integralnom
float suma = 0;
int brojacParcijalnih = 0;
int brojacObaveza = 0;
for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
if (_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni1 || _listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni2){
brojacParcijalnih++;
suma += _listaIzvrsenihObaveza[i]._ocjena;
if (_listaIzvrsenihObaveza[i].DaLiJeVarao_La("varao"))
suma--;
brojacObaveza++;
}
if (brojacParcijalnih == 2){
*_konacnaOcjena = suma / brojacObaveza;
return *_konacnaOcjena;
}
else
{
*_konacnaOcjena = 5;
return *_konacnaOcjena;
}
/*Funkcija je zadužena za formiranje konačne ocjene na položenom predmetu.
Za formiranje konačne ocjene predmet treba imati najmanje tri izvršene obaveze od kojih jedna mora biti
seminarski rad ukoliko je student integralno položio ispit. U slučaju da komentar na obavezi sadrži riječ varanje,
ocjena na toj obavezi se umanjuje za 1.
Ukoliko svi pomenuti uslovi nisu izvršeni, konačna ocjena treba biti postavljena na vrijednost 5. Funkcija vraća vrijednost atributa _konacnaOcjena*/
}
};
//int Pretraga(PolozeniPredmet * p, int max){
/*Funkcija ima zadatak da ispiše informacije o svim položenim predmetima kod kojih je student ispit položio putem parcijalnih ispita,
te tom prilikom ostvario prosječnu ocjenu veću od 8,5. Da bi informacije o položenom predmetu bile ispisane moraju biti ispunjeni svi uslovi neophodni za formiranje konačne ocjene.
Nakon ispisa, funkcija vraća broj položenih predmeta koji su zadovoljili navedene kriterije.*/
//}
void main(){
PolozeniPredmet PR2;
Datum datumPolaganja;
datumPolaganja.Unos(22, 01, 2015);
Datum datum1;
datum1.Unos(22, 10, 2014);
Datum datum2;
datum2.Unos(07, 01, 2015);
Datum datum3;
datum3.Unos(10, 01, 2015);
PR2.Unos(&datumPolaganja);
ObavezeNaPredmetu obaveze[3];
obaveze[0].Unos(Parcijalni1, &datum1, 7);
obaveze[1].Unos(Parcijalni2, &datum2, 9);
obaveze[2].Unos(Seminarski, &datum3, 10);
for (int i = 0; i < 3; i++)
PR2.DodajIzvrsenuObavezu(obaveze[i]);
PR2.DodajKomentarIzvrsenojObavezi(&obaveze[0], "varao");
int ocjena = PR2.FormirajKonacnuOcjenu();
cout << crt;
cout << "Ocjena iz PR2: " << ocjena << crt;
system("pause>0");
}