С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 20.03.2019
Сообщений: 12
1

Как устранить проблему с вызванным исключением?

10.04.2019, 14:10. Показов 775. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь написать функцию для изменения размера массива.

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
void resize(int **array, int N)
{
    int** resize_array = new int*[N * 2];
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            resize_array[i][j] = array[i][j];
        }
    }
 
    N++;
    array = resize_array;
    delete[] resize_array;
}
 
void read_array(int **array, int N)
{
    int temp;
    resize(array, N);
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            in >> temp;
            array[i][j] = temp;
        }
    }
}
В 9 строке вызывается исключение: Вызвано исключение по адресу 0x0104C011 в task_14.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCDCD.

Как это можно было бы исправить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2019, 14:10
Ответы с готовыми решениями:

Как устранить проблему небезопасной реализации интерфейса HostnameVerifier
Попытался залить приложение на play market и получил -...

Почему не работает setAttribute? Как устранить данную проблему?
Пишу тетрис по этому уроку DjPShw9V66k всё делаю так же, возникает ошибка Uncaught TypeError:...

Недопустимый элемент "else" в выражении. Как устранить таковую проблему?
как устранить этот недочет, а то уже программа достала ругаться. Недопустимый элемент &quot;else&quot; в...

Устранить проблему с rtl120.bpl. Не открывается главная страница скайп
Всем доброго времени суток. Прошу помочь устранить проблему с rtl120.bpl. Не открывается главная...

15
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
10.04.2019, 14:13 2
Ошибка начинается здесь:
Цитата Сообщение от vishe_mastila Посмотреть сообщение
int** resize_array = new int*[N * 2];
А далее ее последствия.

массив размерностью NxN бедет содержать N*N элементов, а у Вас содержит N*2
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
10.04.2019, 14:26 3
vishe_mastila,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void resize(int **&array, int& size, int new_size)
{
    if (new_size == size) return;
    if (new_size < size)
    {
        size = new_size;
        return;
    }
    int** resize_array = new int*[new_size];
    for (int i = 0; i < new_size; i++)
        resize_array[i] = new int[new_size];
 
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            resize_array[i][j] = array[i][j];
        }
    }
    size = new_size;
    delete[] array;
    array = resize_array;
}
0
0 / 0 / 0
Регистрация: 20.03.2019
Сообщений: 12
10.04.2019, 14:28  [ТС] 4
zayats80888, спасибо за помощь, с этим разобралась. Только теперь проблема в другом. Собственно, от нее изначально и пыталась избавиться, меняя размер вектора под указанное число элементов, но дело, видимо, не совсем в этом. Снова исключение, только уже в 33 строке.

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
void resize(int **&array, int& size, int new_size)
{
    if (new_size == size) return;
    if (new_size < size)
    {
        size = new_size;
        return;
    }
    int** resize_array = new int*[new_size];
    for (int i = 0; i < size; i++)
    {
        resize_array[i] = new int[new_size];
        for (int j = 0; j < size; j++)
        {
            resize_array[i][j] = array[i][j];
        }
    }
    size = new_size;
    delete[] array;
    array = resize_array;
}
 
void read_array(int **array, int N)
{
    int temp;
    resize(array, N, N);
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            in >> temp;
            array[i][j] = temp;
        }
    }
}
0
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.04.2019, 14:30 5
vishe_mastila,тот факт, что не существует способа однозначно определить трансформацию измерений многомерного массива задав изменение только общего количества элементов, вас не смущает?
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
10.04.2019, 14:35 6
vishe_mastila, посмотрите код выше, я его исправил (ошибка была), вы с ошибкой взяли.
Покажите main, а то в функции read_array размер массива не изменяется.

Добавлено через 1 минуту

Не по теме:

IGPIGP, ну кому то нравится, когда умножаешь на два, а оно раздувается в четыре раза :)

0
0 / 0 / 0
Регистрация: 20.03.2019
Сообщений: 12
10.04.2019, 14:35  [ТС] 7
zayats80888,
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
int main()
{
    int N;
    in >> N;
    
    int *array_b = new int[N];
    int **array = new int*[N];
 
    read_array(array, N);
 
    //сортировка ниже главной диагонали
    for (int p = 0; p < N - 1; p++)
    {
        int k, i;
        i = p;
 
        for (k = 0; i < N; k++)
        {
            array_b[k] = array[i][i - p];
            i++;
        }
 
        selectionSort(array_b, k);
 
        for (k = 0; i < N; k++)
            array[i][i - p] = array_b[k];
    }
 
    //сортировка выше главной диагонали
    for (int p = 1; p < N - 1; p++)
    {
        int i;
        
        for (i = 0; i < N - p; i++)
            array_b[i] = array[i][i + p];
 
        selectionSort(array_b, N - p);
 
        for (i = 0; i < N - p; i++)
            array[i][i + p] = array_b[i];
    }
 
    out_array(array, N);
 
    delete array;
    in.close();
    out.close();
    return 0;
 
}
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
10.04.2019, 14:46 8
vishe_mastila, прикрутил козе баян:
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
//...
void resize(int **&array, int& size, int new_size)
{
    if (new_size == size) return;
    if (new_size < size)
    {
        size = new_size;
        return;
    }
    int** resize_array = new int*[new_size];
    for (int i = 0; i < new_size; i++)
        resize_array[i] = new int[new_size];
 
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            resize_array[i][j] = array[i][j];
        }
    }
    size = new_size;
    delete[] array;
    array = resize_array;
}
 
void read_array(int **array, int N)
{
    int temp;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            in >> temp;
            array[i][j] = temp;
        }
    }
}
 
int main()
{
    int size, N = 0;
    in >> size;
 
    int *array_b = new int[size];
    int **array = 0;
    resize(array, N, size);
 
    read_array(array, N);
//...
0
0 / 0 / 0
Регистрация: 20.03.2019
Сообщений: 12
10.04.2019, 14:56  [ТС] 9
zayats80888, ясно, в чем ошибка была. Благодарю.
0
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.04.2019, 15:16 10
zayats80888, квадратичная зависимость количества элементов от переданного размера, это конечно сильнее магических чисел. Но даже если уж так. Зачем идти по измерениям старого массива старого массива при копировании? Кто потом будет разбирать как использовать замусоренные огрызки? Плохо не то, что это мутота. Плохо то, что где-то в программе какой-то код должен знать о содеянном. Имхо, лучше подряд старый в новый переписать.
0
zayats80888
10.04.2019, 15:30
  #11

Не по теме:

IGPIGP, я честно говоря вообще не понимаю зачем это автору, раз он весь код не показывает, значит он немаленький, и переписывать его с нуля мне не хотелось бы, потому помог чем смог(не понимая что нужно). Дальше пущай сам копает. :)

0
IGPIGP
10.04.2019, 15:39
  #12

Не по теме:

Цитата Сообщение от zayats80888 Посмотреть сообщение
раз он весь код не показывает, значит он немаленький
не вижу связи этих явлений, так же как и не вижу как размер человека связан с логикой его поступков. Так же, как непонятно, как одним числом выразить ресайз для 2D "массива" в динамической памяти. Для меня, логика важнее самой реализации. То есть, понимание, что прямоугольный или квадратный случай, это частности зубчатого массива, где каждое измерение может иметь свою длину, это не оверхэд. Это то, что позволит задаться вопросом: -"А что значит ресайз для 2D массива? Хорошо ли уменьшать размеры измерений без реалок? И.т.п."

0
Злостный нарушитель
9616 / 5207 / 1187
Регистрация: 12.03.2015
Сообщений: 24,585
10.04.2019, 18:37 13
Не надо так делать. Двумерный динмассив - это одномерный массив указателей. Т.е. данные в памяти располагаются не единым куском, а кусками, каждый из которых начинается с соответствующего адреса, который и содержит каждый из указателей одномерного массива.

Это надо понимать в первую очередь.
---------
А теперь суть задачи: каким должен быть массив после изменения размера?
0
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.04.2019, 19:15 14
Цитата Сообщение от Verevkin Посмотреть сообщение
Не надо так делать.
Делать как?
0
Злостный нарушитель
9616 / 5207 / 1187
Регистрация: 12.03.2015
Сообщений: 24,585
10.04.2019, 19:30 15
Цитата Сообщение от IGPIGP Посмотреть сообщение
Делать как?
Задачу так ставить.
0
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.04.2019, 19:40 16
Цитата Сообщение от Verevkin Посмотреть сообщение
Задачу так ставить.
Опять-таки не понятно, что именно не так. При увеличении размера вона как лихо релокейтятся цепочки на указателях массива указателей. Вроде как тут понятно, что это не один непрерывный кусок. Хаотично оно всё как-то, конечно. Уменьшается массив странно. Копируются данные, - тоже. Но всё это скорее всего потому, что даже задачка с одномерным массивом (вектором недоделанным самодельным) не является такой уж простой, если задуматься о стратегии выделения памяти. Тут тоже могут быть и длина в памяти и размер использованный под хранение... Непонятно зачем изучение и без того не простого вопроса усложнять двухмерностью. А почему не выбрать трехмерный массив двухмерных массивов? Verevkin, в чём я согласен с вами, - задача сыровата, как мне кажется.
0
10.04.2019, 19:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2019, 19:40
Помогаю со студенческими работами здесь

Устранить проблему с видео после установки Ubuntu 16.04 на Virtual Box
Доброго времени суток. Столкнулся с данной проблемой. При установке убунты на виртуалку осле...

Нужно устранить проблему 1603, нужны 2 файла, любой может посодействовать если имеется 32x-разрядная система и джава
1.Нужна папка с правильно установленной джавой C:\Program Files (x86)\Java а также 2 На...

Устранить проблему и зависание на ноутбуке "Fatal error detected failed to execute script starter"
Привет!!!! Помогите ради бога, как устранить проблему &quot;Fatal error detected &quot;&quot;failed to execute...

Исправить проблему с размножающимися элементами ListBox и проблему со сортировкой
Доброго времени суток. Подскажите пожалуйста, кто знает, все нервы уже истрепал с этой сортировкой...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru