Софтуерно Инженерство
Loading...
+ Нов въпрос
peter.gaydeek avatar peter.gaydeek 2 Точки

5. Task - Lectures - ClassMembers (Advanced C++)

Здравейте. Незнам аз ли нещо не правя както трябва, но при мен кода се компилира и ми вади правилен резултат и всичко си работи. Обаче като го пусна в джъдж и ми дадва Compile time error... Нали трябва да изпратим под ZIP файл само Lecture.h файла ? Смисъл само единя хедър файл ? Защо при мен всичко работи а джъдж мрънка. Кода ми е на VS.  Ако трябва ще кача и кода си но нека не го гледа никой за да видя дали аз нещо не пропускам!




Поправка...получи се със 2-та хедър файла...уж пробвах но или джъдж е бил по това време забил или аз нещо съм направил, но сега пък ми дадва Runtime Error...Дори и на нулевите тестове, а при мен всичко е нормално....
Ето ми и решенията...не мога да си го обясня...
това е за: Resource.h https://pastebin.com/GV1Jt7f8
а това за: Lecture.h  https://pastebin.com/LaLvGvUW

 

 

Не са от най-подредените и надявам се се разбере нещо...просто така се случи че цяла седмица  бях зает и в последния момент се освободих и набързо трябваше да напиша кода...и утре пак съм зает....
 

0
C++ Advanced 18/02/2019 00:18:18
j.petrov_90 avatar j.petrov_90 104 Точки
Best Answer

Привет, колега,

Първо ще коментирам защо ти гърми програмата:
Във файла ти Lecture.h

int & operator[](const ResourceType & rt)
{
    std::map<ResourceType, int> numberOfResourcesByType;
    for (const Resource & r : _setRes)
    {
        numberOfResourcesByType[r.getType()]++;
    }
    int num = numberOfResourcesByType[rt];

    return num;
}

Трябва да връщат само int, а не int по референция.
Защо не по референция? 
Защото създаваш локален обект, връщаш му референцията, този обект умира като се затвори scope-а на функцията и твоята референция вече сочи към глупости.

Защо това върви при теб а не в Judge?
Защото си навлязъл в територията на "undefined behaviour" и както си личи от името - всичко може да се случи.
Затова и на различните компютри, ще получиш различен резултат (ако си късметлия ще ти крашне програмата и ще разбереш, че имаш бъг, а ако не ти крашне ... добре дошъл в света на C++ :D)

Добрата новина е, че има 2 тона warning-и и static cheker-и които следят за такива грешки. Щам работиш на VS прочети в нета как да си активираш високо ниво на warning-и за твоя компилатор.


Второто нещо, което бих искал да коментирам:
Дори и да не връщаше референция към int, а да връщаше само int пак имам притеснения, че задачата ти ще върви доста бавно.
За да я забързаш ти трябват някой оптимизации.
Погледни този същия operator[], който си предифинирал.
Ако го викна 120 пъти под ред - ще свърши 120 пъти една и съща работа.
Спести си тази работа.
Този локален std::map, който създаваш какво му пречи да бъде част от класа ти и всеки път като работиш с класа ти да го update-ваш? :)

Помисли малко и действай.
Ако пак имаш проблеми - пиши.

Поздрави

1
18/02/2019 11:08:56
peter.gaydeek avatar peter.gaydeek 2 Точки

Мерси колега златен си ! Нали знаеш понякога трябва да станеш от компютъра и да се разходиш, за да откриеш грешката си :D Продължавай с доброто преподаване!

0
kolioi avatar kolioi 535 Точки

При компилиране на Lecture.h VS генерира следния warning:

C4172   returning address of local variable or temporary: num

на ред 55 в Lecture.h Това е level 1 compiler warning (дефолтното ниво е Level3 (/W3)) и по описанието може да се досетиш какво не е наред :)

0