Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/125: Рейтинг темы: голосов - 125, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202

Проверить на выход за границы массива

05.05.2013, 12:39. Показов 25975. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ПРивет, помогите пожалуйста, пишу класс - динамический массив, в перегрузке оператора [] нужно проверить на выход за границы, но не знаю как правильно использовать try, catch, throw.
C++
1
2
3
4
5
6
7
8
9
10
11
template <class T, int size>
T & Array<T, size> :: operator [](int index) {
    try {
    if (index < 0 || index >= currentSize)
        throw out_of_range("Index was out of range");
    }
    catch(...) { // что тут писать чтобы поймать из throw
        cout << "error";
    }
    return aPtr[index]; // и как быть тут куда вставить эту строку
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.05.2013, 12:39
Ответы с готовыми решениями:

Выход за границы массива
#include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; void umnozh(int** arr, int n,int strings, int cols) { for (int i =...

Выход за границы массива
Выхожу за пределы массива, но вот только не понимаю как. #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; const...

Массивы: Проверка на выход за границы массива
Здравствуйте! Пишу код хождения коня по шахматной доске. Конь пока стоит на одном месте и ходит по кругу. Как можно реализовать проверку на...

44
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
07.05.2013, 20:45
Студворк — интернет-сервис помощи студентам
Естессно это работает. Просто я не люблю, когда кишки наружу.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
07.05.2013, 23:31
Все эти кишки надёжно упрятаны в сам Array, как и должно быть. Вводить дополнительный класс только для того, чтобы спрятать именно эти "кишки", делать его настолько многословным (да ещё, глядишь, и что-то другое упрятывать в другой класс) - over-engineering.
0
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
08.05.2013, 18:04  [ТС]
я не знаю как эффективно хранить информацию, думал всякие списки, массивы, но не то, вы дали подсказку, что это как то связано с оператором = , думал мб там проверять элементы и отправлять только те которые проиниц., но тоже не то
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
08.05.2013, 21:25
Цитата Сообщение от Kreativ Посмотреть сообщение
я не знаю как эффективно хранить информацию, думал всякие списки, массивы, но не то, вы дали подсказку, что это как то связано с оператором = , думал мб там проверять элементы и отправлять только те которые проиниц., но тоже не то
Время сворачивать балаган. Правильный ответ: инициализировать массив строго последовательно слева направо. Тогда достаточно хранить количество проинициализированных элементов, чтобы быстро и точно узнать, что в массиве было проинициализировано, а что нет. В фрагменте кода Nick Alte этой штуке соответствует счётчик i.
Цитата Сообщение от Nick Alte Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
size_t i = 0;
try {
    for(; i < size; ++i)
        new(newArray + i) T(srcArray[i]);
} catch (...) {
    for(; i > 0;)
    {
        --i;
        newArray[i].~T();
    }
    deallocate(newArray);
    throw;
}
1
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
09.05.2013, 13:30  [ТС]
Когда я в main()'е использую оператор=, то при завершении, когда уже вызываются деструкторы, вылетает ошибка. Пошагово прогонял, вызывается деструктор Array, но дальше, в деструктор моего созданного класса, он даже не заходит.
C++
1
2
3
4
5
6
7
int main() {
Array<Complex<int>, 4> obj2(3), obj(3);
    cin >> obj;
    cout << endl << obj;
    obj2 = obj;
return 0;
}
Конструктор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T, size_t size>
Array<T, size> :: Array(const Array<T, size> &arrayForCopying) {
        bool label = true;
        Ex<T, 5> obj(arrayForCopying.currentSize);
 
        for (size_t i = 0; i < arrayForCopying.currentSize; i++) 
            if (obj.init(arrayForCopying.aPtr[i], i) == 0)
                label = false;
        
        if (label) {
            aPtr = obj.get();
            currentSize = arrayForCopying.currentSize;
            maxSize = arrayForCopying.maxSize;
        }
}
оператор =
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class T, size_t size>
Array<T, size> & Array<T, size> :: operator = (const Array<T, size> &arrayForAssign) {
    if (this != &arrayForAssign) {
        bool label = true;
        Ex<T, 5> obj(arrayForAssign.currentSize);
 
        for (size_t i = 0; i < arrayForAssign.currentSize; i++) 
            if (obj.init(arrayForAssign.aPtr[i], i) == 0)
                label = false;
        
        if (label) {
            delete [] aPtr;
            aPtr = obj.get();
            currentSize = arrayForAssign.currentSize;
            maxSize = arrayForAssign.maxSize;
        }
        return *this;
    }
    return *this;
}
Деструктор Array:
C++
1
2
3
4
template <class T, size_t size>
Array<T, size> :: ~Array() {
    delete []  aPtr;
}
Метод init
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T>
int Ex<T> :: init(const T &elem, size_t n) {
    try {
        new (p + n) T(elem);
        return 1;
    }
    catch(...) {
        for (int i = n; i >= 0; i++) {
            p[i].~T();
        }
        operator delete[](p);
        
        return 0;
    }
}
и деструктор класса Ex
C++
1
2
3
4
template <class T>
Ex<T> :: ~Ex() {
    //delete [] p;
}
Добавлено через 1 час 18 минут
нашел свои ошибки, исправил, вроде все работает, но мб что-то нужно будет исправить:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
template <class T, size_t size>
Array<T, size> :: Array(size_t length) {
    maxSize = size;
    currentSize = length < size ? length : maxSize;
    aPtr = reinterpret_cast<T*>(operator new[](length * sizeof(T)) );
}
template <class T, size_t size>
Array<T, size> :: Array(const Array<T, size> &arrayForCopying) {
    bool label = true;
    Ex<T, 5> obj(arrayForCopying.currentSize);
 
    for (size_t i = 0; i < arrayForCopying.currentSize; i++) 
        if (obj.init(arrayForCopying.aPtr[i], i) == 0)
            label = false;
        
    if (label) {
        aPtr = obj.get();
        currentSize = arrayForCopying.currentSize;
        maxSize = arrayForCopying.maxSize;
    }
}
template <class T, size_t size>
Array<T, size> :: ~Array() {
    for (int i = (currentSize - 1); i >= 0; i--) {
        aPtr[i].~T();
    }
    operator delete[] (aPtr);
}
template <class T, size_t size>
Array<T, size> & Array<T, size> :: operator = (const Array<T, size> &arrayForAssign) {
    if (this != &arrayForAssign) {
        bool label = true;
        Ex<T> obj(arrayForAssign.currentSize);
 
        for (size_t i = 0; i < arrayForAssign.currentSize; i++) 
            if (obj.init(arrayForAssign.aPtr[i], i) == 0)
                label = false;
        
        if (label) {
            int i = arrayForAssign.currentSize - 1;
            for (; i >= 0; i--) {
                aPtr[i].~T();
            }
            operator delete[] (aPtr);
            aPtr = obj.get();
            currentSize = arrayForAssign.currentSize;
            maxSize = arrayForAssign.maxSize;
        }
    }
    return *this;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2013, 13:30

Присутствует ли в программе выход за границы массива
Здравствуйте. Задача. Дано 3 числа (a, b, c) и массив. Нужно проверить есть ли в массиве значения a, b, c подряд. Решение bool...

Выход за границы массива
Выход за пределы массива, как исправить, подобная вещь и в C# Sub pol(ByRef a() As Integer, ByRef b() As Integer, ByVal n As...

Выход за границы массива
Написал код static void Main(string args) { int n, m, i = 0; string text =...

Выход за границы массива
Найдите пожалустай в чем ошибка? ошибка времени выполнения индекс находится за границы массива program master4; Var a: array of...

Выход за границы массива
Помогите реализовать идею. Есть число, например, 001.002.003. Мне надо прочитать число до первой точки, и отправить в метод, потом до...


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru