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

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

Войти
Регистрация
Восстановить пароль
 
Kolad
Сообщений: n/a
#1

Массив чисел с контролем границ - C++

05.06.2014, 16:09. Просмотров 539. Ответов 12
Метки нет (Все метки)

Прошу помочь так как я совсем уже запутался и не знаю как подступиться,
есть вот такой класс , который должен бы был содержать не динамический массив чисел с контролем их кол-ва.
И я не знаю как его организовать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class array
{
private:
    int *i;
    int size;
public:
    array(int i){this -> i = new int(i);};
 
 
    //тут ,конечно возможно, не правильно начинаю.
    array(int i[])
    {
        
    };
};
Но что нужно на выходе.
В WinForm я встречал вот такое определение шаблонного класса
C++
1
array<Pointf> ^p = {Pointf(x1,y1), ... ,Pointf(xN,yN)};
И хочется сделать что-то подобное пока без шаблонов
и желательно без дополнительных библиотек.
C++
1
2
3
4
5
6
7
8
int main()
{
    array k1 = 4;
    array k2 = {1,2,3};//но как cделать возможность определения вот так. 
                       //какие-то перегрузки операторов ,конструкторов  
                       //не могу себе представить.  
    //system("PAUSE");  
}
Понятно ,что делаю что-то в корне не так. Потому и прошу помочь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2014, 16:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив чисел с контролем границ (C++):

Безопасный массив (массив с контролем границ) - C++
Доброе время суток! кто нибудь может подсказать в чем ошибка данной программы-&quot;безопасный массив(контроль границ массива)&quot;. #include...

Организовать ввод целых четных значений в одномерный массив с контролем вводимых чисел - C++
Организовать ввод целых четных значений в одномерный массив с контролем чисел вводимых

Ввод чисел с клавиатуры с контролем диапазона - C++
Напишите программу для ввода числа из заданного диапазона с клавиатуры. В случае выхода за границу диапазона повторите ввод числа. ...

Класс массив. Задания произвольных границ индексов массива - C++
Составить класс для определения одномерных массивов целых чисел . Предусмотреть возможность обращения к отдельному элементу массива с...

Дан массив целых чисел,произвести для него следующие операции: для каждого из чисел ,входящего в массив,указать,сколько раз оно входит в массив... - C++
помогите!!!((( дан массив целых чисел,произвести для него следующие операции: для каждого из чисел ,входящего в массив,указать,сколько...

Одномерный массив (Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах) - C++
Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах. Обьясните что делать?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
05.06.2014, 22:35 #2
см. std::array
1
Renji
1917 / 1315 / 298
Регистрация: 05.06.2014
Сообщений: 3,758
05.06.2014, 22:46 #3
Если так надо делать свой велосипед, то:
C++
1
2
3
4
5
6
7
8
9
10
11
#include<assert.h>
struct array
{
    array(int size_):data(new int[size_]),size(size_){}
    ~array(){delete[]data;}
    int&operator[](int offset){assert(offset>=0&&offset<size);return data[offset];}
    const int&operator[](int offset)const{assert(offset>=0&&offset<size);return data[offset];}
private:
    int*const data;
    const int size;
};
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
05.06.2014, 23:05 #4
Renji,
C++
1
2
array a(1);
array b = a;
и словили двойное удаление памяти. См. правило трёх.
P.S. ну а ассерты только при отладке актуальны. В релизе придется кидать исключения.
0
Renji
1917 / 1315 / 298
Регистрация: 05.06.2014
Сообщений: 3,758
06.06.2014, 00:45 #5
Отсутствие конструктора копирования - да, мой косяк. С ассертами так и задумано. Во время отладки в программе могут быть косяки и выход за границы массива. Поэтому нужна проверка границ. В релизе выходов за границы массива не должно быть как класса. Иначе зачем отладка проводилась? Соответственно и проверка выхода не особо нужна. При этом если проверку все же оставить, она будет жрать заметное количество процессорного времени, что не есть гуд.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.06.2014, 06:54 #6
Renji, отладка и тестирование далеко не обязательно покроют все ветки кода. А теперь представьте, если где-то размер массива и индекс для доступа вводятся пользователем. Или если Ваш код будет использоваться в составе библиотеки. Тут уж либо оптимизация, либо полная проверка границ. Именно поэтому в std::array есть как operator[], так и метод at(). Чтобы был выбор.
0
Renji
1917 / 1315 / 298
Регистрация: 05.06.2014
Сообщений: 3,758
06.06.2014, 07:39 #7
А теперь представьте, если где-то размер массива и индекс для доступа вводятся пользователем.
Вот корректность пользовательского ввода/входных аргументов функции и надо проверять. Исключение в operator[] это скорее метод обнаружения алгоритмических ошибок. То есть, как раз таки отладка.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.06.2014, 09:55 #8
Цитата Сообщение от Renji Посмотреть сообщение
Вот корректность пользовательского ввода/входных аргументов функции и надо проверять.
И чем это будет отличатся от обычного массива, в котором нет проверки диапазона? Либо мы помещаем проверку внутрь класса и оставляем ее там вне зависимости от debug/release, либо получаем класс, который не может самостоятельно отследить разрешенные границы.
Цитата Сообщение от Renji Посмотреть сообщение
Исключение в operator[] это скорее метод обнаружения алгоритмических ошибок.
Собственно некоторые реализации std::array так себя и ведут емнип, т.е. в дебаге operator[] делает то же, что и at(), а вот в релизе operator[] никаких проверок диапазона не делает, а at() кидает исключение. Т.о. стандартную реализацию можно использовать как в безопасном (at()), так и в "быстром" (operator[]) режиме.
0
Renji
1917 / 1315 / 298
Регистрация: 05.06.2014
Сообщений: 3,758
06.06.2014, 10:21 #9
И чем это будет отличатся от обычного массива, в котором нет проверки диапазона?
Можно будет прочитать жалобу пользователя "я сделал то-то и се-то и у меня все упало", повторить его действия на debug сборке и быстрее локализовать место ошибки.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.06.2014, 10:29 #10
Цитата Сообщение от Renji Посмотреть сообщение
Можно будет прочитать жалобу пользователя "я сделал то-то и се-то и у меня все упало"
Так надежное ПО не делается Либо проверяем диапазон и выводим какое-то сообщение для юзера (но программа при этом падать не должна), либо опять получаем то же самое, что и при использовании обычного массива.
0
Renji
1917 / 1315 / 298
Регистрация: 05.06.2014
Сообщений: 3,758
06.06.2014, 10:48 #11
Так надежное ПО не делается Либо проверяем диапазон и выводим какое-то сообщение для юзера (но программа при этом падать не должна), либо опять получаем то же самое, что и при использовании обычного массива.
Переполнение целочисленных переменных тоже проверять? А то ведь 2147483647+1=-1 может иметь непредсказуемые последствия. Надежность надежностью, но вешать по проверке на каждую строчку это все же перебор. Если, конечно, не автопилот для самолета пишем.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.06.2014, 11:25 #12
Renji, суть не в том, как глубоко надо делать проверки, а в том, что если проверки диапазона не реализовано в рантайме (а если случился креш внутри объекта массива - значит не реализовано), то и массив не удовлетворяет исходному ТЗ. Это не массив с контролем границ.
0
Renji
1917 / 1315 / 298
Регистрация: 05.06.2014
Сообщений: 3,758
06.06.2014, 11:29 #13
А, тогда пардон, недопонял ТЗ. Думал Kolad нужна проверка именно в смысле отладочного кода.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2014, 11:29
Привет! Вот еще темы с ответами:

Стек с контролем на переполнение - C++
#include &lt;iostream.h&gt; struct stek { int d; struct stek *next; }; void push(stek* &amp;next, int d)

Std::bind с контролем типом - C++
В общем, нужно реализовать аналог std::bind, который 1. Переводит void (*callback)(Args...) в std::function&lt;void()&gt; 2. Если среди Args...

Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел - C++
Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел больших исходных на два порядка. Напечатать массивы в два...

Метод сортировки Bubble с контролем упорядоченности - C++
задали написать программу с формами которая будет сортировать пузырьковым (bubble) методом и в конце приписка, нужно использовать контроль...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.06.2014, 11:29
Ответ Создать тему
Опции темы

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