Anfängerproblem: Initialisierung
-
Hallo,
ich versuche gerade mich in C++ einzuarbeiten - habe bisher
vorwiegend mit Java gearbeitet.
Nun bin ich auf ein Problem beim initialisieren von Objekten gestoßen, wie
der Output des folgenden Minimalbeispiels zeigt:#include <iostream> using namespace std; class Matrix { private: double **matrix; unsigned cols; unsigned rows; Matrix() : matrix(0), cols(0), rows(0) { } public: Matrix(unsigned Rows, unsigned Cols, double ar[]) : cols(Cols), rows(Rows) { matrix = new double *[cols]; int iter = 0; for (unsigned i = 0; i < rows; i++) { matrix[i] = new double[rows]; for (unsigned j = 0; j < cols; j++) { matrix[i][j] = ar[iter]; cout << "matrix[" << i << "][" << j << "]= " << matrix[i][j] << endl; iter++; } } } friend ostream & operator<<(ostream & s, const Matrix & M) { unsigned row = M.rows; unsigned col = M.cols; for (unsigned i = 0; i < row; i++) for (unsigned j = 0; j < col; j++) { s << "M(" << i << "," << j << ")= " << M.matrix[i][j] << endl; } return s; } }; int main() { const int arLength = 12; double ar[arLength] = { 1,2, 3,4, 5,6 }; Matrix m1(2, 3, ar); cout << m1; }liefert den Output:
`
matrix[0][0]= 1
matrix[0][1]= 2
matrix[0][2]= 3
matrix[1][0]= 4
matrix[1][1]= 5
matrix[1][2]= 6
M(0,0)= 1
M(0,1)= 2
M(0,2)= 5.30499e-313
M(1,0)= 4
M(1,1)= 5
M(1,2)= 6
`
Würde mich sehr freuen, wenn mir jemand weiterhelfen könnte!
Da ich mit C++ noch nicht so vertraut bin, bin ich auch
sehr dankbar für stilistische Verbesserungsvorschläge.
-
du gibst irgendwie gar keinen Datentyp an?
unsigned row, unsigned col, etc...
Oder ist das implizit int in C++?Selbst falls das stimmt ist es schlechter Stil.
-
Du hast bei der Speicherallokation "rows" und "cols" vertauscht:
matrix = new double *[rows]; // hier stand cols int iter = 0; for (unsigned i = 0; i < rows; i++) { matrix[i] = new double[cols]; // hier stand rows for (unsigned j = 0; j < cols; j++) ...Für eine Matrix-Klasse solltest du dir auch mal std::vector<> (#include <vector>) ansehen.
P.S. "unsigned" ist schon so in Ordnung ("int" ist ja Standard).
-
Th69 schrieb:
P.S. "unsigned" ist schon so in Ordnung ("int" ist ja Standard).
Nach dem alten C-Standard vielleicht. Aber nicht in C++.
EDIT: Das ist Unsinn. Bitte ignorieren

-
MFK schrieb:
Th69 schrieb:
P.S. "unsigned" ist schon so in Ordnung ("int" ist ja Standard).
Nach dem alten C-Standard vielleicht. Aber nicht in C++.
Auch in C++ ist "unsigned" das gleiche wie "unsigned int".
-
MFK schrieb:
Th69 schrieb:
P.S. "unsigned" ist schon so in Ordnung ("int" ist ja Standard).
Nach dem alten C-Standard vielleicht. Aber nicht in C++.
Quelle?
In C sind signed/short/long/... alles nur Spezifizierer für int und müssen nicht angegeben werden. Prinzipiell ist damit int überflüssig, nur wer schreibt schon gern fünf Zeichen mehr
. Ich würde mich wundern, wenn das in C++ nicht mehr so ist. Allein wegen der Kompatibilität.
-
Du verdrehst row und col.
Schau dir das nochmal näher an.PS:
einfacher ist es, ein array mit row*col Elementen anzulegen und damit zu arbeiten. Spart viel Arbeit und ist idR auch schneller.
-
signed schrieb:
In C sind signed/short/long/... alles nur Spezifizierer für int und müssen nicht angegeben werden.
Aber nur nach dem alten Standard von 1989. In C99 ist das nicht mehr erlaubt. Und in C++ war es nie erlaubt, soweit ich weiß.
-
MFK schrieb:
signed schrieb:
In C sind signed/short/long/... alles nur Spezifizierer für int und müssen nicht angegeben werden.
Aber nur nach dem alten Standard von 1989. In C99 ist das nicht mehr erlaubt. Und in C++ war es nie erlaubt, soweit ich weiß.
Das ist schwer zu glauben, wenn man bedenkt, dass C und C++ bis C89 bis auf eine Ausnahme voll kompatibel waren. Und nein, die Sache mit den Spezifizierern ist nicht diese Ausnahme.
-
MFK schrieb:
signed schrieb:
In C sind signed/short/long/... alles nur Spezifizierer für int und müssen nicht angegeben werden.
Aber nur nach dem alten Standard von 1989. In C99 ist das nicht mehr erlaubt. Und in C++ war es nie erlaubt, soweit ich weiß.
Was du meinst ist default int bei unbekannten Objekten.
zBmain() { return 1; }
unsigned war aber schon immer das gleiche wie unsigned int.
-
Tachyon schrieb:
Das ist schwer zu glauben, wenn man bedenkt, dass C und C++ bis C89 bis auf eine Ausnahme voll kompatibel waren.
Welche eine Ausnahme meinst du?
Implizite Konvertierbarkeit von void-Zeigern?
Implizite Funktionsdeklarationen?
Die Möglichkeit, Variablen überall zu deklarieren?
Einzeilige Kommentare?Ohne Anspruch auf Vollständigkeit, es gab auch noch irgendwas, wo man nur mit konstanten Ausdrücken initialisieren konnte. Und ich bezweifle auch, ob C89 Digraphs kennt.
-
http://david.tribble.com/text/cdiffs.htm#C90-impl-var
Diese Diskussion hier ist sehr strange.
-
Shade Of Mine schrieb:
unsigned war aber schon immer das gleiche wie unsigned int.
Stimmt, da habe ich etwas durcheinandergeworfen.
-
MFK schrieb:
Die Möglichkeit, Variablen überall zu deklarieren?
Einzeilige Kommentare?Das sind C++ Features, die gibt es natürlich nicht in C(89). Du musst schon aufpassen wie herum die Kompatibilitat ist. Und das andere was du aufzählst sind eben ziemliche Kleinigkeiten bis auf die Konvertierung von void*.
-
SeppJ schrieb:
Das sind C++ Features, die gibt es natürlich nicht in C(89). Du musst schon aufpassen wie herum die Kompatibilitat ist.
Das sind auch C99-Features, darum hatte ich sie aufgezählt.
Aber auch wenn man sich auf die Richtung C89->C++ beschränkt: Da werden durch neue Schlüsselwörter eine ganze Menge Bezeichner ungültig

-
Vielen Dank für die Antworten und Ratschläge.
Wie Th69 richtig bemerkt hat habe ichrowsandcolsvertauscht.