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

Чтение памяти не возможно - C++

Восстановить пароль Регистрация
 
wazler
2 / 2 / 0
Регистрация: 04.12.2011
Сообщений: 119
18.12.2013, 14:52     Чтение памяти не возможно #1
Начал изучаться ООП получил лабораторную, программа заупускается и на вводе размерности матрицы появляется ошибка. Табличка которая выходит после ввода размерности приложена.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <locale>
using namespace std;
 
 
class Matrix
{
private:
    float **Value;
    int n;
    
public:
    Matrix(int n)//конструктор1
    {
         float **Value = new float*[n];
        for (int i = 0; i < n; i++)
        for (int j = 0; i < n; i++)
        {
            Value[i] = new float[n];
            Value[j] = new float[n];
        }
    }
    ~Matrix() //деструктор1
    {
        for (int i = 0; i < n; i++)
        for (int j = 0; i < n; i++)
        {
            delete[](Value[i]);
            delete[](Value[j]);
        }
        delete[](Value);
    }
    Matrix()//конструктор2
    {
    }
    void Create_Matrix(); // функция заполнения матрицы случайными числами
    void Print_Matrix(); // функция распечатки матрицы
    Matrix operator+(const Matrix &matrix); //оператор сложения матриц (перегрузка операторов)
 
};
 
void Matrix::Create_Matrix() //заполняем матрицу случайными числами
{
    cout << "Введите размерность матрицы: ";
    cin >> n;
    for (int i = 0; i < n; i++) //Цикл по строкам
    for (int j = 0; j < n; j++) //по столбцам
        Value[i][j] = rand() % 10; //Задаем случайные значения от 0 до 10
}
 
void Matrix::Print_Matrix() //Печатаем матрицу
{
    cout << "_____________\n";
    for (int i = 0; i < n; i++) //Цикл по строкам
    {
        for (int j = 0; j < n; j++) //По столбцам
        {
            cout.width(4); //Устанавливаем ширину между выводом текущего значения 
            cout << Value[i][j]; //Выводим текущее значение
        }
        cout << "\n"; //Переносим вывод на новую строчку (для красоты)
    }
    cout << "____________\n";
}
 
Matrix Matrix::operator+ (const Matrix &matrix) //Оператор сложения
{
    Matrix temp(*this); //Создаем матрицу temp
    for (int i = 0; i <n; i++)
    for (int j = 0; j <n; j++)
        temp.Value[i][j] = Value[i][j] + matrix.Value[i][j]; //Запоминаем в матрице temp сумму двух других матриц
    return temp; //Возвращаем матрицу temp
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    Matrix a, b, c; //Объявляем матрицы a,b,c
    a.Create_Matrix(); //Заполняем случайными числами матрицу a
    cout << "Matrix A: " << endl;
    a.Print_Matrix(); //Печатаем
    b.Create_Matrix(); //Заполняем случайными числами матрицу b
    cout << "Matrix B: " << endl;
    b.Print_Matrix(); //Печатаем
    c = a + b; // Складываем матрицы a и b
    cout << "Matrix A+B: " << endl;
    c.Print_Matrix(); //Печатаем матрицу c
    system("pause");
}
делал ШАГ С ОБХОДОМ.
указал на неполадки этой строки
C++
1
        Value[i][j] = rand() % 10; //Задаем случайные значения от 0 до 10
Вот такая задача, помогите разобраться и понять
Миниатюры
Чтение памяти не возможно   Чтение памяти не возможно  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.12.2013, 15:18     Чтение памяти не возможно #2
wazler, присмотритесь к циклам в конструкторе и деструкторе. В конструкторе к тому же используется локальная Value.
wazler
2 / 2 / 0
Регистрация: 04.12.2011
Сообщений: 119
18.12.2013, 16:05  [ТС]     Чтение памяти не возможно #3
Цитата Сообщение от Tulosba Посмотреть сообщение
wazler, присмотритесь к циклам в конструкторе и деструкторе. В конструкторе к тому же используется локальная Value.
все так же только красное выделение после ошибки исчезла. Можете какой нибудь пример дать?????
С Value я не совсем понял...
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,551
18.12.2013, 17:13     Чтение памяти не возможно #4
Цитата Сообщение от wazler Посмотреть сообщение
C++
1
2
Matrix a, b, c; //Объявляем матрицы a,b,c
 a.Create_Matrix(); //Заполняем случайными числами матрицу a
Для матриц a, b, c был использован конструктор2 Matrix(). n и Value у них не определены.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.12.2013, 17:40     Чтение памяти не возможно #5
C++
1
2
3
4
5
6
7
8
9
10
Matrix(int n)//конструктор1
    {
         float **Value = new float*[n]; // Value - локальная переменная. Не член класса.
        for (int i = 0; i < n; i++)
        for (int j = 0; i < n; i++)
        {
            Value[i] = new float[n]; // Локальная переменная
            Value[j] = new float[n]; // Локальная переменная
        }
    }
Ну и, как я уже говорил, совершенно нелепый цикл. Более правильный конструктор:
C++
1
2
3
4
5
6
7
8
explicit Matrix(int n)
    {
         Value = new float*[n]; // Value - член-класса. 
        for (int i = 0; i < n; i++)
        {
            Value[i] = new float[n]; 
        }
    }
И конечно, конструктор по умолчанию не должен быть пустым, как уже сказал Alex5.
wazler
2 / 2 / 0
Регистрация: 04.12.2011
Сообщений: 119
18.12.2013, 21:12  [ТС]     Чтение памяти не возможно #6
Цитата Сообщение от Tulosba Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
Matrix(int n)//конструктор1
    {
         float **Value = new float*[n]; // Value - локальная переменная. Не член класса.
        for (int i = 0; i < n; i++)
        for (int j = 0; i < n; i++)
        {
            Value[i] = new float[n]; // Локальная переменная
            Value[j] = new float[n]; // Локальная переменная
        }
    }
Ну и, как я уже говорил, совершенно нелепый цикл. Более правильный конструктор:
C++
1
2
3
4
5
6
7
8
explicit Matrix(int n)
    {
         Value = new float*[n]; // Value - член-класса. 
        for (int i = 0; i < n; i++)
        {
            Value[i] = new float[n]; 
        }
    }
И конечно, конструктор по умолчанию не должен быть пустым, как уже сказал Alex5.

так нужно было сделать? если так то у меня все равно указывает на строку
C++
1
Value[i][j] = rand() % 10; //Задаем случайные значения от 0 до 10
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <locale>
using namespace std;
 
 
class Matrix
{
private:
    float **Value;
    int n;
    
public:
    explicit Matrix(int n) //конструктор1
    {
        Value = new float*[n]; // Value - член-класса. 
        for (int i = 0; i < n; i++)
        {
            Value[i] = new float[n];
        }
    }
    Matrix()//констурктор2
    {
            Value = new float*[n]; // Value - член-класса. 
            for (int i = 0; i < n; i++)
            {
                Value[i] = new float[n];
            }
        }
    ~Matrix() //деструктор1
    {
        for (int i = 0; i < n; i++)
        {
            delete[](Value[i]);
        }
        delete[](Value);
    }
    void Create_Matrix(); // функция заполнения матрицы случайными числами
    void Print_Matrix(); // функция распечатки матрицы
    Matrix operator+(const Matrix &matrix); //оператор сложения матриц (перегрузка операторов)
 
};
 
void Matrix::Create_Matrix() //заполненяем матрицу случайными числами
{
    cout << "Введите размерность матрицы: ";
    cin >> n;
    for (int i = 0; i < n; i++) //Цикл по строкам
    for (int j = 0; j < n; j++) //по столбцам
        Value[i][j] = rand() % 10; //Задаем случайные значения от 0 до 10
}
 
void Matrix::Print_Matrix() //Печатаем матрицу
{
    cout << "______________\n";
    for (int i = 0; i < n; i++) //Цикл по строкам
    {
        for (int j = 0; j < n; j++) //По столбцам
        {
            cout.width(4); //Устанавливаем ширину между выводом текущего значения 
            cout << Value[i][j]; //Выводим текущее значение
        }
        cout << "\n"; //Переносим вывод на новую строчку (для красоты)
    }
    cout << "_____________\n";
}
 
Matrix Matrix::operator+ (const Matrix &matrix) //Оператор сложения
{
    Matrix temp(*this); //Создаем матрицу temp
    for (int i = 0; i <n; i++)
    for (int j = 0; j <n; j++)
        temp.Value[i][j] = Value[i][j] + matrix.Value[i][j]; //Запоминаем в матрице temp сумму двух других матриц
    return temp; //Возвращаем матрицу temp
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    Matrix a, b, c; //Объявляем матрицы a,b,c
    a.Create_Matrix(); //Заполняем случайными числами матрицу a
    cout << "Matrix A: " << endl;
    a.Print_Matrix(); //Печатаем
    b.Create_Matrix(); //Заполняем случайными числами матрицу b
    cout << "Matrix B: " << endl;
    b.Print_Matrix(); //Печатаем
    c = a + b; // Складываем матрицы a и b
    cout << "Matrix A+B: " << endl;
    c.Print_Matrix(); //Печатаем матрицу c
    system("pause");
}
Yandex
Объявления
18.12.2013, 21:12     Чтение памяти не возможно
Ответ Создать тему
Опции темы

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