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

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

Войти
Регистрация
Восстановить пароль
 
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
#1

TRY/CATCH - C++

07.07.2013, 13:00. Просмотров 736. Ответов 14
Метки нет (Все метки)

Здравствуйте! У меня есть:
MASS[100][100];

для простоты пояснения,
x=rand();y=rand(),znacheniye=rand();

Как игнорировать ошибки доступа?

TRY{MASS[x][y]=znacheniye;}
catch(...){}

Так работает, но я не уверен на счёт скорости...т.е. быстрее так или с помощью if(x<100 && y<100){}?
Или есть способ ещё быстрее?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2013, 13:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос TRY/CATCH (C++):

Try-catch - C++
Добрый вечер, #include &lt;iostream&gt; using namespace std; void F1(int); void F2(int, int); void F3(int, int, int);

try-catch - C++
Доброго времени суток, начал изучать исключения, и вот есть такой код: // new.cpp : Defines the entry point for the console...

Try и catch - C++
Пытался сделать простую структуру,чтобы в блоке try задавалось значение переменной x, и если это значение равно,например, 5,то блок catch...

Try catch - C++
try { throw pDoc-&gt;C; } catch (City) { return; } есть динамический City* C, ему присвается значение другого такого...

try-catch - C++
Какой тип проекта создавать в Visual Studio чтобы можно было сделать обработку исключений с try-catch? Или что сделать в Code Blocks с той...

try . catch - C++
можно ли провести данную операцию для функции erase у вектора??? пытался, что-то не получилось: #include &lt;vector&gt; #include &lt;algorithm&gt; ...

14
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.07.2013, 13:07 #2
Retyrn0, при доступе к обычным массивам проверки индексов системой не производится. Может быть только в отладочном режиме. И то не факт. Генерируйте x, y в диапазоне [0..100) и не будет никаких проблем.
0
Kuzia domovenok
1947 / 1800 / 137
Регистрация: 25.03.2012
Сообщений: 6,234
Записей в блоге: 1
07.07.2013, 13:32 #3
а что такое MASS[100][100]; массив?
Подозреваю, что никак. Обращение к массиву - чисто сишная операция, заключающаяся в доступе по указателю со смещением. Почему она должна генерировать исключение? Си-Массив не знает же даже своего размера!

Добавлено через 19 минут
Вот STLевский вектор знает свой размер и бросает соответствующее исключение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <stdexcept>
#include <vector>
using namespace std;
int main()
{
    vector<vector<int>>MASS(100, vector<int>(100));//инициализация 2d вектора 100 на 100
    try {       
        MASS.at(101).at(10)=1234;// попытка обращения к элементу MASS[101][10]
        cout<<"Success ";
    }
    catch (out_of_range const& e) {  //Исключение успешно ловится 
        cerr<<"Failure: "<<e.what()<<endl;//и ошибка успешно выводится 
    }   
    system("pause");
    return 0;
}
Добавлено через 5 минут
Вот только я сам недавно узнал, что метод at() бросает исключение, а аналогичный оператор [] нет.
Наверное программисты STL схалтурили и реализовали оператор индексации тупо без проверок всевозможных, чтоб был как в Си
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
07.07.2013, 13:36  [ТС] #4
Цитата Сообщение от Tulosba Посмотреть сообщение
Генерируйте x, y в диапазоне [0..100) и не будет никаких проблем
Я же написал, что rand() - для простоты объяснения сути задачи. На самом деле значения вполне не случайные и находятся в пределах 0-65535 включительно. Ограничить диаппазон никак не возможно...
0
Kuzia domovenok
1947 / 1800 / 137
Регистрация: 25.03.2012
Сообщений: 6,234
Записей в блоге: 1
07.07.2013, 13:39 #5
Поэтому даже STLевый вектор не бросает просто так исключений при использовании оператора [].
Смотри пример использования MASS.at(101).at(10)
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
07.07.2013, 13:45  [ТС] #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Почему она должна генерировать исключение?
Она никому и ничего не должна)

В том-то и дело, что мне не нужны исключения - их не нужно обрабатывать, а просто игнорировать ошибки доступа с максимальной скоростью.

Добавлено через 3 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Поэтому даже STLевый вектор не бросает просто так исключений при использовании оператора [].
забудем про исключения...нужно проигнорировать ошибку записи. Если записать данные не вышло - хрен с ними, просто продолжить работу и всё...
0
Kuzia domovenok
1947 / 1800 / 137
Регистрация: 25.03.2012
Сообщений: 6,234
Записей в блоге: 1
07.07.2013, 13:46 #7
Цитата Сообщение от Retyrn0 Посмотреть сообщение
В том-то и дело, что мне не нужны исключения
Тогда я совершенно не понял, что ты пытаешься сделать, потому что оператор [] и не должен генерировать исключения.
Ты свой код то проверял?
Этот:
C++
1
2
3
4
5
6
try{
        MASS[105][105]=1;
    }
    catch(...){
    cout<<"caught";
    }
Этот код упадёт с ошибкой "порчи памяти" (В debug по крайней мере)
0
0x10
2478 / 1651 / 247
Регистрация: 24.11.2012
Сообщений: 4,087
07.07.2013, 13:48 #8
Цитата Сообщение от Retyrn0 Посмотреть сообщение
забудем про исключения...нужно проигнорировать ошибку записи
Ну в первом же посте написали условие для проверки. Не нужно ничего больше выдумывать.
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
07.07.2013, 13:53  [ТС] #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты свой код то проверял?
Проверял. И он у меня впоне работает. Когда я делаю MASS[105][105]=1, вылетает сообщение об ошибке доступа,
а TRY{MASS[105][105]=1;}CATCH(...){} - ошибка не вылетает. Я уточнял по поводу скорости, if не быстрее ли будет или может есть иное решение для моей специфической задачи...

Добавлено через 35 секунд
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну в первом же посте написали условие для проверки. Не нужно ничего больше выдумывать
Ну раз ничего друго, более быстрого нет, то придётся =/

Добавлено через 10 секунд
Спасибо откликнувшимся!
0
0x10
2478 / 1651 / 247
Регистрация: 24.11.2012
Сообщений: 4,087
07.07.2013, 13:56 #10
Цитата Сообщение от Retyrn0 Посмотреть сообщение
вылетает сообщение об ошибке доступа
Ага, вылетает. Но в обработчик исключения управление не передается.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.07.2013, 13:59 #11
Цитата Сообщение от Retyrn0 Посмотреть сообщение
На самом деле значения вполне не случайные и находятся в пределах 0-65535 включительно.
C++
1
2
x %= 100;
y %= 100;
и нет проблем с выходом за границы.
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Ну раз ничего друго, более быстрого нет, то придётся =/
Вы же не говорите откуда входной диапазон взялся и откуда 100 взялись, поэтому ничего конкретного и не предлагают. Только общие решения.

Добавлено через 2 минуты
Цитата Сообщение от Retyrn0 Посмотреть сообщение
уточнял по поводу скорости, if не быстрее ли будет
Всегда удивляло желание людей оптимизировать задачу, совершенно не разбираясь в базовых вещах.
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
07.07.2013, 14:02  [ТС] #12
Цитата Сообщение от 0x10 Посмотреть сообщение
в обработчик исключения управление не передается
Мне это и не нужно - мне не нужно ничего обрабатывать, а ИГНОРИРОВАТЬ.

Добавлено через 2 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
совершенно не разбираясь в базовых вещах
А как на счёт конвееризации? =)
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
07.07.2013, 14:05 #13
Цитата Сообщение от Retyrn0 Посмотреть сообщение
мне не нужно ничего обрабатывать, а ИГНОРИРОВАТЬ.
путь вникуда. нужно просто приложение строить так, чтоб не пришлось ничего игнорировать. Тут ведь дело таке, что вылет за пределы массива может привести к падению в совершенно другом месте программы. Причем ни сразу, а например, только через час после выхода за пределы.
0
0x10
2478 / 1651 / 247
Регистрация: 24.11.2012
Сообщений: 4,087
07.07.2013, 14:05 #14
Retyrn0, условные переходы могут привести к кэш-промахам, что ж теперь? Либо ставим проверки, либо наслаждаемся падениями программы.
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
07.07.2013, 14:11  [ТС] #15
Компилятор создаёт код с использованием принципа конвееризации - несколько однотипных операций могут быть выполнены за один тик процессора. При использовании условных операторов конвееризация уже не будет осуществима. Тем не менее спасибо за ответы. Придётся всё-таки условия использовать, наверное.
0
07.07.2013, 14:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2013, 14:11
Привет! Вот еще темы с ответами:

try-catch - C++
Читаю книгу Страуструпа. Он пишет (стр 232), что можно не передавать обработчику исключений какое либо значение. #include...

try catch - C++
Здравствуйте. В c++ новичёк, с try catch никогда толком не работал, а тут пришлось. Нужно сделать защиту от ввода всего кроме цифр. вот...

Исключение try catch - C++
Добрый вечер, в программе пользователю предлагается ввести ключ, значение, принимающее ключ имеет тип int, проблема в том, что не могу...

Catch(.) не срабатывает - C++
Имеется такой фрагмент код: HANDLE hData = GetClipboardData(CF_TEXT | CF_LOCALE); char* chBuffer = (char*)GlobalLock(hData); try...


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

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

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