2

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");
}
S.Huskic
  • 21
  • 1
  • Probably an uninitialised pointer dereference. An sscce would be nice. – Bathsheba Sep 06 '16 at 13:30
  • `_mjesec = new int;` What's the reason for dynamically allocating a single `int`? Also, don't start your own identifiers with underscores. – PaulMcKenzie Sep 06 '16 at 13:30
  • Run a debug-build in the debugger, to catch the crash in action. Then you will know exactly where in the code the problem is. Then you can narrow down the code you show us to only the relevant parts, and hopefully explain a little more about what the code does, or even translate the variable names into English. – Some programmer dude Sep 06 '16 at 13:31
  • Do not (!) use pointers needlessly! (e.g.: members int * _dan, *_mjesec, *_godina; in struct Datum) –  Sep 06 '16 at 13:31
  • Coming up with code by basically guessing is not the way to learn C++. I am boldly saying "guessing", since I know of no tutorial, book, etc. that would show creating a `struct Datum` in the way you have, e.g. using pointers to int instead of just a plain `int`. – PaulMcKenzie Sep 06 '16 at 13:33
  • Too many pointers. Far too many pointers. And quite a few assignments that you think are equality comparisons. Increase the warning level of your compiler. – molbdnilo Sep 06 '16 at 13:33
  • @PaulMcKenzie: underscored identifiers are OK as long as they are not in the global namespace or don't follow with an upper-case letter. – Yakov Galka Sep 06 '16 at 13:37
  • Thank you all for your remarks and I apologise for not translating the variable names into english. The code simulates succes a student or students have achived on a certain subject. I haven't made myself quite clear as this an exam assignement presented by my faculty professor and I'm aware that some of the pointers are needless here, but I am forbidden (!) to change that. – S.Huskic Sep 07 '16 at 17:27

0 Answers0