Ошибка конструктора & lt; Невозможно прочитать память & gt;

Я должен создать гистограмму класса и сделать операции над этим классом. Входными данными могут быть одномерный массив или двумерный массив. Проблема появляется, когда я преобразовываю массив в матрицу. Это то, что я пробовал до сих пор. Ошибка <Unable to read memory>

histrogram.h

#ifndef HISTOGRAM_H
#define HISTOGRAM_H
#include<iostream>
class Histogram
{
private:
int** matrix;
int lines;
void SortMatrix();
public:
Histogram(){ }
Histogram(int elements[], int elementsNr);
Histogram(int** m, int l);
void Print();
};
#endif

historgram.cpp

#include"histogram.h"using namespace std;
Histogram::Histogram(int** m, int l)
{
matrix=m;
lines=l;
SortMatrix();
}

Histogram::Histogram(int elements[], int elementsNr)
{
lines=0;
//initialize matrix : elementrNr lines and 2 columns
int** matrix=new int*[elementsNr];
for(int i=0;i<elementsNr;i++)
{
matrix[i]=new int[2];
matrix[i][0]=INT_MIN;
matrix[i][1]=INT_MIN;
}
//search each element from the array in the matrix
bool found=false;
for(int i=0;i<elementsNr;i++)
{
found=false;
for(int j=0;j<elementsNr;j++)
{
//the element was found in the matrix ( on the first column )
if(matrix[j][0] == elements[i])
{
matrix[j][1]++;
found=true;
break;
}
}
if(!found)
{
matrix[lines][0]=elements[i];
matrix[lines][1]=1;
lines++;
}
}
SortMatrix();
}
void Histogram::SortMatrix()
{
bool flag=true;
int temp;
for(int i=0;(i<lines) && flag;i++)
{
flag=false;
if(matrix[i+1][0]>matrix[i][0])
{
temp=matrix[i][0];
matrix[i][0]=matrix[i+1][0];
matrix[i+1][0]=temp;
flag=true;
}
}
}
void Histogram::Print()
{

for(int i=0;i<lines;i++)
{
cout<<matrix[i][0]<<" : " <<matrix[i][1]<<endl;
}

}

main.cpp

#include"histogram.h"#include<iostream>
using namespace std;

int main()
{
int arr[]={6,7,3,1,3,2,4,4,7,5,1,1,5,6,6,4,5};
Histogram h(arr,17);
h.Print();
}

1

Решение

Вот

int** matrix=new int*[elementsNr];

заменить

matrix=new int*[elementsNr];

так какmatrix уже является переменной-членом. Вы создаете новую временную переменную с двойным указателем с именем matrix и выделение памяти для него, а не вашей переменной-члена matrix

8

Другие решения

Несколько человек уже дали вам совет о том, как исправить некоторые проблемы с этим кодом. Я дам несколько другой совет, который поначалу может показаться немного грубым по сравнению с ним, но я постараюсь показать, насколько это честно полезно, а не противно.

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

Используя карту, ваш все Программа выходит примерно так:

std::ostream &operator<<(std::ostream &os, std::pair<int, int> const &d) {
return os << d.first << " : " << d.second;
}

int main() {
std::map<int, int> h;

for (int i=0; i<17; i++)
++h[arr[i]];

std::copy(h.begin(), h.end(),
std::ostream_iterator<std::pair<int, int> >(std::cout, "\n"));
return 0;
}

Если вы хотите сохранить практически тот же интерфейс, что и ваш histogram класс обеспечен, это довольно легко сделать — for цикл переходит в конструктор, copy в print (а также SortMatrix исчезает, потому что map всегда сортируется).

Делая это, вы переходите от O (N2) алгоритм к алгоритму O (N log N). Ошибки, на которые указывали другие, полностью исчезают, потому что код, содержащий их, больше не нужен. Единственный реальный недостаток, который я вижу, это то, что результат будут вероятно, использовать немного больше памяти — он использует сбалансированное дерево с индивидуально выделенными узлами, что, вероятно, приведет к значительному увеличению издержек для узлов, которые содержат только 2 intс (и немного для балансировки). Я не могу себе представить, что беспокоюсь об этом — задолго до того, как у вас будет достаточно узлов, чтобы использование памяти стало значительным, у вас есть путь слишком много, чтобы представить, чтобы даже подумать о представлении пользователю.

3

@ mathematician1975 уже предоставил ответ на основную проблему. Есть еще одна ошибка в SortMatrix(): вы меняете только элементы первого столбца, поэтому после сортировки значения (во втором столбце) больше не будут правильными. Вам придется вставить

temp=matrix[i][1];
matrix[i][1]=matrix[i+1][1];
matrix[i+1][1]=temp;

чтобы это заработало.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector