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

ошибка в программе. - C++

Восстановить пароль Регистрация
 
dellink
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 48
08.03.2012, 20:15     ошибка в программе. #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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <conio.h>
 
using namespace std;
 
template <class T>
class MYArray {
    private:
        T** arr; // положительные числа
        int row, cd;
    public:
        MYArray(int,int);
        ~ MYArray(void);
        int get_row() const; 
        int get_col() const;
        int set_Element(int,int,T);
        T get_Element(int,int) const;
        void show() const;
};
 
template <class T> MYArray<T>::MYArray(int N, int M)  // описание конструктора класса
{
    if(N<0 || M<0)
    {
        cout << "Неправильные размеры матрицы!!!\n";
        exit(1);
    }
    row = N;
    cd = M;
    arr = new T*[row];
    for(int i=0; i<row; i++)
        arr[i] = new T[cd];
}
 
template <class T> MYArray<T>::~MYArray() { delete []arr; } // описание деструктора класса
 
template <class T> int MYArray<T>::get_row() const { return row; }
 
template <class T> int MYArray<T>::get_col() const { return cd; }
 
template <class T> int MYArray<T>::set_Element(int i,int j,T value)
{
    if(value >= 0 && i < row && j < cd)
    {
        arr[i][j] = value;
        return 1;
    }
    return 0;
}
 
template <class T> T MYArray<T>::get_Element(int i,int j) const
{
    if(i<row && i>=0 && j<cd && j>=0)
    {
        return arr[i][j];
    }
    cout << "Неправильные значения индексов матрицы\n";
    return 0;   
}
 
template <class T> void MYArray<T>::show() const 
{
    for(int i=0; i<row; i++)
    {
        for(int j=0; j<cd; j++)
        {
            cout << get_Element(i,j) << "   ";
        }
        cout << endl;
    }
}
 
float Srednee(MYArray<int> obj)
{
    int s=0;
    float sr;
    for (int i=0; i<obj.get_row(); i++)
        for (int j=0; j<obj.get_col(); j++)
            s += obj.get_Element(i,j);
    int n = obj.get_row();
    int k = obj.get_col();
    sr = s/(n*k);
    return sr;
}
 
void main(void)
{
    setlocale(LC_ALL,"Russian");
    int N, M;
    cout << "Введите количество строк\t";
    cin >> N;
    cout << "Введите количество столбцов\t";
    cin >> M;
    MYArray<int> obj(N,M);
    for (int i=0; i<obj.get_row(); i++)
        for (int j=0; j<obj.get_col(); j++) 
        {
            cout << "[" << i << "][" << j << "]=";
            cin >> N;
            int res = obj.set_Element(i,j,N);
            // дописать проверку вызова функции переустановки значения в матрице
        }
    cout << "Среднее = " << Srednee(obj) << endl;
    cout << "Содержание матрицы:\n";
    obj.show();
    _getch();
}
Ошибка появилась после добавления функции Srednee(obj), без нее все работает замечательно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2012, 20:15     ошибка в программе.
Посмотрите здесь:

C++ Ошибка в программе!
C++ ошибка в программе
C++ Ошибка в программе
C++ Ошибка в программе
Ошибка в программе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.03.2012, 21:00     ошибка в программе. #2
Нет копирующего конструктора. И деструктор неправильно сделан.
dellink
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 48
08.03.2012, 21:21  [ТС]     ошибка в программе. #3
Цитата Сообщение от soon Посмотреть сообщение
Нет копирующего конструктора. И деструктор неправильно сделан.
извините...а можно подробнее
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.03.2012, 21:24     ошибка в программе. #4
Цитата Сообщение от soon Посмотреть сообщение
Нет копирующего конструктора.
В функцию Srednee передается копия объекта => нужен копирующий конструктор. Либо передавать по ссылке.

Цитата Сообщение от soon Посмотреть сообщение
И деструктор неправильно сделан.
Память выделяли через цикл, освобождать, соответсвенно, тоже нужно для каждой строки.
dellink
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 48
08.03.2012, 22:37  [ТС]     ошибка в программе. #5
Цитата Сообщение от soon Посмотреть сообщение
Память выделяли через цикл, освобождать, соответсвенно, тоже нужно для каждой строки.
C++
1
2
3
4
5
template <class T> MYArray<T>::~MYArray() // описание деструктора класса
{
    for(int i=0; i<row; i++)
        delete []arr[i]; 
}
вот так?

и мне не совсем понятно как передать по ссылке объект в функцию...
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.03.2012, 23:31     ошибка в программе. #6
Цитата Сообщение от dellink Посмотреть сообщение
вот так?
Нет, пямять-то не только под строки выделена

Цитата Сообщение от dellink Посмотреть сообщение
и мне не совсем понятно как передать по ссылке объект в функцию...
C++
1
void func(int& a)
Ну и конструктор на всякий случай напишу, сами выберете, что по душе. Но по ссылке лучше
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo
{
    int _a;
 
public:
    Foo(): _a(3)
    {
        std::cout << "default constructor" << std::endl;
    }
 
    Foo(const Foo& f): _a(f._a)
    {
        std::cout << "copy constructor" << std::endl;
    }
};
dellink
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 48
09.03.2012, 12:55  [ТС]     ошибка в программе. #7
Цитата Сообщение от soon Посмотреть сообщение
Нет, пямять-то не только под строки выделена
Как я понимаю нужно повторить цикл аналогичный тому, который был в конструкторе?

И еще можно вопросик. Нужно добавить функцию проверки установки значения элемента матрицы, если введено отрицательное цисло выводить сообщение и производить повторный ввод элемента (под это функия Set_Element возвращает 0). Как лучше всего это сделать? При помощи do while, while или есть что-то получше? Спасибо за помощь.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.03.2012, 13:10     ошибка в программе. #8
Цитата Сообщение от dellink Посмотреть сообщение
Как я понимаю нужно повторить цикл аналогичный тому, который был в конструкторе?
Да

Цитата Сообщение от dellink Посмотреть сообщение
И еще можно вопросик. Нужно добавить функцию проверки установки значения элемента матрицы, если введено отрицательное цисло выводить сообщение и производить повторный ввод элемента (под это функия Set_Element возвращает 0). Как лучше всего это сделать? При помощи do while, while или есть что-то получше? Спасибо за помощь.
Можно кинуть исключение. Можно просто вывести в std::cerr предупреждение.
dellink
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 48
09.03.2012, 13:20  [ТС]     ошибка в программе. #9
C++
1
2
3
4
5
template <class T> MYArray<T>::~MYArray() // описание деструктора класса
{
    for(int i=0; i<row; i++)
        delete []arr[i]; 
}
Я не совсем понимаю почему так не правильно...мы же удаляем сразу массив строки и все столбцы в нем разве не удалятся автоматически?

Добавлено через 2 минуты
Цитата Сообщение от soon Посмотреть сообщение
Можно кинуть исключение. Можно просто вывести в std::cerr предупреждение.
Только если сделать исключения у меня не будет вызова повтора ввода.
Сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
cout << "[" << i << "][" << j << "]=";
            cin >> N;
            int res = obj.set_Element(i,j,N);
            // дописать проверку вызова функции переустановки значения в матрице
            while(res==0)
            {
                cout << "Вводимые данные неверны" << endl;
                cout << "[" << i << "][" << j << "]=";
                cin >> N;
                res = obj.set_Element(i,j,N);
            }
правда не нравится мне то, что пришлось повторять часть кода, но по другому не знаю как сделать.
По заданию было так:
C++
1
2
3
cin >> N;
            int res = obj.set_Element(i,j,N);
            // дописать проверку вызова функции переустановки значения в матрице
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
09.03.2012, 13:25     ошибка в программе. #10
Цитата Сообщение от dellink Посмотреть сообщение
arr = new T*[row]; for(int i=0; i<row; i++) arr[i] = new T[cd];
удалять также, а вы удаляете только столбцы, строки кто будет удалять?
добавьте delete [] arr;
dellink
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 48
09.03.2012, 13:32  [ТС]     ошибка в программе. #11
Цитата Сообщение от panicwassano Посмотреть сообщение
удалять также, а вы удаляете только столбцы, строки кто будет удалять?
добавьте delete [] arr;
C++
1
2
3
4
5
6
template <class T> MYArray<T>::~MYArray() // описание деструктора класса
{
    for(int i=0; i<row; i++)
        delete []arr[i]; 
    delete [] arr;
}
вот так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2012, 15:46     ошибка в программе.
Еще ссылки по теме:

ошибка в программе C++
Ошибка в программе C++
Ошибка в программе C++

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

Или воспользуйтесь поиском по форуму:
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
09.03.2012, 15:46     ошибка в программе. #12
именно
Yandex
Объявления
09.03.2012, 15:46     ошибка в программе.
Ответ Создать тему
Опции темы

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