Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
#1

Обработка out_of_range - C++

25.09.2013, 18:34. Просмотров 1983. Ответов 26
Метки нет (Все метки)

Всем привет.
Имеетмся матрица, реализованная как std::vector <std::vector <int>>. Мне нужно найти сумму всех соседних элементов для каждого элемента матрицы. В общем случае это сумма 8 элементов, но для граничных элементов это количество меньше. Как мне написав алгоритм для общего случая обрабатывать выход за границу, так чтобы при выходе за границу просто сситались след элементы.
Знаю есть vector <T>::at () , но как им пользоваться не понимаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2013, 18:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка out_of_range (C++):

Выскакивает out_of_range - C++
Добрый День! Не пойму в чем проблема, дальше return false не уходит, вылетает окно &quot;Необработанное исключение в &quot;0x75a2d36f&quot; в &quot;bbb.exe&quot;:...

Std::out_of_range - C++
Доброго всем времени суток! Никак не пойму в чем проблема.. обрабатываю большой файл, примерно такой: ...

out_of_range exaptions и условные операторы - C++
Меня интересует следущее: почему этот код не выдает ошибок типа &quot;индекс вне границ массива&quot; if (a &gt; 0) something(); Работа этого кода...

Обработка события Click, вставка html после генерации и обработка этого кода - jQuery
Подскажите пожалуйста как заставить работать эту часть кода 18 строка $(&quot;.image&quot;).click(function() { alert (1); ...

Обработка одномерных массивов и Обработка двухмерных массивов. - Visual Basic
Всем привет, У меня большие проблемы... нужно сделать 2 лабораторные работы по информатике, но я ничегошеньки в VB не понимаю... ...

Обработка на 7 - 1С
Здравствуйте, написал простенькую обработочку для 8, теперь столкнулся что мне она понадобится и в 7ке. С семерошным языком не знаком т.к....

26
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 12:46 #16
Цитата Сообщение от CheshireCat Посмотреть сообщение
Наоборот, в описанной задаче - можно для каждого краевого элемента заранее описать и предусмотреть условия выхода за диапазон. Ну и зачем тут исключения? Достаточно обычных проверок типа if(...).
Ну знаешь можно использовать исключения так как удобно, тут они используются как управляющие конструкции что ли. В книгах не написано что так делать нельзя, а как раз наоборот, если это позволяет упростить код сделать его более понятным и легче в поддержке, то нужно именно так делать как будет более просто.

Да конечно исключения для обработки ошибок кажется логично, но и для управления программ тоже используются, например можно делать выход из взоженного цикла из там допустим:

C++
1
2
3
4
5
6
7
8
9
10
11
try
{
for(int i=0;i<3;i++)
for(int j=8;j<10;j++)
for(int k=4;k<10;k++)
throw;//выход из цикла
}
catch(...)
{
 
}
Просто это удобно.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
26.09.2013, 12:48 #17
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну знаешь можно использовать исключения так как удобно,
удобно, но не разумно
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 12:48 #18
По другому что бы выйти нам нужно использовать какой нить флаг, либо goto, но мне это не нравиться проще сгенерировать исключение и спокойно выйти туда куда нужно.
0
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
26.09.2013, 12:50  [ТС] #19
Вообще break тоже подходит для выхода из цикла.
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 12:53 #20
Цитата Сообщение от Croessmah Посмотреть сообщение
удобно, но не разумно
Если мне память не подводят в книгах говориться что исключения можно использовать для управления программ, это не запрещено, помоему даже есть целая глава.

Вообще таваришь ТС не смотри ты на эти все стерертипы, а делай всегда так как тебе удобно потому что нету правил которые говорят что этот оператор именно так нужно использовать, да как хочешь так и используй.
Да есть правила хорошего тона или как их там называют, но их не сложно соблюдать если в команде пишешь, если твой код никто читать не будет, ты сам себе хозяин, ты не для когото пишешь, а для себя, пиши так как тебе лучше и ни кого не слушай, без запретов нивчом себя не ограничивай. Это просто мой тебе совет, я сам ему стараюсь следовать.
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
26.09.2013, 12:55 #21
Цитата Сообщение от Peperovich Посмотреть сообщение
Перегрузка оператора [] для std::vector? Для него же есть своя реализация перегрузки []. Какая из них будет вызываться?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <vector>
 
template <class T>
class A : public std::vector <T> {
public:
    T operator [] ( int index ) {
        if ( index < 0 || index >= static_cast<int>(std::vector<T>::size()) ) {
            std::cout << "out of range: ";
            return 0;
        }
        std::cout << "ok: ";
        return (*(std::vector<T> *)this)[index];
    }
};
 
int main()
{
    A <int> a;
    a.push_back( 123 );
    a.push_back( 200 );
    a.push_back( 500 );
    a.push_back( 9999 );
 
    std::cout << a[-1] << std::endl; // out of range: 0
    std::cout << a[ 0] << std::endl; // ok: 123
    std::cout << a[ 3] << std::endl; // ok: 9999
    std::cout << a[ 4] << std::endl; // out of range: 0
}
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 12:56 #22
Peperovich, ну и как ты выйдешь вообще брейком вот код:
C++
1
2
3
4
5
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
for(int k=0;k<10;k++)
if(какое то условие)//нужно выйти полностью из всех циклов
break;//ты выйдешь токо из одного цикла.
тут можно переменную флаг использовать, можно goto, можно исключение и исключение красивый легко понятный вариант.
0
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
26.09.2013, 13:04  [ТС] #23
Наследование сильная вещь =) Все больше и больше в этом убеждаюсь.

Добавлено через 4 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
Peperovich, ну и как ты выйдешь вообще брейком вот код:
C++
1
2
3
4
5
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
for(int k=0;k<10;k++)
if(какое то условие)//нужно выйти полностью из всех циклов
break;//ты выйдешь токо из одного цикла.
тут можно переменную флаг использовать, можно goto, можно исключение и исключение красивый легко понятный вариант.
Из всех циклов одним break понятно, что не выйдешь. А goto перестал пользоваться еще на Pascale. Лучше уж флаг.
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
26.09.2013, 13:08 #24
Если позволяет ситуация то можно сделать просто.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
    for(int k=0;k<10;k++) {
        std::cout << "i=" << i << ", j=" << j << ", k=" << k << std::endl;
        if ( k == 5 ) i = j = k = 10;
    }
}
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 13:12 #25
Цитата Сообщение от Peperovich Посмотреть сообщение
Из всех циклов одним break понятно, что не выйдешь. А goto перестал пользоваться еще на Pascale. Лучше уж флаг.
а если этих циклов будет 10, ты что в каждом будешь проверять флаг? Мне кажется более компактно будет использовать исключение, код не замусорен будет и наглядно понятнее программа становиться.
0
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
26.09.2013, 13:16  [ТС] #26
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    int flag=0;
    for(int i=0;i<10 && flag==0;i++)
    for(int j=0;j<10 && flag==0;j++)
    for(int k=0;k<10 && flag==0;k++) {
        std::cout << "i=" << i << ", j=" << j << ", k=" << k << std::endl;
        if ( k == 5 ) flag=1;
    }
}
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 13:19 #27
Peperovich, да можно и так.
0
26.09.2013, 13:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2013, 13:19
Привет! Вот еще темы с ответами:

1C 8.x Обработка ТО - 1С
Где найти обработку торговое оборудование?

1C 8.x Обработка - 1С
Народ! Впервые пишу обработку по загрузке данных из файла. Подскажите, как брать данные из файла. Вот я выбираю файл &amp;НаКлиенте Процедура...

обработка - C++ Qt
добрые вечер! подскажите как провернуть: идет показ картинок и пользователь должен выбрать 1 из 3-х предложенных вариантов... показ...

Обработка 1с 8 - 1С
Собственно проблема-то не в системе, а в мозге :) На форме обработки имеется таблица, поля таблицы описаны в тексте обработки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.