43 / 43 / 13
Регистрация: 17.05.2011
Сообщений: 162
|
|
1 | |
Обработка out_of_range25.09.2013, 18:34. Показов 8406. Ответов 26
Метки нет (Все метки)
Всем привет.
Имеетмся матрица, реализованная как std::vector <std::vector <int>>. Мне нужно найти сумму всех соседних элементов для каждого элемента матрицы. В общем случае это сумма 8 элементов, но для граничных элементов это количество меньше. Как мне написав алгоритм для общего случая обрабатывать выход за границу, так чтобы при выходе за границу просто сситались след элементы. Знаю есть vector <T>::at () , но как им пользоваться не понимаю.
0
|
25.09.2013, 18:34 | |
Ответы с готовыми решениями:
26
Std::out_of_range Выскакивает out_of_range Исключение Microsoft C++: std::out_of_range Runtime ошибка - terminate called after throwing an instance of 'std::out_of_range' |
43 / 43 / 13
Регистрация: 17.05.2011
Сообщений: 162
|
|
25.09.2013, 18:42 [ТС] | 3 |
Этот способ очевиден, но порождает кучу условий и кода, я же хочу чтобы просто игонорировалось исключение out of range и дальше шло сложение.
0
|
43 / 43 / 13
Регистрация: 17.05.2011
Сообщений: 162
|
|
25.09.2013, 18:53 [ТС] | 5 |
ну при заходе в catch я же уже не смогу вернуться, чтобы продолжить. Придется писать 8 условий проверять нахождение у границ и в углах матрицы. код не написал, так как с телефона сижу. а вообще это мне нужно для задачи Игра Жизнь.
0
|
Неэпический
|
|||||||||||
25.09.2013, 19:22 | 6 | ||||||||||
Как вариант:
Например:
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
25.09.2013, 20:15 | 7 | |||||
Чо вы ему тут насоветовали? Я прочитал фиг что понял.
Просто в цикле проверяй условие что бы элемент был не граничный допустим матрица 10 на 10 от простой кодец:
1
|
Неэпический
|
|
25.09.2013, 20:31 | 8 |
ну это сугубо Ваши проблемы то Добавлено через 13 минут И, кстати, кто сказал что не нужно считать? Просто у них меньше соседей.
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
25.09.2013, 20:43 | 9 |
Я так понял пассажиру только нужно сумму посчитать только тех элементов у которых 8 соседей, а те у которых меньше не нужно считать.
Добавлено через 5 минут Croessmah, Не ну у тебя вариант тоже понятный, от щас разобрал, прикольный вариант. Мой уступает потому что нужно все условия вручную проверять. Его даже можно переделать легко для подсчета элементов у которых 8 соседей.
0
|
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
|
|
25.09.2013, 20:47 | 10 |
Можно просто исключить из расчётов крайние клетки поля. Таки да, они всегда пустые + дополнительная памят на неиспользуемые в игре клетки, но не надо делать проверок на границы и обрабатывать исключения.
Заодно можно и простым массивом обойтись.
0
|
43 / 43 / 13
Регистрация: 17.05.2011
Сообщений: 162
|
|||||||||||
26.09.2013, 10:23 [ТС] | 11 | ||||||||||
Спасибо Croessmah, Вы правильно поняли, что мне нужно.
Добавлено через 7 минут Только ругается при компиляции field_life.h
0
|
CheshireCat
|
26.09.2013, 12:21
#14
|
Не по теме: Мне представляется, что использование в этой задаче исключений (и в частности out_of_range) - неверный подход. Он может быть оправдан, если в чисто учебных целях в условии задачи прямо требуется использовать исключения. Но на ровном месте без всяких к тому оснований - нет.
1
|
43 / 43 / 13
Регистрация: 17.05.2011
Сообщений: 162
|
|
26.09.2013, 12:33 [ТС] | 15 |
Перегрузка оператора [] для std::vector? Для него же есть своя реализация перегрузки []. Какая из них будет вызываться?
CheshireCat полностью согласен с Вашим постом. Просто хотелось попробовать через исключение.
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
26.09.2013, 12:46 | 16 | |||||
Ну знаешь можно использовать исключения так как удобно, тут они используются как управляющие конструкции что ли. В книгах не написано что так делать нельзя, а как раз наоборот, если это позволяет упростить код сделать его более понятным и легче в поддержке, то нужно именно так делать как будет более просто.
Да конечно исключения для обработки ошибок кажется логично, но и для управления программ тоже используются, например можно делать выход из взоженного цикла из там допустим:
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
26.09.2013, 12:48 | 18 |
По другому что бы выйти нам нужно использовать какой нить флаг, либо goto, но мне это не нравиться проще сгенерировать исключение и спокойно выйти туда куда нужно.
0
|
43 / 43 / 13
Регистрация: 17.05.2011
Сообщений: 162
|
|
26.09.2013, 12:50 [ТС] | 19 |
Вообще break тоже подходит для выхода из цикла.
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
26.09.2013, 12:53 | 20 |
Если мне память не подводят в книгах говориться что исключения можно использовать для управления программ, это не запрещено, помоему даже есть целая глава.
Вообще таваришь ТС не смотри ты на эти все стерертипы, а делай всегда так как тебе удобно потому что нету правил которые говорят что этот оператор именно так нужно использовать, да как хочешь так и используй. Да есть правила хорошего тона или как их там называют, но их не сложно соблюдать если в команде пишешь, если твой код никто читать не будет, ты сам себе хозяин, ты не для когото пишешь, а для себя, пиши так как тебе лучше и ни кого не слушай, без запретов нивчом себя не ограничивай. Это просто мой тебе совет, я сам ему стараюсь следовать.
0
|
26.09.2013, 12:53 | |
26.09.2013, 12:53 | |
Помогаю со студенческими работами здесь
20
Unhandled exception at at 0x75E717D2 in ConsoleApplication24.exe: Microsoft C++ exception: std::out_of_range at memory l Как в MS Visual Studio отключить сообщение "std::out_of_range at memory location"? out_of_range exaptions и условные операторы Std::out_of_range Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |