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

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

Восстановить пароль Регистрация
 
Kolad
Сообщений: n/a
05.06.2014, 16:09     Массив чисел с контролем границ #1
Прошу помочь так как я совсем уже запутался и не знаю как подступиться,
есть вот такой класс , который должен бы был содержать не динамический массив чисел с контролем их кол-ва.
И я не знаю как его организовать.
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++ Организовать ввод целых четных значений в одномерный массив с контролем вводимых чисел
C++ Метод сортировки Bubble с контролем упорядоченности
C++ 2)Дан массив из N целых чисел. Получить из него массив отрицательных чисел и отсортировать его по возрастанию методом выбора
C++ Одномерный массив (Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
05.06.2014, 22:35     Массив чисел с контролем границ #2
см. std::array
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,962
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;
};
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
05.06.2014, 23:05     Массив чисел с контролем границ #4
Renji,
C++
1
2
array a(1);
array b = a;
и словили двойное удаление памяти. См. правило трёх.
P.S. ну а ассерты только при отладке актуальны. В релизе придется кидать исключения.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,962
06.06.2014, 00:45     Массив чисел с контролем границ #5
Отсутствие конструктора копирования - да, мой косяк. С ассертами так и задумано. Во время отладки в программе могут быть косяки и выход за границы массива. Поэтому нужна проверка границ. В релизе выходов за границы массива не должно быть как класса. Иначе зачем отладка проводилась? Соответственно и проверка выхода не особо нужна. При этом если проверку все же оставить, она будет жрать заметное количество процессорного времени, что не есть гуд.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.06.2014, 06:54     Массив чисел с контролем границ #6
Renji, отладка и тестирование далеко не обязательно покроют все ветки кода. А теперь представьте, если где-то размер массива и индекс для доступа вводятся пользователем. Или если Ваш код будет использоваться в составе библиотеки. Тут уж либо оптимизация, либо полная проверка границ. Именно поэтому в std::array есть как operator[], так и метод at(). Чтобы был выбор.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,962
06.06.2014, 07:39     Массив чисел с контролем границ #7
А теперь представьте, если где-то размер массива и индекс для доступа вводятся пользователем.
Вот корректность пользовательского ввода/входных аргументов функции и надо проверять. Исключение в operator[] это скорее метод обнаружения алгоритмических ошибок. То есть, как раз таки отладка.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.06.2014, 09:55     Массив чисел с контролем границ #8
Цитата Сообщение от Renji Посмотреть сообщение
Вот корректность пользовательского ввода/входных аргументов функции и надо проверять.
И чем это будет отличатся от обычного массива, в котором нет проверки диапазона? Либо мы помещаем проверку внутрь класса и оставляем ее там вне зависимости от debug/release, либо получаем класс, который не может самостоятельно отследить разрешенные границы.
Цитата Сообщение от Renji Посмотреть сообщение
Исключение в operator[] это скорее метод обнаружения алгоритмических ошибок.
Собственно некоторые реализации std::array так себя и ведут емнип, т.е. в дебаге operator[] делает то же, что и at(), а вот в релизе operator[] никаких проверок диапазона не делает, а at() кидает исключение. Т.о. стандартную реализацию можно использовать как в безопасном (at()), так и в "быстром" (operator[]) режиме.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,962
06.06.2014, 10:21     Массив чисел с контролем границ #9
И чем это будет отличатся от обычного массива, в котором нет проверки диапазона?
Можно будет прочитать жалобу пользователя "я сделал то-то и се-то и у меня все упало", повторить его действия на debug сборке и быстрее локализовать место ошибки.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.06.2014, 10:29     Массив чисел с контролем границ #10
Цитата Сообщение от Renji Посмотреть сообщение
Можно будет прочитать жалобу пользователя "я сделал то-то и се-то и у меня все упало"
Так надежное ПО не делается Либо проверяем диапазон и выводим какое-то сообщение для юзера (но программа при этом падать не должна), либо опять получаем то же самое, что и при использовании обычного массива.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,962
06.06.2014, 10:48     Массив чисел с контролем границ #11
Так надежное ПО не делается Либо проверяем диапазон и выводим какое-то сообщение для юзера (но программа при этом падать не должна), либо опять получаем то же самое, что и при использовании обычного массива.
Переполнение целочисленных переменных тоже проверять? А то ведь 2147483647+1=-1 может иметь непредсказуемые последствия. Надежность надежностью, но вешать по проверке на каждую строчку это все же перебор. Если, конечно, не автопилот для самолета пишем.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.06.2014, 11:25     Массив чисел с контролем границ #12
Renji, суть не в том, как глубоко надо делать проверки, а в том, что если проверки диапазона не реализовано в рантайме (а если случился креш внутри объекта массива - значит не реализовано), то и массив не удовлетворяет исходному ТЗ. Это не массив с контролем границ.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2014, 11:29     Массив чисел с контролем границ
Еще ссылки по теме:

C++ 2)Дан массив из N целых чисел. Получить из него массив отрицательных чисел и отсортировать его по возрастанию методом выбора
Стек с контролем на переполнение C++
C++ Класс массив. Задания произвольных границ индексов массива

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

Или воспользуйтесь поиском по форуму:
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,962
06.06.2014, 11:29     Массив чисел с контролем границ #13
А, тогда пардон, недопонял ТЗ. Думал Kolad нужна проверка именно в смысле отладочного кода.
Yandex
Объявления
06.06.2014, 11:29     Массив чисел с контролем границ
Ответ Создать тему
Опции темы

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