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

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

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.02.2010, 05:57     Ограниченные массивы #1
Ограниченным называется массив, у которого оператор [] проверяет индекс на принадлежность диапазону. Логику проверки я могу сделать, а какой должна быть реакция оператора на выход за диапазон? Условие: при выходе за диапазон требуется минимизировать вероятность фатальной ошибки, при которой прога вообще не сможет продолжать работать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2010, 05:57     Ограниченные массивы
Посмотрите здесь:

массивы C++
Циклические массивы.одномерные массивы C++ Builder
Циклические массивы.одномерные массивы C++ Builder
Массивы в С++ C++
C++ Массивы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1233 / 771 / 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");      //вывод ошибки в диалоговом окне
}
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
15.02.2010, 13:50     Ограниченные массивы #3
При выходе за диапазон бросай исключение, благо std::out_of_range к твоим услугам. В вызывающем коде можно его перехватить и подумать, что делать дальше....
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.02.2010, 13:52     Ограниченные массивы #4
Тоже вариант.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
15.02.2010, 14:13     Ограниченные массивы #5
Кстати, исключение - наиболее правильное решение (имхо). Потому что если индекс вылетел за диапазон - это однозначно вина вызывающего кода, и именно вызывающему коду с этим надлежит разбираться - почему оно так вышло и что делать.....
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.02.2010, 15:44     Ограниченные массивы #6
Кстати, исключение - наиболее правильное решение (имхо). Потому что если индекс вылетел за диапазон - это однозначно вина вызывающего кода, и именно вызывающему коду с этим надлежит разбираться - почему оно так вышло и что делать.....
Дополню.

Обработку исключения можно ещё обработать с помощью assert(..);
Это макрос выдаст номер строки исходного кода в котором вызван сам assert(..),
и следовательно ошибку проще найти.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.02.2010, 11:51  [ТС]     Ограниченные массивы #7
Цитата Сообщение от Genius Ignat Посмотреть сообщение
и вызываю exit();
А дальше отладчик в руки и пошёл устранять ошибку.
Мне надо, чтоб прога продолжалась.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
16.02.2010, 12:24     Ограниченные массивы #8
Тут штука вот в чем: если этот индекс (который "вдруг" оказывается вне диапазона) жестко зашит или вычисляется в твоей проге, то Genius Ignat прав - отладчик в руки и вперед, это просто ошибка в программе, которую всяко надо ликвидировать до продакшена. Если же этот индекс как-то приходит в программу "извне" (ну, к примеру, клиент шлет его серверу по сети, или юзер вводит кривыми ручками....), то неплохое решение - проверять его валидность максимально близко к точке ввода (получения) и при дурацком индексе грязно ругаться.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 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];
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
03.03.2010, 00:00     Ограниченные массивы #11
CyBOSSeR, не соглашусь, тут же случай когда программа не только в debug варианте должна отслеживать выход за границы массива, для обычного случая ваш вариант конечно логичней
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 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];
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2010, 20:30     Ограниченные массивы
Еще ссылки по теме:

Массивы структур и массивы строк C++ Builder
C++ Builder Массивы структур и массивы строк
C++ Builder Массивы структур и массивы строк

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
03.03.2010, 20:30     Ограниченные массивы #13
соглсен, иначе не придумать что возвращать
Yandex
Объявления
03.03.2010, 20:30     Ограниченные массивы
Ответ Создать тему
Опции темы

Текущее время: 23:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru