C++ Advanced - 10_02.IndexedSet. Runtime error в Judge
Здравейте,
Имплементирах структурата от втора задача в един .cpp файл и когато тествам задачата локално, нулевите тестове минават, но като кача .cpp файла judge ми изкарва Runtime error и ми дава 0/100, нулевите тестове също гърмят, явно в Judge не може да се компилира.Въпроса ми е защо не се компилира кода ми в Judge, да не би нещо да не съм разбрал добре условието и да е грешно имплементирана структурата?
Здравей,
Прехвърлих кода на Code::Blocks, сложих и един nullptr в конструктура, компилирах го и си тръгна локално, но като го качих .cpp файла в Judge отново гръмна с Runtime Error.
Kакто и да е, тръгна и ми даде 100/100, просто явно не е добра опция да копирам съдържанието на файла от Visual Studio директно в Code::Blocks. Реших я наново този път директно в Code::Blocks и проработи.
Отговорът на Jovanna е правилен, проблемът ти е, че не инициализираш valuesArray, което означава, че то има някаква недефинирана (произволна) стойност, която ти се опитваш да достъпиш, без да е твоя. Ако в конструктора го инициализираш с nullptr, останалата ти логика ще засече, че трябва да му запълни стойностите (ще влезеш в if (valuesArray == nullptr) ... )
Ако си пробвал и не ти работи, провери дали не си объркал submit-а (да си предал стария файл, вместо този с корекциите) или нещо друго да си объркал. Аз пробвах точно това, без никакви други промени (тоест промених ти default constructor-ът да изглежда така IndexedSet::IndexedSet() : valuesArray(nullptr) {} ) и предадох и решението ти взе пълни точки.
Също, това което имаш като грешка не е компилационна грешка, както описваш първоначално във въпросът си. Ако беше компилационна, щеше да ти пише Compile time error. Сега си имаш изпълнение на тестове, просто всеки от тях е гръмнал с runtime error. Тоест няма смисъл да пробваш да компилираш под codeblocks - задачата ти се компилира, смяната на компилатора няма да промени много, проблемът е в изпълнението. Почти винаги когато имаш грешки в judge, а ти върви при теб, значи имаш или превишен лимит на памет, или достъпваш памет, която не е твоя (второто по-често). Напълно недостатъчно е в такива ситуации да пробваш само нулевите тестове - трябва да се хванеш и да пишеш примерни тестове, включително и големи такива. Дори е най-добре да си напишеш друга програма, която да ти генерира примерни входни и изходни данни - на изпита надали ще имаш за това време, но на домашните имаш, и е добра практика да свикнеш да тестваш детайлно. Така най-вероятно щеше да хванеш грешката и сам.
Не забравяй, че половината от програмирането (ако не и повече) е дебъгване, а такова нещо като трудна за дебъгване програма няма в момента, поне спрямо каквото сме срещали досега - имаш пълната информация, стига да проследиш всяка една стъпка на програмата си в някакъв пример, и да премислиш дали всяка една променлива е с "правилна" стойност в моментите, в които се ползва, винаги ще си намериш грешката, неизбежно е.
Поздрави,
Жоро