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

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

Войти
Регистрация
Восстановить пароль
 
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Ограниченные массивы - C++

15.02.2010, 05:57. Просмотров 984. Ответов 12
Метки нет (Все метки)

Ограниченным называется массив, у которого оператор [] проверяет индекс на принадлежность диапазону. Логику проверки я могу сделать, а какой должна быть реакция оператора на выход за диапазон? Условие: при выходе за диапазон требуется минимизировать вероятность фатальной ошибки, при которой прога вообще не сможет продолжать работать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2010, 05:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ограниченные массивы (C++):

Массивы. Циклические алгоритмы (Заполнить массивы случайными числами, лежащими в интервале 0 до 100) - C++
Доброго дня, уважаемые форумчане, помогите пожалуйста решить задание. Заполнить массивы случайными числами, лежащими в интервале 0 до...

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц) - C++
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник местонахождением соответствующего элемента aij (см....

Попадание точки. Массивы чисел. Массивы записей. - C++
Всем привет. По языкам задали три контрольные на си. Я сам си не знаю, даже не представляю, поэтому очень нужна ваша помощь. ...

Многомерные массивы, как перебирать внутренние массивы - C++
Здравствуйте. Такой учебный код и плохо понимаю как перебираются внутренние массивы, может кто пояснит подоходчивее. Именно внутренний...

Массивы структур и массивы строк - C++
1. Сформировать динамический массив из элементов структурного типа. Структурный тип определен в варианте. 2. Распечатать...

массивы указателей,указатели на массивы - C++
Понимаю что тема эта изжевана, но я ещё жую.Хочу, чтобы усвоилось. допустим есть QStringList a; a.append("мамa"); ...

12
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.02.2010, 12:15 #2
Допустим вывод сообщения об ошибке, а дальше ищи ошибку.
Выходов за буфер не должно быть.

Я обычно проверку делаю так: проверяем индекс с размером массива,
если индекс не правильный вывожу ошибку, и вызываю exit();
А дальше отладчик в руки и пошёл устранять ошибку.


Лучше выводить сообщение ошибки с поддержкой API: диалоговых окон:
C++
1
2
3
4
#include "stdafx.h"
void main(){
AfxMessageBox("error");      //вывод ошибки в диалоговом окне
}
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
15.02.2010, 13:50 #3
При выходе за диапазон бросай исключение, благо std::out_of_range к твоим услугам. В вызывающем коде можно его перехватить и подумать, что делать дальше....
2
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.02.2010, 13:52 #4
Тоже вариант.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
15.02.2010, 14:13 #5
Кстати, исключение - наиболее правильное решение (имхо). Потому что если индекс вылетел за диапазон - это однозначно вина вызывающего кода, и именно вызывающему коду с этим надлежит разбираться - почему оно так вышло и что делать.....
1
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.02.2010, 15:44 #6
Кстати, исключение - наиболее правильное решение (имхо). Потому что если индекс вылетел за диапазон - это однозначно вина вызывающего кода, и именно вызывающему коду с этим надлежит разбираться - почему оно так вышло и что делать.....
Дополню.

Обработку исключения можно ещё обработать с помощью assert(..);
Это макрос выдаст номер строки исходного кода в котором вызван сам assert(..),
и следовательно ошибку проще найти.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.02.2010, 11:51  [ТС] #7
Цитата Сообщение от Genius Ignat Посмотреть сообщение
и вызываю exit();
А дальше отладчик в руки и пошёл устранять ошибку.
Мне надо, чтоб прога продолжалась.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
16.02.2010, 12:24 #8
Тут штука вот в чем: если этот индекс (который "вдруг" оказывается вне диапазона) жестко зашит или вычисляется в твоей проге, то Genius Ignat прав - отладчик в руки и вперед, это просто ошибка в программе, которую всяко надо ликвидировать до продакшена. Если же этот индекс как-то приходит в программу "извне" (ну, к примеру, клиент шлет его серверу по сети, или юзер вводит кривыми ручками....), то неплохое решение - проверять его валидность максимально близко к точке ввода (получения) и при дурацком индексе грязно ругаться.
1
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
02.03.2010, 23:41 #9
ассерты и вправду удобно для быстрого обнаружения проблемы
C++
1
2
3
4
5
6
7
int vector::at( int i ){
    if( i > size ){
        assert( !"error!" );
        return -1; //даж не знаю
    }
    return _data[i];
}
out_of_range - меня печалит, что ни как в яве - виртуальная машина сама скажет: где и когда произошло исключение
Мне надо, чтоб прога продолжалась.
нажимаешь кнопочку ignore
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.03.2010, 23:54 #10
Цитата Сообщение от alex_x_x Посмотреть сообщение
C++
1
2
3
4
5
6
7
int vector::at( int i ){
    if( i > size ){
        assert( !"error!" );
        return -1; //даж не знаю 
    }
    return _data[i];
}
alex_x_x, код как-то совсем не комильфо. assert предназначен для проверки тех или иных инвариантов.
Поправленный вариант:
C++
1
2
3
4
5
int vector::at( int i ){
    assert(i >= 0 && i < size);
 
    return _data[i];
}
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
03.03.2010, 00:00 #11
CyBOSSeR, не соглашусь, тут же случай когда программа не только в debug варианте должна отслеживать выход за границы массива, для обычного случая ваш вариант конечно логичней
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.03.2010, 18:33 #12
alex_x_x, ну, хорошо, получается что вектор возвратит -1, хотя это значение вполне может в нем содержаться, так получается? Гораздо логичнее, как уже отмечал CheshireCat, воспользоваться механизмом исключительных ситуаций.
C++
1
2
3
4
5
6
int vector::at( int i ){
    if(i < 0 && i >= size)
      throw "Index out of range";
 
    return _data[i];
}
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
03.03.2010, 20:30 #13
соглсен, иначе не придумать что возвращать
0
03.03.2010, 20:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2010, 20:30
Привет! Вот еще темы с ответами:

массивы указателей,указатели на массивы - C++
Понимаю что тема эта изжевана, но я ещё жую.Хочу, чтобы усвоилось. допустим есть QStringList a; a.append(&quot;мамa&quot;); ...

Массивы структур и массивы строк - C++
Здравствуйте. Возникла проблема с одной работой: Постановка задачи: 1. Сформировать динамический массив из элементов структурного типа....

Массивы структур, массивы векторов - C++
Разработайте тип данных «Вектор в трехмерном пространстве» в виде структуры, поля которой — координаты вектора. Напишите следующие функции:...

индексные массивы и адресные массивы - C++
погитите решить задачу c массивами двумя способами {индексные и адресные} { Вычислить суммы элементов каждой строки матрицы Х(20х20),...


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

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

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