1 | |||||||||||||||||||||||||||||||||||||||||
Templates (composition). exception handling run-time error04.08.2012, 14:46. Показов 1240. Ответов 18
Метки нет (Все метки)
Код компилируется.
Если делать циклы для push and pop размера такого чтоб не превышало размеры Стока то все работает нормально если циклы больше размера стока то выходит вот такая картинка в консоле (см. принт скрин ) Заранее спасибо. Array_hpp
ArrayException_hpp
Point_hpp
Stack_hpp
Array_CPP
Point_cpp
Stack_cpp
main_cpp
0
|
04.08.2012, 14:46 | |
Ответы с готовыми решениями:
18
Run-time error Затаившийся run-time error Ошибка Debug error! run-time check failure #3-T Ошибка Debug error. Run-time check failure #2. C++ |
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|||||||||||
04.08.2012, 15:07 | 2 | ||||||||||
Не по теме: Сразу насчёт ArrayException: есть же std::range_exception. Во-первых, я что-то не увидел автоматического изменения размеров Array а-ля std::vector. Ну да ладно, это исключениями должно было перехватиться. Я думаю, проблема вот в этом:
Перепишите функции вот так:
Это ещё раз подтверждает правило: явное лучше неявного. Не по теме: И это... где в Pop проверка на то, что стек не пуст? Это ведь проблема стека, а не нижележащего Array.
1
|
04.08.2012, 15:21 [ТС] | 3 | |||||
Та же самая ошибка на том же месте
Спасибо что напомнили кстати но это потом мне бы пока с этим разобраться
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
04.08.2012, 15:44 | 4 |
Ах да, ещё. Array.cpp, строка 110, ошибка на единицу: index >= m_size (а не просто больше, индекс m_size уже за пределами дозволенного).
Кроме этого что-то не вижу, чего оно там должно падать. Придётся компилировать у себя. Да и вам бы не помешало взять отладчик и искать.
1
|
04.08.2012, 15:57 [ТС] | 5 |
подскажите какой ниб видео с ютуба или статью как научиться дебагить за 10 минут я уже закалибался от отсутствие этого навыка
УРРРАРААРАРРАР все круто работает !!!! СПАСИБО ОГРОМНОЕ !!! Добавлено через 9 минут А как это по нормальному сделать ??? если в трех словах
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||||||
04.08.2012, 16:07 | 6 | |||||
В данном случае более полезной оказывается внимательность. От хромающей внимательности немного помогают юнит-тесты, но и там надо ж не забыть протестировать попытки обращения к элементам с индексами –1, <размер массива>, <размер массива + 1> и так далее.
Ну как, вот так:
1
|
04.08.2012, 16:51 [ТС] | 7 |
Еще такой момент поскажи пожалуйста я не уверен правильно ли у меня дистрактора работают... я пытался в них сообщения писать но что то в консоли я ничего не увидел или их как то специально вызывать надо если до то где... типа как в гет элемент ??? или в мейне ???
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||||||
04.08.2012, 18:04 | 8 | |||||
Правильный вопрос. В стеке — нет. Вот удаляется элемент из стека. Но ведь на самом деле он там остался же, это только указатель верхушки сдвинулся. Так что надо вызвать для него деструктор, как только он удаляется из стека:
1
|
04.08.2012, 19:48 [ТС] | 9 |
~Type(); вот это вообще что такое ???
вообще по моему m_array->GetElement(m_current - 1).~Type(); эта строчка не рабочая когда я пишу GetElement(m_current - 1) и ставлю точку вижуал студия не предлагает мне ни каких вариантов да и по смыслу не должно быть
0
|
04.08.2012, 19:56 [ТС] | 10 | ||||||||||
У меня на самом деле есть еще одна сложность по заданию надо проверять после push and pop валидность индекса а он у меня получается левый немного
при этом в push and pop надо имплементировать так чтоб с одной стороны эксепшен с Array class перехватывал если что, а с другой стороны чтобы после того как все эксепшены прошли индекс оставался нормальный в пределах массива короче проще на принт скрине показать вообщем в тех местах где написано " should be 4 " и " should be 0 " он действительно должен быть такой вот обновленный код с main.cpp and Stack.cpp больше ничего не менял main_cpp
Stack_cpp
При это const у Current() функции убирать нельзя полубас доебу...я почему аксессор не конст
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
04.08.2012, 20:16 | 11 |
Эксепшны от Array стек перехватывать не должен. Он должен их вообще не допускать. Если где-то вылетел эксепшн у Array, то это или не проблема стека (память закончилась или что там ещё), или стек где-то что-то не уследил и пишет не по валидному индексу. Да, с точки зрения Array это исключительная ситуация, но с точки зрения стека — нет: индексы генерирует сам стек, а не его пользователь, а значит стек может следить за их правильностью; если вылетело исключение от Array внутри, это значит стек не уследил и это баг, а не исключительная ситуация, его надо исправлять, а не обрабатывать. Ну или это действительно исключительная ситуация, но не для стека: он же не знает, что надо делать, если память кончилась.
У стека самого по себе может приключиться две беды: или мы делаем pop() пустого стека (в таком случае мы внутри ничего не трогаем и ругаемся исключением), или (в случае фиксированного массива, выделенного под стек) мы делаем push() в стек, который заполнен под завязку (тут мы тоже ничего не трогаем и сразу же выкидываем исключение; вот этого сейчас не делается, да, надо в push дописать соответствующую проверку). Это не проблема стека, почему его используют неправильно. Его задача в таком случае сообщить пользователю о его кривых руках и ничего при этом не поломать. А что не так с индексами? В первом случае мы засунули пять элементов, потом стек кончился. В стеке пять элементов, его Current имеет правильное значение 5: если бы там было больше свободного места, то следующий засунутый в стек элемент находился бы в array[5]. Во втором случае аналогично.
1
|
04.08.2012, 20:26 [ТС] | 12 |
Да это все понятно это просто учебный проект я знаю что вообще не кто так не делает все STL vector юзают или другие ассоциативный или не ассоциативный контейнеры
Добавлено через 38 секунд Так понятно что элементов 5 индек то от 0 до 4 поэтому 4 должно быть Добавлено через 3 минуты он подлец видишь как заканчивает Push() он currect в 5 ставить хотя макс индекс должен быть 4 поэтому и приходиться извращаться там GetElement(m_currect - 1) -> писать хотя по нормальному надо GetElement(m_currect ) так написать у меня по заданию короче написано что Make sure the current index is not changed when the Array class threw an exception. Типа Убедитесь что коррент индекс не меняется когда threw ловит эксепшен А он подлец меняет ! вот задание целиком если кому интересно
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
04.08.2012, 20:38 | 13 |
vector, кстати, эксепшнов вообще не выкидывает. Не туда полез — получай свой сегфолт.
Нет, именно 5. В данном смысле: current это указатель на верхушку стека. То есть на то место, куда будет помещён следующий элемент. Именно поэтому изначально он равен нулю, а не минус единице. Именно поэтому он фактически совпадает с количеством засунутых в стек элементов. Код
индекс 0 1 2 3 4 (5) стек - - - - - верхушка ^ индекс 0 1 2 3 4 (5) стек 4 - - - - верхушка ^ индекс 0 1 2 3 4 (5) стек 4 9 5 7 - верхушка ^ индекс 0 1 2 3 4 (5) стек 4 9 5 7 8 верхушка ^ А насчёт задания... Ну раз сказано не делать проверок, то не делайте.
1
|
04.08.2012, 20:46 [ТС] | 14 | |||||
Так нет мне надо проверки делать...
да я не сомневаюсь что там с индексами все нормально... я о другом я думаю о том что когда задача перекидывается на эксепшен в классе Аррей, то там типа прописать а ля m_current + 1 или -1 в зависимость поп это или пуш что то типа того
только он мне не дает так сделать я даже m_currect в public перекинул мол пишет >------ Build started: Project: L5_4_2_b_ex_4, Configuration: Release Win32 ------ 1> main.cpp Array.cpp(124): error C2951: template declarations are only permitted at global, namespace, or class scope Array.cpp(117) : while compiling class template member function 'void Array<Type>::SetElement(const Type &,const unsigned int)' 1> with 1> [ 1> Type=Point 1> ] 1> Stack.cpp(23) : see reference to class template instantiation 'Array<Type>' being compiled 1> with 1> [ 1> Type=Point 1> ] 1> Stack.cpp(23) : while compiling class template member function 'Stack<Type>::Stack(int)' 1> with 1> [ 1> Type=Point 1> ] 1> main.cpp(48) : see reference to class template instantiation 'Stack<Type>' being compiled 1> with 1> [ 1> Type=Point 1> ] Array.cpp(125): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int Array.cpp(125): error C2350: 'Stack<Type>::m_current' is not a static member ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== может быть в конструкторе ArrayException прописать что мол если m_currect больше 4 или меньше 0 то присвоить 0 или 4 Это компилятор съест или ругаться будет ??? или это вообще очень не устойчиво смотрится и мне за это отругают ???
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
04.08.2012, 21:06 | 15 |
А что вы намереваетесь сделать в строках 11–12? Array же понятия не имеет, где он: просто сам по себе или в стеке. Если ему передан кривой индекс, он выкидывает исключение и всё.
1
|
05.08.2012, 01:26 [ТС] | 16 | ||||||||||||||||||||||||||||||||||||||||
delete message
Добавлено через 3 часа 59 минут короче я вот так сделал вроде работает... конечно на грани читабильности... Если какие ниб предложения по поводу того как можно по красивше сделать Array_hpp
ArrayException_hpp
Point_hpp
Stack_hpp
Array_CPP
Point_cpp
Stack_cpp
main_cpp
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
05.08.2012, 02:02 | 17 |
Красивее...
Ну что ж. <IMHO> 0. Подкачайте английский всё же. <IMHO в квадрате> 1. Поменьше бессмысленных комментариев. 2. Одной пустой строки вполне достаточно. 3. Единообразие отступов, форматирования и пробелов важно. 4. Поменьше бессмысленных отступов. </IMHO в квадрате> 5. Откройте для себя Google Testing Framework или нечто подобное. 6. Не надо комментировать ненужный код для «авось пригодится». </IMHO> 7. Вводу-выводу не место в сеттерах-геттерах класса-контейнера. 8. Глобальные переменные, используемые объектами, это в общем случае плохо. 8.5. Глобальные переменные для индексов, используемые в сеттерах — это НЕПЕРЕДАВАЕМО плохо. 9. Возможно, они не глобальные и я запутался; тогда пункт 9 такой: называйте переменные так, чтобы по имени было однозначно понятно, что это и откуда. 10. И собирайте их в одном месте, чтобы не чертыхаться по хедеру в их поисках. 11. Ах да, public-поля у классов — это тоже попахивает.
1
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
05.08.2012, 19:06 | 19 |
Нет, с чего бы это он им управлял? Если не вызывать деструктор, то вы только скопировали себе в result элемент Array. Естественно, он там так и остался лежать, поэтому-то его и надо удалять, потому что для стека он там не должен оставаться. (Ну, или как вариант: удалять его непосредственно перед тем, как туда что-то записать поверх.)
Array удалит все элементы только при удалении самого себя.
1
|
05.08.2012, 19:06 | |
05.08.2012, 19:06 | |
Помогаю со студенческими работами здесь
19
Полином Лежандра первого рода. Run-Time error =( Создание, заполнение объектами и удаление динамического массива. Выдает run time error Exception Handling Classes Exception Handling. Собственный класс для перехвата исключений Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |