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 373 Точки
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 641 Точки

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

C4172   returning address of local variable or temporary: num

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.