0 / 0 / 0
Регистрация: 20.05.2014
Сообщений: 139
1

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

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

Добрый день!
Делаю простое приложение по поиску детерминанта квадратной матрицы. Чтобы искать детерминант матрицы с размерностью больше 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) выкидывает ошибку...

Необработанное исключение в "0x00a78659" в "First.exe": 0xC0000005: Нарушение прав доступа при записи "0x0189f000"
Здравствуйте, вот столкнулся с ошибкой и не могу понять в чем причина, вроде все правильно сделал....

Необработанное исключение в "0x77df15de" в "kursova.exe": 0xC0000005: Нарушение прав доступа при записи "0xcdcdcdd5"
как решить эту проблему? Необработанное исключение в &quot;0x77df15de&quot; в &quot;kursova.exe&quot;: 0xC0000005:...

Необработанное исключение в "0x01082855" в "sort.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc"
Всем привет! помогите мне понять в чём дело. написал программу: #include &quot;stdafx.h&quot; #include...

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

П.С.: В строках 25, 63 должно быть sizeof(int).
Строки 59, 73. Либо ты используешь malloc и free, либо new и delete, смешивать их нельзя.
0
1463 / 1005 / 455
Регистрация: 30.10.2017
Сообщений: 2,793
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
1463 / 1005 / 455
Регистрация: 30.10.2017
Сообщений: 2,793
09.05.2018, 17:03 5
lord_commander, если алгоритм верен, то исправлять не надо. Просто не пытайтесь рассчитывать детерминант у больших матриц. Даже если вы сделаете x64 приложение, где нет ограничения в 2 Гб, то максимум оно сможет посчитать детерминант для матриц размером 11-12, так как с увеличением размера матрицы, объем требуемой памяти растет экспоненциально.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2018, 17:03
Помогаю со студенческими работами здесь

Необработанное исключение в "0x013f2b22" в "123.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfdfd"
Вот функция для удаления столбца: #pragma once #include &lt;iostream&gt; using namespace std; int...

Необработанное исключение в "0x54a2d2e9 (msvcr100d.dll)" в "3.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
#include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;string&gt; #include&lt;stdlib.h&gt; using namespace std; ...

Ошибка: "нарушение прав доступа при записи по адресу"
Помогите не могу понять где ошибка &quot;Вызвано исключение по адресу 0x00C424AC в LAB_6-CCCA.exe:...

Ошибка исполнения "нарушение прав доступа при записи"
Необработанное исключение по адресу 0x1008F71F (ucrtbased.dll) в Lab1.exe: 0xC0000005: нарушение...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru