Konstruktor Problem <Unable to read memory>
Habe ich eine Klasse erstellen Histogramm und Vorgänge, die für diese Klasse. Die Eingabe kann ein-dimensionales array oder ein zweidimensionales array. Das problem erscheint, wenn ich konvertieren Sie das array in eine matrix. Das, was ich bisher ausprobiert habe. Der Fehler ist <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();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier
ersetzen mit
weil
matrix
ist schon eine member-variable. Erstellen Sie eine neue temporäre variable double-Zeiger namensmatrix
und zuweisen von Speicher, anstatt Ihre member-variablematrix
Ein paar Leute die bereits gegeben haben Sie Ratschläge dazu, wie Sie zu beheben einige der Probleme mit diesem code. Ich gebe etwas andere Beratung, die vielleicht auf den ersten Blick ein bisschen brutal durch Vergleich, aber ich werde versuchen zu zeigen, wie es ist ehrlich gesagt eher nützlich als böse.
Ich würde werfen Sie Ihre vorhandenen code mit der möglichen Ausnahme von, was Sie in
main
, und beginnen, mithilfe einerstd::map
. Was Sie jetzt gerade tun, ist im Grunde versuchen, neu zu erstellen, das die Funktionen,std::map
bereits bietet (und auch, wenn Ihr Quellcode korrigiert ist, ist es nicht die Arbeit zu machen sowiestd::map
direkt aus der box).Map, Ihr ganze Programm kommt zu etwas wie diesem:
Wenn Sie wollen, um nahezu die gleiche Schnittstelle wie Ihre
histogram
Klasse zur Verfügung gestellt, es ist ziemlich einfach zu tun-diefor
Schleife geht in den Konstruktor, dercopy
inprint
(undSortMatrix
verschwindet, weil einmap
ist immer sortiert).Indem wir dies tun, ändern Sie die von einer O(N2) Algorithmus eine O(N log N) - Algorithmus. Die Fehler, die andere haben darauf hingewiesen, verschwinden vollständig, da der code, enthalten Sie nicht mehr benötigt wird. Der einzige wirkliche Nachteil, den ich sehen kann ist, dass das Ergebnis wird wahrscheinlich ein bisschen mehr Speicher -- es verwendet eine symmetrische Struktur mit der individuell zugewiesenen Knoten, die wahrscheinlich vorstellen, einen fairen Betrag von Aufwand, der für die Knoten, die enthalten nur 2
int
s (und ein bisschen für Ausgleich). Ich kann mir nicht Recht vorstellen, sich Gedanken über dies, obwohl-lange bevor Sie haben genug Knoten für die Speichernutzung Bedeutung, Sie haben Weg zu viele, um Sie zu präsentieren, um auch nur erwägen, die Vorlage an die Nutzer.@mathematician1975 bereits eine Antwort für das Hauptproblem. Es gibt ein bug im
SortMatrix()
: Sie tauschen die Elemente der ersten Spalte, also nach der Sortierung, die zählt (in der zweiten Spalte) nicht mehr korrekt. Sie einfügen müssenum es arbeiten.