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

Ошибка "Нарушение доступа для записи" при выделение памяти для поиска детерминанта квадратной матрицы

08.05.2018, 23:54. Показов 708. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Делаю простое приложение по поиску детерминанта квадратной матрицы. Чтобы искать детерминант матрицы с размерностью больше 10 - выделяю память массиву, хранящему матрицу.
Но после этого возникает ошибка
Вызвано исключение: нарушение доступа для записи.p было 0x1110112.
С чем может быть связана данная ошибка и почему?

Вот код:
Кликните здесь для просмотра всего текста
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "stdafx.h"
#include <iostream>
#include <time.h>
using namespace std;
 
void GetMatr(int **mas, int **p, int i, int j, int m) {
    int ki, kj, di, dj;
    di = 0;
    for (ki = 0; ki<m - 1; ki++) {
        if (ki == i) di = 1;
        dj = 0;
        for (kj = 0; kj<m - 1; kj++) {
            if (kj == j) dj = 1;
            p[ki][kj] = mas[ki + di][kj + dj];
        }
    }
}
 
int Determinant(int **mas, int m) {
    int i, j, d, k, n;
    int **p;
    p = (int**)malloc(sizeof(int*)*m); 
    
    for (i = 0; i<m; i++)
        p[i] = (int*)malloc(sizeof(int*)*m);//Ошибка возникает здесь
 
    j = 0; 
    d = 0;
    k = 1;
    n = m - 1;
    if (m<1) cout << "Can not find determinant!";
    if (m == 1) {
        d = mas[0][0];
        return(d);
    }
    if (m == 2) {
        d = mas[0][0] * mas[1][1] - (mas[1][0] * mas[0][1]);
        return(d);
    }
    if (m>2) {
        for (i = 0; i<m; i++) {
            GetMatr(mas, p, i, 0, m);
            d = d + k * mas[i][0] * Determinant(p, n);
            k = -k;
        }
    }
    return(d);
}
 
int main(int argc, _TCHAR* argv[])
{
    int m, i, j, d;
    
    system("chcp 1251");
    system("cls");
    cout << "Matrix size: ";
    cin >> m;
    int **mas;
    mas = new int*[m];
 
    mas = (int**)malloc(sizeof(int*)*m);
    for (i = 0; i<m; i++) {
        mas[i] = (int*)malloc(sizeof(int*)*m);
        for (j = 0; j<m; j++) {
            mas[i][j] = rand() % 10;
        }
    }
 
    d = Determinant(mas, m);
    cout << "Determinant = " << d;
    cout << " runtime = " << clock() / 1000.0 << endl;
    cin.get(); cin.get();
    free(mas);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2018, 23:54
Ответы с готовыми решениями:

Ошибка при вводе массива: "Вызвано исключение: нарушение доступа для записи"
Здравствуйте, имеется вот такая программа, при вводе третьего массива(Массив B) выкидывает ошибку...

Ошибка: Вызвано исключение: нарушение доступа для записи. this было 0xF1EAE5EB
Помогите пожалуйста. При запуске вылетает и открывается файл xutilyti. Там выскакивает ошибка...

Ошибка: вызвано исключение: нарушение доступа для записи. c.text было 0x1110112
вот такая вот ошибка: Вызвано исключение: нарушение доступа для записи. c.text было...

Динамическое выделение памяти, ошибка при записи
ошибка на второй итерации, нарушение прав доступа при записи. int input=1; int size = 1;...

Ошибка:нарушение прав доступа при записи по адресу
Помогите понять в чём ошибка. Моя программа должна заменять числа из шестнадцатиричной системы...

4
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
09.05.2018, 01:52 2
Цитата Сообщение от lord_commander Посмотреть сообщение
С чем может быть связана данная ошибка
Пишешь мимо выделенной памяти.
Цитата Сообщение от lord_commander Посмотреть сообщение
почему?
А какое m ты вводишь?

П.С.: В строках 25, 63 должно быть sizeof(int).
Строки 59, 73. Либо ты используешь malloc и free, либо new и delete, смешивать их нельзя.
0
1468 / 1009 / 456
Регистрация: 30.10.2017
Сообщений: 2,800
09.05.2018, 02:14 3
При расчете детерминанта в матрице размерностью выше 10, требуется более 2 Гб памяти, что и вызывает ошибку. Проверьте алгоритм рассчета, действительно ли он должен кушать столько памяти.

Добавлено через 16 минут
Еще не забывайте очищать память по окончанию функций, а именно в цикле по mas[i] и p[i], а так же сам p.
0
0 / 0 / 0
Регистрация: 20.05.2014
Сообщений: 139
09.05.2018, 16:55  [ТС] 4
А какое m ты вводишь?
Если m ввожу меньше 10 - считает все корректно, если больше 10: 11, 15, 20 и пр - возникает ошибка

Добавлено через 5 часов 51 минуту
При расчете детерминанта в матрице размерностью выше 10, требуется более 2 Гб памяти, что и вызывает ошибку.
А каким образом можно выделить для расчета эти 2 Гб? Или никак и надо исправлять алгоритм?
0
1468 / 1009 / 456
Регистрация: 30.10.2017
Сообщений: 2,800
09.05.2018, 17:03 5
lord_commander, если алгоритм верен, то исправлять не надо. Просто не пытайтесь рассчитывать детерминант у больших матриц. Даже если вы сделаете x64 приложение, где нет ограничения в 2 Гб, то максимум оно сможет посчитать детерминант для матриц размером 11-12, так как с увеличением размера матрицы, объем требуемой памяти растет экспоненциально.
0
09.05.2018, 17:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2018, 17:03
Помогаю со студенческими работами здесь

Ошибка: нарушение прав доступа при записи по адресу
Надо написать следующую программу: дан символьный массив из 101 элемента. По спецификации %s...

Ошибка при использовании openfilename: Нарушение прав доступа при записи по адресу
Здравствуйте, подскажите: При использовании кода (слева), после выбора файла, возникает ошибка...

Ошибка при написании калькулятора: нарушение прав доступа при записи по адресу
Всем привет! Первый раз пишу программу и встретился с ошибкой в файле MyForm.cpp в исходном...

Strcpy ошибка нарушение прав доступа при записи по адресу
Собственно, при выполнении программы вылетает следующее сообщение (скрин во вложении). Помогите,...

Ошибка 0xC0000005: нарушение прав доступа при записи по адресу 0x0139D000
#include &lt;iostream&gt; #include &lt;time.h&gt; using namespace::std; void SimpleInsertSort(int, int,...

Ошибка 0xC0000005: нарушение прав доступа при записи по адресу 0x00000000
Добрый день, я пытаюсь сделать так чтобы данные из файла .txt записались в структу и вывелись в...


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

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