Segmentation fault
-
@Gast++
zu 1.
Bei der einfachen Ereugung mit new braucht man keine Zeigerreferenz. Das brauchst du dann eher wenn du dieses in eine Funktion asulagerst. malloc hat hier eh nichts zu suchen da dort keine Konstruktoren aufgerufen werden. Es sei denn du bastelst dir hier was mit einem placement new zusammen was hier aber gar nicht nötig ist.
zu 3.
Wasc machst das für einen Unterschied ob es eine class oder eine struct ist? Die werden beide gleich behandelt.
-
Braunstein schrieb:
@Gast++
zu 1.
Bei der einfachen Ereugung mit new braucht man keine Zeigerreferenz. Das brauchst du dann eher wenn du dieses in eine Funktion asulagerst.Ja, und der Zeiger um den es geht ist ein formaler Parameter der build Funktion.
Lies bitte mal die Zeilenendkommentare im OP.Braunstein schrieb:
malloc hat hier eh nichts zu suchen da
Das war bereits erklärt worden; hier gings um die Übergabe der Zeigerreferenz.
Braunstein schrieb:
dort keine Konstruktoren aufgerufen werden. Es sei denn du bastelst dir hier was mit einem placement new zusammen was hier aber gar nicht nötig ist.
zu 3.
Wasc machst das für einen Unterschied ob es eine class oder eine struct ist? Die werden beide gleich behandelt.Dann zeig mir doch bitte mal einen "struct-Konstruktor" mit ctor Semantik.

Grüsse
Gast++
-
Gast++ schrieb:
Braunstein schrieb:
dort keine Konstruktoren aufgerufen werden. Es sei denn du bastelst dir hier was mit einem placement new zusammen was hier aber gar nicht nötig ist.
zu 3.
Wasc machst das für einen Unterschied ob es eine class oder eine struct ist? Die werden beide gleich behandelt.Dann zeig mir doch bitte mal einen "struct-Konstruktor" mit ctor Semantik.

Grüsse
Gast++
Aus C++ Sicht gibt es nur einen Unterschied zwischen 'struct' und 'class' - struct-Elemente sind per Default public, class-Elemente private. Ansonsten sind beide völlig identisch.
(insbesondere kann ein struct auch Memberfunktionen, private Member (mußt du explizit angeben) und sogar Ctor'en haben)
-
CStoll schrieb:
Aus C++ Sicht gibt es nur einen Unterschied zwischen 'struct' und 'class' - struct-Elemente sind per Default public, class-Elemente private. Ansonsten sind beide völlig identisch.
(insbesondere kann ein struct auch Memberfunktionen, private Member (mußt du explizit angeben) und sogar Ctor'en haben)Danke für den Hinweis!
Das ändert aber nichts daran dass die freie "build"-Funktion Aufgaben wahrnimmt die gut in einen Konstruktor passen würden.
Auch in einen struct-Konstruktor.Grüsse
Gast++
-
Ich stoere ja nur ungerne euere Fachsimpelei - von der ich btw kein Wort verstanden habe
- aber bezog sich ja auch ein Glueck nicht mehr richtig auf mein Problem.Auf jeden Fall klappt die ganze Sache doch noch nicht so wirklich. Ich habe das gestern mal schnell mit einem kleinen Testprogramm getestet. Einwandfrei funktioniert:
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include"bamatrix.h" int main() { int index = 0; Matrix<int> M(2,2); std::vector<Matrix<int> > Store(index); for(int i = 0; i<4; i++) { M[0][0] = i; M[0][1] = i; M[1][0] = i; M[1][1] = i; Store.push_back(M); } Matrix<int> K(2,2); K = Store[3]; cout << K[1][1] << endl; }Aber sobald ich es in ein groesseres Programm einbaue, bekomme ich beim ausfuehren von
std::vector<Matrix<int> > Store(index);flogende Fehlermeldung (mit der man natuerlich wieder unglaublich viel anfangen kann): *** glibc detected *** malloc(): memory corruption (fast): 0x097d7fa8 ***
-
Der vector-Ctor sollte eigentlich keine Probleme haben. Aber womöglich hast du den Heap schon vor diesem Aufruf zerlegt. Wie sieht denn der Ctor der Klasse Matrix<> aus?
(btw, den Parameter 'index' kannst du auch weglassen -der Default-Ctor legt bereits einen vector mit 0 Elementen an)
PS: Da fehlt übrigens ein '#include <vector>' - und statt der C-Header solltest du ihr C++ Äquivalent (<cxxx> anstelle von <xxx.h>) verwenden.
-
Ersteinmal danke fuer die schnelle Antwort - ich weiss aber leider nicht was ein Ctor ist - sorry
-
Ctor steht für Constructor und Dtor für Destructor,
Gruß Paddy
-
Ok ich bin nicht 100%ig sicher, aber ich wuerde sagen die ersten 2 Zeilen sind der Ctor - zur sicherheit habe ich mal den kompletten public-Bereich kopiert
Matrix(); Matrix( int rows, int cols ); // size rows x cols Matrix ( const Matrix & mat); // copy constructor ~Matrix(); // Assignment const Matrix& operator = (const Matrix & Rmat); // Accessors int numrows( ) const; // number of rows int numcols( ) const; // number of columns const vector<ItemType>& operator[] (int index) const; // Modifiers vector<ItemType>& operator[] (int index); void resize( int newRows, int newCols ); // resizes matrix to // newRows x newColsSieht aber wirklich fast so aus, dass ich davor irgendwas falsch gemacht habe - weil wenn ich die Deklaration einfach an den Anfang des Programms setze hat er keine Probleme mehr damit. Naja ich mache jetzt einfach mal so weiter und hoffe dass es so klappt

Vielen Dank ihr zwei
-
Ja, die ersten drei Zeilen sind die Construktoren deiner Matrix-Klasse. Aber für die Fehlersuche dürfte es hilfreicher sein zu wissen, was sie eigentlich machen (in deinem Programm besonders der zweite -"Matrix(int rows,int cols);").
PS: Sorry für die Verwirrung - das ist die Macht der Gewohnheit

-
Die ersten drei Zeilen sind definitionen von Konstruktoren (Ctor's) und die vierte zeile ist der dtor
-
Naja
Matrix<int> M(x,y)definiert eine Matrix M in meinem Programm mit x Zeilen und y Spalten
P.S. sorry dass ich mich so dumm anstelle - vielleicht haette ich waehrend meinem Studium doch den Java-Kurs machen sollen, dann braeuchte ich nicht von vorne anfangen

-
Lagrange schrieb:
Naja
Matrix<int> M(x,y)definiert eine Matrix M in meinem Programm mit x Zeilen und y Spalten
Und wie?
(Auf gut Deutsch: Zeig doch mal bitte den Funktionsrumpf zu diesem Konstruktor)
-
Sorry, verstehe leider wirklich nicht, was du genau sehen willst. Ich haenge hier nochmal ein komplettes Programm an, was auch funktioniert und die Funktion Matrix benutzt. Sonst wuesste ich leider wirklich nicht, was ich dir noch schicken soll. Ich lade einfach den Header (bamatrix.h - einen Teil davon hast du schon gesehen - das war die Sache mit dem Ctor) und dann definiere ich meine Matrix mit
Matrix<int> M(x,y)Und greife auf die einzelnen Eintraege mit M[a][b] zu.
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include"bamatrix.h" int main() { int index = 0; Matrix<int> M(2,2); std::vector<Matrix<int> > Store(index); for(int i = 0; i<4; i++) { M[0][0] = i; M[0][1] = i; M[1][0] = i; M[1][1] = i; Store.push_back(M); } Matrix<int> K(2,2); K = Store[3]; cout << K[1][1] << endl; }
-
Lagrange schrieb:
...bamatrix.h - einen Teil davon hast du schon gesehen - ...
Ja - aber wir wollen noch mehr davon sehen !

Und zwar genau den Teil, der mit
Matrix<T>::Matrix( int rows, int cols ) {anfängt

Übrigens:
Lagrange schrieb:
...
... int index = 0; std::vector<Matrix<int> > Store(index); ...Das brauchst Du nicht - index ist überflüssig, wenn Du keine vorreservierte Größe möchtest:
... std::vector<Matrix<int> > Store; ...Macht dasselbe.
Gruß,
Simon2.
-
Lagrange schrieb:
Sorry, verstehe leider wirklich nicht, was du genau sehen willst.
Ich würde gerne sehen, was du im Inneren des Konstruktors "Matrix::Matrix(int rows,int cols)" machst.
-
So auch wenn das jetzt ein bischen nach Spam aussieht, aber ich schicke dir jetzt mal das ganze Programm bamatrix.h (das programm ist aber nicht von mir - das war bei meinem Buch zum lernen von C++ dabei)
#ifndef _BAMATRIX_H #define _BAMATRIX_H #include <iostream> #include <cstdlib> #include <vector> using namespace std; template <class ItemType> class Matrix { public: Matrix(); Matrix( int rows, int cols ); // size rows x cols Matrix ( const Matrix & mat); // copy constructor ~Matrix(); // Assignment const Matrix& operator = (const Matrix & Rmat); // Accessors int numrows( ) const; // number of rows int numcols( ) const; // number of columns const vector<ItemType>& operator[] (int index) const; // Modifiers vector<ItemType>& operator[] (int index); void resize( int newRows, int newCols ); // resizes matrix to // newRows x newCols private: int nRows; // # of rows (capacity) int nCols; // # of cols (capacity) vector< vector <ItemType> > Mtrx; // the matrix of items void check_range (int index) const; }; // end Matrix class specification ///////////////////////////// Matrix class implementation template <class ItemType> Matrix<ItemType>::Matrix() : nRows(0), nCols(0), Mtrx(0) { } template <class ItemType> Matrix<ItemType>::Matrix( int rows, int cols ) : nRows(rows), nCols(cols), Mtrx(rows) { for (int r=0; r<nRows; r++) Mtrx[r].resize(cols); } template <class itemType> Matrix<itemType>::Matrix(const Matrix<itemType> & mat) : nRows(mat.nRows), nCols(mat.nCols), Mtrx(mat.nRows) { // copy rows for(int i = 0; i < nRows; i++) Mtrx[i] = mat.Mtrx[i]; } template <class ItemType> Matrix<ItemType>::~Matrix() { /* defaults to Vector destructor! */ } template <class itemType> const Matrix<itemType> & Matrix<itemType>::operator = (const Matrix<itemType> & Rmat) { if (this != &Rmat) // don't assign to self! { Mtrx.resize(Rmat.nRows); // resize to proper # of rows nRows = Rmat.nRows; // set dimensions nCols = Rmat.nCols; // copy rows for(int i=0; i < nRows; i++) { Mtrx[i] = Rmat.Mtrx[i]; } } return *this; } template <class ItemType> vector<ItemType>& Matrix<ItemType>::operator[] (int index) { check_range(index); return Mtrx[index]; } template <class ItemType> void Matrix<ItemType>::resize(int newRows, int newCols) { Mtrx.resize(newRows); for(int r=0; r < newRows; r++) Mtrx[r].resize(newCols); nRows = newRows; nCols = newCols; } template <class ItemType> int Matrix<ItemType>::numrows( ) const { return nRows; } template <class ItemType> int Matrix<ItemType>::numcols( ) const { return nCols; } template <class ItemType> const vector<ItemType>& Matrix<ItemType>::operator[] (int index) const { check_range(index); return Mtrx[index]; } template <class ItemType> void Matrix<ItemType>::check_range (int index) const { if (index < 0 || index >= nRows ) { cerr << "\n***ERROR: index [" << index << "] out of range (" << 0 << ".." << (nRows-1) << ")\n"; exit(1); } } #endif
-
Hi,
also ich habe das Teil mal importiert und muss sagen: Bei mir compiliert und läuft das tadellos ! (habe den gcc)
Allerdings habe ich die überflüssigen C-Header weggelassen - das sollte aber eigentlich keinen Segfault erzeugen/verhindern.
Das ist natürlich ein schwacher Trost und auch eine schwache Aussage. Es könnte sein, dass bei mir undefiniertes Verhalten nicht negativ auffällt, aber ich sehe so auf die Schnelle eigentlich nichts, was falsch oder seltsam aussieht.
Gruß,
Simon2.
-
mmh wie gesagt, solange ich es in einem kleinen Programm laufen lassen, funktioniert es auch einwandfrei, aber sobald ich es in meinem eigentlichen Program laufen lasse - ist dann schon etwas umfangreicher - produziert er den obengenannten error. Aergerlich - trotzdem vielen vielen Dank fuer die Muehe die du dir mit mir gegeben hast - ich bin auf jeden Fall ein ganzes Stueckchen durch dich weiter gekommen
-
Lagrange schrieb:
...sobald ich es in meinem eigentlichen Program laufen lasse - ist dann schon etwas umfangreicher - produziert er den obengenannten error....

Also ehrlich gesagt, komme ich mir ein wenig verhonepiepelt vor - Du präsentierst uns ein absolut fehlerfrei laufendes Programm und wir sollen Dir sagen, wodurch den Fehler in einem anderen Programm von Dir stammt ?Ich würde Dir Debugging ans Herz legen: Versuche rauszubekommen, in welchem Programmteil der Fehler kommt und dann versuchen, das Programm soweit abzustrippen, dass es zwar den Fehler noch produziert, es aber übersichtlich ist.
Meine Vermutung: Beim resize() (oder anlegen) ist eine Variable nicht initialisiert, weswegen vector angewiesen wird, 868787658658239879234 Bytes Speicher anzufordern....
Aber Genaueres kann man nur mit dem Code (der den Fehler produziert und trotzdem überschaubar ist) sagen.Gruß,
Simon2.