zweidimensionales Array mit Vector STL
-
Hallo allerseits,
ich benötige eine einfache zweidimsionale Matrix für mein Projekt. Hierzu bin ich auf den Link
http://www.c-plusplus.net/forum/39489-full
gestoßen. Im Studium habe ich die dortige zweite Möglichkeit kennengelernt.
Ich möchte nun die vierte Möglichkeit ausprobieren.
Meine Headerdatei "vektorfunk.h" lautet:
#include <vector> #include <cstddef> // für size_t using namespace std; template<typename T> void resize2DimVector(vector< vector<T> > & vec, size_t FirstDim, size_t SecDim) { vec.resize( FirstDim ); for(size_t i = 0; i < FirstDim; ++i) vec.resize( SecDim ); } template<typename T> const vector< vector<T> > make_2DimVector(size_t FirstDim, size_t SecDim) { vector< vector<T> > vec; resize2DimVector( vec, FirstDim, SecDim ); return vec; } template<typename T> void resize3DimVector(vector< vector< vector<T> > > & vec, size_t FirstDim, size_t SecDim, size_t ThirdDim) { vec.resize( FirstDim ); for (size_t i = 0; i < FirstDim; ++i) { vec[i].resize( SecDim ); for (size_t j = 0; j < SecDim; ++j) vec[i][j].resize( ThirdDim ); } } template<typename T> const vector< vector< vector<T> > > make_3DimVector(size_t FirstDim, size_t SecDim, size_t ThirdDim) { vector< vector< vector<T> > > vec; resize3DimVector( vec, FirstDim, SecDim, ThirdDim ); return vec; }und ist somit aus der obigen URL 1 zu 1 übernommen worden.
Der Quellcode für meine eigensprogrammierte Klasse "matrix_2d.h" lautet:
#include <iostream> #include <cstddef> // für size_t #include "vektorfunk.h" //using namespace std; typedef unsigned int uint; template <typename T> class matrix_2d{ protected: vector< vector<T> > _matrix; uint _m; uint _n; // bool _saved; // Sind alle Elemente der Matrix gleich 0 ? public: matrix_2d(){ // Konstruktor A size_t tmp = 1; _matrix = make_2DimVector<T>(tmp, tmp); _m = 1; _n = 1; _matrix[0][0] = 0; // sichern } matrix_2d(uint m, uint n){ // Konstruktor B _matrix = make_2DimVector<T>( (size_t)m, (size_t)n); _m = m; _n = n; for(uint i = 0; i < _m;i++){ for(uint j = 0; j < _n;i++){ _matrix[i][j] = 0; // sichern } } } void resize(uint m, uint n){ // dimensioniere Matrxi neu resize2DimVector( _matrix, (size_t) m, (size_t) n); _m = m; _n = n; for(uint i = 0; i < _m;i++){ for(uint j = 0; j < _n;i++){ _matrix[i][j] = 0; // sichern } } } inline void set(uint m, uint n, T Wert){ // setze Wert _matrix[m][n] = Wert; // keine Modifaktion (1. Element einer Zeile der Matrix ist m == 0) } inline T get(uint m, uint n){ // gebe Matrixelement aus return _matrix[m][n]; // keine Modifaktion (1. Element einer Zeile der Matrix ist m == 0) } inline uint size_of(uint choice){ if(choice == 1) return _m; // Zeilenanzahl if(choice == 2) return _n; // Spaltenanzahl std::cout << "Size of Error in class matrix_2d!!" << endl; // sollte bei fertiger Programmierung nicht passieren int tmp = 0; // s.o. std::cin >> tmp; // s.o. return 0; // s.o. } };Zum Ausprobieren meiner Quelle habe ich folgende Testumgebung geschrieben:
#include <iostream> #include <string> #include "aushilfe.h" #include "matrix_2d.h" using namespace std; int main(){ cout << "Start Testprogramm" << endl; matrix_2d<double>* A = new matrix_2d<double>; //matrix_2d<double>* B(unsigned int 2,2); unsigned int m = 4; unsigned int n = 4; A->resize(m,n); for(unsigned int u = 0; u < m; u++){ for(unsigned int h = 0; h < m; h++){ A->set(u,h,u+h); } } int a = 0; cin >> a; return 0; }Im Main-Programm stürzt er in Zeile 19 ab:
-> Hier ist er in "matrix_2d.h" @ Zeile 40:
--> In "vektorfunk.h" stürzt der Debugger im letzten Durchlauf der Vorschleife in Zeile 12 ab.Die Fehlermeldung lautet:
Debug Assertation Failed!
...
Expression: vector subscript out of rangeDa bin ich mit meinem Latein am Ende

Er stürzt immer im letzten for-schleifen Durchlauf ab. Ich habe bereits im Mainprogramm die Werte von [i]m* und n verändert, doch es hat nicht geholfen.
Ich benutze Visual Studio 2010. Mein Compiler arbeitet im Debug-Modus für x64.
Hoffentlich kann mir einer helfen.
cu
John
-
Was sieht der geneigte Leser hier in
matrix_2d::resize(uint, uint)?for(uint i = 0; i < _m;i++){ for(uint j = 0; j < _n;i++){ _matrix[i][j] = 0; // sichern } }
-
Danke Furble Wurble für deine Antwort!
Das ist scheinbar die Lösung gewesen. Ich dachte, dass es an der Funktion resize2DimVector liegt, weil mir hier der Debugger den Fehler ausgegeben hat.
Bei mir hatte der Debugger nie angezeigt, dass er in die Zeile 29 der Datei matrix_2d.h geschafft hat.
cu
John_88