Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
#1

out_of_range exaptions и условные операторы - C++

26.02.2011, 21:43. Просмотров 1755. Ответов 17
Метки нет (Все метки)

Меня интересует следущее: почему этот код не выдает ошибок типа "индекс вне границ массива"
C++
1
if (a[i] > 0) something();
Работа этого кода при превышении границ массива похожа на
C++
1
if (false) something();
Кто-то может обьяснить почему так происходит? Я из-за этого на topcoder-e 4 challenge-a завалил.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2011, 21:43     out_of_range exaptions и условные операторы
Посмотрите здесь:

Условные операторы - C++
Написать программу, которая вычисляет дату следующего дня. Ниже представлен рекомендуемый вид экрана во время работы программы. Введите...

Условные операторы с++ - C++
Доброго времени программисты, ищу спасения на вашем портале! Писал программу: Вывести на экран таблицу значений функции Y(x) и ее...

Условные операторы - C++
Напечатать таблицу значений функций y=sqr(x)+4x на интервале от -5 до 5.

Условные операторы - C++
Задание: создайте условный оператор, который присваивал бы x*y для четного x, в противном случае для нечетного x и y, не равного 0,...

Условные операторы - C++
Здравствуйте! Сразу же покажу нужный кусочек проги (полная версия будет ниже): if(b>0) { c=a+b; d=2*c; } else {

условные операторы - C++
для заданых a,x написать программу для определения значений функции http://s51.***********/i132/1112/29/7a8ea17823f7.jpg ...

Условные операторы и массивы - C++
Ученики начальной школы сдают технику чтения. Нормы следующие: в 1 клас-се ребёнок должен читать не менее 20 слов в минуту; во втором...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
АХ
2 / 2 / 1
Регистрация: 23.02.2011
Сообщений: 13
26.02.2011, 21:50     out_of_range exaptions и условные операторы #2
Всё очень просто: массив в С - это последовательность указателей на нечто типа элементов массива, поэтому при превышении границ диапазона указатель становится "битым" (
C
1
nullptr
), его значение становится эквивалентным нулю (
C
1
false
). Если бы Вы проверяли
C
1
if (a[i]) something();
, то компилятор выдавал бы исключение по выходу за диапазон, а так это ловится только при отладке
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
26.02.2011, 21:55  [ТС]     out_of_range exaptions и условные операторы #3

Не по теме:

Во блин, на "человеческом" C# вываливается за милую душу, а на плюсах пашет ппц (:



Добавлено через 1 минуту
Значит код
C++
1
Type a = b[i];
при превышении диапазона будет вываливаться верно?
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,908
26.02.2011, 22:39     out_of_range exaptions и условные операторы #4
Ни в С, ни в C++ выход за границы простого массива не контролируется. За этим нужно следить самостоятельно. Для таких контейнеров как std::vector и std::string контроль выхода за границы массива при обращении к элементам через operator[] также не осуществляется, для этих целей используется специальный метод at. Вот этот метод как раз и выбрасывает исключение out_of_range.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
27.02.2011, 01:51     out_of_range exaptions и условные операторы #5
Для таких контейнеров как std::vector и std::string контроль выхода за границы массива при обращении к элементам через operator[] также не осуществляется
Зависит от реализации STL. По стандарту - разрешается, но не везде есть. Пример - MSVS реализация [] в векторе
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
    const_reference operator[](size_type _Pos) const
        {   // subscript nonmutable sequence
 
 #if _HAS_ITERATOR_DEBUGGING
        if (size() <= _Pos)
            {
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
            }
 #endif /* _HAS_ITERATOR_DEBUGGING */
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());
 
        return (*(_Myfirst + _Pos));
        }
 
    reference operator[](size_type _Pos)
        {   // subscript mutable sequence
 
 #if _HAS_ITERATOR_DEBUGGING
        if (size() <= _Pos)
            {
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
            }
 #endif /* _HAS_ITERATOR_DEBUGGING */
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());
 
        return (*(_Myfirst + _Pos));
        }
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,908
27.02.2011, 02:09     out_of_range exaptions и условные операторы #6
Цитата Сообщение от ForEveR Посмотреть сообщение
По стандарту - разрешается, но не везде есть.
Ссылку на соответствующее место в стандарте неплохо бы увидеть.
Цитата Сообщение от ForEveR Посмотреть сообщение
Пример - MSVS реализация [] в векторе
И это будет работать в релизе?
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
27.02.2011, 03:04     out_of_range exaptions и условные операторы #7
rangerx,
C++
1
 _SCL_SECURE_VALIDATE_RANGE(_Pos < size());
Это бyдет.
Ссыль приведy по3же. Рykоводствyюсь Страyстрyпом. Цитата.
На самом деле стандарт не утверждает, что вы не можете проверить диапазон в классе вектор, поэтому если хотите выполнить проверку, можете ее реализовать...
И еще есть пара пунктов по этому поводу, но лень все переписывать...

Добавлено через 38 минут
Подтверждений в стандарте не нашел, но Страуструпу верю.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,908
27.02.2011, 03:10     out_of_range exaptions и условные операторы #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Это бyдет.
К сожалению у меня нет возможности сейчас это проверить, поэтому придётся поверить тебе на слово. )
Цитата Сообщение от ForEveR Посмотреть сообщение
Страyстрyпом. Цитата.
Ну хоть бы на Страуструпа дал ссылку ) Специально открыл только что "Язык программирования C++. Специальное издание" $16.3.3. Доступ к элементам и вижу там то же самое, что сказал я. В любом случае, никакой гарантии, что operator[] осуществит проверку выхода за диапазон нет. "На самом деле стандарт не утверждает..." - это не серъёзно. ))
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
27.02.2011, 03:25     out_of_range exaptions и условные операторы #9
rangerx, Ну естесно) Все зависит от реализации. Ссылки на книгу боюсь нету на русском языке еще, а может уже и есть. Программирование принципы и практика использования С++ - страница 698, пункт 19.4.1, подпункт 4.

Про MSVS - такой код в релизе
C++
1
2
3
4
5
6
7
#include <vector>
 
int main()
{
    std::vector<int> vec(10);
    int t=vec[10];
}
Кидает runtime_error
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
27.02.2011, 09:38  [ТС]     out_of_range exaptions и условные операторы #10
ForEveR, а такой:
C++
1
    int t=vec[10] < 0 ? 0 : vec[10];
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
27.02.2011, 15:52     out_of_range exaptions и условные операторы #11
outoftime, Вылетит. Очевидно почему. vec[10] читает какую-то другую область памяти.
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
27.02.2011, 16:19  [ТС]     out_of_range exaptions и условные операторы #12
ForEveR, результаты последнего SRM на TopCoder-е, посмотрите пожалуйста, есть солюшены и тесты, на которых я их хотел слить, что касается C# и Java, опять таки, там все слетели, но кто писал на плюсах и ставил в условные операторы, впрочем, смотрите сами.

http://www.topcoder.com/stat?c=probl...24373#defenses
http://www.topcoder.com/stat?c=probl...00369#defenses
http://www.topcoder.com/stat?c=probl...10589#defenses

Что обьеденяет эти коды, если мы подаем вектор {50} с 1 элементом и какая разница с этим

http://www.topcoder.com/stat?c=probl...86983#defenses

Добавлено через 4 минуты
Имеется в виду на вход метода isValid (если вы не знакомы с правилами)
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,908
27.02.2011, 19:09     out_of_range exaptions и условные операторы #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Все зависит от реализации.
Ну, может быть, не буду спорить. В стандарте скорее всего вообще об этом ничего не говорится.
Цитата Сообщение от outoftime Посмотреть сообщение
а такой:
Если повезёт...
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
27.02.2011, 19:11     out_of_range exaptions и условные операторы #14
В стандарте скорее всего вообще об этом ничего не говорится.
Ага. Читая стандарт по контейнерам вчера увидел только про то, что at() обязана гарантировать проверку на диапазон.
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
27.02.2011, 19:18  [ТС]     out_of_range exaptions и условные операторы #15
Цитата Сообщение от rangerx Посмотреть сообщение
В стандарте скорее всего вообще об этом ничего не говорится.
Цитата Сообщение от ForEveR Посмотреть сообщение
Ага. Читая стандарт по контейнерам вчера увидел только про то, что at() обязана гарантировать проверку на диапазон.
Это что получается то? Когда я вижу что-то типа:
C++
1
if (a[i] > 0) something();
я должен считать что он правильный? На случай если релиз позволяет? Не знаете что говорит об этом gcc именно его юзает topcoder.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
27.02.2011, 19:20     out_of_range exaptions и условные операторы #16
outoftime, Используй at() и будет тебе счастье.
А лучше итераторы. имхо)
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,908
27.02.2011, 19:30     out_of_range exaptions и условные операторы #17
Цитата Сообщение от outoftime Посмотреть сообщение
Не знаете что говорит об этом gcc
C++
1
2
3
4
5
6
7
8
9
10
11
reference operator[](size_type __n)
{ 
    return *(begin() + __n); 
}
 
//---------
 
const_reference operator[](size_type __n) const
{ 
    return *(begin() + __n); 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2011, 19:39     out_of_range exaptions и условные операторы
Еще ссылки по теме:

Вычисления и условные операторы - C++ Builder
Разместить на форме 2 компонента Edit для ввода роста и веса пользователя. При нажатии на кнопку программа вычисляет индекс массы тела...

Условные операторы, двумерные массивы - C++
Вот задачи, решение сделано на Паскале, переделать нужно на Си... 1. Даны произвольные числа а, b, c. Определить, может ли быть построен...

Используя вложеные условные операторы IF и IF-ELSE - C++
Составить программу для нахождения вещественных корней квадратного уравнения ax2+bx+c=0.

Арифметические выражения и условные операторы - C++ Builder
С помощью условного оператора определить, находится ли точка на плоскости в замкнутой области. Если находится, то вычислить значение...

Арифметиеские выражения и условные операторы - C++
С помощью оператора if определить, находится ли точка на плоскости в замкнутой области. Если находится, то вычислить значение функции f1...


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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
27.02.2011, 19:39  [ТС]     out_of_range exaptions и условные операторы #18
Цитата Сообщение от ForEveR Посмотреть сообщение
Используй at() и будет тебе счастье.
А лучше итераторы. имхо)
Да я такие ляпы заметаю, мне надо знать когда это неправильно у других (:
Yandex
Объявления
27.02.2011, 19:39     out_of_range exaptions и условные операторы
Ответ Создать тему
Опции темы

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