访问违规0xCCCCCCCC

时间:2016-09-06 13:28:41

标签: c++

访问违规0xCCCCCCCC

任何人都可以提供帮助,因为我无法弄清楚我在哪里弄错了。每当我开始调试并且程序无法启动时,就会出现问题。这是调试器发送给我的答案:

PR2中0x010667DC处的未处理异常Testiranje-Pokusaj2.exe:0xC0000005:访问冲突写入位置0xCCCCCCCC。

问题似乎是“Unos”成员函数,因为VS指向第num行,作为下一个要执行的行。

提前谢谢大家。

 #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");
}

0 个答案:

没有答案